]> code.delx.au - gnu-emacs/commitdiff
Merge from emacs--devo--0
authorMiles Bader <miles@gnu.org>
Thu, 11 Oct 2007 16:14:00 +0000 (16:14 +0000)
committerMiles Bader <miles@gnu.org>
Thu, 11 Oct 2007 16:14:00 +0000 (16:14 +0000)
Patches applied:

 * emacs--devo--0  (patch 866-879)

   - Merge multi-tty branch
   - Update from CVS
   - Merge from emacs--rel--22

Revision: emacs@sv.gnu.org/emacs--unicode--0--patch-257

270 files changed:
AUTHORS [deleted file]
CONTRIBUTE [deleted file]
ChangeLog
MAINTAINERS
Makefile.in
README
config.bat
configure
configure.in
doc/emacs/.gitignore [new file with mode: 0644]
doc/emacs/ChangeLog [moved from man/ChangeLog with 58% similarity]
doc/emacs/Makefile.in [new file with mode: 0644]
doc/emacs/abbrevs.texi [moved from man/abbrevs.texi with 100% similarity]
doc/emacs/ack.texi [new file with mode: 0644]
doc/emacs/anti.texi [moved from man/anti.texi with 100% similarity]
doc/emacs/arevert-xtra.texi [new file with mode: 0644]
doc/emacs/basic.texi [moved from man/basic.texi with 99% similarity]
doc/emacs/buffers.texi [new file with mode: 0644]
doc/emacs/building.texi [moved from man/building.texi with 98% similarity]
doc/emacs/cal-xtra.texi [new file with mode: 0644]
doc/emacs/calendar.texi [moved from man/calendar.texi with 99% similarity]
doc/emacs/cmdargs.texi [new file with mode: 0644]
doc/emacs/commands.texi [moved from man/commands.texi with 100% similarity]
doc/emacs/custom.texi [new file with mode: 0644]
doc/emacs/dired-xtra.texi [moved from man/dired-xtra.texi with 100% similarity]
doc/emacs/dired.texi [moved from man/dired.texi with 100% similarity]
doc/emacs/display.texi [new file with mode: 0644]
doc/emacs/doclicense.texi [new file with mode: 0644]
doc/emacs/emacs-xtra.texi [new file with mode: 0644]
doc/emacs/emacs.texi [new file with mode: 0644]
doc/emacs/emerge-xtra.texi [new file with mode: 0644]
doc/emacs/entering.texi [moved from man/entering.texi with 100% similarity]
doc/emacs/files.texi [moved from man/files.texi with 93% similarity]
doc/emacs/fixit.texi [moved from man/fixit.texi with 100% similarity]
doc/emacs/fortran-xtra.texi [new file with mode: 0644]
doc/emacs/frames.texi [moved from man/frames.texi with 100% similarity]
doc/emacs/glossary.texi [moved from man/glossary.texi with 100% similarity]
doc/emacs/gnu.texi [new file with mode: 0644]
doc/emacs/gpl.texi [new file with mode: 0644]
doc/emacs/help.texi [moved from man/help.texi with 100% similarity]
doc/emacs/indent.texi [moved from man/indent.texi with 100% similarity]
doc/emacs/killing.texi [moved from man/killing.texi with 100% similarity]
doc/emacs/kmacro.texi [moved from man/kmacro.texi with 100% similarity]
doc/emacs/m-x.texi [new file with mode: 0644]
doc/emacs/macos.texi [moved from man/macos.texi with 100% similarity]
doc/emacs/maintaining.texi [moved from man/maintaining.texi with 100% similarity]
doc/emacs/major.texi [moved from man/major.texi with 100% similarity]
doc/emacs/makefile.w32-in [new file with mode: 0644]
doc/emacs/mark.texi [new file with mode: 0644]
doc/emacs/mini.texi [new file with mode: 0644]
doc/emacs/misc.texi [moved from man/misc.texi with 100% similarity]
doc/emacs/msdog-xtra.texi [new file with mode: 0644]
doc/emacs/msdog.texi [moved from man/msdog.texi with 100% similarity]
doc/emacs/mule.texi [moved from man/mule.texi with 100% similarity]
doc/emacs/picture-xtra.texi [new file with mode: 0644]
doc/emacs/programs.texi [new file with mode: 0644]
doc/emacs/regs.texi [moved from man/regs.texi with 100% similarity]
doc/emacs/rmail.texi [moved from man/rmail.texi with 99% similarity]
doc/emacs/screen.texi [moved from man/screen.texi with 100% similarity]
doc/emacs/search.texi [new file with mode: 0644]
doc/emacs/sending.texi [moved from man/sending.texi with 100% similarity]
doc/emacs/text.texi [moved from man/text.texi with 98% similarity]
doc/emacs/trouble.texi [moved from man/trouble.texi with 100% similarity]
doc/emacs/vc-xtra.texi [moved from man/vc-xtra.texi with 100% similarity]
doc/emacs/vc1-xtra.texi [moved from man/vc1-xtra.texi with 100% similarity]
doc/emacs/vc2-xtra.texi [new file with mode: 0644]
doc/emacs/windows.texi [moved from man/windows.texi with 100% similarity]
doc/emacs/xresources.texi [new file with mode: 0644]
doc/misc/.gitignore [new file with mode: 0644]
doc/misc/ChangeLog [new file with mode: 0644]
doc/misc/Makefile.in [moved from man/Makefile.in with 57% similarity]
doc/misc/ada-mode.texi [moved from man/ada-mode.texi with 99% similarity]
doc/misc/autotype.texi [moved from man/autotype.texi with 99% similarity]
doc/misc/calc.texi [moved from man/calc.texi with 99% similarity]
doc/misc/cc-mode.texi [moved from man/cc-mode.texi with 99% similarity]
doc/misc/cl.texi [moved from man/cl.texi with 99% similarity]
doc/misc/dired-x.texi [moved from man/dired-x.texi with 99% similarity]
doc/misc/doclicense.texi [moved from man/doclicense.texi with 100% similarity]
doc/misc/ebrowse.texi [new file with mode: 0644]
doc/misc/ediff.texi [moved from man/ediff.texi with 99% similarity]
doc/misc/emacs-mime.texi [new file with mode: 0644]
doc/misc/erc.texi [moved from man/erc.texi with 96% similarity]
doc/misc/eshell.texi [new file with mode: 0644]
doc/misc/eudc.texi [new file with mode: 0644]
doc/misc/faq.texi [moved from man/faq.texi with 99% similarity]
doc/misc/flymake.texi [new file with mode: 0644]
doc/misc/forms.texi [new file with mode: 0644]
doc/misc/gnus-faq.texi [moved from man/gnus-faq.texi with 100% similarity]
doc/misc/gnus.texi [new file with mode: 0644]
doc/misc/gpl.texi [new file with mode: 0644]
doc/misc/idlwave.texi [moved from man/idlwave.texi with 99% similarity]
doc/misc/info.texi [moved from man/info.texi with 99% similarity]
doc/misc/makefile.w32-in [moved from man/makefile.w32-in with 78% similarity]
doc/misc/message.texi [moved from man/message.texi with 99% similarity]
doc/misc/mh-e.texi [moved from man/mh-e.texi with 99% similarity]
doc/misc/newsticker.texi [moved from man/newsticker.texi with 99% similarity]
doc/misc/org.texi [moved from man/org.texi with 99% similarity]
doc/misc/pcl-cvs.texi [moved from man/pcl-cvs.texi with 99% similarity]
doc/misc/pgg.texi [moved from man/pgg.texi with 99% similarity]
doc/misc/rcirc.texi [moved from man/rcirc.texi with 99% similarity]
doc/misc/reftex.texi [moved from man/reftex.texi with 99% similarity]
doc/misc/sc.texi [new file with mode: 0644]
doc/misc/ses.texi [moved from man/ses.texi with 99% similarity]
doc/misc/sieve.texi [moved from man/sieve.texi with 99% similarity]
doc/misc/smtpmail.texi [moved from man/smtpmail.texi with 99% similarity]
doc/misc/speedbar.texi [moved from man/speedbar.texi with 99% similarity]
doc/misc/texinfo.tex [moved from man/texinfo.tex with 100% similarity]
doc/misc/tramp.texi [moved from man/tramp.texi with 98% similarity]
doc/misc/trampver.texi [new file with mode: 0644]
doc/misc/url.texi [moved from man/url.texi with 99% similarity]
doc/misc/vip.texi [moved from man/vip.texi with 99% similarity]
doc/misc/viper.texi [moved from man/viper.texi with 99% similarity]
doc/misc/widget.texi [new file with mode: 0644]
doc/misc/woman.texi [moved from man/woman.texi with 99% similarity]
lisp/ChangeLog
lisp/ChangeLog.5
lisp/Makefile.in
lisp/add-log.el
lisp/allout.el
lisp/ansi-color.el
lisp/arc-mode.el
lisp/autoinsert.el
lisp/autorevert.el
lisp/bindings.el
lisp/bookmark.el
lisp/bs.el
lisp/button.el
lisp/calculator.el
lisp/comint.el
lisp/complete.el
lisp/completion.el
lisp/cus-edit.el
lisp/cus-face.el
lisp/cus-start.el
lisp/delsel.el
lisp/diff-mode.el
lisp/dired-aux.el
lisp/dired.el
lisp/doc-view.el [new file with mode: 0644]
lisp/double.el
lisp/ebuff-menu.el
lisp/echistory.el
lisp/ediff-diff.el
lisp/ediff-init.el
lisp/ediff-mult.el
lisp/ediff-ptch.el
lisp/ediff-util.el
lisp/ediff-wind.el
lisp/edmacro.el
lisp/emerge.el
lisp/env.el
lisp/faces.el
lisp/ffap.el
lisp/filecache.el
lisp/files.el
lisp/filesets.el
lisp/find-lisp.el
lisp/finder.el
lisp/follow.el
lisp/font-lock.el
lisp/frame.el
lisp/fringe.el
lisp/help-fns.el
lisp/help.el
lisp/hi-lock.el
lisp/ido.el
lisp/image-dired.el
lisp/image.el
lisp/indent.el
lisp/isearch.el
lisp/jka-cmpr-hook.el
lisp/ldefs-boot.el
lisp/loadup.el
lisp/log-view.el
lisp/makefile.w32-in
lisp/man.el
lisp/mb-depth.el
lisp/menu-bar.el
lisp/newcomment.el
lisp/outline.el
lisp/pcvs-defs.el
lisp/pcvs.el
lisp/printing.el
lisp/recentf.el
lisp/repeat.el
lisp/rfn-eshadow.el
lisp/scroll-bar.el
lisp/server.el
lisp/ses.el
lisp/shell.el
lisp/simple.el
lisp/smerge-mode.el
lisp/speedbar.el
lisp/startup.el
lisp/subr.el
lisp/t-mouse.el
lisp/talk.el
lisp/tempo.el
lisp/textmodes/artist.el
lisp/textmodes/bibtex-style.el
lisp/textmodes/css-mode.el
lisp/textmodes/fill.el
lisp/textmodes/flyspell.el
lisp/textmodes/org-export-latex.el
lisp/textmodes/org-publish.el
lisp/textmodes/org.el
lisp/textmodes/table.el
lisp/textmodes/tex-mode.el
lisp/textmodes/texinfo.el
lisp/tmm.el
lisp/tool-bar.el
lisp/tutorial.el
lisp/url/ChangeLog
lisp/url/url-auth.el
lisp/url/url-dav.el
lisp/url/url-expand.el
lisp/url/url-file.el
lisp/url/url-http.el
lisp/url/url-mailto.el
lisp/url/url-methods.el
lisp/url/url-misc.el
lisp/url/url-news.el
lisp/url/url-parse.el
lisp/url/url-util.el
lisp/url/url-vars.el
lisp/vc-arch.el
lisp/vc-bzr.el
lisp/vc-cvs.el
lisp/vc-git.el
lisp/vc-hg.el
lisp/vc-hooks.el
lisp/vc-mtn.el [new file with mode: 0644]
lisp/vc-svn.el
lisp/vc.el
lisp/vcursor.el
lisp/version.el
lisp/view.el
lisp/whitespace.el
lisp/wid-browse.el
lisp/wid-edit.el
lisp/window.el
lisp/woman.el
lisp/x-dnd.el
lisp/xt-mouse.el
lispintro/.gitignore
lispintro/ChangeLog [deleted file]
lispintro/Makefile.am [deleted file]
lispintro/Makefile.in [deleted file]
lispintro/Makefile.old [deleted file]
lispintro/README [deleted file]
lispintro/aclocal.m4 [deleted file]
lispintro/configure [deleted file]
lispintro/configure.in [deleted file]
lispintro/cons-1.eps [deleted file]
lispintro/cons-2.eps [deleted file]
lispintro/cons-2a.eps [deleted file]
lispintro/cons-3.eps [deleted file]
lispintro/cons-4.eps [deleted file]
lispintro/cons-5.eps [deleted file]
lispintro/drawers.eps [deleted file]
lispintro/emacs-lisp-intro.texi [deleted file]
lispintro/install-sh [deleted file]
lispintro/lambda-1.eps [deleted file]
lispintro/lambda-2.eps [deleted file]
lispintro/lambda-3.eps [deleted file]
lispintro/makefile.w32-in [deleted file]
lispintro/missing [deleted file]
lispintro/mkinstalldirs [deleted file]
make-dist
man/.gitignore

diff --git a/AUTHORS b/AUTHORS
deleted file mode 100644 (file)
index b88c0b6..0000000
--- a/AUTHORS
+++ /dev/null
@@ -1,2766 +0,0 @@
-Many people have contributed code included in the Free Software
-Foundation's distribution of GNU Emacs.  To show our appreciation for
-their public spirit, we list here in alphabetical order a condensed
-list of their contributions.
-
-Aaron Larson: changed bibtex.el
-
-Aaron S. Hawley: changed files.texi files.el isearch.el misc.texi
-
-Abraham Nahum: changed configure.in dgux4.h sysdep.c
-
-Abramo Bagnara: changed term.c
-
-Adrian Aichner: changed erc-log.el erc.el erc-autojoin.el erc-backend.el
-  erc-dcc.el erc-members.el erc-nets.el erc-sound.el etags.c
-  gnus-score.el
-
-Adrian Colley: changed aix3-2.h
-
-Adrian Lanz: changed mail-source.el spam.el
-
-Agust\e,Am\e(Bn Mart\e,Am\e(Bn: changed flyspell.el ispell.el
-
-Aidan Kehoe: changed lread.c mm-util.el erc.el objects.texi
-
-Ake Stenhoff: wrote imenu.el
-and changed cc-mode.el perl-mode.el
-
-Aki Vehtari: changed bibtex.el gnus-art.el gnus-score.el gnus-sum.el
-  nnmail.el tar-mode.el
-
-Alakazam Petrofsky: changed hanoi.el
-
-Alan Mackenzie: wrote cc-awk.el
-and changed cc-cmds.el cc-mode.el cc-engine.el cc-defs.el cc-vars.el
-  cc-langs.el cc-mode.texi cc-styles.el cc-align.el cc-fonts.el lread.c
-  programs.texi cc-subword.el isearch.el lisp.el search.texi startup.el
-  subr.el text.texi buffers.texi cc-fix.el and 18 other files
-
-Alan Shutko: changed diary-lib.el calendar.el bindings.el cal-hebrew.el
-  easy-mmode.el gnus-sum.el ibuf-ext.el ibuffer.el lunar.el macros.el
-  solar.el
-
-Alastair Burt: changed gnus-art.el smiley.el
-
-Albert L. Ting: changed gnus-group.el mail-hist.el
-
-Alex Coventry: changed files.el
-
-Alex Ott: changed TUTORIAL.ru ru-refcard.tex ispell.el ru-refcard.ps
-
-Alex Rezinsky: wrote which-func.el
-
-Alex Schroeder: wrote ansi-color.el cus-theme.el erc-compat.el
-  erc-hecomplete.el erc-join.el erc-lang.el erc-ring.el master.el
-  spam-stat.el sql.el
-and changed erc.el erc-track.el erc-button.el erc-stamp.el erc-match.el
-  erc-autoaway.el erc-nickserv.el Makefile erc-autojoin.el erc-fill.el
-  erc-pcomplete.el erc-complete.el erc-ibuffer.el erc-members.el
-  rcirc.texi comint.el custom.el erc-bbdb.el erc-chess.el erc-ezbounce.el
-  erc-imenu.el and 26 other files
-
-Alexander Klimov: changed man.el
-
-Alexander Kreuzer: changed nnrss.el
-
-Alexander L. Belikoff: wrote erc.el
-
-Alexander Pohoyda: changed rmailsum.el man.el rmail.el sendmail.el
-
-Alexander Shopov: changed code-pages.el
-
-Alexander Zhuckov: changed ebrowse.c
-
-Alexandre Oliva: wrote gnus-mlspl.el
-and changed unexelf.c format.el iris4d.h iris5d.h unexsgi.c
-
-Alexandre Veyrenc: changed fr-refcard.tex
-
-Alfred Correira: changed generic-x.el
-
-Alfred M. Szmidt: changed compile.el html2text.el openbsd.h
-
-Alfredo Finelli: changed TUTORIAL.it
-
-Alin C. Soare: changed lisp-mode.el hexl.el
-
-Ami Fischman: changed calendar.el diary-lib.el
-
-Anders Holst: wrote hippie-exp.el
-
-Anders Lindgren: wrote autorevert.el cwarn.el follow.el
-and changed font-lock.el etags.c compile.el
-
-Andre Spiegel: changed vc.el vc-hooks.el vc-cvs.el vc-rcs.el vc-sccs.el
-  files.el dired.el files.texi cperl-mode.el ediff-util.el log-view.el
-  parse-time.el startup.el tramp-vc.el vc-arch.el vc-mcvs.el vc-svn.el
-  vcdiff viper-util.el
-
-Andre Srinivasan: changed gnus-group.el gnus-sum.el gnus.texi message.el
-  mm-decode.el mml.el nnmail.el
-
-Andrea Russo: changed erc-dcc.el info-look.el
-
-Andreas B\e,A|\e(Bsching: changed emacsclient.c
-
-Andreas Fuchs: wrote erc-ezbounce.el erc-fill.el erc-match.el
-  erc-replace.el erc-truncate.el
-and changed erc.el erc-bbdb.el erc-button.el erc-log.el erc-stamp.el
-  erc-autoaway.el erc-autojoin.el erc-dcc.el erc-imenu.el erc-list.el
-  erc-members.el erc-menu.el erc-netsplit.el erc-notify.el erc-ring.el
-  erc-speedbar.el erc-track.el erc-xdcc.el gnus-registry.el mml-sec.el
-  mml2015.el
-
-Andreas Jaeger: changed gnus-msg.el gnus-start.el gnus-xmas.el
-  nnfolder.el nnml.el
-
-Andreas Leue: changed artist.el
-
-Andreas Luik: changed xfns.c xterm.c
-
-Andreas Schwab: changed Makefile.in files.el lisp.h xdisp.c configure.in
-  alloc.c fns.c print.c coding.c editfns.c dired.el info.el eval.c
-  fileio.c simple.el buffer.c minibuf.c process.c xterm.c emacs.c
-  keyboard.c and 449 other files
-
-Andreas Seltenreich: changed nnweb.el gnus.texi nnslashdot.el
-  gnus-util.el mm-uu.el url-http.el battery.el comint.el easy-mmode.el
-  gmm-utils.el gnus-art.el gnus-ml.el gnus-msg.el gnus-srvr.el
-  gnus-start.el gnus-sum.el gnus.el message.el mm-url.el url-cookie.el
-  xterm.c
-
-Andrew Choi: wrote mac-win.el
-and changed macterm.c mac.c macfns.c INSTALL macmenu.c darwin.h macterm.h
-  sysdep.c emacs.c fontset.c frame.c keyboard.c macgui.h xfaces.c Emacs.r
-  README cw5-mcp.xml cw6-mcp.xml dispextern.h make-package makefile.MPW
-  and 61 other files
-
-Andrew Cohen: changed dns.el
-
-Andrew Csillag: wrote m4-mode.el
-
-Andrew Hall: changed paren.el
-
-Andrew Innes: changed makefile.w32-in w32fns.c w32term.c w32.c w32proc.c
-  fileio.c gmake.defs dos-w32.el ms-w32.h nmake.defs w32-fns.el w32term.h
-  unexw32.c w32menu.c w32xfns.c addpm.c cmdproxy.c emacs.c w32-win.el
-  w32inevt.c configure.bat and 135 other files
-
-Andrew Oram: changed man/calendar.texi
-  miscellaneous changes to files in man/
-
-Andrey Slusar: changed gnus.el
-
-Andrey Zhdanov: changed gud.el
-
-Andy Norman: wrote ange-ftp.el
-
-Andy Petrusenco: changed w32term.c
-
-Anna M. Bigatti: wrote cal-html.el
-
-Ari Roponen: changed atimer.c startup.el
-
-Arisawa Akihiro: changed mm-decode.el mm-view.el ps-print.el time.el
-  utf-8.el
-
-Arne Georg Gleditsch: changed gnus-sum.el
-
-Arne J\e,Ax\e(Brgensen: wrote latexenc.el
-and changed smime.el gnus-art.el gnus-sieve.el ldap.el message.el
-  mm-decode.el mule-conf.el nnimap.el nnrss.el wid-edit.el
-
-Artem Chuprina: changed message.el
-
-Ashwin Ram: wrote refer.el
-
-Aubrey Jaffer: changed info.el unexelf.c
-
-Axel Boldt: changed ehelp.el electric.el
-
-B. Anyos: changed w32term.c
-
-Barry A. Warsaw: wrote assoc.el elp.el man.el regi.el reporter.el
-  supercite.el
-and changed cc-mode.el cc-cmds.el cc-engine.el cc-langs.el cc-styles.el
-  cc-vars.el c++-mode.el cc-menus.el cc-align.el cc-defs.el cplus-md1.el
-  syntax.c syntax.h
-
-Barry Fishman: changed gnu-linux.h
-
-Ben A. Mesander: wrote erc-dcc.el
-
-Ben Harris: changed configure.in
-
-Ben Key: changed w32.c w32fns.c w32menu.c makefile.w32-in w32.h w32term.c
-  emacs.c gmake.defs ms-w32.h nmake.defs sound.c
-
-Ben North: changed outline.el fill.el isearch.el lisp-mode.el paren.el
-  w32term.c xfaces.c
-
-Benjamin Drieu: wrote pong.el
-
-Benjamin Riefenstahl: changed emacs.c mac-win.el macterm.c ms-w32.h
-  mule-cmds.el runemacs.c tcl.el w32.c w32.h w32select.c
-
-Benjamin Rutt: changed vc.el gnus-msg.el message.el diff-mode.el ffap.el
-  gnus-dired.el nnimap.el nnmbox.el simple.el vc-cvs.el
-
-Bill Atkins: changed wdired.el
-
-Bill Burton: changed ptx.h sequent-ptx.h
-
-Bill Carpenter: wrote feedmail.el (public domain)
-
-Bill Mann: changed configure.in unexaix.c ibmrs6000.h usg5-4-3.h
-
-Bill Pringlemeir: changed messcompat.el
-
-Bill Richter: changed fill.el quail.el ccl.el encoded-kb.el fontset.el
-  kinsoku.el kkc.el mule-cmds.el mule-conf.el mule-util.el mule.el
-
-Bill Rosenblatt: wrote float.el
-
-Bill Rozas: wrote scheme.el
-and changed xscheme.el
-
-Bill White: changed gnus-start.el
-
-Bill Wohler: wrote mh-buffers.el mh-comp.el mh-compat.el mh-e.el
-  mh-folder.el mh-funcs.el mh-letter.el mh-loaddefs.el mh-mime.el
-  mh-scan.el mh-seq.el mh-show.el mh-utils.el mh-xface.el
-and changed mh-customize.el mh-index.el MH-E-NEWS mh-alias.el Makefile
-  mh-identity.el mh-pick.el README mh-speed.el mh-init.el mh-junk.el
-  mh-e.texi mh-acros.el mh-gnus.el mh-search.el mh-unit.el mh-inc.el
-  mh-xemacs-compat.el mh-print.el Makefile.in image.el and 88 other files
-
-Bjorn Solberg: changed nnimap.el
-
-Bj\e,Av\e(Brn Lindstr\e,Av\e(Bm: changed rcirc.texi
-
-Bj\e,Av\e(Brn Torkelsson: changed gnus-art.el gnus-group.el gnus-srvr.el
-  gnus-sum.el gnus-mlspl.el gnus-msg.el message.el dgnushack.el
-  gnus-agent.el gnus-cus.el gnus-gl.el gnus-nocem.el gnus-score.el
-  gnus-topic.el gnus.el mail-source.el nnmail.el
-
-Bj\e,Ax\e(Brn Mork: changed gnus-agent.el message.el mml2015.el
-
-Blitz Product Development Corporation: wrote ispell.el
-
-Boaz Ben-Zvi: wrote profile.el
-
-Bob Glickstein: wrote sregex.el
-and changed isearch.el sendmail.el
-
-Bob Halley: changed esh-io.el
-
-Bob Rogers: changed ffap.el thingatpt.el
-
-Bob Weiner: changed info.el quail.el
-
-Boris Goldowsky: wrote avoid.el descr-text.el enriched.el facemenu.el
-  format.el shadowfile.el
-and changed fill.el simple.el indent.el paragraphs.el cmds.c intervals.c
-  intervals.h add-log.el cc-mode.el enriched.doc fileio.c make-mode.el
-  text-mode.el textprop.c ada.el allout.el awk-mode.el bibtex.el buffer.c
-  buffer.h c-mode.el and 38 other files
-
-Boris Samorodov: changed imap.el
-
-Boyd Lynn Gerber: changed configure.in
-
-Brad Howes: changed gnus-demon.el
-
-Brad Miller: wrote gnus-gl.el
-
-Brendan Kehoe: changed hpux9.h
-
-Brian D. Carlstrom: changed gud.el smtpmail.el
-
-Brian Fox: changed Makefile.in configure.in minibuf.c dired.el files.el
-  rmail.el search.c simple.el sysdep.c Makefile compile.el forms.texi
-  frame.c info.texi keyboard.c make-dist subr.el systty.h xterm.c INSTALL
-  alloc.c and 44 other files
-
-Brian Marick: wrote hideif.el
-
-Brian P Templeton: changed erc.el erc-compat.el erc-fill.el
-  erc-nickserv.el erc-pcomplete.el erc-stamp.el erc-track.el
-
-Brian Palmer: changed erc.el erc-list.el
-
-Brian Preble: changed abbrev.el apropos.el asm-mode.el doctex.el
-  abbrevlist.el ada.el add-log.el appt.el array.el autoload.el
-  awk-mode.el bg-mouse.el bib-mode.el blackbox.el buff-menu.el
-  bug-screen.el bytecomp.el c++-mode.el c-comment.el c-fill.el c-mode.el
-  and 92 other files
-
-Bruno Haible: changed INSTALL emacs.1 epaths.in info.el paths.el
-
-Bryan D. O'connor: changed make-package
-
-Bryan Henderson: changed Makefile term.el
-
-Bryan O'sullivan: changed ange-ftp.el
-
-Caleb Deupree: changed winnt.el
-
-Carl D. Roth: changed gnus-nocem.el
-
-Carsten Bormann: changed ibmrs6000.h
-
-Carsten Dominik: wrote idlw-complete-structtag.el idlw-toolbar.el org.el
-  reftex-auc.el reftex-cite.el reftex-dcr.el reftex-global.el
-  reftex-index.el reftex-parse.el reftex-ref.el reftex-sel.el
-  reftex-toc.el reftex-vars.el reftex.el
-and changed org.texi orgcard.tex idlw-shell.el idlwave.el idlw-rinfo.el
-  reftex.texi reftex-vcr.el diary-lib.el bibtex.el bookmark.el files.el
-  idlwave-rinfo.el idlwave-shell.el idlwave-toolbar.el
-
-Caveh Jalali: changed configure.in intel386.h sol2-4.h
-
-Changwoo Ryu: changed files.el
-
-Chao-Hong Liu: changed TUTORIAL.cn TUTORIAL.zh
-
-Charles Hannum: changed aix3-1.h aix3-2.h configure ibmrs6000.h
-  keyboard.c netbsd.h pop.c sysdep.c systime.h systty.h xrdb.c
-
-Charlie Martin: wrote autoinsert.el
-
-Cheng Gao: changed MORE.STUFF flymake.el tips.texi url-dired.el
-  url-file.el url-handlers.el url-http.el url-nfs.el
-
-Chong Yidong: changed cus-edit.el simple.el files.el custom.el
-  display.texi xdisp.c longlines.el files.texi info.el keyboard.c
-  compile.el custom.texi text.texi xterm.c frames.texi image-mode.el
-  mouse.el misc.texi startup.el wid-edit.el cus-theme.el
-  and 297 other files
-
-Chris Hanson: changed xscheme.el scheme.el xterm.c hpux.h x11term.c
-  hp9000s300.h keyboard.c process.c texinfmt.el emacsclient.c sort.el
-  syntax.c texnfo-upd.el x11fns.c xfns.c dired.el fileio.c hp9000s800.h
-  indent.c info.el man.el and 17 other files
-
-Chris Moore: changed dired.el hexl.el replace.el Makefile.in gnus-sum.el
-  isearch.el jka-cmpr-hook.el pgg-gpg.el pgg-pgp.el pgg-pgp5.el
-  tutorial.el wdired.el
-
-Chris Prince: changed w32term.c
-
-Chris Smith: wrote icon.el
-and changed icon-mode.el
-
-Christian Limpach: changed configure.in
-
-Christian Lynbech: changed appt.el emacsserver.c
-
-Christian Neukirchen: changed mm-util.el
-
-Christian Plaunt: wrote soundex.el
-
-Christian Von Roques: changed gnus-start.el
-
-Christoph Bauer: changed configure.in
-
-Christoph Conrad: changed gnus-agent.el gnus-score.el makefile.w32-in
-  qp.el
-
-Christoph Wedler: wrote antlr-mode.el
-and changed format.el gnus-art.el gnus-picon.el message.el register.el
-  smiley.el texinfmt.el
-
-Christopher Allan Webber: changed gamegrid.el tetris.el
-
-Christopher J. Madsen: wrote decipher.el
-and changed files.el ispell.el replace.el time.el
-
-Chunyu Wang: changed gnus-art.el pcl-cvs.texi
-
-Claudio Fontana: changed Makefile.in
-
-Colin Marquardt: changed gnus.el message.el
-
-Colin Rafferty: changed message.el
-
-Colin Walters: wrote ibuf-ext.el ibuf-macs.el ibuffer.el
-and changed calc.el replace.el update-game-score.c calc-ext.el
-  calc-misc.el Makefile.in calc-macs.el calc-mode.el calc-graph.el
-  gamegrid.el calc-aent.el calc-bin.el calc-embed.el calc-keypd.el
-  calc-math.el calc-prog.el calc-units.el calcalg2.el font-core.el
-  info.el calc-alg.el and 78 other files
-
-Craig Mcdaniel: changed sheap.c
-
-Daiki Ueno: wrote pgg-def.el pgg-gpg.el pgg-parse.el pgg-pgp.el
-  pgg-pgp5.el pgg.el starttls.el
-and changed gnus-sum.el mml2015.el gnus-agent.el gnus-srvr.el
-  message.texi mml1991.el pgg.texi
-
-Dale Gulledge: changed TUTORIAL.eo
-
-Dale Hagglund: changed unexelf.c
-
-Dale R. Worley: wrote emerge.el (public domain)
-and changed mail-extr.el
-
-Damien Elmes: changed erc.el erc-dcc.el erc-track.el erc-log.el
-  erc-pcomplete.el README erc-button.el erc-nets.el erc-ring.el Makefile
-  erc-fill.el erc-match.el erc-members.el erc-nickserv.el
-
-Damon Anton Permezel: wrote hanoi.el (public domain)
-
-Dan Christensen: changed gnus-sum.el nnfolder.el gnus-art.el
-  gnus-group.el gnus-registry.el gnus-score.el nndoc.el nnmail.el
-
-Dan Nicolaescu: wrote iris-ansi.el romanian.el
-and changed term.el xterm.el hideshow.el isearch.el icon.el lisp.h
-  cus-edit.el faces.el font-lock.el grep.el sh-script.el eterm-color.ti
-  ibuffer.el rxvt.el vhdl-mode.el xterm.c bindings.el compile.el
-  dabbrev.el imenu.el outline.el and 166 other files
-
-Daniel Brockman: changed cus-start.el format-spec.el ibuffer.el rcirc.el
-
-Daniel Laliberte: wrote cl-specs.el cust-print.el edebug.el hideif.el
-  isearch.el
-and changed mlconvert.el eval-region.el
-
-Daniel M Coffman: changed arc-mode.el
-
-Daniel N\e,Ai\e(Bri: changed message.el
-
-Daniel Ortmann: changed paragraphs.el
-
-Daniel Pfeiffer: wrote conf-mode.el copyright.el executable.el
-  sh-script.el skeleton.el two-column.el wyse50.el
-and changed compile.el files.el make-mode.el apropos.el buff-menu.el
-  font-lock.el grep.el mpuz.el sgml-mode.el autoinsert.el cperl-mode.el
-  facemenu.el gomoku.el help.el imenu.el autoload.el autorevert.el
-  bindings.el button.el cc-fonts.el cc-mode.el and 12 other files
-
-Daniel Pittman: wrote tramp-vc.el
-and changed gnus-spec.el gnus-sum.el nnimap.el
-
-Daniel Quinlan: changed dired.el info.el
-
-Danny Roozendaal: wrote handwrite.el
-
-Danny Siu: changed gnus-picon.el gnus-sum.el nndoc.el nnimap.el smiley.el
-
-Darren Stalder: changed gnus-util.el
-
-Darrin B. Jewell: changed etags.c lisp.h
-
-Dave Lambert: changed sol2-5.h xfns.c xterm.c xterm.h
-
-Dave Love: wrote autoarg.el autoconf.el benchmark.el cfengine.el
-  code-pages.el elide-head.el georgian.el hl-line.el latin-8.el
-  latin-9.el latin1-disp.el python.el refill.el rfc1345.el sgml-input.el
-  smiley.el subst-big5.el subst-gb2312.el subst-jis.el subst-ksc.el
-  tool-bar.el ucs-tables.el uni-input.el utf-16.el utf-7.el utf-8-lang.el
-  welsh.el
-and changed configure.in Makefile.in help.el fortran.el browse-url.el
-  mule-cmds.el simple.el xterm.c cus-edit.el files.el info.el mule.el
-  wid-edit.el fns.c vc.el rfc2047.el bindings.el cus-start.el buffer.c
-  byte-opt.el bytecomp.el and 727 other files
-
-Dave Pearson: wrote 5x5.el quickurl.el
-
-David A. Capello: changed etags.c
-
-David Abrahams: changed coding.c
-
-David Bakhash: wrote strokes.el
-
-David Byers: changed minibuf.c
-
-David Casperson: changed menu-bar.el tex-mode.el
-
-David Edmondson: changed message.el gnus-cite.el imap.el mm-view.el
-  nnfolder.el nnml.el
-
-David Gillespie: wrote calc-aent.el calc-alg.el calc-arith.el calc-bin.el
-  calc-comb.el calc-cplx.el calc-embed.el calc-ext.el calc-fin.el
-  calc-forms.el calc-frac.el calc-funcs.el calc-graph.el calc-help.el
-  calc-incom.el calc-keypd.el calc-lang.el calc-macs.el calc-map.el
-  calc-math.el calc-misc.el calc-mode.el calc-mtx.el calc-poly.el
-  calc-prog.el calc-rewr.el calc-rules.el calc-sel.el calc-stat.el
-  calc-store.el calc-stuff.el calc-trail.el calc-undo.el calc-units.el
-  calc-vec.el calc-yank.el calc.el calcalg2.el calcalg3.el calccomp.el
-  calcsel2.el cl-compat.el cl-extra.el cl-macs.el cl-seq.el cl.el
-  cl.texinfo complete.el edmacro.el
-and changed info.el bytecomp.el
-
-David Hansen: changed nnrss.el cc-cmds.el lisp.el pcomplete.el tempo.el
-
-David Hedbor: changed gnus-art.el mm-decode.el mm-view.el gnus-agent.el
-  gnus-cite.el gnus-cus.el gnus-eform.el gnus-group.el gnus-msg.el
-  gnus-score.el gnus-spec.el gnus-util.el gnus.el mail-source.el
-  message.el mm-encode.el mm-util.el nndoc.el nnmail.el score-mode.el
-  webmail.el
-
-David Hunter: changed config.nt flymake.el ms-w32.h process.c
-
-David J. Mackenzie: changed configure.in etags.c fakemail.c movemail.c
-  wakeup.c Makefile cvtmail.c qsort.c termcap.c yow.c Makefile.in
-  avoid.el b2m.c digest-doc.c emacsclient.c emacsserver.c emacstool.c
-  etags-vmslib.c fortran.el hexl.c isearch.el and 12 other files
-
-David Kastrup: changed greek.el replace.el faq.texi search.c ange-ftp.el
-  help.el mouse.el Makefile.in calc.el desktop.el keymaps.texi
-  meta-mode.el process.c search.texi subr.el woman.el DEBUG DEVEL.HUMOR
-  MAILINGLISTS autoload.el browse-url.el and 37 other files
-
-David K\e,Ae\e(Bgedal: wrote tempo.el
-and changed sendmail.el xmenu.c
-
-David Lawrence: changed loaddefs.el comint.el simple.el files.el
-  c++-mode.el compile.el inf-lisp.el shell.el tex-mode.el MACHINES
-  Makefile c-mode.el cl.el dired.el emacs.1 emacsserver.c emerge.el
-  gnus.el history.el lisp-mode.el lisp.el and 78 other files
-
-David M. Brown: wrote array.el
-
-David M. Koppelman: changed hi-lock.el display.texi
-
-David M. Koppelman, Koppel@Ece.Lsu.Edu: wrote hi-lock.el
-
-David M. Smith: wrote ielm.el
-and changed imenu.el
-
-David Mccabe: changed lisp-mode.el
-
-David Megginson: wrote derived.el
-and changed mode-clone.el
-
-David Moore: wrote nnvirtual.el
-and changed gnus-xmas.el
-
-David Mosberger-Tang: changed alpha.h unexelf.c cm.h config.in
-  configure.in cvtmail.c data.c dispnew.c emacsserver.c etags.c
-  fakemail.c keyboard.c mem-limits.h process.c profile.c sorted-doc.c
-  sysdep.c terminfo.c unexelf1.c yow.c
-
-David Ponce: wrote recentf.el ruler-mode.el tree-widget.el
-and changed w32menu.c w32term.c close.png close.xpm empty.png empty.xpm
-  end-guide.png end-guide.xpm files.el guide.png guide.xpm handle.png
-  handle.xpm keyboard.c leaf.png leaf.xpm no-guide.png no-guide.xpm
-  no-handle.png no-handle.xpm open.png and 21 other files
-
-David Reitter: wrote mailclient.el
-and changed commands.h cus-edit.el easy-mmode.el emacsbug.el
-  emacsclient.c keymap.c macterm.c menu-bar.el minibuf.c python.el
-  sendmail.el url-http.el
-
-David Robinson: changed menu-bar.el x-win.el
-
-David S. Goldberg: changed gnus-art.el message.el
-
-David Vazquez: changed m4-mode.el
-
-David Z. Maze: changed nnml.el nnrss.el
-
-Davis Herring: changed timeclock.el
-
-Deanna Phillips: changed configure.in
-
-Decklin Foster: changed nngateway.el
-
-Deepak Goel: changed README ada-mode.el ada-xref.el appt.el apropos.el
-  artist.el bibtex.el bookmark.el calc-forms.el calc-mode.el
-  calc-units.el calc.el cmacexp.el decipher.el desktop.el diary-lib.el
-  dired-aux.el dnd.el doctor.el ebnf2ps.el echistory.el
-  and 50 other files
-
-Denis Bueno: changed autorevert.el
-
-Denis Howe: wrote browse-url.el
-
-Denis St\e,A|\e(Bnkel: changed ibuf-ext.el
-
-Derek Atkins: changed imap.el pgg-pgp.el
-
-Derek L. Davies: changed gud.el
-
-Detlev Zundel: wrote re-builder.el
-
-Dhruva Krishnamurthy: changed makefile.w32-in
-
-Diane Murray: changed erc.el erc-menu.el erc-backend.el erc-button.el
-  erc-track.el erc-match.el erc-nets.el erc-list.el erc-autoaway.el
-  erc-capab.el erc-nickserv.el erc-stamp.el erc-compat.el erc-fill.el
-  erc-goodies.el erc-ibuffer.el erc-log.el Makefile erc-dcc.el
-  erc-networks.el erc-nicklist.el and 32 other files
-
-Dick King: wrote uniquify.el
-
-Didier Verna: wrote gnus-diary.el nndiary.el
-and changed nntp.el gnus-art.el gnus-msg.el gnus-group.el gnus-start.el
-  gnus-sum.el gnus-xmas.el gnus-picon.el gnus-salt.el cus-edit.el rect.el
-  dgnushack.el gnus-agent.el gnus-ems.el gnus-fun.el gnus-topic.el
-  gnus.texi message.el nnmail.el nnmbox.el smiley.el
-
-Dirk Herrmann: changed bibtex.el
-
-Dmitry Antipov: changed keyboard.c
-
-Dominique De Waleffe: changed pcvs-info.el
-
-Don Morrison: wrote dabbrev.el
-
-Don Woods: changed replace.el
-
-Doug Cutting: wrote disass.el
-
-Doug Maxey: changed mouse.el
-
-Drew Adams: changed speedbar.el
-
-E. Jay Berkenbilt: changed flyspell.el ispell.el window.h
-
-Ed L. Cashin: changed gnus-sum.el imap.el
-
-Ed Swarthout: changed hexl.el
-
-Eduardo Mu\e,Aq\e(Boz: changed dired.el ls-lisp.el
-
-Edward M. Reingold: wrote cal-china.el cal-coptic.el cal-french.el
-  cal-islam.el cal-iso.el cal-julian.el cal-menu.el cal-move.el
-  cal-persia.el calendar.el diary-lib.el holidays.el lunar.el solar.el
-and changed diary.el tex-mode.el cal-tex.el cal-mayan.el holiday.el
-  cal-x.el cal-hebrew.el cal-chinese.el cal-dst.el diary-ins.el
-  diary-insert.el cal-persian.el cal-islamic.el calendar.texi
-  list-holidays.el
-
-Edward O'connor: changed erc.el erc-viper.el erc-log.el erc-track.el
-  viper.el erc-backend.el erc-chess.el erc-dcc.el erc-ezbounce.el
-  erc-goodies.el erc-list.el erc-macs.el erc-match.el erc-ring.el
-  erc-stamp.el goto-addr.el python.el
-
-Edwin Steiner: changed gnus-nocem.el
-
-Ehud Karni: changed rmail.el aviion-intel.h compile.el complete.el
-  configure.in frame.el rmailsum.el sort.el xdisp.c
-
-Eirik Fuller: changed ralloc.c xterm.c
-
-Eli Barzilay: wrote calculator.el
-
-Eli Tziperman: wrote rmail-spam-filter.el
-
-Eli Zaretskii: wrote codepage.el rxvt.el tty-colors.el
-and changed msdos.c Makefile.in makefile.w32-in files.el info.el fileio.c
-  startup.el mainmake.v2 config.bat rmail.el menu-bar.el pc-win.el
-  simple.el msdos.h internal.el xfaces.c emacs.c frame.c INSTALL dosfns.c
-  faces.el and 532 other files
-
-Emanuele Giaquinta: changed rxvt.el configure.in etags.c frame.el
-  sh-script.el text.texi
-
-Emilio C. Lopes: changed woman.el cmuscheme.el help.el vc.el advice.el
-  animate.el apropos.el artist.el bookmark.el cal-menu.el calc-prog.el
-  calc-store.el calcalg3.el calendar.el calendar.texi checkdoc.el
-  code-pages.el codepage.el compile.el completion.el cus-edit.el
-  and 53 other files
-
-Emmanuel Briot: wrote ada-prj.el xml.el
-and changed ada-mode.el ada-stmt.el ada-xref.el
-
-Enami Tsugutomo: changed frame.c keyboard.c dispnew.c fileio.c process.c
-  xdisp.c add-log.el bytecomp.el configure.in editfns.c emacs.c frame.h
-  gnus-group.el perl-mode.el rmailsum.el simple.el sysdep.c vc.el
-  window.c window.el
-
-Era Eriksson: changed dired.el shell.el
-
-Eric Decker: changed hp9000s800.h hpux.h sysdep.c
-
-Eric Ding: wrote goto-addr.el
-and changed mh-utils.el mh-e.el mh-comp.el mh-mime.el
-
-Eric Eide: changed gnus-xmas.el
-
-Eric Hanchrow: changed TUTORIAL.es abbrev.el autorevert.el cperl-mode.el
-  delphi.el dired.el emacsclient.c erc.el ispell.el make-dist
-
-\e,AI\e(Bric Jacoboni: changed fr-refcard.tex
-
-Eric Knauel: changed gnus.el spam-report.el spam.el
-
-Eric M. Ludlam: wrote checkdoc.el dframe.el ezimage.el sb-image.el
-  speedbar.el
-and changed info.el rmail.el speedbspec.el gud.el Makefile.in comint.el
-  dir lisp-mnt.el rmailout.el sb-*.xpm sb-dir+.xpm sb-dir-.xpm
-  sb-dir-minus.xpm sb-dir-plus.xpm sb-dir.xpm sb-file+.xpm sb-file-.xpm
-  sb-file.xpm sb-mail.xpm sb-pg-minus.xpm sb-pg-plus.xpm
-  and 10 other files
-
-Eric Marsden: changed gnus-cache.el url-util.el
-
-Eric S. Raymond: wrote AT386.el asm-mode.el cookie1.el finder.el gud.el
-  keyswap.el lisp-mnt.el loadhist.el
-and changed vc.el Makefile.in files.el comint.el loaddefs.el simple.el
-  vc-hooks.el cust-print.el dired.el emacsbug.el help.el isearch.el
-  makefile.el tex-mode.el x-win.el bibtex.el buff-menu.el bytecomp.el
-  c-mode.el cmulisp.el cmuscheme.el and 217 other files
-
-Eric Youngdale: changed etags-vmslib.c
-
-Erik Naggum: wrote disp-table.el latin-4.el latin-5.el mailheader.el
-  parse-time.el
-and changed simple.el emacs.c files.el lread.c rmail.el alloc.c editfns.c
-  keyboard.c apropos.el configure.in dispnew.c filelock.c fns.c keymap.c
-  lisp.h print.c process.c add-log.el buffer.c casetab.c cl-macs.el
-  and 112 other files
-
-Erik Toubro Nielsen: changed gnus-sum.el gnus-topic.el
-
-Espen Skoglund: wrote pascal.el
-
-Ethan Bradford: changed ispell.el ange-ftp.el gnus.el gnuspost.el lpr.el
-  mailalias.el vt-control.el
-
-Eugene Exarevsky: changed sql.el
-
-Evgeni Dobrev: changed man.el
-
-Evgeny Roubinchtein: changed mail-source.el pc-select.el
-
-F. Thomas May: wrote blackbox.el
-
-Fabrice Bauzac: changed dired-aux.el
-
-Fabrice Popineau: changed etags.c gnus-cache.el
-
-Faried Nawaz: changed message.el
-
-Felix Lee: changed flyspell.el outline.el compile.el data.c gud.el
-  nntp.el process.c vc.el xdisp.c
-
-Ferenc Wagner: changed nnweb.el
-
-Flemming Hoejstrup Hansen: changed forms.el
-
-Florian Weimer: changed message.el gnus.el coding.c gnus.texi mm-util.el
-
-Francesc Rocher: changed cus-start.el macterm.c w32term.c xdisp.c xterm.c
-
-Francesco Potort\e,Al\e(B: wrote cmacexp.el
-and changed etags.c man.el delta.h undigest.el etags.1 comint.el
-  configure.in uniquify.el latin-post.el maintaining.texi rmail.el
-  Makefile.in etags.el latin-alt.el sgml-mode.el data.c european.el
-  filelock.c files.el generic-x.el gud.el and 43 other files
-
-Francis J. Wright: wrote woman.el
-and changed dired.el comint.el files.el
-
-Francis Litterio: changed erc.el erc-list.el erc-dcc.el erc-notify.el
-  erc-button.el erc-goodies.el erc-nets.el erc-ring.el Makefile
-  erc-pcomplete.el erc-backend.el erc-ibuffer.el erc-match.el
-  erc-nickserv.el erc-page.el erc-speedbar.el gnus-util.el keymaps.texi
-  message.el os.texi saveplace.el and 4 other files
-
-Francois Felix Ingrand: changed gnus-salt.el
-
-Frank Bennett: changed nnmail.el
-
-Frank Bresz: wrote diff.el
-
-Frank Schmitt: changed gnus-sum.el gnus-util.el
-
-Frank Weinberg: changed gnus-art.el
-
-Fran\e,Ag\e(Bois Pinard: changed nndoc.el allout.el bytecomp.el gnus-sum.el
-  gnus-util.el gnus-uu.el make-mode.el nnmail.el rmailsum.el timezone.el
-
-Fran\e,Ag\e(Bois-David Collin: changed message.el mm-decode.el
-
-Fred Fish: changed linux.h unexec.c
-
-Fred Oberhauser: changed nnmail.el
-
-Frederic Han: changed iso-cvt.el
-
-Frederic Lepied: wrote expand.el
-and changed gnus.el
-
-Frederic Pierresteguy: wrote widget.c
-and changed xmenu.c xterm.c xfns.c dpx2.h lwlib.c rmailsum.el rmail.el
-  xlwmenu.c xterm.h lwlib-Xaw.c lwlib-Xlw.c Makefile.in configure.in
-  lwlib-Xaw.h lwlib-int.h xdisp.c compile.el editfns.c fns.c frame.h
-  hilit19.el and 9 other files
-
-Frederik Fouvry: changed sendmail.el TUTORIAL.nl emacs.bash faces.el
-  filecache.el mailalias.el rmail.el thumbs.el
-
-Fritz Knabe: changed mh-mime.el
-
-Fr\e,Ai\e(Bd\e,Ai\e(Bric Bothamy: changed TUTORIAL.fr
-
-G Dinesh Dutt: changed etags.el
-
-Gareth Jones: changed fns.c gnus-score.el
-
-Garrett Wollman: changed sendmail.el
-
-Gary Byers: changed xenix.h
-
-Gary D. Foster: wrote crisp.el scroll-all.el
-and changed gnus-group.el gnus-topic.el
-
-Gary Delp: wrote mailpost.el (public domain)
-
-Gary Howell: changed server.el
-
-Gary Oberbrunner: changed gud.el
-
-Gary Wong: changed termcap.c tparam.c
-
-Gaute B Strokkenes: changed imap.el gnus-fun.el mail-source.el process.c
-
-Geoff Greene: changed message.el
-
-Geoff Voelker: wrote lisp/makefile.nt nt.c nt.h ntheap.c ntheap.h
-  ntinevt.c ntproc.c ntterm.c src/makefile.nt w32-fns.el windowsnt.h
-  winnt.el
-and changed w32.c w32fns.c fileio.c w32heap.c w32term.c w32inevt.c
-  callproc.c s/ms-w32.h w32proc.c unexw32.c w32term.h dos-w32.el
-  emacs.bat loadup.el w32-win.el emacs.c keyboard.c process.c
-  w32console.c addpm.c cmdproxy.c and 106 other files
-
-Georg C. F. Greve: changed pgg-gpg.el
-
-George V. Reilly: changed emacs.ico
-
-Georges Brun-Cottan: wrote easy-mmode.el
-
-Gerd M\e,Av\e(Bllmann: wrote authors.el ebrowse.el jit-lock.el rx.el tooltip.el
-and changed xdisp.c xterm.c dispnew.c dispextern.h xfns.c xfaces.c
-  window.c keyboard.c lisp.h Makefile.in faces.el alloc.c buffer.c
-  startup.el xterm.h fns.c simple.el term.c configure.in frame.c xmenu.c
-  and 620 other files
-
-Gergely Nagy: changed erc.el
-
-Germano Caronni: changed ralloc.c
-
-Gernot Heiser: changed refer.el
-
-Giorgos Keramidas: changed configure.in MACHINES amdx86-64.h apropos.el
-  display.texi fringe.c fringe.el lisp.h windows.texi xmenu.c
-
-Giuseppe Scrivano: changed buffer.c configure.in sysdep.c xsmfns.c
-
-Glenn Morris: changed f90.el diary-lib.el calendar.el fortran.el
-  calendar.texi appt.el sh-script.el Makefile.in timeclock.el cal-menu.el
-  files.el complete.el configure.in programs.texi startup.el MACHINES
-  abbrevs.texi cal-hebrew.el cal-islam.el emacs.texi faq.texi
-  and 151 other files
-
-Glynn Clements: wrote gamegrid.el snake.el tetris.el
-
-Gordon Matzigkeit: changed gnus-uu.el
-
-Greg Hill: changed bytecomp.el
-
-Greg Hudson: changed configure.in indent.c
-
-Greg Klanderman: changed messagexmas.el
-
-Greg Mcgary: changed tar-mode.el
-
-Greg Stark: changed gnus-ems.el timezone.el
-
-Gregor Schmid: wrote tcl-mode.el
-and changed intervals.c intervals.h textprop.c dispnew.c indent.c xdisp.c
-
-Gregorio Gervasio, Jr.: changed gnus-sum.el
-
-Gregory Chernov: changed nnslashdot.el
-
-Gregory Neil Shapiro: changed mailabbrev.el
-
-Guanpeng Xu: changed add-log.el TUTORIAL.cn display.texi mouse.el
-  type-break.el
-
-Guillermo J. Rozas: wrote fakemail.c
-
-Gunnar Horrigmo: changed gnus-sum.el
-
-Gustav H\e,Ae\e(Bllberg: changed compile.el rect.el
-
-Guy Geens: changed gnus-score.el
-
-G\e,Av\e(Bran Uddeborg: changed isc4-1.h
-
-Hallvard B. Furuseth: changed gnus-util.el editfns.c gnus-cache.el
-  gnus-sum.el lread.c messcompat.el nntp.el print.c process.c search.c
-
-Han Boetes: changed netbsd.h
-
-Han-Wen Nienhuys: changed emacsclient.c server.el
-
-Hans Chalupsky: wrote advice.el trace.el
-and changed bytecomp.el
-
-Hans De Graaff: changed mml.el
-
-Hans Henrik Eriksen: wrote simula.el
-
-Harald Maier: changed w32heap.c
-
-Harald Meland: changed gnus-art.el gnus-salt.el gnus-score.el
-  gnus-util.el gnus-win.el
-
-Heiko Muenkel: changed b2m.c
-
-Helmut Waitzmann: changed gnus-sum.el gnus.texi
-
-Henrik Enberg: changed gnus-art.el gnus-msg.el lread.c rmailout.el
-  xfaces.c
-
-Henry Guillaume: wrote find-file.el
-
-Henry Kautz: wrote bib-mode.el refbib.el
-
-Hewlett-Packard: changed emacsclient.c emacsserver.c keyboard.c server.el
-
-Hideki Iwamoto: changed etags.c
-
-Hiroshi Fujishima: changed faq.texi mail-source.el spam-stat.el
-
-Hiroshi Nakano: changed ralloc.c unexelf.c
-
-Hoan Ton-That: changed erc-log.el
-
-Holger Schauer: wrote fortune.el
-and changed message-utils.el
-
-Hovav Shacham: wrote windmove.el
-
-Howard Gayle: wrote case-table.el casetab.c disp-table.el iso-ascii.el
-  iso-insert.el iso-swed.el iso-syntax.el iso-transl.el latin-1.el
-  rot13.el swedish.el vt100-led.el
-
-Howard Melman: changed imenu.el picture.el
-
-Howie Kaye: wrote sort.el
-
-Hrvoje Nik\e,B9\e(Bi\e,Bf\e(B: wrote croatian.el savehist.el
-and changed gnus-xmas.el message.el nnmail.el fileio.c fns.c gnus-art.el
-  gnus-salt.el gnus-spec.el mm-decode.el add-log.el appt.el arc-mode.el
-  avoid.el bookmark.el cal-china.el cal-tex.el calendar.el cl-indent.el
-  cmacexp.el comint.el compile.el and 83 other files
-
-H\e,Ae\e(Bkan Granath: changed dired.el
-
-H\e,Ae\e(Bkon Malmedal: changed calendar.el holidays.el
-
-Ian Lance Taylor: changed sco4.h
-
-Ian T Zimmerman: wrote gametree.el
-and changed ange-ftp.el desktop.el tex-mode.el
-
-Ilja Weis: wrote gnus-topic.el
-
-Ilya N. Golubev: changed mm-util.el shell.el
-
-Ilya Zakharevich: wrote tmm.el
-and changed cperl-mode.el syntax.c syntax.h textprop.c dired.c
-  font-lock.el interval.c intervals.c intervals.h regex.c regex.h
-  search.c
-
-Ilya Zakharevich And Bob Olson: wrote cperl-mode.el
-
-Indiana University Foundation: changed buffer.c buffer.h indent.c
-  region-cache.c region-cache.h search.c xdisp.c
-
-Inge Frick: changed easymenu.el keyboard.c view.el compile.el
-  dired-aux.el arc-mode.el dired.el files.el gnus-sum.el keyboard.h
-  keymap.c tar-mode.el window.el xmenu.c
-
-Inoue Seiichiro: changed xterm.c xfns.c xterm.h
-
-International Business Machines: changed emacs.c fileio.c ibmrt-aix.h
-  ibmrt.h process.c sysdep.c unexec.c
-
-Ishikawa Chiaki: changed aviion.h dgux.h
-
-Istvan Marko: changed gnus-agent.el xfns.c
-
-Ivan Boldyrev: changed mml1991.el
-
-Ivan Zakharyaschev: changed codepage.el lread.c
-
-Ivar Rummelhoff: wrote winner.el
-
-Iwamuro Motonori: changed gnus-kill.el
-
-J.D. Smith: changed idlwave.el idlw-shell.el idlw-help.el idlw-rinfo.el
-  idlw-toolbar.el comint.el idlwave.texi vc.el bibtex.el files.texi
-  hideshow.el idlw-complete-structtag.el misc.texi mouse.el
-
-Jaap-Henk Hoepman: changed mm-decode.el
-
-Jack Repenning: changed unexelfsgi.c
-
-Jack Twilley: changed message.el
-
-Jacob Morzinski: changed mh-comp.el
-
-Jacques Duthen: changed ps-print.el
-
-Jaeyoun Chung: changed hangul3.el hanja3.el gnus-mule.el hangul.el
-
-James Clark: wrote sgml-mode.el
-and changed fns.c window.c xselect.c
-
-James Cloos: changed url-history.el
-
-James R. Larus: wrote mh-e.el
-
-James R. Van Zandt: changed sh-script.el
-
-James Troup: changed gnus-sum.el
-
-James Van Artsdalen: changed unexec.c usg5-4.h
-
-Jamie Zawinski: wrote byte-opt.el byte-run.el bytecomp.el disass.el
-  mailabbrev.el tar-mode.el
-and changed bytecode.c mail-extr.el subr.el
-
-Jan Dj\e,Ad\e(Brv: wrote dnd.el x-dnd.el
-and changed gtkutil.c xterm.c xfns.c xmenu.c xterm.h configure.in
-  gtkutil.h x-win.el Makefile.in keyboard.c frames.texi config.in
-  xselect.c emacs.c alloc.c xlwmenu.c xresources.texi frame.c startup.el
-  xdisp.c cus-start.el and 176 other files
-
-Jan Nieuwenhuizen: changed info.el TUTORIAL.nl emacs.c emacsclient.c
-  gnus-start.el gud.el nnmh.el server.el startup.el
-
-Jan Rychter: changed gnus-msg.el
-
-Jan Schormann: wrote solitaire.el
-
-Jan Vroonhof: changed gnus-cite.el gnus-msg.el nntp.el
-
-Jan-Hein Buhrman: changed ange-ftp.el env.el
-
-Jari Aalto: changed add-log.el filecache.el gnus-art.el lisp-mnt.el
-  nnmail.el apropos.el autorevert.el compile.el cperl-mode.el debug.el
-  executable.el files.el finder.el font-lock.el gnus.el gnus.texi grep.el
-  ls-lisp.el man.el sendmail.el terminal.el
-
-Jason Merrill: changed gnus-sum.el gnus-salt.el imap.el nnfolder.el
-
-Jason Rumney: wrote w32-vars.el
-and changed w32fns.c w32term.c w32menu.c w32-win.el w32term.h
-  makefile.w32-in w32.c w32bdf.c w32-fns.el w32select.c w32console.c
-  w32gui.h w32proc.c keyboard.c mule-cmds.el emacs.c fileio.c w32bdf.h
-  w32inevt.c config.nt configure.bat and 84 other files
-
-Jay Belanger: changed calc.texi calc.el calc-ext.el calc-embed.el
-  calc-aent.el calc-prog.el calc-arith.el calc-help.el calc-lang.el
-  calcalg2.el COPYING calc-graph.el calc-store.el calc-units.el
-  calc-misc.el calc-yank.el calc-alg.el calc-poly.el calccomp.el
-  calc-mode.el calc-forms.el and 35 other files
-
-Jay K. Adams: wrote jka-cmpr-hook.el jka-compr.el
-
-Jay Sachs: changed gnus-score.el gnus-win.el
-
-Jean-Philippe Theberge: wrote thumbs.el
-
-Jeff Dwork: changed ehelp.el facemenu.el
-
-Jeff Miller: changed appt.el
-
-Jeff Morgenthaler: changed flow-ctrl.el vt200.el vt201.el vt220.el
-  vt240.el
-
-Jeff Norden: wrote kermit.el
-
-Jeff Peck: wrote sun-curs.el sun-fns.el sun-mouse.el sun.el
-
-Jeffrey C Honig: wrote mh-print.el
-and changed mh-comp.el mh-e.el mh-utils.el mh-customize.el mh-funcs.el
-  mh-mime.el mh-seq.el Makefile bsdos4.h mh-alias.el mh-junk.el
-  mh-loaddefs.el
-
-Jens Krinke: changed smime.el
-
-Jens Lautenbacher: changed gnus.el
-
-Jens Petersen: wrote find-func.el
-and changed ffap.el mule-cmds.el
-
-Jens Toivo Berger Thielemann: changed word-help.el
-
-Jens-Ulrik Holger Petersen: changed cus-edit.el find-func.el gnus.el
-
-Jeramey Crawford: changed amdx86-64.h configure.in
-
-Jeremy Bertram Maitin-Shepard: changed erc.el erc-backend.el
-  erc-button.el mml.el
-
-Jerry Frain: changed systime.h usg5-4.h
-
-Jerry James: changed format.el dns.el gnus-util.el gnus-xmas.el
-
-Jesper Harder: wrote yenc.el
-and changed gnus-art.el gnus-sum.el message.el gnus-msg.el gnus.el
-  gnus-group.el mm-bodies.el gnus-util.el mm-util.el mm-decode.el mml.el
-  rfc2047.el mailcap.el mm-uu.el mml1991.el pgg-gpg.el smtpmail.el
-  gnus-srvr.el info.el nnmail.el pgg.el and 178 other files
-
-Jhair Tocancipa Triana: changed gnus-audio.el
-
-Jim Blandy: wrote tvi970.el
-and changed keyboard.c xterm.c xfns.c Makefile.in window.c process.c
-  dispnew.c xdisp.c sysdep.c configure.in lisp.h keymap.c configure
-  make-dist buffer.c frame.c screen.c x-win.el simple.el alloc.c emacs.c
-  and 389 other files
-
-Jim Kingdon: changed MACHINES SERVICE emacsclient.c emacs.tex hp300bsd.h
-  rmail.el
-
-Jim Meyering: changed Makefile.in grep-changelog
-
-Jim Radford: changed gnus-start.el
-
-Jim Salem: wrote completion.el
-
-Jim Thompson: wrote ps-print.el
-
-Jim Wilson: changed Makefile.in alloca.c
-
-Jindrich Makovicka: changed eval.c fns.c
-
-Jirka Kosek: changed mule.el
-
-Joakim Hove: wrote html2text.el
-
-Joakim Verona: changed nnrss.el
-
-Joanna Pluta: changed TUTORIAL.pl
-
-Jochen Hein: changed gnus-art.el
-
-Jochen K\e,A|\e(Bpper: changed calc-units.el gnus.texi
-
-Joe Buehler: changed Makefile.in configure.in cygwin.h MACHINES
-  browse-url.el comint.el configure dired-aux.el dired.el dirtrack.el
-  dos-w32.el fast-lock.el filecache.el fileio.c files.el gmalloc.c
-  gnus-util.el hippie-exp.el keyboard.c lastfile.c loadup.el
-  and 12 other files
-
-Joe Casadonte: changed gnus-srvr.el
-
-Joe Corneli: changed subr.el
-
-Joe Edmonds: changed lisp-mode.el
-
-Joe Kelsey: changed skeleton.el
-
-Joe Ramey: changed filelock.c rmailsum.el
-
-Joe Reiss: changed gnus-art.el
-
-Joe Wells: wrote apropos.el mail-extr.el resume.el
-and changed arc-mode.el
-
-Joel N. Weber Ii: changed comint.el make-dist
-
-Joel Ray Holveck: changed gnus-sum.el info.el
-
-Joev Dubach: changed nntp.el
-
-Johan Bockg\e,Ae\e(Brd: changed erc.el erc-backend.el cl-macs.el erc-match.el
-  custom.el erc-nickserv.el erc-ring.el erc-speak.el erc-track.el
-  simple.el align.el bytecomp.el calendar.el cl.texi dired-aux.el
-  dired-x.el display.texi erc-bbdb.el erc-button.el erc-compat.el
-  erc-dcc.el and 16 other files
-
-Johan Vromans: wrote forms-d2.el forms.el iso-acc.el
-and changed complete.el
-
-John Basrai: changed man.el
-
-John F. Carr: changed dired.c
-
-John F. Whitehead: changed mule-cmds.el mule-diag.el
-
-John Fremlin: changed gnus-msg.el message.el
-
-John Grabowski: changed xfaces.c xfns.c
-
-John H. Palmieri: changed gnus-fun.el
-
-John Heidemann: wrote mouse-copy.el mouse-drag.el
-
-John Hughes: changed term.c
-
-John J Foerch: changed erc-stamp.el
-
-John Mongan: changed f90.el
-
-John Paul Wallington: changed ibuffer.el ibuf-ext.el subr.el files.el
-  help-fns.el rmail.el thumbs.el fns.c bindings.el bytecomp.el
-  cus-theme.el info.el re-builder.el simple.el startup.el xfns.c
-  apropos.el arc-mode.el browse-url.el comint.el cus-start.el
-  and 117 other files
-
-John Robinson: wrote bg-mouse.el
-
-John Sullivan: changed window.c
-
-John Tobey: changed gud.el
-
-John W. Eaton: wrote octave-hlp.el octave-inf.el octave-mod.el
-
-John Wiegley: wrote align.el cal-bahai.el em-alias.el em-banner.el
-  em-basic.el em-cmpl.el em-dirs.el em-glob.el em-hist.el em-ls.el
-  em-pred.el em-prompt.el em-rebind.el em-script.el em-smart.el
-  em-term.el em-unix.el em-xtra.el erc-identd.el esh-arg.el esh-cmd.el
-  esh-ext.el esh-io.el esh-maint.el esh-mode.el esh-module.el esh-opt.el
-  esh-proc.el esh-test.el esh-util.el esh-var.el eshell.el eudcb-mab.el
-  isearchb.el pcmpl-cvs.el pcomplete.el timeclock.el
-and changed erc-chess.el erc.el iswitchb.el Makefile.in allout.el
-  cal-menu.el calendar.el compile.el desktop.el diary-lib.el erc-bbdb.el
-  erc-button.el erc-complete.el erc-fill.el erc-ibuffer.el erc-list.el
-  erc-match.el erc-menu.el erc-nets.el erc-replace.el erc-speak.el
-  and 11 other files
-
-John Williams: changed etags.el
-
-Jon Ericson: changed gnus.el spam-report.el
-
-Jon K Hellan: wrote utf7.el
-
-Jonathan I. Kamens: changed pop.c movemail.c rmail.el configure.in
-  Makefile.in b2m.pl config.in files.el pop.h terminal.el vc.el
-  gnus-sum.el jka-compr.el rmailout.el rnewspost.el sendmail.el simple.el
-  timezone.el vc-hooks.el
-
-Jonathan Stigelman: wrote hilit19.el
-
-Jonathan Vail: changed vc.el
-
-Jonathan Yavner: wrote ses.el tcover-ses.el tcover-unsafep.el
-  testcover.el unsafep.el
-and changed ses.texi Makefile.in edebug.el editfns.c files.el
-  functions.texi ses-example.ses subr.el variables.texi
-
-Jorgen Schaefer: wrote erc-autoaway.el erc-goodies.el erc-spelling.el
-and changed erc.el erc-track.el erc-backend.el erc-match.el erc-stamp.el
-  erc-button.el erc-fill.el erc-truncate.el erc-compat.el erc-members.el
-  Makefile erc-dcc.el erc-ibuffer.el erc-page.el erc-pcomplete.el
-  erc-sound.el erc-bbdb.el erc-imenu.el erc-lang.el erc-list.el
-  erc-macs.el and 9 other files
-
-Jose E. Marchesi: changed smtpmail.el
-
-Joseph Arceneaux: wrote xrdb.c
-and changed xterm.c xfns.c keyboard.c screen.c dispnew.c xdisp.c window.c
-  x-win.el fileio.c buffer.c xterm.h minibuf.c editfns.c lread.c
-  process.c alloc.c buffer.h screen.el files.el insdel.c emacs.c
-  and 105 other files
-
-Joseph M. Kelsey: changed dir.h fileio.c uaf.h vms-pwd.h vmsfns.c
-
-Josh Huber: changed mml-sec.el gnus-msg.el message.el mml.el mml2015.el
-  nnmail.el ChangeLog ChangeLog.1 gnus-cite.el gnus-delay.el gnus-spec.el
-  mml1991.el nnultimate.el nnwfm.el gnus-cus.el gnus-smiley.el
-  gnus-start.el gnus-topic.el gnus.el nnbabyl.el nndiary.el
-  and 8 other files
-
-Joshua Varner: changed intro.texi
-
-Jouni K. Sepp\e,Ad\e(Bnen: changed gnus.texi nnimap.el mm-url.el
-
-Juan Le\e,As\e(Bn Lahoz Garc\e,Am\e(Ba: wrote wdired.el
-and changed files.el perl-mode.el
-
-Juanma Barranquero: changed makefile.w32-in subr.el faces.el help-fns.el
-  files.el simple.el buffer.c w32fns.c emacsclient.c replace.el
-  vhdl-mode.el bs.el cperl-mode.el eval.c org.el process.c xdisp.c
-  idlwave.el sh-script.el window.c ada-mode.el and 629 other files
-
-Juergen Hoetzel: changed url-handlers.el
-
-Juergen Nickelsen: wrote ws-mode.el
-
-Julien Avarre: changed gnus-fun.el
-
-Julien Gilles: wrote gnus-ml.el
-
-Junio Hamano: changed window.el
-
-Jure Cuhalev: changed ispell.el
-
-Juri Linkov: changed info.el simple.el replace.el isearch.el compile.el
-  faces.el display.texi grep.el descr-text.el cus-edit.el dired.el
-  dired-aux.el edebug.el compare-w.el files.el lisp-mode.el lisp.el
-  modes.texi mule.el desktop.el files.texi and 221 other files
-
-Justin Sheehy: changed gnus-sum.el nntp.el
-
-J\e,Ai\e(Br\e,At\e(Bme Marant: changed Makefile.in make-dist bindings.el configure.in
-  emacsclient.c misc.texi
-
-K. Shane Hartman: wrote chistory.el echistory.el electric.el emacsbug.el
-  helper.el picture.el view.el
-and changed rmail.el loaddefs.el ebuff-menu.el dired.el simple.el
-  add-log.el lisp-mode.el shell.el buff-menu.el buffer.c c-mode.el
-  mail-utils.el mim-mode.el more-mode.el aton.el c++-mode.el cmds.c
-  compile.el files.el gud.el indent.el and 14 other files
-
-Kahlil Hodgson: changed timeclock.el
-
-Kai Gro\e,A_\e(Bjohann: wrote gnus-delay.el tramp-util.el tramp-uu.el tramp.el
-  trampver.el
-and changed gnus-agent.el message.el gnus-sum.el files.el nnmail.el
-  tramp.texi gnus.el simple.el ange-ftp.el Makefile.in dired.el
-  paragraphs.el bindings.el files.texi gnus-art.el gnus-group.el man.el
-  nntp.el INSTALL crisp.el fileio.c and 44 other files
-
-Kailash C. Chowksey: changed HELLO Makefile.in ind-util.el kannada.el
-  knd-util.el loadup.el makefile.w32-in
-
-Kanematsu Daiji: changed nnimap.el
-
-Karl Berry: changed emacs.texi info.texi elisp.texi anti.texi
-  display.texi emacs-xtra.texi filelock.c gnu.texi mule.texi texinfo.tex
-  text.texi building.texi cmdargs.texi control.texi copyright.el
-  custom.texi customize.texi dired.c dired.texi faq.texi frames.texi
-  and 72 other files
-
-Karl Chen: changed files.el align.el cc-vars.el gnus-art.el help-mode.el
-  jka-cmpr-hook.el make-mode.el perl-mode.el python.el tex-mode.el
-  vc-svn.el
-
-Karl Eichwalder: changed Makefile.in add-log.el bookmark.el dired-aux.el
-  dired.el info.el menu-bar.el midnight.el po.el
-
-Karl Fogel: wrote bookmark.el mail-hist.el saveplace.el
-and changed isearch.el menu-bar.el simple.el autogen.sh editfns.c
-  nnmail.el vc-svn.el window.c
-
-Karl Heuer: changed keyboard.c lisp.h xdisp.c buffer.c xfns.c xterm.c
-  alloc.c files.el frame.c configure.in window.c data.c minibuf.c
-  editfns.c fns.c process.c fileio.c simple.el keymap.c indent.c sysdep.c
-  and 444 other files
-
-Karl Kleinpaste: changed gnus-sum.el gnus-art.el gnus-picon.el
-  gnus-score.el gnus-uu.el gnus-xmas.el gnus.el mm-uu.el mml.el nnmail.el
-  smiley.el
-
-Karl M. Hegbloom: changed gnus.el
-
-Karl Pfl\e,Ad\e(Bsterer: changed gnus-art.el gnus-score.el spam-stat.el
-
-Katsuhiro Hermit Endo: changed gnus-group.el gnus-spec.el
-
-Katsumi Yamaoka: wrote canlock.el
-and changed gnus-art.el message.el gnus-sum.el gnus.texi mm-decode.el
-  mm-view.el gnus-util.el gnus-msg.el mm-util.el gnus.el lpath.el
-  gnus-group.el gnus-start.el rfc2047.el dgnushack.el mm-uu.el nntp.el
-  gnus-agent.el mml.el nnrss.el message.texi and 72 other files
-
-Kaveh R. Ghazi: changed delta88k.h xterm.c
-
-Kawabata, Taichi: wrote indian.el
-and changed devanagari.el ind-util.el Makefile.in devan-util.el
-  characters.el fontset.el malayalam.el mlm-util.el mule-conf.el tamil.el
-  tml-util.el
-
-Kayvan Sylvan: changed sc.el
-
-Kazushi Marukawa: changed filelock.c hexl.c profile.c unexalpha.c
-
-Keiichi Suzuki: changed nntp.el
-
-Keisuke Nishida: changed print.c alloc.c bytecomp.el data.c keymap.c
-
-Keith Gabryelski: wrote hexl.c hexl.el
-
-Ken Brush: changed emacsclient.c
-
-Ken Laprade: changed simple.el
-
-Ken Manheimer: wrote allout.el icomplete.el
-and changed pgg-gpg.el pgg.el pgg-pgp.el pgg-pgp5.el edebug.el pgg.texi
-  tips.texi
-
-Ken Raeburn: changed lisp.h buffer.c alloc.c keyboard.c lread.c minibuf.c
-  coding.c Makefile.in editfns.c fileio.c fns.c keymap.c undo.c xdisp.c
-  xfns.c xterm.c charset.h fontset.c search.c window.c charset.c
-  and 84 other files
-
-Ken Stevens: wrote ispell.el
-
-Kenichi Handa: wrote cyrillic.el isearch-x.el py-punct.el pypunct-b5.el
-  quail.el thai-word.el
-and changed coding.c mule-cmds.el mule.el charset.c fileio.c xterm.c
-  fns.c ccl.c Makefile.in mule-conf.el fontset.c charset.h coding.h
-  fontset.el mule-diag.el xdisp.c editfns.c process.c insdel.c
-  japanese.el characters.el and 286 other files
-
-Kenneth Stailey: changed alpha.h configure.in ns32000.h openbsd.h pmax.h
-  sparc.h unexalpha.c unexelf.c
-
-Kevin Blake: changed font-lock.el ring.el
-
-Kevin Broadey: wrote foldout.el
-
-Kevin Christian: changed gnus-score.el
-
-Kevin Gallagher: wrote edt-lk201.el edt-mapper.el edt-pc.el edt-vt100.el
-  edt.el flow-ctrl.el
-and changed edt-user.doc
-
-Kevin Gallo: wrote w32-win.el
-and changed dispnew.c addpm.c config.nt dispextern.h emacs.c facemenu.el
-  faces.el fns.c frame.c frame.h keyboard.c mouse.el ntterm.c process.c
-  s/ms-w32.h scroll.c startup.el sysdep.c term.c unexw32.c w32.c
-  and 16 other files
-
-Kevin Greiner: wrote legacy-gnus-agent.el
-and changed gnus-agent.el gnus-start.el gnus-sum.el gnus-int.el gnus.el
-  nntp.el gnus-util.el gnus-group.el gnus-cus.el gnus-range.el
-  gnus-art.el gnus-cache.el gnus-srvr.el nnagent.el nnheader.el
-  dgnushack.el gnus-async.el gnus-draft.el gnus-registry.el gnus-salt.el
-  gnus-uu.el and 3 other files
-
-Kevin Layer: changed w32proc.c
-
-Kevin Rodgers: changed compile.el mailabbrev.el dired-x.el files.el
-  ange-ftp.el byte-opt.el desktop.el diff-mode.el dired-x.texi ffap.el
-  files.texi flyspell.el isearch.el killing.texi lisp.el loadhist.el
-  mailalias.el menu-bar.el print.c replace.el sendmail.el
-  and 5 other files
-
-Kevin Ryde: wrote info-xref.el
-and changed info-look.el info.el arc-mode.el cl.texi gnus-art.el
-  gnus-sum.el mailcap.el mule.el os.texi text.texi MORE.STUFF cal-dst.el
-  calendar.texi cc-align.el cmdargs.texi compile.texi display.texi
-  em-alias.el em-dirs.el em-hist.el em-unix.el and 19 other files
-
-Kim F. Storm: wrote bindat.el cua-base.el cua-gmrk.el cua-rect.el ido.el
-  keypad.el kmacro.el
-and changed xdisp.c dispextern.h process.c simple.el window.c keyboard.c
-  xterm.c subr.el w32term.c dispnew.c lisp.h fringe.c macterm.c
-  display.texi fns.c alloc.c xfaces.c keymap.c xfns.c xterm.h .gdbinit
-  and 255 other files
-
-Kim-Minh Kaplan: changed gnus-picon.el gnus-sum.el gnus-start.el
-  gnus-win.el gnus-xmas.el gnus.texi message.el nndraft.el nnml.el
-
-Kishore Kumar: changed terminal.el
-
-Klaus Straubinger: changed url-http.el url-history.el url-cookie.el
-  url.el
-
-Klaus Zeitler: changed configure.in files.el sh-script.el vcursor.el
-
-Koaunghi Un: wrote hanja3.el
-and changed hanja.el hangul.el hangul3.el hanja-jis.el symbol-ksc.el
-
-Kobayashi Yasuhiro: changed w32fns.c configure.bat indent.c info.el
-  w32term.c w32term.h window.c xfns.c
-
-Kohtala Marko: changed info.el
-
-Koseki Yoshinori: wrote iimage.el
-and changed nnmail.el
-
-Kurt B. Kaiser: changed message.el
-
-Kurt Hornik: wrote octave-hlp.el octave-inf.el octave-mod.el
-and changed battery.el ielm.el term.el
-
-Kurt Swanson: changed gnus-art.el gnus-salt.el gnus-sum.el gnus-ems.el
-  gnus-group.el gnus-msg.el gnus-score.el gnus-util.el nnmail.el window.c
-
-Kyle Jones: wrote life.el mldrag.el
-and changed saveconf.el buffer.c mail-utils.el sendmail.el
-
-Kyotaro Horiguchi: changed coding.c indent.c
-
-K\e,Aa\e(Broly L\e$,1 q\e(Brentey: changed xfns.c bindings.el keyboard.c HELLO authors.el
-  buff-menu.el buffer.c buffers.texi cmds.c coding.c editfns.c frame.el
-  menu-bar.el print.c simple.el xdisp.c xterm.c xterm.h
-
-Larry Kolodney: wrote cvtmail.c
-
-Lars Balker Rasmussen: changed gnus-art.el gnus-agent.el message.el
-
-Lars Brinkhoff: changed building.texi config.in configure.in editfns.c
-  fns.c os.texi
-
-Lars Hansen: changed desktop.el tramp.el info.el mh-e.el dired-x.el
-  dired-x.texi dired.el ls-lisp.el rmail.el dired.c files.texi grp.h
-  hilit-chg.el misc.texi url-auth.el url-cache.el url-dired.el url-ftp.el
-  url-irc.el url-misc.el url-news.el and 39 other files
-
-Lars Lindberg: wrote imenu.el msb.el
-and changed dabbrev.el
-
-Lars Magne Ingebrigtsen: wrote compface.el dns.el format-spec.el
-  gnus-agent.el gnus-art.el gnus-async.el gnus-bcklg.el gnus-cache.el
-  gnus-demon.el gnus-draft.el gnus-dup.el gnus-eform.el gnus-ems.el
-  gnus-fun.el gnus-group.el gnus-int.el gnus-logic.el gnus-move.el
-  gnus-nocem.el gnus-picon.el gnus-range.el gnus-salt.el gnus-spec.el
-  gnus-srvr.el gnus-start.el gnus-sum.el gnus-undo.el gnus-util.el
-  gnus-uu.el gnus-win.el ietf-drums.el mail-parse.el mail-prsvr.el
-  mail-source.el message.el messcompat.el mm-bodies.el mm-decode.el
-  mm-encode.el mm-util.el mm-view.el mml.el netrc.el nnagent.el
-  nnbabyl.el nndir.el nndoc.el nndraft.el nneething.el nngateway.el
-  nnkiboze.el nnlistserv.el nnmail.el nnmbox.el nnmh.el nnoo.el
-  nnslashdot.el nnsoup.el nntp.el nnultimate.el nnweb.el nnwfm.el qp.el
-  rfc2045.el rfc2047.el rfc2231.el score-mode.el spam.el time-date.el
-and changed gnus.el gnus-msg.el gnus-score.el gnus-topic.el gnus-xmas.el
-  nnfolder.el gnus-cite.el nnheader.el nnml.el lpath.el nnvirtual.el
-  dgnushack.el gnus-cus.el smiley-ems.el editfns.c gnus-mh.el
-  gnus-soup.el gnus.texi nnrss.el pop3.el fns.c and 46 other files
-
-Lasse Rasinen: changed gnus-start.el
-
-Laurent Martelli: changed mm-decode.el
-
-Lawrence Mitchell: wrote erc-backend.el erc-log.el erc-nicklist.el
-and changed erc.el erc-match.el erc-nets.el erc-nickserv.el erc-button.el
-  erc-compat.el erc-dcc.el erc-fill.el erc-list.el erc-track.el Makefile
-  erc-autoaway.el erc-autojoin.el erc-bbdb.el erc-ezbounce.el erc-menu.el
-  erc-netsplit.el erc-notify.el erc-sound.el subr.el tempo.el
-
-Lawrence R. Dodd: wrote dired-x.el
-and changed fortran.el ispell.el sendmail.el cmuscheme.el comint.el
-  compile.el dired.el find-dired.el gnus.el gud.el inf-lisp.el info.el
-  lisp.el loaddefs.el man.el minibuf.c rcs2log rmail.el simple.el
-  terminal.el text-mode.el and 4 other files
-
-Leigh Stoller: changed emacsclient.c emacsserver.c server.el
-
-Lennart Borgman: changed tutorial.el window.el ada-xref.el emacsclient.c
-  filesets.el flymake.el help-fns.el isearch.el mouse.el recentf.el
-  replace.el shell.el texinfmt.el w32term.c w32term.h
-
-Lennart Staflin: changed dired.el diary-ins.el diary-lib.el tq.el xdisp.c
-
-Leonard H. Tower Jr.: changed rnews.el rnewspost.el emacsbug.el
-  rmailout.el
-
-Levin Du: changed parse-time.el
-
-Liam Healy: changed outline.el
-
-Lloyd Zusman: changed mml.el pgg-gpg.el
-
-Luc Teirlinck: wrote help-at-pt.el
-and changed files.el autorevert.el cus-edit.el subr.el simple.el
-  frames.texi startup.el display.texi files.texi Makefile.in dired.el
-  comint.el custom.texi emacs.texi fns.c frame.el ielm.el minibuf.texi
-  modes.texi variables.texi buffers.texi and 215 other files
-
-Lucid, Inc.: changed byte-opt.el byte-run.el bytecode.c bytecomp.el
-  delsel.el disass.el faces.el font-lock.el lmenu.el lselect.el
-  mailabbrev.el select.el xfaces.c xselect.c
-
-\e$,1 a\e(Bukasz Demianiuk: changed erc.el
-
-Lute Kamstra: changed modes.texi generic.el debug.el generic-x.el
-  font-lock.el subr.el Makefile.in debugging.texi easy-mmode.el
-  elisp.texi hl-line.el simple.el battery.el bindings.el calc.el
-  cmdargs.texi edebug.texi emacs.texi info.el make-tarball.txt
-  octave-inf.el and 216 other files
-
-Lynn Slater: wrote help-macro.el
-
-L\e,Bu\e(Brentey K\e,Ba\e(Broly: changed spam.el gnus-sum.el
-
-MCC: wrote xmenu.c
-and changed emacsclient.c emacsserver.c etags.c lisp.h movemail.c
-  rmail.el rmailedit.el rmailkwd.el rmailmsc.el rmailout.el rmailsum.el
-  scribe.el server.el sysdep.c unexec.c
-
-Maciek Pasternacki: changed nnrss.el
-
-Magnus Henoch: changed url-http.el ispell.el url.el url-gw.el
-  url-parse.el url-proxy.el autoinsert.el rcirc.el url-https.el
-
-Manuel Serrano: wrote flyspell.el
-
-Marc Fleischeuers: changed files.el
-
-Marc Girod: changed informat.el rmail.el rmailsum.el sendmail.el
-
-Marc Lefranc: changed gnus-art.el
-
-Marc Shapiro: changed bibtex.el
-
-Marcelo Toledo: changed TUTORIAL.pt_BR TUTORIAL.cn TUTORIAL.cs
-  TUTORIAL.de TUTORIAL.es TUTORIAL.fr TUTORIAL.it TUTORIAL.ja TUTORIAL.ko
-  TUTORIAL.pl TUTORIAL.ro TUTORIAL.ru TUTORIAL.sk TUTORIAL.sl TUTORIAL.th
-  TUTORIAL.translators TUTORIAL.zh add-log.el european.el
-
-Marco Melgazzi: changed term.el
-
-Marco Walther: changed mips-siemens.h unexelfsni.c unexsni.c
-
-Marcus G. Daniels: changed xterm.c configure.in lwlib-Xm.c lwlib.c
-  Makefile.in xdisp.c xfns.c xmenu.c alloc.c config.in dispnew.c
-  editfns.c emacs.c irix5-0.h linux.h lwlib-Xm.h lwlib.h ptx4.h
-  sequent-ptx.h unexelf.c
-
-Marek Martin: changed nnfolder.el
-
-Marien Zwart: changed python.el
-
-Mario Lang: wrote erc-button.el erc-ibuffer.el erc-imenu.el erc-menu.el
-  erc-netsplit.el erc-networks.el erc-notify.el erc-speedbar.el
-  erc-stamp.el erc-track.el erc-xdcc.el
-and changed erc.el erc-dcc.el erc-speak.el Makefile erc-bbdb.el
-  erc-complete.el erc-pcomplete.el erc-chess.el erc-fill.el erc-list.el
-  battery.el erc-match.el erc-autojoin.el erc-nets.el erc-nickserv.el
-  erc-ring.el diff.el erc-ezbounce.el erc-identd.el erc-lang.el
-  erc-log.el and 6 other files
-
-Mark A. Hershberger: changed xml.el nnrss.el mm-url.el cperl-mode.el
-  esh-mode.el gnus-group.el
-
-Mark D. Baushke: changed mh-e.el mh-utils.el mh-mime.el mh-comp.el
-  mh-customize.el mh-index.el mh-loaddefs.el Makefile mh-identity.el
-  mh-seq.el mh-speed.el mh-funcs.el mh-alias.el MH-E-NEWS etags.c
-  mh-junk.el mh-pick.el mh-tool-bar.el mh-xemacs-compat.el
-
-Mark Davies: changed Makefile.in amdx86-64.h configure configure.in
-  hp800.h netbsd.h ralloc.c sh3el.h sort.el
-
-Mark Diekhans: changed compile.el
-
-Mark H. Weaver: changed comint.el
-
-Mark Hood: changed gnus-uu.el
-
-Mark Lambert: changed process.c process.h
-
-Mark Mitchell: changed font-lock.el
-
-Mark Neale: changed fortran.el
-
-Mark Osbourne: changed hexl-mode.el
-
-Mark Plaksin: changed nnrss.el term.el
-
-Mark Thomas: changed flow-fill.el gnus-sum.el gnus-util.el nnmail.el
-
-Mark W Maimone: changed mpuz.el
-
-Mark W. Eichin: changed keyboard.c xterm.c
-
-Marko Kohtala: changed info.el
-
-Marko Rahamaa: wrote latin-3.el
-
-Markus Armbruster: changed avoid.el
-
-Markus Heritsch: wrote ada-xref.el
-
-Markus Holmberg: changed thingatpt.el
-
-Markus Rost: wrote cus-test.el
-and changed cus-edit.el Makefile.in files.el compile.el rmail.el
-  tex-mode.el find-func.el rmailsum.el simple.el cus-dep.el dired.el
-  mule-cmds.el rmailout.el checkdoc.el configure.in custom.el emacsbug.el
-  gnus.el help-fns.el ls-lisp.el mwheel.el and 122 other files
-
-Markus Triska: changed byte-opt.el bytecomp.el doctor.el expand.el
-  flymake.el flymake.texi handwrite.el internals.texi speedbar.el subr.el
-  tumme.el widget.texi
-
-Marshall T. Vandegrift: changed gnus-fun.el
-
-Martin Boyer: changed bibtex.el menu-bar.el
-
-Martin Buchholz: changed etags.c
-
-Martin J. Reed: changed ldap.el
-
-Martin Kretzschmar: changed gnus-spec.el gnus-sum.el
-
-Martin Larose: changed message.el
-
-Martin Lorentzon: changed vc.el vc-cvs.el vc-hooks.el vc-rcs.el
-  vc-sccs.el
-
-Martin Neitzel: changed sc.el
-
-Martin Rudalics: changed cus-edit.el wid-edit.el cus-start.el files.el
-  flyspell.el font-lock.el complete.el insdel.c ispell.el macmenu.c
-  syntax.c table.el w32menu.c wdired.el whitespace.el window.el xdisp.c
-  xmenu.c backups.texi buffer.c buffer.h and 36 other files
-
-Martin Stjernholm: wrote cc-bytecomp.el
-and changed cc-engine.el cc-cmds.el cc-langs.el cc-defs.el cc-mode.el
-  cc-vars.el cc-fonts.el cc-align.el cc-styles.el cc-menus.el cc-fix.el
-  cc-mode.texi Makefile.in cc-guess.el cc-mode-19.el ack.texi awk-mode.el
-  cc-awk.el cc-lobotomy.el cc-make.el cc-style.el and 5 other files
-
-Martin Thornquist: changed gnus-group.el gnus-topic.el
-
-Masahiko Sato: wrote vip.el
-
-Masanobu Umeda: wrote gnus-kill.el gnus-mh.el gnus-msg.el gnus.el
-  metamail.el nndb.el nnheader.el nnspool.el prolog.el rmailsort.el
-  timezone.el
-and changed gnuspost.el
-
-Masatake Yamato: wrote cc-subword.el ld-script.el
-and changed etags.el asm-mode.el hexl.el xdisp.c bindings.el man.el
-  simple.el wid-edit.el add-log.el compile.el faces.el pcvs.el
-  register.el ruler-mode.el buffer.c cus-face.el dired-x.el display.texi
-  etags.c font-lock.el gdb-ui.el and 59 other files
-
-Masayuki Ataka: changed texinfmt.el texinfo.el characters.el cmuscheme.el
-  make-mode.el
-
-Masayuki Fujii: changed dnd.el w32-win.el
-
-Mathias Dahl: wrote image-dired.el
-and changed tumme.el dired.el dired.texi
-
-Mathias Megyei: changed Makefile.in
-
-Mats Lidell: changed TUTORIAL.sv european.el gnus-art.el
-
-Matt Hodges: changed table.el faces.el iswitchb.el simple.el tmm.el
-  cal-menu.el calendar.el calendar.texi diary-lib.el easymenu.el
-  edebug.texi eldoc.el em-hist.el em-pred.el fixit.texi icon.el ido.el
-  locate.el paragraphs.el pcomplete.el repeat.el and 3 other files
-
-Matt Pharr: changed message.el
-
-Matt Simmons: changed message.el
-
-Matt Swift: changed compile.el dired.el editfns.c lisp-mode.el
-  mm-decode.el outline.el rx.el simple.el startup.el
-
-Matthew Mundell: changed calendar.texi diary-lib.el files.texi
-  type-break.el debugging.texi display.texi edebug.texi editfns.c eval.c
-  fileio.c frames.texi help.texi internals.texi modes.texi nonascii.texi
-  objects.texi os.texi positions.texi searching.texi subr.el text.texi
-  tips.texi
-
-Matthias F\e,Av\e(Brste: changed files.el
-
-Matthias Wiehl: changed gnus.el
-
-Matthieu Devin: wrote delsel.el
-
-Matthieu Moy: changed gnus-msg.el message.el
-
-Max Froumentin: changed gnus-art.el mml.el
-
-Michael Albinus: wrote tramp-ftp.el tramp-smb.el
-and changed tramp.el tramp.texi tramp-vc.el ange-ftp.el files.el
-  tramp-util.el files.texi nnml.el tramp-uu.el vc.el dired-x.el dired.el
-  faq.texi find-dired.el locate.el mini.texi rcompile.el tramp*.el
-  trampver.el trampver.texi woman.el
-
-Michael Ben-Gershon: changed acorn.h configure.in riscix1-1.h riscix1-2.h
-  unexec.c
-
-Michael Cook: changed gnus-sum.el
-
-Michael D. Ernst: wrote reposition.el
-and changed dired-x.el uniquify.el ispell.el bibtex.el rmail.el dired.el
-  simple.el dired-aux.el gud.el rmailsum.el bytecomp.el compare-w.el
-  complete.el fill.el shadow.el texnfo-upd.el vc.el allout.el comint.el
-  cust-print.el edebug.el and 29 other files
-
-Michael D. Prange: wrote fortran.el
-and changed tex-mode.el
-
-Michael Downes: changed gnus-sum.el
-
-Michael Gschwind: wrote iso-cvt.el latin-2.el
-
-Michael Hotchin: changed compile.el
-
-Michael I. Bushnell: changed rmail.el simple.el callproc.c gnu.h gnus.el
-  lread.c process.c screen.el search.c sendmail.el startup.el timer.c
-
-Michael K. Johnson: changed configure.in emacs.c intel386.h linux.h
-  mem-limits.h process.c sysdep.c syssignal.h systty.h template.h
-  unexec.c ymakefile
-
-Michael Kifer: wrote cal-x.el ediff-diff.el ediff-help.el ediff-hook.el
-  ediff-init.el ediff-merg.el ediff-mult.el ediff-ptch.el ediff-util.el
-  ediff-vers.el ediff-wind.el ediff.el viper-cmd.el viper-ex.el
-  viper-init.el viper-keym.el viper-macs.el viper-mous.el viper-util.el
-  viper.el
-and changed ediff-merge.el ediff*.el viper*.el ediff-hooks.el menu-bar.el
-  viper-utils.el appt.el desktop.el ediff-meta.el ediff-nult.el
-  ediff.texi viper-mouse.el viper.texi
-
-Michael Olson: changed erc.el erc-backend.el erc.texi Makefile
-  erc-autoaway.el erc-log.el erc-stamp.el erc-identd.el erc-list.el
-  erc-track.el erc-match.el erc-bbdb.el erc-dcc.el erc-notify.el
-  erc-ibuffer.el erc-pcomplete.el erc-spelling.el erc-compat.el
-  erc-goodies.el erc-nicklist.el ERC-NEWS and 44 other files
-
-Michael Piotrowski: changed gnus-sum.el ps-print.el
-
-Michael R. Cook: changed gnus-topic.el gnus-art.el gnus-sum.el
-
-Michael R. Mauger: changed sql.el emacsclient.c cua-base.el custom.el
-  facemenu.el recentf.el replace.el tramp.el w32fns.c
-
-Michael R. Wolf: changed ange-ftp.el
-
-Michael Schierl: changed pgg-pgp.el
-
-Michael Schmidt: wrote modula2.el (public domain)
-
-Michael Shields: changed spam.el gnus-art.el gnus-sum.el gnus-cite.el
-  gnus-group.el gnus.el intel386.h nndraft.el pgg-def.el
-
-Michael Sperber [Mr. Preprocessor]: changed aix3-1.h aix4-2.h
-
-Michael Staats: wrote pc-select.el
-
-Michael Welsh Duggan: changed lisp.h sh-script.el w32term.c buffer.c
-  gnus-spec.el keyboard.c nnmail.el termhooks.h url-http.el w32-win.el
-  w32fns.c w32menu.c w32term.h xdisp.c xterm.c
-
-Michal Jankowski: changed insdel.c keyboard.c
-
-Michal Nazarewicz: changed ispell.el
-
-Micha\e,Ak\e(Bl Cadilhac: changed ido.el fill.el ispell.el Makefile anti.texi
-  battery.el blackbox.el bs.el cmuscheme.el complete.el cus-edit.el
-  dispnew.c faq.texi flyspell.el footnote.el fr-refcard.ps fr-refcard.tex
-  glasses.el info.el life.el lpr.el and 12 other files
-
-Michelangelo Grigni: wrote ffap.el
-and changed gnus-score.el
-
-Mikael Djurfeldt: changed xdisp.c
-
-Mike Haertel: changed 7300.h
-
-Mike Kupfer: changed mh-e.el mh-utils.el
-
-Mike Long: changed b2m.c make-dist make-mode.el netbsd.h view.el vms.h
-
-Mike Mcewan: changed gnus-agent.el gnus-sum.el gnus-score.el
-
-Mike Newton: changed bibtex.el
-
-Mike Rowan: changed process.c alloc.c dispnew.c keyboard.c process.h
-  sysdep.c xdisp.c
-
-Mike Williams: wrote mouse-sel.el thingatpt.el
-and changed sgml-mode.el xml-lite.el
-
-Mike Woolley: changed gnus-sum.el
-
-Mikio Nakajima: changed ring.el viper-util.el
-
-Milan Zamazal: wrote czech.el glasses.el tildify.el
-and changed slovak.el abbrev.el compile.el filecache.el files.el
-
-Miles Bader: wrote button.el image-file.el macroexp.el minibuf-eldef.el
-  rfn-eshadow.el
-and changed comint.el faces.el simple.el editfns.c xfaces.c info.el
-  xdisp.c minibuf.c wid-edit.el xterm.c subr.el window.el cus-edit.el
-  diff-mode.el dispextern.h quick-install-emacs xfns.c help.el lisp.h
-  textprop.c bytecomp.el and 242 other files
-
-Miyashita Hisashi: changed ccl.c coding.c coding.h mule-cmds.el
-  mule-conf.el mule.el pop3.el
-
-Miyoshi Masanori: changed mouse.el smtpmail.el xdisp.c
-
-Morioka Tomohiko: changed rmail.el rmailout.el rmailsum.el fns.c
-  message.el nnheader.el nnmail.el rmailkwd.el smiley.el
-
-Morten Welinder: wrote [many MSDOS files] arc-mode.el desktop.el dosfns.c
-  internal.el msdos.h pc-win.el s-region.el
-and changed msdos.c config.bat keyboard.c sed1.inp sed2.inp fileio.c
-  sed3.inp dos-fns.el callproc.c add-log.el alpha.h data.c editfns.c
-  emacs.c etags.c files.el info.el lread.c mainmake osf1.h tar-mode.el
-  and 73 other files
-
-Mosur Mohan: changed etags.c
-
-Motorola: changed buff-menu.el
-
-Mukesh Prasad: wrote vmsproc.el
-
-Murata Shuuichirou: changed coding.c
-
-N. Raghavendra: changed timezone.el
-
-Nachum Dershowitz: wrote cal-hebrew.el
-
-Nagy Andras: wrote gnus-sieve.el
-and changed imap.el gnus.el
-
-Nakaji Hiroyuki: changed amdx86-64.h configure.in mm-util.el
-
-Nakamura Toshikazu: changed w32fns.c
-
-NeXT, Inc.: wrote unexnext.c
-
-Neal Ziring: wrote vi.el (public domain)
-
-Neil Mager: wrote appt.el
-
-Neil W. Van Dyke: wrote webjump.el
-
-Nelson H. F. Beebe: changed configure.in
-
-Nelson Jose Dos Santos Ferreira: changed nnsoup.el
-
-Nevin Kapur: changed nnmail.el gnus-sum.el nnimap.el gnus-group.el
-  gnus.el nnbabyl.el nnfolder.el nnmbox.el nnmh.el nnml.el
-
-Niall Mansfield: changed etags.c
-
-Nick Roberts: wrote gdb-ui.el
-and changed gud.el building.texi tooltip.el speedbar.el bindings.el
-  thumbs.el xt-mouse.el .gdbinit DEBUG cc-mode.el t-mouse.el frames.texi
-  subr.el comint.el display.texi help-mode.el compile.el descr-text.el
-  dired.el gud-display.pbm speedbar.texi and 116 other files
-
-Nico Francois: changed w32fns.c w32inevt.c w32menu.c
-
-Niimi Satoshi: changed pp.el search.c
-
-Niklas Morberg: changed nnweb.el gnus-art.el nnimap.el spam.el
-
-Nikolaj Schumacher: changed compile.el rx.el
-
-Noah Friedman: wrote eldoc.el rlogin.el rsz-mini.el type-break.el
-and changed comint.el emacs-buffer.gdb files.el mailabbrev.el sendmail.el
-  subr.el timer.el yow.el battery.el complete.el config.in configure.in
-  copyright.h fns.c gnu-linux.h hpux7.h irix3-3.h lisp-mnt.el loaddefs.el
-  mailalias.el menu-bar.el and 14 other files
-
-Nobuyuki Hikichi: changed news-risc.h
-
-Noel Cragg: changed mh-junk.el
-
-Norbert Koch: changed gnus-score.el
-
-Nozomu Ando: changed unexmacosx.c alloc.c buffer.c mips.h pmax.h
-  smtpmail.el sysselect.h unexelf.c
-
-Nuutti Kotivuori: changed gnus-sum.el flow-fill.el gnus-cache.el
-
-Odd Gripenstam: wrote dcl-mode.el
-
-Ognyan Kulev: changed TUTORIAL.bg cyrillic.el
-
-Olaf Sylvester: wrote bs.el
-
-Ole Aamot: changed compile.el
-
-Oleg S. Tihonov: changed cyrillic.el ispell.el map-ynp.el subr.el
-
-Olin Shivers: wrote cmuscheme.el comint.el inf-lisp.el shell.el
-
-Olive Lin: changed tex-mode.el
-
-Oliver Scholz: changed gamegrid.el nonascii.texi rx.el startup.el
-  update-game-score.c
-
-Oliver Seidel: wrote todo-mode.el
-
-Olivier Laurens: changed forms.el
-
-Olivier Lecarme: changed make-mode.el ange-ftp.el apropos.el bibtex.el
-  cpp.el facemenu.el forms.el hscroll.el indent.el nroff-mode.el
-  paragraphs.el server.el sort.el
-
-Olli Savia: changed etags.c syssignal.h
-
-Osamu Yamane: changed smtpmail.el
-
-Oscar Figueiredo: wrote eudc-bob.el eudc-export.el eudc-hotlist.el
-  eudc-vars.el eudc.el eudcb-bbdb.el eudcb-ldap.el eudcb-ph.el ldap.el
-and changed ph.el
-
-\e,bS\e(Bscar Fuentes: changed emacsclient.c
-
-Oystein Viggen: changed dgnushack.el
-
-P. E. Jareth Hein: changed gnus-util.el
-
-Pace Willisson: wrote ispell.el
-
-Pascal Dupuis: changed octave-inf.el
-
-Pascal Rigaux: changed rfc2231.el
-
-Paul Curry: changed cc-subword.el
-
-Paul D. Smith: wrote snmp-mode.el
-and changed imenu.el make-mode.el
-
-Paul Eggert: wrote cal-dst.el rcs2log vcdiff
-and changed editfns.c vc.el Makefile.in configure.in vc-hooks.el data.c
-  emacs.c gnus.el calendar.el config.in floatfns.c process.c sysdep.c
-  dired.el xterm.c callproc.c fileio.c filelock.c lread.c print.c
-  rmail.el and 290 other files
-
-Paul Fisher: changed fns.c
-
-Paul Franklin: changed nnmail.el message.el
-
-Paul Hilfinger: changed fill.el
-
-Paul Jarc: wrote nnmaildir.el nnnil.el
-and changed message.el gnus-util.el gnus-int.el gnus.el gnus-agent.el
-  gnus-start.el gnus-sum.el lpath.el nnmail.el
-
-Paul Pogonyshev: changed subr.el align.el dabbrev.el display.texi
-  etags.el info.el ses.el tar-mode.el url-http.el which-func.el window.el
-
-Paul Reilly: wrote dgux5-4r3.h gux5-4r2.h
-and changed dgux.h lwlib-Xm.c lwlib.c xlwmenu.c configure.in process.c
-  xfns.c Makefile.in dgux5-4R2.h dgux5-4R3.h files.el keyboard.c
-  lwlib-Xaw.c lwlib-Xm.h lwlib-int.h lwlib.h widget.c widget.h xlwmenu.h
-  xmenu.c xterm.c
-
-Paul Rubin: changed config.h sun2.h texinfmt.el window.c
-
-Paul Stevenson: changed nnvirtual.el
-
-Paul Stodghill: changed gnus-agent.el
-
-Pavel Jan\e,Bm\e(Bk: changed COPYING keyboard.c xterm.c xdisp.c Makefile.in
-  process.c emacs.c lisp.h menu-bar.el ldap.el make-dist xfns.c buffer.c
-  coding.c eval.c fileio.c flyspell.el fns.c indent.c callint.c
-  cus-start.el and 703 other files
-
-Pavel Kobiakov: changed flymake.el flymake.texi
-
-Pavel Kobyakov: wrote flymake.el
-
-Per Abrahamsen: wrote cpp.el cus-dep.el cus-edit.el cus-face.el
-  cus-start.el custom.el double.el gnus-cite.el gnus-cus.el gnus-score.el
-  gnus-soup.el wid-browse.el wid-edit.el widget.el xt-mouse.el
-and changed message.el menu-bar.el gnus.el gnus-art.el gnus-msg.el
-  gnus-group.el frame.el gnus-draft.el gnus-sum.el tool-bar.el
-  widget.texi apropos.el easymenu.el facemenu.el faces.el gnus-srvr.el
-  gnus-uu.el ispell.el lisp-mode.el makefile.el mouse.el
-  and 27 other files
-
-Per Bothner: wrote term.el
-and changed iso-acc.el process.c sysdep.c
-
-Per Cederqvist: wrote ewoc.el
-and changed vc.el vc-hooks.el diff-mode.el etags.c etags.el forms.el
-  hexl.el process.c
-
-Per Persson: wrote gnus-vm.el
-
-Per Starback: changed ispell.el gnus-start.el apropos.el bytecomp.el
-  characters.el charset.h coding.c dired.el doctor.el emacs.c european.el
-  iso-transl.el replace.el startup.el vc.el xdisp.c
-
-Pete Kazmier: changed gnus-art.el
-
-Pete Ware: wrote auto-show.el (public domain)
-and changed message.el
-
-Pete-Temp: changed gnus-art.el
-
-Peter Breton: wrote dirtrack.el filecache.el find-lisp.el generic-x.el
-  generic.el locate.el net-utils.el
-
-Peter Doornbosch: changed vc-svn.el
-
-Peter Heslin: changed flyspell.el outline.el
-
-Peter Kleiweg: wrote ps-mode.el
-
-Peter Liljenberg: wrote elint.el
-
-Peter Runestig: changed makefile.w32-in configure.bat dos-w32.el emacs.rc
-  envadd.bat gmake.defs multi-install-info.bat nmake.defs w32fns.c
-  zone-mode.el
-
-Peter S. Galbraith: wrote mh-alias.el mh-identity.el mh-inc.el
-  mh-limit.el
-and changed mh-comp.el mh-e.el mh-utils.el mh-mime.el mh-customize.el
-  mh-seq.el Makefile mh-init.el mh-loaddefs.el mh-pick.el
-  mh-xemacs-compat.el mh-xemacs-toolbar.el README info-look.el
-  mh-compat.el mh-funcs.el .cvsignore MH-E-NEWS alias.pbm alias.xpm
-  cabinet.xpm and 14 other files
-
-Peter Seibel: changed cl-indent.el lisp-mode.el
-
-Peter Stephenson: wrote vcursor.el
-
-Peter Von Der Ahe: changed gnus-ems.el
-
-Peter Whaite: changed data.c
-
-Petri Kaurinkoski: changed configure.in iris4d.h irix6-0.h irix6-5.h
-  usg5-4.h
-
-Philippe Schnoebelen: wrote gomoku.el mpuz.el
-
-Philippe Waroquiers: changed etags.el
-
-Piet Van Oostrum: changed data.c fileio.c flyspell.el make-package
-  smtpmail.el
-
-Pieter E.J. Pareit: wrote mixal-mode.el
-
-Pinku Surana: changed sql.el
-
-Pmr-Sav: changed mail-utils.el rmail.el
-
-Primoz Peterlin: changed TUTORIAL.sl
-
-R. Bernstein: changed gud.el
-
-Rafael Sep\e,Az\e(Blveda: changed TUTORIAL.es
-
-Rainer Schoepf: wrote alpha.h unexalpha.c
-and changed osf1.h alloc.c buffer.c callint.c data.c dispextern.h doc.c
-  editfns.c floatfns.c frame.h lisp.h lread.c marker.c mem-limits.h
-  print.c puresize.h window.h xdisp.c xterm.h
-
-Raja R Harinath: changed nnml.el
-
-Raja R. Harinath: changed gnus-salt.el
-
-Rajappa Iyer: changed gnus-salt.el
-
-Rajesh Vaidheeswarran: wrote whitespace.el
-and changed ffap.el
-
-Ralf Angeli: wrote scroll-lock.el
-and changed w32fns.c tex-mode.el comint.el flow-fill.el frame.el
-  gnus-art.el killing.texi mm-view.el pcl-cvs.texi reftex-auc.el
-  reftex-cite.el reftex-dcr.el reftex-global.el reftex-index.el
-  reftex-parse.el reftex-ref.el reftex-sel.el reftex-toc.el
-  reftex-vars.el reftex.el reftex.texi and 4 other files
-
-Ralf Fassel: changed dabbrev.el files.el fill.el iso-acc.el tar-mode.el
-
-Ralph Schleicher: wrote battery.el info-look.el
-and changed libc.el fileio.c mm-decode.el nnultimate.el
-
-Ramakrishnan M: changed mlm-util.el
-
-Randal Schwartz: wrote pp.el
-
-Randall Smith: changed dired.el
-
-Raul Acevedo: changed info.el options.el
-
-Ray Blaak: wrote delphi.el
-
-Raymond Scholz: wrote deuglify.el
-and changed gnus-art.el gnus-msg.el gnus.texi message.el nnmail.el
-  pgg-gpg.el
-
-Reiner Steib: wrote gmm-utils.el
-and changed gnus-art.el gnus.texi message.el gnus-sum.el gnus.el
-  gnus-group.el gnus-faq.texi gnus-util.el mml.el gnus-score.el
-  gnus-start.el message.texi mm-util.el gnus-agent.el gnus-msg.el spam.el
-  files.el spam-report.el mm-decode.el nnmail.el nnweb.el
-  and 166 other files
-
-Remek Trzaska: changed gnus-ems.el
-
-Remi Letot: changed nnmaildir.el
-
-Renaud Rioboo: changed nnmail.el
-
-Ren\e,Ai\e(B Kyllingstad: changed pcomplete.el
-
-Reto Zimmermann: changed vhdl-mode.el
-
-Richard Bielawski: changed modes.texi
-
-Richard Dawe: changed Makefile.in config.in
-
-Richard G Bielawski: changed paren.el
-
-Richard Hoskins: changed message.el
-
-Richard King: wrote backquote.el filelock.c userlock.el
-
-Richard L. Pieri: wrote pop3.el
-
-Richard M. Heiberger: changed tex-mode.el
-
-Richard M. Stallman: wrote [The original GNU Emacs and numerous files]
-  easymenu.el font-lock.el image-mode.el menu-bar.el paren.el
-and changed keyboard.c files.el simple.el xterm.c xdisp.c rmail.el
-  fileio.c process.c sysdep.c xfns.c buffer.c Makefile.in window.c
-  configure.in subr.el startup.el emacs.c editfns.c sendmail.el info.el
-  dispnew.c and 1334 other files
-
-Richard Mlynarik: wrote cl-indent.el ebuff-menu.el ehelp.el env.c
-  rfc822.el terminal.el yow.el
-and changed files.el sysdep.c rmail.el info.el keyboard.c fileio.c
-  loaddefs.el simple.el process.c window.c editfns.c startup.el unexec.c
-  xfns.c bytecomp.el keymap.c minibuf.c sendmail.el buffer.c dispnew.c
-  emacs.c and 123 other files
-
-Richard Sharman: wrote hilit-chg.el
-and changed sh-script.el ediff-init.el regexp-opt.el simple.el
-
-Rick Farnbach: wrote morse.el
-
-Rick Sladkey: wrote backquote.el
-and changed gud.el intervals.c intervals.h simple.el
-
-Rob Browning: changed configure.in
-
-Rob Kaut: changed vhdl-mode.el
-
-Rob Riepel: wrote tpu-edt.el tpu-extras.el tpu-mapper.el vt-control.el
-and changed tpu-doc.el
-
-Robert Bihlmeyer: changed gnus-score.el gnus-util.el message.el
-
-Robert Fenk: changed desktop.el
-
-Robert J. Chassell: wrote makeinfo.el texinfo.el texnfo-upd.el
-and changed texinfmt.el emacs-lisp-intro.texi page-ext.el emacs.tex
-  info.el loaddefs.el texinfo-update.el texinfo.tex INSTALL case-table.el
-  cl.texinfo history.el informat.el latin-1.el latin-2.el latin-3.el
-  latin-4.el page.el tex-mode.el texinfo.texinfo vip.texinfo
-
-Robert Thorpe: changed cus-start.el indent.el
-
-Roberto Rodr\e,Am\e(Bguez: changed ada-mode.texi glossary.texi widget.texi
-
-Roderick Schertler: changed dgux.h dgux4.h gud.el sysdep.c
-
-Rodrigo Real: changed pt-br-refcard.tex pt-br-refcard.ps
-
-Roger Breitenstein: changed smtpmail.el
-
-Roland B. Roberts: wrote logout.com mailemacs.com vms-pmail.el
-and changed buffer.h build.com callproc.c compile.com dired.c files.el
-  gnus-group.el gnus-sum.el kepteditor.com precomp.com process.c sort.el
-  sysdep.c systty.h vmspaths.h vmsproc.el
-
-Roland Mcgrath: wrote autoload.el etags.el find-dired.el grep.el
-  map-ynp.el
-and changed compile.el add-log.el configure.in files.el vc.el Makefile.in
-  simple.el mailabbrev.el buffer.c comint.el upd-copyr.el etags.c
-  menu-bar.el loaddefs.el mem-limits.h ralloc.c fileio.c data.c process.c
-  rlogin.el rmail.el and 137 other files
-
-Roland Winkler: changed bibtex.el appt.el artist.el conf-mode.el
-  flyspell.el ispell.el make-mode.el sgml-mode.el sh-script.el
-  skeleton.el
-
-Rolf Ebert: wrote ada-mode.el
-and changed files.el find-file.el
-
-Romain Francoise: changed faq.texi dired-x.el ibuf-ext.el Makefile.in
-  comint.el compile.el message.el puresize.h replace.el subr.el
-  files.texi gnus-fun.el gnus.texi help-fns.el make-dist rcirc.el
-  antlr-mode.el bookmark.el buffer.c diary-lib.el dired.el
-  and 130 other files
-
-Roman Belenov: changed which-func.el
-
-Ron Schnell: wrote dunnet.el
-
-Ronan Waide: changed smtpmail.el
-
-Rui-Tao Dong: changed nnweb.el
-
-Rune Kleveland: changed xfns.c
-
-Russ Allbery: changed message.el
-
-Ryan Yeske: wrote rcirc.el
-and changed ffap.el ispell.el rmailsum.el simple.el testcover.el
-
-Ryszard Kubiak: changed ogonek.el
-
-Sacha Chua: wrote erc-pcomplete.el
-and changed erc.el erc-button.el
-
-Saito Takuya: changed compile.el mule.el
-
-Sam Dooley: changed keyboard.c
-
-Sam Falkner: changed nntp.el
-
-Sam Kendall: changed etags.c etags.el
-
-Sam Steingold: wrote gulp.el midnight.el
-and changed cl-indent.el font-lock.el ange-ftp.el mouse.el tex-mode.el
-  vc-cvs.el add-log.el bindings.el bookmark.el debug.el diary-lib.el
-  dired.el pcvs.el sgml-mode.el simple.el browse-url.el buff-menu.el
-  bytecomp.el cc-mode.el compile.el etags.el and 96 other files
-
-Samuel Tardieu: changed smime.el
-
-Sanghyuk Suh: changed mac-win.el macterm.c
-
-Sascha L\e,A|\e(Bdecke: wrote mml1991.el
-and changed gnus-win.el
-
-Sascha Wilde: changed pgg-gpg.el pgg.el pgg.texi configure.in
-
-Satyaki Das: wrote mh-acros.el mh-gnus.el mh-junk.el mh-search.el
-  mh-speed.el mh-thread.el mh-tool-bar.el
-and changed mh-e.el mh-utils.el mh-seq.el mh-index.el mh-comp.el
-  mh-mime.el mh-customize.el mh-loaddefs.el mh-funcs.el Makefile
-  mh-alias.el mh-pick.el mh-unit.el mh-init.el mh-identity.el mh-make.el
-  mh-xemacs-toolbar.el mh-xemacs-compat.el pgg-gpg.el mh-inc.el
-  highlight.xpm and 7 other files
-
-Schlumberger Technology Corporation: changed gud.el
-
-Scott A Crosby: changed gnus-logic.el
-
-Scott Byer: changed gnus-sum.el
-
-Scott Draves: wrote tq.el
-
-Scott M. Meyers: changed cmacexp.el
-
-Sean Neakums: changed gnus-msg.el gnus-uu.el
-
-Sean O'rourke: changed ibuf-ext.el
-
-Sebastian Kremer: wrote dired-aux.el dired-x.el dired.el ls-lisp.el
-and changed add-log.el
-
-Sebastian Tennant: changed desktop.el
-
-Sebastien Kirche: changed mail-extr.el
-
-Sen Nagata: wrote crm.el rfc2368.el
-
-Seokchan Lee: changed message.el
-
-Sergey Poznyakoff: changed rmail.el mh-mime.el rmail.texi smtpmail.el
-
-Sergio Pokrovskij: changed TUTORIAL.eo
-
-Shawn M. Carey: wrote freebsd.h
-
-Shenghuo Zhu: wrote binhex.el mm-extern.el mm-partial.el mm-url.el
-  mm-uu.el mml2015.el nnrss.el nnwarchive.el rfc1843.el uudecode.el
-  webmail.el
-and changed gnus-art.el message.el gnus-sum.el gnus-msg.el gnus.el
-  gnus-agent.el mm-decode.el mm-util.el gnus-group.el mml.el
-  gnus-start.el gnus-util.el nnfolder.el mm-view.el nnslashdot.el
-  nnmail.el nntp.el gnus-topic.el gnus-xmas.el rfc2047.el dgnushack.el
-  and 101 other files
-
-Shinichirou Sugou: changed etags.c
-
-Shuhei Kobayashi: wrote hex-util.el sha1.el
-and changed gnus-group.el message.el nnmail.el
-
-Shun-Ichi Goto: changed url-http.el
-
-Sidney Markowitz: changed doctor.el
-
-Sigbjorn Finne: changed gnus-srvr.el
-
-Simon Josefsson: wrote dig.el dns-mode.el flow-fill.el fringe.el imap.el
-  mml-sec.el mml-smime.el nnfolder.el nnimap.el nnml.el rfc2104.el
-  sieve-manage.el sieve-mode.el sieve.el smime.el starttls.el tls.el
-  url-imap.el
-and changed message.el gnus-sum.el gnus-art.el smtpmail.el pgg.el
-  mml2015.el pgg-gpg.el gnus-agent.el mml.el mm-decode.el mml1991.el
-  gnus-group.el gnus-msg.el pgg-pgp5.el gnus-sieve.el browse-url.el
-  gnus-int.el gnus.el pgg-parse.el gnus-cache.el mail-source.el
-  and 89 other files
-
-Simon Leinen: changed smtpmail.el Makefile Makefile.in cm.c cm.h hpux9.h
-  indent.c process.c sc.texinfo sgml-mode.el term.c xfns.c xmenu.c
-  xterm.c
-
-Simon Marshall: wrote fast-lock.el lazy-lock.el regexp-opt.el
-and changed comint.el font-lock.el shell.el rmail.el fortran.el
-  sendmail.el subr.el dired.el sh-script.el texinfo.el add-log.el
-  compile.el outline.el help.el menu-bar.el perl-mode.el ps-print.el
-  rmailsum.el bytecomp.el cc-fonts.el data.c and 57 other files
-
-Skip Collins: changed w32fns.c w32term.c w32term.h
-
-Slawomir Nowaczyk: changed emacs.py python.el TUTORIAL.pl flyspell.el
-  ls-lisp.el w32proc.c
-
-Spencer Thomas: changed dabbrev.el emacsclient.c emacsserver.c gnus.texi
-  server.el tcp.c unexec.c
-
-Sriram Karra: changed message.el
-
-Stanislav Shalunov: wrote uce.el
-
-Stefan Monnier: wrote bibtex.el cvs-status.el diff-mode.el log-edit.el
-  log-view.el pcvs-defs.el pcvs-info.el pcvs-parse.el pcvs-util.el
-  reveal.el smerge-mode.el
-and changed vc.el font-lock.el pcvs.el newcomment.el subr.el lisp.h
-  keyboard.c fill.el keymap.c tex-mode.el alloc.c compile.el files.el
-  regex.c simple.el easy-mmode.el syntax.c vc-hooks.el info.el xdisp.c
-  sh-script.el and 519 other files
-
-Steinar Bang: changed imap.el
-
-Stephan Stahl: changed which-func.el buff-menu.el buffer.c dired-x.texi
-  ediff-mult.el
-
-Stephen A. Wood: changed fortran.el
-
-Stephen Berman: changed allout.el find-dired.el recentf.el
-
-Stephen C. Gilardi: changed configure.in
-
-Stephen Compall: changed saveplace.el texinfo.el
-
-Stephen Eglen: wrote iswitchb.el mspools.el
-and changed diary-lib.el locate.el octave-inf.el replace.el hexl.el
-  info-look.el sendmail.el spell.el uce.el MORE.STUFF add-log.el
-  advice.el allout.el autoinsert.el avoid.el backquote.el battery.el
-  bib-mode.el bruce.el c-mode.el ccl.el and 71 other files
-
-Stephen Gildea: wrote mh-funcs.el mh-pick.el refcard.tex
-and changed time-stamp.el mh-e.el mh-comp.el mh-utils.el mh-customize.el
-  mh-junk.el fileio.c files.el fortran.el mh-e.texi mh-mime.el mwheel.el
-  tex-mode.el
-
-Stephen J. Turnbull: changed ediff-init.el strings.texi subr.el
-
-Stephen Leake: changed ada-mode.el ada-xref.el ada-stmt.el ada-mode.texi
-  ada-prj.el align.el
-
-Steve Fisk: wrote cal-tex.el
-
-Steve Nygard: changed unexnext.c
-
-Steve Strassman: wrote spook.el
-
-Steve Youngs: changed mh-utils.el mh-xemacs-compat.el dgnushack.el
-  mh-customize.el mh-e.el mh-comp.el mh-mime.el Makefile Makefile.in
-  browse-url.el gnus-art.el gnus-sum.el gnus-xmas.el lpath.el mh-seq.el
-  .cvsignore dns.el em-unix.el gnus-async.el gnus-util.el mail-source.el
-  and 15 other files
-
-Steven E. Harris: changed nnheader.el
-
-Steven Huwig: changed emacs.py python.el
-
-Steven L. Baur: wrote earcon.el footnote.el gnus-audio.el gnus-setup.el
-and changed gnus-xmas.el gnus-msg.el add-log.el dgnushack.el edebug.el
-  gnus-ems.el gnus-start.el gnus-topic.el message.el nnbabyl.el nntp.el
-  webjump.el
-
-Steven Suhr: changed dispnew.c scroll.c term.c termchar.h
-
-Steven Tamm: changed macterm.c make-package mac.c macfns.c configure.in
-  unexmacosx.c INSTALL mac-win.el Makefile.in README darwin.h editfns.c
-  lread.c macmenu.c scroll-bar.el MACHINES config.h config.in dispnew.c
-  eval.c fileio.c and 7 other files
-
-Stewart M. Clamen: wrote cal-mayan.el
-
-Stuart D. Herring: changed keymap.c minibuf.c widget.texi
-
-Stuart Herring: changed files.el isearch.el align.el allout.el comint.el
-  edebug.el find-lisp.el sregex.el
-
-Sudish Joseph: changed mac-win.el
-
-Sun Microsystems, Inc: wrote emacs.icon emacstool.1 emacstool.c
-  sun-curs.el sun-fns.el sun-mouse.el sun.el sunfns.c
-and changed emacsclient.c emacsserver.c server.el
-
-Sun Yijiang: changed TUTORIAL.cn
-
-Sundar Narasimhan: changed rnews.el rnewspost.el
-
-Sven Joachim: changed arc-mode.el de-refcard.tex files.el files.texi
-  help.el mule.texi sed3v2.inp sh-script.el simple.el
-
-Svend Tollak Munkejord: changed deuglify.el
-
-Takaaki Ota: wrote table.el
-and changed appt.el compile.el dired.c etags.c ldap.el makefile.w32-in
-  recentf.el subr.el w32bdf.c
-
-Takahashi Kaoru: changed texinfmt.el
-
-Takahashi Naoto: wrote cyrillic.el ethio-util.el ethiopic.el latin-alt.el
-  latin-ltx.el latin-post.el utf-8.el
-and changed fontset.el mule-conf.el quail.el
-
-Takai Kousuke: changed ccl.el
-
-Takeshi Yamada: changed fns.c
-
-Taro Kawagishi: changed arc-mode.el
-
-Tatsuya Ichikawa: changed gnus-agent.el gnus-cache.el
-
-Ted Lemon: changed emacs.c lastfile.c puresize.h
-
-Ted Phelps: changed mh-search.el mh-tool-bar.el
-
-Teodor Zlatanov: wrote gnus-registry.el spam-report.el
-and changed spam.el gnus.el gnus-sum.el nnmail.el gnus-start.el
-  spam-stat.el gnus.texi lpath.el nnbabyl.el nnfolder.el nnimap.el
-  nnmbox.el nnmh.el nnml.el replace.el simple.el basic.texi building.texi
-  commands.texi compile.el dig.el and 12 other files
-
-Terje Rosten: changed xfns.c version.el xterm.c xterm.h
-
-Terrence Brannon: wrote landmark.el
-
-Terry Jones: wrote shadow.el
-
-Tetsurou Okazaki: changed log-edit.el xterm.c
-
-Theodore Jump: changed w32-win.el w32faces.c
-
-Thien-Thi Nguyen: wrote hideshow.el make-mms-derivative.el
-and changed ewoc.el info.el processes.texi zone.el Makefile.in vc.el
-  fileio.c lisp-mode.el scheme.el text.texi TUTORIAL.it bindat.el
-  dcl-mode.el display.texi files.el gnus.texi pcvs.el startup.el sysdep.c
-  vc-rcs.el MORE.STUFF and 129 other files
-
-Thierry Emery: changed kinsoku.el timezone.el url-http.el wid-edit.el
-
-Thomas Deweese: changed x-win.el
-
-Thomas Dorner: changed ange-ftp.el
-
-Thomas Horsley: wrote cxux.h cxux7.h
-and changed cxux-crt0.s emacs.c nh3000.h nh4000.h sysdep.c xterm.c
-
-Thomas Link: wrote filesets.el
-
-Thomas Morgan: changed forms.el
-
-Thomas Neumann: wrote make-mode.el
-and changed makefile.el
-
-Thomas W Murphy: changed outline.el
-
-Thomas Wurgler: changed emacs-lock.el
-
-Thor Kristoffersen: changed nntp.el
-
-Thorsten Ohl: changed lread.c next.h
-
-Tijs Van Bakel: changed erc.el
-
-Tim Fleehart: wrote makefile.nt
-
-Tim Van Holder: changed emacsclient.c Makefile.in compile.el configure.in
-  which-func.el
-
-Tobias C. Rittweiler: changed font-lock.el
-
-Toby Allsopp: changed ldap.el eudc.el
-
-Toby Speight: changed window.el
-
-Tom Breton: changed autoinsert.el gnus-agent.el lread.c
-
-Tom Hageman: changed etags.c
-
-Tom Houlder: wrote mantemp.el
-
-Tom Tromey: wrote tcl.el
-and changed makefile.el buffer.c make-mode.el add-log.el blackbox.el
-  buff-menu.el doc.c emacsclient.c info.el man.el replace.el xfns.c
-  xterm.c xterm.h
-
-Tom Wurgler: wrote emacs-lock.el
-and changed subr.el
-
-Tomas Abrahamsson: wrote artist.el
-
-Tommi Vainikainen: changed gnus-sum.el message.el
-
-Tomohiko Morioka: changed gnus-sum.el nnfolder.el nnmail.el nnmh.el
-  nnml.el coding.c gnus-art.el gnus-ems.el gnus-mule.el nnheader.el
-  nnspool.el nntp.el
-
-Tomoji Kagatani: wrote smtpmail.el
-
-Torbj\e,Av\e(Brn Axelsson: changed options.el
-
-Torbj\e,Av\e(Brn Einarsson: wrote f90.el
-
-Torsten Bronger: changed latin-ltx.el
-
-Toru Tomabechi: wrote tibet-util.el tibetan.el
-
-Toshiaki Nomura: changed uxpds.h
-
-Trent Buck: changed rcirc.el
-
-Trey Jackson: changed spam-stat.el
-
-Triet Hoai Lai: changed vntelex.el viet-util.el vietnamese.el
-
-Trung Tran-Duc: changed nntp.el
-
-Tsuchiya Masatoshi: changed gnus-art.el gnus-sum.el nneething.el
-  mm-view.el gnus-group.el nnheader.el nnml.el gnus-agent.el
-  gnus-cache.el gnus-msg.el lpath.el nndiary.el nnfolder.el nnimap.el
-  nnmaildir.el pgg.el rfc2047.el
-
-Tsugutomo Enami: changed nnheader.el regex.c regex.h simple.el
-
-Tsuyoshi Akiho: changed gnus-sum.el nnrss.el
-
-Tudor Hulubei: changed iso-acc.el latin-pre.el
-
-Ulf Jasper: wrote icalendar.el newsticker.el
-and changed calendar.texi newsticker.texi Makefile.in
-
-Ulrich Leodolter: changed w32proc.c
-
-Ulrich Mueller: changed gud.el Makefile.in XMakeAssoc.c case-table.el
-  fortran.el iso-acc.el sysdep.c
-
-Ulrik Vieth: wrote meta-mode.el
-and changed files.el
-
-Vadim Nasardinov: changed allout.el
-
-Vagn Johansen: changed gnus-cache.el
-
-Valery Alexeev: changed cyril-util.el cyrillic.el
-
-Vasily Korytov: changed cperl-mode.el gnus-art.el gnus-dired.el
-  gnus-msg.el gnus-util.el mail-source.el message.el smiley.el
-
-Victor Zandy: wrote zone.el
-
-Viktor Dukhovni: wrote unexsunos4.c
-
-Ville Skytt\e,Ad\e(B: changed mh-comp.el pgg.el tcl.el
-
-Vincent Del Vecchio: changed info.el mh-utils.el
-
-Vinicius Jose Latorre: wrote delim-col.el ebnf-abn.el ebnf-bnf.el
-  ebnf-dtd.el ebnf-ebx.el ebnf-iso.el ebnf-otz.el ebnf-yac.el ebnf2ps.el
-  printing.el ps-mule.el
-and changed ps-print.el ps-prin1.ps ps-bdf.el ps-prin0.ps ps-prin3.ps
-  ps-prin2.ps lpr.el ps-print.ps subr.el TUTORIAL.pt_BR easymenu.el
-  loading.texi ps-print-def.el ps-print0.ps ps-vars.el
-
-Vivek Dasmohapatra: changed emacs.c erc-backend.el erc.el sh-script.el
-  xterm.c xterm.h
-
-Vladimir Alexiev: changed arc-mode.el nnvirtual.el tmm.el
-
-Vladimir Volovich: changed smime.el
-
-Walter C. Pelissero: changed browse-url.el url-methods.el
-
-Wayne Mesard: wrote hscroll.el
-
-Werner Benger: changed keyboard.c
-
-Werner Lemberg: wrote sisheng.el vntelex.el
-and changed TUTORIAL.de Makefile.in calc.texi chinese.el czech.el
-  european.el idlwave.el reftex-vars.el reftex.el reftex.texi slovak.el
-  supercite.el .cvsignore advice.el calc-forms.el calc-sel.el calendar.el
-  china-util.el cl-macs.el cl.texi complete.el and 44 other files
-
-Wes Hardaker: changed gnus-score.el gnus-art.el gnus-sum.el gnus-win.el
-
-Will Mengarini: wrote repeat.el
-
-William F. Mann: wrote perl-mode.el
-
-William F. Schelter: wrote telnet.el
-
-William M. Perry: wrote mailcap.el url-dav.el url-gw.el url-http.el
-  url-util.el url.el vc-dav.el
-and changed url-handlers.el url-file.el url-methods.el url-vars.el
-  url-https.el aclocal.m4 mule-sysdp.el url-imap.el url-news.el
-  url-nfs.el configure.in image.el mwheel.el url-about.el url-auth.el
-  url-cid.el url-dired.el url-expand.el url-ftp.el url-history.el
-  url-irc.el and 6 other files
-
-William Smith: changed strftime.c
-
-William Sommerfeld: wrote emacsclient.c emacsserver.c scribe.el server.el
-
-Wilson H. Tien: changed unexelf.c
-
-Wim Nieuwenhuizen: changed TUTORIAL.nl
-
-Wlodzimierz Bzyl: wrote ogonek.el
-and changed latin-pre.el pl-refcard.ps pl-refcard.tex refcard-pl.ps
-  refcard-pl.tex survival.tex
-
-Wolfgang Glas: changed unexsgi.c
-
-Wolfgang Jenkner: changed conf-mode.el gnus-sum.el pcvs.el
-
-Wolfgang Rupprecht: wrote float-sup.el floatfns.c sup-mouse.el
-and changed process.c alloc.c callint.c config.h.in config.in
-  configure.in crt0.c data.c fns.c lisp-mode.el lisp.h loadup.el lread.c
-  net-utils.el nntp.el print.c sort.el sun3.h ymakefile
-
-Wolfgang Scherer: changed vc-cvs.el
-
-Wolfram Fenske: changed nnimap.el
-
-Wolfram Gloger: changed emacs.c
-
-Xavier Maillard: changed gnus-faq.texi gnus-score.el spam.el
-
-Yagi Tatsuya: changed gnus-art.el gnus-start.el
-
-Yamamoto Mitsuharu: changed macterm.c macfns.c mac-win.el mac.c macterm.h
-  macmenu.c macgui.h image.c macselect.c keyboard.c xdisp.c makefile.MPW
-  config.h emacs.c INSTALL Makefile.in macos.texi darwin.h xfaces.c
-  dispnew.c alloc.c and 77 other files
-
-Yann Dirson: changed imenu.el
-
-Yavor Doganov: changed emacs.1 etags.1
-
-Yoichi Nakayama: changed browse-url.el finder.el man.el rfc2368.el
-
-Yoni Rabkin Katzenell: changed faces.el whitespace.el
-
-Yoshiki Hayashi: changed texinfmt.el nnheader.el
-
-Yoshinori Koseki: changed fontset.el
-
-Yutaka Niibe: changed indent.c xdisp.c configure.in Makefile.in dispnew.c
-  sysdep.c config.in dired.el emacs.c fill.el fns.c gmalloc.c gnu-linux.h
-  indent.h process.c simple.el term.c window.c
-
-Zhang Wei: changed xfns.c erc.el x-win.el
-
-Zoltan Kemenczy: changed gud.el
-
-Zoran Milojevic: changed avoid.el
-
-Local Variables:
-coding: iso-2022-7bit
-End:
diff --git a/CONTRIBUTE b/CONTRIBUTE
deleted file mode 100644 (file)
index 8d48ea8..0000000
+++ /dev/null
@@ -1,227 +0,0 @@
-Copyright (C) 2006, 2007  Free Software Foundation, Inc.
-See end for license conditions.
-
-
-                       Contributing to Emacs
-
-Emacs is a collaborative project and we encourage contributions from
-anyone and everyone.  If you want to contribute in the way that will
-help us most, we recommend (1) fixing reported bugs and (2)
-implementing the feature ideas in etc/TODO.  However, if you think of
-new features to add, please suggest them too -- we might like your
-idea.  Porting to new platforms is also useful, when there is a new
-platform, but that is not common nowadays.
-
-For documentation on how to develop Emacs changes, refer to the Emacs
-Manual and the Emacs Lisp Reference Manual (both included in the Emacs
-distribution).  The web pages in http://www.gnu.org/software/emacs
-contain additional information.
-
-You may also want to submit your change so that can be considered for
-inclusion in a future version of Emacs (see below).
-
-If you don't feel up to hacking Emacs, there are many other ways to
-help.  You can answer questions on the mailing lists, write
-documentation, find and report bugs, contribute to the Emacs web
-pages, or develop a package that works with Emacs.
-
-Here are some style and legal conventions for contributors to Emacs:
-
-
-* Coding Standards
-
-Contributed code should follow the GNU Coding Standard.
-
-If it doesn't, we'll need to find someone to fix the code before we
-can use it.
-
-Emacs has certain additional style and coding conventions.
-
-Ref: http://www.gnu.org/prep/standards_toc.html
-Ref: GNU Coding Standards Info Manual
-Ref: The "Tips" Appendix in the Emacs Lisp Reference.
-
-
-* Copyright Assignment
-
-We can accept small changes without legal papers, and for medium-size
-changes a copyright disclaimer is ok too.  To accept substantial
-contributions from you, we need a copyright assignment form filled out
-and filed with the FSF.
-
-Contact us at emacs-devel@gnu.org to obtain the relevant forms.
-
-
-* Getting the Source Code
-
-The latest version of Emacs can be downloaded using CVS or Arch from
-the Savannah web site.  It is important to write your patch based on
-this version; if you start from an older version, your patch may be
-outdated when you write it, and maintainers will have hard time
-applying it.
-
-After you have downloaded the CVS source, you should read the file
-INSTALL.CVS for build instructions (they differ to some extent from a
-normal build).
-
-Ref: http://savannah.gnu.org/projects/emacs
-
-
-* Submitting Patches
-
-Every patch must have several pieces of information before we
-can properly evaluate it.
-
-When you have all these pieces, bundle them up in a mail message and
-send it to emacs-pretest-bug@gnu.org or emacs-devel@gnu.org.
-
-All subsequent discussion should also be sent to the mailing list.
-
-** Description
-
-For bug fixes, a description of the bug and how your patch fixes this
-bug.
-
-For new features, a description of the feature and your
-implementation.
-
-** ChangeLog
-
-A ChangeLog entry as plaintext (separate from the patch).
-
-See the various ChangeLog files for format and content. Note that,
-unlike some other projects, we do require ChangeLogs also for
-documentation, i.e. Texinfo files.
-
-Ref: "Change Log Concepts" node of the GNU Coding Standards Info
-Manual, for how to write good log entries.
-
-** The patch itself.
-
-Please use "Context Diff" format.
-
-If you are accessing the CVS repository use
-       cvs update; cvs diff -cp
-else, use
-       diff -cp OLD NEW
-
-If your version of diff does not support these options, then get the
-latest version of GNU Diff.
-
-** Mail format.
-
-We prefer to get the patches as inline plain text.
-
-Please be aware of line wrapping which will make the patch unreadable
-and useless for us.  To avoid that, you can use MIME attachments or,
-as a last resort, uuencoded gzipped text.
-
-** Please reread your patch before submitting it.
-
-** Do not mix changes.
-
-If you send several unrelated changes together, we will ask you to
-separate them so we can consider each of the changes by itself.
-
-
-* Coding style and conventions.
-
-** Mandatory reading:
-
-The "Tips and Conventions" Appendix of the Emacs Lisp Reference.
-
-** Avoid using `defadvice' or `eval-after-load' for Lisp code to be
-included in Emacs.
-
-** Remove all trailing whitespace in all source and text files.
-
-** Use ?\s instead of ?  in Lisp code for a space character.
-
-
-* Supplemental information for Emacs Developers.
-
-** Write access to Emacs' CVS repository.
-
-Once you become a frequent contributor to Emacs, we can consider
-giving you write access to the CVS repository.
-
-
-** Emacs Mailing lists.
-
-Discussion about Emacs development takes place on emacs-devel@gnu.org.
-
-Bug reports for released versions are sent to bug-gnu-emacs@gnu.org.
-
-Bug reports for development versions are sent to emacs-pretest-bug@gnu.org.
-
-You can subscribe to the mailing lists at savannah.gnu.org/projects/emacs.
-
-You can find the mailing lists archives at lists.gnu.org or gmane.org.
-
-
-** Document your changes.
-
-Think carefully about whether your change requires updating the
-documentation.  If it does, you can either do this yourself or add an
-item to the NEWS file.
-
-If you document your change in NEWS, please mark the NEWS entry with
-the documentation status of the change: if you submit the changes for
-the manuals, mark it with "+++"; if it doesn't need to be documented,
-mark it with "---"; if it needs to be documented, but you didn't
-submit documentation changes, leave the NEWS entry unmarked.  (These
-marks are checked by the Emacs maintainers to make sure every change
-was reflected in the manuals.)
-
-
-** Understanding Emacs Internals.
-
-The best way to understand Emacs Internals is to read the code,
-but the nodes "Tips" and "GNU Emacs Internals" in the Appendix
-of the Emacs Lisp Reference Manual may also help.
-
-The file etc/DEBUG describes how to debug Emacs bugs.
-
-
-
-* How to Maintain Copyright Years for GNU Emacs
-
-See admin/notes/copyright.
-
-** Our lawyer says it is ok if we add, to each file that has been in Emacs
-since Emacs 21 came out in 2001, all the subsequent years.  We don't
-need to check whether *that file* was changed in those years.
-It's sufficient that *Emacs* was changed in those years (and it was!).
-
-** For those files that have been added since then, we should add
-the year it was added to Emacs, and all subsequent years.
-
-** For the refcards under etc/, it's ok to simply use the latest year
-(typically in a `\def\year{YEAR}' expression) for the rendered copyright
-notice, while maintaining the full list of years in the copyright notice
-in the comments.
-
-
-\f
-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, 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; see the file COPYING.  If not, write to the
-Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-Boston, MA 02110-1301, USA.
-\f
-Local variables:
-mode: outline
-paragraph-separate: "[         \f]*$"
-end:
-
index 813452e1272d285fa3e77d88eae51d96dcef2405..f771639cb3d0937433d7125e3393cf6ba92221d4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,100 @@
+2007-10-05  Eli Zaretskii  <eliz@gnu.org>
+
+       * config.bat: Fix configuring `doc' due to changes in the
+       directory structure.
+
+2007-09-16  Peter O'Gorman <bug-gnu-emacs@mlists.thewrittenword.com> (tiny change)
+
+       * configure.in: Don't use -lpthread on HP-UX.
+
+2007-09-16  Glenn Morris  <rgm@gnu.org>
+
+       * make-dist: File gfdl.1 has been removed.
+
+2007-09-15  Glenn Morris  <rgm@gnu.org>
+
+       * configure.in: Fix makeinfo version regexp.
+
+2007-09-12  Glenn Morris  <rgm@gnu.org>
+
+       * configure.in (AC_FUNC_ALLOCA): Throw an error if a system
+       implementation of alloca is not found.
+
+       * Makefile.in (SOURCES, unlock, relock): Delete.
+       (install-arch-indep): Do not exclude the etc/ Makefiles.
+
+2007-09-09  Juri Linkov  <juri@jurta.org>
+
+       * make-dist: Remove AUTHORS and CONTRIBUTE (moved to etc).
+
+       * README: Add doc/ to documentation directories.
+
+2007-09-08  Michael Olson  <mwolson@gnu.org>
+
+       * MAINTAINERS: Add myself for ERC and tq.el.
+       Update for new doc/ directory layout.
+
+2007-09-06  Romain Francoise  <romain@orebokech.com>
+
+       * make-dist: Update for new doc/ directory layout.
+
+2007-09-06  Glenn Morris  <rgm@gnu.org>
+
+       * Makefile.in (mansrcdir): New variable.
+       (SUBDIR_MAKEFILES): Update for new doc/ directory layout.
+       (man/Makefile, lispref/Makefile, lispintro/Makefile): Rename and
+       update these targets for new doc/ directory layout.
+       (doc/misc/Makefile): New target.
+       (install-arch-indep): Use mansrcdir for new location of manpages.
+       (mostlyclean, clean, distclean, maintainer-clean, unlock)
+       (relock, info, dvi): Update targets for new doc/ directory layout.
+
+       * configure.in (AC_OUTPUT): Update names of generated Makefiles
+       for new doc/ directory layout.
+
+2007-09-02  Andreas Schwab  <schwab@suse.de>
+
+       * configure.in: Use AS_HELP_STRING throughout.
+       * configure: Regenerate.
+
+2007-09-02  Jan Dj\e,Ad\e(Brv  <jan.h.d@swipnet.se>
+
+       * configure.in: Require Gtk/Glib 2.6.
+
+2007-09-02  Thien-Thi Nguyen  <ttn@gnuvola.org>
+
+       * configure.in (EMACS_ARG_Y, EMACS_ARG_N): New AC_DEFUNs.
+       Use them throughout in place of AC_ARG_WITH calls.
+       * configure: Regenerate.
+
+2007-09-01  Andreas Schwab  <schwab@suse.de>
+
+       * configure.in: Put quotes around nested macro calls.
+
+2007-08-31  Ulrich Mueller  <ulm@gentoo.org>  (tiny change)
+
+       * configure.in: Fix typo.
+       * configure: Regenerate.
+
+2007-08-30  Glenn Morris  <rgm@gnu.org>
+
+       * configure.in (AH_BOTTOM): Copy some manual changes made to
+       src/config.in here so they are not lost when it regenerates.
+
+       * README.multi-tty: Move to admin/notes/multi-tty, with some edits.
+
+2007-08-29  Karoly Lorentey  <karoly@lorentey.hu>
+
+       * README.multi-tty: New file.
+
+2007-08-29  Glenn Morris  <rgm@gnu.org>
+
+       * README: Increase version to 23.0.50.
+
+2007-08-29  Jan Dj\e,Ad\e(Brv  <jan.h.d@swipnet.se>
+
+       * configure.in: New option: --without-xaw3d.
+
 2007-08-24  Glenn Morris  <rgm@gnu.org>
 
        * configure.in: Check for a suitably recent makeinfo.
index 5d55ab89c5cc0630cb9969e9e7c26aa132e64a07..92f1273b1164920fddd34c39433e23e0a22d6205 100644 (file)
@@ -39,7 +39,7 @@ Eli Zaretskii
        lisp/term/tty-colors.el
        lisp/international/codepage.el
 
-       man/msdog.texi
+       doc/emacs/msdog.texi
 
 Kenichi Handa
        Mule
@@ -69,7 +69,14 @@ Jay Belanger
         Calc
             lisp/calc/*
             etc/calccard.tex
-            man/calc.texi
+            doc/misc/calc.texi
+
+Michael Olson
+        ERC
+            lisp/erc/*
+            etc/ERC-NEWS
+            doc/misc/erc.texi
+        lisp/emacs-lisp/tq.el
 
 ==============================================================================
 2.
@@ -79,7 +86,7 @@ Steven Tamm
        MacOS
 
 Eli Zaretskii
-       man/*
+       doc/*
        lispref/*
        info/dir
 
@@ -112,12 +119,6 @@ Miles Bader
 Thien-Thi Nguyen
        VMS
 
-Juanma Barranquero
-       lisp/bs.el
-       lisp/server.el
-       lib-src/emacsclient.c
-       lib-src/grep-changelog
-
 ==============================================================================
 3.
 ==============================================================================
index ec93805a0e9ebbee40c9b41339b005afa34d4439..acf865239ff8a678588054dbeb68023783594f80 100644 (file)
@@ -158,6 +158,9 @@ bitmapdir=@bitmapdir@
 # We use $(srcdir) explicitly in dependencies so as not to depend on VPATH.
 srcdir=@srcdir@
 
+# Where the manpage source files are kept.
+mansrcdir=$(srcdir)/doc/man
+
 # Tell make where to find source files; this is needed for the makefiles.
 VPATH=@srcdir@
 
@@ -250,7 +253,7 @@ EMACSFULL = `echo emacs-${version}${EXEEXT} | sed '$(TRANSFORM)'`
 SUBDIR = lib-src src
 
 # The makefiles of the directories in $SUBDIR.
-SUBDIR_MAKEFILES = lib-src/Makefile man/Makefile lispref/Makefile lispintro/Makefile src/Makefile oldXMenu/Makefile lwlib/Makefile leim/Makefile
+SUBDIR_MAKEFILES = lib-src/Makefile doc/emacs/Makefile doc/misc/Makefile doc/lispref/Makefile doc/lispintro/Makefile src/Makefile oldXMenu/Makefile lwlib/Makefile leim/Makefile
 
 # Subdirectories to install, and where they'll go.
 # lib-src's makefile knows how to install it, so we don't do that here.
@@ -336,13 +339,16 @@ src/config.stamp: $(srcdir)/src/config.in config.status
 lib-src/Makefile: $(srcdir)/lib-src/Makefile.in config.status
        ./config.status
 
-man/Makefile: $(srcdir)/man/Makefile.in config.status
+doc/emacs/Makefile: $(srcdir)/doc/emacs/Makefile.in config.status
+       ./config.status
+
+doc/misc/Makefile: $(srcdir)/doc/misc/Makefile.in config.status
        ./config.status
 
-lispref/Makefile: $(srcdir)/lispref/Makefile.in config.status
+doc/lispref/Makefile: $(srcdir)/doc/lispref/Makefile.in config.status
        ./config.status
 
-lispintro/Makefile: $(srcdir)/lispintro/Makefile.in config.status
+doc/lispintro/Makefile: $(srcdir)/doc/lispintro/Makefile.in config.status
        ./config.status
 
 oldXMenu/Makefile: $(srcdir)/oldXMenu/Makefile.in config.status
@@ -414,6 +420,9 @@ install-arch-dep: mkdir
 
 ## If people complain about the h flag in tar command, take that out.
 ## That flag is also used in leim/Makefile.in
+
+## Note that the Makefiles in the etc directory are potentially useful
+## in an installed Emacs, so should not be excluded.
 install-arch-indep: mkdir info
        -set ${COPYDESTS} ; \
        unset CDPATH; \
@@ -446,7 +455,8 @@ install-arch-indep: mkdir info
                rm -f  $${subdir}/.\#* ; \
                rm -f  $${subdir}/*~ ; \
                rm -f  $${subdir}/*.orig ; \
-               rm -f  $${subdir}/[mM]akefile* ; \
+               [ "$${dir}" != "${srcdir}/etc" ] && \
+                       rm -f  $${subdir}/[mM]akefile* ; \
                rm -f  $${subdir}/ChangeLog* ; \
                rm -f  $${subdir}/dired.todo ; \
              done) ; \
@@ -534,10 +544,10 @@ install-arch-indep: mkdir info
        else true; fi
        -chmod -R a+r $(DESTDIR)${datadir}/emacs/${version} $(DESTDIR)${datadir}/emacs/site-lisp ${COPYDESTS} $(DESTDIR)${infodir}
        thisdir=`/bin/pwd`; \
-       cd ${srcdir}/etc; \
+       cd ${mansrcdir}; \
        for page in emacs emacsclient etags ctags ; do \
          (cd $${thisdir}; \
-          ${INSTALL_DATA} ${srcdir}/etc/$${page}.1 $(DESTDIR)${man1dir}/$${page}${manext}; \
+          ${INSTALL_DATA} ${mansrcdir}/$${page}.1 $(DESTDIR)${man1dir}/$${page}${manext}; \
           chmod a+r $(DESTDIR)${man1dir}/$${page}${manext}); \
        done
 
@@ -620,9 +630,10 @@ mostlyclean: FRC
        (cd oldXMenu; $(MAKE) $(MFLAGS) mostlyclean)
        (cd lwlib;    $(MAKE) $(MFLAGS) mostlyclean)
        (cd lib-src;  $(MAKE) $(MFLAGS) mostlyclean)
-       -(cd man &&   $(MAKE) $(MFLAGS) mostlyclean)
-       -(cd lispref &&   $(MAKE) $(MFLAGS) mostlyclean)
-       -(cd lispintro &&   $(MAKE) $(MFLAGS) mostlyclean)
+       -(cd doc/emacs &&   $(MAKE) $(MFLAGS) mostlyclean)
+       -(cd doc/misc &&   $(MAKE) $(MFLAGS) mostlyclean)
+       -(cd doc/lispref &&   $(MAKE) $(MFLAGS) mostlyclean)
+       -(cd doc/lispintro &&   $(MAKE) $(MFLAGS) mostlyclean)
        (cd leim;     $(MAKE) $(MFLAGS) mostlyclean)
 
 ### `clean'
@@ -638,9 +649,10 @@ clean: FRC
        (cd oldXMenu; $(MAKE) $(MFLAGS) clean)
        (cd lwlib;    $(MAKE) $(MFLAGS) clean)
        (cd lib-src;  $(MAKE) $(MFLAGS) clean)
-       -(cd man &&   $(MAKE) $(MFLAGS) clean)
-       -(cd lispref &&   $(MAKE) $(MFLAGS) clean)
-       -(cd lispintro &&   $(MAKE) $(MFLAGS) clean)
+       -(cd doc/emacs &&   $(MAKE) $(MFLAGS) clean)
+       -(cd doc/misc &&   $(MAKE) $(MFLAGS) clean)
+       -(cd doc/lispref &&   $(MAKE) $(MFLAGS) clean)
+       -(cd doc/lispintro &&   $(MAKE) $(MFLAGS) clean)
        (cd leim;     $(MAKE) $(MFLAGS) clean)
 
 ### `distclean'
@@ -658,9 +670,10 @@ distclean: FRC
        (cd oldXMenu; $(MAKE) $(MFLAGS) distclean)
        (cd lwlib;    $(MAKE) $(MFLAGS) distclean)
        (cd lib-src;  $(MAKE) $(MFLAGS) distclean)
-       (cd man &&    $(MAKE) $(MFLAGS) distclean)
-       (cd lispref &&    $(MAKE) $(MFLAGS) distclean)
-       (cd lispintro &&    $(MAKE) $(MFLAGS) distclean)
+       (cd doc/emacs &&    $(MAKE) $(MFLAGS) distclean)
+       (cd doc/misc &&    $(MAKE) $(MFLAGS) distclean)
+       (cd doc/lispref &&    $(MAKE) $(MFLAGS) distclean)
+       (cd doc/lispintro &&    $(MAKE) $(MFLAGS) distclean)
        (cd leim;     $(MAKE) $(MFLAGS) distclean)
        (cd lisp;     $(MAKE) $(MFLAGS) distclean)
        ${top_distclean}
@@ -681,9 +694,10 @@ maintainer-clean: FRC
        (cd oldXMenu; $(MAKE) $(MFLAGS) maintainer-clean)
        (cd lwlib;    $(MAKE) $(MFLAGS) maintainer-clean)
        (cd lib-src;  $(MAKE) $(MFLAGS) maintainer-clean)
-       -(cd man &&   $(MAKE) $(MFLAGS) maintainer-clean)
-       -(cd lispref &&   $(MAKE) $(MFLAGS) maintainer-clean)
-       -(cd lispintro &&   $(MAKE) $(MFLAGS) maintainer-clean)
+       -(cd doc/emacs &&   $(MAKE) $(MFLAGS) maintainer-clean)
+       -(cd doc/misc &&   $(MAKE) $(MFLAGS) maintainer-clean)
+       -(cd doc/lispref &&   $(MAKE) $(MFLAGS) maintainer-clean)
+       -(cd doc/lispintro &&   $(MAKE) $(MFLAGS) maintainer-clean)
        (cd leim;     $(MAKE) $(MFLAGS) maintainer-clean)
        (cd lisp;     $(MAKE) $(MFLAGS) maintainer-clean)
        ${top_distclean}
@@ -698,49 +712,6 @@ extraclean:
        -rm -f config-tmp-*
        -rm -f *~ \#*
 
-### Unlocking and relocking.  The idea of these productions is to reduce
-### hassles when installing an incremental tar of Emacs.  Do `make unlock'
-### before unlocking the file to take the write locks off all sources so
-### that tar xvof will overwrite them without fuss.  Then do `make relock'
-### afterward so that VC mode will know which files should be checked in
-### if you want to mung them.
-###
-### Note: it's no disaster if these productions miss a file or two; tar
-### and VC will swiftly let you know if this happens, and it is easily
-### corrected.
-SOURCES = ChangeLog FTP INSTALL Makefile.in \
-       README configure make-dist move-if-change
-
-.PHONY: unlock relock
-
-unlock:
-       chmod u+w $(SOURCES)
-       -(cd elisp; chmod u+w Makefile README *.texi)
-       (cd etc; $(MAKE) $(MFLAGS) unlock)
-       (cd lib-src; $(MAKE) $(MFLAGS) unlock)
-       (cd lisp; $(MAKE) $(MFLAGS) unlock)
-       (cd lisp/term; chmod u+w README *.el)
-       (cd man; chmod u+w *texi* ChangeLog split-man)
-       (cd lispref; chmod u+w *texi* ChangeLog)
-       (cd lispintro; chmod u+w *texi* ChangeLog)
-       (cd oldXMenu; chmod u+w *.[ch] Makefile README)
-       (cd lwlib; chmod u+w *.[ch] Makefile README)
-       (cd src; $(MAKE) $(MFLAGS) unlock)
-
-relock:
-       chmod u-w $(SOURCES)
-       -(cd elisp; chmod u-w Makefile README *.texi)
-       (cd etc; $(MAKE) $(MFLAGS) relock)
-       (cd lib-src; $(MAKE) $(MFLAGS) relock)
-       (cd lisp; $(MAKE) $(MFLAGS) relock)
-       (cd lisp/term; chmod u+w README *.el)
-       (cd man; chmod u+w *texi* ChangeLog split-man)
-       (cd lispref; chmod u+w *texi* ChangeLog)
-       (cd lispintro; chmod u+w *texi* ChangeLog)
-       (cd oldXMenu; chmod u+w *.[ch] Makefile README)
-       (cd lwlib; chmod u+w *.[ch] Makefile README)
-       (cd src; $(MAKE) $(MFLAGS) relock)
-
 # The src subdir knows how to do the right thing
 # even when the build directory and source dir are different.
 TAGS tags: lib-src src
@@ -758,13 +729,15 @@ force-info:
 # put the info files in $(srcdir),
 # so we can do ok running make in the build dir.
 info: force-info
-       -(cd man; $(MAKE) $(MFLAGS) info)
-       -(cd lispref; $(MAKE) $(MFLAGS) info)
-       -(cd lispintro; $(MAKE) $(MFLAGS) info)
+       -(cd doc/emacs; $(MAKE) $(MFLAGS) info)
+       -(cd doc/misc; $(MAKE) $(MFLAGS) info)
+       -(cd doc/lispref; $(MAKE) $(MFLAGS) info)
+       -(cd doc/lispintro; $(MAKE) $(MFLAGS) info)
 dvi:
-       (cd man; $(MAKE) $(MFLAGS) dvi)
-       (cd lispref; $(MAKE) $(MFLAGS) elisp.dvi)
-       (cd lispintro; $(MAKE) $(MFLAGS) emacs-lisp-intro.dvi)
+       (cd doc/emacs; $(MAKE) $(MFLAGS) dvi)
+       (cd doc/misc; $(MAKE) $(MFLAGS) dvi)
+       (cd doc/lispref; $(MAKE) $(MFLAGS) elisp.dvi)
+       (cd doc/lispintro; $(MAKE) $(MFLAGS) emacs-lisp-intro.dvi)
 
 #### Bootstrapping.
 
@@ -813,7 +786,8 @@ bootstrap-clean-before-fast: FRC
        (cd oldXMenu; $(MAKE) $(MFLAGS) clean)
        (cd lwlib;    $(MAKE) $(MFLAGS) clean)
        (cd lib-src;  $(MAKE) $(MFLAGS) clean)
-       -(cd man &&   $(MAKE) $(MFLAGS) clean)
-       -(cd lispref &&   $(MAKE) $(MFLAGS) clean)
-       -(cd lispintro &&   $(MAKE) $(MFLAGS) clean)
+       -(cd doc/emacs &&   $(MAKE) $(MFLAGS) clean)
+       -(cd doc/misc &&   $(MAKE) $(MFLAGS) clean)
+       -(cd doc/lispref &&   $(MAKE) $(MFLAGS) clean)
+       -(cd doc/lispintro &&   $(MAKE) $(MFLAGS) clean)
        (cd leim;     $(MAKE) $(MFLAGS) clean)
diff --git a/README b/README
index 59e509355bfced7292d3a0ef810f9b9495ca7ed1..61970c946b901d0066e3e2eadd04212959361a92 100644 (file)
--- a/README
+++ b/README
@@ -3,7 +3,7 @@ Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007
 See the end of the file for license conditions.
 
 
-This directory tree holds version 22.1.50 of GNU Emacs, the extensible,
+This directory tree holds version 23.0.50 of GNU Emacs, the extensible,
 customizable, self-documenting real-time display editor.
 
 The file INSTALL in this directory says how to build and install GNU
@@ -73,14 +73,13 @@ There are several subdirectories:
             `man', `lispref', and `lispintro' subdirectories are
             architecture-independent too.
 `info'      holds the Info documentation tree for Emacs.
-`man'       holds the source code for the Emacs Manual.  If you modify the
+`doc/emacs' holds the source code for the Emacs Manual.  If you modify the
             manual sources, you will need the `makeinfo' program to produce
             an updated manual.  `makeinfo' is part of the GNU Texinfo
             package; you need version 4.6 or later of Texinfo.
-`lispref'   holds the source code for the Emacs Lisp reference manual.
-`lispintro' holds the source code for the Introduction to Programming
-            in Emacs Lisp manual.
-
+`doc/lispref'   holds the source code for the Emacs Lisp reference manual.
+`doc/lispintro' holds the source code for the Introduction to Programming
+                in Emacs Lisp manual.
 `msdos'     holds configuration files for compiling Emacs under MSDOG.
 `vms'       holds instructions and useful files for running Emacs under VMS.
 `nt'        holds various command files and documentation files that pertain
index 1f544d3e27448bf083ae105e0d19823a70fcbe75..117aff2681afaeae2eac46f0f0fc78c455fa97eb 100644 (file)
@@ -235,22 +235,11 @@ mv -f makefile.tmp Makefile
 cd ..\r
 :oldx1\r
 rem   ----------------------------------------------------------------------\r
-Echo Configuring the manual directory...\r
-cd man\r
-sed -f ../msdos/sed6.inp < Makefile.in > Makefile\r
-cd ..\r
-rem   ----------------------------------------------------------------------\r
-Echo Configuring the ELisp manual directory...\r
-cd lispref\r
-sed -f ../msdos/sed6.inp < Makefile.in > Makefile\r
-cd ..\r
-rem   ----------------------------------------------------------------------\r
-Echo Configuring the ELisp Introduction manual directory...\r
-Rem The two variants for the line below is for when the shell\r
+Echo Configuring the doc directory...\r
+cd doc\r
+Rem The two variants for lispintro below is for when the shell\r
 Rem supports long file names but DJGPP does not\r
-if exist lispintro\Makefile.in cd lispintro\r
-if exist lispintr\Makefile.in cd lispintr\r
-sed -f ../msdos/sed6.inp < Makefile.in > Makefile\r
+for %%d in (emacs lispref lispintro lispintr misc) do sed -f ../msdos/sed6.inp < %%d\Makefile.in > %%d\Makefile\r
 cd ..\r
 rem   ----------------------------------------------------------------------\r
 Echo Configuring the lisp directory...\r
index c8382e4bf2c52b307a5ad0a61193213e685818e9..8d5e5c98f8c326f8fc3aaa6f35312713fbb77501 100755 (executable)
--- a/configure
+++ b/configure
@@ -1324,12 +1324,14 @@ if test -n "$ac_init_help"; then
 Optional Features:
   --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
   --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
-  --enable-carbon-app[=DIR]  [DIR=/Application]
+  --enable-carbon-app[=DIR]
                           specify install directory for Emacs.app on Mac OS X
+                          [DIR=/Application]
   --enable-font-backend   compile code of font-backend support
   --enable-asserts        compile code with asserts enabled
-  --enable-maintainer-mode enable make rules and dependencies not useful
-                          (and sometimes confusing) to the casual installer
+  --enable-maintainer-mode
+                          enable make rules and dependencies not useful (and
+                          sometimes confusing) to the casual installer
   --enable-locallisppath=PATH
                           directories Emacs should search for lisp files
                           specific to this site
@@ -1344,8 +1346,8 @@ Optional Packages:
   --with-kerberos5        support Kerberos version 5 authenticated POP
   --with-hesiod           support Hesiod to get the POP server host
   --without-sound         don't compile with sound support
-  --with-x-toolkit=KIT    use an X toolkit
-                              (KIT = yes/lucid/athena/motif/gtk/no)
+  --with-x-toolkit=KIT    use an X toolkit (KIT one of: yes, lucid, athena,
+                          motif, gtk, no)
   --with-xpm              use -lXpm for displaying XPM images
   --with-jpeg             use -ljpeg for displaying JPEG images
   --with-tiff             use -ltiff for displaying TIFF images
@@ -1356,9 +1358,10 @@ Optional Packages:
   --with-gpm              use -lgpm for mouse support on a GNU/Linux console
   --with-rsvg             use -lrsvg-2 for displaying SVG images
   --with-gtk              use GTK (same as --with-x-toolkit=gtk)
-  --with-pkg-config-prog  Path to pkg-config to use for finding GTK and librsvg
+  --with-pkg-config-prog  Path to pkg-config for finding GTK and librsvg
   --without-toolkit-scroll-bars
                           don't use Motif or Xaw3d scroll bars
+  --without-xaw3d         don't use Xaw3d
   --without-xim           don't use X11 XIM
   --without-carbon        don't use Carbon GUI on Mac OS X
   --with-x                use the X Window System
@@ -1828,12 +1831,14 @@ gamedir='${localstatedir}/games/emacs'
 gameuser=games
 
 
+
 # Check whether --with-gcc was given.
 if test "${with_gcc+set}" = set; then
   withval=$with_gcc;
 fi
 
 
+
 # Check whether --with-pop was given.
 if test "${with_pop+set}" = set; then
   withval=$with_pop; if test "$withval" = yes; then
@@ -1852,6 +1857,7 @@ fi
 
 
 
+
 # Check whether --with-kerberos was given.
 if test "${with_kerberos+set}" = set; then
   withval=$with_kerberos; if test "$withval" = yes; then
@@ -1864,6 +1870,7 @@ fi
 
 
 
+
 # Check whether --with-kerberos5 was given.
 if test "${with_kerberos5+set}" = set; then
   withval=$with_kerberos5; if test "${with_kerberos5+set}" = set; then
@@ -1883,6 +1890,7 @@ fi
 fi
 
 
+
 # Check whether --with-hesiod was given.
 if test "${with_hesiod+set}" = set; then
   withval=$with_hesiod; if test "$withval" = yes; then
@@ -1927,6 +1935,7 @@ this option's value should be \`yes', \`no', \`lucid', \`athena', \`motif' or \`
 fi
 
 
+
 # Check whether --with-xpm was given.
 if test "${with_xpm+set}" = set; then
   withval=$with_xpm;
@@ -1999,6 +2008,12 @@ if test "${with_toolkit_scroll_bars+set}" = set; then
 fi
 
 
+# Check whether --with-xaw3d was given.
+if test "${with_xaw3d+set}" = set; then
+  withval=$with_xaw3d;
+fi
+
+
 # Check whether --with-xim was given.
 if test "${with_xim+set}" = set; then
   withval=$with_xim;
@@ -2010,6 +2025,7 @@ if test "${with_carbon+set}" = set; then
   withval=$with_carbon;
 fi
 
+
 # Check whether --enable-carbon-app was given.
 if test "${enable_carbon_app+set}" = set; then
   enableval=$enable_carbon_app;  carbon_appdir_x=${enableval}
@@ -5404,7 +5420,7 @@ fi
 
 
 if test "$MAKEINFO" != "no" && \
-  test x"`$MAKEINFO --version 2> /dev/null | $EGREP 'texinfo[^0-9]*([5-9]|4\.[6-9])'`" = x; then
+  test x"`$MAKEINFO --version 2> /dev/null | $EGREP 'texinfo[^0-9]*([1-4][0-9]+|[5-9]|4\.[6-9]|4\.[1-5][0-9]+)'`" = x; then
    MAKEINFO=no
 fi
 
@@ -11298,8 +11314,8 @@ if test "${with_gtk}" = "yes" || test "$USE_X_TOOLKIT" = "gtk" || \
 echo "$as_me: error: Conflicting options, --with-gtk is incompatible with --with-x-toolkit=${with_x_toolkit}" >&2;}
    { (exit 1); exit 1; }; };
   fi
-  GLIB_REQUIRED=2.4
-  GTK_REQUIRED=2.4
+  GLIB_REQUIRED=2.6
+  GTK_REQUIRED=2.6
   GTK_MODULES="gtk+-2.0 >= $GTK_REQUIRED glib-2.0 >= $GLIB_REQUIRED"
 
     if test "X${with_pkg_config_prog}" != X; then
@@ -11638,6 +11654,7 @@ cat >>confdefs.h <<\_ACEOF
 _ACEOF
 
   fi
+
       HAVE_GTK_FILE_SELECTION=no
 
 for ac_func in gtk_file_selection_new
 
     fi
     if test "$HAVE_GTK_AND_PTHREAD" = yes; then
-      GTK_LIBS="$GTK_LIBS -lpthread"
+      case "${canonical}" in
+        *-hpux*) ;;
+        *) GTK_LIBS="$GTK_LIBS -lpthread" ;;
+      esac
 
 cat >>confdefs.h <<\_ACEOF
 #define HAVE_GTK_AND_PTHREAD 1
@@ -12064,9 +12084,10 @@ if test x"${USE_X_TOOLKIT}" = xmaybe || test x"${USE_X_TOOLKIT}" = xLUCID; then
   if test x"${HAVE_X11R5}" != xyes; then
     USE_X_TOOLKIT=none
   else
-    { echo "$as_me:$LINENO: checking for xaw3d" >&5
+    if test "$with_xaw3d" != no; then
+      { echo "$as_me:$LINENO: checking for xaw3d" >&5
 echo $ECHO_N "checking for xaw3d... $ECHO_C" >&6; }
-    if test "${emacs_cv_xaw3d+set}" = set; then
+      if test "${emacs_cv_xaw3d+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
@@ -12116,6 +12137,9 @@ rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 fi
 
+    else
+      emacs_cv_xaw3d=no
+    fi
     if test $emacs_cv_xaw3d = yes; then
       { echo "$as_me:$LINENO: result: yes; using Lucid toolkit" >&5
 echo "${ECHO_T}yes; using Lucid toolkit" >&6; }
@@ -15707,6 +15731,12 @@ _ACEOF
 fi
 
 
+if test x"$ac_cv_func_alloca_works" != xyes; then
+   { { echo "$as_me:$LINENO: error: a system implementation of alloca is required " >&5
+echo "$as_me: error: a system implementation of alloca is required " >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
 # fmod, logb, and frexp are found in -lm on most systems.
 # On HPUX 9.01, -lm does not contain logb, so check for sqrt.
 
@@ -24144,7 +24174,7 @@ fi
 rm -f conftest*
 
 
-ac_config_files="$ac_config_files Makefile lib-src/Makefile.c:lib-src/Makefile.in oldXMenu/Makefile man/Makefile lwlib/Makefile src/Makefile.c:src/Makefile.in lisp/Makefile lispref/Makefile lispintro/Makefile leim/Makefile"
+ac_config_files="$ac_config_files Makefile lib-src/Makefile.c:lib-src/Makefile.in oldXMenu/Makefile doc/emacs/Makefile doc/misc/Makefile doc/lispintro/Makefile doc/lispref/Makefile src/Makefile.c:src/Makefile.in lwlib/Makefile lisp/Makefile leim/Makefile"
 
 ac_config_commands="$ac_config_commands default"
 
     "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
     "lib-src/Makefile.c") CONFIG_FILES="$CONFIG_FILES lib-src/Makefile.c:lib-src/Makefile.in" ;;
     "oldXMenu/Makefile") CONFIG_FILES="$CONFIG_FILES oldXMenu/Makefile" ;;
-    "man/Makefile") CONFIG_FILES="$CONFIG_FILES man/Makefile" ;;
-    "lwlib/Makefile") CONFIG_FILES="$CONFIG_FILES lwlib/Makefile" ;;
+    "doc/emacs/Makefile") CONFIG_FILES="$CONFIG_FILES doc/emacs/Makefile" ;;
+    "doc/misc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/misc/Makefile" ;;
+    "doc/lispintro/Makefile") CONFIG_FILES="$CONFIG_FILES doc/lispintro/Makefile" ;;
+    "doc/lispref/Makefile") CONFIG_FILES="$CONFIG_FILES doc/lispref/Makefile" ;;
     "src/Makefile.c") CONFIG_FILES="$CONFIG_FILES src/Makefile.c:src/Makefile.in" ;;
+    "lwlib/Makefile") CONFIG_FILES="$CONFIG_FILES lwlib/Makefile" ;;
     "lisp/Makefile") CONFIG_FILES="$CONFIG_FILES lisp/Makefile" ;;
-    "lispref/Makefile") CONFIG_FILES="$CONFIG_FILES lispref/Makefile" ;;
-    "lispintro/Makefile") CONFIG_FILES="$CONFIG_FILES lispintro/Makefile" ;;
     "leim/Makefile") CONFIG_FILES="$CONFIG_FILES leim/Makefile" ;;
     "default") CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;;
 
index 690e0348746170a1cd9c8594ff9e2546c7fd50aa..d1b8f492a41616bb0c2d27c99a29fd192f18e2ee 100644 (file)
@@ -3,8 +3,8 @@ dnl To rebuild the `configure' script from this, execute the command
 dnl    autoconf
 dnl in the directory containing this script.
 dnl
-dnl  Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
-dnl  Free Software Foundation, Inc.
+dnl  Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2003,
+dnl    2004, 2005, 2006, 2007  Free Software Foundation, Inc.
 dnl
 dnl  This file is part of GNU Emacs.
 dnl
@@ -42,25 +42,33 @@ gamedir='${localstatedir}/games/emacs'
 
 gameuser=games
 
-AC_ARG_WITH(gcc,
-[  --without-gcc           don't use GCC to compile Emacs if GCC is found])
-AC_ARG_WITH(pop,
-[  --without-pop           don't support POP mail retrieval with movemail],
+dnl Autoconf is so much less fun under VMS, maybe
+dnl because everything is less fun under VMS. --ttn
+AC_DEFUN([EMACS_ARG_Y],[dnl
+AC_ARG_WITH([$1],[AS_HELP_STRING([--with-$1],[$2])],[$3],[$4])dnl
+])dnl
+AC_DEFUN([EMACS_ARG_N],[dnl
+AC_ARG_WITH([$1],[AS_HELP_STRING([--without-$1],[$2])],[$3],[$4])dnl
+])dnl
+
+EMACS_ARG_N([gcc],[don't use GCC to compile Emacs if GCC is found])
+
+EMACS_ARG_N([pop],[don't support POP mail retrieval with movemail],
 [if test "$withval" = yes; then
    AC_DEFINE(MAIL_USE_POP)
 else :
 fi],
 AC_DEFINE(MAIL_USE_POP))
 AH_TEMPLATE(MAIL_USE_POP, [Define to support POP mail retrieval.])dnl
-AC_ARG_WITH(kerberos,
-[  --with-kerberos         support Kerberos-authenticated POP],
+
+EMACS_ARG_Y([kerberos],[support Kerberos-authenticated POP],
 [if test "$withval" = yes; then
    AC_DEFINE(KERBEROS)
 fi])
 AH_TEMPLATE(KERBEROS,
            [Define to support Kerberos-authenticated POP mail retrieval.])dnl
-AC_ARG_WITH(kerberos5,
-[  --with-kerberos5        support Kerberos version 5 authenticated POP],
+
+EMACS_ARG_Y([kerberos5],[support Kerberos version 5 authenticated POP],
 [if test "${with_kerberos5+set}" = set; then
   if test "${with_kerberos+set}" != set; then
     with_kerberos=yes
@@ -68,21 +76,19 @@ AC_ARG_WITH(kerberos5,
   fi
   AC_DEFINE(KERBEROS5, 1, [Define to use Kerberos 5 instead of Kerberos 4.])
 fi])
-AC_ARG_WITH(hesiod,
-[  --with-hesiod           support Hesiod to get the POP server host],
+
+EMACS_ARG_Y([hesiod],[support Hesiod to get the POP server host],
 [if test "$withval" = yes; then
   AC_DEFINE(HESIOD, 1, [Define to support using a Hesiod database to find the POP server.])
 fi])
 
-AC_ARG_WITH(sound,
-[  --without-sound         don't compile with sound support])
+EMACS_ARG_N([sound],[don't compile with sound support])
 
 dnl This should be the last --with option, because --with-x is
 dnl added later on when we find the path of X, and it's best to
 dnl keep them together visually.
-AC_ARG_WITH(x-toolkit,
-[  --with-x-toolkit=KIT    use an X toolkit
-                              (KIT = yes/lucid/athena/motif/gtk/no)],
+AC_ARG_WITH([x-toolkit],[AS_HELP_STRING([--with-x-toolkit=KIT],
+ [use an X toolkit (KIT one of: yes, lucid, athena, motif, gtk, no)])],
 [        case "${withval}" in
            y | ye | yes )      val=gtk ;;
            n | no )            val=no  ;;
@@ -98,38 +104,27 @@ this option's value should be `yes', `no', `lucid', `athena', `motif' or `gtk'.
          esac
          with_x_toolkit=$val
 ])
-AC_ARG_WITH(xpm,
-[  --with-xpm              use -lXpm for displaying XPM images])
-AC_ARG_WITH(jpeg,
-[  --with-jpeg             use -ljpeg for displaying JPEG images])
-AC_ARG_WITH(tiff,
-[  --with-tiff             use -ltiff for displaying TIFF images])
-AC_ARG_WITH(gif,
-[  --with-gif              use -lgif (or -lungif) for displaying GIF images])
-AC_ARG_WITH(png,
-[  --with-png              use -lpng for displaying PNG images])
-AC_ARG_WITH(freetype,
-[  --with-freetype         use -lfreetype for local fonts support])
-AC_ARG_WITH(xft,
-[  --with-xft              use -lXft for anti aliased fonts])
-AC_ARG_WITH(gpm,
-[  --with-gpm              use -lgpm for mouse support on a GNU/Linux console])
-AC_ARG_WITH(rsvg,
-[  --with-rsvg             use -lrsvg-2 for displaying SVG images])
-AC_ARG_WITH(gtk,
-[  --with-gtk              use GTK (same as --with-x-toolkit=gtk)])
-AC_ARG_WITH(pkg-config-prog,
-[  --with-pkg-config-prog  Path to pkg-config to use for finding GTK and librsvg])
-AC_ARG_WITH(toolkit-scroll-bars,
-[  --without-toolkit-scroll-bars
-                          don't use Motif or Xaw3d scroll bars])
-AC_ARG_WITH(xim,
-[  --without-xim           don't use X11 XIM])
-AC_ARG_WITH(carbon,
-[  --without-carbon        don't use Carbon GUI on Mac OS X])
+
+EMACS_ARG_Y([xpm],[use -lXpm for displaying XPM images])
+EMACS_ARG_Y([jpeg],[use -ljpeg for displaying JPEG images])
+EMACS_ARG_Y([tiff],[use -ltiff for displaying TIFF images])
+EMACS_ARG_Y([gif],[use -lgif (or -lungif) for displaying GIF images])
+EMACS_ARG_Y([png],[use -lpng for displaying PNG images])
+EMACS_ARG_Y([freetype],[use -lfreetype for local fonts support])
+EMACS_ARG_Y([xft],[use -lXft for anti aliased fonts])
+EMACS_ARG_Y([gpm],[use -lgpm for mouse support on a GNU/Linux console])
+EMACS_ARG_Y([rsvg],[use -lrsvg-2 for displaying SVG images])
+EMACS_ARG_Y([gtk],[use GTK (same as --with-x-toolkit=gtk)])
+EMACS_ARG_Y([pkg-config-prog],[Path to pkg-config for finding GTK and librsvg])
+EMACS_ARG_N([toolkit-scroll-bars],[don't use Motif or Xaw3d scroll bars])
+EMACS_ARG_N([xaw3d],[don't use Xaw3d])
+EMACS_ARG_N([xim],[don't use X11 XIM])
+EMACS_ARG_N([carbon],[don't use Carbon GUI on Mac OS X])
+
 AC_ARG_ENABLE(carbon-app,
-[[  --enable-carbon-app[=DIR]  [DIR=/Application]
-                          specify install directory for Emacs.app on Mac OS X]],
+[AS_HELP_STRING([--enable-carbon-app@<:@=DIR@:>@],
+                [specify install directory for Emacs.app on Mac OS X
+                [DIR=/Application]])],
 [ carbon_appdir_x=${enableval}])
 
 AC_ARG_ENABLE(font-backend,
@@ -138,13 +133,14 @@ AC_ARG_ENABLE(font-backend,
       USE_FONT_BACKEND=no)
 
 AC_ARG_ENABLE(asserts,
-[  --enable-asserts        compile code with asserts enabled],
+[AS_HELP_STRING([--enable-asserts], [compile code with asserts enabled])],
       USE_XASSERTS=$enableval,
       USE_XASSERTS=no)
 
 AC_ARG_ENABLE(maintainer-mode,
-[  --enable-maintainer-mode enable make rules and dependencies not useful
-                          (and sometimes confusing) to the casual installer],
+[AS_HELP_STRING([--enable-maintainer-mode],
+                [enable make rules and dependencies not useful (and sometimes
+                confusing) to the casual installer])],
       USE_MAINTAINER_MODE=$enableval,
       USE_MAINTAINER_MODE=no)
 if test $USE_MAINTAINER_MODE = yes; then
@@ -155,9 +151,9 @@ fi
 AC_SUBST(MAINT)
 
 AC_ARG_ENABLE(locallisppath,
-[  --enable-locallisppath=PATH
-                          directories Emacs should search for lisp files
-                          specific to this site],
+[AS_HELP_STRING([--enable-locallisppath=PATH],
+                [directories Emacs should search for lisp files specific
+                to this site])],
 if test "${enableval}" = "no"; then
   locallisppath=
 elif test "${enableval}" != "yes"; then
@@ -1358,7 +1354,7 @@ AC_PATH_PROG(MAKEINFO, makeinfo, no)
 dnl By this stage, configure has already checked for egrep and set EGREP, 
 dnl or exited with an error if no egrep was found.
 if test "$MAKEINFO" != "no" && \
-  test x"`$MAKEINFO --version 2> /dev/null | $EGREP 'texinfo[[^0-9]]*([[5-9]]|4\.[[6-9]])'`" = x; then
+  test x"`$MAKEINFO --version 2> /dev/null | $EGREP 'texinfo[[^0-9]]*([[1-4]][[0-9]]+|[[5-9]]|4\.[[6-9]]|4\.[[1-5]][[0-9]]+)'`" = x; then
    MAKEINFO=no    
 fi
 
@@ -2183,8 +2179,8 @@ if test "${with_gtk}" = "yes" || test "$USE_X_TOOLKIT" = "gtk" || \
   if test "$USE_X_TOOLKIT" != "none" && test "$USE_X_TOOLKIT" != "maybe"; then
     AC_MSG_ERROR([Conflicting options, --with-gtk is incompatible with --with-x-toolkit=${with_x_toolkit}]);
   fi
-  GLIB_REQUIRED=2.4
-  GTK_REQUIRED=2.4
+  GLIB_REQUIRED=2.6
+  GTK_REQUIRED=2.6
   GTK_MODULES="gtk+-2.0 >= $GTK_REQUIRED glib-2.0 >= $GLIB_REQUIRED"
 
   dnl Check if --with-pkg-config-prog has been given.
@@ -2238,6 +2234,7 @@ if test "${HAVE_GTK}" = "yes"; then
     AC_DEFINE(HAVE_GTK_MULTIDISPLAY, 1,
               [Define to 1 if GTK can handle more than one display.])
   fi
+
   dnl  Check if we have the old file selection dialog.
   dnl  If gdk_display_open exists, assume all others are there also.
   HAVE_GTK_FILE_SELECTION=no
@@ -2263,7 +2260,10 @@ if test "${HAVE_GTK}" = "yes"; then
       AC_CHECK_LIB(pthread, pthread_self, HAVE_GTK_AND_PTHREAD=yes)
     fi
     if test "$HAVE_GTK_AND_PTHREAD" = yes; then
-      GTK_LIBS="$GTK_LIBS -lpthread"
+      case "${canonical}" in
+        *-hpux*) ;;
+        *) GTK_LIBS="$GTK_LIBS -lpthread" ;;
+      esac
       AC_DEFINE(HAVE_GTK_AND_PTHREAD, 1,
                [Define to 1 if you have GTK and pthread (-lpthread).])
     fi
@@ -2277,14 +2277,18 @@ if test x"${USE_X_TOOLKIT}" = xmaybe || test x"${USE_X_TOOLKIT}" = xLUCID; then
   if test x"${HAVE_X11R5}" != xyes; then
     USE_X_TOOLKIT=none
   else
-    AC_MSG_CHECKING(for xaw3d)
-    AC_CACHE_VAL(emacs_cv_xaw3d,
-    [AC_TRY_LINK([
+    if test "$with_xaw3d" != no; then
+      AC_MSG_CHECKING(for xaw3d)
+      AC_CACHE_VAL(emacs_cv_xaw3d,
+      [AC_TRY_LINK([
 #include <X11/Intrinsic.h>
 #include <X11/Xaw3d/Simple.h>],
-      [],
-      emacs_cv_xaw3d=yes,
-      emacs_cv_xaw3d=no)])
+        [],
+        emacs_cv_xaw3d=yes,
+        emacs_cv_xaw3d=no)])
+    else
+      emacs_cv_xaw3d=no
+    fi
     if test $emacs_cv_xaw3d = yes; then
       AC_MSG_RESULT([yes; using Lucid toolkit])
       USE_X_TOOLKIT=LUCID
@@ -2429,8 +2433,8 @@ AC_TRY_COMPILE([
          #include <X11/Xlib.h>
          #include <X11/Xresource.h>],
         [XIMProc  callback;],
-        HAVE_XIM=yes
-        AC_DEFINE(HAVE_XIM, 1, [Define to 1 if XIM is available]),
+        [HAVE_XIM=yes
+        AC_DEFINE(HAVE_XIM, 1, [Define to 1 if XIM is available])],
         HAVE_XIM=no)
 
 dnl `--with-xim' now controls only the initial value of use_xim at run time.
@@ -2567,7 +2571,7 @@ HAVE_XPM=no
 if test "${HAVE_X11}" = "yes"; then
   if test "${with_xpm}" != "no"; then
     AC_CHECK_HEADER(X11/xpm.h,
-      AC_CHECK_LIB(Xpm, XpmReadFileToPixmap, HAVE_XPM=yes, , -lX11))
+      [AC_CHECK_LIB(Xpm, XpmReadFileToPixmap, HAVE_XPM=yes, , -lX11)])
     if test "${HAVE_XPM}" = "yes"; then
       AC_MSG_CHECKING(for XpmReturnAllocPixels preprocessor define)
       AC_EGREP_CPP(no_return_alloc_pixels,
@@ -2597,7 +2601,7 @@ if test "${HAVE_X11}" = "yes"; then
     dnl Checking for jpeglib.h can lose because of a redefinition of
     dnl  HAVE_STDLIB_H.
     AC_CHECK_HEADER(jerror.h,
-      AC_CHECK_LIB(jpeg, jpeg_destroy_compress, HAVE_JPEG=yes))
+      [AC_CHECK_LIB(jpeg, jpeg_destroy_compress, HAVE_JPEG=yes)])
   fi
 
   AH_TEMPLATE(HAVE_JPEG, [Define to 1 if you have the jpeg library (-ljpeg).])dnl
@@ -2607,7 +2611,7 @@ if test "${HAVE_X11}" = "yes"; then
         [#include <jpeglib.h>
         version=JPEG_LIB_VERSION
 ],
-        AC_DEFINE(HAVE_JPEG),
+        [AC_DEFINE(HAVE_JPEG)],
         [AC_MSG_WARN([libjpeg found, but not version 6b or later])
         HAVE_JPEG=no])
   fi
@@ -2635,10 +2639,10 @@ HAVE_TIFF=no
 if test "${HAVE_X11}" = "yes"; then
   if test "${with_tiff}" != "no"; then
     AC_CHECK_HEADER(tiffio.h,
-      tifflibs="-lz -lm"
+      [tifflibs="-lz -lm"
       # At least one tiff package requires the jpeg library.
       if test "${HAVE_JPEG}" = yes; then tifflibs="-ljpeg $tifflibs"; fi
-      AC_CHECK_LIB(tiff, TIFFGetVersion, HAVE_TIFF=yes, , $tifflibs))
+      AC_CHECK_LIB(tiff, TIFFGetVersion, HAVE_TIFF=yes, , $tifflibs)])
   fi
 
   if test "${HAVE_TIFF}" = "yes"; then
@@ -2652,7 +2656,7 @@ if test "${HAVE_X11}" = "yes" && test "${with_gif}" != "no"; then
   AC_CHECK_HEADER(gif_lib.h,
 # EGifPutExtensionLast only exists from version libungif-4.1.0b1.
 # Earlier versions can crash Emacs.
-    AC_CHECK_LIB(gif, EGifPutExtensionLast, HAVE_GIF=yes, try_libungif=yes))
+    [AC_CHECK_LIB(gif, EGifPutExtensionLast, HAVE_GIF=yes, try_libungif=yes)])
 
   if test "$HAVE_GIF" = yes; then
       ac_gif_lib_name="-lgif"
@@ -2702,7 +2706,7 @@ fi
 HAVE_GPM=no
 if test "${with_gpm}" != "no"; then
   AC_CHECK_HEADER(gpm.h,
-    AC_CHECK_LIB(gpm, Gpm_Open, HAVE_GPM=yes))
+    [AC_CHECK_LIB(gpm, Gpm_Open, HAVE_GPM=yes)])
 fi
 
 if test "${HAVE_GPM}" = "yes"; then
@@ -2710,7 +2714,7 @@ if test "${HAVE_GPM}" = "yes"; then
 fi
 
 dnl Check for malloc/malloc.h on darwin
-AC_CHECK_HEADER(malloc/malloc.h, AC_DEFINE(HAVE_MALLOC_MALLOC_H, 1, [Define to 1 if you have the <malloc/malloc.h> header file.]))
+AC_CHECK_HEADER(malloc/malloc.h, [AC_DEFINE(HAVE_MALLOC_MALLOC_H, 1, [Define to 1 if you have the <malloc/malloc.h> header file.])])
 
 ### Use Mac OS X Carbon API to implement GUI.
 if test "${HAVE_CARBON}" = "yes"; then
@@ -2731,7 +2735,7 @@ fi
 HAVE_X_SM=no
 if test "${HAVE_X11}" = "yes"; then
   AC_CHECK_HEADER(X11/SM/SMlib.h,
-    AC_CHECK_LIB(SM, SmcOpenConnection, HAVE_X_SM=yes, , -lICE))
+    [AC_CHECK_LIB(SM, SmcOpenConnection, HAVE_X_SM=yes, , -lICE)])
 
   if test "${HAVE_X_SM}" = "yes"; then
     AC_DEFINE(HAVE_X_SM, 1, [Define to 1 if you have the SM library (-lSM).])
@@ -2754,6 +2758,13 @@ fi
 
 AC_FUNC_ALLOCA
 
+dnl src/alloca.c has been removed.  Could also check if $ALLOCA is set?
+dnl FIXME is there an autoconf test that does the right thing, without
+dnl needing to call A_M_E afterwards?
+if test x"$ac_cv_func_alloca_works" != xyes; then
+   AC_MSG_ERROR( [a system implementation of alloca is required] )
+fi
+
 # fmod, logb, and frexp are found in -lm on most systems.
 # On HPUX 9.01, -lm does not contain logb, so check for sqrt.
 AC_CHECK_LIB(m, sqrt)
@@ -2842,8 +2853,8 @@ if test "$with_hesiod" = yes ; then
     RESOLVLIB=
   fi
   AC_CHECK_FUNC(hes_getmailhost, , [AC_CHECK_LIB(hesiod, hes_getmailhost,
-       AC_DEFINE(HAVE_LIBHESIOD, 1,
-                 [Define to 1 if you have the hesiod library (-lhesiod).]),
+       [AC_DEFINE(HAVE_LIBHESIOD, 1,
+                 [Define to 1 if you have the hesiod library (-lhesiod).])],
        :, $RESOLVLIB)])
 fi
 
@@ -2855,9 +2866,9 @@ if test "${with_kerberos+set}" = set; then
   AC_CHECK_LIB(krb5, krb5_init_context)
   if test "${with_kerberos5+set}" != set; then
     AC_CHECK_LIB(des425, des_cbc_encrypt,,
-                AC_CHECK_LIB(des, des_cbc_encrypt))
+                [AC_CHECK_LIB(des, des_cbc_encrypt)])
     AC_CHECK_LIB(krb4, krb_get_cred,,
-                AC_CHECK_LIB(krb, krb_get_cred))
+                [AC_CHECK_LIB(krb, krb_get_cred)])
   fi
 
   if test "${with_kerberos5+set}" = set; then
@@ -3178,6 +3189,13 @@ AH_BOTTOM([
 #define HAVE_MOUSE
 #endif
 
+/* Multi-tty support relies on MULTI_KBOARD.  It seems safe to turn it
+   on unconditionally.  Note that src/s/darwin.h disables this at
+   present.  */
+#ifndef MULTI_KBOARD
+#define MULTI_KBOARD
+#endif
+
 /* If we're using the Carbon API on Mac OS X, define a few more
    variables as well.  */
 #ifdef HAVE_CARBON
@@ -3510,8 +3528,9 @@ AC_EGREP_CPP(yes..yes,
        CPP_NEED_TRADITIONAL=yes)
 
 AC_OUTPUT(Makefile lib-src/Makefile.c:lib-src/Makefile.in oldXMenu/Makefile \
-       man/Makefile lwlib/Makefile src/Makefile.c:src/Makefile.in \
-       lisp/Makefile lispref/Makefile lispintro/Makefile leim/Makefile, [
+       doc/emacs/Makefile doc/misc/Makefile doc/lispintro/Makefile \
+       doc/lispref/Makefile src/Makefile.c:src/Makefile.in \
+       lwlib/Makefile lisp/Makefile leim/Makefile, [
 
 ### Make the necessary directories, if they don't exist.
 for dir in etc lisp ; do
diff --git a/doc/emacs/.gitignore b/doc/emacs/.gitignore
new file mode 100644 (file)
index 0000000..3ff56b4
--- /dev/null
@@ -0,0 +1,23 @@
+*.aux
+*.cp
+*.cps
+*.dvi
+*.fn
+*.fns
+*.ky
+*.kys
+*.log
+*.op
+*.ops
+*.pdf
+*.pg
+*.pgs
+*.ps
+*.tmp
+*.toc
+*.tp
+*.tps
+*.vr
+*.vrs
+Makefile
+makefile
similarity index 58%
rename from man/ChangeLog
rename to doc/emacs/ChangeLog
index 5b096844f37ac724d2fbc19d6088c5c34a79e1af..41decab74bf13783eaa6de03cfc0e145989ba3a6 100644 (file)
@@ -1,91 +1,98 @@
-2007-08-24  IRIE Tetsuya  <irie@t.email.ne.jp>  (tiny change)
+2007-10-09  Eric S. Raymond  <esr@snark.thyrsus.com>
 
-       * message.texi (MIME): Replace mml-attach with mml-attach-file.
+       * files.texi (Version Systems): Describe newerte VCses.
+       Reorder the descriptions to be chronological.
 
-2007-08-22  Carsten Dominik  <dominik@science.uva.nl>
+2007-10-04  Nick Roberts  <nickrob@snap.net.nz>
 
-       * org.texi (Adding hyperlink types): New section.
-       (Embedded LaTeX): Chapter updated because of LaTeX export.
-       (LaTeX export): New section.
-       (Using links out): New section.
+       * building.texi (GDB Graphical Interface): Remove references to gdba
+       and mention gud-gdb.
 
-2007-08-22  Glenn Morris  <rgm@gnu.org>
+2007-08-31  Eli Zaretskii  <eliz@gnu.org>
 
-       * faq.texi (Learning how to do something): Refcards now in
-       etc/refcards/ directory.
+       * rmail.texi (Rmail Sorting): Improve indexing.
 
-2007-08-22  Michael Albinus  <michael.albinus@gmx.de>
+2007-10-06  Juri Linkov  <juri@jurta.org>
 
-       * tramp.texi (Remote Programs): Persistency file must be cleared when
-       changing `tramp-remote-path'.
-       (Filename Syntax): Don't use @var{} constructs inside the @trampfn
-       macro.
+       * text.texi (Fill Commands): Document fill-paragraph-or-region.
+       (Fill Prefix, Format Indentation): Replace fill-paragraph with
+       fill-paragraph-or-region.
 
-2007-08-17  Eli Zaretskii  <eliz@gnu.org>
+       * basic.texi (Arguments): Replace fill-paragraph with
+       fill-paragraph-or-region.
 
-       * basic.texi (Position Info): Add index entry for face at point.
-       Mention that character faces are also displayed by "C-u C-x =".
+2007-10-06  Eric S. Raymond  <esr@snark.thyrsus.com>
 
-2007-08-17  Jay Belanger  <jay.p.belanger@gmail.com>
+       * files.texi: Update the section on version control for 2007
+       conditions. None of these changes are new-VC-specific; that
+       will come later.
 
-       * calc.texi: Move contents to beginning of file.
-       (Algebraic Entry): Fix the formatting of an example.
+2007-09-15  Glenn Morris  <rgm@gnu.org>
 
-2007-08-15  Jay Belanger  <jay.p.belanger@gmail.com>
+       * calendar.texi (Holidays): Change all instances of `holiday-list' back
+       to `list-holidays'.
 
-       * calc.texi (Basic Operations on Units): Mention exact versus
-       inexact conversions.
+2007-09-14  Glenn Morris  <rgm@gnu.org>
 
-2007-08-14  Jay Belanger  <jay.p.belanger@gmail.com>
+       * calendar.texi: Update all instances of mark-calendar-holidays,
+       list-calendar-holidays, list-holidays with the new names.
 
-       * calc.texi (Basic Operations on Units): Mention default
-       values for new units.
-       (Quick Calculator Mode): Mention that binary format will
-       be displayed.
+2007-09-06  Glenn Morris  <rgm@gnu.org>
 
-2007-08-14  Katsumi Yamaoka  <yamaoka@jpl.org>
+       * Move manual sources from man/ to subdirectories of doc/.
+       Split into the Emacs manual in emacs/, and other manuals in misc/.
+       * Makefile.in (INFO_TARGETS, DVI_TARGETS): Reduce to just the Emacs
+       manual.
+       (infodir): New variable.
+       (info): Use $infodir.
+       (emacsman): Delete target, not needed any more.
+       Move all targets that are not the Emacs manual to misc/Makefile.in.
+       (mostlyclean): Remove `gnustmp'.
+       * makefile.w32-in (INFO_TARGETS, DVI_TARGETS): Reduce to just the Emacs
+       manual.
+       (MULTI_INSTALL_INFO, ENVADD, infodir): Go up one more level.
+       (emacsman): Delete target, not needed any more.
+       (clean): Remove all info files but Emacs manual.
+       Move all targets that are not the Emacs manual to misc/Makefile.in.
+       * emacs-xtra.texi, emacs.texi (setfilename): Go up one more level.
 
-       * gnus.texi (Selecting a Group): Mention gnus-maximum-newsgroup.
+       * Makefile.in (INFOSOURCES): Delete.
+       (.SUFFIXES): Use $(TEXI2DVI) rather than texi2dvi.
+       (mostlyclean): Add *.op, *.ops.  Move *.aux *.cps *.fns *.kys *.pgs
+       *.vrs *.toc here...
+       (maintainer-clean): ...from here.
 
-2007-08-10  Katsumi Yamaoka  <yamaoka@jpl.org>
+2007-09-05  Glenn Morris  <rgm@gnu.org>
 
-       * gnus.texi (NNTP): Mention nntp-xref-number-is-evil.
+       * custom.texi (Safe File Variables): Clarify `!' and risky variables.
 
-2007-08-08  Glenn Morris  <rgm@gnu.org>
+2007-08-29  Glenn Morris  <rgm@gnu.org>
 
-       * glossary.texi (Glossary): Deprecate `iff'.
-       * gnus.texi, sieve.texi: Replace `iff'.
+       * emacs.texi (EMACSVER): Increase to 23.0.50.
 
-2007-08-07  Chong Yidong  <cyd@stupidchicken.com>
+2007-08-27  Richard Stallman  <rms@gnu.org>
 
-       * files.texi (File Conveniences): Document point motion keys in Image
-       mode.
+       * emacs.texi (Top): Clarify menu item for Glossary.
 
-2007-08-03  Jay Belanger  <jay.p.belanger@gmail.com>
+       * display.texi (Faces): Change secn title.
+       Clarify not all fonts come from Font Lock.
 
-       * calc.texi (Basic Graphics): Mention the graphing of error
-       forms.
-       (Graphics Options): Mention how `g s' handles error forms.
-       (Curve Fitting): Mention plotting the curves.
-       (Standard Nonlinear Models): Add additional models.
-       (Curve Fitting Details): Mention the Levenberg-Marquardt method.
-       (Linear Fits): Correct result.
+2007-08-17  Eli Zaretskii  <eliz@gnu.org>
 
-2007-08-01  Alan Mackenzie  <acm@muc.de>
+       * basic.texi (Position Info): Add index entry for face at point.
+       Mention that character faces are also displayed by "C-u C-x =".
 
-       * cc-mode.texi (Mailing Lists and Bug Reports): Correct "-no-site-file"
-       to "--no-site-file".
+2007-08-08  Glenn Morris  <rgm@gnu.org>
 
-2007-07-29  Michael Albinus  <michael.albinus@gmx.de>
+       * glossary.texi (Glossary): Deprecate `iff'.
 
-       * tramp.texi (Frequently Asked Questions): Point to mode line
-       extension in Emacs 23.1.
+2007-08-07  Chong Yidong  <cyd@stupidchicken.com>
 
-       * trampver.texi: Update release number.
+       * files.texi (File Conveniences): Document point motion keys in Image
+       mode.
 
 2007-07-27  Glenn Morris  <rgm@gnu.org>
 
-       * calc.texi (Copying)
        * emacs.texi (Copying): Include license text from gpl.texi, rather than
        in-line.
 
 
 2007-07-25  Glenn Morris  <rgm@gnu.org>
 
-       * calc.texi (Copying)
        * emacs.texi (Copying): Replace license with GPLv3.
 
        * Relicense all FSF files to GPLv3 or later.
        * screen.texi (Mode Line): Describe new mode-line flag that shows if
        default-directory for the current buffer is on a remote machine.
 
-2007-07-22  Michael Albinus  <michael.albinus@gmx.de>
-
-       Sync with Tramp 2.1.10.
-
-       * tramp.texi (trampfn): Expand macro implementation in order to handle
-       empty arguments.
-       (trampfnmhl, trampfnuhl, trampfnhl): Remove macros.  Replace all
-       occurencies by trampfn.
-       (Frequently Asked Questions): Extend example code for host
-       identification in the modeline. Add bbdb to approaches shortening Tramp
-       file names to be typed.
-
-       * trampver.texi: Update release number.
-
 2007-07-21  Eli Zaretskii  <eliz@gnu.org>
 
        * vc2-xtra.texi (Customizing VC) <vc-handled-backends>: Update the
 
        * files.texi (Why Version Control?): New node.
 
-2007-07-17  Michael Albinus  <michael.albinus@gmx.de>
-
-       * tramp.texi: Move @setfilename ../info/tramp up, outside the header
-       section.  Reported by <poti@potis.org>.
-       (Remote processes): Arguments of the program to be debugged are taken
-       literally.
-       (Frequently Asked Questions): Simplify recentf example.
-
-2007-07-14  Karl Berry  <karl@gnu.org>
-
-       * info.texi (@copying): New Back-Cover Text.
-
-       * info.texi (Quitting Info): Move to proper place in source.
-       (Reported by Benno Schulenberg.)
-
-2007-07-13  Eli Zaretskii  <eliz@gnu.org>
-
-       * Makefile.in (../info/emacs-mime): Use --enable-encoding.
-
-       * makefile.w32-in ($(infodir)/emacs-mime): Ditto.
-
-       * emacs-mime.texi: Add @documentencoding directive.
-
 2007-07-12  Nick Roberts  <nickrob@snap.net.nz>
 
-       * tramp.texi (Remote processes): Add an anchor to the subsection
-       "Running a debugger on a remote host".
-
        * building.texi (Starting GUD): Add xref to this anchor.
 
-2007-07-12  Michael Albinus  <michael.albinus@gmx.de>
-
-       * tramp.texi (Remote processes): Don't call it "experimental" any
-       longer.  Add subsection about running a debugger on a remote host.
-
-2007-07-10  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi (Properties and columns): Chapter rewritten.
-
-2007-07-08  Michael Albinus  <michael.albinus@gmx.de>
-
-       * tramp.texi:
-       * trampver.texi: Migrate to Tramp 2.1.
-
-2007-07-02  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi (Properties): New chapter.
-
-2007-07-02  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus-faq.texi ([3.2]): Fix locating of environment variables in the
-       Control Panel.
-
-       * gnus.texi (Misc Article): Add index entry for
-       gnus-single-article-buffer.
-
-2007-06-27  Andreas Seltenreich  <andreas@gate450.dyndns.org>
-
-       * gnus.texi (Starting Up): Fix typo.
-
-2007-06-25  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * gnus.texi (Asynchronous Fetching): Fix typo.
-
 2007-06-24  Karl Berry  <karl@gnu.org>
 
        * emacs.texi: new Back-Cover Text.
 
-2007-06-20  Jay Belanger  <jay.p.belanger@gmail.com>
-
-       * calc.texi:Change ifinfo to ifnottex (as appropriate) throughout.
-       (About This Manual): Remove redundant information.
-       (Getting Started): Mention author.
-       (Basic Arithmetic, Customizing Calc): Make description of the
-       variable `calc-multiplication-has-precedence' match its new effect.
-
-2007-06-19  Jay Belanger  <jay.p.belanger@gmail.com>
-
-       * calc.texi (Basic Arithmetic, Customizing Calc): Mention
-       the variable `calc-multiplication-has-precedence'.
-
-2007-06-19  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi (Tag): Section swapped with node Timestamps.
-       (Formula syntax for Lisp): Document new `L' flag.
-
-2007-06-06  Andreas Seltenreich  <andreas@gate450.dyndns.org>
-
-       * gnus.texi (Misc Group Stuff, Summary Buffer)
-       (Server Commands, Article Keymap): Fix typo.  s/function/command/.
-
 2007-06-07  Alan Mackenzie  <acm@muc.de>
 
        * display.texi (Optional Mode Line): Document the new form of
 
 2007-06-06  Juanma Barranquero  <lekktu@gmail.com>
 
-       * cc-mode.texi (Comment Commands, Getting Started, Style Variables):
-       * gnus.texi (Article Buttons, Mail Source Customization)
-       (Sending or Not Sending, Customizing NNDiary):
-       * maintaining.texi (Create Tags Table):
-       * message.texi (Message Headers):
-       * mh-e.texi (HTML): Fix typos.
-
-2007-06-07  Michael Albinus  <michael.albinus@gmx.de>
-
-       Sync with Tramp 2.0.56.
-
-       * tramp.texi (Frequently Asked Questions): Improve ~/.zshrc
-       settings.  Reported by Ted Zlatanov <tzz@lifelogs.com>.
+       * maintaining.texi (Create Tags Table): Fix typos.
 
 2007-06-02  Chong Yidong  <cyd@stupidchicken.com>
 
        * Version 22.1 released.
 
-2007-05-26  Michael Olson  <mwolson@gnu.org>
-
-       * erc.texi (Modules): Fix references to completion modules.
-
-2007-05-09  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus.texi (Running NNDiary): Use ~/.gnus.el instead of gnusrc.
-
-2007-05-09  Didier Verna  <didier@xemacs.org>
-
-       * gnus.texi (Email Based Diary): New.  Proper documentation for the
-       nndiary back end and the gnus-diary library.
-
 2007-05-07  Karl Berry  <karl@gnu.org>
 
        * emacs.texi (EMACSVER): Back to 22.
 
        * .cvsignore (*.pdf): New entry.
 
-       * texinfo.tex: Update from current version for better pdf generation.
-
        * emacs.texi (\urlcolor, \linkcolor) [smallbook]: \let to \Black
        for printing.
 
 
        * cmdargs.texi (Initial Options): Under --batch, mention --eval.
 
-2007-04-30  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus.texi (Article Highlighting): Clarify gnus-cite-parse-max-size.
-
 2007-04-28  Glenn Morris  <rgm@gnu.org>
 
        * ack.texi (Acknowledgments):
        * anti.texi (Antinews):
-       * faq.texi (New in Emacs 22):
        * programs.texi (Program Modes): Restore mention of python.el pending
        consideration of legal status.
 
 
        * files.texi (File Names): Fixes to ~ description on MS systems.
 
-2007-04-27  J.D. Smith  <jdsmith@as.arizona.edu>
-
-       * idlwave.texi: Minor updates for IDLWAVE 6.1.
-
 2007-04-26  Glenn Morris  <rgm@gnu.org>
 
        * emacs.texi (EMACSVER): Increase to 22.1.50.
 2007-04-24  Chong Yidong  <cyd@stupidchicken.com>
 
        * programs.texi (Program Modes):
-       * faq.texi (New in Emacs 22):
        * anti.texi (Antinews):
        * ack.texi (Acknowledgments): python.el removed.
 
-2007-04-23  Jay Belanger  <jay.p.belanger@gmail.com>
-
-       * calc.texi (Reporting bugs): Update maintainer's address.
-
 2007-04-23  Chong Yidong  <cyd@stupidchicken.com>
 
        * display.texi (Highlight Interactively): Correct description of
        * emacs.texi (Top): Update node listing.
 
        * files.texi (File Conveniences):
-       * ack.texi (Acknowledgments):
-       * faq.texi (New in Emacs 22): Rename "tumme" to "image-dired".
+       * ack.texi (Acknowledgments): Rename "tumme" to "image-dired".
 
 2007-04-21  Richard Stallman  <rms@gnu.org>
 
 
        * display.texi (Scrolling): Fix typo.
 
-2007-04-15  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi (Title page): Remove the date.
-       (Basic Arithmetic): Emphasize that / binds less strongly than *.
-       (The Standard Calc Interface): Change trail title.
-       (Floats): Mention that when non-decimal floats are entered, only
-       approximations are stored.
-       (Copying): Move to the appendices.
-       (GNU Free Documentation License): Add as an appendix.
-
 2007-04-15  Chong Yidong  <cyd@stupidchicken.com>
 
-       * ada-mode.texi, autotype.texi, cc-mode.texi, cl.texi:
-       * dired-x.texi, ebrowse.texi, ediff.texi:
-       * emacs-mime.texi, erc.texi, eshell.texi:
-       * eudc.texi, flymake.texi, forms.texi, gnus.texi:
-       * idlwave.texi, message.texi, newsticker.texi, org.texi:
-       * pcl-cvs.texi, pgg.texi, rcirc.texi, reftex.texi, sc.texi:
-       * ses.texi, sieve.texi, smtpmail.texi, speedbar.texi:
-       * tramp.texi, url.texi, vip.texi, viper.texi, widget.texi:
-       * woman.texi: Include GFDL.
-
        * doclicense.texi: Remove node heading, so that it can be included by
        other files.
 
        * emacs.texi: Insert node heading for GFDL.
 
-       * dired-x.texi: Relicence under GFDL.  Remove date from title page.
-
-       * calc.texi (Algebraic Tutorial): Emphasize that / binds less strongly
-       than *.
-
-2007-04-14  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi (Formula syntax for Calc): Emphasize the operator precedence
-       in Calc.
-
 2007-04-14  Eli Zaretskii  <eliz@gnu.org>
 
        * cmdargs.texi (Colors): Qualify "color of window" index entry by
        * files.texi (File Conveniences): Add xref to Tumme.
        Delete text about Thumbnail mode.
 
-2007-04-09  Romain Francoise  <romain@orebokech.com>
-
-       * faq.texi (New in Emacs 22): Mention improvements to the Windows and
-       Mac OS ports.  Make it clear that mouse-1 complements and doesn't
-       replace mouse-2.
-
 2007-04-09  Alan Mackenzie  <acm@muc.de>
 
        * cmdargs.texi (Initial Options): Call "inhibit-splash-screen" by its
        new name.  Insert concept index entries.
 
-2007-04-08  Richard Stallman  <rms@gnu.org>
-
-       * url.texi: Fix some indexing.
-       (Disk Caching): Drop discussion of old/other Emacs versions.
-
 2007-04-08  Chong Yidong  <cyd@stupidchicken.com>
 
        * display.texi (Standard Faces): Document prefix arg for
 
        * rmail.texi (Rmail Scrolling): Document rmail-end-of-message.
 
-       * woman.texi (Word at point, Interface Options): woman-topic-at-point
-       renamed to woman-use-topic-at-point.  Document new behavior.
-
 2007-04-07  Chong Yidong  <cyd@stupidchicken.com>
 
-       * url.texi (Disk Caching): Say Emacs 21 "and later".
-
-       * cc-mode.texi (Font Locking Preliminaries): Link to Emacs manual node
-       on Font locking which now mentions JIT lock.
-
        * killing.texi (Deletion): Rewrite description of M-\ prefix argument.
 
        * files.texi (Misc File Ops): Rewrite description of
        insert-file-literally.
 
-2007-04-01  Michael Olson  <mwolson@gnu.org>
-
-       * erc.texi: Update for the ERC 5.2 release.
-
-2007-03-31  David Kastrup  <dak@gnu.org>
-
-       * woman.texi (Topic, Interface Options): Explain changes semantics of
-       woman-manpath in order to consider MANPATH_MAP entries.
-
 2007-03-31  Eli Zaretskii  <eliz@gnu.org>
 
        * misc.texi (Printing): Postscript -> PostScript.
 
-       * emacs-mime.texi (Non-MIME): Postscript -> PostScript.
-
        * ack.texi (Acknowledgments): Postscript -> PostScript.
 
        * custom.texi (Init File, Init Non-ASCII): Fix last change.
 
        * macos.texi (Mac Font Specs): Mention AppleAntiAliasingThreshold.
 
-2007-03-26  Richard Stallman  <rms@gnu.org>
-
-       * pgg.texi (Caching passphrase): Clean up previous change.
-
-2007-03-25  Thien-Thi Nguyen  <ttn@gnu.org>
-
-       * gnus.texi (Setting Process Marks): Fix typo.
-
-2007-03-25  Romain Francoise  <romain@orebokech.com>
-
-       * faq.texi (New in Emacs 22): Reorganize using an itemized list for
-       readability, and include various fixes by Daniel Brockman, Nick Roberts
-       and Dieter Wilhelm.
-
-2007-03-24  Thien-Thi Nguyen  <ttn@gnu.org>
-
-       * gnus.texi (Splitting Mail): Reword "splitting"-as-adj to be -as-noun.
-
-       * gnus.texi (Mail Source Specifiers): Fix typo.
-
-2007-03-22  Ralf Angeli  <angeli@caeruleus.net>
-
-       * reftex.texi (Imprint): Update maintainer information.
-
-2007-03-15  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * message.texi (Message Buffers): Update documentation for
-       message-generate-new-buffers.
-
-2007-03-15  Daiki Ueno  <ueno@unixuser.org>
-
-       * pgg.texi (Caching passphrase): Describe pgg-passphrase-coding-system.
-
-2007-03-21  Glenn Morris  <rgm@gnu.org>
-
-       * eshell.texi (Known problems): Emacs 22 comes with eshell 2.4.2.
-
-2007-03-19  Chong Yidong  <cyd@stupidchicken.com>
-
-       * eshell.texi (Known problems): Emacs 21 -> 22.
-
-       * cc-mode.texi (Performance Issues): Update note about 21.3 to 22.1.
-
-2007-03-18  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi (Time Zones): Mention that the DST rules changed in 2007.
-
 2007-03-12  Glenn Morris  <rgm@gnu.org>
 
-       * calc.texi (Time Zones): Switch to new North America DST rule.
-
        * calendar.texi, emacs.texi (Daylight Saving): Rename node from
        "Daylight Savings".
 
-       * calc.texi, calendar.texi: Replace "daylight savings" with "daylight
+       * calendar.texi: Replace "daylight savings" with "daylight
        saving" in text throughout.
 
-2007-03-11  Andreas Seltenreich  <uwi7@rz.uni-karlsruhe.de>
-
-       * gnus.texi (Mail and Post): Update documentation for gnus-user-agent.
-       The variable now uses a list of symbols instead of just a symbol.
-       Reported by Christoph Conrad <christoph.conrad@gmx.de>.
-
-2007-03-06  Romain Francoise  <romain@orebokech.com>
-
-       * faq.texi (New in Emacs 22): Don't say "now" too much.  Add MH-E to
-       new packages, and mention Gnus update.
-
 2007-03-04  Richard Stallman  <rms@gnu.org>
 
        * custom.texi (Safe File Variables): Minor correction.
 
-2007-02-27  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * gnus.texi (NNTP): Mention nntp-never-echoes-commands and
-       nntp-open-connection-functions-never-echo-commands.
-
 2007-02-28  Thien-Thi Nguyen  <ttn@gnu.org>
 
        * rmail.texi (Movemail): Add internal ref.
        Don't indent the intro for the PROTO table.
        Format PROTO table items with @code.
 
-2007-02-27  Chong Yidong  <cyd@stupidchicken.com>
-
-       * pgg.texi (Caching passphrase): Document gpg-agent usage, gpg-agent
-       problems on the console, and security risk in not using gpg-agent.
-
 2007-02-26  Nick Roberts  <nickrob@snap.net.nz>
 
        * building.texi: Remove references to bashdb.
 
-2007-02-25  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi (The spreadsheet): Renamed from "Table calculations".
-       Completely reorganized and rewritten.
-       (CamelCase links): Section removed.
-       (Repeating items): New section.
-       (Tracking TODO state changes): New section.
-       (Agenda views): Chapter reorganized and rewritten.
-       (HTML export): Section rewritten.
-       (Tables in arbitrary syntax): New section.
-       (Summary): Better feature summary.
-       (Activation): Document problem with cut-and-paste of Lisp code
-       from PDF files.
-       (Visibility cycling): Document indirect buffer use.
-       (Structure editing): Document sorting.
-       (Remember): Section rewritten.
-       (Time stamps): Better description of time stamp types.
-       (Tag searches): Document regular expression search for tags.
-       (Stuck projects): New section.
-       (In-buffer settings): New keywords.
-       (History and Acknowledgments): Updated description.
-
-2007-02-24  Alan Mackenzie  <acm@muc.de>
-
-       * cc-mode.texi (Movement Commands): Insert two missing command names.
-       (Getting Started): Slight wording correction (use conditional).
-
-2007-02-22  Kim F. Storm  <storm@cua.dk>
-
-       * widget.texi (User Interface, Basic Types): Document need to put some
-       text before the %v escape in :format string in editable-field widget.
-
 2007-02-19  Juanma Barranquero  <lekktu@gmail.com>
 
        * mule.texi (Language Environments): Update list of supported language
        environments.
 
-2007-02-18  Romain Francoise  <romain@orebokech.com>
-
-       * pcl-cvs.texi (Miscellaneous commands): q runs `cvs-bury-buffer', not
-       `cvs-mode-quit'.
-
 2007-02-14  Kim F. Storm  <storm@cua.dk>
 
        * building.texi (Grep Searching): Fix lgrep doc.
 
        * back.texi: Remove unused file.
 
-2007-02-10  Markus Triska  <markus.triska@gmx.at>
-
-       * widget.texi (Programming Example): Put constant strings in :format.
-
-2007-02-07  Juanma Barranquero  <lekktu@gmail.com>
-
-       * faq.texi (Fullscreen mode on MS-Windows): New node.
-
 2007-02-05  Francesco Potort\e,Al\e(B  <pot@gnu.org>
 
        * maintaining.texi (Tag Syntax): Now --members is the default for
        etags, not for ctags yet.
 
-2007-02-04  David Kastrup  <dak@gnu.org>
-
-       * faq.texi (AUCTeX): Update version number.  Should probably be done
-       for other packages as well.
-
 2007-02-03  Eli Zaretskii  <eliz@gnu.org>
 
        * emacs.texi (Top): Update the top-level menus.  Make the detailed menu
        * frames.texi (Secondary Selection): Window clicked does not matter
        when mouse-yank-at-point is non-nil.
 
-2007-01-28  Andreas Seltenreich  <uwi7@rz.uni-karlsruhe.de>
-
-       * gnus.texi (Batching Agents): Fix example.  Reported by Tassilo Horn
-       <tassilo@member.fsf.org>.
-
-2007-01-27  Eli Zaretskii  <eliz@gnu.org>
-
-       * msdog.texi (ls in Lisp): Document ls-lisp-format-time-list and
-       ls-lisp-use-localized-time-format.
-
-2007-01-20  Markus Triska  <markus.triska@gmx.at>
-
-       * flymake.texi (Flymake mode): find-file-hook instead of ...-hooks.
-
-2007-01-13  Michael Olson  <mwolson@gnu.org>
-
-       * erc.texi (Modules): Mention capab-identify module.
-
 2007-01-16  Glenn Morris  <rgm@gnu.org>
 
        * abbrevs.texi (Editing Abbrevs): Describe how to disable a
 
        * building.texi (Watch Expressions): Describe gdb-max-children.
 
-2007-01-05  Michael Olson  <mwolson@gnu.org>
-
-       * erc.texi (Getting Started): Update for /RECONNECT command.
-
 2007-01-04  Richard Stallman  <rms@gnu.org>
 
-       * ebrowse.texi: Change C-c b to C-c C-m.
-
        * msdog.texi (Windows Keyboard): Clarify previous change.
 
-2007-01-03  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus.texi (Customizing Articles): Use index entries for gnus-treat-*
-       variables only in info to avoid redundant entries in the printed
-       manual.
-
 2007-01-02  Richard Stallman  <rms@gnu.org>
 
        * custom.texi (Changing a Variable): Minor clarification.
 
        * xresources.texi (Resources): Minor fix.
 
-2007-01-02  Daiki Ueno  <ueno@unixuser.org>
-
-       * message.texi (Using PGP/MIME): Document gpg-agent usage.
-
-2007-01-02  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * message.texi (Security): Split into sub-nodes.
-
-2007-01-01  Alan Mackenzie  <acm@muc.de>
-
-       * cc-mode.texi ("Limitations and Known Bugs"): Document problems with
-       eval-after-load in Emacs <=21 and a workaround.  Document that
-       trigraphs are not supported.
-
-2007-01-01  Alan Mackenzie  <acm@muc.de>
-
-       * cc-mode.texi ("Filling and Breaking"): Amend the doc for
-       c-context-line-break.  When invoked within a string, preserve
-       whitespace.  Add a backslash only when also in a macro.
-
-2007-01-01  Alan Mackenzie  <acm@muc.de>
-
-       * cc-mode.texi ("Choosing a Style"): Mention c-file-style.
-
-2007-01-01  Alan Mackenzie  <acm@muc.de>
-
-       * cc-mode.texi ("Movement Commands", "Sample .emacs File"): C-M-[ae]
-       are now bound by default to c-\(beginning\|end\)-of-defun by default.
-
-2007-01-01  Alan Mackenzie  <acm@muc.de>
-
-       * cc-mode.texi ("Other Commands"): Move c-set-style (C-c .) here from
-       "Choosing a Style".
-
-       * cc-mode.texi ("Styles"): Add @dfn{style}.
-
 2007-01-01  Jan Dj\e,Ad\e(Brv  <jan.h.d@swipnet.se>
 
        * xresources.texi (Table of Resources): Add scrollBarWidth resource.
        * xresources.texi (Table of Resources): Mention grow-only value for
        auto-resize-tool-bars.
 
-2006-12-30  Michael Albinus  <michael.albinus@gmx.de>
-
-       Sync with Tramp 2.0.55.
-
-       * trampver.texi: Update release number.
-
-2006-12-29  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus.texi (Customizing Articles): Add index entries for all
-       gnus-treat-* variables.
-
-2006-12-29  Jouni K. Sepp\e,Ad\e(Bnen  <jks@iki.fi>
-
-       * gnus.texi (IMAP): Fix incorrect explanation of
-       nnimap-search-uids-not-since-is-evil in documentation for
-       nnimap-expunge-search-string.
-
-2006-12-27  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus.texi (ifile spam filtering): Rename spam-ifile-database-path to
-       spam-ifile-database.
-
-2006-12-26  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus.texi (Spam Package Configuration Examples): Don't encourage to
-       rebind C-s.
-
-2006-12-26  Jouni K. Sepp\e,Ad\e(Bnen  <jks@iki.fi>
-
-       * gnus.texi (Group Parameters, Group Maintenance, Topic Commands)
-       (Mail Group Commands, Expiring Mail, IMAP): Add index entries for
-       "expiring mail".
-       (IMAP): Document nnimap-search-uids-not-since-is-evil and
-       nnimap-nov-is-evil.
-
 2006-12-27  Eli Zaretskii  <eliz@gnu.org>
 
        * msdog.texi (Windows Keyboard): Mention widespread Windows bindings,
        (Word and Line Mouse): Likewise.
        (Secondary Selection, Clipboard): Nodes demoted.
 
-2006-12-25  Kevin Ryde  <user42@zip.com.au>
-
-       * cl.texi (Sorting Sequences): In sort*, add a little cautionary note
-       about the key procedure being used heavily.
-
-2006-12-24  Chong Yidong  <cyd@stupidchicken.com>
-
-       * pgg.texi (Caching passphrase): Default for pgg-gpg-use-agent changed
-       to t.
-       (Prerequisites): Add explanation about gpg-agent.
-
 2006-12-24  Kevin Ryde  <user42@zip.com.au>
 
        * calendar.texi (Holidays): US daylight saving begins second Sunday
        * search.texi (Regexp Search): Explain why forward and reverse regexp
        search are not mirror images.
 
-2006-12-22  Kevin Ryde  <user42@zip.com.au>
-
-       * cl.texi (Sorting Sequences): Typo in sort*, example showed plain
-       "sort" instead of "sort*".
-
-2006-12-19  Richard Stallman  <rms@gnu.org>
-
-       * calc.texi (History and Acknowledgements): Recognize that Emacs
-       now does have floating point.
-
 2006-12-19  Kim F. Storm  <storm@cua.dk>
 
        * major.texi (Choosing Modes): Describe match-function elements for
        magic-mode-alist.
 
-2006-12-19  Michael Albinus  <michael.albinus@gmx.de>
-
-       * tramp.texi (External transfer methods): Describe new method `scpc'.
-
 2006-12-18  Eli Zaretskii  <eliz@gnu.org>
 
        * msdog.texi (Windows Keyboard): Add a footnote about "Windows" keys
 
        * abbrevs.texi (Editing Abbrevs): Fix previous change.
 
-2006-12-17  Sascha Wilde  <wilde@sha-bang.de>
-
-       * pgg.texi: Added short note on gpg-agent to the introduction.
-
 2006-12-17  Alan Mackenzie  <acm@muc.de>
 
        * programs.texi (Left Margin Paren): Remove the bit which says
 
        * text.texi (HTML Mode): Fix "C-c TAB".
 
-2006-12-13  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus.texi (Hiding Headers): Document that `long-to' and `many-to'
-       also applies to Cc.
-
-2006-12-12  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus.texi (X-Face): Clarify.  Say which programs are required
-       on Windows.
-
 2006-12-09  Richard Stallman  <rms@gnu.org>
 
        * misc.texi (Invoking emacsclient): Simplify TCP file text.
        (Invoking emacsclient): Add index entries.  Document both short and
        long versions of command-line options.  Document the -f option.
 
-2006-12-08  Michael Olson  <mwolson@gnu.org>
-
-       * erc.texi (Modules): Remove documentation for list module.
-
 2006-12-06  Richard Stallman  <rms@gnu.org>
 
        * text.texi (Outline Format): Say to set outline-regexp
        * anti.texi (Antinews): Mention the alternative to
        `~/.emacs_SHELLNAME', which is `~/.emacs.d/init_SHELLNAME.sh'.
 
-       * faq.texi (^M in the shell buffer): Ditto.
-
        * misc.texi (Interactive Shell): Ditto.
 
 2006-12-04  Eli Zaretskii  <eliz@gnu.org>
 
        * anti.texi (Antinews): Mention --server-file and TCP sockets.
 
-2006-11-20  Michael Olson  <mwolson@gnu.org>
-
-       * erc.texi: Call this the 5.2 stable pre-release of ERC.
-
 2006-11-18  Chong Yidong  <cyd@stupidchicken.com>
 
        * misc.texi (Interactive Shell): INSIDE_EMACS is set to t,
 
        * xresources.texi: Merge text from xresmini.texi.
 
-2006-11-17  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi: Fix typos.
-       (Agenda commands): Document `C-k'.
-
-2006-11-16  Eli Zaretskii  <eliz@gnu.org>
-
-       * url.texi (http/https): Fix a typo in the HTTP URL.
-
-2006-11-14  Stephen Leake  <stephen_leake@stephe-leake.org>
-
-       * ada-mode.texi: Total rewrite.
-
-2006-11-13  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi: Minor typo fixes.
-
-2006-11-13  Bill Wohler  <wohler@newt.com>
-
-       Release MH-E manual version 8.0.3.
-
-       * mh-e.texi (VERSION, EDITION, UPDATED, UPDATE-MONTH): Update for
-       release 8.0.3.
-
-       * mh-e.texi (Incorporating Mail): Use output of "mhparam Path"
-       to set MAILDIR.
-       (Reading Mail): Document the customization of read-mail-command
-       for MH-E.
-       (Viewing Attachments): Document mm-discouraged-alternatives.
-       (Tool Bar): Fix Texinfo for mh-xemacs-use-tool-bar-flag.
-       (Junk): Add more information about the settings of mh-junk-background
-       in a program.  Add /usr/bin/mh to PATH in examples.
-
-2006-11-12  Richard Stallman  <rms@gnu.org>
-
-       * woman.texi: Update author address but say he no longer maintains it.
-
 2006-11-12  Roberto Rodr\e,Am\e(Bguez  <lanubeblanca@googlemail.com>  (tiny change)
 
        * glossary.texi: Fix typos.
 
-2006-11-10  Carsten Dominik  <carsten.dominik@gmail.com>
-
-       * org.texi (ARCHIVE tag): Document C-TAB for forcing cycling of
-       archived trees.
-       (Checkboxes): Section moved to chapter 5, and extended.
-       (The date/time prompt): New section.
-       (Link abbreviations): New section.
-       (Presentation and sorting): New section.
-       (Custom agenda views): Section completely rewritten.
-       (Summary): Compare with Planner.
-       (Feedback): More info about creating backtraces.
-       (Plain lists): Modified example.
-       (Breaking down tasks): New section.
-       (Custom time format): New section.
-       (Time stamps): Document inactive timestamps.
-       (Setting tags): More details about fast tag selection.
-       (Block agenda): New section.
-       (Custom agenda views): Section rewritten.
-       (Block agenda): New section.
-
-2006-11-07  Michael Albinus  <michael.albinus@gmx.de>
-
-       * tramp.texi (Configuration): scp is the default method.
-       (Default Method): Use ssh as example for another method.
-
 2006-11-06  Richard Stallman  <rms@gnu.org>
 
        * emacs.texi (Acknowledgments): Fix name spelling, add Anna Bigatti.
        * emacs.texi (Top): Rename old node "LaTeX Calendar" to "Writing
        Calendar Files."
 
-2006-10-27  Richard Stallman  <rms@gnu.org>
-
-       * woman.texi: Downcase nroff/troff/roff.
-       (Installation): Chapter deleted.  Some xrefs deleted.
-       (Background): woman doesn't advise man ;-).
-
-2006-10-26  Roberto Rodr\e,Am\e(Bguez  <lanubeblanca@googlemail.com>  (tiny change)
-
-       * ada-mode.texi (Project files, Identifier completion)
-       (Automatic Casing, Debugging, Using non-standard file names)
-       (Working Remotely): Fix typos.
-
 2006-10-23  Richard Stallman  <rms@gnu.org>
 
        * abbrevs.texi (Expanding Abbrevs): Expansion happens only when
        Abbrev mode is enabled.
 
-2006-10-20  Masatake YAMATO  <jet@gyve.org>
-
-       * cc-mode.texi (Sample .emacs File): Added missing `)' in
-       sample code `my-c-initialization-hook'.
-
-2006-10-19  Stuart D. Herring  <herring@lanl.gov>
-
-       * widget.texi: Fix typos.
-
-2006-10-19  Michael Albinus  <michael.albinus@gmx.de>
-
-       * tramp.texi (Frequently Asked Questions): Remove questions marked with
-       "???".  There have been no complaints for years, so the information
-       must be appropriate.
-
 2006-10-16  Richard Stallman  <rms@gnu.org>
 
-       * widget.texi: Use @var instead of capitalization.
-       Clarify many widget type descriptions.
-
        * emacs.texi: Update ISBN.
 
-2006-10-13  Andreas Seltenreich  <uwi7@rz.uni-karlsruhe.de>
-
-       * gnus.texi (Other modes): Fix typo.  Add alternative index entry for
-       gnus-dired-attach.
-       (Selecting a Group): Fix typo.
-
-2006-10-12  Roberto Rodr\e,Am\e(Bguez  <lanubeblanca@googlemail.com>  (tiny change)
-
-       * widget.texi: Fix typos.
-
 2006-10-11  Kim F. Storm  <storm@cua.dk>
 
        * emacs.texi (Acknowledgments): Use @dotless{i}.
 
        * emacs.texi (Acknowledgments): Fix bad @/ form.
 
-2006-10-06  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus.texi (Image Enhancements): Update for Emacs 22.
-
-       * gnus-faq.texi ([1.3]): Update.
-
-2006-10-06  Richard Stallman  <rms@gnu.org>
-
-       * faq.texi (Displaying the current line or column):
-       Delete "As of Emacs 20".
-
-2006-10-06  Romain Francoise  <romain@orebokech.com>
-
-       * faq.texi (VM): VM works with Emacs 22 too.
-
-2006-10-06  Richard Stallman  <rms@gnu.org>
-
-       * ebrowse.texi: Remove Emacs version "21" from title.
-
 2006-10-05  Kim F. Storm  <storm@cua.dk>
 
        * emacs.texi (Acknowledgments): Add more contributors.
 
        * emacs.texi (Acknowledgments): Update version and edition.
 
-2006-10-02  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus.texi (Foreign Groups): Say where change of editing commands are
-       stored.  Add reference to `gnus-parameters'.
-
 2006-10-01  Karl Berry  <karl@gnu.org>
 
        * custom.texi (Customization Groups): Page break to keep example buffer
 
 2006-09-15  Jay Belanger  <belanger@truman.edu>
 
-       * calc.texi, emacs.texi, mh-e.texi (GNU GENERAL PUBLIC LICENSE):
+       * emacs.texi (GNU GENERAL PUBLIC LICENSE):
        Change "Library Public License" to "Lesser Public License"
        throughout.  Use "yyyy" to represent year.
 
-2006-09-15  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi (Setting tags): Typo fix.
-
-2006-09-14  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus.texi (Oort Gnus): Add @xref for `mm-fill-flowed'.
-
 2006-09-12  Reiner Steib  <Reiner.Steib@gmx.de>
 
        * files.texi (Visiting): Add index entry "open file".
 
-       * reftex.texi (Citations Outside LaTeX): Simplify lisp example.
-
-2006-09-12  Paul Eggert  <eggert@cs.ucla.edu>
-
-       * faq.texi (Escape sequences in shell output): EMACS is now set
-       to Emacs's absolute file name, not to "t".
-       (^M in the shell buffer): Likewise.
-       * misc.texi (Interactive Shell): Likewise.
-
 2006-09-11  Richard Stallman  <rms@gnu.org>
 
        * building.texi (Compilation Mode): Clarification.
        (Grep Searching): Add xref to Compilation Mode.
 
-2006-09-11  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus.texi (Mail Source Specifiers): Mention problem of duplicate
-       mails with pop3-leave-mail-on-server.  Fix wording.
-       (Limiting): Improve gnus-summary-limit-to-articles.
-       (X-Face): Fix typo.
-
-2006-09-11  Simon Josefsson  <jas@extundo.com>
-
-       * smtpmail.texi (Authentication): Explain TLS and SSL better, based on
-       suggested by Phillip Lord <phillip.lord@newcastle.ac.uk>.
-
 2006-09-08  Richard Stallman  <rms@gnu.org>
 
        * search.texi (Search): Ref multi-file search commands here.
        (Other Repeating Search): Not here.
 
-2006-09-06  Simon Josefsson  <jas@extundo.com>
-
-       * smtpmail.texi (Authentication): Mention SSL.
-
-2006-09-01  Eli Zaretskii  <eliz@gnu.org>
-
-       * rcirc.texi (Internet Relay Chat, Useful IRC commands):
-       Don't use @indicateurl.
-
-       * cc-mode.texi (Subword Movement): Don't use @headitem.
-       (Custom Braces, Clean-ups): Don't use @tie.
-
-2006-08-29  Michael Albinus  <michael.albinus@gmx.de>
-
-       Sync with Tramp 2.0.54.
-
-       * tramp.texi (Bug Reports): The Tramp mailing list is moderated now.
-       Suggested by Adrian Phillips <a.phillips@met.no>.
-
 2006-08-28  Richard Stallman  <rms@gnu.org>
 
        * windows.texi (Split Window): Update xref.
 
        * help.texi (Help Mode): Move node up in file.
 
-2006-08-15  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi (Installation, Activation): Split from Installation and
-       Activation.
-       (Clocking work time): Documented new features.
-
 2006-08-15  Nick Roberts  <nickrob@snap.net.nz>
 
        * building.texi (Stack Buffer): Explain fringe arrow.
 
-2006-08-13  Alex Schroeder  <alex@gnu.org>
-
-       * rcirc.texi (Configuration): Use correct variable in rcirc-authinfo
-       example.
-
 2006-08-12  Eli Zaretskii  <eliz@gnu.org>
 
-       * faq.texi (How to add fonts): New node.
-
        * misc.texi (Saving Emacs Sessions): Clarify when desktop is restored
        on startup.
 
        * dired.texi (Marks vs Flags): Fix typo reported by Ari Roponen
        <arjuropo@cc.jyu.fi>.
 
-2006-08-05  Romain Francoise  <romain@orebokech.com>
-
-       * faq.texi (New in Emacs 22): Expand.
-
 2006-08-04  Eli Zaretskii  <eliz@gnu.org>
 
        * cmdargs.texi (Window Size X) <--geometry>: Only width and height
        apply to all frames.
 
-2006-08-03  Michael Olson  <mwolson@gnu.org>
-
-       * erc.texi: Update for ERC 5.1.4.
-
 2006-08-01  Richard Stallman  <rms@gnu.org>
 
        * help.texi (Name Help): Add index entries for describe-variable.
 
        * search.texi (Query Replace): Add xref for Dired's Q command.
 
-2006-07-28  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * gnus.texi (Oort Gnus): Mention that the Lisp files are now installed
-       in .../site-lisp/gnus/ by default.
-       [ From gnus-news.texi in the trunk. ]
-
-2006-07-27  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus.texi (MIME Commands): Additions for yEnc.
-
 2006-07-31  Nick Roberts  <nickrob@snap.net.nz>
 
        * building.texi (GDB commands in Fringe): Rename to...
 
        * xresources.texi (GTK styles): Fix texinfo usage.
 
-       * pgg.texi, org.texi, info.texi, forms.texi, flymake.texi:
-       * faq.texi: Move periods and commas inside quotes.
-
        * commands.texi (User Input): Explain why we teach keyboard cmds.
 
        * xresources.texi, xresmini.texi, search.texi, programs.texi:
        * frames.texi (Frame Commands): Mention that focus-follows-mouse
        doesn't have effect on MS-Windows.
 
-2006-07-20  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi (Error forms): Mention M-+ keybinding for `calc-plus-minus'.
-
-2006-07-18  Chong Yidong  <cyd@stupidchicken.com>
-
-       * faq.texi (Security risks with Emacs): Document Emacs 22
-       file-local-variable mechanism.
-
 2006-07-17  Richard Stallman  <rms@gnu.org>
 
        * building.texi (Grep Searching): Explain about chaining grep commands.
 
-2006-07-12  Michael Olson  <mwolson@gnu.org>
-
-       * erc.texi: Update for ERC 5.1.3.
-
-2006-07-12  Alex Schroeder  <alex@gnu.org>
-
-       * rcirc.texi: Fix typos.
-       (Getting started with rcirc): New calling convention for M-x irc.
-       Mention #rcirc.  Removed channel tracking.
-       (Configuration): Changed the names of all variables that got changed
-       recently, eg. rcirc-server to rcirc-default-server.  Added
-       documentation for rcirc-authinfo, some background for Bitlbee, and
-       rcirc-track-minor-mode.
-       (Scrolling conservatively): Fixed the xref from Auto Scrolling to just
-       Scrolling.
-       (Reconnecting after you have lost the connection): Fixed example code
-       to match code changes.
-
 2006-07-10  Nick Roberts  <nickrob@snap.net.nz>
 
-       * killing.texi, gnus.texi, message.texi, mini.texi: Fix typos.
+       * killing.texi, mini.texi: Fix typos.
 
 2006-07-09  Chong Yidong  <cyd@stupidchicken.com>
 
        (Windows Misc) [@iftex]: Add an @inforef to the on-line manual for the
        rest of this node.
 
-2006-07-07  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi (Exporting): Document `C-c C-e' as the prefix for exporting
-       commands.
-       (Global TODO list): Document the use of the variables
-       `org-agenda-todo-ignore-scheduled' and
-       `org-agenda-todo-list-sublevels'.
-
-2006-07-05  Richard Stallman  <rms@gnu.org>
-
-       * faq.texi (Scrolling only one line): Fix xref.
-
 2006-07-05  Thien-Thi Nguyen  <ttn@gnu.org>
 
-       * building.texi (Lisp Eval):
-       * faq.texi (Evaluating Emacs Lisp code):
-       Throughout, replace eval-current-buffer with eval-buffer.
+       * building.texi (Lisp Eval): Throughout, replace eval-current-buffer
+       with eval-buffer.
 
 2006-07-05  Nick Roberts  <nickrob@snap.net.nz>
 
 
 2006-07-03  Richard Stallman  <rms@gnu.org>
 
-       * rcirc.texi (Scrolling conservatively): Fix xref.
-
-       * pcl-cvs.texi (Viewing differences): Usage fix.
-
        * search.texi (Other Repeating Search): filename -> file name.
 
        * misc.texi (Narrowing): Minor cleanups.
 
        * help.texi, m-x.texi: Lots of cleanups.
 
-2006-07-03  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi (Agenda commands): Document `s' key to save all org-mode
-       buffers.
-
 2006-06-30  Eli Zaretskii  <eliz@gnu.org>
 
        * msdog.texi (ls in Lisp, Windows Keyboard, Windows Mouse)
        (Windows Processes, Windows Misc): Shorten the printed version by
        selectively conditioning less important portions by @ifnottex.
 
-2006-06-30  Ralf Angeli  <angeli@caeruleus.net>
-
-       * pcl-cvs.texi (Customizing Faces): Remove -face suffix from face
-       names.  Mention `cvs-msg' face.
-
-2006-06-29  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi (Checkboxes): New section.
-
-2006-06-28  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi (Embedded LaTeX): Fix typos and implement small improvements
-       throughout this chapter.
-
-2006-06-27  Chong Yidong  <cyd@stupidchicken.com>
-
-       * info.texi (Help-Small-Screen): Clarify placement of "All" and "Top"
-       text for standalone vs Emacs info.
-       (Help): Clarify header line description.  Use mouse-1 for clicks.
-       (Help-P): Use mouse-1 for clicks.
-       (Help-^L): "Top" and "All" not displayed with dashes in Emacs.
-       (Help-^L, Help-M, Help-Int, Search Index, Go to node)
-       (Choose menu subtopic): Remove gratuitous Emacs command names.
-       (Help-FOO): Put usual behavior first.
-       (Help-Xref): Clicking on xrefs works in Emacs.
-       (Search Text): Clarify what the default behavior is.
-       (Create Info buffer): Fix Emacs window/X window confusion.
-       (Emacs Info Variables): Fix for new Emacs init file behavior.
-
 2006-06-27  Richard Stallman  <rms@gnu.org>
 
        * mini.texi (Minibuffer File): Minor cleanup.
        * files.texi (Visiting): Document case-insensitive wildcard matching
        under find-file-wildcards.
 
-2006-06-24  Andreas Seltenreich  <uwi7@rz.uni-karlsruhe.de>
-
-       * gnus.texi (Summary Buffer Lines): Fix typo.
-
-2006-06-23  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi (Embedded LaTeX): New chapter.
-       (Archiving): Section rewritten.
-       (Enhancing text): Some parts moved to the new chapter about LaTeX.
-
-2006-06-20  Bill Wohler  <wohler@newt.com>
-
-       Release MH-E manual version 8.0.1.
-
-       * mh-e.texi (VERSION, EDITION, UPDATED, UPDATE-MONTH): Update for
-       release 8.0.1.
-       (Preface): Depend on GNU mailutils 1.0 and higher.
-
-2006-06-19  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * message.texi (News Headers): Update message-syntax-checks section.
-
-2006-06-19  Karl Berry  <karl@gnu.org>
-
-       * info.texi (Advanced): Mention C-q, especially with ?.
-
-2006-06-19  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi (Publishing links): Document the `:link-validation-function'
-       property.
-       (Extensions and Hacking): New chapter, includes some sections of the
-       "Miscellaneous" chapter.
-
 2006-06-16  YAMAMOTO Mitsuharu  <mituharu@math.s.chiba-u.ac.jp>
 
        * macos.texi (Mac Input): Add description of mac-function-modifier.
        Now Unicode keyboard layouts work.
 
-2006-06-10  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi (Progress logging): New section.
-
 2006-06-10  Richard Stallman  <rms@gnu.org>
 
        * mule.texi (Recognize Coding): Clarify previous change.
 
 2006-05-29  Stefan Monnier  <monnier@iro.umontreal.ca>
 
-       * viper.texi (Viper Specials):
        * programs.texi (Comment Commands):
-       * gnus.texi (Example Setup):
-       * faq.texi (Backspace invokes help):
-       * dired-x.texi (Optional Installation Dired Jump):
        * custom.texi (Specifying File Variables):
-       * calc.texi (Defining Simple Commands): Use ;; instead of ;;; to better
-       follow coding conventions.
-
-2006-05-18  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus.texi (Saving Articles): Clarify gnus-summary-save-article-mail.
+       Use ;; instead of ;;; to better follow coding conventions.
 
 2006-06-07  Nick Roberts  <nickrob@snap.net.nz>
 
        (GDB Graphical Interface): Move description of clicks in fringe...
        (GDB commands in the Fringe): ...to here.  New node.
 
-2006-06-06  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi (ASCII export): Document indentation adaptation.
-       (Setting tags): Document mutually-exclusive tags.
-
 2006-06-05  Romain Francoise  <romain@orebokech.com>
 
-       * url.texi (irc): Mention new funs `url-irc-rcirc' and `url-irc-erc'.
-       Fix typo.
-
-       * gnus-faq.texi (Question 8.6): Update reference to the Gnus
-       channel (#gnus@irc.freenode.net).
-       Fix typos.  Update copyright notice.
-
-       * cc-mode.texi (Getting Started, Indentation Commands, Config Basics)
-       (Custom Filling and Breaking, Custom Braces, Syntactic Symbols)
-       (Line-Up Functions, Custom Macros):
-       * ediff.texi (Window and Frame Configuration)
-       (Highlighting Difference Regions, Highlighting Difference Regions):
-       * emacs-mime.texi (Display Customization):
-       * erc.texi (History):
-       * eshell.texi (Known problems):
-       * eudc.texi (Overview, BBDB):
-       * gnus.texi (NNTP, IMAP, Advanced Scoring Examples)
-       (The problem of spam, SpamOracle, Extending the Spam package)
-       (Conformity, Terminology):
-       * idlwave.texi (Routine Info, Routine Info)
-       (Class and Keyword Inheritance, Padding Operators)
-       (Breakpoints and Stepping, Electric Debug Mode)
-       (Examining Variables, Troubleshooting):
-       * org.texi (Creating timestamps):
-       * reftex.texi (Commands, Options, Changes):
-       * tramp.texi (Inline methods, Password caching)
-       (Auto-save and Backup, Issues):
-       * vip.texi (Files, Commands in Insert Mode):
-       * viper.texi (Emacs Preliminaries, States in Viper)
-       (Packages that Change Keymaps, Viper Specials, Groundwork):
-       * xresmini.texi (GTK resources):
-       Fix various typos.
+       * xresmini.texi (GTK resources): Fix various typos.
 
 2006-06-05  Nick Roberts  <nickrob@snap.net.nz>
 
 
        * screen.texi (Menu Bar): Change menu-bar-start to menu-bar-open.
 
-2006-05-31  Michael Ernst  <mernst@alum.mit.edu>
-
-       * ediff.texi: Fix typos.
-
 2006-05-31  Richard Stallman  <rms@gnu.org>
 
        * basic.texi (Moving Point): Fix previous change.
 
-2006-05-30  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi: Small typo fixes.
-
-2006-05-29  Michael Albinus  <michael.albinus@gmx.de>
-
-       * tramp.texi (Frequently Asked Questions): Disable zsh zle.
-
 2006-05-29  Jan Dj\e,Ad\e(Brv  <jan.h.d@swipnet.se>
 
        * screen.texi (Menu Bar): F10 for Gtk+/Lesstif/Lucid menus.
 
        * basic.texi: Many simplifications and improvements in wording.
 
-2006-05-27  Thien-Thi Nguyen  <ttn@gnu.org>
-
-       * pcl-cvs.texi: Fix typos.
-       (Customization): Say "us".
-
-2006-05-26  Eli Zaretskii  <eliz@gnu.org>
-
-       * org.texi: Remove bogus @setfilename.
-
-2006-05-26  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi (ASCII export): Omit command name.
-       (HTML export): Add prefix to all lines in Local Variable example.
-       (Acknowledgments): Typeset names in italics.
-
 2006-05-26  Nick Roberts  <nickrob@snap.net.nz>
 
        * anti.texi (Antinews): Create a node for gdb-ui.
 
-2006-05-24  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi (Plain lists): Add new item navigation commands.
-       (External links): Document elisp and info links.
-       (Custom searches): New section.
-       (Publishing): New chapter.
-       (HTML export): Include a list of supported CSS classes.
-       (Setting tags): Describe the fast-tag-setting interface.
-
 2006-05-22  Reiner Steib  <Reiner.Steib@gmx.de>
 
        * frames.texi (Menu Bars, Tool Bars): Add index entries.
 
        * dired.texi (Dired Navigation): dired-goto-file is now j.
 
-2006-05-20  Luc Teirlinck  <teirllm@auburn.edu>
-
-       * dired-x.texi: ifinfo -> ifnottex.
-
 2006-05-20  Eli Zaretskii  <eliz@gnu.org>
 
        * mule.texi (Coding Systems): Mention the undecided-* coding systems
        * emacs.texi (Copying):
        * custom.texi (Init File): ifinfo -> ifnottex.
 
-2006-05-18  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus.texi (Saving Articles): Clarify gnus-summary-save-article-mail.
-
 2006-05-17  Richard Stallman  <rms@gnu.org>
 
        * files.texi (Diff Mode): Mention C-x `.
 
        * custom.texi (Disabling): Textual cleanups.
 
-2006-05-12  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * message.texi (Interface): Add tool bar customization.
-       (MIME): Index and text additions for mml-attach.
-       (MIME): Describe mml-dnd-protocol-alist and
-       mml-dnd-attach-options.
-
-       * gnus.texi (Oort Gnus): Reorder entries in sections.
-       Fix some entries.
-       (Starting Up): Add references to "Emacs for Heathens" and to
-       "Finding the News".  Add user-full-name and user-mail-address.
-       (Group Buffer Format): Add tool bar customization and update.
-       (Summary Buffer): Add tool bar customization.
-       (Posting Styles): Add message-alternative-emails.
-
 2006-05-12  Glenn Morris  <rgm@gnu.org>
 
        * calendar.texi (Displaying the Diary, Format of Diary File):
        * mule.texi (Coding Systems, Text Coding): More indexing.
        Mention that C-x RET f can set eol conversion.
 
-2006-05-09  Michael Albinus  <michael.albinus@gmx.de>
-
-       * tramp.texi (Filename completion): Improve wording.
-
 2006-05-07  Jan Dj\e,Ad\e(Brv  <jan.h.d@swipnet.se>
 
        * xresmini.texi (GTK resources): Insert GTK description.
 
        * xresources.texi (GTK resources): metafont should be menufont.
 
-2006-05-07  Romain Francoise  <romain@orebokech.com>
-
-       * faq.texi (Using regular expressions): Fix typo.
-       (Packages that do not come with Emacs): Fix capitalization.
-       (Replacing text across multiple files): Expand node to explain how
-       to use `dired-do-query-replace-regexp' in more detail, based on
-       suggestion by Eric Hanchrow <offby1@blarg.net>.
-
 2006-05-06  Michael Albinus  <michael.albinus@gmx.de>
 
-       * mini.texi (Completion Options):
-       * tramp.texi (Filename completion): Completion of remote files'
+       * mini.texi (Completion Options): Completion of remote files'
        method, user name and host name is active only in partial
        completion mode.
 
-2006-05-06  Bill Wohler  <wohler@newt.com>
-
-       Release MH-E manual version 8.0.
-
-       * mh-e.texi (VERSION, EDITION, UPDATED, UPDATE-MONTH): Update for
-       release 8.0.
-
-2006-05-06  Bill Wohler  <wohler@newt.com>
-
-       * mh-e.texi (MH-BOOK-HOME): Change from
-       http://www.ics.uci.edu/~mh/book/mh to
-       http://rand-mh.sourceforge.net/book/mh.
-       Replace .htm suffix with .html for MH book files.
-       (Using This Manual): Update key binding for getting relevant
-       chapter in Info from command key.
-       (Ranges): Fix itemx.
-
 2006-05-06  Eli Zaretskii  <eliz@gnu.org>
 
        * makefile.w32-in (emacs.dvi):
 
 2006-05-05  Karl Berry  <karl@gnu.org>
 
-       * texinfo.tex (\definetextfonsizexi, \definetextfonsizex): New cmds.
-       (\fonttextsize): New user-level command to change text font size.
        * emacs.texi: Call @fonttextsize 10, inside @tex to avoid
        errors from the current release of makeinfo (4.8).
        * help.texi (Library Keywords): Change widest word in multitable
 
        * building.texi (Grep Searching): Add lgrep and rgrep.
 
-2006-04-26  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * pgg.texi (Caching passphrase): Fix markup and typos.  Simplify.
-
-2006-04-26  Sascha Wilde  <wilde@sha-bang.de>  (tiny change)
-
-       * pgg.texi (Caching passphrase): Add pgg-gpg-use-agent.
-
-2006-04-24  Bill Wohler  <wohler@newt.com>
-
-       * mh-e.texi (Getting Started): Make it more explicit that you need
-       to install MH.  Add pointers to current MH implementations.
-
 2006-04-23  Richard Stallman  <rms@gnu.org>
 
        * emacs.texi [TeX]: Use xresmini.texi instead of xresources.texi.
        * xresources.texi (Face Resources): Split table into font resources
        and the rest.  Combine similar attributes for brevity.
 
-2006-04-21  Bill Wohler  <wohler@newt.com>
-
-       Release MH-E manual version 7.94.
-
-       * mh-e.texi (VERSION, EDITION, UPDATED, UPDATE-MONTH): Update for
-       release 7.94.
-
-2006-04-21  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi: Many small fixes.
-       (Handling links): Rename from "Managing links".
-
 2006-04-21  Eli Zaretskii  <eliz@gnu.org>
 
        * emacs-xtra.texi (MS-DOS File Names): Remove section about
        (Windows Processes, Windows System Menu): Add index entries and
        fix wording.
 
-2006-04-20  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus.texi (Spam Statistics Package): Fix typo in @pxref.
-       (Splitting mail using spam-stat): Fix @xref.
-
-2006-04-20  Chong Yidong  <cyd@stupidchicken.com>
-
-       * gnus.texi (Spam Package): Major revision of the text.
-       Previouly this node was "Filtering Spam Using The Spam ELisp Package".
-
-2006-04-20  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi (Time stamps): Better explanation of the purpose of
-       different time stamps.
-       (Structure editing, Plain lists): More details on how new items
-       and headings are inserted.
-
 2006-04-18  J.D. Smith  <jdsmith@as.arizona.edu>
 
        * misc.texi (Shell Ring): Add notes on saved input when
        * misc.texi (Shell Options): Correct default value of
        comint-scroll-show-maximum-output.
 
-2006-04-18  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi (Formula syntax): Fix link to Calc Manual.
-
-2006-04-17  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus.texi (Emacsen): Don't support Emacs 20.7 and XEmacs 21.1.
-
-2006-04-17  Bill Wohler  <wohler@newt.com>
-
-       * mh-e.texi (Folders): Update mh-before-quit-hook and
-       mh-quit-hook example with code that removes the buffers rather
-       than just bury them.
-
 2006-04-18  Nick Roberts  <nickrob@snap.net.nz>
 
        * building.texi (Watch Expressions): Update.
 
-2006-04-17  Michael Albinus  <michael.albinus@gmx.de>
-
-       Sync with Tramp 2.0.53.
-
-2006-04-13  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi (Updating settings): New section.
-       (Visibility cycling): Better names for the startup folding
-       options.
-       (Exporting): Completely restructured.
-       (The very busy C-c C-c key): New section.
-       (Summary of in-buffer settings): New section.
-
 2006-04-12  Richard Stallman  <rms@gnu.org>
 
        * search.texi: Clean up previous change.
        these nodes to emacs-xtra.texi, for brevity.
        * cmdargs.texi, files.texi: Change cross-references.
 
-2006-04-11  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus.texi, gnus-faq.texi, message.texi: Gnus v5.10.8 is released.
-
-2006-04-10  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus.texi (Misc Group Stuff, Summary Buffer, Article Keymap)
-       (Server Commands): Key `v' is reserved for users.
-
 2006-04-11  J.D. Smith  <jdsmith@as.arizona.edu>
 
        * files.texi (Old Versions): Update description of vc-annotate's
        use of color to indicate date ranges.
 
-2006-04-11  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi (Link format): New section, emphasis on bracket links.
-       (External links): Document bracket links.
-       (FAQ): Expand to cover shell links and the new link format.
-
 2006-04-09  Kevin Ryde  <user42@zip.com.au>
 
-       * org.texi (Formula syntax): Typo in node name of calc-eval xref.
-
        * sending.texi (Mail Sending): In send-mail-function @pxref smtpmail,
        put info and printed manual names the right way around.
 
        * emacs.texi: Move @summarycontents and @contents to the beginning
        of the file.
 
-2006-04-07  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus.texi (Summary Buffer Lines): Add `*'.
-
-2006-04-07  Jochen K\e,A|\e(Bpper  <jochen@fhi-berlin.mpg.de>
-
-       * gnus.texi (Group Parameters):
-       Mention gnus-permanently-visible-groups.
-
-2006-04-06  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * gnus.texi (Face): Fix typo.
-
-2006-04-05  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus.texi (X-Face): Clarify.
-       (Face): Need Emacs with PNG support.
-
 2006-04-08  Kevin Ryde  <user42@zip.com.au>
 
        * text.texi (Fill Commands): fill-nobreak-predicate is now a hook.
 
 2006-04-06  Richard Stallman  <rms@gnu.org>
 
-       * idlwave.texi: Delete the blocks "not suitable for inclusion with
-       Emacs".
-
        * programs.texi (Basic Indent): Clarify relationship of C-j to TAB.
 
 2006-04-06  Eli Zaretskii  <eliz@gnu.org>
 
        * killing.texi (Rectangles): Add index entry for marking a rectangle.
 
-2006-04-06  J.D. Smith  <jdsmith@as.arizona.edu>
-
-       * idlwave.texi: Updated for IDLWAVE version 6.0, factoring out
-       blocks not suitable for inclusion with Emacs using variable
-       PARTOFEMACS.
-
 2006-04-05  Richard Stallman  <rms@gnu.org>
 
        * emacs.texi (Top): Update subnode menu.
 
        * misc.texi (Thumbnails): Minor correction.
 
-2006-04-04  Simon Josefsson  <jas@extundo.com>
-
-       * gnus.texi (Security): Improve.
-
 2006-04-03  Richard Stallman  <rms@gnu.org>
 
        * misc.texi (Thumbnails): Minor cleanup.
 
        * texinfo.tex: Update to current version (2006-03-21.13).
 
-2006-04-02  Bill Wohler  <wohler@newt.com>
-
-       * mh-e.texi (Getting Started, Junk, Bug Reports)
-       (MH FAQ and Support): Fix URLs.
-
-2006-03-31  Romain Francoise  <romain@orebokech.com>
-
-       * gnus.texi (Virtual Groups): `nnvirtual-always-rescan' defaults
-       to t, not nil (and has for the past eight years).
-
 2006-03-31  Richard Stallman  <rms@gnu.org>
 
        * emacs.texi (Top): Update subnode menu.
        (Shell): Put eshell xref at the end.  Remove eshell from table.
        (Thumbnails): New node.
 
-2006-03-31  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * message.texi, gnus.texi: Bump version to 5.11.
-
-2006-03-29  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus.texi (Top): Add comment about version line.
-
-       * message.texi (Top): Ditto.  Change to take named versions into
-       account.
-
-2006-03-28  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus.texi (Posting Styles): Add x-face-file to example.
-       (X-Face): Refer to posting styles.
-
-       * gnus-faq.texi ([5.8]): Add x-face-file.
-       ([8.4]): Add links to gmane.emacs.gnus.user and
-       gmane.emacs.gnus.general.
-
 2006-03-28  Eli Zaretskii  <eliz@gnu.org>
 
        * files.texi (File Name Cache): Make it clear that the cache is
        not persistent.
 
-2006-03-27  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus-faq.texi: Use .invalid.
-       ([5.4]): Fix gnus-posting-styles example.
-
-2006-03-27  Romain Francoise  <romain@orebokech.com>
-
-       * faq.texi (Emacs/W3): Rename from `w3-mode'.  Mention that
-       Emacs/W3 needs a new maintainer.
-       (Ispell): Update author and version info.
-       (Mailcrypt): Mention PGG.
-       (New in Emacs 22): Add PGG to the list of new packages.
-       Include minor changes from "Ramprasad B" <ramprasad_i82@yahoo.com>
-       updating dead URLs.
-
 2006-03-25  Karl Berry  <karl@gnu.org>
 
-       * ada-mode.texi, autotype.texi, calc.texi, cc-mode.texi, cl.texi,
-       * dired-x.texi, ebrowse.texi, ediff.texi, emacs-mime.texi,
-       * emacs-xtra.texi, emacs.texi, erc.texi, eshell.texi, eudc.texi,
-       * faq.texi, forms.texi, gnu.texi, gnus.texi, idlwave.texi,
-       * info.texi, message.texi, mh-e.texi, pcl-cvs.texi, pgg.texi,
-       * rcirc.texi, reftex.texi, sc.texi, ses.texi, sieve.texi,
-       * speedbar.texi, url.texi, vip.texi, viper.texi, widget.texi,
-       * woman.texi: (1) use @copyright{} instead of (C) in typeset text;
+       * emacs-xtra.texi, emacs.texi, gnu.texi:
+       (1) use @copyright{} instead of (C) in typeset text;
        (2) do not indent copyright year list (or anything else).
 
-2006-03-21  Bill Wohler  <wohler@newt.com>
-
-       * mh-e.texi (Folders): Various edits.
-
-2006-03-20  Romain Francoise  <romain@orebokech.com>
-
-       * gnus.texi (Mail Folders): Grammar fix.
-
 2006-03-21  Juanma Barranquero  <lekktu@gmail.com>
 
        * files.texi (VC Dired Mode): Remove misplaced brackets.
 
        * help.texi (Help Mode): Document "C-c C-c".
 
-2006-03-19  Bill Wohler  <wohler@newt.com>
-
-       * mh-e.texi (Replying): Document Mail-Followup-To.
-       Change manually-formatted table to multitable.  Add debugging info.
-       Move description of mh-reply-default-reply-to into paragraph
-       that describes its values.
-
-2006-03-17  Bill Wohler  <wohler@newt.com>
-
-       * mh-e.texi: Use smallexample and smalllisp consistenly.
-       (Sending Mail Tour): Update method of entering
-       addresses and subject.
-       (Sending Mail Tour, Reading Mail Tour, Processing Mail Tour)
-       (Adding Attachments, Searching): Update screenshots for Emacs 22.
-
 2006-03-16  Luc Teirlinck  <teirllm@auburn.edu>
 
        * emacs-xtra.texi (Top): Avoid ugly continuation line in
 
        * emacs.texi (Top): Update node listings.
 
-2006-03-15  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi: Version number change only.
-
-2006-03-14  Bill Wohler  <wohler@newt.com>
-
-       * mh-e.texi: Add index entries around each paragraph rather than
-       depend on entries from beginning of node.  Doing so ensures that
-       index entries are less likely to be forgotten if text is cut and
-       pasted, and are necessary anyway if the references are on a
-       separate page.  It seems that makeinfo is now (v. 4.8) only
-       producing one index entry per node, so there is no longer any
-       excuse not to.  Use subheading instead of heading.  The incorrect
-       use of heading produced very large fonts in Info--as large as the
-       main heading.
-       (From Bill Wohler): MH-E never did appear in Emacs 21--MH-E
-       versions 6 and 7 appeared *around* the time of these Emacs releases.
-
-2006-03-13  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi (Clean view): Document new startup options.
-
 2006-03-12  Richard Stallman  <rms@gnu.org>
 
        * calendar.texi: Various cleanups.
 
-2006-03-11  Bill Wohler  <wohler@newt.com>
-
-       * mh-e.texi (Preface, More About MH-E, Options, HTML, Folders)
-       (Composing, Scan Line Formats): Fix @refs.
-       (Getting Started): Define MH profile and MH profile components.
-       (Incorporating Mail, Reading Mail, Viewing, Printing)
-       (Sending Mail, Forwarding, Editing Drafts, Inserting Letter)
-       (Signature, Aliases, Scan Line Formats): Use @code instead of @samp
-       for string constants.
-       (Tool Bar): Remove spurious quote.
-       (Junk): Use ``...'' instead of "...".
-       (Scan Line Formats): Replace @samp with @kbd.
-
 2006-03-11  Luc Teirlinck  <teirllm@auburn.edu>
 
        * search.texi (Regexps): Use @samp for regexp that is not in Lisp
        syntax.
 
-2006-03-10  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * gnus.texi (NoCeM): Mention gnus-use-nocem can also be a number.
-
-2006-03-10  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus.texi (Fancy Mail Splitting): Improve sentences so as to be
-       easy to understand.
-
-2006-03-09  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * gnus.texi: Markup fix.
-       (Fancy Mail Splitting): Specify new feature.
-
-2006-03-08  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * gnus.texi (Fancy Mail Splitting): Improve descriptions about
-       partial-words matching.
-
-2006-03-07  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * emacs-mime.texi (Display Customization): Reword image/.* stuff.
-
-       * gnus.texi (Oort Gnus): Add note about `gnus-load'.
-       (MIME Commands): Fix mm-discouraged-alternatives.
-
 2006-03-08  Luc Teirlinck  <teirllm@auburn.edu>
 
        * search.texi (Regexps): More accurately describe which characters
        are special in which situations.  Recommend _not_ to quote `]' or
        `-' when they are not special.
 
-2006-03-07  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi: Version number change only.
-
-2006-03-06  Bill Wohler  <wohler@newt.com>
-
-       * mh-e.texi: Move from SourceForge repository to Savannah.
-       This is version 7.93, which is a total rewrite from the previous
-       edition 1.3 for MH-E version 5.0.2, and corresponds to MH-E
-       version 7.93.
-
-2006-03-03  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus.texi (Oort Gnus): Add `mm-fill-flowed'.
-
-2006-03-01  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi (Interaction): Add item about `org-mouse.el' by
-       Piotr Zielinski.
-       (Managing links): Document that also mouse-1 can be used to
-       activate a link.
-       (Headlines, FAQ): Add entry about hiding leading stars.
-       (Miscellaneous): Resort the sections in this chapter to a more
-       logical sequence.
-
 2006-02-28  Andre Spiegel  <spiegel@gnu.org>
 
        * files.texi (Old Versions): Clarify operation of C-x v =.
 
-2006-02-27  Simon Josefsson  <jas@extundo.com>
-
-       * emacs-mime.texi (Flowed text): Add mm-fill-flowed.  (Sync
-       2004-01-27 from the trunk).
-
-2006-02-24  Alan Mackenzie  <bug-cc-mode@gnu.org>
-
-       * cc-mode.texi: Rename c-hungry-backspace to
-       c-hungry-delete-backwards, at the request of RMS.  Leave the old
-       name as an alias.
-
-2006-02-24  Alan Mackenzie  <bug-cc-mode@gnu.org>
-
-       * cc-mode.texi: Correct the definition of c-beginning-of-defun, to
-       include the function header within the defun.
-
-2006-02-24  Alan Mackenzie  <bug-cc-mode@gnu.org>
-
-       * cc-mode.texi: Correct two typos.
-
-2006-02-24  Alan Mackenzie  <bug-cc-mode@gnu.org>
-
-       * cc-mode.texi (Comment Commands): State that C-u M-; kills any
-       existing comment.
-       (Electric Keys): Add a justification for electric indentation.
-       (Hungry WS Deletion): Clear up the names and complications of the
-       BACKSPACE and DELETE keys.
-
-2006-02-23  Juri Linkov  <juri@jurta.org>
-
-       * faq.texi (Common requests): Move `Turning on auto-fill by
-       default' after `Wrapping words automatically'.  Move `Working with
-       unprintable characters' before `Searching for/replacing newlines'.
-       Move `Replacing highlighted text' after `Highlighting a region'.
-       Merge `Repeating commands' and `Repeating a command as many times
-       as possible' into the former.
-       (Packages that do not come with Emacs): Add refs to Gmane and
-       etc/MORE.STUFF.
-
-2006-02-23  Juri Linkov  <juri@jurta.org>
-
-       * faq.texi (Newsgroup archives): Update URLs of GNU mail archives.
-       (Reporting bugs): Suggest using `M-x report-emacs-bug'.
-       Add xref to `(emacs)Reporting Bugs'.
-       (Getting a printed manual): Add URL to other formats of the manual.
-       (Common requests): Fix menu.
-       (Highlighting a region): Remove ref to `Turning on syntax highlighting'.
-       (Horizontal scrolling): Mention `truncate-partial-width-windows'.
-       (Inserting text at the beginning of each line): Add pxref to
-       `Changing the included text prefix'.
-       (Forcing the cursor to remain in the same column): Mention `track-eol'
-       and `set-goal-column'.  Add pxref to `(emacs)Moving Point'.
-       (Replacing text across multiple files): Add keybinding `Q' for
-       `dired-do-query-replace'.
-
-2006-02-22  Carsten Dominik  <dominik@science.uva.nl>
-
-       * reftex.texi: Version number and date change only.
-
-       * org.texi (Internal Links): Rewrite to cover the modified
-       linking system.
-
 2006-02-21  Nick Roberts  <nickrob@snap.net.nz>
 
        * building.texi (Watch Expressions): Update and describe
 
        * building.texi (Watch Expressions): Update and be more precise.
 
-2006-02-17  Eli Zaretskii  <eliz@gnu.org>
-
-       * faq.texi: Remove the coding cookie, it's not needed anymore.
-
 2006-02-15  Francesco Potort\e,Al\e(B  <pot@gnu.org>
 
        * maintaining.texi (Create Tags Table): Explain why the
 2006-02-13  YAMAMOTO Mitsuharu  <mituharu@math.s.chiba-u.ac.jp>
 
        * display.texi (Standard Faces):
-       * faq.texi (Colors on a TTY):
        * files.texi (Visiting):
        * frames.texi (Clipboard):
        * glossary.texi (Glossary) <Clipboard>:
        * xresources.texi (X Resources): Mention Mac OS port.
 
-2006-02-12  Karl Berry  <karl@gnu.org>
-
-       * faq.texi (Emacs for Atari ST): Use Sch@"auble instead of the
-       8-bit accented a.
-
 2006-02-12  Richard M. Stallman  <rms@gnu.org>
 
        * building.texi (Building): Clarify topic in intro.
        * macos.texi (Mac International): Rename "fontset-mac" to
        "fontset-standard".
 
-2006-02-09  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus.texi (Gnus Versions): Add history beyond start of Oort.
-
 2006-02-09  Mathias Dahl  <mathias.dah@gmail.com>
 
        * dired.texi (Tumme): Basic documentation for Tumme added.
 
-2006-02-08  Romain Francoise  <romain@orebokech.com>
-
-       * faq.texi (Top): Remove paragraph about the FAQ being a
-       transitional document, etc.
-       (Searching for/replacing newlines): New node.
-       (Yanking text in isearch): New node.
-       (Inserting text at the beginning of each line): Rename and make
-       more general, mention `M-;' in Message mode.
-
 2006-02-07  Luc Teirlinck  <teirllm@auburn.edu>
 
        * mule.texi (International):
        * programs.texi (Basic Indent): Fix typos.
 
-       * faq.texi (Meta key does not work in xterm)
-       (Emacs does not display 8-bit characters)
-       (Inputting eight-bit characters):
        * custom.texi (Minor Modes):
        * display.texi (Text Display):
        * commands.texi (Text Characters): Update xrefs.
 
        * anti.texi: Minor cleanup.
 
-2006-02-06  Romain Francoise  <romain@orebokech.com>
-
-       * faq.texi (VM): VM now at version 7.19.
-       Set myself as maintainer of this file.
-
-2006-02-04  Michael Olson  <mwolson@gnu.org>
-
-       * erc.texi (History): Note that ERC is now included with Emacs.
-
 2006-02-03  Eli Zaretskii  <eliz@gnu.org>
 
        * custom.texi (Init File, Find Init): Add cross-references to
 
        * buffers.texi: Minor clarifications.
 
-2006-01-31  Romain Francoise  <romain@orebokech.com>
-
-       * message.texi (Message Headers): Explain what
-       `message-alternative-emails' does in more detail.
-       Update copyright year.
-
 2006-01-31  Richard M. Stallman  <rms@gnu.org>
 
        * display.texi (Scrolling, Horizontal Scrolling, Follow Mode):
        * basic.texi (Basic Undo): Rename from Undo.  Most of text
        moved to new Undo node.
 
-2006-01-30  Juanma Barranquero  <lekktu@gmail.com>
-
-       * makefile.w32-in (clean): Add newsticker, sieve, pgg, erc and rcirc.
-
 2006-01-29  Chong Yidong  <cyd@stupidchicken.com>
 
        * basic.texi (Continuation Lines, Inserting Text):
        * commands.texi: Minor cleanups.  Refer to "graphical" terminals,
        rather than X.
 
-       * cc-mode.texi (Indentation Commands): Inserts newline, not "linefeed".
-
        * basic.texi: Minor cleanups.
        (Undo): selective-undo moved.
 
-2006-01-29  Michael Olson  <mwolson@gnu.org>
-
-       * makefile.w32-in ($(infodir)/erc, erc.dvi): New targets.
-
-       * Makefile.in (INFO_TARGETS, DVI_TARGETS): Add ERC.
-
-       * faq.texi (New in Emacs 22): Mention ERC.
-
-2006-01-28  Luc Teirlinck  <teirllm@auburn.edu>
-
-       * rcirc.texi: Capitalize dir entry for consistency with the entry
-       in info/dir and other entries in the Emacs category.
-       Fix typos.  Delete trailing whitespace.
-
-2006-01-28  Bj\e,Av\e(Brn Lindstr\e,Av\e(Bm  <bkhl@elektrubadur.se>
-
-       * rcirc.texi: Some @cindex changes, some changes from @kbd to @key.
-
-2006-01-27  Eli Zaretskii  <eliz@gnu.org>
-
-       * makefile.w32-in ($(infodir)/rcirc, rcirc.dvi): New targets.
-       (INFO_TARGETS, DVI_TARGETS): Add rcirc.
-
-       * Makefile.in (../info/rcirc, rcirc.dvi): New targets.
-       (INFO_TARGETS, DVI_TARGETS): Add rcirc.
-
-2006-01-27  Alex Schroeder  <alex@gnu.org>
-
-       * rcirc.texi: New file.
-
 2006-01-25  Luc Teirlinck  <teirllm@auburn.edu>
 
        * anti.texi (Antinews): Various corrections and additions.
        * custom.texi (Easy Customization, Customization Groups)
        (Browsing Custom): Mention links along with buttons.
 
-       * widget.texi (User Interface): Add S-TAB for widget-backward.
-
-2006-01-22  Michael Albinus  <michael.albinus@gmx.de>
-
-       Sync with Tramp 2.0.52.
-
-       * tramp.texi (Frequently Asked Questions): Remove Ange-FTP item.
-       Add Tramp disabling item.  New item for common connection problems.
-       (various): Apply "ftp" as method for the download URL.
-       (Bug Reports): Refer to FAQ for common problems.
-
 2006-01-21  Eli Zaretskii  <eliz@gnu.org>
 
-       * widget.texi (User Interface): Use @key for TAB.
-
        * text.texi (TeX Print): Use @key for TAB.
 
-       * ses.texi (Formulas, Printer functions): Use @key for TAB.
-
        * kmacro.texi (Keyboard Macro Step-Edit): Use @key for TAB.
 
-       * ebrowse.texi (Switching to Tree, Symbol Completion): Use @key
-       for TAB.
-
-       * cc-mode.texi (Indentation Calculation): Use @key for TAB.
-
 2006-01-15  Sven Joachim  <svenjoac@gmx.de>  (tiny change)
 
        * files.texi (File Aliases): Don't claim that usually separate
 
        * programs.texi (Hungry Delete): Upcase @key argument.
 
-2006-01-16  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * gnus.texi: Update copyright.
-
 2006-01-16  Juri Linkov  <juri@jurta.org>
 
        * display.texi (Standard Faces): Add `mode-line-buffer-id'.
        Move `mode-line-highlight' before `mode-line-buffer-id'.
 
-2006-01-13  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * gnus.texi (Article Washing): Additions.
-
-2006-01-08  Alex Schroeder  <alex@gnu.org>
-
-       * pgg.texi (Caching passphrase): Rewording.
-
 2006-01-14  Richard M. Stallman  <rms@gnu.org>
 
        * basic.texi (Inserting Text): Minor cleanup.
 
-2006-01-13  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi (Agenda commands): Document tags command.
-
 2006-01-11  Luc Teirlinck  <teirllm@auburn.edu>
 
        * custom.texi (Changing a Variable, Face Customization):
        Update for changes in Custom menus.
 
-2006-01-10  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * gnus.texi (RSS): Document nnrss-wash-html-in-text-plain-parts.
-
-2006-01-06  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * gnus.texi (RSS): Addition.
-
-2005-12-22  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * gnus.texi (Summary Post Commands): Fix function bound to `S O p'.
-
-2005-12-19  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * emacs-mime.texi (Display Customization): Add setting example to
-       mm-discouraged-alternatives.
-
-2006-01-09  Stefan Monnier  <monnier@iro.umontreal.ca>
-
-       * flymake.texi (Obtaining Flymake): Remove chapter since Emacs's
-       version is the canonical version.
-
-2006-01-08  Alex Schroeder  <alex@gnu.org>
-
-       * pgg.texi (Caching passphrase): Rewording.
-
-2006-01-06  Eli Zaretskii  <eliz@gnu.org>
-
-       * flymake.texi (Obtaining Flymake): Update Flymake's CVS
-       repository URL.
-
-2006-01-06  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi: Removed the accidentally re-added empty line in the
-       direntry.
-
 2006-01-05  YAMAMOTO Mitsuharu  <mituharu@math.s.chiba-u.ac.jp>
 
        * macos.texi (Mac International): Undo last change.
 
-2006-01-05  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi (Agenda Views): Chapter reorganized.
-
 2006-01-02  Chong Yidong  <cyd@stupidchicken.com>
 
        * custom.texi (Custom Themes): Describe the new
 
        * basic.texi (Position Info): Update example.
 
-2005-12-29  Romain Francoise  <romain@orebokech.com>
-
-       * faq.texi (Using Customize): New node.
-
-2005-12-28  Luc Teirlinck  <teirllm@auburn.edu>
-
-       * org.texi: Remove blank line in @direntry.  It is non-standard
-       and recursively produces blank lines all over the dir file (when
-       using Texinfo 4.8).
-
 2005-12-27  Jan Dj\e,Ad\e(Brv  <jan.h.d@swipnet.se>
 
        * frames.texi (Dialog Boxes): Add x-gtk-show-hidden-files.
        "Similar" refer to the correct item.
        (Indirect Buffers): Minor rewording.
 
-2005-12-21  Luc Teirlinck  <teirllm@auburn.edu>
-
-       * widget.texi (atoms): Delete obsolete remark about `file' widget.
-
 2005-12-20  Juri Linkov  <juri@jurta.org>
 
        * files.texi (VC Status): Put P and N near p and n.
 
-2005-12-20  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi (Tags): Boolean logic documented.
-       (Agenda Views): Document custom commands.
-
-2005-12-20  David Kastrup  <dak@gnu.org>
-
-       * faq.texi (AUCTeX): Update version and mailing list info.
-
 2005-12-19  Richard M. Stallman  <rms@gnu.org>
 
        * programs.texi (Electric C): Delete the info about newline control.
        * frames.texi (Tool Bars): Mention that you can turn off tool bars
        permanently via the customize interface.
 
-2005-12-17  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * gnus.texi (MIME Commands): Mention addition of
-       multipart/alternative to gnus-buttonized-mime-types and add xref
-       to mm-discouraged-alternatives.
-
-       * emacs-mime.texi (Display Customization): Mention addition of
-       "image/.*" and add xref to gnus-buttonized-mime-types in the
-       mm-discouraged-alternatives section.
-
-2005-12-16  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi (Tags): New section.
-       (Agenda Views): Chapter reorganized.
-
 2005-12-16  Ralf Angeli  <angeli@iwi.uni-sb.de>
 
        * killing.texi (Killing by Lines): Document `kill-whole-line'
        function.
 
-2005-12-16  Eli Zaretskii  <eliz@gnu.org>
-
-       * org.texi (Internal Links): Add a missing comma after an @xref.
-
 2005-12-16  L\e$,1 q\e(Brentey K\e,Aa\e(Broly  <lorentey@elte.hu>
 
        * buffers.texi (Select Buffer): Change `prev-buffer' to
        `previous-buffer'.  Indicate that these functions use a frame
        local buffer list.
 
-2005-12-14  Chong Yidong  <cyd@stupidchicken.com>
-
-       * faq.texi (Filling paragraphs with a single space): No need to
-       change sentence-end now.
-
-2005-12-13  Romain Francoise  <romain@orebokech.com>
-
-       * faq.texi (Scrolling only one line): Use `scroll-conservatively'.
-
-2005-12-12  Jay Belanger  <belanger@truman.edu>
-
-       * faq.texi (Calc): Update version number.
-
-2005-12-12  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi (Progress Logging): New section.
-
 2005-12-12  Richard M. Stallman  <rms@gnu.org>
 
        * custom.texi (Easy Customization): Change menu comment.
 
        * files.texi (Old Versions): Use @table.
 
-2005-12-10  Romain Francoise  <romain@orebokech.com>
-
-       Update the Emacs FAQ for the 22.1 release.
-
-       * faq.texi: Set VER to `22.1'.
-       (Basic editing): Explain how to use localized versions of the
-       Tutorial.  Mention that `C-h r' displays the manual.  Delete
-       obsolete WWW link to an Emacs 18 tutorial.
-       (Getting a printed manual): Point to the new locations of the
-       manuals on the GNU Web site.
-       (Emacs Lisp documentation): Explain that the Emacs Lisp manual is
-       available via Info (it was previously distributed separately).
-       (Installing Texinfo documentation): The latest version of Texinfo
-       is 4.8, not 4.0.
-       (Informational files for Emacs): COPYING is the GNU General Public
-       License, not the Emacs General Public License.
-       (Informational files for Emacs): Delete obsolete link to the
-       GNUinfo pages as they have been removed from the GNU Web site.
-       (New in Emacs 22): New node.
-       (Setting up a customization file): Say that most packages support
-       Customize nowadays.
-       (Colors on a TTY): Delete reference to instructions on how to
-       enable syntax highlighting, it is now enabled by default.
-       (Turning on abbrevs by default): Emacs now reads the abbrevs file
-       at startup automatically.
-       (Controlling case sensitivity): Mention `M-c' in isearch.
-       (Using an already running Emacs process): Emacs now creates the
-       socket in `/tmp/emacsUID'.  Fix typos.  Change default location of
-       gnuserv.  As emacsclient can now run Lisp code as well, delete a
-       sentence praising gnuserv for that.  Simplify description of how
-       the client/server operation works.
-       (Compiler error messages): Delete obsolete text (compile.el has
-       been rewritten).
-       (Indenting switch statements): Fix typo.
-       (Matching parentheses): Simplify setup instructions, mention the
-       menu bar item in the Options menu.
-       (Repeating a command as many times as possible): Mention `C-x e'.
-       (Going to a line by number): Mention new keymap and bindings
-       `M-g M-g', `M-g M-p' and `M-g M-n'.
-       (Turning on syntax highlighting): Now on by default.  Simplify.
-       (Replacing highlighted text): Use `1', not `t'.
-       (Problems with very large files): The maximum size is now 256MB on
-       32-bit machines.
-       (^M in the shell buffer): Mention `comint-process-echoes'.
-       (Emacs for Apple computers): Emacs 22 has native support for Mac
-       OS X.
-       (Translating names to IP addresses): Delete node.
-       (Binding keys to commands): Fix typo.
-       (SPC no longer completes file names): New node.
-       (MIME with Emacs mail packages): Delete section about the Emacs
-       MIME FAQ (it's not reachable anymore).
-
 2005-12-10  David Koppelman  <koppel@ece.lsu.edu>
 
        * display.texi (Highlight Interactively): Include
        prefix keys even when mark is active.  Decribe that RET moves
        cursor to next corner in rectangle; clarify insert around rectangle.
 
-2005-12-08  Alan Mackenzie  <bug-cc-mode@gnu.org>
-
-       * cc-mode.texi: The manual has been extensively revised: the
-       information about using CC Mode has been separated from the larger
-       and more difficult chapters about configuration.  It has been
-       updated for CC Mode 5.31.
-
-2005-12-05  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * pgg.texi (User Commands): Fix description of pgg-verify-region.
-       (Selecting an implementation): Fix descriptions.
-
-2005-11-30  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * message.texi (Various Message Variables): Addition.
-
-2005-11-29  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * message.texi: Fix default values.
-
-2005-11-25  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * message.texi (Header Commands): Clarify descriptions of
-       message-cross-post-followup-to, message-reduce-to-to-cc, and
-       message-insert-wide-reply.
-       (Various Commands): Fix kindex for message-kill-to-signature;
-       clarify description of message-tab.
-
-2005-11-22  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * message.texi (Mailing Lists): Fix description about MFT.
-
-       * gnus.texi (Emacs Lisp): Use ~/.gnus.el instead of ~/.emacs.
-
-2005-11-17  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * gnus.texi (Slow Terminal Connection): Replace old description
-       with new one.
-
-2005-11-16  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * gnus.texi (Oort Gnus): Use ~/.gnus.el instead of ~/.emacs;
-       replace X-Draft-Headers with X-Draft-From.
-
-2005-11-14  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * gnus.texi (Various Various): Fix the default value of
-       nnheader-max-head-length.
-       (Gnus Versions): Fix typo.
-
 2005-12-08  Luc Teirlinck  <teirllm@auburn.edu>
 
        * custom.texi (Customization): Use xref to elisp manual for
        * mini.texi (Completion Commands, Completion):
        In file name input, SPC does not do completion.
 
-2005-12-08  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi (Structure editing): Document new functionality of
-       M-RET.
-
 2005-12-08  Nick Roberts  <nickrob@snap.net.nz>
 
        * building.texi (GDB Graphical Interface): Explain screen size
        (Other GDB User Interface Buffers): Describe features specific to
        GDB 6.4.
 
-2005-12-06  Luc Teirlinck  <teirllm@auburn.edu>
-
-       * org.texi (Internal Links): Fix Texinfo usage.
-
-2005-12-06  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi (TODO basics): Document the global todo list.
-       (TODO items): Documents sparse tree for specific TODO
-       keywords.
-
 2005-12-01  Nick Roberts  <nickrob@snap.net.nz>
 
        * building.texi (GDB User Interface Layout): Describe how to
        (Other GDB User Interface Buffers): Describe how to change a
        register value.
 
-2005-11-30  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi (Plain Lists): Typos fixed.
-
-2005-11-28  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi: Change references of `M-#' to `C-x *' prefix.
-
-2005-11-24  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi (Structure editing): New item moving commands added.
-       (Plain Lists): New section.
-
 2005-11-24  YAMAMOTO Mitsuharu  <mituharu@math.s.chiba-u.ac.jp>
 
        * macos.texi (Mac Input): Remove description of
        * files.texi (Renaming and VC): Some back-ends don't
        handle renaming.
 
-2005-11-18  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi (FAQ): Document `org-table-tab-jumps-over-hlines'.
-       (Agenda): Document commands `org-cycle-agenda-files' and
-       `org-agenda-file-to-front'
-       (Built-in table editor): Document `org-table-sort-lines'.
-       (HTML formatting): Export of hand-formatted lists.
-
 2005-11-17  Juri Linkov  <juri@jurta.org>
 
        * emacs.texi (Top):
        list of words or a regexp.  Add C-h d for apropos-documentation.
        Describe apropos-documentation-sort-by-scores user option.
 
-2005-11-10  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * gnus.texi (XVarious): Fix description of gnus-use-toolbar; add
-       new variable gnus-toolbar-thickness.
-
-2005-11-08  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * gnus.texi (XVarious): Revert description of gnus-use-toolbar.
-
-2005-11-07  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * gnus.texi (X-Face): Fix description.
-       (XVarious): Remove gnus-xmas-logo-color-alist and
-       gnus-xmas-logo-color-style; fix description of gnus-use-toolbar.
-
-2005-11-01  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * gnus.texi (Group Parameters): Mention new variable
-       gnus-parameters-case-fold-search.
-       (Home Score File): Addition.
-
 2005-11-09  Luc Teirlinck  <teirllm@auburn.edu>
 
        * killing.texi (CUA Bindings): Add @section.
 
        * misc.texi (Shell Mode): Describe how to activate password echoing.
 
-2005-11-04  Ulf Jasper  <ulf.jasper@web.de>
-
-       * newsticker.texi: VERSION changed to 1.9.  Updated UPDATED.
-       (Overview): List supported feed types.
-       (Installation): No installation necessary when using autoload.
-       (Configuration): Rename "RSS" to "news".
-
-2005-11-04  Ken Manheimer  <ken.manheimer@gmail.com>
-
-       * pgg.texi (User Commands): Document additional passphrase
-       argument for pgg-encrypt-*, pgg-decrypt-*, and pgg-sign-* functions.
-       (Backend methods): Likewise for corresponding pgg-scheme-* functions.
-
-2005-11-04  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi: Version number changed to 3.19.
-
 2005-11-04  Romain Francoise  <romain@orebokech.com>
 
        * mark.texi (Mark Ring): Fix typo.
 
        * anti.texi (Antinews): Likewise.
 
-2005-10-29  Sascha Wilde  <wilde@sha-bang.de>
-
-       * pgg.texi (How to use): Update the example to add autoload of
-       pgg-encrypt-symmetric-region.
-       (User Commands): Document pgg-encrypt-symmetric-region.
-       (Backend methods): Document pgg-scheme-encrypt-symmetric-region.
-
 2005-10-28  Bill Wohler  <wohler@newt.com>
 
        * help.texi (Help): Help mode now creates hyperlinks for URLs.
 
        * trouble.texi (Memory Full): Mention !MEM FULL! in mode line.
 
-2005-10-27  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi (Predefined Units): Fix the symbol for a TeX points,
-       mention other TeX-related units.
-
 2005-10-25  Nick Roberts  <nickrob@snap.net.nz>
 
        * building.texi (GDB Graphical Interface): Describe
 
        * custom.texi (Init File): Recommend when to use site-start.el.
 
-2005-10-23  Lars Hansen  <larsh@soem.dk>
-
-       * dired-x.texi (Miscellaneous Commands): Replace
-       dired-do-relative-symlink by dired-do-relsymlink and
-       dired-do-relative-symlink-regexp by dired-do-relsymlink-regexp.
-
-2005-10-23  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi (Predefined Units): Use `alpha' for the fine structure
-       constant.
-
-2005-10-23  Michael Albinus  <michael.albinus@gmx.de>
-
-       * faq.texi (Bugs and problems): Replace
-       `dired-move-to-filename-regexp' by
-       `directory-listing-before-filename-regexp'.
-
-2005-10-22  Eli Zaretskii  <eliz@gnu.org>
-
-       * newsticker.texi (UPDATED): Set value.
-
-2005-10-17  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * gnus.texi (Document Groups): Remove duplicate item.
-
 2005-10-21  Juri Linkov  <juri@jurta.org>
 
        * custom.texi (Examining): Mention accessing the old variable
        value via M-n in set-variable.
 
-2005-10-21  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi (Summary): Mention iCalendar support.
-       (Exporting): Document iCalendar support.
-
 2005-10-18  Romain Francoise  <romain@orebokech.com>
 
        * files.texi (Version Systems): Capitalize GNU.
 
-       * viper.texi (Viper Specials): Likewise.
-
 2005-10-18  Nick Roberts  <nickrob@snap.net.nz>
 
        * building.texi (Compilation Mode): Remove redundant paragraph.
        (Watch Expressions): Remove paragraph to reflect code change.
 
-2005-10-17  Juri Linkov  <juri@jurta.org>
-
-       * info.texi (Getting Started, Search Index, Expert Info):
-       Fix wording.
-       (Search Text): Replace `echo area' with `mode line'.
-       (Search Index): Both `i' and `,' find all index entries.
-       Replace example `C-f' with `C-l' (which exists in index of Info
-       manual) and delete spaces in its keyboard input sequence.
-       Delete unnecessary explanations about literal characters.
-
 2005-10-16  Richard M. Stallman  <rms@gnu.org>
 
        * building.texi (Compilation Mode, Compilation): Clarified.
 
        * misc.texi (Saving Emacs Sessions): Mention savehist library.
 
-2005-10-14  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * gnus.texi (Document Server Internals): Addition.
-
-2005-10-13  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * gnus.texi (A note on namespaces): Fix RFC reference.
-
-2005-10-12  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * gnus.texi (RSS): Fix key description.
-
-2005-10-11  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * gnus.texi: Emacs/w3 -> Emacs/W3.
-       (Browsing the Web): Fix description.
-       (Web Searches): Ditto.
-       (Customizing W3): Ditto.
-
-2005-10-07  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * gnus.texi (Maildir): Clarify expire-age and expire-group.
-
 2005-10-13  Kenichi Handa  <handa@m17n.org>
 
        * basic.texi (Position Info): Fix previous change.
        * basic.texi (Position Info): Describe the case that Emacs shows
        "part of display ...".
 
-2005-10-11  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi (Integration): Mention using `a i' to compute definite
-       integrals.
-
-2005-10-11  Juri Linkov  <juri@jurta.org>
-
-       * info.texi: Rearrange nodes.
-       (Top): Update menu.  Change ref `Info for Experts' to
-       `Advanced Info Commands'.
-       (Getting Started): Fix description of manual's parts.
-       (Help-Int): Change xref `Info Search' to `Search Index', and
-       `Expert Info' to `Advanced'.
-       (Advanced): Move node one level up.
-       (Search Text, Search Index): New nodes split out from `Info Search'.
-       (Go to node, Choose menu subtopic, Create Info buffer): New nodes
-       split out from `Advanced'.
-       (Advanced, Emacs Info Variables): De-document editing an Info file
-       in Info.
-       (Emacs Info Variables): Move node from `Expert Info' to `Advanced'.
-       (Creating an Info File): Delete node and move its text to
-       `Expert Info'.
-
 2005-10-10  Jan Dj\e,Ad\e(Brv  <jan.h.d@swipnet.se>
 
        * cmdargs.texi (Icons X): -nb => -nbi.
        (Watch Expressions): Explain how to make speedbar global.
        (Other GDB User Interface Buffers): Make references more precise.
 
-2005-10-10  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi (Workflow states): Documented that change in keywords
-       becomes active only after restart of Emacs.
-
 2005-10-09  Richard M. Stallman  <rms@gnu.org>
 
        * frames.texi (Speedbar): Clarify the text.
        * cmdargs.texi (Icons X): Removed options -i, -itype, --icon-type,
        added -nb, --no-bitmap-icon.
 
-2005-10-08  Michael Albinus  <michael.albinus@gmx.de>
-
-       Sync with Tramp 2.0.51.
-
-2005-10-08  Nick Roberts  <nickrob@snap.net.nz>
-
-       * speedbar.texi (Introduction): Describe new location of speedbar
-       on menubar.
-       (Basic Key Bindings): Remove descriptions of bindings that have
-       been removed.
-
 2005-10-07  Nick Roberts  <nickrob@snap.net.nz>
 
        * building.texi (GDB Graphical Interface): Add variables and
        functions to indices.  Be more precise.
 
-2005-10-05  Nick Roberts  <nickrob@snap.net.nz>
-
-       * speedbar.texi (GDB): Describe use of watch expressions.
-
 2005-10-03  Jan Dj\e,Ad\e(Brv  <jan.h.d@swipnet.se>
 
        * frames.texi (Drag and Drop): Remove the x- from
        * mini.texi (Minibuffer): The default value now appears before the
        colon in minibuffer prompts.
 
-2005-09-28  Simon Josefsson  <jas@extundo.com>
-
-       * message.texi (IDNA): Fix.
-
-2005-09-28  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * gnus.texi (NNTP): Remove nntp-buggy-select, nntp-read-timeout,
-       nntp-server-hook, and nntp-warn-about-losing-connection; fix
-       description of nntp-open-connection-function.
-       (Common Variables): Fix descriptions.
-
-2005-09-26  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * gnus.texi (Server Buffer Format): Document the %a format spec.
-
 2005-09-25  Richard M. Stallman  <rms@gnu.org>
 
        * search.texi (Regexp Search): Doc search-whitespace-regexp.
 
-2005-09-22  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * gnus.texi (Mail): Fix gnus-confirm-mail-reply-to-news entry.
-
 2005-09-20  Emanuele Giaquinta  <emanuele.giaquinta@gmail.com>  (tiny change)
 
        * text.texi (Paragraphs): Correction about Paragraph-Indent Text mode.
 
-2005-09-23  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi Version 3.16.
-
 2005-09-21  YAMAMOTO Mitsuharu  <mituharu@math.s.chiba-u.ac.jp>
 
        * emacs.texi (Top): Update submenus from macos.texi.
        `mac-get-file-creator', `mac-set-file-type', `mac-get-file-type',
        and `mac-get-preference'.
 
-2005-09-19  Miles Bader  <miles@gnu.org>
-
-       * newsticker.texi: Get rid of CVS keywords.
-
-2005-09-15  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * gnus.texi (Finding the Parent): Fix description of how Gnus
-       finds article.
-
-2005-09-14  Jari Aalto  <jari.aalto@cante.net>
-
-       * gnus.texi (Advanced Scoring Examples): New examples to teach how
-       to drop off non-answered articles.
-
-2005-09-19  Juanma Barranquero  <lekktu@gmail.com>
-
-       * makefile.w32-in (newsticker.dvi): Use parentheses instead of curly
-       braces (which are unsupported by NMAKE) for macro `srcdir'.
-
-2005-09-17  Eli Zaretskii  <eliz@gnu.org>
-
-       * makefile.w32-in (INFO_TARGETS, DVI_TARGETS): Add newsticker targets.
-       (../info/newsticker, newsticker.dvi): New targets.
-
-2005-09-17  Ulf Jasper  <ulf.jasper@web.de>
-
-       * newsticker.texi: Replace @command with @code.  Replace @example
-       with @lisp.
-       (Top): Added explanations to menu items.
-       (GNU Free Documentation License): Removed.
-
 2005-09-16  Romain Francoise  <romain@orebokech.com>
 
        Update all files to specify GFDL version 1.2.
        Clarify effect of write-region-inhibit-fsync.
        (Misc File Ops): Say write-region-inhibit-fsync affects write-region.
 
-       * newsticker.texi: Fix @setfilename.
-
-       * Makefile.in (INFO_TARGETS, DVI_TARGETS): Add newsticker targets.
-       (../info/newsticker, newsticker.dvi): New targets.
-
 2005-09-14  Romain Francoise  <romain@orebokech.com>
 
        * files.texi (Saving): Mention write-region-inhibit-fsync.
 
 2005-09-03  Richard M. Stallman  <rms@gnu.org>
 
-       * search.texi (Search Case): Mention vars that control
-       case-fold-search for various operations.
-
-2005-08-30  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi: Version 3.15.
-
-2005-08-29  Luc Teirlinck  <teirllm@auburn.edu>
-
-       * ses.texi: Combine all three indices into one.
-       Correct a few typos.
-
-2005-08-19  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * emacs-mime.texi (time-date): Fix description of safe-date-to-time.
-
-2005-08-18  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * emacs-mime.texi (Handles): Remove duplicate item.
-       (Encoding Customization): Fix the default value for
-       mm-coding-system-priorities.
-       (Charset Translation): Emacs doesn't use mm-mime-mule-charset-alist.
-       (Basic Functions): Fix reference.
-
-2005-08-09  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * gnus.texi (Charsets): Fj hierarchy uses iso-2022-jp.
+       * search.texi (Search Case): Mention vars that control
+       case-fold-search for various operations.
 
 2005-08-22  Juri Linkov  <juri@jurta.org>
 
 
 2005-08-18  Richard M. Stallman  <rms@gnu.org>
 
-       * faq.texi (Obtaining the FAQ): Delete refs to Lerner's email
-       and web site.
-
        * trouble.texi (Unasked-for Search):
        Delete xref to Keyboard Translations.
 
        * glossary.texi (Glossary): Delete xref.
 
-       * faq.texi (Swapping keys): Xref for normal-erase-is-backspace-mode,
-       not keyboard-translate.
-
        * custom.texi (Minor Modes): Say that the list here is not complete.
        (Keyboard Translations): Node deleted.
        (Disabling): Delete xref to it.
        * search.texi (Regexp Backslash, Regexp Example): New nodes split
        out of Regexps.
 
-       * faq.texi (Using regular expressions): Fix xref.
-
 2005-08-09  Juri Linkov  <juri@jurta.org>
 
        * building.texi (Compilation): Use `itemx' instead of `item'.
 
        * calendar.texi (Scroll Calendar): Document < and > in calendar.
 
-2005-08-09  Juri Linkov  <juri@jurta.org>
-
-       * info.texi (Help-P): Replace `Prev' with `Previous'.
-       (Help-M, Help-Xref): Add S-TAB.
-       (Help-FOO): Update `u' command.
-       (Help-Xref): Move info about Mouse-2 from `Help-Int'.
-       Update info about visibility of xref parts.
-       (Help-Int): Fix `m' command.  Rename `Info-last' to
-       `Info-history-back'.  Add `Info-history-forward'.
-       (Advanced): Fix `g*' and `M-n' commands.
-       (Info Search): Add `index-apropos' in stand-alone browser.
-       Add isearch commands.
-       (Emacs Info Variables): Remove `Info-fontify'.
-       Add `Info-mode-hook'.  Update face names.
-       Add `Info-fontify-maximum-menu-size',
-       `Info-fontify-visited-nodes', `Info-isearch-search'.
-
-2005-08-07  Michael Albinus  <michael.albinus@gmx.de>
-
-       Sync with Tramp 2.0.50.
-
-       * tramp.texi: Use @option{} consequently for method names.
-       (Inline methods, External transfer methods): Remove references to
-       Cygwin.
-       (Issues with Cygwin ssh): Explain trouble with Cygwin's ssh
-       implementation.
-
 2005-08-06  Eli Zaretskii  <eliz@gnu.org>
 
        * mule.texi (Coding Systems): Rephrase the paragraph about
        ($(infodir)/dir): New target, produced by running
        multi-install-info.bat.
 
-2005-07-27  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus.texi (Startup Files): Fix name of gnus-site-init-file.
-       Mention that gnus-init-file is not read when Emacs is invoked with
-       --no-init-file or -q.
-
 2005-07-22  Eli Zaretskii  <eliz@gnu.org>
 
        * files.texi (Quoted File Names): Add index entry.
 
-2005-07-19  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi: Version 3.14.
-
-2005-07-04  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi: Version 3.13.
-
 2005-07-19  Juri Linkov  <juri@jurta.org>
 
        * files.texi (Comparing Files): Mention resync for `compare-windows'.
 
 2005-07-18  Juri Linkov  <juri@jurta.org>
 
-       * calc.texi (Time Zones, Logical Operations):
-       * cl.texi (Overview):
        * custom.texi (Easy Customization):
        * files.texi (Old Versions):
        * frames.texi (Wheeled Mice):
        * mule.texi (Specify Coding):
-       * org.texi (TODO types):
-       * sc.texi (Emacs 18 MUAs):
-       * speedbar.texi (Top):
        * text.texi (Cell Justification):
        * trouble.texi (After a Crash):
-       * url.texi (History):
        * xresources.texi (GTK styles):
        Delete duplicate duplicate words.
 
 
        * mini.texi (Completion Commands): Fix command name for ?.
 
-2005-07-16  Johan Bockgard  <bojohan@users.sourceforge.net>  (tiny change)
-
-       * cl.texi (Type Predicates): Document `atom' type.
-
 2005-07-16  Eli Zaretskii  <eliz@gnu.org>
 
        * display.texi (Standard Faces): Explain that customization of
 
        Update FSF's address in GPL notices.
 
-       * calc.texi (Copying):
        * doclicense.texi (GNU Free Documentation License):
-       * faq.texi (Contacting the FSF):
-       * mh-e.texi (Copying):
        * trouble.texi (Checklist): Update FSF's address.
 
-2005-07-03  Richard M. Stallman  <rms@gnu.org>
-
-       * flymake.texi (Example -- Configuring a tool called directly):
-       Update name of flymake-build-relative-filename.
-
-2005-06-29  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * gnus.texi (NoCeM): gnus-nocem-verifyer defaults to pgg-verify.
-
-2005-06-29  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi: Version 3.12.
-
 2005-06-24  Richard M. Stallman  <rms@gnu.org>
 
        * display.texi (Text Display): Change index entries.
        * makefile.w32-in (MAKEINFO): Use --force.
        (INFO_TARGETS, DVI_TARGETS): Make identical to the lists in
        Makefile.in.
-       (gnus.dvi): Use "..." to quote Sed args, so that it works with
-       more shells.
 
 2005-06-23  Richard M. Stallman  <rms@gnu.org>
 
        and put it in a separate node.  Add nobreak-space and
        escape-glyph.
 
-       * speedbar.texi (Creating a display): Texinfo usage fixes.
-
-       * tramp.texi (Customizing Completion, Auto-save and Backup):
-       Texinfo usage fixes.
-
 2005-06-23  Lute Kamstra  <lute@gnu.org>
 
        * mule.texi (Select Input Method): Fix typo.
 
 2005-06-23  Juanma Barranquero  <lekktu@gmail.com>
 
-       * building.texi (Grep Searching):
-       * dired-x.texi (Miscellaneous Commands):
-       * ediff.texi (Miscellaneous):
-       * gnus.texi (MIME Commands, Fancy Mail Splitting, Agent Visuals)
-       (Agent Variables):
-       * info.texi (Help-Xref):
-       * message.texi (Message Headers):
-       * org.texi (Remember):
-       * reftex.texi (Options (Defining Label Environments)):
-       (Options (Index Support)):
-       (Options (Viewing Cross-References)):
-       (Options (Misc)):
-       (Changes):
-       * speedbar.texi (Creating a display):
-       * tramp.texi (Customizing Completion, Auto-save and Backup):
-       Texinfo usage fix.
+       * building.texi (Grep Searching): Texinfo usage fix.
 
 2005-06-22  Miles Bader  <miles@gnu.org>
 
 
        * text.texi (Adaptive Fill): Minor clarification.
 
-2005-06-13  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi: Version 3.11.
-
-2005-06-12  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi (Getting Started): Remove extra menu item.
-
 2005-06-10  Lute Kamstra  <lute@gnu.org>
 
        * emacs.texi (Top): Correct version number.
 
        * trouble.texi (After a Crash): Polish previous change.
 
-2005-05-31  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi (Notations Used in This Manual): Use @kbd for key
-       sequence.
-       (Demonstration of Calc): Mention another way of starting Calc.
-       (Starting Calc): Mention long name of M-#.
-       (Embedded Mode Overview): Remove unnecessary instruction.
-       (Other M-# commands): Rephrase `M-# 0' explanation.
-       (Basic Embedded Mode): Rewrite discussion of prefix arguments to
-       reflect current behavior.
-
-2005-05-30  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi (Hooks): Change description of calc-window-hook and
-       calc-trail-window-hook to match usage.
-       (Computational Functions): Add more constant-generating functions.
-       (Customizable Variables): Use defvar.
-
 2005-05-30  Noah Friedman  <friedman@splode.com>
 
        * trouble.texi (After a Crash): Mention emacs-buffer.gdb as a
        recovery mechanism.
 
-2005-05-28  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi (Assignments in Embedded Mode): Fix variable name.
-       (Basic Embedded Mode): Explain behavior of arguments to
-       calc-embedded-mode.
-
 2005-05-28  Nick Roberts  <nickrob@snap.net.nz>
 
        * building.texi (Other Buffers): SPC toggles display of
        floating point registers.
 
-2005-05-27  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi (Queries in Keyboard Macros): Rewrite to reflect
-       current behavior.
-
 2005-05-27  Nick Roberts  <nickrob@snap.net.nz>
 
        * files.texi (Log Buffer): Merge in description of Log Edit
 
        * building.texi (Lisp Eval): C-M-x with arg runs Edebug.
 
-2005-05-25  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi: Change Calc version number throughout.
-       (Keypad Mode): Change location in info output.
-       (Keypad mode overview): Move picture of keypad.
-
 2005-05-24  Luc Teirlinck  <teirllm@auburn.edu>
 
        * fixit.texi (Spelling): Delete confusing sentence; flyspell is
        printed manuals.
        (Intro): Use @xref for the Emacs Lisp Intro.
 
-2005-05-21  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi (Storing variables): Mention that only most variables
-       are void to begin with.
-
-2005-05-21  Kevin Ryde  <user42@zip.com.au>
-
-       * widget.texi (Basic Types): Update cross ref from "Enabling
-       Mouse-1 to Follow Links" to "Links and Mouse-1" per recent
-       lispref/text.texi change.
-
-2005-05-20  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi: Version 3.09.
-
-2005-05-18  Carsten Dominik  <dominik@science.uva.nl>
-
-       * reftex.texi: Version 4.28.
-
 2005-05-18  Luc Teirlinck  <teirllm@auburn.edu>
 
        * buffers.texi (Select Buffer): Document `C-u M-g M-g'.
        * building.texi (Debugger Operation): Mention GUD tooltips are
        disabled with GDB in text command mode.
 
-2005-05-16  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi (Storing Variables): Mention `calc-copy-special-constant'.
-
 2005-05-16  Nick Roberts  <nickrob@snap.net.nz>
 
        * building.texi: Replace toolbar with "tool bar" for consistency.
        * major.texi (Choosing Modes): normal-mode processes the -*- line.
        Add xref.
 
-2005-05-14  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi (Default Simplifications): Insert missing ! (logical
-       not operator).
-
-2005-05-14  Michael Albinus  <michael.albinus@gmx.de>
-
-       Sync with Tramp 2.0.49.
-
 2005-05-14  Luc Teirlinck  <teirllm@auburn.edu>
 
        * basic.texi (Moving Point): Mention `M-g g' binding for `goto-line'.
 
        * killing.texi (Deletion): Complete description of `C-x C-o'.
 
-2005-05-10  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi (Default Simplifications): Mention that 0^0 simplifies
-       to 1.
-
 2005-05-10  Richard M. Stallman  <rms@gnu.org>
 
        * building.texi (Compilation): Clarify recompile's directory choice.
 
        * building.texi (Debugger Operation): Clarify previous change.
 
-2005-04-29  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi: Version 3.08, structure reorganized.
-
 2005-04-28  Nick Roberts  <nickrob@snap.net.nz>
 
        * building.texi (Debugger Operation): Add description for
 
        * ack.texi: Delete info about lazy-lock.el and fast-lock.el.
 
-       * faq.texi: Delete info about lazy-lock.el and fast-lock.el.
-
 2005-04-19  Kim F. Storm  <storm@cua.dk>
 
        * building.texi (Compilation Mode): Add M-g M-n and M-g M-p bindings.
        xterm-mouse-mode is a minor mode and put in pxref to Minor Modes
        node.
 
-2005-04-15  Carsten Dominik  <dominik@science.uva.nl>
-
-       * org.texi: Update to version 3.06.
-
-2005-04-13  Lute Kamstra  <lute@gnu.org>
-
-       * cc-mode.texi: Prevent creating an unnecessary empty cc-mode.ss file.
-
 2005-04-12  Luc Teirlinck  <teirllm@auburn.edu>
 
        * frames.texi (XTerm Mouse): Xterm Mouse mode is now enabled by default.
 
        * major.texi (Choosing Modes): Document magic-mode-alist.
 
-2005-04-10  Thien-Thi Nguyen  <ttn@gnu.org>
-
-       * cl.texi (Porting Common Lisp): Fix typo.
-
 2005-04-10  Luc Teirlinck  <teirllm@auburn.edu>
 
        * rmail.texi (Rmail Basics): Clarify description of `q' and `b'.
 
        * xresources.texi (Lucid Resources): Add fontSet resource.
 
-2005-04-06  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * gnus.texi (RSS): Addition.
-
 2005-04-09  Luc Teirlinck  <teirllm@auburn.edu>
 
        * display.texi (Useless Whitespace): `indicate-unused-lines' is
        The GNU/Linux console currently does not appear to support
        `xterm-mouse-mode'.
 
-2005-04-04  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi: Change Calc version number.
-       (Customizable variables): Fix description of calc-language-alist.
-       (Copying): Put in version 2 of GPL.
-
 2005-04-03  Glenn Morris  <gmorris@ast.cam.ac.uk>
 
        * calendar.texi (Diary): Mention shell utility `calendar'.
 
        * cmdargs.texi (Misc X): Explain horizontal scroll bars don't exist.
 
-2005-04-01  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi (Troubleshooting Commands): Remove comment about
-       installation.
-       (Installation): Remove section.
-       (Customizable Variables): New section.
-       (Basic Embedded Mode, Customizing Embedded Mode, Graphics)
-       (Graphical Devices): Add references to Customizable Variables.
-
 2005-04-01  Lute Kamstra  <lute@gnu.org>
 
        * maintaining.texi (Change Log): add-change-log-entry uses
 
        * programs.texi (Fortran Motion): Fix previous change.
 
-2005-03-25  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * emacs-mime.texi (Display Customization): Markup fixes.
-       (rfc2047): Update.
-
-2005-03-23  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus-faq.texi: Replaced with auto-generated version.
-
 2005-03-29  Richard M. Stallman  <rms@gnu.org>
 
        * mule.texi (Single-Byte Character Support): Reinstall the C-x 8 info.
        * display.texi (Text Display): Add index entries for how no-break
        characters are displayed.
 
-2005-03-26  Stephan Stahl  <stahl@eos.franken.de>  (tiny change)
-
-       * dired-x.texi (Multiple Dired Directories): default-directory was
-       renamed to dired-default-directory.
-
 2005-03-26  Eli Zaretskii  <eliz@gnu.org>
 
        * files.texi (Visiting): Fix cross-references introduced with the
 
        * xresources.texi (GTK resources): Fix last change.
 
-2005-03-26  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi (Simplifying Formulas, Rewrite Rules):
-       Change description of top and bottom of fraction.
-       (Modulo Forms): Move description of how to create modulo forms to
-       earlier in the section.
-       (Fraction Mode): Suggest using : to get a fraction by dividing.
-       (Basic Arithmetic): Adjust placement of command name.
-       (Truncating the Stack): Emphasize that "hidden" entries are still
-       visible.
-       (Installation): Move discussion of printing manual to "About This
-       Manual".
-       (About This Manual): Mention how to print the manual.
-       (Reporting Bugs): Remove first person.
-       (Building Vectors): Add algebraic version of append.
-       (Manipulating Vectors): Fix algebraic version of calc-reverse-vector.
-       (Grouping Digits): Fix typo.
-
 2005-03-25  Chong Yidong  <cyd@stupidchicken.com>
 
        * xresources.texi (X Resources): GTK options documented too.
        hide-body won't hide lines before first header line.
        (TeX Mode): Add DocTeX mode.
 
-2005-03-25  Werner Lemberg  <wl@gnu.org>
-
-       * calc.texi, cl.texi, gnus.texi, idlwave.texi, reftex.texi:
-       Replace `legal' with `valid'.
-
-2005-03-25  Werner Lemberg  <wl@gnu.org>
-
-       * calc.texi, reftex.texi: Replace `illegal' with `invalid'.
-
-2005-03-24  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi (General Mode Commands)
-       (Mode Settings in Embedded Mode): Add some explanation of
-       recording mode settings.
-
 2005-03-24  Richard M. Stallman  <rms@gnu.org>
 
        * mule.texi (Single-Byte Character Support): Delete mention
        of iso-acc.el and iso-transl.el.
 
-       * calc.texi: Remove praise of non-free software.
-
-       * idlwave.texi: Don't say where to get IDL or its non-free manual.
-       (Installation): Node deleted.
-
 2005-03-23  Lute Kamstra  <lute@gnu.org>
 
        * search.texi (Non-ASCII Isearch): Rename from Non-Ascii Isearch.
 
 2005-03-23  Richard M. Stallman  <rms@gnu.org>
 
-       * url.texi (HTTP language/coding): Improve last change.
-
        * search.texi: Delete explicit node pointers.
        (Incremental Search): New menu.
        (Basic Isearch, Repeat Isearch, Error in Isearch)
        * building.texi (Stack Buffer): Mention reverse contrast for
        *selected* frame (might not be current frame).
 
-2005-03-22  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi (Embedded Mode): Add new information on changing
-       modes.
-
 2005-03-21  Richard M. Stallman  <rms@gnu.org>
 
        * building.texi (Starting GUD): Add bashdb.
 
        * anti.texi: Total rewrite.
 
-2005-03-20  Michael Albinus  <michael.albinus@gmx.de>
-
-       Sync with Tramp 2.0.48.
-
-       * trampver.texi.in: Replace "Emacs" by "GNU Emacs".
-
-       * tramp.texi: Replace "Emacs" by "GNU Emacs".  Replace "Linux" by
-       "GNU/Linux".  Change all addresses to .gnu.org.
-       (Default Method): Offer shortened syntax for "su" and "sudo"
-       methods.
-
 2005-03-19  Chong Yidong  <cyd@stupidchicken.com>
 
        * ack.texi (Acknowledgments): Update.
 
 2005-03-07  Richard M. Stallman  <rms@gnu.org>
 
-       * url.texi: Fix usage of "e.g.".
-       (HTTP language/coding): Explain the rules for these strings.
-
        * misc.texi (Single Shell, Shell Options): Fix previous change.
 
        * building.texi (Debugger Operation): Update GUD tooltip enable info.
        (GUD Tooltips): Node deleted.
        (GDB Graphical Interface): Explain the two GDB modes here.
 
-       * woman.texi (Introduction): Minor cleanups.
-
-       * url.texi (HTTP language/coding): Get rid of "Emacs 21".
-
        * sending.texi (Sending Mail): Minor cleanup.
        (Mail Aliases): Explain quoting conventions.
        Update key rebinding example.
        (Movemail): Clarify two movemail versions.
        Clarify rmail-movemail-program.
 
-       * pcl-cvs.texi (About PCL-CVS): Get rid of "Emacs 21".
-       (Installation): Node deleted.
-
        * misc.texi (Single Shell): Replace uudecode example with gpg example.
        Document async shell commands.
        (Shell History): Clarify.
        (Hyperlinking): Explain Mouse-1 convention here.
        (Find Func): Node deleted.
 
-       * mh-e.texi (Preface): Get rid of "Emacs 21".
-
        * help.texi (Name Help): Xref to Hyperlinking.
 
        * glossary.texi (Glossary):
        * files.texi (Types of Log File): Explain how projects'
        methods can vary.
 
-       * eshell.texi (Installation): Delete node (for Emacs 20).
-
        * display.texi (Faces): Delete "Emacs 21".
 
        * custom.texi (Changing a Variable): C-M-i like M-TAB.
        * calendar.texi (Specified Dates): Mention `g w'.
        (Appointments): appt-activate toggles with no arg.
 
-2005-03-05  Thien-Thi Nguyen  <ttn@gnu.org>
-
-       * flymake.texi: Refill and tweak style in @lisp blocks.
-
 2005-03-05  Juri Linkov  <juri@jurta.org>
 
        * cmdargs.texi (Emacs Invocation): Add cindex
 
        * calendar.texi (iCalendar): No need to require it now.
 
-2005-03-03  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus.texi (Slow/Expensive Connection): Don't abbreviate "very".
-
 2005-03-03  Nick Roberts  <nickrob@snap.net.nz>
 
        * trouble.texi (Contributing): Mention Savannah.  Direct users to
        * calendar.texi (Adding to Diary): Mention redrawing of calendar
        window.
 
-2005-03-01  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi (Trigonometric and Hyperbolic Functions):
-       Mention additional functions.
-       (Algebraic Simplifications): Mention additional simplifications.
-
 2005-02-27  Richard M. Stallman  <rms@gnu.org>
 
        * building.texi (Compilation): Update mode line status info.
 
        * cmdargs.texi (Initial Options): Add cross reference.
 
-2005-02-18  Jonathan Yavner  <jyavner@member.fsf.org>
-
-       * ses.texi: Add concept/function/variable indices (this work was
-       donated by Brad Collins <brad@chenla.org>, copyright-assignment
-       papers on file at FSF).
-
 2005-02-16  Luc Teirlinck  <teirllm@auburn.edu>
 
        * emacs.texi (Top): Update menu for splitting of node in
        * basic.texi (Continuation Lines): Simplify description of truncation,
        and refer to Display Custom for the rest of it.
 
-2005-02-10  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi: Change @LaTeX to La@TeX throughout.
-       Redefine @expr as @math for TeX output.
-       Redefine @texline as a no-op for TeX output.
-       Define @tfn, replace @t by @tfn throughout.
-
-2005-02-09  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi: Add macro for LaTeX for info output.
-
-2005-02-08  Kim F. Storm  <storm@cua.dk>
-
-       * texinfo.tex (LaTex): Add def.
-
-2005-02-06  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi (TeX Language Mode): Add mention of LaTeX mode, and
-       change name to "TeX and LaTeX Language Modes."  Mention LaTeX mode
-       throughout manual.
-
 2005-02-06  Lute Kamstra  <lute@gnu.org>
 
        * basic.texi (Undo): Fix typo.
        * display.texi, mule.texi: Don't say just "option" when talking
        about variables.  Other minor cleanups.
 
-2005-01-28  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus.texi: Some edits based on comments from David Abrahams.
-
-2005-01-24  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * gnus.texi (RSS): Fix the keystroke.
-
 2005-01-26  Lute Kamstra  <lute@gnu.org>
 
        * cmdargs.texi (Initial Options): Add a cross reference to `Init
        File'.  Mention the `-Q' option at the `--no-site-file' option.
 
-2005-01-24  David Kastrup  <dak@gnu.org>
-
-       * faq.texi: Update AUCTeX version info.
-
-2005-01-16  Xavier Maillard  <zedek@gnu-rox.org>  (tiny change)
-
-       * gnus-faq.texi ([4.1]): Typo.
-
 2005-01-22  David Kastrup  <dak@gnu.org>
 
        * building.texi (Grep Searching): Mention alias `find-grep' for
 
        * calendar.texi (Time Intervals): Delete special stuff for MS-DOS.
 
-2005-01-19  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi (Keep Arguments): Mention that keeping arguments
-       doesn't work with keyboard macros.
-
-2005-01-16  Richard M. Stallman  <rms@gnu.org>
-
-       * autotype.texi (Autoinserting): Fix small error.
-
-2005-01-16  Michael Albinus  <michael.albinus@gmx.de>
-
-       Sync with Tramp 2.0.47.
-
-       * tramp.texi (Compilation): New section, describing compilation of
-       remote files.
-
 2005-01-15  Sergey Poznyakoff  <gray@Mirddin.farlep.net>
 
        * rmail.texi (Movemail): Explain differences
        * programs.texi (Multi-line Indent): Fix previous change.
        (Fortran Autofill): Simplify description of fortran-auto-fill-mode.
 
-2005-01-11  Kim F. Storm  <storm@cua.dk>
-
-       * widget.texi (Basic Types): Add :follow-link keyword.
-
-2005-01-09  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi (Basic Commands): Describe new behavior of calc-reset.
-
 2005-01-08  Richard M. Stallman  <rms@gnu.org>
 
        * display.texi (Faces): isearch-lazy-highlight-face renamed to
        and lazy-highlight.
        (Incremental Search): Update isearch highlighting info.
 
-2005-01-08  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi: Change throughout to reflect new default value of
-       calc-settings-file.
-
-2005-01-06  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * message.texi (Reply): `message-reply-to-function' should return
-       a list.  Suggested by ARISAWA Akihiro <ari@mbf.ocn.co.jp>.
-
-2005-01-06  Hiroshi Fujishima  <pooh@nature.tsukuba.ac.jp>  (tiny change)
-
-       * faq.texi (Changing load-path): Fix typo.
-
-2005-01-05  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi (Programming Tutorial): Replace kbd command by
-       appropriate characters for a keyboard macro.
-
-2005-01-04  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi (Basic Tutorial, Programming Tutorial): Remove caveats
-       for Lucid Emacs.
-       (Programming Tutorial): Mention that the user needs to be in the
-       right mode to compute some functions.
-
 2005-01-04  Richard M. Stallman  <rms@gnu.org>
 
        * custom.texi (Saving Customizations): Minor improvement.
 
-2005-01-04  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi (Rewrite rules): Remove an exercise (on 0^0) which is
-       no longer applicable.
-
 2005-01-03  Luc Teirlinck  <teirllm@auburn.edu>
 
        * custom.texi (Saving Customizations): Emacs no longer loads
        `custom-file' after .emacs.  No longer mention customizing through
        Custom.
 
-2005-01-01  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi (Programming Tutorial): Changed description of how to
-       edit keyboard macros to match current behavior.
-
 2005-01-01  Andreas Schwab  <schwab@suse.de>
 
        * killing.texi (Graphical Kill): Move up under node Killing,
        * files.texi (Saving): Describe new require-final-newline features
        and mode-require-final-newline.
 
-2004-12-31  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi: Mention C-cC-c as the way to finish editing throughout.
-
 2004-12-29  Richard M. Stallman  <rms@gnu.org>
 
        * custom.texi (File Variables): Clarify previous change.
        * basic.texi (Moving Point): C-e now runs move-end-of-line.
        (Undo): Doc undo-outer-limit.
 
-2004-12-20  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi (Types Tutorial): Emphasize that you can't divide by
-       zero.
-
-2004-12-17  Luc Teirlinck  <teirllm@auburn.edu>
-
-       * cc-mode.texi (Text Filling and Line Breaking): Put period after
-       @xref.
-       (Font Locking): Avoid @strong{Note:}.
-
-2004-12-17  Michael Albinus  <michael.albinus@gmx.de>
-
-       Sync with Tramp 2.0.46.
-
-       * tramp.texi (bottom): Add arch-tag.  It was lost, somehow.
-
-2004-12-16  Luc Teirlinck  <teirllm@auburn.edu>
-
-       * url.texi: Correct typos.
-       (Retrieving URLs): @var{nil}->@code{nil}.
-       (HTTP language/coding, mailto): Replace  "GNU Emacs Manual" with
-       the standard "The GNU Emacs Manual" in fifth argument of @xref's.
-       (Dealing with HTTP documents): @inforef->@xref.
-
 2004-12-15  Juri Linkov  <juri@jurta.org>
 
        * mark.texi (Transient Mark, Mark Ring): M-< and other
        movement commands don't set mark in Transient Mark mode
        if mark is active.
 
-2004-12-15  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi: Consistently capitalized all mode names.
-       (Answers to Exercises): Mention that an answer can be a fraction
-       when in Fraction mode.
-
-2004-12-13  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi: Fix some TeX definitions.
-
 2004-12-12  Juri Linkov  <juri@jurta.org>
 
        * misc.texi (FFAP): Add C-x C-r, C-x C-v, C-x C-d,
        * mark.texi (Marking Objects): Marking commands also extend the
        region when mark is active in Transient Mark mode.
 
-2004-12-09  Luc Teirlinck  <teirllm@auburn.edu>
-
-       * reftex.texi (Imprint): Remove erroneous @value's.
-
 2004-12-08  Luc Teirlinck  <teirllm@auburn.edu>
 
        * custom.texi (Saving Customizations): Emacs only loads the custom
        file automatically after the init file in version 22.1 or later.
        Adapt text and examples to this fact.
 
-       * makefile.w32-in (INFO_TARGETS, DVI_TARGETS, $(infodir)/org)
-       (org.dvi, $(infodir)/url, url.dvi, clean): Add org and url manuals.
-
-2004-12-08  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi (Starting Calc): Remove comment about installation.
-       (Keypad Mode Overview): Remove comment about Emacs 19 support.
-
-2004-12-08  Luc Teirlinck  <teirllm@auburn.edu>
-
-       * url.texi: Update @setfilename.
-       (Getting Started): No need to worry about Gnus versions.
-       (Dealing with HTTP documents): Use @inforef.
-
-       * org.texi: Fix @direntry file name.
-
 2004-12-07  Luc Teirlinck  <teirllm@auburn.edu>
 
        * frames.texi (Scroll Bars): The option `scroll-bar-mode' has to
        be set through Custom.  Otherwise, it has no effect.
 
-2004-12-07  Stefan  <monnier@iro.umontreal.ca>
-
-       * url.texi: New file.
-
-       * Makefile.in (INFO_TARGETS, DVI_TARGETS, ../info/url, url.dvi): Add it.
-
-2004-12-06  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi (Using Calc): Remove paragraph about installation.
-
-2004-12-06  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi: Use more Texinfo macros and less TeX defs.
-       Remove @refill's.
-
-2004-12-06  Richard M. Stallman  <rms@gnu.org>
-
-       * org.texi: New file.
-
 2004-12-05  Richard M. Stallman  <rms@gnu.org>
 
        * cmdargs.texi, doclicense.texi, xresources.texi, emacs.texi:
        * entering.texi: Rename Command Line to Emacs Invocation.
 
-       * Makefile.in (org.dvi, ../info/org): New targets.
-       (INFO_TARGETS): Add ../info/org.
-       (DVI_TARGETS): Add org.dvi.
-       (maintainer-clean): Remove the info files in the info dir.
-
        * misc.texi (Term Mode): Correcty describe C-c.
 
        * custom.texi (Easy Customization): Move up to section level,
        * frames.texi (Dialog Boxes): Rename use-old-gtk-file-dialog to
        x-use-old-gtk-file-dialog.
 
-2004-11-26  Eli Zaretskii  <eliz@gnu.org>
-
-       * idlwave.texi: Fix the setfilename directive to put the produced
-       file in ../info.
-       (Continued Statement Indentation): Resurrect Jan D.'s change from
-       2004-11-03 that was lost when a newer version of idlwave.texi was
-       imported.
-
 2004-11-20  Richard M. Stallman  <rms@gnu.org>
 
        * text.texi (Fill Prefix): M-q doesn't apply fill prefix to first line.
        to Alex Ott, Karl Fogel, Stefan Monnier, and David Kastrup for
        suggestions.
 
-2004-12-08  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus-faq.texi ([5.1]): Added missing bracket.
-
-       * gnus.texi (Filtering Spam Using The Spam ELisp Package): Index
-       `spam-initialize'.
-
-2004-11-22  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * message.texi (Various Message Variables): Mention that all mail
-       file variables are derived from `message-directory'.
-
-       * gnus.texi (Splitting Mail): Clarify bogus group.
-
-2004-11-02  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * emacs-mime.texi (Encoding Customization): Fix
-       mm-coding-system-priorities entry.
-
 2004-11-03  Jan Dj\e,Ad\e(Brv  <jan.h.d@swipnet.se>
 
-       * frames.texi (Dialog Boxes):
-       * idlwave.texi (Continued Statement Indentation):
-       * reftex.texi (Options (Index Support)):
-       (Displaying and Editing the Index, Table of Contents):
-       * speedbar.texi (Creating a display, Major Display Modes): Replace
-       non-nil with non-@code{nil}.
+       * frames.texi (Dialog Boxes): Replace non-nil with non-@code{nil}.
 
 2004-11-02  Jan Dj\e,Ad\e(Brv  <jan.h.d@swipnet.se>
 
        (Fixed Width Mode, Table Conversion, Measuring Tables)
        (Table Misc): New nodes, documenting the Table Mode.
 
-2004-10-21  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi (Algebraic-Style Calculations): Removed a comment.
-
 2004-10-19  Jason Rumney  <jasonr@gnu.org>
 
        * makefile.w32-in (info): Change order of arguments to makeinfo.
 
        * calendar.texi (iCalendar): Update for package changes.
 
-2004-10-18  Luc Teirlinck  <teirllm@auburn.edu>
-
-       * calc.texi (Reporting Bugs): Double up `@'.
-
-2004-10-18  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi (Reporting Bugs): Changed the address that bugs
-       should be sent to.
-
-2004-10-15  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus.texi (New Features): Add 5.11.
-
-       * message.texi (Resending): Remove wrong default value.
-
-       * gnus.texi (Mail Source Specifiers): Describe possible problems
-       of `pop3-leave-mail-on-server'.  Add `pop3-movemail' and
-       `pop3-leave-mail-on-server' to the index.
-
-2004-10-15  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * message.texi (Canceling News): Add how to set a password.
-
-2004-10-12  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi (Help Commands): Changed the descriptions of
-       calc-describe-function and calc-describe-variable to match their
-       current behavior.
-
-2004-10-12  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus-faq.texi ([5.9]): Improve code for reply-in-news.
-
-2004-10-12  Michael Albinus  <michael.albinus@gmx.de>
-
-       Sync with Tramp 2.0.45.
-
-       * tramp.texi (Frequently Asked Questions): Comment paragraph about
-       plink link.  The URL is outdated.  Originator contacted for
-       clarification.
-
-2004-10-10  Juri Linkov  <juri@jurta.org>
-
-       * gnus.texi (Top, Marking Articles): Join two menus in one node
-       because a node can have only one menu.
-
 2004-10-09  Luc Teirlinck  <teirllm@auburn.edu>
 
        * files.texi (Misc File Ops): View mode is a minor mode.
 
-2004-10-09  Juri Linkov  <juri@jurta.org>
-
-       * gnus.texi (Fancy Mail Splitting): Remove backslash in the
-       example of nnmail-split-fancy.
-
 2004-10-08  Glenn Morris  <gmorris@ast.cam.ac.uk>
 
        * calendar.texi (iCalendar): Style changes.
        * search.texi (Regexps): The regexp described in the example is no
        longer stored in the variable `sentence-end'.
 
-2004-10-06  Karl Berry  <karl@gnu.org>
-
-       * info.texi (@kbd{1}--@kbd{9}): No space around --, for
-       consistency with other uses of dashes.
-
 2004-10-06  Nick Roberts  <nickrob@snap.net.nz>
 
        * building.texi (Starting GUD): Note that multiple debugging
 
        * calendar.texi (iCalendar): New section for a new package.
 
-2004-10-05  Karl Berry  <karl@gnu.org>
-
-       * info.texi: Consistently use --- throughout, periods at end of
-       menu descriptions, and a couple typos.
-
 2004-10-05  Luc Teirlinck  <teirllm@auburn.edu>
 
        * text.texi: Various small changes in addition to the following.
        * display.texi (Display Custom) <indicate-buffer-boundaries>:
        Align with new functionality.
 
-2004-09-26  Jesper Harder  <harder@ifa.au.dk>
-
-       * sieve.texi (Manage Sieve API): nil -> @code{nil}.
-       * pgg.texi (User Commands, Backend methods): Do.
-       * gnus.texi: Markup fixes.
-       (Setting Process Marks): Fix `M P a' entry.
-       * emacs-mime.texi: Fixes.
-
-2004-09-23  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus-faq.texi ([5.12]): Fix code example for FQDN in Message-Ids
-       again.
-       Use 5.10 instead of 5.10.0.
-
-2004-09-20  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus.texi (Summary Mail Commands): S D e.
-
-2004-09-20  Raymond Scholz  <ray-2004@zonix.de>  (tiny change)
-
-       * gnus.texi (Misc Article): Refer to `Summary Buffer Mode Line' in
-       the gnus-article-mode-line-format section.
-
-2004-09-20  Helmut Waitzmann  <Helmut.Waitzmann@web.de>  (tiny change)
-
-       * gnus.texi (Various Summary Stuff): Fix the documentation for
-       gnus-newsgroup-variables.
-
-2004-09-20  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus.texi (MIME Commands): Added
-       gnus-mime-display-multipart-as-mixed,
-       gnus-mime-display-multipart-alternative-as-mixed,
-       gnus-mime-display-multipart-related-as-mixed.
-       (Mail Source Customization): Clarify `mail-source-directory'.
-       (Splitting Mail): Mention gnus-group-find-new-groups.
-       (SpamOracle): Fixed typo.
-
-       * gnus-faq.texi: Untabify.
-       ([6.3]): nnir.el is in contrib directory.
-
-       * message.texi (News Headers): Clarify how a unique ID is created.
-
-       * gnus.texi (Batching Agents): Fixed typo in example.  Reported
-       by Hiroshi Fujishima <pooh@nature.tsukuba.ac.jp>.
-
-2004-09-20  Andre Srinivasan  <andre@e2open.com>
-
-       * gnus.texi (Group Parameters): Added more on hooks.  (Small
-       change.)
-
-2004-09-20  Florian Weimer  <fw@deneb.enyo.de>
-
-       * gnus.texi (Charsets): Point to relevant section in emacs-mime.
-
 2004-09-22  Luc Teirlinck  <teirllm@auburn.edu>
 
        * display.texi (Display Custom): Remove stray `@end defvar'.
        * display.texi (Display Custom): Add `overflow-newline-into-fringe',
        `indicate-buffer-boundaries' and `default-indicate-buffer-boundaries'.
 
-2004-09-22  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi (Vectors as Lists): Added a warning that the tutorial
-       might be hidden during part of the session.
-
-2004-09-20  Jay Belanger  <belanger@truman.edu>
-
-       * calc.texi (Notations Used in This Manual): Put in an earlier
-       mention that DEL could be called Backspace.
-
 2004-09-20  Richard M. Stallman  <rms@gnu.org>
 
        * custom.texi (Hooks): Explain using setq to clear out a hook.
        * mini.texi (Repetition): Rename isearch-resume-enabled to
        isearch-resume-in-command-history and change default to disabled.
 
-2004-09-10  Simon Josefsson  <jas@extundo.com>
-
-       * gnus.texi (IMAP): Add example.  Suggested and partially written
-       by Steinar Bang <sb@dod.no>.
-
-2004-09-10  Teodor Zlatanov  <tzz@lifelogs.com>
-
-       * gnus.texi (IMAP): Add comments about imaps synonym to imap in
-       netrc syntax.
-
-2004-09-10  Teodor Zlatanov  <tzz@lifelogs.com>
-
-       * gnus.texi (Spam ELisp Package Sequence of Events): Some clarifications.
-       (Spam ELisp Package Global Variables): More clarifications.
-
-2004-09-10  Teodor Zlatanov  <tzz@lifelogs.com>
-
-       * gnus.texi (Spam ELisp Package Filtering of Incoming Mail):
-       Mention spam-split does not modify incoming mail.
-
-2004-09-10  Teodor Zlatanov  <tzz@lifelogs.com>
-
-       * gnus.texi (Spam ELisp Package Sequence of Events): Fix typo.
-
-2004-09-10  Eli Zaretskii  <eliz@gnu.org>
-
-       * Makefile.in (../info/gnus, gnus.dvi): Depend on gnus-faq.texi.
-
 2004-09-09  Kim F. Storm  <storm@cua.dk>
 
        * kmacro.texi (Save Keyboard Macro): Replace `name-last-kbd-macro'
        with new `kmacro-name-last-macro'.
 
-2004-09-09  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * makefile.w32-in (sieve, pgg): Use $(infodir).
-
 2004-09-08  Juri Linkov  <juri@jurta.org>
 
        * mini.texi (Minibuffer History): Add `history-delete-duplicates'.
 
-2004-09-08  Dhruva Krishnamurthy  <dhruva.krishnamurthy@gmail.com>  (tiny change)
-
-       * makefile.w32-in: Fix PGG and Sieve entries.
-
 2004-09-03  Juri Linkov  <juri@jurta.org>
 
        * search.texi (Incremental Search): Update wording for M-%.
        (Just Spaces): `tabify' converts sequences of at least two spaces
        to tabs.
 
-2004-08-28  Eli Zaretskii  <eliz@gnu.org>
-
-       * faq.texi (Emacs for MS-DOS): Update URLs for the MS-DOS port of
-       Emacs and related programs.
-
 2004-08-27  Luc Teirlinck  <teirllm@auburn.edu>
 
        * frames.texi (Secondary Selection): Setting the secondary
        Adapt node pointers to change in emacs.texi.
        * cmdargs.texi, doclicense.texi: Adapt node pointers.
 
-2004-08-27  Richard M. Stallman  <rms@gnu.org>
-
-       * faq.texi: Fix texinfo usage, esp. doublequotes.
-       (Difference between Emacs and XEmacs): Some clarification.
-
-       * faq.texi (Difference between Emacs and XEmacs):
-       Explain not to contrast XEmacs with GNU Emacs.
-
-2004-08-26  Richard M. Stallman  <rms@gnu.org>
-
-       * faq.texi (Difference between Emacs and XEmacs): Rewrite.
-
 2004-08-25  Kenichi Handa  <handa@m17n.org>
 
        * custom.texi (Non-ASCII Rebinding): Fix and simplify the
        * kmacro.texi (Keyboard Macro Counter, Keyboard Macro Step-Edit):
        Change section names.
 
-2004-08-22  David Kastrup  <dak@gnu.org>
-
-       * reftex.texi (AUCTeX): Update links, section name.
-
-       * faq.texi (Calc): Update availability (included in 22.1).
-       (AUCTeX): Update availability, information, versions, description.
-
 2004-08-21  Luc Teirlinck  <teirllm@auburn.edu>
 
        * kmacro.texi (Keyboard Macro Ring): Rename section.
        * custom.texi (Non-ASCII Rebinding):
        C-q always inserts the right code to pass to global-set-key.
 
-2004-08-14  Eli Zaretskii  <eliz@gnu.org>
-
-       * Makefile.in (../info/tramp, tramp.dvi): Depend on trampver.texi.
-
 2004-08-13  Luc Teirlinck  <teirllm@auburn.edu>
 
        * regs.texi (RegNumbers): Mention `C-x r i' binding for
 
        * help.texi (Help): Fix Texinfo usage.
 
-2004-08-11  Martin Stjernholm  <bug-cc-mode@gnu.org>
-
-       * cc-mode.texi: Various updates for CC Mode 5.30.9.
-
-2004-08-10  Michael Albinus  <michael.albinus@gmx.de>
-
-       Sync with Tramp 2.0.44.
-
-2004-08-05  Lars Hansen  <larsh@math.ku.dk>
-
-       * widget.texi (User Interface): Update how to separate the
-       editable field of an editable-field widget from other widgets.
-       (Programming Example): Add text after field.
-
 2004-07-24  Richard M. Stallman  <rms@gnu.org>
 
        * text.texi (Paragraphs): Update how paragraphs are separated
        * search.texi (Regexp Replace): Further update text for new
        replacement operators.
 
-2004-08-31  Katsumi Yamaoka  <yamaoka@jpl.org>
-
-       * emacs-mime.texi (Encoding Customization): Add a note to the
-       mm-content-transfer-encoding-defaults entry.
-       (rfc2047): Update.
-
-       * gnus.texi (Article Highlighting): Add
-       gnus-cite-ignore-quoted-from.
-       (POP before SMTP): New node.
-       (Posting Styles): Addition.
-       (Splitting Mail): Add nnmail-split-lowercase-expanded.
-       (Fancy Mail Splitting): Ditto.
-       (X-Face): Add gnus-x-face.
-
-2004-08-30  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * emacs-mime.texi, gnus-faq.texi, gnus.texi, message.texi,
-       * pgg.texi, sieve.texi: Use @copying and @insertcopying.
-
-2004-08-22  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus.texi (Mail Source Specifiers): Describe
-       `pop3-leave-mail-on-server'.
-
-2004-08-02  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * Makefile.in, makefile.w32-in: Added PGG and Sieve files.
-
-       * pgg.texi, sieve.texi: Import from the v5_10 branch of the Gnus
-       repository.  Change setfilename.
-
-       * emacs-mime.texi, gnus-faq.texi, gnus.texi, message.texi: Ditto.
-
 2004-07-18  Luc Teirlinck  <teirllm@auburn.edu>
 
        * emacs-xtra.texi (Subdir switches): Dired does not remember the
        * search.texi (Regexps): Delete redundant definition of `symbol' in
        description of `\_>'.  It already occurs in the description of `\_<'.
 
-2004-07-02  Juri Linkov  <juri@jurta.org>
-
-       * pcl-cvs.texi (Viewing differences): Add `d r'.
-
 2004-07-01  Juri Linkov  <juri@jurta.org>
 
        * search.texi (Incremental Search): Add C-M-w, C-M-y, M-%, C-M-%, M-e.
 
 2004-06-29  Jesper Harder  <harder@ifa.au.dk>
 
-       * ses.texi, viper.texi, search.texi, flymake.texi, faq.texi:
-       * eshell.texi, ediff.texi, calendar.texi: Markup fixes.
+       * search.texi, calendar.texi: Markup fixes.
 
 2004-06-25  Richard M. Stallman  <rms@gnu.org>
 
        * misc.texi (Shell History Copying): Document comint-insert-input.
        (Shell Ring): Describe comint-dynamic-list-input-ring here.
 
-2004-06-21  Karl Berry  <karl@gnu.org>
-
-       * info.texi (Top): Mention that only Emacs has mouse support.
-       (Getting Started): Mention this in a few other places.
-
 2004-06-20  Jesper Harder  <harder@ifa.au.dk>
 
        * msdog.texi (Text and Binary, MS-DOS Printing): Use m-dash.
        * dired.texi (Dired Enter): Mention conditions on `ls' switches.
        (Dired and Find): Mention differences with ordinary Dired buffers.
 
-2004-06-13  Luc Teirlinck  <teirllm@auburn.edu>
-
-       * autotype.texi (Copyrights, Timestamps): Recommend
-       `before-save-hook' instead of `write-file-functions'.
-
 2004-06-13  Richard M. Stallman  <rms@gnu.org>
 
        * custom.texi (Init Syntax): Explain about vars that do special
        things when set with setq or with Custom.
        (Init Examples): Add line-number-mode example.
 
-2004-06-13  Lars Hansen  <larsh@math.ku.dk>
-
-       * dired-x.texi (dired-mark-omitted): Update keybinding.
-
 2004-06-12  Juri Linkov  <juri@jurta.org>
 
        * dired.texi (Operating on Files): Add dired-do-touch.
 
-2004-06-10  Kim F. Storm  <storm@cua.dk>
-
-       * pcl-cvs.texi (Viewing differences): Add 'd y'.
-
 2004-06-10  Juri Linkov  <juri@jurta.org>
 
        * building.texi (Lisp Eval): Add C-M-x on defface.
        * files.texi (Reverting): Auto-Revert mode and
        Global Auto-Revert mode no longer revert remote files.
 
-2004-06-05  Lars Hansen  <larsh@math.ku.dk>
-
-       * dired-x.texi (variable dired-omit-mode): Rename from
-       dired-omit-files-p.
-       (function dired-omit-mode): Rename from dired-omit-toggle.
-       Call dired-omit-mode rather than set dired-omit-files-p.
-       (dired-mark-omitted): Describe command.
-
-2004-05-29  Michael Albinus  <michael.albinus@gmx.de>
-
-       Version 2.0.41 of Tramp released.
-
-2004-05-29  Juanma Barranquero  <lektu@terra.es>
-
-       * makefile.w32-in (../info/flymake, flymake.dvi): New targets.
-       (INFO_TARGETS, DVI_TARGETS): Add Flymake.
-
 2004-05-29  Richard M. Stallman  <rms@gnu.org>
 
        * custom.texi (Init File): Two dashes start --no-site-file.
 
-       * cl.texi (Top): Call this chapter `Introduction'.
-       (Overview): In TeX, no section heading here.
-
-       * cc-mode.texi: Put commas after i.e. and e.g.  Minor cleanups.
-
 2004-05-29  Alan Mackenzie  <acm@muc.de>
 
        * programs.texi: Update for CC Mode 5.30 and incidental amendments.
 
        * emacs.texi: Remove the menu entry "Comments in C".
 
-2004-05-29  Eli Zaretskii  <eliz@gnu.org>
-
-       * Makefile.in (../info/flymake, flymake.dvi): New targets.
-       (INFO_TARGETS, DVI_TARGETS): Add Flymake.
-
-2004-05-29  Pavel Kobiakov  <pk_at_work@yahoo.com>
-
-       * flymake.texi: New file.
-
-2004-05-28  Simon Josefsson  <jas@extundo.com>
-
-       * smtpmail.texi (Authentication): Improve STARTTLS discussion.
-
 2004-05-27  Luc Teirlinck  <teirllm@auburn.edu>
 
        * dired.texi (Dired and Find): `find-ls-option' does not apply to
        * building.texi (GDB Graphical Interface): Update and describe
        layout first.
 
-2004-05-07  Kai Grossjohann  <kai@emptydomain.de>
-
-       Version 2.0.40 of Tramp released.
-
-2004-04-25  Michael Albinus  <Michael.Albinus@alcatel.de>
-
-       Complete rework, based on review by Karl Berry <karl@gnu.org>.
-
-       * tramp.texi (Auto-save and Backup): Explain exploitation of new
-       variables `tramp-backup-directory-alist' and
-       `tramp-bkup-backup-directory-info'.
-       (Overview, Connection types)
-       (External transfer methods, Default Method)
-       (Windows setup hints): Remove restriction of password entering
-       with external methods.
-       (Auto-save and Backup): Make file name example
-       (X)Emacs neutral.  In case of XEmacs, `bkup-backup-directory-info'
-       and `auto-save-directory' must be used.
-       (Frequently Asked Questions): Use "MS Windows NT/2000/XP" (not
-       only "NT").  Remove doubled entry "What kinds of systems does
-       @tramp{} work on".
-       (tramp): Macro removed.
-       (Obtaining Tramp): Flag removed from title.
-       (all): "tramp-" and "-" removed from flag names.  Flags `tramp'
-       and `trampver' used properly.  Flag `tramp-inst' replaced by
-       `installchapter'.  Installation related text adapted.
-
 2004-05-04  Jason Rumney  <jasonr@gnu.org>
 
        * makefile.w32-in: Revert last change.
 
        * makefile.w32-in (MULTI_INSTALL_INFO, ENVADD): Use forward slashes.
 
-2004-04-28  Masatake YAMATO  <jet@gyve.org>
-
-       * widget.texi (Programming Example): Remove overlays.
-
-2004-04-27  Jesper Harder  <harder@ifa.au.dk>
-
-       * faq.texi, viper.texi, dired-x.texi, autotype.texi: lisp -> Lisp.
-
 2004-04-23  Juanma Barranquero  <lektu@terra.es>
 
        * makefile.w32-in: Add "-*- makefile -*-" mode tag.
 
        * custom.texi (File Variables): Add safe-local-eval-forms.
 
-2004-04-05  Jesper Harder  <harder@ifa.au.dk>
-
-       * info.texi (Info Search): Add info-apropos.
-
 2004-04-02  Luc Teirlinck  <teirllm@auburn.edu>
 
        * files.texi (Reverting): Correct description of revert-buffer's
 
        * emacs.texi (Top): Add `Misc X'.
 
-       * faq.texi, trouble.texi: Fix help key bindings.
+       * trouble.texi: Fix help key bindings.
 
        * glossary.texi: Improve references.
 
 
        * sending.texi (Mail Methods): Fix xref to Message manual.
 
-2004-03-17  Luc Teirlinck  <teirllm@auburn.edu>
-
-       * info.texi (Advanced): Replace @unnumberedsubsec by @subheading
-       (as suggested by Karl Berry).  Update information about colored
-       stars in menus.  Add new subheading describing M-n.
-
 2004-03-12  Richard M. Stallman  <rms@gnu.org>
 
-       * cl.texi (Top): Rename top node's title.
-
        * buffers.texi (Misc Buffer): Add index entry for rename-uniquely.
 
-2004-03-08  Karl Berry  <karl@gnu.org>
-
-       * info.texi: \input texinfo.tex instead of just texinfo, to avoid
-       problems making the texinfo distribution.
-
 2004-03-04  Richard M. Stallman  <rms@gnu.org>
 
        * search.texi (Regexps): Explain that ^ and $ have their
        (Indirect Buffers): Don't recommand clone-indirect-buffer
        for multiple compile and grep buffers.
 
-2004-02-29  Simon Josefsson  <jas@extundo.com>
-
-       * smtpmail.texi (Authentication): Changed the list of supported
-       authentication mechanisms from CRAM-MD5, PLAIN and LOGIN-MD5 to
-       CRAM-MD5 and LOGIN, tiny patch from Andreas Voegele
-       <voegelas@gmx.net>.
-
 2004-02-29  Juanma Barranquero  <lektu@terra.es>
 
        * makefile.w32-in (mostlyclean, clean, maintainer-clean):
        Use $(DEL) instead of rm, and ignore exit code.
 
-2004-02-29  Kai Grossjohann  <kgrossjo@eu.uu.net>
-
-       Tramp version 2.0.39 released.
-
-2004-02-29  Michael Albinus  <Michael.Albinus@alcatel.de>
-
-       * tramp.texi (Customizing Completion): Explain new functions
-       `tramp-parse-shostkeys' and `tramp-parse-sknownhosts'.
-       (all): Savannah URLs unified to "http://savannah.nongnu.org".
-       (Top): Refer to Savannah mailing list as the major one.  Mention
-       older mailing lists in HTML mode only.
-       (Auto-save and Backup): Add auto-save.  Based on wording of Kai.
-       (Frequently Asked Questions): Remote hosts must not be Unix-like
-       for "smb" method.
-       (Password caching): New node.
-       (External transfer methods): Refer to password caching for "smb"
-       method.
-
 2004-02-23  Nick Roberts  <nick@nick.uklinux.net>
 
        * building.texi (Watch Expressions): Update.
        (Title X): Remove alias -title.
        (Misc X): New node.
 
-2004-02-17  Karl Berry  <karl@gnu.org>
-
-       * info.texi (Help-Int): Mention the new line number feature.
-
 2004-02-15  Jan Dj\e,Ad\e(Brv  <jan.h.d@swipnet.se>
 
        * frames.texi (Drag and drop): Add Motif to list of supported
        protocols.
 
-2004-02-14  Jonathan Yavner  <jyavner@member.fsf.org>
-
-       * ses.texi (Advanced Features): New functionality for
-       ses-set-header-row (defaults to current row unless C-u used).
-       (Acknowledgements): Add Stefan Monnier.
-
 2004-02-03  Jan Dj\e,Ad\e(Brv  <jan.h.d@swipnet.se>
 
        * frames.texi (Drag and drop): New section.
 
 2003-12-29  Kevin Ryde  <user42@zip.com.au>
 
-       * viper.texi (Vi Macros): Fix reference to the Emacs manual.
-
        * programs.texi (C Modes): Fix the xref.
 
 2003-12-23  Nick Roberts  <nick@nick.uklinux.net>
        * files.texi: Say how to disable VC.  Suggested by Alan Mackenzie
        <acm@muc.de>.
 
-2003-11-30  Kai Grossjohann  <kai.grossjohann@gmx.net>
-
-       Tramp version 2.0.38 released.
-
-       * tramp.texi (Remote shell setup): Warn of environment variables
-       FRUMPLE if user frumple exists.  Suggested by Sven Gabriel
-       <sven.gabriel@imk.fzk.de>.
-       (Configuration): Tramp now chooses base64/uuencode
-       automatically.  Update wording accordingly.
-       (Top): More description for the `Default Method' menu entry.
-       (Default Method): Use @code, not @var, for Lisp variables.
-       (Default Method): New subsection `Which method is the right one
-       for me?'  Suggested by Christian Kirsch.
-       (Configuration): Pointer to new subsection added.
-       (Default Method): Too many "use" in one sentence.
-       Rephrase.  Reported by Christian Kirsch.
-       (Filename Syntax): Old `su' example is probably a left-over from
-       the sm/su method naming.  Replace with `ssh', instead.
-       (External transfer methods, Auto-save and Backup):
-       Typo fixes.
-
-2003-11-02  Michael Albinus  <Michael.Albinus@alcatel.de>
-
-       * tramp.texi (all): Harmonize all occurences of @tramp{}.
-       (Top): Mention japanese manual only if flag `jamanual' is set.
-       Insert section `Japanese manual' in menu.
-
 2003-11-29  Jan Dj\e,Ad\e(Brv  <jan.h.d@swipnet.se>
 
        * frames.texi (Dialog Boxes): Add use-file-dialog.
 
-2003-11-26  Thien-Thi Nguyen  <ttn@gnu.org>
-
-       * eshell.texi (Known Problems): Add doc item.
-
 2003-11-22  Martin Stjernholm  <bug-cc-mode@gnu.org>
 
        * ack.texi: Note that Alan Mackenzie contributed the AWK support
        in CC Mode.
 
-2003-11-22  Martin Stjernholm  <bug-cc-mode@gnu.org>
-
-       * cc-mode.texi: Update for CC Mode 5.30.
-
-       Note: Please refrain from doing purely cosmetic changes like
-       removing trailing whitespace in this manual; it clobbers cvs
-       merging for no good reason.
-
 2003-11-02  Jesper Harder  <harder@ifa.au.dk>  (tiny change)
 
        * man/ack.texi, man/basic.texi, man/cmdargs.texi:
        * man/commands.texi, man/custom.texi, man/display.texi:
-       * man/ediff.texi, man/emacs.texi, man/faq.texi, man/files.texi:
+       * man/emacs.texi, man/files.texi:
        * man/frames.texi, man/glossary.texi, man/killing.texi:
        * man/macos.texi, man/mark.texi, man/misc.texi, man/msdog.texi:
        * man/mule.texi, man/rmail.texi, man/search.texi:
-       * man/sending.texi, man/text.texi, man/tramp.texi:
-       * man/trouble.texi, man/vip.texi, man/viper.texi, man/widget.texi:
-       * man/woman.texi: Replace @sc{ascii} and ASCII with @acronym{ASCII}.
+       * man/sending.texi, man/text.texi, man/trouble.texi:
+       Replace @sc{ascii} and ASCII with @acronym{ASCII}.
 
 2003-11-01  Alan Mackenzie  <acm@muc.de>
 
        * search.texi (Scrolling During Incremental Search): Document a
        new scrolling facility in isearch mode.
 
-2003-10-26  Karl Berry  <karl@gnu.org>
-
-       * info.texi (Info Search): Echo area, not echo are.  From Debian
-       diff.
-
-2003-10-26  Per Abrahamsen  <abraham@dina.kvl.dk>
-
-       * widget.texi (Defining New Widgets): Document new beavior of
-       :buttons and :children keywords.
-
 2003-10-22  Miles Bader  <miles@gnu.org>
 
        * Makefile.in (info): Move before $(top_srcdir)/info.
        * building.texi (Watch Expressions): Update section on data display
        to reflect code changes (GDB Graphical Interface).
 
-2003-10-17  Thien-Thi Nguyen  <ttn@gnu.org>
-
-       * tramp.texi (Inline methods): Small grammar fix.
-       (External transfer methods): Likewise.
-
 2003-10-13  Richard M. Stallman  <rms@gnu.org>
 
        * xresources.texi (GTK resources): Clean up previous change.
        * xresources.texi (GTK resources): Add a note that some themes
        disallow customizations.  Add scroll theme example.
 
-2003-10-08  Nick Roberts  <nick@nick.uklinux.net>
-
-       * speedbar.texi: Remove paragraph for GUD that is no longer true.
-
-2003-10-06  Luc Teirlinck  <teirllm@auburn.edu>
-
-       * texinfo.tex: Replace `%' in arch tagline by @ignore.
-
 2003-09-30  Richard M. Stallman  <rms@gnu.org>
 
-       * dired-x.texi (Miscellaneous Commands): Delete M-g, w, T.
-
-       * widget.texi (User Interface): Fix typos.
-
-       * pcl-cvs.texi, cl.texi, woman.texi, ediff.texi: Fix @strong{Note:}.
-
        * cmdargs.texi (General Variables): Remove MAILRC envvar.
 
        * misc.texi (Saving Emacs Sessions): Shorten the section,
 
        * xresources.texi (GTK names in Emacs): Correct typo.
 
-2003-09-29  Thien-Thi Nguyen  <ttn@gnu.org>
-
-       * pcl-cvs.texi (Selected Files): Fix typo.
-
 2003-09-24  Luc Teirlinck  <teirllm@mail.auburn.edu>
 
        * cmdargs.texi (Font X): Mention new default font.  More
 
        * cmdargs.texi (Action Arguments): -f reads interactive args.
 
-2003-09-21  Karl Berry  <karl@gnu.org>
-
-       * info.texi (] and [ commands): No period at end of section title.
-
 2003-09-08  Lute Kamstra  <lute@gnu.org>
 
        * screen.texi (Mode Line): Say that POS comes before LINE.
 
        * misc.texi (Saving Emacs Sessions): Correct previous change.
 
-2003-08-26  Per Abrahamsen  <abraham@dina.kvl.dk>
-
-       * widget.texi (User Interface): Explain the need of static text
-       around an editable field.
-
 2003-08-19  Luc Teirlinck  <teirllm@mail.auburn.edu>
 
-       * widget.texi (Basic Types): The argument to `:help-echo' can now
-       be a form that evaluates to a string.
-
        * emacs.texi (Top): Update menu to reflect new Keyboard Macros chapter.
        (Intro): Include kmacro.texi after fixit.texi instead of after
        custom.texi.  (As suggested by Kim Storm.)
 
        * emacs.texi (Keyboard Macros): Reference new keyboard macro topics.
 
-       * calc.texi (Queries in Macros): Update xref to keyboard macro query.
-
 2003-08-17  Edward M. Reingold  <reingold@emr.cs.iit.edu>
 
        * calendar.texi (Specified Dates): Add `calendar-goto-day-of-year'.
        * misc.texi (Saving Emacs Sessions): Manual M-x desktop-save not
        required.
 
-2003-08-16  Richard M. Stallman  <rms@gnu.org>
-
-       * dired-x.texi (Shell Command Guessing): Explain *.
-
-2003-08-16  Chunyu Wang  <spr@db.cs.hit.edu.cn>  (tiny change)
-
-       * pcl-cvs.texi (Log Edit Mode): Fix key binding for
-       log-edit-insert-changelog.
-
 2003-08-05  Richard M. Stallman  <rms@gnu.org>
 
        * programs.texi (Lisp Indent): Don't describe
        lisp-indent-function property here.  Use xref to Lisp Manual.
 
-2003-08-03  Karl Berry  <karl@gnu.org>
-
-       * info.texi: Need @contents.
-
 2003-08-03  Glenn Morris  <gmorris@ast.cam.ac.uk>
 
        * calendar.texi (Date Formats): Document changed behaviour of
 
        * buffers.texi (List Buffers): Fix previous change.
 
-2003-07-20  Kai Gro\e,A_\e(Bjohann  <kai.grossjohann@gmx.net>
-
-       Tramp version 2.0.36 released.
-
-       * tramp.texi (Remote shell setup): Explain about problems with
-       non-Bourne commands in ~/.profile and ~/.shrc.
-
 2003-07-13  Markus Rost  <rost@math.ohio-state.edu>
 
        * buffers.texi (List Buffers): Adjust to new format of *Buffer
 
 2003-07-07  Luc Teirlinck  <teirllm@mail.auburn.edu>
 
-       * info.texi (Help-Inv, Help-M, Help-Xref): Update following
-       renaming of `vis-mode' to `visible-mode'.
-
        * display.texi (Font Lock): Fix typo.
 
 2003-07-07  Richard M. Stallman  <rms@gnu.org>
 
        * help.texi (Library Keywords): Use @multitable.
 
-2003-07-04  Luc Teirlinck  <teirllm@mail.auburn.edu>
-
-       * info.texi (Top, Help-Small-Screen): Remove accidentally added
-       next, prev and up pointers.
-
-2003-07-02  Luc Teirlinck  <teirllm@mail.auburn.edu>
-
-       * info.texi (Help): Mention existence of Emacs and stand-alone
-       Info at the very beginning of the tutorial.
-       (Help-Inv): New node.
-       (Help-]): New node.
-       (Help-M): Systematically point out the differences between default
-       Emacs and stand-alone versions.  Delete second menu.
-       (Help-Xref): Systematically point out the differences between
-       default Emacs and stand-alone versions.
-       (Help-Int): Change `l' example.
-       (Expert Info): Fix typos.
-       (Emacs Info Variables): Mention `Info-hide-note-references' and
-       new default for `Info-scroll-prefer-subnodes'.
-
-2003-06-17  Kai Gro\e,A_\e(Bjohann  <kai.grossjohann@gmx.net>
-
-       Version 2.0.35 of Tramp released.
-
-       * tramp.texi: From Michael Albinus <Michael.Albinus@alcatel.de>:
-       (Inline methods): Add methods `remsh' and `plink1'.
-       (External transfer methods): Add method `remcp'.
-       (Multi-hop Methods): Add method `remsh'.
-       Small patch from Adrian Aichner <adrian@xemacs.org>:
-       Fix minor typos.
-       (Concept Index): Added to make manual searchable via
-       `Info-index'.
-       (Version Control): Add cindex entry.
-
 2003-06-04  Richard M. Stallman  <rms@gnu.org>
 
        * programs.texi (Expressions): Delete C-M-DEL.
        non-English letters.  Explain how to set coding systems correctly
        and how to include the right coding cookie in the file.
 
-2003-05-24  Kai Gro\e,A_\e(Bjohann  <kai.grossjohann@gmx.net>
-
-       * trampver.texi: Version 2.0.34 released.
-
 2003-05-22  Kai Gro\e,A_\e(Bjohann  <kai.grossjohann@gmx.net>
 
        * indent.texi (Indentation): Explain the concepts.
        (Just Spaces): Explain why preventing tabs for indentation might
        be useful.
 
-2003-05-03  Glenn Morris  <gmorris@ast.cam.ac.uk>
-
-       * faq.texi: Improve previous changes.
-
-2003-05-02  Glenn Morris  <gmorris@ast.cam.ac.uk>
-
-       * faq.texi: Update copyright and maintenance details.
-       Update some package URLs, versions, and maintainers.
-       Remove many references to the Emacs Lisp Archive.
-
-2003-04-23  Simon Josefsson  <jas@extundo.com>
-
-       * smtpmail.texi: Fix license (the invariant sections mentioned has
-       never been part of the smtp manual).  Align info dir entry with
-       other emacs packages.
-
 2003-04-16  Richard M. Stallman  <rms@gnu.org>
 
        * search.texi (Regexps): Ref to Lisp manual for more regexp features.
 
-2003-04-08  Michael Albinus  <Michael.Albinus@alcatel.de>
-
-       * tramp.texi: Version 2.0.33 released.
-       Remove installation chapter.  Remove XEmacs specifics.
-
-2003-03-29  Richard M. Stallman  <rms@gnu.org>
-
-       * tramp.texi (Top): Undo the previous renaming.
-       (emacs-other-name, emacs-other-dir, emacs-other-file-name): Delete.
-
-2003-03-29  Kai Gro\e,A_\e(Bjohann  <kai.grossjohann@gmx.net>
-
-       * Makefile.in (../info/tramp): Compile Emacs, instead of XEmacs,
-       version of manual.
-
-       * tramp.texi (Auto-save and Backup): New node.
-
-2003-03-29  Michael Albinus  <Michael.Albinus@alcatel.de>
-
-       * tramp.texi (Top): Include trampver.texi.  Rename "Emacs" to "GNU
-       Emacs" in order to have better differentiation to "XEmacs".
-       `emacs-other-name', `emacs-other-dir' and `emacs-other-file-name'
-       are new macros in order to point to the other Emacs flavor where
-       appropriate.  In info case, point to node `Installation' in order
-       to explain how to generate the other way.  In html case, make a
-       link to the other html file.
-       (Obtaining TRAMP): Added a paragraph saying to perform `autoconf'
-       after CVS checkout/update.
-       (Installation): Completely rewritten.
-       (Installation parameters, Load paths): New sections under
-       `Installation'.
-
-2003-02-28  Kai Gro\e,A_\e(Bjohann  <kai.grossjohann@uni-duisburg.de>
-
-       * tramp.texi: Version 2.0.30 released.
-       Replace word "path" with "localname" where used as a component of
-       a Tramp file name.
-
-2003-02-28  Michael Albinus  <Michael.Albinus@alcatel.de>
-
-       * tramp.texi (Frequently Asked Questions): `tramp-chunksize'
-       introduced.
-       (Installation): Explain what to do if files from the tramp/contrib
-       directory are needed.
-
-2003-02-23  Alex Schroeder  <alex@emacswiki.org>
-
-       * smtpmail.texi (How Mail Works): New.
-
 2003-02-22  Alex Schroeder  <alex@emacswiki.org>
 
        * cmdargs.texi (General Variables): Document SMTPSERVER.
 
-       * smtpmail.texi: New file.
-
        * sending.texi: Remove SMTP node.
        (Mail Sending): Describe `send-mail-function'.  Link to SMTP
        library.
 
-       * Makefile.in: Build SMTP manual.
-
 2003-02-22  Alex Schroeder  <alex@emacswiki.org>
 
        * sending.texi (Sending via SMTP): Explain MTA/MUA.
 
        * xresources.texi (GTK names in Emacs): Add emacs-toolbar - GtkToolbar.
 
-2003-02-05  Kai Gro\e,A_\e(Bjohann  <kai.grossjohann@uni-duisburg.de>
-
-       * tramp.texi: Version 2.0.29 released.
-       (Installation): In Emacs, use M-x texinfo-format-buffer RET, not
-       M-x makeinfo-buffer RET.  Reported by gebser@ameritech.net.
-
-2003-02-01  Michael Albinus  <Michael.Albinus@alcatel.de>
-
-       * tramp.texi (Frequently Asked Questions): Explain a workaround if
-       another package loads accidently Ange-FTP.
-
-2003-01-24  Michael Albinus  <Michael.Albinus@alcatel.de>
-
-       * tramp.texi (Customizing Completion): Add function
-       `tramp-parse-sconfig'.  Change example of
-       `tramp-set-completion-function', because parsing of ssh config
-       files looks more natural.
-
 2003-02-01  Kevin Ryde  <user42@zip.com.au>
 
        * glossary.texi (Glossary): Correction to cl cross reference.
        (GTK names in Emacs): New node.
        (GTK styles): New node.
 
-2003-01-15  ShengHuo ZHU  <zsh@cs.rochester.edu>
-
-       * gnus.texi: Do not use `path' in several locations.
-
 2003-01-09  Francesco Potort\e,Al\e(B  <pot@gnu.org>
 
        * maintaining.texi (Create Tags Table): Add reference to the new
        `etags --help --lang=LANG' option.
 
-2002-12-26  Kai Gro\e,A_\e(Bjohann  <kai.grossjohann@uni-duisburg.de>
-
-       * tramp.texi (External transfer methods): New method `smb'.  From
-       Michael Albinus.
-
-2002-11-05  Karl Berry  <karl@gnu.org>
-
-       * info.texi (Info-fontify): Reorder face list to avoid bad line
-       breaks.
-
-2002-10-06  Kai Gro\e,A_\e(Bjohann  <Kai.Grossjohann@CS.Uni-Dortmund.DE>
-
-       * tramp.texi: Move @copying to standard place.  Use
-       @insertcopying.
-
 2002-10-02  Karl Berry  <karl@gnu.org>
 
-       * (ada-mode.texi autotype.texi calc.texi cc-mode.texi cl.texi
-       dired-x.texi ebrowse.texi ediff.texi emacs-mime.texi emacs.texi
-       eshell.texi eudc.texi faq.texi forms.texi idlwave.texi info.texi
-       message.texi mh-e.texi pcl-cvs.texi reftex.texi sc.texi ses.texi
-       speedbar.texi vip.texi viper.texi widget.texi woman.texi):
-       Per rms, update all manuals to use @copying instead of @ifinfo.
-       Also use @ifnottex instead of @ifinfo around the top node, where
-       needed for the sake of the HTML output.
-       (The Gnus manual is not fixed since it's not clear to me how it
-       works; and the Tramp manual already uses @copying, although in an
-       unusual way.  All others were changed.)
-
-2002-09-10  Jonathan Yavner  <jyavner@engineer.com>
-
-       * Makefile.in (INFO_TARGETS, DVI_TARGETS): Add SES.
-       (../info/ses, ses.dvi): New targets.
-       * ses.texi: New file.
-
-2002-09-06  Pavel Jan\e,Am\e(Bk  <Pavel@Janik.cz>
-
-       * texinfo.tex: Update to texinfo 4.2.
-
-2002-08-27  Carsten Dominik  <dominik@sand.science.uva.nl>
-
-       * reftex.texi: Update to RefTeX 4.19.
-
-2002-06-17  Kai Gro\e,A_\e(Bjohann  <Kai.Grossjohann@CS.Uni-Dortmund.DE>
-
-       * Makefile.in (INFO_TARGETS, DVI_TARGETS): Add Tramp.
-       (../info/tramp, tramp.dvi): New targets.
-
-2002-01-04  Eli Zaretskii  <eliz@is.elta.co.il>
-
-       * Makefile.in (DVI_TARGETS): Add calc.dvi.
-       (calc.dvi): Uncomment.
+       * emacs.texi: Per rms, update all manuals to use @copying instead of
+       @ifinfo. Also use @ifnottex instead of @ifinfo around the top node,
+       where needed for the sake of the HTML output.
 
 2001-12-20  Eli Zaretskii  <eliz@is.elta.co.il>
 
 
        * Makefile.in (emacsman): New target.
 
-2001-11-07  Eli Zaretskii  <eliz@is.elta.co.il>
-
-       * Makefile.in (INFO_TARGETS): Add ../info/calc.
-       (../info/calc): New target.
-
 2001-10-20  Gerd Moellmann  <gerd@gnu.org>
 
        * (Version 21.1 released.)
 
        * Branch for 21.1.
 
-2001-04-14  Eli Zaretskii  <eliz@is.elta.co.il>
-
-       * Makefile.in (../info/info): Use an explicit -o switch to
-       makeinfo.
-
 2001-03-05  Gerd Moellmann  <gerd@gnu.org>
 
        * Makefile.in (mostlyclean, maintainer-clean): Delete more files.
 
-2000-12-20  Eli Zaretskii  <eliz@is.elta.co.il>
-
-       * Makefile.in (../info/idlwave): Use --no-split.
-
-2000-12-14  Dave Love  <fx@gnu.org>
-
-       * Makefile.in (mostlyclean): Remove gnustmp.*
-       (gnus.dvi): Change rule to remove @latex stuff.
-
-2000-10-19  Eric M. Ludlam  <zappo@ultranet.com>
-
-       * Makefile.in (Speedbar): Add build targets for speedbar.texi.
-
-2000-10-13  John Wiegley  <johnw@gnu.org>
-
-       * Makefile.in: Add build targets for eshell.texi.
-
-2000-09-25  Gerd Moellmann  <gerd@gnu.org>
-
-       * Makefile.in: Remove/comment speedbar stuff.
-
-2000-09-22  Dave Love  <fx@gnu.org>
-
-       * Makefile.in: Add emacs-mime.
-
-2000-08-08  Eli Zaretskii  <eliz@is.elta.co.il>
-
-       * Makefile.in (INFO_TARGETS): Add ../info/woman.
-       (DVI_TARGETS): Add woman.dvi.
-       (../info/woman, woman.dvi): New targets.
-
 2000-05-31  Stefan Monnier  <monnier@cs.yale.edu>
 
        * .cvsignore (*.tmp): New entry.  Seems to be used for @macro.
 
-       * pcl-cvs.texi: New file.
-       * Makefile.in (INFO_TARGETS, DVI_TARGETS: Add pcl-cvs.
-       (../info/pcl-cvs, pcl-cvs.dvi): New targets.
-
-2000-05-11  Gerd Moellmann  <gerd@gnu.org>
-
-       * Makefile.in (INFO_TARGETS): Add info/ebrowse.
-       (../info/ebrowse, ebrowse.dvi): New targets.
-
-2000-01-13  Gerd Moellmann  <gerd@gnu.org>
-
-       * Makefile.in (INFO_TARGETS): Add eudc.
-       (DVI_TARGETS): Add eudc.dvi.
-       (../info/eudc, eudc.dvi): New targets.
-
-2000-01-05  Eli Zaretskii  <eliz@is.elta.co.il>
-
-       * Makefile.in (INFO_TARGETS): Rename emacs-faq to efaq (for
-       compatibility with 8+3 filesystems).
-       (../info/efaq): Rename from emacs-faq.
-
-2000-01-03  Eli Zaretskii  <eliz@is.elta.co.il>
-
-       * Makefile.in (INFO_TARGETS, DVI_TARGETS): Add idlwave.
-       (../info/idlwave, idlwave.dvi): New targets.
-
-1999-10-23  Dave Love  <fx@gnu.org>
-
-       * Makefile.in: Use autotype.texi.
-
-1999-10-12  Stefan Monnier  <monnier@cs.yale.edu>
-
-       * Makefile.in (faq): Use ../info/emacs-faq.info (as specified in the
-       faq.texi file) rather than ../info/faq.
-
-1999-10-07  Gerd Moellmann  <gerd@gnu.org>
-
-       * Makefile.in (INFO_TARGETS, DVI_TARGETS): Add ada-mode.
-       (../info/ada-mode, ada-mode.dvi): New targets.
-
-1999-09-01  Dave Love  <fx@gnu.org>
-
-       * Makefile.in: Add faq.
-
 1999-07-12  Richard Stallman  <rms@gnu.org>
 
        * Version 20.4 released.
 
        * Makefile.in (ENVADD): Enviroment vars to pass to texi2dvi.  Use
        it in dvi targets.
-       (../etc/GNU): Change to $(srcdir) first.
-
-1998-03-11  Carsten Dominik  <cd@delysid.gnu.org>
-
-       * reftex.texi: Update for RefTeX version 3.22.
-
-1998-02-08  Richard Stallman  <rms@psilocin.gnu.org>
-
-       * Makefile.in (reftex.dvi, ../info/reftex): New targets.
-       (INFO_TARGETS, DVI_TARGETS): Add the new targets.
 
 1997-09-23  Paul Eggert  <eggert@twinsun.com>
 
        * Makefile.in: Merge changes mistakenly made to `Makefile'.
        (INFO_TARGETS): Change ../info/custom to ../info/customize.
        (../info/customize): Rename from ../info/custom.
-       (../info/viper, viper.dvi): Remove dependency on viper-cmd.texi.
 
 1997-09-19  Richard Stallman  <rms@psilocin.gnu.ai.mit.edu>
 
        (INFO_TARGETS): Add ../info/customize.
        (DVI_TARGETS): Add customize.dvi.
 
-1997-07-10  Richard Stallman  <rms@psilocin.gnu.ai.mit.edu>
-
-       * Makefile (../info/viper, viper.dvi): Delete viper-cmd.texi dep.
-
 1996-08-11  Richard Stallman  <rms@psilocin.gnu.ai.mit.edu>
 
        * Version 19.33 released.
 
        * Version 19.32 released.
 
-1996-06-27  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * Makefile.in: Add rules for the Message manual.
-
-1996-06-26  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi: New version.
-
-       * message.texi: New manual.
-
 1996-06-20  Richard Stallman  <rms@psilocin.gnu.ai.mit.edu>
 
        * Makefile.in (All info targets): cd $(srcdir) to do the work.
 
        * Version 19.31 released.
 
-1996-01-07  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
-
-       * Makefile.in (../info/ccmode): Rename from ../info/cc-mode.
-       (INFO_TARGETS): Use new name.  This avoids name conflict on MSDOS.
-
-1995-11-29  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-       * Makefile.in (../info/cc-mode, cc-mode.dvi): New targets.
-       (INFO_TARGETS): Add ../info/cc-mode.
-       (DVI_TARGETS): Add cc-mode.dvi.
-
 1995-11-24  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
 
        * Version 19.30 released.
 
-1995-11-04  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi: New file.
-
-1995-11-04  Erik Naggum  <erik@naggum.no>
-
-       * gnus.texi: File deleted.
-
-1995-11-02  Stephen Gildea  <gildea@stop.mail-abuse.org>
-
-       * mh-e.texi: "Function Index" -> "Command Index" to work with
-       Emacs 19.30 C-h C-k support of separately-documented commands.
-
-1995-06-26  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-       * Makefile.in (../info/ediff, ediff.dvi): New targets.
-       (INFO_TARGETS, DVI_TARGETS): Add those new targets.
-
-1995-04-24  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-       * Makefile.in (INFO_TARGETS, DVI_TARGETS): Add viper targets.
-       (../info/viper, viper.dvi): New targets.
-
-1995-04-20  Kevin Rodgers  <kevinr@ihs.com>
-
-       * dired-x.texi (Installation): Change the example to set
-       buffer-local variables like dired-omit-files-p in
-       dired-mode-hook.
-
-1995-04-17  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
-
-       * Makefile.in (INFO_TARGETS, DVI_TARGETS): Add mh-e targets.
-       (../info/mh-e, mh-e.dvi): New targets.
-
 1995-02-07  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
 
        * Makefile.in (maintainer-clean): Rename from realclean.
 
        * Makefile (.SUFFIXES): New rule.
 
-1994-01-15  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
-
-       * Makefile (dired-x.dvi, ../info/dired-x): New targets.
-       (INFO_TARGETS, DVI_TARGETS): Add the new targets.
-
-1994-01-08  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
-
-       * Makefile (../info/sc): Rename frin sc.info.
-       (../info/cl): Likewise.
-       (INFO_TARGETS): Use new names.
-
 1993-12-04  Richard Stallman  (rms@srarc2)
 
        * getopt.c: New file.
        * Makefile (TEXINDEX_OBJS): Use getopt.o in this dir, not ../lib-src.
        (getopt.o): New rule.
        (dvi): Don't depend on texindex.
-       (emacs.dvi, cl.dvi, forms.dvi, vip.dvi, gnus.dvi, sc.dvi):
-       Depend on texindex.
+       (emacs.dvi): Depend on texindex.
 
 1993-12-03  Richard Stallman  (rms@srarc2)
 
-       * Makefile (../info/sc.info): Rename from ../info/sc.
-       (TEXI2DVI): New variable.
-       (emacs.dvi, cl.dvi forms.dvi, sc.dvi, vip.dvi, gnus.dvi, info.dvi):
-       Add explicit commands.
+       * Makefile (TEXI2DVI): New variable.
+       (emacs.dvi): Add explicit command.
        (TEXINDEX_OBJS): Delete duplicate getopt.o.
 
 1993-11-27  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
 
        * Version 19.21 released.
 
-1993-11-15  Paul Eggert  (eggert@twinsun.com)
-
-       * man/Makefile (../info/cl.info): Rename from ../info/cl.
-
-1993-11-15  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
-
-       * Makefile (../etc/GNU): New target.
-       (EMACSSOURCES): Add gnu1.texi.
-
 1993-11-14  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
 
        * Makefile (realclean): Don't delete the Info files.
 
 1993-10-25  Brian Fox  (bfox@albert.gnu.ai.mit.edu)
 
-       * forms.texi: Fix forms.texi so that it will format correctly.
-       Add missing `@end iftex', fix bad reference.
-
-       * info.texi, info-stn.texi: New files implement texinfo version of
-       `info' file.
-
        * frames.texi (Creating Frames): Mention `C-x 5' instead of `C-x
        4' where appropriate.
 
 1993-10-20  Brian Fox  (bfox@ai.mit.edu)
 
-       * Makefile: Fix targets for texindex, new info.texi files.
-       * info-stnd.texi: New file implements info for standalone info
-       reader.
-       * info.texi: Update to include recent changes to "../info/info".
-       New source file for ../info/info; includes info-stnd.texi.
+       * Makefile: Fix targets for texindex.
 
        * texindex.c: Include "../src/config.h" if building in emacs.
 
        * Makefile: Change all files to FILENAME.texi, force all targets
-       to be FILENAME, not FILENAME.info.  This changes sc.texinfo,
-       vip.texinfo, forms.texinfo, cl.texinfo.
+       to be FILENAME, not FILENAME.info.
        Add target to build texindex.c, defining `emacs'.
 
-       * forms.texi: Install new file to match version 2.3 of forms.el.
-
 1993-08-14  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
 
        * Version 19.19 released.
 
-1993-08-10  Simon Leinen  (simon@lia.di.epfl.ch)
-
-       * sc.texinfo: Fix info file name.
-
-       * Makefile (info): Add gnus and sc.
-       (dvi): Add gnus.dvi and sc.dvi.
-       (../info/sc, sc.dvi): New targets.
-
 1993-08-08  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
 
        * Version 19.18 released.
 1993-07-20  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
 
        * Makefile: Fix source file names of the separate manuals.
-       (gnus.dvi, ../info/gnus): New targets.
 
 1993-07-18  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
 
 
        * emacs.tex: Update TeX ordering information.
 
-1990-08-30  David Lawrence  (tale@pogo.ai.mit.edu)
-
-       * gnus.texinfo: New file.  Removed installation instructions.
-
 1990-06-26  David Lawrence  (tale@geech)
 
        * emacs.tex: Note that completion-ignored-extensions is not used
 
        * emacs.tex: Add @findex grep.
 
-1989-01-17  Robert J. Chassell  (bob@rice-chex.ai.mit.edu)
-
-       * texinfo.tex: Change spelling of `\sc' font to `\smallcaps' and
-       then define `\sc' as the command for smallcaps in Texinfo.  This
-       means that the @sc command will produce small caps.  bfox has
-       made the corresponding change to makeinfo and texinfm.el.
-
 1988-08-16  Robert J. Chassell  (bob@frosted-flakes.ai.mit.edu)
 
        * emacs.tex: Correct two typos.  No other changes before
        Version 19 will be made.
 
-       * vip.texinfo: Remove menu entry Adding Lisp Code in node
-       Customization since the menu entry did not point to anything.
-       Also add an @finalout command to remove overfull hboxes from the
-       printed output.
-
-       * cl.texinfo: Add @bye, \input line and @settitle to file.
-       This file is clearly intended to be a chapter of some other work,
-       but the other work does not yet exist.
-
-1988-07-25  Robert J. Chassell  (bob@frosted-flakes.ai.mit.edu)
-
-       * texinfo.texinfo: Three typos corrected.
-
 1988-05-23  Robert J. Chassell  (bob@frosted-flakes.ai.mit.edu)
 
        * emacs.tex: Update information for obtaining TeX distribution from the
diff --git a/doc/emacs/Makefile.in b/doc/emacs/Makefile.in
new file mode 100644 (file)
index 0000000..f84c086
--- /dev/null
@@ -0,0 +1,159 @@
+#### Makefile for the Emacs Manual
+
+# Copyright (C) 1994, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
+#   2004, 2005, 2006, 2007 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, 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; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+# Boston, MA 02110-1301, USA.
+
+# Where to find the source code.  $(srcdir) will be the man
+# subdirectory of the source tree.  This is
+# set by the configure script's `--srcdir' option.
+srcdir=@srcdir@
+top_srcdir=@top_srcdir@
+
+# Tell make where to find source files; this is needed for the makefiles.
+VPATH=@srcdir@
+
+## Where the output files go.
+## Note that the setfilename command in the .texi files assumes this.
+infodir=../../info
+
+# The makeinfo program is part of the Texinfo distribution.
+# Use --force so that it generates output even if there are errors.
+MAKEINFO = makeinfo --force
+
+INFO_TARGETS = $(infodir)/emacs
+DVI_TARGETS  = emacs.dvi
+
+
+TEXI2DVI = texi2dvi
+
+# The following rule does not work with all versions of `make'.
+.SUFFIXES: .texi .dvi
+.texi.dvi:
+       $(TEXI2DVI) $<
+
+ENVADD = TEXINPUTS="$(srcdir):$(TEXINPUTS)" MAKEINFO="$(MAKEINFO) -I$(srcdir)"
+
+
+EMACS_XTRA=\
+       $(srcdir)/arevert-xtra.texi \
+       $(srcdir)/cal-xtra.texi \
+       $(srcdir)/dired-xtra.texi \
+       $(srcdir)/picture-xtra.texi \
+       $(srcdir)/emerge-xtra.texi \
+       $(srcdir)/vc-xtra.texi \
+       $(srcdir)/vc1-xtra.texi \
+       $(srcdir)/vc2-xtra.texi \
+       $(srcdir)/fortran-xtra.texi \
+       $(srcdir)/msdog-xtra.texi
+
+EMACSSOURCES= \
+       ${srcdir}/emacs.texi \
+       ${srcdir}/doclicense.texi \
+       ${srcdir}/gpl.texi \
+       ${srcdir}/screen.texi \
+       ${srcdir}/commands.texi \
+       ${srcdir}/entering.texi \
+       ${srcdir}/basic.texi \
+       ${srcdir}/mini.texi \
+       ${srcdir}/m-x.texi \
+       ${srcdir}/help.texi \
+       ${srcdir}/mark.texi \
+       ${srcdir}/killing.texi \
+       ${srcdir}/regs.texi \
+       ${srcdir}/display.texi \
+       ${srcdir}/search.texi \
+       ${srcdir}/fixit.texi \
+       ${srcdir}/files.texi \
+       ${srcdir}/buffers.texi \
+       ${srcdir}/windows.texi \
+       ${srcdir}/frames.texi \
+       ${srcdir}/mule.texi \
+       ${srcdir}/major.texi \
+       ${srcdir}/indent.texi \
+       ${srcdir}/text.texi \
+       ${srcdir}/programs.texi \
+       ${srcdir}/building.texi \
+       ${srcdir}/maintaining.texi \
+       ${srcdir}/abbrevs.texi \
+       ${srcdir}/sending.texi \
+       ${srcdir}/rmail.texi \
+       ${srcdir}/dired.texi \
+       ${srcdir}/calendar.texi \
+       ${srcdir}/misc.texi \
+       ${srcdir}/custom.texi \
+       ${srcdir}/trouble.texi \
+       ${srcdir}/cmdargs.texi \
+       ${srcdir}/xresources.texi \
+       ${srcdir}/anti.texi \
+       ${srcdir}/macos.texi \
+       ${srcdir}/msdog.texi \
+       ${srcdir}/gnu.texi \
+       ${srcdir}/glossary.texi \
+       ${srcdir}/ack.texi \
+       ${srcdir}/kmacro.texi \
+       $(EMACS_XTRA)
+
+info: $(infodir) $(INFO_TARGETS)
+
+$(infodir):
+       mkdir $@
+
+dvi: $(DVI_TARGETS)
+
+# Note that all the Info targets build the Info files
+# in srcdir.  There is no provision for Info files
+# to exist in the build directory.
+# In a distribution of Emacs, the Info files should be up to date.
+
+emacs : $(infodir)/emacs
+
+$(infodir)/emacs: ${EMACSSOURCES}
+       cd $(srcdir); $(MAKEINFO) emacs.texi
+
+emacs.dvi: ${EMACSSOURCES}
+       $(ENVADD) $(TEXI2DVI) ${srcdir}/emacs.texi
+
+
+emacs-xtra.dvi: emacs-xtra.texi $(EMACS_XTRA)
+       $(ENVADD) $(TEXI2DVI) ${srcdir}/emacs-xtra.texi
+
+
+mostlyclean:
+       rm -f *.log *.cp *.fn *.ky *.op *.ops *.pg *.vr core *.tp *.core
+       rm -f *.aux *.cps *.fns *.kys *.pgs *.vrs *.toc
+
+clean: mostlyclean
+       rm -f *.dvi
+
+distclean: clean
+#      rm -f Makefile
+
+maintainer-clean: distclean
+       for file in $(INFO_TARGETS); do rm -f $${file}*; done
+
+
+# Formerly this directory had texindex.c and getopt.c in it
+# and this makefile built them to make texindex.
+# That caused trouble because this is run entirely in the source directory.
+# Since we expect to get texi2dvi from elsewhere,
+# it is ok to expect texindex from elsewhere also.
+
+
+### Makefile ends here
similarity index 100%
rename from man/abbrevs.texi
rename to doc/emacs/abbrevs.texi
diff --git a/doc/emacs/ack.texi b/doc/emacs/ack.texi
new file mode 100644 (file)
index 0000000..d5dbf1a
--- /dev/null
@@ -0,0 +1,1574 @@
+@c This is part of the Emacs manual.
+@c Copyright (C) 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2002, 2003,
+@c   2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+@c See file emacs.texi for copying conditions.
+@c
+@node Acknowledgments, Screen, Concept Index, Top
+@unnumbered Acknowledgments
+
+Many people have contributed code included in the Free Software
+Foundation's distribution of GNU Emacs.  To show our appreciation for
+their public spirit, we list here in alphabetical order those who have
+written substantial portions.
+
+@c We should list here anyone who has contributed a new package,
+@c and anyone who has made major enhancements in Emacs
+@c that many users would notice and consider important.
+
+@itemize @bullet
+@item
+Per Abrahamsen wrote the customization buffer facilities, as well as
+@file{double.el} for typing accented characters not normally available
+from the keyboard, @file{xt-mouse.el} which handles mouse commands
+through Xterm, @file{gnus-cus.el} which implements customization
+commands for Gnus, @file{gnus-cite.el}, a citation-parsing facility
+for news articles and @file{cpp.el} which hides or highlights parts of
+C programs according to preprocessor conditionals.
+
+@item
+Tomas Abrahamsson wrote @file{artist.el}, a package for producing @acronym{ASCII}
+art with a mouse or with keyboard keys.
+
+@item
+Jay K.@: Adams wrote @file{jka-compr.el}, providing automatic
+decompression and recompression for compressed files.
+
+@item
+Ralf Angeli wrote @file{scroll-lock.el}, a minor mode which keeps the
+point vertically fixed by scrolling the window when moving up and down
+in the buffer.
+
+@item
+Joe Arceneaux wrote the original text property implementation, and
+implemented support for X11.
+
+@item
+Miles Bader wrote @file{image-file.el}, support code for visiting
+image files, @file{minibuf-eldef.el}, a minor mode whereby the default
+value is shown in the minibuffer prompt only when appropriate, and
+@file{button.el}, the library that implements clickable buttons.
+
+@item
+David Bakhash wrote @file{strokes.el}, a mode for controlling Emacs by
+moving the mouse in particular patterns.
+
+@item
+Eli Barzilay wrote @file{calculator.el}, a desktop calculator for
+Emacs.
+
+@item
+Steven L.@: Baur wrote
+@c If earcon.el actually works with Emacs 21, it isn't useful for lack
+@c of  sound files. -- fx
+@c @file{earcon.el}, a facility for sound effects
+@c for email and news messages,
+@file{footnote.el} which lets you include
+footnotes in email messages, and @file{gnus-audio.el} which provides
+sound effects for Gnus.
+
+@item
+Alexander L. Belikoff, Sergey Berezin, David Edmondson, Andreas
+Fuchs, Mario Lang, Gergely Nagy, Michael Olson, and Alex Schroeder
+contributed ERC, an advanced Internet Relay Chat client.
+
+@item
+Boaz Ben-Zvi wrote @file{profile.el}, to time Emacs Lisp functions.
+
+@item
+Anna M. Bigatti wrote @file{cal-html.el}, which produces HTML calendars.
+
+@item
+Ray Blaak wrote @file{delphi.el}, a major mode for editing Delphi
+(Object Pascal) source code.
+
+@item
+Jim Blandy wrote Emacs 19's input system, brought its configuration and
+build process up to the GNU coding standards, and contributed to the
+frame support and multi-face support.  Jim also wrote @file{tvi970.el},
+terminal support for the TeleVideo 970 terminals.
+
+@item
+Per Bothner wrote @file{term.el}, a terminal emulator in an Emacs
+buffer.
+
+@item
+Terrence M.@: Brannon wrote @file{landmark.el}, a neural-network robot
+that learns landmarks.
+
+@item
+Frank Bresz wrote @file{diff.el}, a program to display @code{diff}
+output.
+
+@item
+Peter Breton implemented:
+
+@itemize @minus
+@item
+@file{dirtrack} which does better tracking of directory changes in shell
+buffers,
+@item
+@file{filecache.el} which records which directories your files are in,
+@item
+@file{locate.el} which interfaces to the @code{locate} command,
+@item
+@file{find-lisp.el}, an Emacs Lisp emulation of the @code{find} program,
+@item
+@file{net-utils.el}, and
+@item
+the ``generic mode'' feature.
+@end itemize
+
+@item
+Emmanuel Briot wrote @file{xml.el}, an XML parser for Emacs.
+
+@item
+Kevin Broadey wrote @file{foldout.el}, providing folding extensions to
+Emacs's outline modes.
+
+@c  @item
+@c  Vincent Broman wrote @file{ada.el}, a mode for editing Ada code
+@c  (since replaced by @file{ada-mode.el}).
+
+@item
+David M.@: Brown wrote @file{array.el}, for editing arrays and other
+tabular data.
+
+@item
+W@l{}odek Bzyl and Ryszard Kubiak wrote @file{ogonek.el}, a package for
+changing the encoding of Polish characters.
+
+@item
+Bill Carpenter provided @file{feedmail.el}, a package for massaging
+outgoing mail messages and sending them through various popular mailers.
+
+@item
+Per Cederqvist and Inge Wallin wrote @file{ewoc.el}, an Emacs widget for
+manipulating object collections.
+
+@item
+Hans Chalupsky wrote @file{advice.el}, an overloading mechanism for
+Emacs Lisp functions, and @file{trace.el}, a tracing facility for Emacs
+Lisp.
+
+@item
+Chris Chase and Carsten Dominik wrote @file{idlwave.el}, an editing mode
+for IDL and WAVE CL.
+
+@item
+Bob Chassell wrote @file{texnfo-upd.el} and @file{makeinfo.el}, modes
+and utilities for working with Texinfo files; and @file{page-ext.el},
+commands for extended page handling.
+
+@item
+Andrew Choi wrote the Macintosh support code, and contributed
+@file{mac-win.el}, support for the Mac window system.
+
+@item
+James Clark wrote @file{sgml-mode.el}, a mode for editing SGML
+documents, and contributed to Emacs's dumping procedures.
+
+@item
+Mike Clarkson wrote @file{edt.el}, an emulation of DEC's EDT editor.
+
+@item
+Glynn Clements provided @file{gamegrid.el} and a couple of games that
+use it, Snake and Tetris.
+
+@item
+Georges Brun-Cottan and Stefan Monnier wrote @file{easy-mmode.el}, a
+package for easy definition of major and minor modes.
+
+@item
+Andrew Csillag wrote M4 mode (@file{m4-mode.el}).
+
+@item
+Doug Cutting and Jamie Zawinski wrote @file{disass.el}, a disassembler
+for compiled Emacs Lisp code.
+
+@item
+Mathias Dahl wrote @file{image-dired.el}, a package for viewing image
+files as ``thumbnails.''
+
+@item
+Michael DeCorte wrote @file{emacs.csh}, a C-shell script that starts a
+new Emacs job, or restarts a paused Emacs if one exists.
+
+@item
+Gary Delp wrote @file{mailpost.el}, an interface between RMAIL and the
+@file{/usr/uci/post} mailer.
+
+@item
+Matthieu Devin wrote @file{delsel.el}, a package to make newly-typed
+text replace the current selection.
+
+@item
+Eric Ding contributed @file{goto-addr.el},
+
+@item
+Jan Dj@"{a}rv added support for the GTK+ toolkit and X drag-and-drop.
+
+@item
+Carsten Dominik wrote @file{reftex.el}, a package for setting up
+labels and cross-references in La@TeX{} documents, and @file{org.el},
+a mode for maintaining notes, todo lists, and project planning.
+
+@item
+Scott Draves wrote @file{tq.el}, help functions for maintaining
+transaction queues between Emacs and its subprocesses.
+
+@item
+Benjamin Drieu wrote @file{pong.el}, an implementation of the classical
+pong game.
+
+@item
+Viktor Dukhovni wrote support for dumping under SunOS version 4.
+
+@item
+John Eaton co-wrote Octave mode.
+
+@item
+Rolf Ebert co-wrote Ada mode (@file{ada-mode.el}).
+
+@item
+Stephen Eglen implemented @file{mspools.el}, for use with Procmail,
+which tells you which mail folders have mail waiting in them, and
+@file{iswitchb.el}, a feature for incremental reading and completion of
+buffer names.
+
+@item
+Torbj@"orn
+Einarsson contributed the  Fortran 90 mode (@file{f90.el}).
+
+@item
+Tsugutomo Enami co-wrote the support for international character sets.
+
+@item
+Hans Henrik Eriksen wrote @file{simula.el}, a mode for editing SIMULA 87
+code.
+
+@item
+Michael Ernst wrote @file{reposition.el}, a command for recentering a
+function's source code and preceding comment on the screen.
+
+@item
+Ata Etemadi wrote @file{cdl.el}, functions for working with Common Data
+Language source code.
+
+@item
+Frederick Farnbach implemented @file{morse.el}, which converts text to
+Morse code.
+
+@item
+Oscar Figueiredo wrote EUDC, the Emacs Unified Directory Client, which
+is an interface to directory servers via LDAP, CCSO PH/QI, or BBDB; and
+@file{ldap.el}, the LDAP client interface.
+
+@item
+Fred Fish wrote the support for dumping COFF executable files.
+
+@item
+Karl Fogel wrote:
+
+@itemize @minus
+@item
+@file{bookmark.el}, for creating named placeholders, saving them and
+jumping to them later,
+@item
+@file{mail-hist.el}, a history mechanism for outgoing mail messages, and
+@item
+@file{saveplace.el}, for preserving point's location in files between
+editing sessions.
+@end itemize
+
+@item
+Gary Foster wrote @file{crisp.el}, the emulation for CRiSP and Brief
+editors, and @file{scroll-lock.el} (now @file{scroll-all.el}) a mode
+for scrolling several buffers together.
+
+@item
+Noah Friedman wrote @file{rlogin.el}, an interface to Rlogin,
+@file{type-break.el}, which reminds you to take periodic breaks from
+typing, and @code{eldoc-mode}, a mode to show the defined parameters or
+the doc string for the Lisp function near point.  With Roland McGrath,
+he wrote @file{rsz-mini.el}, a minor mode to automatically resize the
+minibuffer to fit the text it contains.
+
+@item
+Keith Gabryelski wrote @file{hexl.el}, a mode for editing binary files.
+
+@item
+Kevin Gallagher rewrote and enhanced the EDT emulation, and wrote
+@file{flow-ctrl.el}, a package for coping with unsuppressible XON/XOFF
+flow control.
+
+@item
+Kevin Gallo added multiple-frame support for Windows NT and wrote
+@file{w32-win.el}, support functions for the MS-Windows window system.
+
+@item
+Juan Le@'{o}n Lahoz Garc@'{i}a wrote @file{wdired.el}, a package for
+performing file operations by directly editing Dired buffers.
+
+@item
+Howard Gayle wrote:
+
+@itemize @minus
+@item
+the C and lisp code for display tables and case tables,
+@item
+@file{rot13.el}, a command to display the plain-text form of a buffer
+encoded with the Caesar cipher,
+@item
+@file{case-table.el}, code to extend the character set and support case
+tables,
+@item
+much of the support for the ISO-8859 European character sets (which
+includes @file{iso-ascii.el}, @file{iso-insert.el}, @file{iso-swed.el},
+@file{latin-1.el}, @file{iso-syntax.el}, @file{iso-transl.el},
+@file{swedish.el}), and
+@item
+@file{vt100-led.el}, a package for controlling the LED's on
+VT100-compatible terminals.
+@end itemize
+
+@item
+Stephen Gildea made the Emacs quick reference card, and made many
+contributions for @file{time-stamp.el}, a package for maintaining
+last-change time stamps in files.
+
+@item
+Julien Gilles wrote @file{gnus-ml.el}, a mailing list minor mode for
+Gnus.
+
+@item
+David Gillespie wrote:
+
+@itemize @minus
+@item
+The Common Lisp compatibility packages,
+@item
+@code{Calc}, an advanced calculator and mathematical tool,
+@item
+@file{complete.el}, a partial completion mechanism, and
+@item
+@file{edmacro.el}, a package for editing keyboard macros.
+@end itemize
+
+@item
+Bob Glickstein contributed the @file{sregex.el} feature, a facility for
+writing regexps using a Lisp-like syntax.
+
+@item
+Boris Goldowsky wrote:
+
+@itemize @minus
+@item
+@file{avoid.el}, a package to keep the mouse cursor out of the way of
+the text cursor,
+@item
+@file{shadowfile.el}, a package for keeping identical copies of files in
+more than one place,
+@item
+@file{format.el}, a package for reading and writing files in various
+formats,
+@item
+@file{enriched.el}, a package for saving text properties in files, and
+@item
+@file{facemenu.el}, a package for specifying faces.
+@end itemize
+
+@item
+Michelangelo Grigni wrote @file{ffap.el} which visits a file,
+taking the file name from the buffer.
+
+@item
+Odd Gripenstam wrote @file{dcl-mode.el} for editing DCL command files.
+
+@item
+Kai Gro@ss{}johann and Michael Albinus wrote the Tramp package, which
+provides transparent remote file editing using rcp, ssh, ftp, and other
+network protocols.
+
+@item
+Michael Gschwind wrote @file{iso-cvt.el}, a package to convert between
+the ISO 8859-1 character set and the notations for non-@acronym{ASCII}
+characters used by @TeX{} and net tradition, and @file{latin-2.el}, code
+which sets up case-conversion and syntax tables for the ISO Latin-2
+character set.
+
+@item
+Henry Guillaume wrote @file{find-file.el}, a package to visit files
+related to the currently visited file.
+
+@item
+Doug Gwyn wrote the portable @code{alloca} implementation.
+
+@item
+Ken'ichi Handa implemented most of the support for international
+character sets, and wrote @file{isearch-x.el}, a facility for searching
+non-@acronym{ASCII} text.  Together with Naoto Takahashi, he wrote
+@file{quail.el}, a simple input facility for typing non-@acronym{ASCII} text from
+an @acronym{ASCII} keyboard.  Ken'ichi also wrote @file{ps-bdf.el}, a BDF font
+support for printing non-@acronym{ASCII} text on a PostScript printer.
+
+@item
+Chris Hanson wrote @file{netuname.el}, a package to use HP-UX's Remote
+File Access facility from Emacs.
+
+@item
+Jesper Harder wrote @file{yenc.el}, for decoding yenc encoded messages.
+
+@item
+K. Shane Hartman wrote:
+
+@itemize @minus
+@item
+@file{chistory.el} and @file{echistory.el}, packages for browsing
+command history lists,
+@item
+@file{electric.el} and @file{helper.el}, providing an alternative
+command loop and appropriate help facilities,
+@item
+@file{emacsbug.el}, a package for reporting Emacs bugs,
+@item
+@file{picture.el}, a mode for editing @acronym{ASCII} pictures, and
+@item
+@file{view.el}, a package for perusing files and buffers without editing
+them.
+@end itemize
+
+@item
+John Heidemann wrote @file{mouse-copy.el} and @file{mouse-drag.el},
+which provide alternative mouse-based editing and scrolling features.
+
+@item
+Jon K Hellan wrote @file{utf7.el}, support for mail-safe transformation
+format of Unicode.
+
+@item
+Markus Heritsch co-wrote Ada mode (@file{ada-mode.el}).
+
+@item
+Karl Heuer wrote the original blessmail script, implemented the
+@code{intangible} text property, and rearranged the structure of the
+@code{Lisp_Object} type to allow for more data bits.
+
+@item
+Manabu Higashida ported Emacs to MS-DOS.
+
+@item
+Anders Holst wrote @file{hippie-exp.el}, a versatile completion and
+expansion package.
+
+@item
+Kurt Hornik co-wrote Octave mode.
+
+@item
+Tom Houlder wrote @file{mantemp.el}, which generates manual C@t{++}
+template instantiations.
+
+@item
+Joakim Hove wrote @file{html2text.el}, a html to plain text converter.
+@item
+Denis Howe wrote @file{browse-url.el}, a package for invoking a WWW
+browser to display a URL.
+
+@item
+Lars Magne Ingebrigtsen did a major redesign of the Gnus news-reader and
+wrote many of its parts.
+
+@item
+Andrew Innes contributed extensively to the MS-Windows support.
+
+@item
+Seiichiro Inoue improved Emacs's XIM support.
+
+@item
+Ulf Jasper wrote @file{icalendar.el}, a package for converting Emacs
+diary entries to and from the iCalendar format, and
+@file{newsticker.el}, an RSS and Atom based Newsticker.
+
+@item
+Kyle Jones wrote @file{life.el}, a package to play Conway's ``life'' game,
+and @file{mldrag.el}, a package which allows the user to resize windows
+by dragging mode lines and vertical window separators with the mouse.
+
+@item
+Terry Jones wrote @file{shadow.el}, a package for finding potential
+load-path problems when some Lisp file ``shadows'' another.
+
+@item
+Simon Josefsson wrote:
+
+@itemize @minus
+@item
+@file{dns-mode.el}, an editing mode for Domain Name System master files,
+@item
+@file{flow-fill.el}, a package for interpreting RFC2646 formatted text
+in messages,
+@item
+@file{fringe.el}, a package for customizing the fringe,
+@item
+@file{imap.el}, an Emacs Lisp library for talking to IMAP servers,
+@item
+@file{nnimap}, the IMAP back-end for Gnus, and
+@item
+@file{rfc2104.el}, a hashed message authentication facility.
+@end itemize
+
+@item
+Arne J@o{}rgensen wrote @file{latexenc.el}, a package to
+automatically guess the correct coding system in LaTeX files.
+
+@item
+Tomoji Kagatani implemented @file{smtpmail.el}, used for sending out
+mail with SMTP.
+
+@item
+David Kaufman wrote @file{yow.c}, an essential utility program for the
+hopelessly pinheaded.
+
+@item
+Henry Kautz wrote @file{bib-mode.el}, a mode for maintaining
+bibliography databases compatible with @code{refer} (the @code{troff}
+version) and @code{lookbib}, and @file{refbib.el}, a package to convert
+those databases to the format used by the LaTeX text formatting package.
+
+@item
+Taichi Kawabata added support for Devanagari script and the Indian
+languages.
+
+@item
+Howard Kaye wrote @file{sort.el}, commands to sort text in Emacs
+buffers.
+
+@item
+Michael Kifer wrote @file{ediff.el}, an interactive interface to the
+@command{diff}, @command{patch}, and @command{merge} programs, and
+Viper, the newest emulation for VI.
+
+@item
+Richard King wrote the first version of @file{userlock.el} and
+@file{filelock.c}, which provide simple support for multiple users
+editing the same file.  He also wrote the initial version of
+@file{uniquify.el}, a facility to make buffer names unique by adding
+parts of the file's name to the buffer name.
+@c We're not using his backquote.el any more.
+
+@item
+Peter Kleiweg wrote @file{ps-mode.el}, a major mode for editing
+PostScript files and running a PostScript interpreter interactively from
+within Emacs.
+
+@item
+Pavel Kobiakov wrote @file{flymake.el}, a minor mode for performing
+on-the-fly syntax checking.
+
+@item
+Larry K.@: Kolodney wrote @file{cvtmail.c}, a program to convert the mail
+directories used by Gosling Emacs into RMAIL format.
+
+@item
+David M.@: Koppelman wrote @file{hi-lock.el}, a minor mode for
+interactive automatic highlighting of parts of the buffer text.
+
+@item
+Koseki Yoshinori wrote @file{iimage.el}, a minor mode for displaying
+inline images.
+
+@item
+Robert Krawitz wrote the original @file{xmenu.c}, part of Emacs's pop-up
+menu support.
+
+@item
+Sebastian Kremer wrote Emacs 19's @code{dired-mode}, with contributions
+by Lawrence R.@: Dodd.  He also wrote @file{ls-lisp.el}, a Lisp emulation
+of the @code{ls} command for platforms which don't have @code{ls} as a
+standard program.
+
+@item
+Geoff Kuenning wrote Emacs 19's @file{ispell.el}, based on work by Ken
+Stevens and others.
+
+@item
+David K@ringaccent{a}gedal wrote @file{tempo.el}, providing support for
+easy insertion of boilerplate text and other common constructions.
+
+@item
+Daniel LaLiberte wrote:
+
+@itemize @minus
+@item
+@file{edebug.el}, a source-level debugger for Emacs Lisp,
+@item
+@file{cl-specs.el}, specifications to help @code{edebug} debug code
+written using David Gillespie's Common Lisp support,
+@item
+@file{cust-print.el}, a customizable package for printing lisp objects,
+@item
+@file{eval-reg.el}, a re-implementation of @code{eval-region} in Emacs
+Lisp, and
+@item
+@file{isearch.el}, Emacs's incremental search minor mode.
+@end itemize
+
+@item
+James R.@: Larus wrote @file{mh-e.el}, an interface to the MH mail system.
+
+@item
+Vinicius Jose Latorre wrote the Emacs printing facilities, as well as:
+
+@itemize @minus
+@item
+@code{ps-print}, a package for pretty-printing Emacs buffers to
+PostScript printers,
+@item
+@file{delim-col.el}, a package to arrange text into columns,
+@item
+@file{ebnf2ps.el}, a package that translates EBNF grammar to a syntactic
+chart that can be printed to a PostScript printer.
+@end itemize
+
+@item
+Frederic Lepied contributed @file{expand.el}, which uses the abbrev
+mechanism for inserting programming constructs.
+
+@item
+Peter Liljenberg wrote @file{elint.el}, a Lint-style code checker for
+Emacs Lisp programs.
+
+@item
+Lars Lindberg wrote @file{msb.el}, which provides more flexible menus
+for buffer selection, and rewrote @file{dabbrev.el}.
+
+@item
+Anders Lindgren wrote @file{autorevert.el}, a package for automatically
+reverting files visited by Emacs that were changed on disk;
+@file{cwarn.el}, a package to highlight suspicious C and C@t{++}
+constructs; and @file{follow.el}, a minor mode to synchronize windows
+that show the same buffer.
+
+@item
+Thomas Link wrote @file{filesets.el}, a package for handling sets of
+files.
+
+@item
+Dave Love wrote much of the code dealing with Unicode support and
+Latin-N unification.  He added support for many coding systems,
+including those in @file{code-pages.el} and the various UTF-7 and
+UTF-16 coding systems.  He also wrote:
+
+@itemize @minus
+@item
+@code{autoarg-mode}, a global minor mode whereby digit keys supply
+prefix arguments, and @code{autoarg-kp-mode} which redefines the keypad
+numeric keys to digit arguments,
+@item
+@file{autoconf.el}, a mode for editing Autoconf @file{configure.in}
+files,
+@item
+@file{cfengine.el}, a mode for editing Cfengine files,
+@item
+@file{elide-head.el}, a package for eliding boilerplate text, such as
+copyright notices, from file headers,
+@item
+@file{hl-line.el}, a package that provides a minor mode for highlighting
+the line in the current window on which point is,
+@item
+@file{latin-8.el} and @file{latin-9.el}, code which sets up
+case-conversion and syntax tables for the ISO Latin-8 and Latin-9
+character sets,
+@item
+@file{latin1-disp.el}, a package that lets you display ISO 8859
+characters on Latin-1 terminals by setting up appropriate display
+tables,
+@item                                                                          
+@file{python.el}, a major mode for the Python programming language.
+@item
+@file{refill.el}, a mode for automatic paragraph refilling, akin to
+typical word processors,
+@item
+@file{smiley-ems.el}, a facility for displaying smiley faces, and
+@item
+@file{tool-bar.el}, a mode to control the display of the Emacs tool bar.
+@end itemize
+
+@item
+Eric Ludlam wrote the Speedbar package and the following packages:
+
+@itemize @minus
+@item
+@file{checkdoc.el}, for checking doc strings in Emacs Lisp programs,
+@item
+@file{dframe.el}, providing dedicatd frame support modes, and
+@item
+@file{ezimage.el}, a generalized way to place images over text.
+@end itemize
+
+@item
+Alan Mackenzie wrote the integrated AWK support in CC Mode.
+
+@item
+Christopher J.@: Madsen wrote @file{decipher.el}, a package for cracking
+simple substitution ciphers.
+
+@item
+Neil M.@: Mager wrote @file{appt.el}, functions to notify users of their
+appointments.  It finds appointments recorded in the diary files
+generated by Edward M.@: Reingold's @code{calendar} package.
+
+@item
+Ken Manheimer wrote @file{allout.el}, a mode for manipulating and
+formatting outlines, and @file{icomplete.el}, which provides incremental
+completion feedback in the minibuffer.
+
+@item
+Bill Mann wrote @file{perl-mode.el}, a mode for editing Perl code.
+
+@item
+Brian Marick and Daniel LaLiberte wrote @file{hideif.el}, support for
+hiding selected code within C @code{#ifdef} clauses.
+
+@item
+Simon Marshall wrote @file{regexp-opt.el}, which generates a regular
+expression from a list of strings.  He also extended @file{comint.el},
+originally written by Olin Shivers.
+
+@item
+Bengt Martensson, Marc Shapiro, Mike Newton, Aaron Larson, and Stefan
+Schoef, wrote @file{bibtex.el}, a mode for editing Bib@TeX{}
+bibliography files.
+
+@item
+Charlie Martin wrote @file{autoinsert.el}, which provides automatic
+mode-sensitive insertion of text into new files.
+
+@item
+Thomas May wrote @file{blackbox.el}, a version of the traditional
+blackbox game.
+
+@item
+Roland McGrath wrote:
+
+@itemize @minus
+@item
+@file{compile.el}, a package for running compilations in a buffer, and
+then visiting the locations reported in error messages,
+@item
+@file{etags.el}, a package for jumping to function definitions and
+searching or replacing in all the files mentioned in a @file{TAGS} file,
+@item
+@file{find-dired.el}, for using @code{dired} commands on output from the
+@code{find} program, with Sebastian Kremer,
+@item
+@file{map-ynp.el}, a general purpose boolean question-asker,
+@item
+@file{autoload.el}, providing semi-automatic maintenance of autoload
+files, and
+@item
+@file{upd-copyr.el}, providing semi-automatic maintenance of copyright
+notices in source code.
+@end itemize
+
+@item
+David Megginson wrote @file{derived.el}, which allows one to define new
+major modes by inheriting key bindings and commands from existing major
+modes.
+
+@item
+Will Mengarini wrote @file{repeat.el}, a command to repeat the preceding
+command with its arguments.
+
+@item
+Wayne Mesard wrote @file{hscroll.el} which does horizontal scrolling
+automatically.
+
+@item
+Brad Miller wrote @file{gnus-gl.el}, a Gnus interface for GroupLens.
+
+@item
+Richard Mlynarik wrote:
+
+@itemize @minus
+@item
+@file{cl-indent.el}, a package for indenting Common Lisp code,
+@item
+@file{ebuff-menu.el}, an ``electric'' browser for buffer listings,
+@item
+@file{ehelp.el}, bindings for browsing help screens,
+@item
+@file{rfc822.el}, a parser for E-mail addresses in the RFC-822 format,
+used in mail messages and news articles,
+@item
+@file{terminal.el}, a terminal emulator for Emacs subprocesses, and
+@item
+@file{yow.el}, an essential utility (try @kbd{M-x yow}).
+@end itemize
+
+@item
+Gerd Moellmann was the Emacs maintainer from the beginning of Emacs 21
+development until the release of 21.1.  He wrote:
+
+@itemize @minus
+@item
+the new display engine for Emacs 21,
+@item
+the asynchronous timers facility (@file{atimer.c}),
+@item
+the @code{ebrowse} C@t{++} browser,
+@item
+@file{jit-lock.el}, the Just-In-Time font-lock support mode,
+@item
+@file{tooltip.el}, a package for displaying tooltips, and
+@item
+@file{authors.el} package for maintaining the @file{AUTHORS} files.
+@end itemize
+
+@item
+Stefan Monnier added support for Arch, Subversion, and Meta-CVS to VC,
+and re-wrote much of the Emacs server to use the built-in networking
+primitives.  He also wrote:
+
+@itemize @minus
+@item
+@code{PCL-CVS}, a directory-level front end to the CVS version control
+system,
+@item
+@file{reveal.el}, a minor mode for automatically revealing invisible
+text,
+@item
+@file{smerge-mode.el}, a minor mode for resolving @code{diff3}
+conflicts, and
+@item
+@file{diff-mode.el}, a mode for viewing and editing context diffs.
+@end itemize
+
+@item
+Morioka Tomohiko wrote several packages for MIME support in Gnus and
+elsewhere.
+
+@item
+Sen Nagata wrote @file{crm.el}, a package for reading multiple strings
+with completion, and @file{rfc2368.el}, support for @code{mailto:}
+URLs.
+
+@item
+Erik Naggum wrote the time-conversion functions.  He also wrote
+@file{disp-table.el}, a package for dealing with display tables,
+@file{latin-4.el} and @file{latin-5.el}, code which sets up
+case-conversion and syntax tables for the ISO Latin-4 and Latin-5
+character sets, @file{mailheader.el}, a package for parsing email
+headers, and @file{parse-time.el}, a package for parsing time strings.
+
+@item
+Thomas Neumann and Eric Raymond wrote @file{makefile.el} (now
+@file{make-mode.el}), a mode for editing makefiles.
+
+@item
+Thien-Thi Nguyen and Dan Nicolaescu wrote @file{hideshow.el}, a minor
+mode for selectively displaying blocks of text.
+
+@item
+Dan Nicolaescu wrote @file{romanian.el}, support for editing Romanian
+text, and @file{iris-ansi.el}, support for running Emacs on SGI's
+@code{xwsh} and @code{winterm} terminal emulators.
+
+@item
+Jurgen Nickelsen wrote @file{ws-mode.el}, providing WordStar emulation.
+
+@item
+Hrvoje Niksic wrote @file{savehist.el}, for saving the minibuffer
+history between Emacs sessions.
+
+@item
+Jeff Norden wrote @file{kermit.el}, a package to help the Kermit
+dialup communications program run comfortably in an Emacs shell buffer.
+
+@item
+Andrew Norman wrote @file{ange-ftp.el}, providing transparent FTP
+support.
+
+@item
+Alexandre Oliva wrote @file{gnus-mlspl.el}, a group params-based mail
+splitting mechanism.
+
+@item
+Takaaki Ota wrote @file{table.el}, a package for creating and editing
+embedded text-based tables.
+
+@item
+Pieter E.@: J.@: Pareit wrote @file{mixal-mode.el}, an editing mode for
+the MIX assembly language.
+
+@item
+David Pearson contributed @file{quickurl.el}, a simple method of
+inserting a URL into the current buffer based on text at point;
+@file{5x5.el}, a game to fill all squares on the field.
+
+@item
+Jeff Peck wrote:
+
+@itemize @minus
+@item
+@file{emacstool.c}, support for running Emacs under SunView/Sun Windows,
+@item
+@file{sun.el}, key bindings for sunterm keys,
+@item
+@file{sun-curs.el}, cursor definitions for Sun Windows, and
+@item
+@file{sun-fns.el} and @file{sun-mouse.el}, providing mouse support for
+Sun Windows.
+@end itemize
+
+@item
+Damon Anton Permezel wrote @file{hanoi.el}, an animated demonstration of
+the ``Towers of Hanoi'' puzzle.
+
+@item
+William M.@: Perry wrote @file{mailcap.el}, a MIME media types
+configuration facility, @file{mwheel.el}, a package for supporting
+mouse wheels, and the URL package.
+
+@item
+Per Persson wrote @file{gnus-vm.el}, the VM interface for Gnus.
+
+@item
+Jens Petersen wrote @file{find-func.el}, which makes it easy to find
+the source code for an Emacs Lisp function or variable.
+
+@item
+Daniel Pfeiffer wrote:
+
+@itemize @minus
+@item
+@file{conf-mode.el}, a major mode for editing configuration files,
+@item
+@file{copyright.el}, a package for updating copyright notices in files,
+@item
+@file{executable.el}, a package for executing interpreter scripts,
+@item
+@file{sh-script.el}, a mode for editing shell scripts,
+@item
+@file{skeleton.el}, implementing a concise language for writing
+statement skeletons, and
+@item
+@file{two-column.el}, a minor mode for simultaneous two-column editing.
+@end itemize
+
+Daniel also rewrote @file{apropos.el}, originally written by Joe Wells,
+and, together with Jim Blandy, co-authored @file{wyse50.el}, support for
+Wyse 50 terminals.
+
+@item
+Richard L.@: Pieri wrote @file{pop3.el}, a Post Office Protocol (RFC
+1460) interface for Emacs.
+
+@item
+Fred Pierresteguy and Paul Reilly made Emacs work with X Toolkit
+widgets.
+
+@item
+Christian Plaunt wrote @file{soundex.el}, an implementation of the
+Soundex algorithm for comparing English words by their pronunciation.
+
+@item
+David Ponce wrote:
+
+@itemize @minus
+@item
+@file{recentf.el}, a package that puts a menu of recently visited
+files in the Emacs menu bar,
+@item
+@file{ruler-mode.el}, a minor mode for displaying a ruler in the
+header line, and
+@item
+@file{tree-widget.el}, a package to display hierarchical data structures.
+@end itemize
+
+@item
+Francesco A.@: Potorti wrote @file{cmacexp.el}, providing a command which
+runs the C preprocessor on a region of a file and displays the results.
+He also expanded and redesigned the @code{etags} program.
+
+@item
+Michael D.@: Prange and Steven A.@: Wood wrote @file{fortran.el}, a mode for
+editing FORTRAN code.
+@c We're not distributing his tex-mode.el anymore; we're using Ed Reingold's.
+
+@item
+Mukesh Prasad contributed @file{vmsproc.el}, a facility for running
+asynchronous subprocesses on VMS.
+
+@item
+Marko Rahamaa wrote @file{latin-3.el}, code which sets up
+case-conversion and syntax tables for the ISO Latin-3 character set.
+
+@item
+Ashwin Ram wrote @file{refer.el}, commands to look up references in
+bibliography files by keyword.
+
+@item
+Eric S.@: Raymond wrote:
+
+@itemize @minus
+@item
+@file{vc.el}, an interface to the RCS and SCCS source code version
+control systems, with Paul Eggert,
+@item
+@file{gud.el}, a package for running source-level debuggers like GDB
+and SDB in Emacs,
+@item
+@file{asm-mode.el}, a mode for editing assembly language code,
+@item
+@file{AT386.el}, terminal support package for IBM's AT keyboards,
+@item
+@file{cookie1.el}, support for ``fortune-cookie'' programs like
+@file{yow.el} and @file{spook.el},
+@item
+@file{finder.el}, a package for finding Emacs Lisp packages by keyword
+and topic,
+@item
+@file{keyswap.el}, code to swap the @key{BS} and @key{DEL} keys,
+@item
+@file{loadhist.el}, functions for loading and unloading Emacs features,
+@item
+@file{lisp-mnt.el}, functions for working with the special headers used
+in Emacs Lisp library files, and
+@item
+code to set and make use of the @code{load-history} lisp variable, which
+records the source file from which each lisp function loaded into Emacs
+came.
+@end itemize
+
+@item
+Edward M.@: Reingold wrote the extensive calendar and diary support (try
+@kbd{M-x calendar}), with contributions from Stewart Clamen, Nachum
+Dershowitz, Paul Eggert, Steve Fisk, Michael Kifer, and Lara Rios.  Andy
+Oram contributed to its documentation.  Reingold has also contributed to
+@file{tex-mode.el}, a mode for editing @TeX{} files, as have William
+F.@: Schelter, Dick King, Stephen Gildea, Michael Prange, and Jacob Gore.
+
+@item
+David Reitter wrote @file{mailclient.el} which can send mail via the
+system's designated mail client.
+
+@item
+Alex Rezinsky contributed @file{which-func.el}, a mode that shows the
+name of the current function in the mode line.
+
+@item
+Rob Riepel contributed @file{tpu-edt.el} and its associated files,
+providing an emulation of the VMS TPU text editor emulating the VMS EDT
+editor, and @file{vt-control.el}, providing some control functions for
+the DEC VT line of terminals.
+
+@item
+Nick Roberts wrote @file{gdb-ui.el}, the graphical user interface to
+GDB.
+
+@item
+Roland B.@: Roberts contributed much of the VMS support distributed with
+Emacs 19, along with Joseph M.@: Kelsey, and @file{vms-pmail.el}, support
+for using Emacs within VMS MAIL.
+
+@item
+John Robinson wrote @file{bg-mouse.el}, support for the mouse on the BBN
+Bitgraph terminal.
+
+@item
+Danny Roozendaal implemented @file{handwrite.el}, which converts text
+into ``handwriting.''
+
+@item
+William Rosenblatt wrote @file{float.el}, implementing a floating-point
+numeric type using Lisp cons cells and integers.
+
+@item
+Guillermo J.@: Rozas wrote @file{scheme.el}, a mode for editing Scheme and
+DSSSL code, and @file{fakemail.c}, an interface to the System V mailer.
+
+@item
+Ivar Rummelhoff provided @file{winner.el}, which records
+recent window configurations so you can move back to them.
+
+@item
+Jason Rumney has ported the Emacs 21 display engine to MS-Windows, and
+contributed extensively to the MS-Windows port of Emacs.
+
+@item
+Wolfgang Rupprecht contributed Emacs 19's floating-point support
+(including @file{float-sup.el} and @file{floatfns.c}), and
+@file{sup-mouse.el}, support for the Supdup mouse on lisp machines.
+
+@item
+Kevin Ryde wrote @file{info-xref.el}, a library for checking
+references in Info files.
+
+@item
+James B.@: Salem and Brewster Kahle wrote @file{completion.el}, providing
+dynamic word completion.
+
+@item
+Masahiko Sato wrote @file{vip.el}, an emulation of the VI editor.
+
+@item
+Holger Schauer wrote @file{fortune.el}, a package for using fortune in
+message signatures.
+
+@item
+William Schelter wrote @file{telnet.el}, support for @code{telnet}
+sessions within Emacs.
+
+@item
+Ralph Schleicher contributed @file{battery.el}, a package for displaying
+laptop computer battery status, and @file{info-look.el}, a package for
+looking up Info documentation for symbols in the buffer.
+
+@item
+Michael Schmidt and Tom Perrine wrote @file{modula2.el}, a mode for
+editing Modula-2 code, based on work by Mick Jordan and Peter Robinson.
+
+@item
+Ronald S.@: Schnell wrote @file{dunnet.el}, a text adventure game.
+
+@item
+Philippe Schnoebelen wrote @file{gomoku.el}, a Go Moku game played
+against Emacs, and @file{mpuz.el}, a multiplication puzzle.
+
+@item
+Jan Schormann wrote @file{solitaire.el}, an Emacs Lisp implementation of
+the Solitaire game.
+
+@item
+Alex Schroeder wrote @file{ansi-color.el}, a package for translating
+ANSI color escape sequences to Emacs faces, and @file{sql.el}, a package
+for interactively running an SQL interpreter in an Emacs buffer.
+
+@item
+Randal Schwartz wrote @file{pp.el}, a pretty-printer for lisp objects.
+
+@item
+Oliver Seidel wrote @file{todo-mode.el}, a package for maintaining
+@file{TODO} list files.
+
+@item
+Manuel Serrano contributed the Flyspell package that does spell checking
+as you type.
+
+@item
+Hovav Shacham wrote @file{windmove.el}, a set of commands for selecting
+windows based on their geometrical position on the frame.
+
+@item
+Stanislav Shalunov wrote @file{uce.el}, for responding to unsolicited
+commercial email.
+
+@item
+Richard Sharman contributed @file{hilit-chg.el}, which uses colors
+to show recent editing changes.
+
+@item
+Olin Shivers wrote:
+
+@itemize @minus
+@item
+@file{comint.el}, a library for modes running interactive command-line-
+oriented subprocesses,
+@item
+@file{cmuscheme.el}, for running inferior Scheme processes,
+@item
+@file{inf-lisp.el}, for running inferior Lisp process, and
+@item
+@file{shell.el}, for running inferior shells.
+@end itemize
+
+@item
+Espen Skoglund wrote @file{pascal.el}, a mode for editing Pascal code.
+
+@item
+Rick Sladkey wrote @file{backquote.el}, a lisp macro for creating
+mostly-constant data.
+
+@item
+Lynn Slater wrote @file{help-macro.el}, a macro for writing interactive
+help for key bindings.
+
+@item
+Chris Smith wrote @file{icon.el}, a mode for editing Icon code.
+
+@item
+David Smith wrote @file{ielm.el}, a mode for interacting with the Emacs
+Lisp interpreter as a subprocess.
+
+@item
+Paul D.@: Smith wrote @file{snmp-mode.el}.
+
+@item
+William Sommerfeld wrote @file{scribe.el}, a mode for editing Scribe
+files, and @file{server.el}, a package allowing programs to send files
+to an extant Emacs job to be edited.
+
+@item
+Andre Spiegel made many contributions to the Emacs Version Control
+package, and in particular made it support multiple back ends.
+
+@item
+Michael Staats wrote @file{pc-select.el}, which rebinds keys for
+selecting regions to follow many other systems.
+
+@item
+Richard Stallman invented Emacs, and then wrote:
+
+@itemize @minus
+@item
+@file{easymenu.el}, a facility for defining Emacs menus,
+@item
+@file{menu-bar.el}, the Emacs menu bar support code,
+@item
+@file{paren.el}, a package to make matching parentheses stand out in
+color, and
+@item
+most of the rest of Emacs code.
+@end itemize
+
+@item
+Sam Steingold wrote @file{gulp.el}, a facility for asking package
+maintainers for updated versions of their packages via e-mail, and
+@file{midnight.el}, a package for running a command every midnight.
+
+@item
+Ake Stenhoff and Lars Lindberg wrote @file{imenu.el}, a framework for
+browsing indices made from buffer contents.
+
+@item
+Peter Stephenson contributed @file{vcursor.el}, which implements a
+``virtual cursor'' that you can move with the keyboard and use for
+copying text.
+
+@item
+Ken Stevens wrote the initial version of @file{ispell.el} and maintains
+that package since Ispell 3.1 release.
+
+@item
+Jonathan Stigelman wrote @file{hilit19.el}, a package providing
+automatic highlighting in source code buffers, mail readers, and other
+contexts.
+
+@item
+Kim F.@: Storm made many improvements to the Emacs display engine,
+process support, and networking support. He also wrote:
+
+@itemize @minus
+@item
+@file{bindat.el}, a package for encoding and decoding binary data.
+@item
+@file{cua.el}, which allows Emacs to emulate the standard CUA key
+bindings.
+@item
+@file{ido.el}, a package for selecting buffers and files quickly.
+@item
+@file{kmacro.el}, the keyboard macro facility.
+@end itemize
+
+@item
+Martin Stjernholm co-authored CC Mode, a major editing mode for C,
+C@t{++}, Objective-C, Java, Pike, CORBA IDL, and AWK code.
+
+@item
+Steve Strassman did not write @file{spook.el}, and even if he did, he
+really didn't mean for you to use it in an anarchistic way.
+
+@item
+Olaf Sylvester wrote @file{bs.el}, a package for manipulating Emacs
+buffers.
+
+@item
+Tibor @v{S}imko and Milan Zamazal wrote @file{slovak.el}, support for
+editing text in Slovak language.
+
+@item
+Naoto Takahashi wrote @file{utf-8.el}, support for encoding and
+decoding UTF-8 data.
+
+@item
+Luc Teirlinck wrote @file{help-at-pt.el}, providing local help through
+the keyboard.
+
+@item
+Jean-Philippe Theberge wrote @file{thumbs.el}, a package for viewing
+image files as ``thumbnails.''
+
+@item
+Jens T.@: Berger Thielemann wrote @file{word-help.el}, which is
+part of the basis for @file{info-look.el}.
+
+@item
+Spencer Thomas wrote the original @file{dabbrev.el}, providing a command
+which completes the partial word before point, based on other nearby
+words for which it is a prefix.  He also wrote the original dumping
+support.
+
+@item
+Jim Thompson wrote @file{ps-print.el}, which converts
+Emacs text to PostScript.
+
+@item
+Tom Tromey and Chris Lindblad wrote @file{tcl.el}, a major mode for
+editing Tcl/Tk source files and running a Tcl interpreter as an Emacs
+subprocess.
+
+@item
+Eli Tziperman wrote @file{rmail-spam-filter.el}, a spam filter for RMAIL.
+@item
+Daiki Ueno wrote @file{starttls.el}, support for Transport Layer
+Security protocol, and the PGG package adding GnuPG and PGP support.
+
+@item
+Masanobu Umeda wrote:
+
+@itemize @minus
+@item
+GNUS, a feature-full reader for Usenet news,
+@item
+@file{prolog.el}, a mode for editing Prolog code,
+@item
+@file{rmailsort.el}, a package for sorting messages in RMAIL folders,
+@item
+@file{metamail.el}, an interface to the Metamail program,
+@item
+@file{gnus-kill.el}, the Kill File mode for Gnus,
+@item
+@file{gnus-mh.el}, an mh-e interface for Gnus,
+@item
+@file{gnus-msg.el}, a mail and post interface for Gnus,
+@item
+@file{tcp.el}, emulation of the @code{open-network-stream} function for
+some Emacs configurations which lack it, and
+@item
+@file{timezone.el}, providing functions for dealing with time zones.
+@end itemize
+
+@item
+Rajesh Vaidheeswarran wrote @file{whitespace.el}, a package that
+detects and cleans up excess whitespace in a file.
+
+@item
+Neil W.@: Van Dyke wrote @file{webjump.el}, a ``hot links'' package.
+
+@item
+Didier Verna contributed @file{rect.el}, a package of functions for
+operations on rectangle regions of text.
+
+@item
+Ulrik Vieth implemented @file{meta-mode.el}, for editing MetaFont code.
+
+@item
+Geoffrey Voelker wrote the Windows NT support.  He also wrote
+@file{dos-w32.el}, functions shared by the MS-DOS and MS-Windows ports
+of Emacs, and @file{w32-fns.el}, MS-Windows specific support functions.
+
+@item
+Johan Vromans wrote @file{forms.el} and its associated files, a
+mode for filling in forms.
+
+@item
+Colin Walters wrote @file{ibuffer.el}, a Dired-like major mode for
+operating on buffers.
+
+@item
+Barry Warsaw wrote:
+
+@itemize @minus
+@item
+@file{assoc.el}, a set of utility functions for working with association
+lists,
+@item
+@file{cc-mode.el}, a major mode for editing C, C@t{++}, and Java code,
+based on earlier work by Dave Detlefs, Stewart Clamen, and Richard
+Stallman,
+@item
+@file{elp.el}, a new profiler for Emacs Lisp programs.
+@item
+@file{man.el}, a mode for reading UNIX manual pages,
+@item
+@file{regi.el}, providing an AWK-like functionality for use in lisp
+programs,
+@item
+@file{reporter.el}, providing customizable bug reporting for lisp
+packages, and
+@item
+@file{supercite.el}, a minor mode for quoting sections of mail messages
+and news articles.
+@end itemize
+
+@item
+Morten Welinder introduced face support into the MS-DOS port of Emacs,
+and also wrote:
+
+@itemize @minus
+@item
+@file{desktop.el}, facilities for saving some of Emacs's state between
+sessions,
+@item
+@file{timer.el}, the Emacs facility to run commands at a given time or
+frequency, or when Emacs is idle, and its C-level support code,
+@item
+@file{pc-win.el}, the MS-DOS ``window-system'' support,
+@item
+@file{internal.el}, an ``internal terminal'' emulator for the MS-DOS
+port of Emacs,
+@item
+@file{arc-mode.el}, the mode for editing compressed archives,
+@item
+@file{s-region.el}, commands for setting the region using the shift key
+and motion commands, and
+@item
+@file{dos-fns.el}, functions for use under MS-DOS.
+@end itemize
+
+He also helped port Emacs to MS-DOS.
+
+@item
+Joseph Brian Wells wrote:
+
+@itemize @minus
+@item
+@file{apropos.el}, a command to find commands, functions, and variables
+whose names contain matches for a regular expression,
+@item
+@file{resume.el}, support for processing command-line arguments after
+resuming a suspended Emacs job, and
+@item
+@file{mail-extr.el}, a package for extracting names and addresses from
+mail headers, with contributions from Jamie Zawinski.
+@end itemize
+
+@item
+Rodney Whitby and Reto Zimmermann wrote @file{vhdl-mode.el}, a major
+mode for editing VHDL source code.
+
+@item
+John Wiegley wrote @file{align.el}, a set of commands for aligning text
+according to regular-expression based rules; @file{timeclock.el}, a
+package for keeping track of time spent on projects;
+@file{pcomplete.el}, a programmable completion facility; and
+@code{eshell}, a command shell implemented entirely in Emacs Lisp.
+
+@item
+Ed Wilkinson wrote @file{b2m.c}, a program to convert mail files from
+RMAIL format to Unix @code{mbox} format.
+
+@item
+Mike Williams wrote @file{mouse-sel.el}, providing enhanced mouse
+selection, and @file{thingatpt.el}, a library of functions for finding
+the ``thing'' (word, line, s-expression) containing point.
+
+@item
+Bill Wohler wrote the Emacs interface to the MH mail system.
+
+@item
+Dale R.@: Worley wrote @file{emerge.el}, a package for interactively
+merging two versions of a file.
+
+@item
+Francis J.@: Wright wrote @code{WoMan}, a package for browsing
+manual pages without the @code{man} command.
+
+@item
+Tom Wurgler wrote @file{emacs-lock.el}, which makes it harder
+to exit with valuable buffers unsaved.
+
+@item
+Masatake Yamato wrote @file{ld-script.el}, an editing mode for GNU
+linker scripts, and contributed subword handling in CC mode.
+
+@item
+Jonathan Yavner wrote @file{testcover.el}, a package for keeping track
+of the testing status of Emacs Lisp code, and the SES spreadsheet
+package.
+
+@item
+Ryan Yeske wrote @file{rcirc.el} a simple Internet Relay Chat client.
+@item
+Ilya Zakharevich and Bob Olson contributed @file{cperl-mode.el}, a major
+mode for editing Perl code.  Ilya Zakharevich also wrote @file{tmm.el},
+a mode for accessing the Emacs menu bar on a text-mode terminal.
+
+@item
+Milan Zamazal wrote @file{czech.el}, support for editing Czech text,
+@file{glasses.el}, a package for easier reading of source code which
+uses illegible identifier names such as @code{cantReadThisVariable}, and
+@file{tildify.el}, commands for adding hard spaces to text, @TeX{}, and
+SGML/HTML files.
+
+@item
+Victor Zandy contributed @file{zone.el}, a package for people who like
+to zone out in front of Emacs.
+
+@item
+Eli Zaretskii made many standard Emacs features work on MS-DOS.  He also
+wrote @file{tty-colors.el}, which implements transparent mapping of X
+colors to tty colors, and (together with Kenichi Handa)
+@file{codepage.el}, a package for editing text encoded in DOS/Windows
+code pages.
+
+@item
+Jamie Zawinski wrote:
+
+@itemize @minus
+@item
+Emacs 19's optimizing byte compiler, with Hallvard Furuseth,
+@item
+much of the support for faces and X selections,
+@item
+@file{mailabbrev.el}, a package providing automatic expansion of mail
+aliases, and
+@item
+@file{tar-mode.el}, providing simple viewing and editing commands for
+tar files.
+@end itemize
+
+@item
+Andrew Zhilin created the Emacs icons used beginning with Emacs 22.
+
+@item
+Shenghuo Zhu wrote:
+
+@itemize @minus
+@item
+@file{binhex.el}, a package for reading and writing binhex files,
+@item
+@file{mm-partial.el}, message/partial support for MIME messages,
+@item
+@file{rfc1843.el}, an HZ decoding package,
+@item
+@file{uudecode.el}, an Emacs Lisp decoder for uuencoded data,
+@item
+@file{webmail.el}, an interface to Web mail.
+@end itemize
+
+@item
+Ian T.@: Zimmerman wrote @file{gametree.el}.
+
+@item
+Neal Ziring and Felix S.@: T.@: Wu wrote @file{vi.el}, an emulation of the
+VI text editor.
+
+@item
+Detlev Zundel wrote @file{re-builder.el}, a package for building regexps
+with visual feedback.
+
+@end itemize
+
+Others too numerous to mention have reported and fixed bugs, and added
+features to many parts of Emacs.  (Many are mentioned in the
+@file{ChangeLog} files which are summarized in the file @file{AUTHORS}
+in the distribution.)  We thank them for their generosity as well.
+
+This list intended to mention every contributor of a major package or
+feature we currently distribute; if you know of someone we have omitted,
+please report that as a manual bug.
+
+@ignore
+   arch-tag: bb1d0fa4-0240-4992-b5d4-8602d1e3d4ba
+@end ignore
similarity index 100%
rename from man/anti.texi
rename to doc/emacs/anti.texi
diff --git a/doc/emacs/arevert-xtra.texi b/doc/emacs/arevert-xtra.texi
new file mode 100644 (file)
index 0000000..c2b1ddc
--- /dev/null
@@ -0,0 +1,191 @@
+@c This is part of the Emacs manual.
+@c Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+@c See file emacs.texi for copying conditions.
+@c
+@c This file is included either in emacs-xtra.texi (when producing the
+@c printed version) or in the main Emacs manual (for the on-line version).
+@node Autorevert
+@section Auto Reverting non-file Buffers
+
+Normally Global Auto Revert Mode only reverts file buffers.  There are
+two ways to auto-revert certain non-file buffers: enabling Auto Revert
+Mode in those buffers (using @kbd{M-x auto-revert-mode}) and setting
+@code{global-auto-revert-non-file-buffers} to @code{t}.  The latter
+enables Auto Reverting for all types of buffers for which it is
+implemented, that is, for the types of buffers listed in the menu
+below.
+
+Like file buffers, non-file buffers should normally not revert while
+you are working on them, or while they contain information that might
+get lost after reverting.  Therefore, they do not revert if they are
+``modified''.  This can get tricky, because deciding when a non-file
+buffer should be marked modified is usually more difficult than for
+file buffers.
+
+Another tricky detail is that, for efficiency reasons, Auto Revert
+often does not try to detect all possible changes in the buffer, only
+changes that are ``major'' or easy to detect.  Hence, enabling
+auto-reverting for a non-file buffer does not always guarantee that
+all information in the buffer is up to date and does not necessarily
+make manual reverts useless.
+
+At the other extreme, certain buffers automatically auto-revert every
+@code{auto-revert-interval} seconds.  (This currently only applies to
+the Buffer Menu.)  In this case, Auto Revert does not print any
+messages while reverting, even when @code{auto-revert-verbose} is
+non-@code{nil}.
+
+The details depend on the particular types of buffers and are
+explained in the corresponding sections.
+
+@menu
+* Auto Reverting the Buffer Menu::
+* Auto Reverting Dired::
+* Supporting additional buffers::
+@end menu
+
+@node Auto Reverting the Buffer Menu
+@subsection Auto Reverting the Buffer Menu
+
+If auto-reverting of non-file buffers is enabled, the Buffer Menu
+automatically reverts every @code{auto-revert-interval} seconds,
+whether there is a need for it or not.  (It would probably take longer
+to check whether there is a need than to actually revert.)
+
+If the Buffer Menu inappropriately gets marked modified, just revert
+it manually using @kbd{g} and auto-reverting will resume.  However, if
+you marked certain buffers to get deleted or to be displayed, you have
+to be careful, because reverting erases all marks.  The fact that
+adding marks sets the buffer's modified flag prevents Auto Revert from
+automatically erasing the marks.
+
+@node Auto Reverting Dired
+@subsection Auto Reverting Dired buffers
+
+Auto-reverting Dired buffers currently works on GNU or Unix style
+operating systems.  It may not work satisfactorily on some other
+systems.
+
+Dired buffers only auto-revert when the file list of the buffer's main
+directory changes.  They do not auto-revert when information about a
+particular file changes or when inserted subdirectories change.  To be
+sure that @emph{all} listed information is up to date, you have to
+manually revert using @kbd{g}, @emph{even} if auto-reverting is
+enabled in the Dired buffer.  Sometimes, you might get the impression
+that modifying or saving files listed in the main directory actually
+does cause auto-reverting.  This is because making changes to a file,
+or saving it, very often causes changes in the directory itself, for
+instance, through backup files or auto-save files.  However, this is
+not guaranteed.
+
+If the Dired buffer is marked modified and there are no changes you
+want to protect, then most of the time you can make auto-reverting
+resume by manually reverting the buffer using @kbd{g}.  There is one
+exception.  If you flag or mark files, you can safely revert the
+buffer.  This will not erase the flags or marks (unless the marked
+file has been deleted, of course).  However, the buffer will stay
+modified, even after reverting, and auto-reverting will not resume.
+This is because, if you flag or mark files, you may be working on the
+buffer and you might not want the buffer to change without warning.
+If you want auto-reverting to resume in the presence of marks and
+flags, mark the buffer non-modified using @kbd{M-~}.  However, adding,
+deleting or changing marks or flags will mark it modified again.
+
+Remote Dired buffers are not auto-reverted.  Neither are Dired buffers
+for which you used shell wildcards or file arguments to list only some
+of the files.  @samp{*Find*} and @samp{*Locate*} buffers do not
+auto-revert either.
+
+@node Supporting additional buffers
+@subsection Adding Support for Auto-Reverting additional Buffers.
+
+This section is intended for Elisp programmers who would like to add
+support for auto-reverting new types of buffers.
+
+To support auto-reverting the buffer must first of all have a
+@code{revert-buffer-function}.  @xref{Definition of
+revert-buffer-function,, Reverting, elisp, the Emacs Lisp Reference Manual}.
+
+In addition, it @emph{must} have a @code{buffer-stale-function}.
+
+@defvar buffer-stale-function
+The value of this variable is a function to check whether a non-file
+buffer needs reverting.  This should be a function with one optional
+argument @var{noconfirm}.  The function should return non-@code{nil}
+if the buffer should be reverted.  The buffer is current when this
+function is called.
+
+While this function is mainly intended for use in auto-reverting, it
+could be used for other purposes as well.  For instance, if
+auto-reverting is not enabled, it could be used to warn the user that
+the buffer needs reverting.  The idea behind the @var{noconfirm}
+argument is that it should be @code{t} if the buffer is going to be
+reverted without asking the user and @code{nil} if the function is
+just going to be used to warn the user that the buffer is out of date.
+In particular, for use in auto-reverting, @var{noconfirm} is @code{t}.
+If the function is only going to be used for auto-reverting, you can
+ignore the @var{noconfirm} argument.
+
+If you just want to automatically auto-revert every
+@code{auto-revert-interval} seconds, use:
+
+@example
+(set (make-local-variable 'buffer-stale-function)
+     #'(lambda (&optional noconfirm) 'fast))
+@end example
+
+@noindent
+in the buffer's mode function.
+
+The special return value @samp{fast} tells the caller that the need
+for reverting was not checked, but that reverting the buffer is fast.
+It also tells Auto Revert not to print any revert messages, even if
+@code{auto-revert-verbose} is non-@code{nil}.  This is important, as
+getting revert messages every @code{auto-revert-interval} seconds can
+be very annoying.  The information provided by this return value could
+also be useful if the function is consulted for purposes other than
+auto-reverting.
+@end defvar
+
+Once the buffer has a @code{revert-buffer-function} and a
+@code{buffer-stale-function}, several problems usually remain.
+
+The buffer will only auto-revert if it is marked unmodified.  Hence,
+you will have to make sure that various functions mark the buffer
+modified if and only if either the buffer contains information that
+might be lost by reverting or there is reason to believe that the user
+might be inconvenienced by auto-reverting, because he is actively
+working on the buffer.  The user can always override this by manually
+adjusting the modified status of the buffer.  To support this, calling
+the @code{revert-buffer-function} on a buffer that is marked
+unmodified should always keep the buffer marked unmodified.
+
+It is important to assure that point does not continuously jump around
+as a consequence of auto-reverting.  Of course, moving point might be
+inevitable if the buffer radically changes.
+
+You should make sure that the @code{revert-buffer-function} does not
+print messages that unnecessarily duplicate Auto Revert's own messages
+if @code{auto-revert-verbose} is @code{t} and effectively override a
+@code{nil} value for @code{auto-revert-verbose}.  Hence, adapting a
+mode for auto-reverting often involves getting rid of such messages.
+This is especially important for buffers that automatically
+auto-revert every @code{auto-revert-interval} seconds.
+
+Also, you may want to update the documentation string of
+@code{global-auto-revert-non-file-buffers}.
+
+@ifinfo
+Finally, you should add a node to this chapter's menu.  This node
+@end ifinfo
+@ifnotinfo
+Finally, you should add a section to this chapter.  This section
+@end ifnotinfo
+should at the very least make clear whether enabling auto-reverting
+for the buffer reliably assures that all information in the buffer is
+completely up to date (or will be after @code{auto-revert-interval}
+seconds).
+
+@ignore
+   arch-tag: 2983e613-a272-45f6-9593-3010ad7f865e
+@end ignore
similarity index 99%
rename from man/basic.texi
rename to doc/emacs/basic.texi
index 333985e4a4ae4f99cf8deff108cfbfbdc70c9f94..418d54f677b9cd3b6723ee228810a6fafa122b1e 100644 (file)
@@ -707,7 +707,7 @@ C-n} (move down a good fraction of a screen), @kbd{C-u C-u C-o} (make
 ``a lot'' of blank lines), and @kbd{C-u C-k} (kill four lines).
 
   Some commands care whether there is an argument, but ignore its
-value.  For example, the command @kbd{M-q} (@code{fill-paragraph})
+value.  For example, the command @kbd{M-q} (@code{fill-paragraph-or-region})
 fills text; with an argument, it justifies the text as well.
 (@xref{Filling}, for more information on @kbd{M-q}.)  Plain @kbd{C-u}
 is a handy way of providing an argument for such commands.
diff --git a/doc/emacs/buffers.texi b/doc/emacs/buffers.texi
new file mode 100644 (file)
index 0000000..b43d72b
--- /dev/null
@@ -0,0 +1,665 @@
+@c This is part of the Emacs manual.
+@c Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995, 1997, 2000, 2001,
+@c   2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+@c See file emacs.texi for copying conditions.
+@node Buffers, Windows, Files, Top
+@chapter Using Multiple Buffers
+
+@cindex buffers
+  The text you are editing in Emacs resides in an object called a
+@dfn{buffer}.  Each time you visit a file, a buffer is created to hold the
+file's text.  Each time you invoke Dired, a buffer is created to hold the
+directory listing.  If you send a message with @kbd{C-x m}, a buffer named
+@samp{*mail*} is used to hold the text of the message.  When you ask for a
+command's documentation, that appears in a buffer called @samp{*Help*}.
+
+@cindex selected buffer
+@cindex current buffer
+  At any time, one and only one buffer is @dfn{current}.  It is also
+called the @dfn{selected buffer}.  Often we say that a command operates on
+``the buffer'' as if there were only one; but really this means that the
+command operates on the current buffer (most commands do).
+
+  When Emacs has multiple windows, each window has its own chosen
+buffer and displays it; at any time, only one of the windows is
+selected, and its chosen buffer is the current buffer.  Each window's
+mode line normally displays the name of the window's chosen buffer
+(@pxref{Windows}).
+
+  Each buffer has a name, which can be of any length, and you can select
+any buffer by giving its name.  Most buffers are made by visiting files,
+and their names are derived from the files' names.  But you can also create
+an empty buffer with any name you want.  A newly started Emacs has a buffer
+named @samp{*scratch*} which can be used for evaluating Lisp expressions in
+Emacs.  The distinction between upper and lower case matters in buffer
+names.
+
+  Each buffer records individually what file it is visiting, whether it is
+modified, and what major mode and minor modes are in effect in it
+(@pxref{Major Modes}).  Any Emacs variable can be made @dfn{local to} a
+particular buffer, meaning its value in that buffer can be different from
+the value in other buffers.  @xref{Locals}.
+
+@cindex buffer size, maximum
+  A buffer's size cannot be larger than some maximum, which is defined
+by the largest buffer position representable by the @dfn{Emacs integer}
+data type.  This is because Emacs tracks buffer positions using that
+data type.  For 32-bit machines, the largest buffer size is 256
+megabytes.
+
+@menu
+* Select Buffer::       Creating a new buffer or reselecting an old one.
+* List Buffers::        Getting a list of buffers that exist.
+* Misc Buffer::                Renaming; changing read-onlyness; copying text.
+* Kill Buffer::                Killing buffers you no longer need.
+* Several Buffers::     How to go through the list of all buffers
+                         and operate variously on several of them.
+* Indirect Buffers::    An indirect buffer shares the text of another buffer.
+* Buffer Convenience::  Convenience and customization features for
+                          buffer handling.
+@end menu
+
+@node Select Buffer
+@section Creating and Selecting Buffers
+@cindex change buffers
+@cindex switch buffers
+
+@table @kbd
+@item C-x b @var{buffer} @key{RET}
+Select or create a buffer named @var{buffer} (@code{switch-to-buffer}).
+@item C-x 4 b @var{buffer} @key{RET}
+Similar, but select @var{buffer} in another window
+(@code{switch-to-buffer-other-window}).
+@item C-x 5 b @var{buffer} @key{RET}
+Similar, but select @var{buffer} in a separate frame
+(@code{switch-to-buffer-other-frame}).
+@item C-x @key{LEFT}
+Select the previous buffer in the list of existing buffers.
+@item C-x @key{RIGHT}
+Select the next buffer in the list of existing buffers.
+@item C-u M-g M-g
+@itemx C-u M-g g
+Read a number @var{n} and move to line @var{n} in the most recently
+selected buffer other than the current buffer.
+@end table
+
+@kindex C-x b
+@findex switch-to-buffer
+  To select the buffer named @var{bufname}, type @kbd{C-x b @var{bufname}
+@key{RET}}.  This runs the command @code{switch-to-buffer} with argument
+@var{bufname}.  You can use completion to enter the buffer
+name (@pxref{Completion}).  An empty argument to @kbd{C-x b}
+specifies the buffer that was current most recently among those not
+now displayed in any window.
+
+@kindex C-x @key{LEFT}
+@kindex C-x @key{RIGHT}
+@findex next-buffer
+@findex previous-buffer
+  For conveniently switching between a few buffers, use the commands
+@kbd{C-x @key{LEFT}} and @kbd{C-x @key{RIGHT}}.  @kbd{C-x @key{RIGHT}}
+(@code{previous-buffer}) selects the previous buffer (following the order
+of most recent selection in the current frame), while @kbd{C-x @key{LEFT}}
+(@code{next-buffer}) moves through buffers in the reverse direction.
+
+@kindex C-x 4 b
+@findex switch-to-buffer-other-window
+@vindex even-window-heights
+  To select a buffer in a window other than the current one, type
+@kbd{C-x 4 b @var{bufname} @key{RET}}.  This runs the command
+@code{switch-to-buffer-other-window} which displays the buffer
+@var{bufname} in another window.  By default, if displaying the buffer
+causes two vertically adjacent windows to be displayed, the heights of
+those windows are evened out; to countermand that and preserve the
+window configuration, set the variable @code{even-window-heights} to
+@code{nil}.
+
+@kindex C-x 5 b
+@findex switch-to-buffer-other-frame
+  Similarly, @kbd{C-x 5 b @var{buffer} @key{RET}} runs the command
+@code{switch-to-buffer-other-frame} which selects a buffer in another
+frame.
+
+@vindex display-buffer-reuse-frames
+  You can control how certain buffers are handled by these commands by
+customizing the variables @code{special-display-buffer-names},
+@code{special-display-regexps}, @code{same-window-buffer-names}, and
+@code{same-window-regexps}.  See @ref{Force Same Window}, and
+@ref{Special Buffer Frames}, for more about these variables.  In
+addition, if the value of @code{display-buffer-reuse-frames} is
+non-@code{nil}, and the buffer you want to switch to is already
+displayed in some frame, Emacs will just raise that frame.
+
+  Most buffers are created by visiting files, or by Emacs commands that
+want to display some text, but you can also create a buffer explicitly
+by typing @kbd{C-x b @var{bufname} @key{RET}}.  This makes a new, empty
+buffer that is not visiting any file, and selects it for editing.  Such
+buffers are used for making notes to yourself.  If you try to save one,
+you are asked for the file name to use.  The new buffer's major mode is
+determined by the value of @code{default-major-mode} (@pxref{Major
+Modes}).
+
+  Note that @kbd{C-x C-f}, and any other command for visiting a file,
+can also be used to switch to an existing file-visiting buffer.
+@xref{Visiting}.
+
+  @kbd{C-u M-g M-g}, that is @code{goto-line} with a prefix argument
+of just @kbd{C-u}, reads a number @var{n} using the minibuffer,
+selects the most recently selected buffer other than the current
+buffer in another window, and then moves point to the beginning of
+line number @var{n} in that buffer.  This is mainly useful in a buffer
+that refers to line numbers in another buffer: if point is on or just
+after a number, @code{goto-line} uses that number as the default for
+@var{n}.  Note that prefix arguments other than just @kbd{C-u} behave
+differently.  @kbd{C-u 4 M-g M-g} goes to line 4 in the @emph{current}
+buffer, without reading a number from the minibuffer.  (Remember that
+@kbd{M-g M-g} without prefix argument reads a number @var{n} and then
+moves to line number @var{n} in the current buffer.)
+
+  Emacs uses buffer names that start with a space for internal purposes.
+It treats these buffers specially in minor ways---for example, by
+default they do not record undo information.  It is best to avoid using
+such buffer names yourself.
+
+@node List Buffers
+@section Listing Existing Buffers
+
+@table @kbd
+@item C-x C-b
+List the existing buffers (@code{list-buffers}).
+@end table
+
+@cindex listing current buffers
+@kindex C-x C-b
+@findex list-buffers
+  To display a list of existing buffers, type @kbd{C-x C-b}.  Each
+line in the list shows one buffer's name, major mode and visited file.
+The buffers are listed in the order that they were current; the
+buffers that were current most recently come first.
+
+  @samp{*} in the first field of a line indicates the buffer is
+``modified.''  If several buffers are modified, it may be time to save
+some with @kbd{C-x s} (@pxref{Save Commands}).  @samp{%} indicates a
+read-only buffer.  @samp{.} marks the current buffer.  Here is an
+example of a buffer list:@refill
+
+@smallexample
+CRM Buffer                Size  Mode              File
+. * .emacs                3294  Emacs-Lisp        ~/.emacs
+ %  *Help*                 101  Help
+    search.c             86055  C                 ~/cvs/emacs/src/search.c
+ %  src                  20959  Dired by name     ~/cvs/emacs/src/
+  * *mail*                  42  Mail
+ %  HELLO                 1607  Fundamental       ~/cvs/emacs/etc/HELLO
+ %  NEWS                481184  Outline           ~/cvs/emacs/etc/NEWS
+    *scratch*              191  Lisp Interaction
+  * *Messages*            1554  Fundamental
+@end smallexample
+
+@noindent
+Note that the buffer @samp{*Help*} was made by a help request; it is
+not visiting any file.  The buffer @code{src} was made by Dired on the
+directory @file{~/cvs/emacs/src/}.  You can list only buffers that are
+visiting files by giving the command a prefix argument, as in
+@kbd{C-u C-x C-b}.
+
+  @code{list-buffers} omits buffers whose names begin with a space,
+unless they visit files: such buffers are used internally by Emacs.
+
+@need 2000
+@node Misc Buffer
+@section Miscellaneous Buffer Operations
+
+@table @kbd
+@item C-x C-q
+Toggle read-only status of buffer (@code{toggle-read-only}).
+@item M-x rename-buffer @key{RET} @var{name} @key{RET}
+Change the name of the current buffer.
+@item M-x rename-uniquely
+Rename the current buffer by adding @samp{<@var{number}>} to the end.
+@item M-x view-buffer @key{RET} @var{buffer} @key{RET}
+Scroll through buffer @var{buffer}.
+@end table
+
+@kindex C-x C-q
+@vindex buffer-read-only
+@cindex read-only buffer
+  A buffer can be @dfn{read-only}, which means that commands to change
+its contents are not allowed.  The mode line indicates read-only
+buffers with @samp{%%} or @samp{%*} near the left margin.  Read-only
+buffers are usually made by subsystems such as Dired and Rmail that
+have special commands to operate on the text; also by visiting a file
+whose access control says you cannot write it.
+
+@findex toggle-read-only
+  If you wish to make changes in a read-only buffer, use the command
+@kbd{C-x C-q} (@code{toggle-read-only}).  It makes a read-only buffer
+writable, and makes a writable buffer read-only.  This
+works by setting the variable @code{buffer-read-only}, which has a local
+value in each buffer and makes the buffer read-only if its value is
+non-@code{nil}.  If you have files under version control, you may find
+it convenient to bind @kbd{C-x C-q} to @code{vc-toggle-read-only}
+instead.  Then, typing @kbd{C-x C-q} not only changes the read-only
+flag, but it also checks the file in or out.  @xref{Version
+Control}.
+
+@findex rename-buffer
+  @kbd{M-x rename-buffer} changes the name of the current buffer.  You
+specify the new name as a minibuffer argument; there is no default.
+If you specify a name that is in use for some other buffer, an error
+happens and no renaming is done.
+
+@findex rename-uniquely
+  @kbd{M-x rename-uniquely} renames the current buffer to a similar
+name with a numeric suffix added to make it both different and unique.
+This command does not need an argument.  It is useful for creating
+multiple shell buffers: if you rename the @samp{*shell*} buffer, then
+do @kbd{M-x shell} again, it makes a new shell buffer named
+@samp{*shell*}; meanwhile, the old shell buffer continues to exist
+under its new name.  This method is also good for mail buffers,
+compilation buffers, and most Emacs features that create special
+buffers with particular names.  (With some of these features, such as
+@kbd{M-x compile}, @kbd{M-x grep} an @kbd{M-x info}, you need to
+switch to some other buffer before using the command, in order for it
+to make a different buffer.)
+
+@findex view-buffer
+  @kbd{M-x view-buffer} is much like @kbd{M-x view-file} (@pxref{Misc
+File Ops}) except that it examines an already existing Emacs buffer.
+View mode provides commands for scrolling through the buffer
+conveniently but not for changing it.  When you exit View mode with
+@kbd{q}, that switches back to the buffer (and the position) which was
+previously displayed in the window.  Alternatively, if you exit View
+mode with @kbd{e}, the buffer and the value of point that resulted from
+your perusal remain in effect.
+
+  The commands @kbd{M-x append-to-buffer} and @kbd{M-x insert-buffer}
+can be used to copy text from one buffer to another.  @xref{Accumulating
+Text}.
+
+@node Kill Buffer
+@section Killing Buffers
+
+@cindex killing buffers
+  If you continue an Emacs session for a while, you may accumulate a
+large number of buffers.  You may then find it convenient to @dfn{kill}
+the buffers you no longer need.  On most operating systems, killing a
+buffer releases its space back to the operating system so that other
+programs can use it.  Here are some commands for killing buffers:
+
+@table @kbd
+@item C-x k @var{bufname} @key{RET}
+Kill buffer @var{bufname} (@code{kill-buffer}).
+@item M-x kill-some-buffers
+Offer to kill each buffer, one by one.
+@end table
+
+@findex kill-buffer
+@findex kill-some-buffers
+@kindex C-x k
+
+  @kbd{C-x k} (@code{kill-buffer}) kills one buffer, whose name you
+specify in the minibuffer.  The default, used if you type just
+@key{RET} in the minibuffer, is to kill the current buffer.  If you
+kill the current buffer, another buffer becomes current: one that was
+current in the recent past but is not displayed in any window now.  If
+you ask to kill a file-visiting buffer that is modified (has unsaved
+editing), then you must confirm with @kbd{yes} before the buffer is
+killed.
+
+  The command @kbd{M-x kill-some-buffers} asks about each buffer, one by
+one.  An answer of @kbd{y} means to kill the buffer.  Killing the current
+buffer or a buffer containing unsaved changes selects a new buffer or asks
+for confirmation just like @code{kill-buffer}.
+
+  The buffer menu feature (@pxref{Several Buffers}) is also convenient
+for killing various buffers.
+
+@vindex kill-buffer-hook
+  If you want to do something special every time a buffer is killed, you
+can add hook functions to the hook @code{kill-buffer-hook} (@pxref{Hooks}).
+
+@findex clean-buffer-list
+  If you run one Emacs session for a period of days, as many people do,
+it can fill up with buffers that you used several days ago.  The command
+@kbd{M-x clean-buffer-list} is a convenient way to purge them; it kills
+all the unmodified buffers that you have not used for a long time.  An
+ordinary buffer is killed if it has not been displayed for three days;
+however, you can specify certain buffers that should never be killed
+automatically, and others that should be killed if they have been unused
+for a mere hour.
+
+@cindex Midnight mode
+@vindex midnight-mode
+@vindex midnight-hook
+  You can also have this buffer purging done for you, every day at
+midnight, by enabling Midnight mode.  Midnight mode operates each day at
+midnight; at that time, it runs @code{clean-buffer-list}, or whichever
+functions you have placed in the normal hook @code{midnight-hook}
+(@pxref{Hooks}).
+
+  To enable Midnight mode, use the Customization buffer to set the
+variable @code{midnight-mode} to @code{t}.  @xref{Easy Customization}.
+
+@node Several Buffers
+@section Operating on Several Buffers
+@cindex buffer menu
+
+  The @dfn{buffer-menu} facility is like a ``Dired for buffers''; it allows
+you to request operations on various Emacs buffers by editing an Emacs
+buffer containing a list of them.  You can save buffers, kill them
+(here called @dfn{deleting} them, for consistency with Dired), or display
+them.
+
+@table @kbd
+@item M-x buffer-menu
+Begin editing a buffer listing all Emacs buffers.
+@item M-x buffer-menu-other-window.
+Similar, but do it in another window.
+@end table
+
+@findex buffer-menu
+@findex buffer-menu-other-window
+  The command @code{buffer-menu} writes a list of all Emacs
+buffers@footnote{Buffers which don't visit files and whose names begin
+with a space are omitted: these are used internally by Emacs.} into the
+buffer @samp{*Buffer List*}, and selects that buffer in Buffer Menu
+mode.
+
+  The buffer is read-only, and can be
+changed only through the special commands described in this section.
+The usual Emacs cursor motion commands can be used in the @samp{*Buffer
+List*} buffer.  The following commands apply to the buffer described on
+the current line.
+
+@table @kbd
+@item d
+Request to delete (kill) the buffer, then move down.  The request
+shows as a @samp{D} on the line, before the buffer name.  Requested
+deletions take place when you type the @kbd{x} command.
+@item C-d
+Like @kbd{d} but move up afterwards instead of down.
+@item s
+Request to save the buffer.  The request shows as an @samp{S} on the
+line.  Requested saves take place when you type the @kbd{x} command.
+You may request both saving and deletion for the same buffer.
+@item x
+Perform previously requested deletions and saves.
+@item u
+Remove any request made for the current line, and move down.
+@item @key{DEL}
+Move to previous line and remove any request made for that line.
+@end table
+
+  The @kbd{d}, @kbd{C-d}, @kbd{s} and @kbd{u} commands to add or remove
+flags also move down (or up) one line.  They accept a numeric argument
+as a repeat count.
+
+  These commands operate immediately on the buffer listed on the current
+line:
+
+@table @kbd
+@item ~
+Mark the buffer ``unmodified.''  The command @kbd{~} does this
+immediately when you type it.
+@item %
+Toggle the buffer's read-only flag.  The command @kbd{%} does
+this immediately when you type it.
+@item t
+Visit the buffer as a tags table.  @xref{Select Tags Table}.
+@end table
+
+  There are also commands to select another buffer or buffers:
+
+@table @kbd
+@item q
+Quit the buffer menu---immediately display the most recent formerly
+visible buffer in its place.
+@item @key{RET}
+@itemx f
+Immediately select this line's buffer in place of the @samp{*Buffer
+List*} buffer.
+@item o
+Immediately select this line's buffer in another window as if by
+@kbd{C-x 4 b}, leaving @samp{*Buffer List*} visible.
+@item C-o
+Immediately display this line's buffer in another window, but don't
+select the window.
+@item 1
+Immediately select this line's buffer in a full-screen window.
+@item 2
+Immediately set up two windows, with this line's buffer selected in
+one, and the previously current buffer (aside from the buffer
+@samp{*Buffer List*}) displayed in the other.
+@item b
+Bury the buffer listed on this line.
+@item m
+Mark this line's buffer to be displayed in another window if you exit
+with the @kbd{v} command.  The request shows as a @samp{>} at the
+beginning of the line.  (A single buffer may not have both a delete
+request and a display request.)
+@item v
+Immediately select this line's buffer, and also display in other windows
+any buffers previously marked with the @kbd{m} command.  If you have not
+marked any buffers, this command is equivalent to @kbd{1}.
+@end table
+
+  There is also a command that affects the entire buffer list:
+
+@table @kbd
+@item T
+Delete, or reinsert, lines for non-file buffers.  This command toggles
+the inclusion of such buffers in the buffer list.
+@end table
+
+  What @code{buffer-menu} actually does is create and switch to a
+suitable buffer, and turn on Buffer Menu mode in it.  Everything else
+described above is implemented by the special commands provided in
+Buffer Menu mode.  One consequence of this is that you can switch from
+the @samp{*Buffer List*} buffer to another Emacs buffer, and edit
+there.  You can reselect the @samp{*Buffer List*} buffer later, to
+perform the operations already requested, or you can kill it, or pay
+no further attention to it.
+
+  The list in the @samp{*Buffer List*} buffer looks exactly like the
+buffer list described in @ref{List Buffers}, because they really are
+the same.  The only difference between @code{buffer-menu} and
+@code{list-buffers} is that @code{buffer-menu} switches to the
+@samp{*Buffer List*} buffer in the selected window;
+@code{list-buffers} displays the same buffer in another window.  If
+you run @code{list-buffers} (that is, type @kbd{C-x C-b}) and select
+the buffer list manually, you can use all of the commands described
+here.
+
+  Normally, the buffer @samp{*Buffer List*} is not updated
+automatically when buffers are created and killed; its contents are
+just text.  If you have created, deleted or renamed buffers, the way
+to update @samp{*Buffer List*} to show what you have done is to type
+@kbd{g} (@code{revert-buffer}).  You can make this happen regularly
+every @code{auto-revert-interval} seconds if you enable Auto Revert
+mode in this buffer, as long as it is not marked modified.  Global
+Auto Revert mode applies to the @samp{*Buffer List*} buffer only if
+@code{global-auto-revert-non-file-buffers} is non-@code{nil}.
+@iftex
+@inforef{Autorevert,, emacs-xtra}, for details.
+@end iftex
+@ifnottex
+@xref{Autorevert, global-auto-revert-non-file-buffers}, for details.
+@end ifnottex
+
+
+  The command @code{buffer-menu-other-window} works the same as
+@code{buffer-menu}, except that it displays the buffers list in
+another window.
+
+@node Indirect Buffers
+@section Indirect Buffers
+@cindex indirect buffer
+@cindex base buffer
+
+  An @dfn{indirect buffer} shares the text of some other buffer, which
+is called the @dfn{base buffer} of the indirect buffer.  In some ways it
+is the analogue, for buffers, of a symbolic link between files.
+
+@table @kbd
+@findex make-indirect-buffer
+@item M-x make-indirect-buffer @key{RET} @var{base-buffer} @key{RET} @var{indirect-name} @key{RET}
+Create an indirect buffer named @var{indirect-name} whose base buffer
+is @var{base-buffer}.
+@findex clone-indirect-buffer
+@item M-x clone-indirect-buffer @key{RET}
+Create an indirect buffer that is a twin copy of the current buffer.
+@item C-x 4 c
+@kindex C-x 4 c
+@findex clone-indirect-buffer-other-window
+Create an indirect buffer that is a twin copy of the current buffer, and
+select it in another window (@code{clone-indirect-buffer-other-window}).
+@end table
+
+  The text of the indirect buffer is always identical to the text of its
+base buffer; changes made by editing either one are visible immediately
+in the other.  But in all other respects, the indirect buffer and its
+base buffer are completely separate.  They have different names,
+different values of point, different narrowing, different markers,
+different major modes, and different local variables.
+
+  An indirect buffer cannot visit a file, but its base buffer can.  If
+you try to save the indirect buffer, that actually works by saving the
+base buffer.  Killing the base buffer effectively kills the indirect
+buffer, but killing an indirect buffer has no effect on its base buffer.
+
+  One way to use indirect buffers is to display multiple views of an
+outline.  @xref{Outline Views}.
+
+  A quick and handy way to make an indirect buffer is with the command
+@kbd{M-x clone-indirect-buffer}.  It creates and selects an indirect
+buffer whose base buffer is the current buffer.  With a numeric
+argument, it prompts for the name of the indirect buffer; otherwise it
+uses the name of the current buffer, with a @samp{<@var{n}>} suffix
+added.  @kbd{C-x 4 c} (@code{clone-indirect-buffer-other-window})
+works like @kbd{M-x clone-indirect-buffer}, but it selects the new
+buffer in another window.
+
+  The more general way to make an indirect buffer is with the command
+@kbd{M-x make-indirect-buffer}.  It creates an indirect buffer from
+buffer @var{base-buffer}, under the name @var{indirect-name}.  It
+prompts for both @var{base-buffer} and @var{indirect-name} using the
+minibuffer.
+
+@node Buffer Convenience
+@section Convenience Features and Customization of Buffer Handling
+
+   This section describes several modes and features that make it more
+convenient to switch between buffers.
+
+@menu
+* Uniquify::               Making buffer names unique with directory parts.
+* Iswitchb::               Switching between buffers with substrings.
+* Buffer Menus::           Configurable buffer menu.
+@end menu
+
+@node Uniquify
+@subsection Making Buffer Names Unique
+
+@cindex unique buffer names
+@cindex directories in buffer names
+  When several buffers visit identically-named files, Emacs must give
+the buffers distinct names.  The usual method for making buffer names
+unique adds @samp{<2>}, @samp{<3>}, etc. to the end of the buffer
+names (all but one of them).
+
+@vindex uniquify-buffer-name-style
+  Other methods work by adding parts of each file's directory to the
+buffer name.  To select one, customize the variable
+@code{uniquify-buffer-name-style} (@pxref{Easy Customization}).
+
+  To begin with, the @code{forward} naming method includes part of the
+file's directory name at the beginning of the buffer name; using this
+method, buffers visiting the files @file{/u/rms/tmp/Makefile} and
+@file{/usr/projects/zaphod/Makefile} would be named
+@samp{tmp/Makefile} and @samp{zaphod/Makefile}, respectively (instead
+of @samp{Makefile} and @samp{Makefile<2>}).
+
+  In contrast, the @code{post-forward} naming method would call the
+buffers @samp{Makefile|tmp} and @samp{Makefile|zaphod}, and the
+@code{reverse} naming method would call them @samp{Makefile\tmp} and
+@samp{Makefile\zaphod}.  The nontrivial difference between
+@code{post-forward} and @code{reverse} occurs when just one directory
+name is not enough to distinguish two files; then @code{reverse} puts
+the directory names in reverse order, so that @file{/top/middle/file}
+becomes @samp{file\middle\top}, while @code{post-forward} puts them in
+forward order after the file name, as in @samp{file|top/middle}.
+
+  Which rule to follow for putting the directory names in the buffer
+name is not very important if you are going to @emph{look} at the
+buffer names before you type one.  But as an experienced user, if you
+know the rule, you won't have to look.  And then you may find that one
+rule or another is easier for you to remember and apply quickly.
+
+@node Iswitchb
+@subsection Switching Between Buffers using Substrings
+
+@findex iswitchb-mode
+@cindex Iswitchb mode
+@cindex mode, Iswitchb
+@kindex C-x b @r{(Iswitchb mode)}
+@kindex C-x 4 b @r{(Iswitchb mode)}
+@kindex C-x 5 b @r{(Iswitchb mode)}
+@kindex C-x 4 C-o @r{(Iswitchb mode)}
+
+  Iswitchb global minor mode provides convenient switching between
+buffers using substrings of their names.  It replaces the normal
+definitions of @kbd{C-x b}, @kbd{C-x 4 b}, @kbd{C-x 5 b}, and @kbd{C-x
+4 C-o} with alternative commands that are somewhat ``smarter.''
+
+  When one of these commands prompts you for a buffer name, you can
+type in just a substring of the name you want to choose.  As you enter
+the substring, Iswitchb mode continuously displays a list of buffers
+that match the substring you have typed.
+
+  At any time, you can type @key{RET} to select the first buffer in
+the list.  So the way to select a particular buffer is to make it the
+first in the list.  There are two ways to do this.  You can type more
+of the buffer name and thus narrow down the list, excluding unwanted
+buffers above the desired one.  Alternatively, you can use @kbd{C-s}
+and @kbd{C-r} to rotate the list until the desired buffer is first.
+
+  @key{TAB} while entering the buffer name performs completion on the
+string you have entered, based on the displayed list of buffers.
+
+  To enable Iswitchb mode, type @kbd{M-x iswitchb-mode}, or customize
+the variable @code{iswitchb-mode} to @code{t} (@pxref{Easy
+Customization}).
+
+@node Buffer Menus
+@subsection Customizing Buffer Menus
+
+@findex bs-show
+@cindex buffer list, customizable
+@table @kbd
+@item M-x bs-show
+Make a list of buffers similarly to @kbd{M-x list-buffers} but
+customizable.
+@end table
+
+  @kbd{M-x bs-show} pops up a buffer list similar to the one normally
+displayed by @kbd{C-x C-b} but which you can customize.  If you prefer
+this to the usual buffer list, you can bind this command to @kbd{C-x
+C-b}.  To customize this buffer list, use the @code{bs} Custom group
+(@pxref{Easy Customization}).
+
+@findex msb-mode
+@cindex mode, MSB
+@cindex MSB mode
+@cindex buffer menu
+@findex mouse-buffer-menu
+@kindex C-Down-Mouse-1
+  MSB global minor mode (``MSB'' stands for ``mouse select buffer'')
+provides a different and customizable mouse buffer menu which you may
+prefer.  It replaces the bindings of @code{mouse-buffer-menu},
+normally on @kbd{C-Down-Mouse-1}, and the menu bar buffer menu.  You
+can customize the menu in the @code{msb} Custom group.
+
+@ignore
+   arch-tag: 08c43460-f4f4-4b43-9cb5-1ea9ad991695
+@end ignore
similarity index 98%
rename from man/building.texi
rename to doc/emacs/building.texi
index 62e5f7b4316a2de85c1a72466bba1b2a90d2794b..5689bf1fe34b1cc914556b5698152119b0860f05 100644 (file)
@@ -824,17 +824,14 @@ unlimited, so it sets the height and width accordingly.  For correct
 operation you must not change these values during the GDB session.
 
 @vindex gud-gdb-command-name
-@findex gdba
-  You can also run GDB in text command mode, like other debuggers.  To
-do this, replace the GDB @code{"--annotate=3"} option with
-@code{"--fullname"} either in the minibuffer for the current Emacs
-session, or the custom variable @code{gud-gdb-command-name} for all
-future sessions.  You need to use text command mode to debug multiple
-programs within one Emacs session.  If you have customized
-@code{gud-gdb-command-name} in this way, you can use @kbd{M-x gdba} to
-invoke GDB in graphical mode.  Moreover, this command succeeds where
-@kbd{M-x gdb} fails, such as when your @file{.gdbinit} file contains
-executable GDB commands.
+  You can also run GDB in text command mode, like the other debuggers
+in Emacs.  To do this, replace the GDB @code{"--annotate=3"} option
+with @code{"--fullname"} either in the minibuffer for the current
+Emacs session, or the custom variable @code{gud-gdb-command-name} for
+all future sessions.  You need to use text command mode to debug
+multiple programs within one Emacs session.  You can also use
+@kbd{M-x gud-gdb} to invoke GDB in text command mode if you have
+problems before execution has started.
 
 @menu
 * GDB-UI Layout::               Control the number of displayed buffers.
diff --git a/doc/emacs/cal-xtra.texi b/doc/emacs/cal-xtra.texi
new file mode 100644 (file)
index 0000000..61d519c
--- /dev/null
@@ -0,0 +1,838 @@
+@c This is part of the Emacs manual.
+@c Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+@c See file emacs.texi for copying conditions.
+@c
+@c This file is included either in emacs-xtra.texi (when producing the
+@c printed version) or in the main Emacs manual (for the on-line version).
+
+@c Moved here from the Emacs Lisp Reference Manual, 2005-03-26.
+@node Advanced Calendar/Diary Usage
+@section Customizing the Calendar and Diary
+
+  There are many customizations that you can use to make the calendar and
+diary suit your personal tastes.
+
+@menu
+* Calendar Customizing::   Defaults you can set.
+* Holiday Customizing::    Defining your own holidays.
+* Date Display Format::    Changing the format.
+* Time Display Format::    Changing the format.
+* Diary Customizing::      Defaults you can set.
+* Hebrew/Islamic Entries:: How to obtain them.
+* Fancy Diary Display::    Enhancing the diary display, sorting entries,
+                             using included diary files.
+* Sexp Diary Entries::     Fancy things you can do.
+@end menu
+
+@node Calendar Customizing
+@subsection Customizing the Calendar
+@vindex calendar-holiday-marker
+@vindex diary-entry-marker
+  The variable @code{calendar-holiday-marker} specifies how to mark a
+date as being a holiday.  Its value may be a single-character string
+to insert next to the date, or a face name to use for displaying the
+date.  Likewise, the variable @code{diary-entry-marker} specifies how
+to mark a date that has diary entries.  The calendar creates faces
+named @code{holiday-face} and @code{diary-face} for these purposes;
+those symbols are the default values of these variables.
+
+@vindex calendar-load-hook
+  The variable @code{calendar-load-hook} is a normal hook run when the
+calendar package is first loaded (before actually starting to display
+the calendar).
+
+@vindex initial-calendar-window-hook
+  Starting the calendar runs the normal hook
+@code{initial-calendar-window-hook}.  Recomputation of the calendar
+display does not run this hook.  But if you leave the calendar with the
+@kbd{q} command and reenter it, the hook runs again.@refill
+
+@vindex today-visible-calendar-hook
+  The variable @code{today-visible-calendar-hook} is a normal hook run
+after the calendar buffer has been prepared with the calendar when the
+current date is visible in the window.  One use of this hook is to
+replace today's date with asterisks; to do that, use the hook function
+@code{calendar-star-date}.
+
+@findex calendar-star-date
+@example
+(add-hook 'today-visible-calendar-hook 'calendar-star-date)
+@end example
+
+@noindent
+Another standard hook function marks the current date, either by
+changing its face or by adding an asterisk.  Here's how to use it:
+
+@findex calendar-mark-today
+@example
+(add-hook 'today-visible-calendar-hook 'calendar-mark-today)
+@end example
+
+@noindent
+@vindex calendar-today-marker
+The variable @code{calendar-today-marker} specifies how to mark
+today's date.  Its value should be a single-character string to insert
+next to the date or a face name to use for displaying the date.  A
+face named @code{calendar-today-face} is provided for this purpose;
+that symbol is the default for this variable.
+
+@vindex today-invisible-calendar-hook
+@noindent
+  A similar normal hook, @code{today-invisible-calendar-hook} is run if
+the current date is @emph{not} visible in the window.
+
+@vindex calendar-move-hook
+  Each of the calendar cursor motion commands runs the hook
+@code{calendar-move-hook} after it moves the cursor.
+
+@node Holiday Customizing
+@subsection Customizing the Holidays
+
+@vindex calendar-holidays
+@vindex christian-holidays
+@vindex hebrew-holidays
+@vindex islamic-holidays
+  Emacs knows about holidays defined by entries on one of several lists.
+You can customize these lists of holidays to your own needs, adding or
+deleting holidays.  The lists of holidays that Emacs uses are for
+general holidays (@code{general-holidays}), local holidays
+(@code{local-holidays}), Christian holidays (@code{christian-holidays}),
+Hebrew (Jewish) holidays (@code{hebrew-holidays}), Islamic (Muslim)
+holidays (@code{islamic-holidays}), and other holidays
+(@code{other-holidays}).
+
+@vindex general-holidays
+  The general holidays are, by default, holidays common throughout the
+United States.  To eliminate these holidays, set @code{general-holidays}
+to @code{nil}.
+
+@vindex local-holidays
+  There are no default local holidays (but sites may supply some).  You
+can set the variable @code{local-holidays} to any list of holidays, as
+described below.
+
+@vindex all-christian-calendar-holidays
+@vindex all-hebrew-calendar-holidays
+@vindex all-islamic-calendar-holidays
+  By default, Emacs does not include all the holidays of the religions
+that it knows, only those commonly found in secular calendars.  For a
+more extensive collection of religious holidays, you can set any (or
+all) of the variables @code{all-christian-calendar-holidays},
+@code{all-hebrew-calendar-holidays}, or
+@code{all-islamic-calendar-holidays} to @code{t}.  If you want to
+eliminate the religious holidays, set any or all of the corresponding
+variables @code{christian-holidays}, @code{hebrew-holidays}, and
+@code{islamic-holidays} to @code{nil}.@refill
+
+@vindex other-holidays
+  You can set the variable @code{other-holidays} to any list of
+holidays.  This list, normally empty, is intended for individual use.
+
+@cindex holiday forms
+  Each of the lists (@code{general-holidays}, @code{local-holidays},
+@code{christian-holidays}, @code{hebrew-holidays},
+@code{islamic-holidays}, and @code{other-holidays}) is a list of
+@dfn{holiday forms}, each holiday form describing a holiday (or
+sometimes a list of holidays).
+
+  Here is a table of the possible kinds of holiday form.  Day numbers
+and month numbers count starting from 1, but ``dayname'' numbers
+count Sunday as 0.  The element @var{string} is always the
+name of the holiday, as a string.
+
+@table @code
+@item (holiday-fixed @var{month} @var{day} @var{string})
+A fixed date on the Gregorian calendar.
+
+@item (holiday-float @var{month} @var{dayname} @var{k} @var{string})
+The @var{k}th @var{dayname} in @var{month} on the Gregorian calendar
+(@var{dayname}=0 for Sunday, and so on); negative @var{k} means count back
+from the end of the month.
+
+@item (holiday-hebrew @var{month} @var{day} @var{string})
+A fixed date on the Hebrew calendar.
+
+@item (holiday-islamic @var{month} @var{day} @var{string})
+A fixed date on the Islamic calendar.
+
+@item (holiday-julian @var{month} @var{day} @var{string})
+A fixed date on the Julian calendar.
+
+@item (holiday-sexp @var{sexp} @var{string})
+A date calculated by the Lisp expression @var{sexp}.  The expression
+should use the variable @code{year} to compute and return the date of a
+holiday, or @code{nil} if the holiday doesn't happen this year.  The
+value of @var{sexp} must represent the date as a list of the form
+@code{(@var{month} @var{day} @var{year})}.
+
+@item (if @var{condition} @var{holiday-form})
+A holiday that happens only if @var{condition} is true.
+
+@item (@var{function} @r{[}@var{args}@r{]})
+A list of dates calculated by the function @var{function}, called with
+arguments @var{args}.
+@end table
+
+  For example, suppose you want to add Bastille Day, celebrated in
+France on July 14.  You can do this as follows:
+
+@smallexample
+(setq other-holidays '((holiday-fixed 7 14 "Bastille Day")))
+@end smallexample
+
+@noindent
+The holiday form @code{(holiday-fixed 7 14 "Bastille Day")} specifies the
+fourteenth day of the seventh month (July).
+
+  Many holidays occur on a specific day of the week, at a specific time
+of month.  Here is a holiday form describing Hurricane Supplication Day,
+celebrated in the Virgin Islands on the fourth Monday in August:
+
+@smallexample
+(holiday-float 8 1 4 "Hurricane Supplication Day")
+@end smallexample
+
+@noindent
+Here the 8 specifies August, the 1 specifies Monday (Sunday is 0,
+Tuesday is 2, and so on), and the 4 specifies the fourth occurrence in
+the month (1 specifies the first occurrence, 2 the second occurrence,
+@minus{}1 the last occurrence, @minus{}2 the second-to-last occurrence, and
+so on).
+
+  You can specify holidays that occur on fixed days of the Hebrew,
+Islamic, and Julian calendars too.  For example,
+
+@smallexample
+(setq other-holidays
+      '((holiday-hebrew 10 2 "Last day of Hanukkah")
+        (holiday-islamic 3 12 "Mohammed's Birthday")
+        (holiday-julian 4 2 "Jefferson's Birthday")))
+@end smallexample
+
+@noindent
+adds the last day of Hanukkah (since the Hebrew months are numbered with
+1 starting from Nisan), the Islamic feast celebrating Mohammed's
+birthday (since the Islamic months are numbered from 1 starting with
+Muharram), and Thomas Jefferson's birthday, which is 2 April 1743 on the
+Julian calendar.
+
+  To include a holiday conditionally, use either Emacs Lisp's @code{if} or the
+@code{holiday-sexp} form.  For example, American presidential elections
+occur on the first Tuesday after the first Monday in November of years
+divisible by 4:
+
+@smallexample
+(holiday-sexp '(if (= 0 (% year 4))
+                   (calendar-gregorian-from-absolute
+                    (1+ (calendar-dayname-on-or-before
+                          1 (+ 6 (calendar-absolute-from-gregorian
+                                  (list 11 1 year)))))))
+              "US Presidential Election")
+@end smallexample
+
+@noindent
+or
+
+@smallexample
+(if (= 0 (% displayed-year 4))
+    (fixed 11
+           (extract-calendar-day
+             (calendar-gregorian-from-absolute
+               (1+ (calendar-dayname-on-or-before
+                     1 (+ 6 (calendar-absolute-from-gregorian
+                              (list 11 1 displayed-year)))))))
+           "US Presidential Election"))
+@end smallexample
+
+  Some holidays just don't fit into any of these forms because special
+calculations are involved in their determination.  In such cases you
+must write a Lisp function to do the calculation.  To include eclipses,
+for example, add @code{(eclipses)} to @code{other-holidays}
+and write an Emacs Lisp function @code{eclipses} that returns a
+(possibly empty) list of the relevant Gregorian dates among the range
+visible in the calendar window, with descriptive strings, like this:
+
+@smallexample
+(((6 27 1991) "Lunar Eclipse") ((7 11 1991) "Solar Eclipse") ... )
+@end smallexample
+
+@node Date Display Format
+@subsection Date Display Format
+@vindex calendar-date-display-form
+
+  You can customize the manner of displaying dates in the diary, in mode
+lines, and in messages by setting @code{calendar-date-display-form}.
+This variable holds a list of expressions that can involve the variables
+@code{month}, @code{day}, and @code{year}, which are all numbers in
+string form, and @code{monthname} and @code{dayname}, which are both
+alphabetic strings.  In the American style, the default value of this
+list is as follows:
+
+@smallexample
+((if dayname (concat dayname ", ")) monthname " " day ", " year)
+@end smallexample
+
+@noindent
+while in the European style this value is the default:
+
+@smallexample
+((if dayname (concat dayname ", ")) day " " monthname " " year)
+@end smallexample
+
+@noindent
+The ISO standard date representation is this:
+
+@smallexample
+(year "-" month "-" day)
+@end smallexample
+
+@noindent
+This specifies a typical American format:
+
+@smallexample
+(month "/" day "/" (substring year -2))
+@end smallexample
+
+@node Time Display Format
+@subsection Time Display Format
+@vindex calendar-time-display-form
+
+  The calendar and diary by default display times of day in the
+conventional American style with the hours from 1 through 12, minutes,
+and either @samp{am} or @samp{pm}.  If you prefer the European style,
+also known in the US as military, in which the hours go from 00 to 23,
+you can alter the variable @code{calendar-time-display-form}.  This
+variable is a list of expressions that can involve the variables
+@code{12-hours}, @code{24-hours}, and @code{minutes}, which are all
+numbers in string form, and @code{am-pm} and @code{time-zone}, which are
+both alphabetic strings.  The default value of
+@code{calendar-time-display-form} is as follows:
+
+@smallexample
+(12-hours ":" minutes am-pm
+          (if time-zone " (") time-zone (if time-zone ")"))
+@end smallexample
+
+@noindent
+Here is a value that provides European style times:
+
+@smallexample
+(24-hours ":" minutes
+          (if time-zone " (") time-zone (if time-zone ")"))
+@end smallexample
+
+@node Diary Customizing
+@subsection Customizing the Diary
+
+@vindex holidays-in-diary-buffer
+  Ordinarily, the mode line of the diary buffer window indicates any
+holidays that fall on the date of the diary entries.  The process of
+checking for holidays can take several seconds, so including holiday
+information delays the display of the diary buffer noticeably.  If you'd
+prefer to have a faster display of the diary buffer but without the
+holiday information, set the variable @code{holidays-in-diary-buffer} to
+@code{nil}.@refill
+
+@vindex number-of-diary-entries
+  The variable @code{number-of-diary-entries} controls the number of
+days of diary entries to be displayed at one time.  It affects the
+initial display when @code{view-diary-entries-initially} is @code{t}, as
+well as the command @kbd{M-x diary}.  For example, the default value is
+1, which says to display only the current day's diary entries.  If the
+value is 2, both the current day's and the next day's entries are
+displayed.  The value can also be a vector of seven elements: for
+example, if the value is @code{[0 2 2 2 2 4 1]} then no diary entries
+appear on Sunday, the current date's and the next day's diary entries
+appear Monday through Thursday, Friday through Monday's entries appear
+on Friday, while on Saturday only that day's entries appear.
+
+@vindex print-diary-entries-hook
+@findex print-diary-entries
+  The variable @code{print-diary-entries-hook} is a normal hook run
+after preparation of a temporary buffer containing just the diary
+entries currently visible in the diary buffer.  (The other, irrelevant
+diary entries are really absent from the temporary buffer; in the diary
+buffer, they are merely hidden.)  The default value of this hook does
+the printing with the command @code{lpr-buffer}.  If you want to use a
+different command to do the printing, just change the value of this
+hook.  Other uses might include, for example, rearranging the lines into
+order by day and time.
+
+@vindex diary-date-forms
+  You can customize the form of dates in your diary file, if neither the
+standard American nor European styles suits your needs, by setting the
+variable @code{diary-date-forms}.  This variable is a list of patterns
+for recognizing a date.  Each date pattern is a list whose elements may
+be regular expressions (@pxref{Regular Expressions,,, elisp, the Emacs
+Lisp Reference Manual}) or the symbols @code{month}, @code{day},
+@code{year}, @code{monthname}, and @code{dayname}.  All these elements
+serve as patterns that match certain kinds of text in the diary file.
+In order for the date pattern, as a whole, to match, all of its elements
+must match consecutively.
+
+  A regular expression in a date pattern matches in its usual fashion,
+using the standard syntax table altered so that @samp{*} is a word
+constituent.
+
+  The symbols @code{month}, @code{day}, @code{year}, @code{monthname},
+and @code{dayname} match the month number, day number, year number,
+month name, and day name of the date being considered.  The symbols that
+match numbers allow leading zeros; those that match names allow
+three-letter abbreviations and capitalization.  All the symbols can
+match @samp{*}; since @samp{*} in a diary entry means ``any day'', ``any
+month'', and so on, it should match regardless of the date being
+considered.
+
+  The default value of @code{diary-date-forms} in the American style is
+this:
+
+@example
+((month "/" day "[^/0-9]")
+ (month "/" day "/" year "[^0-9]")
+ (monthname " *" day "[^,0-9]")
+ (monthname " *" day ", *" year "[^0-9]")
+ (dayname "\\W"))
+@end example
+
+  The date patterns in the list must be @emph{mutually exclusive} and
+must not match any portion of the diary entry itself, just the date and
+one character of whitespace.  If, to be mutually exclusive, the pattern
+must match a portion of the diary entry text---beyond the whitespace
+that ends the date---then the first element of the date pattern
+@emph{must} be @code{backup}.  This causes the date recognizer to back
+up to the beginning of the current word of the diary entry, after
+finishing the match.  Even if you use @code{backup}, the date pattern
+must absolutely not match more than a portion of the first word of the
+diary entry.  The default value of @code{diary-date-forms} in the
+European style is this list:
+
+@example
+((day "/" month "[^/0-9]")
+ (day "/" month "/" year "[^0-9]")
+ (backup day " *" monthname "\\W+\\<[^*0-9]")
+ (day " *" monthname " *" year "[^0-9]")
+ (dayname "\\W"))
+@end example
+
+@noindent
+Notice the use of @code{backup} in the third pattern, because it needs
+to match part of a word beyond the date itself to distinguish it from
+the fourth pattern.
+
+@node Hebrew/Islamic Entries
+@subsection Hebrew- and Islamic-Date Diary Entries
+
+  Your diary file can have entries based on Hebrew or Islamic dates, as
+well as entries based on the world-standard Gregorian calendar.
+However, because recognition of such entries is time-consuming and most
+people don't use them, you must explicitly enable their use.  If you
+want the diary to recognize Hebrew-date diary entries, for example,
+you must do this:
+
+@vindex nongregorian-diary-listing-hook
+@vindex nongregorian-diary-marking-hook
+@findex list-hebrew-diary-entries
+@findex mark-hebrew-diary-entries
+@smallexample
+(add-hook 'nongregorian-diary-listing-hook 'list-hebrew-diary-entries)
+(add-hook 'nongregorian-diary-marking-hook 'mark-hebrew-diary-entries)
+@end smallexample
+
+@noindent
+If you want Islamic-date entries, do this:
+
+@findex list-islamic-diary-entries
+@findex mark-islamic-diary-entries
+@smallexample
+(add-hook 'nongregorian-diary-listing-hook 'list-islamic-diary-entries)
+(add-hook 'nongregorian-diary-marking-hook 'mark-islamic-diary-entries)
+@end smallexample
+
+  Hebrew- and Islamic-date diary entries have the same formats as
+Gregorian-date diary entries, except that @samp{H} precedes a Hebrew
+date and @samp{I} precedes an Islamic date.  Moreover, because the
+Hebrew and Islamic month names are not uniquely specified by the first
+three letters, you may not abbreviate them.  For example, a diary entry
+for the Hebrew date Heshvan 25 could look like this:
+
+@smallexample
+HHeshvan 25 Happy Hebrew birthday!
+@end smallexample
+
+@noindent
+and would appear in the diary for any date that corresponds to Heshvan 25
+on the Hebrew calendar.  And here is an Islamic-date diary entry that matches
+Dhu al-Qada 25:
+
+@smallexample
+IDhu al-Qada 25 Happy Islamic birthday!
+@end smallexample
+
+  As with Gregorian-date diary entries, Hebrew- and Islamic-date entries
+are nonmarking if they are preceded with an ampersand (@samp{&}).
+
+  Here is a table of commands used in the calendar to create diary entries
+that match the selected date and other dates that are similar in the Hebrew
+or Islamic calendar:
+
+@table @kbd
+@item i h d
+Add a diary entry for the Hebrew date corresponding to the selected date
+(@code{insert-hebrew-diary-entry}).
+@item i h m
+Add a diary entry for the day of the Hebrew month corresponding to the
+selected date (@code{insert-monthly-hebrew-diary-entry}).  This diary
+entry matches any date that has the same Hebrew day-within-month as the
+selected date.
+@item i h y
+Add a diary entry for the day of the Hebrew year corresponding to the
+selected date (@code{insert-yearly-hebrew-diary-entry}).  This diary
+entry matches any date which has the same Hebrew month and day-within-month
+as the selected date.
+@item i i d
+Add a diary entry for the Islamic date corresponding to the selected date
+(@code{insert-islamic-diary-entry}).
+@item i i m
+Add a diary entry for the day of the Islamic month corresponding to the
+selected date (@code{insert-monthly-islamic-diary-entry}).
+@item i i y
+Add a diary entry for the day of the Islamic year corresponding to the
+selected date (@code{insert-yearly-islamic-diary-entry}).
+@end table
+
+@findex insert-hebrew-diary-entry
+@findex insert-monthly-hebrew-diary-entry
+@findex insert-yearly-hebrew-diary-entry
+@findex insert-islamic-diary-entry
+@findex insert-monthly-islamic-diary-entry
+@findex insert-yearly-islamic-diary-entry
+  These commands work much like the corresponding commands for ordinary
+diary entries: they apply to the date that point is on in the calendar
+window, and what they do is insert just the date portion of a diary entry
+at the end of your diary file.  You must then insert the rest of the
+diary entry.
+
+@node Fancy Diary Display
+@subsection Fancy Diary Display
+@vindex diary-display-hook
+@findex simple-diary-display
+
+  Diary display works by preparing the diary buffer and then running the
+hook @code{diary-display-hook}.  The default value of this hook
+(@code{simple-diary-display}) hides the irrelevant diary entries and
+then displays the buffer.  However, if you specify the hook as follows,
+
+@cindex diary buffer
+@findex fancy-diary-display
+@example
+(add-hook 'diary-display-hook 'fancy-diary-display)
+@end example
+
+@noindent
+this enables fancy diary display.  It displays diary entries and
+holidays by copying them into a special buffer that exists only for the
+sake of display.  Copying to a separate buffer provides an opportunity
+to change the displayed text to make it prettier---for example, to sort
+the entries by the dates they apply to.
+
+  As with simple diary display, you can print a hard copy of the buffer
+with @code{print-diary-entries}.  To print a hard copy of a day-by-day
+diary for a week, position point on Sunday of that week, type
+@kbd{7 d}, and then do @kbd{M-x print-diary-entries}.  As usual, the
+inclusion of the holidays slows down the display slightly; you can speed
+things up by setting the variable @code{holidays-in-diary-buffer} to
+@code{nil}.
+
+@vindex diary-list-include-blanks
+  Ordinarily, the fancy diary buffer does not show days for which there are
+no diary entries, even if that day is a holiday.  If you want such days to be
+shown in the fancy diary buffer, set the variable
+@code{diary-list-include-blanks} to @code{t}.@refill
+
+@cindex sorting diary entries
+  If you use the fancy diary display, you can use the normal hook
+@code{list-diary-entries-hook} to sort each day's diary entries by their
+time of day.  Here's how:
+
+@findex sort-diary-entries
+@example
+(add-hook 'list-diary-entries-hook 'sort-diary-entries t)
+@end example
+
+@noindent
+For each day, this sorts diary entries that begin with a recognizable
+time of day according to their times.  Diary entries without times come
+first within each day.
+
+  Fancy diary display also has the ability to process included diary
+files.  This permits a group of people to share a diary file for events
+that apply to all of them.  Lines in the diary file of this form:
+
+@smallexample
+#include "@var{filename}"
+@end smallexample
+
+@noindent
+includes the diary entries from the file @var{filename} in the fancy
+diary buffer.  The include mechanism is recursive, so that included files
+can include other files, and so on; you must be careful not to have a
+cycle of inclusions, of course.  Here is how to enable the include
+facility:
+
+@vindex list-diary-entries-hook
+@vindex mark-diary-entries-hook
+@findex include-other-diary-files
+@findex mark-included-diary-files
+@smallexample
+(add-hook 'list-diary-entries-hook 'include-other-diary-files)
+(add-hook 'mark-diary-entries-hook 'mark-included-diary-files)
+@end smallexample
+
+The include mechanism works only with the fancy diary display, because
+ordinary diary display shows the entries directly from your diary file.
+
+@node Sexp Diary Entries
+@subsection Sexp Entries and the Fancy Diary Display
+@cindex sexp diary entries
+
+  Sexp diary entries allow you to do more than just have complicated
+conditions under which a diary entry applies.  If you use the fancy
+diary display, sexp entries can generate the text of the entry depending
+on the date itself.  For example, an anniversary diary entry can insert
+the number of years since the anniversary date into the text of the
+diary entry.  Thus the @samp{%d} in this diary entry:
+
+@findex diary-anniversary
+@smallexample
+%%(diary-anniversary 10 31 1948) Arthur's birthday (%d years old)
+@end smallexample
+
+@noindent
+gets replaced by the age, so on October 31, 1990 the entry appears in
+the fancy diary buffer like this:
+
+@smallexample
+Arthur's birthday (42 years old)
+@end smallexample
+
+@noindent
+If the diary file instead contains this entry:
+
+@smallexample
+%%(diary-anniversary 10 31 1948) Arthur's %d%s birthday
+@end smallexample
+
+@noindent
+the entry in the fancy diary buffer for October 31, 1990 appears like this:
+
+@smallexample
+Arthur's 42nd birthday
+@end smallexample
+
+  Similarly, cyclic diary entries can interpolate the number of repetitions
+that have occurred:
+
+@findex diary-cyclic
+@smallexample
+%%(diary-cyclic 50 1 1 1990) Renew medication (%d%s time)
+@end smallexample
+
+@noindent
+looks like this:
+
+@smallexample
+Renew medication (5th time)
+@end smallexample
+
+@noindent
+in the fancy diary display on September 8, 1990.
+
+  There is an early reminder diary sexp that includes its entry in the
+diary not only on the date of occurrence, but also on earlier dates.
+For example, if you want a reminder a week before your anniversary, you
+can use
+
+@findex diary-remind
+@smallexample
+%%(diary-remind '(diary-anniversary 12 22 1968) 7) Ed's anniversary
+@end smallexample
+
+@noindent
+and the fancy diary will show
+@smallexample
+Ed's anniversary
+@end smallexample
+@noindent
+both on December 15 and on December 22.
+
+@findex diary-date
+  The function @code{diary-date} applies to dates described by a month,
+day, year combination, each of which can be an integer, a list of
+integers, or @code{t}. The value @code{t} means all values.  For
+example,
+
+@smallexample
+%%(diary-date '(10 11 12) 22 t) Rake leaves
+@end smallexample
+
+@noindent
+causes the fancy diary to show
+
+@smallexample
+Rake leaves
+@end smallexample
+
+@noindent
+on October 22, November 22, and December 22 of every year.
+
+@findex diary-float
+  The function @code{diary-float} allows you to describe diary entries
+that apply to dates like the third Friday of November, or the last
+Tuesday in April.  The parameters are the @var{month}, @var{dayname},
+and an index @var{n}. The entry appears on the @var{n}th @var{dayname}
+of @var{month}, where @var{dayname}=0 means Sunday, 1 means Monday, and
+so on.  If @var{n} is negative it counts backward from the end of
+@var{month}.  The value of @var{month} can be a list of months, a single
+month, or @code{t} to specify all months.  You can also use an optional
+parameter @var{day} to specify the @var{n}th @var{dayname} of
+@var{month} on or after/before @var{day}; the value of @var{day} defaults
+to 1 if @var{n} is positive and to the last day of @var{month} if
+@var{n} is negative.  For example,
+
+@smallexample
+%%(diary-float t 1 -1) Pay rent
+@end smallexample
+
+@noindent
+causes the fancy diary to show
+
+@smallexample
+Pay rent
+@end smallexample
+
+@noindent
+on the last Monday of every month.
+
+  The generality of sexp diary entries lets you specify any diary
+entry that you can describe algorithmically.  A sexp diary entry
+contains an expression that computes whether the entry applies to any
+given date.  If its value is non-@code{nil}, the entry applies to that
+date; otherwise, it does not.  The expression can use the variable
+@code{date} to find the date being considered; its value is a list
+(@var{month} @var{day} @var{year}) that refers to the Gregorian
+calendar.
+
+  The sexp diary entry applies to a date when the expression's value
+is non-@code{nil}, but some values have more specific meanings.  If
+the value is a string, that string is a description of the event which
+occurs on that date.  The value can also have the form
+@code{(@var{mark} . @var{string})}; then @var{mark} specifies how to
+mark the date in the calendar, and @var{string} is the description of
+the event.  If @var{mark} is a single-character string, that character
+appears next to the date in the calendar.  If @var{mark} is a face
+name, the date is displayed in that face.  If @var{mark} is
+@code{nil}, that specifies no particular highlighting for the date.
+
+  Suppose you get paid on the 21st of the month if it is a weekday, and
+on the Friday before if the 21st is on a weekend.  Here is how to write
+a sexp diary entry that matches those dates:
+
+@smallexample
+&%%(let ((dayname (calendar-day-of-week date))
+         (day (car (cdr date))))
+      (or (and (= day 21) (memq dayname '(1 2 3 4 5)))
+          (and (memq day '(19 20)) (= dayname 5)))
+         ) Pay check deposited
+@end smallexample
+
+  The following sexp diary entries take advantage of the ability (in the fancy
+diary display) to concoct diary entries whose text varies based on the date:
+
+@findex diary-sunrise-sunset
+@findex diary-phases-of-moon
+@findex diary-day-of-year
+@findex diary-iso-date
+@findex diary-julian-date
+@findex diary-astro-day-number
+@findex diary-hebrew-date
+@findex diary-islamic-date
+@findex diary-french-date
+@findex diary-mayan-date
+@table @code
+@item %%(diary-sunrise-sunset)
+Make a diary entry for the local times of today's sunrise and sunset.
+@item %%(diary-phases-of-moon)
+Make a diary entry for the phases (quarters) of the moon.
+@item %%(diary-day-of-year)
+Make a diary entry with today's day number in the current year and the number
+of days remaining in the current year.
+@item %%(diary-iso-date)
+Make a diary entry with today's equivalent ISO commercial date.
+@item %%(diary-julian-date)
+Make a diary entry with today's equivalent date on the Julian calendar.
+@item %%(diary-astro-day-number)
+Make a diary entry with today's equivalent astronomical (Julian) day number.
+@item %%(diary-hebrew-date)
+Make a diary entry with today's equivalent date on the Hebrew calendar.
+@item %%(diary-islamic-date)
+Make a diary entry with today's equivalent date on the Islamic calendar.
+@item %%(diary-french-date)
+Make a diary entry with today's equivalent date on the French Revolutionary
+calendar.
+@item %%(diary-mayan-date)
+Make a diary entry with today's equivalent date on the Mayan calendar.
+@end table
+
+@noindent
+Thus including the diary entry
+
+@example
+&%%(diary-hebrew-date)
+@end example
+
+@noindent
+causes every day's diary display to contain the equivalent date on the
+Hebrew calendar, if you are using the fancy diary display.  (With simple
+diary display, the line @samp{&%%(diary-hebrew-date)} appears in the
+diary for any date, but does nothing particularly useful.)
+
+  These functions can be used to construct sexp diary entries based on
+the Hebrew calendar in certain standard ways:
+
+@cindex rosh hodesh
+@findex diary-rosh-hodesh
+@cindex parasha, weekly
+@findex diary-parasha
+@cindex candle lighting times
+@findex diary-sabbath-candles
+@cindex omer count
+@findex diary-omer
+@cindex yahrzeits
+@findex diary-yahrzeit
+@table @code
+@item %%(diary-rosh-hodesh)
+Make a diary entry that tells the occurrence and ritual announcement of each
+new Hebrew month.
+@item %%(diary-parasha)
+Make a Saturday diary entry that tells the weekly synagogue scripture reading.
+@item %%(diary-sabbath-candles)
+Make a Friday diary entry that tells the @emph{local time} of Sabbath
+candle lighting.
+@item %%(diary-omer)
+Make a diary entry that gives the omer count, when appropriate.
+@item %%(diary-yahrzeit @var{month} @var{day} @var{year}) @var{name}
+Make a diary entry marking the anniversary of a date of death.  The date
+is the @emph{Gregorian} (civil) date of death.  The diary entry appears
+on the proper Hebrew calendar anniversary and on the day before.  (In
+the European style, the order of the parameters is changed to @var{day},
+@var{month}, @var{year}.)
+@end table
+
+  All the functions documented above take an optional argument
+@var{mark} which specifies how to mark the date in the calendar display.
+If one of these functions decides that it applies to a certain date,
+it returns a value that contains @var{mark}.
+
+@ignore
+   arch-tag: 52cb299f-fd1f-4616-bfe6-91b988669431
+@end ignore
similarity index 99%
rename from man/calendar.texi
rename to doc/emacs/calendar.texi
index 5182474622d77431eb9bb00ebc6b33803a5d6a74..1357784b920c1116a5949bf7a9bcf5007b43c124 100644 (file)
@@ -457,12 +457,12 @@ Display holidays for the selected date
 @item Mouse-2 Holidays
 Display any holidays for the date you click on.
 @item x
-Mark holidays in the calendar window (@code{mark-calendar-holidays}).
+Mark holidays in the calendar window (@code{calendar-mark-holidays}).
 @item u
 Unmark calendar window (@code{calendar-unmark}).
 @item a
 List all holidays for the displayed three months in another window
-(@code{list-calendar-holidays}).
+(@code{calendar-list-holidays}).
 @item M-x holidays
 List all holidays for three months around today's date in another
 window.
@@ -481,7 +481,7 @@ that date, in the echo area if they fit there, otherwise in a separate
 window.
 
 @kindex x @r{(Calendar mode)}
-@findex mark-calendar-holidays
+@findex calendar-mark-holidays
 @kindex u @r{(Calendar mode)}
 @findex calendar-unmark
 @vindex mark-holidays-in-calendar
@@ -503,7 +503,7 @@ erases any diary marks (@pxref{Diary}).  If the variable
 updating the calendar marks holidays automatically.
 
 @kindex a @r{(Calendar mode)}
-@findex list-calendar-holidays
+@findex calendar-list-holidays
   To get even more detailed information, use the @kbd{a} command, which
 displays a separate buffer containing a list of all holidays in the
 current three-month range.  You can use @key{SPC} and @key{DEL} in the
diff --git a/doc/emacs/cmdargs.texi b/doc/emacs/cmdargs.texi
new file mode 100644 (file)
index 0000000..28bad72
--- /dev/null
@@ -0,0 +1,1263 @@
+@c This is part of the Emacs manual.
+@c Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995, 1997, 2001, 2002,
+@c   2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+@c See file emacs.texi for copying conditions.
+@node Emacs Invocation, X Resources, GNU Free Documentation License, Top
+@appendix Command Line Arguments for Emacs Invocation
+@cindex command line arguments
+@cindex arguments (command line)
+@cindex options (command line)
+@cindex switches (command line)
+@cindex startup (command line arguments)
+@cindex invocation (command line arguments)
+
+  GNU Emacs supports command line arguments to request various actions
+when invoking Emacs.  These are for compatibility with other editors and
+for sophisticated activities.  We don't recommend using them for
+ordinary editing.
+
+  Arguments starting with @samp{-} are @dfn{options}, and so is
+@samp{+@var{linenum}}.  All other arguments specify files to visit.
+Emacs visits the specified files while it starts up.  The last file
+name on your command line becomes the current buffer; the other files
+are also visited in other buffers.  If there are two files, they are
+both displayed; otherwise the last file is displayed along with a
+buffer list that shows what other buffers there are.  As with most
+programs, the special argument @samp{--} says that all subsequent
+arguments are file names, not options, even if they start with
+@samp{-}.
+
+  Emacs command options can specify many things, such as the size and
+position of the X window Emacs uses, its colors, and so on.  A few
+options support advanced usage, such as running Lisp functions on files
+in batch mode.  The sections of this chapter describe the available
+options, arranged according to their purpose.
+
+  There are two ways of writing options: the short forms that start with
+a single @samp{-}, and the long forms that start with @samp{--}.  For
+example, @samp{-d} is a short form and @samp{--display} is the
+corresponding long form.
+
+  The long forms with @samp{--} are easier to remember, but longer to
+type.  However, you don't have to spell out the whole option name; any
+unambiguous abbreviation is enough.  When a long option takes an
+argument, you can use either a space or an equal sign to separate the
+option name and the argument.  Thus, you can write either
+@samp{--display sugar-bombs:0.0} or @samp{--display=sugar-bombs:0.0}.
+We recommend an equal sign because it makes the relationship clearer,
+and the tables below always show an equal sign.
+
+@cindex initial options (command line)
+@cindex action options (command line)
+@vindex command-line-args
+  Most options specify how to initialize Emacs, or set parameters for
+the Emacs session.  We call them @dfn{initial options}.  A few options
+specify things to do: for example, load libraries, call functions, or
+terminate Emacs.  These are called @dfn{action options}.  These and file
+names together are called @dfn{action arguments}.  Emacs processes all
+the action arguments in the order they are written.  The @file{.emacs} file
+can access the values of the action arguments as the elements of a list in
+the variable @code{command-line-args}.
+
+
+
+@menu
+* Action Arguments::    Arguments to visit files, load libraries,
+                          and call functions.
+* Initial Options::     Arguments that take effect while starting Emacs.
+* Command Example::     Examples of using command line arguments.
+* Resume Arguments::    Specifying arguments when you resume a running Emacs.
+* Environment::         Environment variables that Emacs uses.
+* Display X::           Changing the default display and using remote login.
+* Font X::              Choosing a font for text, under X.
+* Colors::              Choosing display colors.
+* Window Size X::       Start-up window size, under X.
+* Borders X::           Internal and external borders, under X.
+* Title X::             Specifying the initial frame's title.
+* Icons X::             Choosing what sort of icon to use, under X.
+* Misc X::              Other display options.
+@end menu
+
+@node Action Arguments
+@appendixsec Action Arguments
+
+  Here is a table of the action arguments and options:
+
+@table @samp
+@item @var{file}
+@opindex --file
+@itemx --file=@var{file}
+@opindex --find-file
+@itemx --find-file=@var{file}
+@opindex --visit
+@itemx --visit=@var{file}
+@cindex visiting files, command-line argument
+@vindex inhibit-startup-buffer-menu
+Visit @var{file} using @code{find-file}.  @xref{Visiting}.
+If you visit several files at startup in this way, Emacs
+also displays a Buffer Menu buffer to show you what files it
+has visited.  You can inhibit that by setting @code{inhibit-startup-buffer-menu} to @code{t}.
+
+@item +@var{linenum} @var{file}
+@opindex +@var{linenum}
+Visit @var{file} using @code{find-file}, then go to line number
+@var{linenum} in it.
+
+@item +@var{linenum}:@var{columnnum} @var{file}
+Visit @var{file} using @code{find-file}, then go to line number
+@var{linenum} and put point at column number @var{columnnum}.
+
+@need 3000
+@item -l @var{file}
+@opindex -l
+@itemx --load=@var{file}
+@opindex --load
+@cindex loading Lisp libraries, command-line argument
+Load a Lisp library named @var{file} with the function @code{load}.
+@xref{Lisp Libraries}.  If @var{file} is not an absolute file name,
+the library can be found either in the current directory, or in the
+Emacs library search path as specified with @env{EMACSLOADPATH}
+(@pxref{General Variables}).
+
+@strong{Warning:} If previous command-line arguments have visited
+files, the current directory is the directory of the last file
+visited.
+
+@item -L @var{dir}
+@opindex -L
+@itemx --directory=@var{dir}
+@opindex --directory
+Add directory @var{dir} to the variable @code{load-path}.
+
+@item -f @var{function}
+@opindex -f
+@itemx --funcall=@var{function}
+@opindex --funcall
+@cindex call Lisp functions, command-line argument
+Call Lisp function @var{function}.  If it is an interactive function
+(a command), it reads the arguments interactively just as if you had
+called the same function with a key sequence.  Otherwise, it calls the
+function with no arguments.
+
+@item --eval=@var{expression}
+@opindex --eval
+@itemx --execute=@var{expression}
+@opindex --execute
+@cindex evaluate expression, command-line argument
+Evaluate Lisp expression @var{expression}.
+
+@item --insert=@var{file}
+@opindex --insert
+@cindex insert file contents, command-line argument
+Insert the contents of @var{file} into the current buffer.  This is like
+what @kbd{M-x insert-file} does.  @xref{Misc File Ops}.
+
+@item --kill
+@opindex --kill
+Exit from Emacs without asking for confirmation.
+
+@item --help
+@opindex --help
+Print a usage message listing all available options, then exit
+successfully.
+
+@item --version
+@opindex --version
+Print Emacs version, then exit successfully.
+@end table
+
+@node Initial Options
+@appendixsec Initial Options
+
+  The initial options specify parameters for the Emacs session.  This
+section describes the more general initial options; some other options
+specifically related to the X Window System appear in the following
+sections.
+
+  Some initial options affect the loading of init files.  The normal
+actions of Emacs are to first load @file{site-start.el} if it exists,
+then your own init file @file{~/.emacs} if it exists, and finally
+@file{default.el} if it exists.  @xref{Init File}.  Certain options
+prevent loading of some of these files or substitute other files for
+them.
+
+@table @samp
+@item -t @var{device}
+@opindex -t
+@itemx --terminal=@var{device}
+@opindex --terminal
+@cindex device for Emacs terminal I/O
+Use @var{device} as the device for terminal input and output.
+@samp{--terminal} implies @samp{--no-window-system}.
+
+@item -d @var{display}
+@opindex -d
+@itemx --display=@var{display}
+@opindex --display
+@cindex display for Emacs frame
+Use the X Window System and use the display named @var{display} to open
+the initial Emacs frame.  @xref{Display X}, for more details.
+
+@item -nw
+@opindex -nw
+@itemx --no-window-system
+@opindex --no-window-system
+@cindex disable window system
+Don't communicate directly with the window system, disregarding the
+@env{DISPLAY} environment variable even if it is set.  This means that
+Emacs uses the terminal from which it was launched for all its display
+and input.
+
+@need 3000
+@cindex batch mode
+@item -batch
+@opindex --batch
+@itemx --batch
+Run Emacs in @dfn{batch mode}.  Batch mode is used for running
+programs written in Emacs Lisp from shell scripts, makefiles, and so
+on.  You should also use the @samp{-l}, @samp{-f} or @samp{--eval}
+option, to invoke a Lisp program to do batch processing.
+
+In batch mode, Emacs does not display the text being edited, and the
+standard terminal interrupt characters such as @kbd{C-z} and @kbd{C-c}
+continue to have their normal effect.  The functions @code{prin1},
+@code{princ} and @code{print} output to @code{stdout} instead of the
+echo area, while @code{message} and error messages output to
+@code{stderr}.  Functions that would normally read from the minibuffer
+take their input from @code{stdin} instead.
+
+@samp{--batch} implies @samp{-q} (do not load an init file), but
+@file{site-start.el} is loaded nonetheless.  It also causes Emacs to
+exit after processing all the command options.  In addition, it
+disables auto-saving except in buffers for which it has been
+explicitly requested.
+
+@item --script @var{file}
+@opindex --script
+@cindex script mode
+Run Emacs in batch mode, like @samp{--batch}, and then read and
+execute the Lisp code in @var{file}.
+
+The normal use of this option is in executable script files that run
+Emacs.  They can start with this text on the first line
+
+@example
+#!/usr/bin/emacs --script
+@end example
+
+@noindent
+which will invoke Emacs with @samp{--script} and supply the name of
+the script file as @var{file}.  Emacs Lisp then treats @samp{#!}  as a
+comment delimiter.
+
+@item -q
+@opindex -q
+@itemx --no-init-file
+@opindex --no-init-file
+@cindex bypassing init and @file{default.el} file
+@cindex init file, not loading
+@cindex @file{default.el} file, not loading
+Do not load your Emacs init file @file{~/.emacs}, or @file{default.el}
+either.  Regardless of this switch, @file{site-start.el} is still loaded.
+When invoked like this, Emacs does not allow saving options
+changed with the @kbd{M-x customize} command and its variants.
+@xref{Easy Customization}.
+
+@item --no-site-file
+@opindex --no-site-file
+@cindex @file{site-start.el} file, not loading
+Do not load @file{site-start.el}.  The options @samp{-q}, @samp{-u}
+and @samp{--batch} have no effect on the loading of this file---this
+option and @samp{-Q} are the only options that block it.
+
+@item -Q
+@opindex -Q
+@itemx --quick
+@opindex --quick
+Start emacs with minimum customizations.  This is like using @samp{-q}
+and @samp{--no-site-file}, but also disables the startup screen.
+
+@item --no-splash
+@opindex --no-splash
+@vindex inhibit-splash-screen
+@cindex splash screen
+@cindex startup message
+Do not display a splash screen on startup.  You can also achieve this
+effect by setting the variable @code{inhibit-splash-screen} to
+non-@code{nil} in you personal init file (but @emph{not} in
+@file{site-start.el}).  (This variable was called
+@code{inhibit-startup-message} in previous Emacs versions.)
+
+@item --no-desktop
+@opindex --no-desktop
+Do not reload any saved desktop.  @xref{Saving Emacs Sessions}.
+
+@item -u @var{user}
+@opindex -u
+@itemx --user=@var{user}
+@opindex --user
+@cindex load init file of another user
+Load @var{user}'s Emacs init file @file{~@var{user}/.emacs} instead of
+your own@footnote{
+This option has no effect on MS-Windows.}.
+
+@item --debug-init
+@opindex --debug-init
+@cindex errors in init file
+Enable the Emacs Lisp debugger for errors in the init file.
+@xref{Error Debugging,, Entering the Debugger on an Error, elisp, The
+GNU Emacs Lisp Reference Manual}.
+
+@item --unibyte
+@opindex --unibyte
+@itemx --no-multibyte
+@opindex --no-multibyte
+@cindex unibyte operation, command-line argument
+Do almost everything with single-byte buffers and strings.
+All buffers and strings are unibyte unless you (or a Lisp program)
+explicitly ask for a multibyte buffer or string.  (Note that Emacs
+always loads Lisp files in multibyte mode, even if @samp{--unibyte} is
+specified; see @ref{Enabling Multibyte}.)  Setting the environment
+variable @env{EMACS_UNIBYTE} has the same effect
+(@pxref{General Variables}).
+
+@item --multibyte
+@opindex --multibyte
+@itemx --no-unibyte
+@opindex --no-unibyte
+Inhibit the effect of @env{EMACS_UNIBYTE}, so that Emacs
+uses multibyte characters by default, as usual.
+@end table
+
+@node Command Example
+@appendixsec Command Argument Example
+
+  Here is an example of using Emacs with arguments and options.  It
+assumes you have a Lisp program file called @file{hack-c.el} which, when
+loaded, performs some useful operation on the current buffer, expected
+to be a C program.
+
+@example
+emacs --batch foo.c -l hack-c -f save-buffer >& log
+@end example
+
+@noindent
+This says to visit @file{foo.c}, load @file{hack-c.el} (which makes
+changes in the visited file), save @file{foo.c} (note that
+@code{save-buffer} is the function that @kbd{C-x C-s} is bound to), and
+then exit back to the shell (because of @samp{--batch}).  @samp{--batch}
+also guarantees there will be no problem redirecting output to
+@file{log}, because Emacs will not assume that it has a display terminal
+to work with.
+
+@node Resume Arguments
+@appendixsec Resuming Emacs with Arguments
+
+  You can specify action arguments for Emacs when you resume it after
+a suspension.  To prepare for this, put the following code in your
+@file{.emacs} file (@pxref{Hooks}):
+
+@c `resume-suspend-hook' is correct.  It is the name of a function.
+@example
+(add-hook 'suspend-hook 'resume-suspend-hook)
+(add-hook 'suspend-resume-hook 'resume-process-args)
+@end example
+
+  As further preparation, you must execute the shell script
+@file{emacs.csh} (if you use csh as your shell) or @file{emacs.bash}
+(if you use bash as your shell).  These scripts define an alias named
+@code{edit}, which will resume Emacs giving it new command line
+arguments such as files to visit.  The scripts are found in the
+@file{etc} subdirectory of the Emacs distribution.
+
+  Only action arguments work properly when you resume Emacs.  Initial
+arguments are not recognized---it's too late to execute them anyway.
+
+  Note that resuming Emacs (with or without arguments) must be done from
+within the shell that is the parent of the Emacs job.  This is why
+@code{edit} is an alias rather than a program or a shell script.  It is
+not possible to implement a resumption command that could be run from
+other subjobs of the shell; there is no way to define a command that could
+be made the value of @env{EDITOR}, for example.  Therefore, this feature
+does not take the place of the Emacs Server feature (@pxref{Emacs
+Server}).
+
+  The aliases use the Emacs Server feature if you appear to have a
+server Emacs running.  However, they cannot determine this with complete
+accuracy.  They may think that a server is still running when in
+actuality you have killed that Emacs, because the file
+@file{/tmp/esrv@dots{}} still exists.  If this happens, find that
+file and delete it.
+
+@node Environment
+@appendixsec Environment Variables
+@cindex environment variables
+
+  The @dfn{environment} is a feature of the operating system; it
+consists of a collection of variables with names and values.  Each
+variable is called an @dfn{environment variable}; environment variable
+names are case-sensitive, and it is conventional to use upper case
+letters only.  The values are all text strings.
+
+  What makes the environment useful is that subprocesses inherit the
+environment automatically from their parent process.  This means you
+can set up an environment variable in your login shell, and all the
+programs you run (including Emacs) will automatically see it.
+Subprocesses of Emacs (such as shells, compilers, and version-control
+software) inherit the environment from Emacs, too.
+
+@findex setenv
+@findex getenv
+  Inside Emacs, the command @kbd{M-x getenv} gets the value of an
+environment variable.  @kbd{M-x setenv} sets a variable in the Emacs
+environment.  (Environment variable substitutions with @samp{$} work
+in the value just as in file names; see @ref{File Names with $}.)
+
+  The way to set environment variables outside of Emacs depends on the
+operating system, and especially the shell that you are using.  For
+example, here's how to set the environment variable @env{ORGANIZATION}
+to @samp{not very much} using Bash:
+
+@example
+export ORGANIZATION="not very much"
+@end example
+
+@noindent
+and here's how to do it in csh or tcsh:
+
+@example
+setenv ORGANIZATION "not very much"
+@end example
+
+  When Emacs is using the X Window System, various environment
+variables that control X work for Emacs as well.  See the X
+documentation for more information.
+
+@menu
+* General Variables::   Environment variables that all versions of Emacs use.
+* Misc Variables::      Certain system-specific variables.
+* MS-Windows Registry:: An alternative to the environment on MS-Windows.
+@end menu
+
+@node General Variables
+@appendixsubsec General Variables
+
+  Here is an alphabetical list of specific environment variables that
+have special meanings in Emacs, giving the name of each variable and
+its meaning.  Most of these variables are also used by some other
+programs.  Emacs does not require any of these environment variables
+to be set, but it uses their values if they are set.
+
+@table @env
+@item CDPATH
+Used by the @code{cd} command to search for the directory you specify,
+when you specify a relative directory name.
+@item EMACS_UNIBYTE
+@cindex unibyte operation, environment variable
+Defining this environment variable with a nonempty value directs Emacs
+to do almost everything with single-byte buffers and strings.  It is
+equivalent to using the @samp{--unibyte} command-line option on each
+invocation.  @xref{Initial Options}.
+@item EMACSDATA
+Directory for the architecture-independent files that come with Emacs.
+This is used to initialize the Lisp variable @code{data-directory}.
+@item EMACSDOC
+Directory for the documentation string file,
+@file{DOC-@var{emacsversion}}.  This is used to initialize the Lisp
+variable @code{doc-directory}.
+@item EMACSLOADPATH
+A colon-separated list of directories@footnote{
+Here and below, whenever we say ``colon-separated list of directories,''
+it pertains to Unix and GNU/Linux systems.  On MS-DOS and MS-Windows,
+the directories are separated by semi-colons instead, since DOS/Windows
+file names might include a colon after a drive letter.}
+to search for Emacs Lisp files---used to initialize @code{load-path}.
+@item EMACSPATH
+A colon-separated list of directories to search for executable
+files---used to initialize @code{exec-path}.
+@item EMAIL
+@vindex user-mail-address@r{, initialization}
+Your email address; used to initialize the Lisp variable
+@code{user-mail-address}, which the Emacs mail interface puts into
+the @samp{From} header of outgoing messages (@pxref{Mail Headers}).
+@item ESHELL
+Used for shell-mode to override the @env{SHELL} environment variable.
+@item HISTFILE
+The name of the file that shell commands are saved in between logins.
+This variable defaults to @file{~/.bash_history} if you use Bash, to
+@file{~/.sh_history} if you use ksh, and to @file{~/.history}
+otherwise.
+@item HOME
+The location of your files in the directory tree; used for
+expansion of file names starting with a tilde (@file{~}).  On MS-DOS,
+it defaults to the directory from which Emacs was started, with
+@samp{/bin} removed from the end if it was present.  On Windows, the
+default value of @env{HOME} is the @file{Application Data}
+subdirectory of the user profile directory (normally, this is
+@file{C:/Documents and Settings/@var{username}/Application Data},
+where @var{username} is your user name), though for backwards
+compatibility @file{C:/} will be used instead if a @file{.emacs} file
+is found there.
+@item HOSTNAME
+The name of the machine that Emacs is running on.
+@item INCPATH
+A colon-separated list of directories.  Used by the @code{complete} package
+to search for files.
+@item INFOPATH
+A colon-separated list of directories in which to search for Info files.
+@item LC_ALL
+@itemx LC_COLLATE
+@itemx LC_CTYPE
+@itemx LC_MESSAGES
+@itemx LC_MONETARY
+@itemx LC_NUMERIC
+@itemx LC_TIME
+@itemx LANG
+The user's preferred locale.  The locale has six categories, specified
+by the environment variables @env{LC_COLLATE} for sorting,
+@env{LC_CTYPE} for character encoding, @env{LC_MESSAGES} for system
+messages, @env{LC_MONETARY} for monetary formats, @env{LC_NUMERIC} for
+numbers, and @env{LC_TIME} for dates and times.  If one of these
+variables is not set, the category defaults to the value of the
+@env{LANG} environment variable, or to the default @samp{C} locale if
+@env{LANG} is not set.  But if @env{LC_ALL} is specified, it overrides
+the settings of all the other locale environment variables.
+
+On MS-Windows, if @env{LANG} is not already set in the environment
+when Emacs starts, Emacs sets it based on the system-wide default
+language, which you can set in the @samp{Regional Settings} Control Panel
+on some versions of MS-Windows.
+
+The value of the @env{LC_CTYPE} category is
+matched against entries in @code{locale-language-names},
+@code{locale-charset-language-names}, and
+@code{locale-preferred-coding-systems}, to select a default language
+environment and coding system.  @xref{Language Environments}.
+@item LOGNAME
+The user's login name.  See also @env{USER}.
+@item MAIL
+The name of your system mail inbox.
+@item MH
+Name of setup file for the mh system.  (The default is @file{~/.mh_profile}.)
+@item NAME
+Your real-world name.
+@item NNTPSERVER
+The name of the news server.  Used by the mh and Gnus packages.
+@item ORGANIZATION
+The name of the organization to which you belong.  Used for setting the
+`Organization:' header in your posts from the Gnus package.
+@item PATH
+A colon-separated list of directories in which executables reside.  This
+is used to initialize the Emacs Lisp variable @code{exec-path}.
+@item PWD
+If set, this should be the default directory when Emacs was started.
+@item REPLYTO
+If set, this specifies an initial value for the variable
+@code{mail-default-reply-to}.  @xref{Mail Headers}.
+@item SAVEDIR
+The name of a directory in which news articles are saved by default.
+Used by the Gnus package.
+@item SHELL
+The name of an interpreter used to parse and execute programs run from
+inside Emacs.
+@item SMTPSERVER
+The name of the outgoing mail server.  Used by the SMTP library
+(@pxref{Top,,,smtpmail,Sending mail via SMTP}).
+@cindex background mode, on @command{xterm}
+@item TERM
+The type of the terminal that Emacs is using.  This variable must be
+set unless Emacs is run in batch mode.  On MS-DOS, it defaults to
+@samp{internal}, which specifies a built-in terminal emulation that
+handles the machine's own display.  If the value of @env{TERM} indicates
+that Emacs runs in non-windowed mode from @command{xterm} or a similar
+terminal emulator, the background mode defaults to @samp{light}, and
+Emacs will choose colors that are appropriate for a light background.
+@item TERMCAP
+The name of the termcap library file describing how to program the
+terminal specified by the @env{TERM} variable.  This defaults to
+@file{/etc/termcap}.
+@item TMPDIR
+Used by the Emerge package as a prefix for temporary files.
+@item TZ
+This specifies the current time zone and possibly also daylight
+saving time information.  On MS-DOS, if @env{TZ} is not set in the
+environment when Emacs starts, Emacs defines a default value as
+appropriate for the country code returned by DOS.  On MS-Windows, Emacs
+does not use @env{TZ} at all.
+@item USER
+The user's login name.  See also @env{LOGNAME}.  On MS-DOS, this
+defaults to @samp{root}.
+@item VERSION_CONTROL
+Used to initialize the @code{version-control} variable (@pxref{Numbered Backups}).
+@end table
+
+@node Misc Variables
+@appendixsubsec Miscellaneous Variables
+
+These variables are used only on particular configurations:
+
+@table @env
+@item COMSPEC
+On MS-DOS and MS-Windows, the name of the command interpreter to use
+when invoking batch files and commands internal to the shell.  On MS-DOS
+this is also used to make a default value for the @env{SHELL} environment
+variable.
+
+@item NAME
+On MS-DOS, this variable defaults to the value of the @env{USER}
+variable.
+
+@item TEMP
+@itemx TMP
+On MS-DOS and MS-Windows, these specify the name of the directory for
+storing temporary files in.
+
+@item EMACSTEST
+On MS-DOS, this specifies a file to use to log the operation of the
+internal terminal emulator.  This feature is useful for submitting bug
+reports.
+
+@item EMACSCOLORS
+On MS-DOS, this specifies the screen colors.  It is useful to set them
+this way, since otherwise Emacs would display the default colors
+momentarily when it starts up.
+
+The value of this variable should be the two-character encoding of the
+foreground (the first character) and the background (the second
+character) colors of the default face.  Each character should be the
+hexadecimal code for the desired color on a standard PC text-mode
+display.  For example, to get blue text on a light gray background,
+specify @samp{EMACSCOLORS=17}, since 1 is the code of the blue color and
+7 is the code of the light gray color.
+
+The PC display usually supports only eight background colors.  However,
+Emacs switches the DOS display to a mode where all 16 colors can be used
+for the background, so all four bits of the background color are
+actually used.
+
+@item WINDOW_GFX
+Used when initializing the Sun windows system.
+
+@item PRELOAD_WINSOCK
+On MS-Windows, if you set this variable, Emacs will load and initialize
+the network library at startup, instead of waiting until the first
+time it is required.
+
+@item emacs_dir
+On MS-Windows, @env{emacs_dir} is a special environment variable, which
+indicates the full path of the directory in which Emacs is installed.
+If Emacs is installed in the standard directory structure, it
+calculates this value automatically.  It is not much use setting this
+variable yourself unless your installation is non-standard, since
+unlike other environment variables, it will be overridden by Emacs at
+startup.  When setting other environment variables, such as
+@env{EMACSLOADPATH}, you may find it useful to use @env{emacs_dir}
+rather than hard-coding an absolute path.  This allows multiple
+versions of Emacs to share the same environment variable settings, and
+it allows you to move the Emacs installation directory, without
+changing any environment or registry settings.
+@end table
+
+@node MS-Windows Registry
+@appendixsubsec The MS-Windows System Registry
+@pindex addpm, MS-Windows installation program
+@cindex registry, setting environment variables and resources on MS-Windows
+
+Under MS-Windows, the installation program @command{addpm.exe} adds
+values for @env{emacs_dir}, @env{EMACSLOADPATH}, @env{EMACSDATA},
+@env{EMACSPATH}, @env{EMACSDOC}, @env{SHELL} and @env{TERM} to the
+@file{HKEY_LOCAL_MACHINE} section of the system registry, under
+@file{/Software/GNU/Emacs}.  It does this because there is no standard
+place to set environment variables across different versions of
+Windows.  Running @command{addpm.exe} is no longer strictly necessary
+in recent versions of Emacs, but if you are upgrading from an older
+version, running @command{addpm.exe} ensures that you do not have
+older registry entries from a previous installation, which may not be
+compatible with the latest version of Emacs.
+
+When Emacs starts, as well as checking the environment, it also checks
+the System Registry for those variables and for @env{HOME}, @env{LANG}
+and @env{PRELOAD_WINSOCK}.
+
+To determine the value of those variables, Emacs goes through the
+following procedure.  First, the environment is checked.  If the
+variable is not found there, Emacs looks for registry keys by that
+name under @file{/Software/GNU/Emacs}; first in the
+@file{HKEY_CURRENT_USER} section of the registry, and if not found
+there, in the @file{HKEY_LOCAL_MACHINE} section.  Finally, if Emacs
+still cannot determine the values, compiled-in defaults are used.
+
+In addition to the environment variables above, you can also add many
+of the settings which on X belong in the @file{.Xdefaults} file
+(@pxref{X Resources}) to the @file{/Software/GNU/Emacs} registry key.
+Settings you add to the @file{HKEY_LOCAL_MACHINE} section will affect
+all users of the machine.  Settings you add to the
+@file{HKEY_CURRENT_USER} section will only affect you, and will
+override machine wide settings.
+
+@node Display X
+@appendixsec Specifying the Display Name
+@cindex display name (X Window System)
+@cindex @env{DISPLAY} environment variable
+
+  The environment variable @env{DISPLAY} tells all X clients, including
+Emacs, where to display their windows.  Its value is set by default
+in ordinary circumstances, when you start an X server and run jobs
+locally.  Occasionally you may need to specify the display yourself; for
+example, if you do a remote login and want to run a client program
+remotely, displaying on your local screen.
+
+  With Emacs, the main reason people change the default display is to
+let them log into another system, run Emacs on that system, but have the
+window displayed at their local terminal.  You might need to log in
+to another system because the files you want to edit are there, or
+because the Emacs executable file you want to run is there.
+
+  The syntax of the @env{DISPLAY} environment variable is
+@samp{@var{host}:@var{display}.@var{screen}}, where @var{host} is the
+host name of the X Window System server machine, @var{display} is an
+arbitrarily-assigned number that distinguishes your server (X terminal)
+from other servers on the same machine, and @var{screen} is a
+rarely-used field that allows an X server to control multiple terminal
+screens.  The period and the @var{screen} field are optional.  If
+included, @var{screen} is usually zero.
+
+  For example, if your host is named @samp{glasperle} and your server is
+the first (or perhaps the only) server listed in the configuration, your
+@env{DISPLAY} is @samp{glasperle:0.0}.
+
+  You can specify the display name explicitly when you run Emacs, either
+by changing the @env{DISPLAY} variable, or with the option @samp{-d
+@var{display}} or @samp{--display=@var{display}}.  Here is an example:
+
+@smallexample
+emacs --display=glasperle:0 &
+@end smallexample
+
+  You can inhibit the direct use of the window system and GUI with the
+@samp{-nw} option.  It tells Emacs to display using ordinary @acronym{ASCII} on
+its controlling terminal.  This is also an initial option.
+
+  Sometimes, security arrangements prevent a program on a remote system
+from displaying on your local system.  In this case, trying to run Emacs
+produces messages like this:
+
+@smallexample
+Xlib:  connection to "glasperle:0.0" refused by server
+@end smallexample
+
+@noindent
+You might be able to overcome this problem by using the @command{xhost}
+command on the local system to give permission for access from your
+remote machine.
+
+@node Font X
+@appendixsec Font Specification Options
+@cindex font name (X Window System)
+
+  By default, Emacs displays text in a twelve point Courier font (when
+using X).  You can specify a different font on your command line
+through the option @samp{-fn @var{name}} (or @samp{--font}, which is
+an alias for @samp{-fn}).
+
+@table @samp
+@item -fn @var{name}
+@opindex -fn
+@itemx --font=@var{name}
+@opindex --font
+@cindex specify default font from the command line
+Use font @var{name} as the default font.
+@end table
+
+  Under X, each font has a long name which consists of fourteen words
+or numbers, separated by dashes.  Some fonts also have shorter
+nicknames.  For instance, @samp{9x15} is such a nickname.  This font
+makes each character nine pixels wide and fifteen pixels high.  You
+can use either kind of name.  Case is insignificant in both kinds.
+You can use wildcard patterns for the font name; then Emacs lets X
+choose one of the fonts that match the pattern.  The wildcard
+character @samp{*} matches any sequence of characters (including none)
+and @samp{?} matches any single character.  However, matching is
+implementation-dependent, and can be inaccurate when wildcards match
+dashes in a long name.  For reliable results, supply all 14 dashes and
+use wildcards only within a field.  Here is an example, which happens
+to specify the font whose nickname is @samp{6x13}:
+
+@smallexample
+emacs -fn \
+  "-misc-fixed-medium-r-semicondensed--13-*-*-*-c-60-iso8859-1" &
+@end smallexample
+
+@noindent
+You can also specify the font in your @file{.Xdefaults} file:
+
+@smallexample
+emacs.font: -misc-fixed-medium-r-semicondensed--13-*-*-*-c-60-iso8859-1
+@end smallexample
+
+  Note that if you use a wildcard pattern on the command line, you
+need to enclose it in single or double quotes, to prevent the shell
+from accidentally expanding it into a list of file names.  On the
+other hand, you should not quote the name in the @file{.Xdefaults}
+file.
+
+The default font used by Emacs (under X) is:
+
+@smallexample
+-adobe-courier-medium-r-*-*-*-120-*-*-*-*-iso8859-1
+@end smallexample
+
+  A long font name has the following form:
+
+@smallexample
+-@var{maker}-@var{family}-@var{weight}-@var{slant}-@var{widthtype}-@var{style}@dots{}
+@dots{}-@var{pixels}-@var{height}-@var{horiz}-@var{vert}-@var{spacing}-@var{width}-@var{registry}-@var{encoding}
+@end smallexample
+
+@table @var
+@item maker
+This is the name of the font manufacturer.
+@item family
+This is the name of the font family---for example, @samp{courier}.
+@item weight
+This is normally @samp{bold}, @samp{medium} or @samp{light}.  Other
+words may appear here in some font names.
+@item slant
+This is @samp{r} (roman), @samp{i} (italic), @samp{o} (oblique),
+@samp{ri} (reverse italic), or @samp{ot} (other).
+@item widthtype
+This is normally @samp{condensed}, @samp{extended}, @samp{semicondensed}
+or @samp{normal}.  Other words may appear here in some font names.
+@item style
+This is an optional additional style name.  Usually it is empty---most
+long font names have two hyphens in a row at this point.
+@item pixels
+This is the font height, in pixels.
+@item height
+This is the font height on the screen, measured in tenths of a printer's
+point---approximately 1/720 of an inch.  In other words, it is the point
+size of the font, times ten.  For a given vertical resolution,
+@var{height} and @var{pixels} are proportional; therefore, it is common
+to specify just one of them and use @samp{*} for the other.
+@item horiz
+This is the horizontal resolution, in pixels per inch, of the screen for
+which the font is intended.
+@item vert
+This is the vertical resolution, in pixels per inch, of the screen for
+which the font is intended.  Normally the resolution of the fonts on
+your system is the right value for your screen; therefore, you normally
+specify @samp{*} for this and @var{horiz}.
+@item spacing
+This is @samp{m} (monospace), @samp{p} (proportional) or @samp{c}
+(character cell).
+@item width
+This is the average character width, in pixels, multiplied by ten.
+@item registry
+@itemx encoding
+These together make up the X font character set that the font depicts.
+(X font character sets are not the same as Emacs charsets, but they
+are solutions for the same problem.)  You can use the
+@command{xfontsel} program to check which choices you have.  However,
+normally you should use @samp{iso8859} for @var{registry} and @samp{1}
+for @var{encoding}.
+@end table
+
+@cindex listing system fonts
+  You will probably want to use a fixed-width default font---that is,
+a font in which all characters have the same width.  Any font with
+@samp{m} or @samp{c} in the @var{spacing} field of the long name is a
+fixed-width font.  Here's how to use the @command{xlsfonts} program to
+list all the fixed-width fonts available on your system:
+
+@example
+xlsfonts -fn '*x*' | egrep "^[0-9]+x[0-9]+"
+xlsfonts -fn '*-*-*-*-*-*-*-*-*-*-*-m*'
+xlsfonts -fn '*-*-*-*-*-*-*-*-*-*-*-c*'
+@end example
+
+@noindent
+To see what a particular font looks like, use the @command{xfd} command.
+For example:
+
+@example
+xfd -fn 6x13
+@end example
+
+@noindent
+displays the entire font @samp{6x13}.
+
+  While running Emacs, you can set the font of the current frame
+(@pxref{Frame Parameters}) or for a specific kind of text
+(@pxref{Faces}).
+
+@node Colors
+@appendixsec Window Color Options
+@cindex color of window, from command line
+@cindex text colors, from command line
+
+@findex list-colors-display
+@cindex available colors
+  On a color display, you can specify which color to use for various
+parts of the Emacs display.  To find out what colors are available on
+your system, type @kbd{M-x list-colors-display}, or press
+@kbd{C-Mouse-2} and select @samp{Display Colors} from the pop-up menu.
+(A particular window system might support many more colors, but the
+list displayed by @code{list-colors-display} shows their portable
+subset that can be safely used on any display supported by Emacs.)
+If you do not specify colors, on windowed displays the default for the
+background is white and the default for all other colors is black.  On a
+monochrome display, the foreground is black, the background is white,
+and the border is gray if the display supports that.  On terminals, the
+background is usually black and the foreground is white.
+
+  Here is a list of the command-line options for specifying colors:
+
+@table @samp
+@item -fg @var{color}
+@opindex -fg
+@itemx --foreground-color=@var{color}
+@opindex --foreground-color
+@cindex foreground color, command-line argument
+Specify the foreground color.  @var{color} should be a standard color
+name, or a numeric specification of the color's red, green, and blue
+components as in @samp{#4682B4} or @samp{RGB:46/82/B4}.
+@item -bg @var{color}
+@opindex -bg
+@itemx --background-color=@var{color}
+@opindex --background-color
+@cindex background color, command-line argument
+Specify the background color.
+@item -bd @var{color}
+@opindex -bd
+@itemx --border-color=@var{color}
+@opindex --border-color
+@cindex border color, command-line argument
+Specify the color of the border of the X window.
+@item -cr @var{color}
+@opindex -cr
+@itemx --cursor-color=@var{color}
+@opindex --cursor-color
+@cindex cursor color, command-line argument
+Specify the color of the Emacs cursor which indicates where point is.
+@item -ms @var{color}
+@opindex -ms
+@itemx --mouse-color=@var{color}
+@opindex --mouse-color
+@cindex mouse pointer color, command-line argument
+Specify the color for the mouse cursor when the mouse is in the Emacs window.
+@item -r
+@opindex -r
+@itemx -rv
+@opindex -rv
+@itemx --reverse-video
+@opindex --reverse-video
+@cindex reverse video, command-line argument
+Reverse video---swap the foreground and background colors.
+@item --color=@var{mode}
+@opindex --color
+@cindex standard colors on a character terminal
+@cindex override character terminal color support
+For a character terminal only, specify the mode of color support.
+This option is intended for overriding the number of supported colors
+that the character terminal advertises in its @code{termcap} or
+@code{terminfo} database.  The parameter @var{mode} can be one of the
+following:
+@table @samp
+@item never
+@itemx no
+Don't use colors even if the terminal's capabilities specify color
+support.
+@item default
+@itemx auto
+Same as when @option{--color} is not used at all: Emacs detects at
+startup whether the terminal supports colors, and if it does, turns on
+colored display.
+@item always
+@itemx yes
+@itemx ansi8
+Turn on the color support unconditionally, and use color commands
+specified by the ANSI escape sequences for the 8 standard colors.
+@item @var{num}
+Use color mode for @var{num} colors.  If @var{num} is -1, turn off
+color support (equivalent to @samp{never}); if it is 0, use the
+default color support for this terminal (equivalent to @samp{auto});
+otherwise use an appropriate standard mode for @var{num} colors.
+Depending on your terminal's capabilities, Emacs might be able to turn
+on a color mode for 8, 16, 88, or 256 as the value of @var{num}.  If
+there is no mode that supports @var{num} colors, Emacs acts as if
+@var{num} were 0, i.e.@: it uses the terminal's default color support
+mode.
+@end table
+If @var{mode} is omitted, it defaults to @var{ansi8}.
+@end table
+
+  For example, to use a coral mouse cursor and a slate blue text cursor,
+enter:
+
+@example
+emacs -ms coral -cr 'slate blue' &
+@end example
+
+  You can reverse the foreground and background colors through the
+@samp{-rv} option or with the X resource @samp{reverseVideo}.
+
+  The @samp{-fg}, @samp{-bg}, and @samp{-rv} options function on
+text-only terminals as well as on graphical displays.
+
+@node Window Size X
+@appendixsec Options for Window Size and Position
+@cindex geometry of Emacs window
+@cindex position and size of Emacs frame
+@cindex width and height of Emacs frame
+@cindex specifying fullscreen for Emacs frame
+
+  Here is a list of the command-line options for specifying size and
+position of the initial Emacs frame:
+
+@table @samp
+@item -g @var{width}x@var{height}@r{[@{}+-@r{@}}@var{xoffset}@r{@{}+-@r{@}}@var{yoffset}@r{]]}
+@opindex -g
+@itemx --geometry=@var{width}x@var{height}@r{[@{}+-@r{@}}@var{xoffset}@r{@{}+-@r{@}}@var{yoffset}@r{]]}
+@opindex --geometry
+@cindex geometry, command-line argument
+Specify the size @var{width} and @var{height} (measured in character
+columns and lines), and positions @var{xoffset} and @var{yoffset}
+(measured in pixels).  The @var{width} and @var{height} parameters
+apply to all frames, whereas @var{xoffset} and @var{yoffset} only to
+the initial frame.
+
+@item -fs
+@opindex -fs
+@itemx --fullscreen
+@opindex --fullscreen
+@cindex fullscreen, command-line argument
+Specify that width and height shall be the size of the screen.
+
+@item -fh
+@opindex -fh
+@itemx --fullheight
+@opindex --fullheight
+@cindex fullheight, command-line argument
+Specify that the height shall be the height of the screen.
+
+@item -fw
+@opindex -fw
+@itemx --fullwidth
+@opindex --fullwidth
+@cindex fullwidth, command-line argument
+Specify that the width shall be the width of the screen.
+@end table
+
+
+@noindent
+In the @samp{--geometry} option, @code{@r{@{}+-@r{@}}} means either a plus
+ sign or a minus sign.  A plus
+sign before @var{xoffset} means it is the distance from the left side of
+the screen; a minus sign means it counts from the right side.  A plus
+sign before @var{yoffset} means it is the distance from the top of the
+screen, and a minus sign there indicates the distance from the bottom.
+The values @var{xoffset} and @var{yoffset} may themselves be positive or
+negative, but that doesn't change their meaning, only their direction.
+
+  Emacs uses the same units as @command{xterm} does to interpret the geometry.
+The @var{width} and @var{height} are measured in characters, so a large font
+creates a larger frame than a small font.  (If you specify a proportional
+font, Emacs uses its maximum bounds width as the width unit.)  The
+@var{xoffset} and @var{yoffset} are measured in pixels.
+
+  You do not have to specify all of the fields in the geometry
+specification.  If you omit both @var{xoffset} and @var{yoffset}, the
+window manager decides where to put the Emacs frame, possibly by
+letting you place it with the mouse.  For example, @samp{164x55}
+specifies a window 164 columns wide, enough for two ordinary width
+windows side by side, and 55 lines tall.
+
+  The default width for Emacs is 80 characters and the default height is
+40 lines.  You can omit either the width or the height or both.  If
+you start the geometry with an integer, Emacs interprets it as the
+width.  If you start with an @samp{x} followed by an integer, Emacs
+interprets it as the height.  Thus, @samp{81} specifies just the width;
+@samp{x45} specifies just the height.
+
+  If you start with @samp{+} or @samp{-}, that introduces an offset,
+which means both sizes are omitted.  Thus, @samp{-3} specifies the
+@var{xoffset} only.  (If you give just one offset, it is always
+@var{xoffset}.)  @samp{+3-3} specifies both the @var{xoffset} and the
+@var{yoffset}, placing the frame near the bottom left of the screen.
+
+  You can specify a default for any or all of the fields in
+@file{.Xdefaults} file, and then override selected fields with a
+@samp{--geometry} option.
+
+  Since the mode line and the echo area occupy the last 2 lines of the
+frame, the height of the initial text window is 2 less than the height
+specified in your geometry.  In non-X-toolkit versions of Emacs, the
+menu bar also takes one line of the specified number.  But in the X
+toolkit version, the menu bar is additional and does not count against
+the specified height.  The tool bar, if present, is also additional.
+
+  Enabling or disabling the menu bar or tool bar alters the amount of
+space available for ordinary text.  Therefore, if Emacs starts up with
+a tool bar (which is the default), and handles the geometry
+specification assuming there is a tool bar, and then your
+@file{~/.emacs} file disables the tool bar, you will end up with a
+frame geometry different from what you asked for.  To get the intended
+size with no tool bar, use an X resource to specify ``no tool bar''
+(@pxref{Table of Resources}); then Emacs will already know there's no
+tool bar when it processes the specified geometry.
+
+  When using one of @samp{--fullscreen}, @samp{--fullwidth} or
+@samp{--fullheight} there may be some space around the frame
+anyway.  That is because Emacs rounds the sizes so they are an
+even number of character heights and widths.
+
+ Some window managers have options that can make them ignore both
+program-specified and user-specified positions (sawfish is one).
+If these are set, Emacs fails to position the window correctly.
+
+@node Borders X
+@appendixsec Internal and External Borders
+@cindex borders (X Window System)
+
+  An Emacs frame has an internal border and an external border.  The
+internal border is an extra strip of the background color around the
+text portion of the frame.  Emacs itself draws the internal border.
+The external border is added by the window manager outside the frame;
+depending on the window manager you use, it may contain various boxes
+you can click on to move or iconify the window.
+
+@table @samp
+@item -ib @var{width}
+@opindex -ib
+@itemx --internal-border=@var{width}
+@opindex --internal-border
+@cindex internal border width, command-line argument
+Specify @var{width} as the width of the internal border (between the text
+and the main border), in pixels.
+
+@item -bw @var{width}
+@opindex -bw
+@itemx --border-width=@var{width}
+@opindex --border-width
+@cindex main border width, command-line argument
+Specify @var{width} as the width of the main border, in pixels.
+@end table
+
+  When you specify the size of the frame, that does not count the
+borders.  The frame's position is measured from the outside edge of the
+external border.
+
+  Use the @samp{-ib @var{n}} option to specify an internal border
+@var{n} pixels wide.  The default is 1.  Use @samp{-bw @var{n}} to
+specify the width of the external border (though the window manager may
+not pay attention to what you specify).  The default width of the
+external border is 2.
+
+@node Title X
+@appendixsec Frame Titles
+
+  An Emacs frame may or may not have a specified title.  The frame
+title, if specified, appears in window decorations and icons as the
+name of the frame.  If an Emacs frame has no specified title, the
+default title has the form @samp{@var{invocation-name}@@@var{machine}}
+(if there is only one frame) or the selected window's buffer name (if
+there is more than one frame).
+
+  You can specify a title for the initial Emacs frame with a command
+line option:
+
+@table @samp
+@item -T @var{title}
+@opindex -T
+@itemx --title=@var{title}
+@opindex --title
+@cindex frame title, command-line argument
+Specify @var{title} as the title for the initial Emacs frame.
+@end table
+
+  The @samp{--name} option (@pxref{Resources}) also specifies the title
+for the initial Emacs frame.
+
+@node Icons X
+@appendixsec Icons
+@cindex icons (X Window System)
+
+  Most window managers allow you to ``iconify'' a frame, removing
+it from sight, and leaving a small, distinctive ``icon'' window in its
+place.  Clicking on the icon window makes the frame itself appear again.
+If you have many clients running at once, you can avoid cluttering up
+the screen by iconifying most of the clients.
+
+@table @samp
+@item -nbi
+@opindex -nbi
+@itemx --no-bitmap-icon
+@opindex --no-bitmap-icon
+@cindex Emacs icon, a gnu
+Do not use a picture of a gnu as the Emacs icon.
+
+@item -iconic
+@opindex --iconic
+@itemx --iconic
+@cindex start iconified, command-line argument
+Start Emacs in iconified state.
+@end table
+
+  By default Emacs uses an icon window containing a picture of the GNU gnu.
+The @samp{-nbi} or @samp{--no-bitmap-icon} option tells Emacs to let the
+window manager choose what sort of icon to use---usually just a small
+rectangle containing the frame's title.
+
+  The @samp{-iconic} option tells Emacs to begin running as an icon,
+rather than showing a frame right away.  In this situation, the icon
+is the only indication that Emacs has started; the text frame doesn't
+appear until you deiconify it.
+
+@node Misc X
+@appendixsec Other Display Options
+
+@table @samp
+@item -hb
+@opindex -hb
+@itemx --horizontal-scroll-bars
+@opindex --horizontal-scroll-bars
+@c @cindex horizontal scroll bars, command-line argument
+Enable horizontal scroll bars.  Since horizontal scroll bars
+are not yet implemented, this actually does nothing.
+
+@item -vb
+@opindex -vb
+@itemx --vertical-scroll-bars
+@opindex --vertical-scroll-bars
+@cindex vertical scroll bars, command-line argument
+Enable vertical scroll bars.
+
+@item -lsp @var{pixels}
+@opindex -lsp
+@itemx --line-spacing=@var{pixels}
+@opindex --line-spacing
+@cindex line spacing, command-line argument
+Specify @var{pixels} as additional space to put between lines, in pixels.
+
+@item -nbc
+@opindex -nbc
+@itemx --no-blinking-cursor
+@opindex --no-blinking-cursor
+@cindex blinking cursor disable, command-line argument
+Disable the blinking cursor on graphical displays.
+
+@item -D
+@opindex -D
+@itemx --basic-display
+@opindex --basic-display
+Disable the menu-bar, the tool-bar, the scroll-bars, and tool tips,
+and turn off the blinking cursor.  This can be useful for making a
+test case that simplifies debugging of display problems.
+@end table
+
+  The @samp{--xrm} option (@pxref{Resources}) specifies additional
+X resource values.
+
+@ignore
+   arch-tag: fffecd9e-7329-4a51-a3cc-dd4a9889340e
+@end ignore
similarity index 100%
rename from man/commands.texi
rename to doc/emacs/commands.texi
diff --git a/doc/emacs/custom.texi b/doc/emacs/custom.texi
new file mode 100644 (file)
index 0000000..1276c45
--- /dev/null
@@ -0,0 +1,2516 @@
+@c This is part of the Emacs manual.
+@c Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995, 1997, 2000, 2001,
+@c   2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+@c See file emacs.texi for copying conditions.
+@node Customization, Quitting, Amusements, Top
+@chapter Customization
+@cindex customization
+
+  This chapter talks about various topics relevant to adapting the
+behavior of Emacs in ways we have anticipated.
+@iftex
+See @cite{The Emacs Lisp Reference Manual}
+@end iftex
+@ifnottex
+@xref{Top, Emacs Lisp, Emacs Lisp, elisp, The Emacs Lisp
+Reference Manual},
+@end ifnottex
+for how to make more far-reaching and open-ended changes.  @xref{X
+Resources}, for information on using X resources to customize Emacs.
+
+  Customization that you do within Emacs normally affects only the
+particular Emacs session that you do it in---it does not persist
+between sessions unless you save the customization in a file such as
+your init file (@file{.emacs}) that will affect future sessions.
+(@xref{Init File}.)  When you tell the customization buffer to save
+customizations for future sessions, this actually works by editing
+@file{.emacs} for you.
+
+  Another means of customization is the keyboard macro, which is a
+sequence of keystrokes to be replayed with a single command.
+@xref{Keyboard Macros}, for full instruction how to record, manage, and
+replay sequences of keys.
+
+@menu
+* Minor Modes::                Each minor mode is one feature you can turn on
+                         independently of any others.
+* Easy Customization::  Convenient way to browse and change settings.
+* Variables::          Many Emacs commands examine Emacs variables
+                         to decide what to do; by setting variables,
+                         you can control their functioning.
+* Key Bindings::       The keymaps say what command each key runs.
+                         By changing them, you can "redefine keys".
+* Syntax::             The syntax table controls how words and
+                         expressions are parsed.
+* Init File::          How to write common customizations in the
+                         @file{.emacs} file.
+@end menu
+
+@node Minor Modes
+@section Minor Modes
+@cindex minor modes
+@cindex mode, minor
+
+  Minor modes are optional features which you can turn on or off.  For
+example, Auto Fill mode is a minor mode in which @key{SPC} breaks lines
+between words as you type.  All the minor modes are independent of each
+other and of the selected major mode.  Most minor modes say in the mode
+line when they are enabled; for example, @samp{Fill} in the mode line means
+that Auto Fill mode is enabled.
+
+  You should append @code{-mode} to the name of a minor mode to
+produce the name of the command that turns the mode on or off.  Thus,
+the command to enable or disable Auto Fill mode is called
+@code{auto-fill-mode}.  These commands are usually invoked with
+@kbd{M-x}, but you can bind keys to them if you wish.
+
+  With no argument, the minor mode function turns the mode on if it
+was off, and off if it was on.  This is known as @dfn{toggling}.  A
+positive argument always turns the mode on, and an explicit zero
+argument or a negative argument always turns it off.
+
+  Some minor modes are global: while enabled, they affect everything
+you do in the Emacs session, in all buffers.  Other minor modes are
+buffer-local; they apply only to the current buffer, so you can enable
+the mode in certain buffers and not others.
+
+  For most minor modes, the command name is also the name of a
+variable.  The variable's value is non-@code{nil} if the mode is
+enabled and @code{nil} if it is disabled.  Some minor-mode commands
+work by just setting the variable.  For example, the command
+@code{abbrev-mode} works by setting the value of @code{abbrev-mode} as
+a variable; it is this variable that directly turns Abbrev mode on and
+off.  You can directly set the variable's value instead of calling the
+mode function.  For other minor modes, you need to either set the
+variable through the Customize interface or call the mode function to
+correctly enable or disable the mode.  To check which of these two
+possibilities applies to a given minor mode, use @kbd{C-h v} to ask
+for documentation on the variable name.
+
+  For minor mode commands that work by just setting the minor mode
+variable, that variable provides a good way for Lisp programs to turn
+minor modes on and off; it is also useful in a file's local variables
+list (@pxref{File Variables}).  But please think twice before setting
+minor modes with a local variables list, because most minor modes are
+a matter of user preference---other users editing the same file might
+not want the same minor modes you prefer.
+
+  The most useful buffer-local minor modes include Abbrev mode, Auto
+Fill mode, Auto Save mode, Font-Lock mode, Glasses mode, Outline minor
+mode, Overwrite mode, and Binary Overwrite mode.
+
+  Abbrev mode allows you to define abbreviations that automatically expand
+as you type them.  For example, @samp{amd} might expand to @samp{abbrev
+mode}.  @xref{Abbrevs}, for full information.
+
+  Auto Fill mode allows you to enter filled text without breaking lines
+explicitly.  Emacs inserts newlines as necessary to prevent lines from
+becoming too long.  @xref{Filling}.
+
+  Auto Save mode saves the buffer contents periodically to reduce the
+amount of work you can lose in case of a crash.  @xref{Auto Save}.
+
+  Enriched mode enables editing and saving of formatted text.
+@xref{Formatted Text}.
+
+  Flyspell mode automatically highlights misspelled words.
+@xref{Spelling}.
+
+  Font-Lock mode automatically highlights certain textual units found
+in programs, such as comments, strings, and function names being
+defined.  This requires a display that can show multiple fonts or
+colors.  @xref{Faces}.
+
+@ignore
+  ISO Accents mode makes the characters @samp{`}, @samp{'}, @samp{"},
+@samp{^}, @samp{/} and @samp{~} combine with the following letter, to
+produce an accented letter in the ISO Latin-1 character set.  The
+newer and more general feature of input methods more or less
+supersedes ISO Accents mode.  @xref{Unibyte Mode}.
+@end ignore
+
+  Outline minor mode provides the same facilities as the major mode
+called Outline mode; but since it is a minor mode instead, you can
+combine it with any major mode.  @xref{Outline Mode}.
+
+@cindex Overwrite mode
+@cindex mode, Overwrite
+  Overwrite mode causes ordinary printing characters to replace existing
+text instead of shoving it to the right.  For example, if point is in
+front of the @samp{B} in @samp{FOOBAR}, then in Overwrite mode typing a
+@kbd{G} changes it to @samp{FOOGAR}, instead of producing @samp{FOOGBAR}
+as usual.  In Overwrite mode, the command @kbd{C-q} inserts the next
+character whatever it may be, even if it is a digit---this gives you a
+way to insert a character instead of replacing an existing character.
+
+@findex overwrite-mode
+@kindex INSERT
+  The command @code{overwrite-mode} is an exception to the rule that
+commands which toggle minor modes are normally not bound to keys: it is
+bound to the @key{INSERT} function key.  This is because many other
+programs bind @key{INSERT} to similar functions.
+
+@findex binary-overwrite-mode
+  Binary Overwrite mode is a variant of Overwrite mode for editing
+binary files; it treats newlines and tabs like other characters, so that
+they overwrite other characters and can be overwritten by them.
+In Binary Overwrite mode, digits after @kbd{C-q} specify an
+octal character code, as usual.
+
+  Here are some useful minor modes that normally apply to all buffers
+at once.  Since Line Number mode and Transient Mark mode can be
+enabled or disabled just by setting the value of the minor mode
+variable, you @emph{can} set them differently for particular buffers,
+by explicitly making the corresponding variable local in those
+buffers.  @xref{Locals}.
+
+  Icomplete mode displays an indication of available completions when
+you are in the minibuffer and completion is active.  @xref{Completion
+Options}.
+
+  Line Number mode enables continuous display in the mode line of the
+line number of point, and Column Number mode enables display of the
+column number.  @xref{Mode Line}.
+
+  Scroll Bar mode gives each window a scroll bar (@pxref{Scroll Bars}).
+Menu Bar mode gives each frame a menu bar (@pxref{Menu Bars}).  Both of
+these modes are enabled by default when you use the X Window System.
+
+  In Transient Mark mode, every change in the buffer contents
+``deactivates'' the mark, so that commands that operate on the region
+will get an error.  This means you must either set the mark, or
+explicitly ``reactivate'' it, before each command that uses the region.
+The advantage of Transient Mark mode is that Emacs can display the
+region highlighted.  @xref{Mark}.
+
+@node Easy Customization
+@section Easy Customization Interface
+
+@cindex settings
+  Emacs has many @dfn{settings} which have values that you can specify
+in order to customize various commands.  Many are documented in this
+manual.  Most settings are @dfn{user options}---that is to say, Lisp
+variables (@pxref{Variables})---so their names appear in the Variable
+Index (@pxref{Variable Index}).  The other settings are faces and
+their attributes (@pxref{Faces}).
+
+@findex customize
+@cindex customization buffer
+  You can browse interactively through settings and change them using
+@kbd{M-x customize}.  This command creates a @dfn{customization
+buffer}, which offers commands to navigate through a logically
+organized structure of the Emacs settings; you can also use it to edit
+and set their values, and to save settings permanently in your
+@file{~/.emacs} file (@pxref{Init File}).
+
+  The appearance of the example buffers in this section is typically
+different under a graphical display, since faces are then used to indicate
+buttons, links and editable fields.
+
+@menu
+* Groups: Customization Groups.   How settings are classified in a structure.
+* Browsing: Browsing Custom.   Browsing and searching for settings.
+* Changing a Variable::      How to edit an option's value and set the option.
+* Saving Customizations::    Specifying the file for saving customizations.
+* Face Customization::       How to edit the attributes of a face.
+* Specific Customization::   Making a customization buffer for specific
+                                variables, faces, or groups.
+* Custom Themes::            How to define collections of customized options
+                                that can be loaded and unloaded together.
+@end menu
+
+@node Customization Groups
+@subsection Customization Groups
+@cindex customization groups
+
+  For customization purposes, settings are organized into @dfn{groups}
+to help you find them.  Groups are collected into bigger groups, all
+the way up to a master group called @code{Emacs}.
+
+  @kbd{M-x customize} creates a customization buffer that shows the
+top-level @code{Emacs} group and the second-level groups immediately
+under it.  It looks like this, in part:
+
+@c we want the buffer example to all be on one page, but unfortunately
+@c that's quite a bit of text, so force all space to the bottom.
+@page
+@smallexample
+@group
+/- Emacs group: ---------------------------------------------------\
+      [State]: visible group members are all at standard values.
+   Customization of the One True Editor.
+   See also [Manual].
+
+Editing group: [Go to Group]
+Basic text editing facilities.
+
+External group: [Go to Group]
+Interfacing to external utilities.
+
+@var{more second-level groups}
+
+\- Emacs group end ------------------------------------------------/
+@end group
+@end smallexample
+
+@noindent
+This says that the buffer displays the contents of the @code{Emacs}
+group.  The other groups are listed because they are its contents.  But
+they are listed differently, without indentation and dashes, because
+@emph{their} contents are not included.  Each group has a single-line
+documentation string; the @code{Emacs} group also has a @samp{[State]}
+line.
+
+@cindex editable fields (customization buffer)
+@cindex buttons (customization buffer)
+@cindex links (customization buffer)
+  Most of the text in the customization buffer is read-only, but it
+typically includes some @dfn{editable fields} that you can edit.
+There are also @dfn{buttons} and @dfn{links}, which do something when
+you @dfn{invoke} them.  To invoke a button or a link, either click on
+it with @kbd{Mouse-1}, or move point to it and type @key{RET}.
+
+  For example, the phrase @samp{[State]} that appears in
+a second-level group is a button.  It operates on the same
+customization buffer.  The phrase @samp{[Go to Group]} is a kind
+of hypertext link to another group.  Invoking it creates a new
+customization buffer, which shows that group and its contents.
+
+  The @code{Emacs} group includes a few settings, but mainly it
+contains other groups, which contain more groups, which contain the
+settings.  By browsing the hierarchy of groups, you will eventually
+find the feature you are interested in customizing.  Then you can use
+the customization buffer to set that feature's settings.  You can also
+go straight to a particular group by name, using the command @kbd{M-x
+customize-group}.
+
+@node Browsing Custom
+@subsection Browsing and Searching for Options and Faces
+@findex customize-browse
+
+  @kbd{M-x customize-browse} is another way to browse the available
+settings.  This command creates a special customization buffer which
+shows only the names of groups and settings, and puts them in a
+structure.
+
+  In this buffer, you can show the contents of a group by invoking the
+@samp{[+]} button.  When the group contents are visible, this button
+changes to @samp{[-]}; invoking that hides the group contents again.
+
+  Each group or setting in this buffer has a link which says
+@samp{[Group]}, @samp{[Option]} or @samp{[Face]}.  Invoking this link
+creates an ordinary customization buffer showing just that group and
+its contents, just that user option, or just that face.  This is the
+way to change settings that you find with @kbd{M-x customize-browse}.
+
+  If you can guess part of the name of the settings you are interested
+in, @kbd{M-x customize-apropos} is another way to search for settings.
+However, unlike @code{customize} and @code{customize-browse},
+@code{customize-apropos} can only find groups and settings that are
+loaded in the current Emacs session.  @xref{Specific Customization,,
+Customizing Specific Items}.
+
+@node Changing a Variable
+@subsection Changing a Variable
+
+  Here is an example of what a variable (a user option) looks like in
+the customization buffer:
+
+@smallexample
+Kill Ring Max: [Hide Value] 60
+   [State]: STANDARD.
+Maximum length of kill ring before oldest elements are thrown away.
+@end smallexample
+
+  The text following @samp{[Hide Value]}, @samp{60} in this case, indicates
+the current value of the variable.  If you see @samp{[Show Value]} instead of
+@samp{[Hide Value]}, it means that the value is hidden; the customization
+buffer initially hides values that take up several lines.  Invoke
+@samp{[Show Value]} to show the value.
+
+  The line after the variable name indicates the @dfn{customization
+state} of the variable: in the example above, it says you have not
+changed the option yet.  The @samp{[State]} button at the beginning of
+this line gives you a menu of various operations for customizing the
+variable.
+
+  The line after the @samp{[State]} line displays the beginning of the
+variable's documentation string.  If there are more lines of
+documentation, this line ends with a @samp{[More]} button; invoke that
+to show the full documentation string.
+
+  To enter a new value for @samp{Kill Ring Max}, move point to the
+value and edit it textually.  For example, you can type @kbd{M-d},
+then insert another number.  As you begin to alter the text, you will
+see the @samp{[State]} line change to say that you have edited the
+value:
+
+@smallexample
+[State]: EDITED, shown value does not take effect until you set or @r{@dots{}}
+                                                           save it.
+@end smallexample
+
+@cindex user options, how to set
+@cindex variables, how to set
+@cindex settings, how to set
+  Editing the value does not actually set the variable.  To do that,
+you must @dfn{set} the variable.  To do this, invoke the
+@samp{[State]} button and choose @samp{Set for Current Session}.
+
+  The state of the variable changes visibly when you set it:
+
+@smallexample
+[State]: SET for current session only.
+@end smallexample
+
+   You don't have to worry about specifying a value that is not valid;
+the @samp{Set for Current Session} operation checks for validity and
+will not install an unacceptable value.
+
+@kindex M-TAB @r{(customization buffer)}
+@findex widget-complete
+  While editing a field that is a file name, directory name,
+command name, or anything else for which completion is defined, you
+can type @kbd{M-@key{TAB}} (@code{widget-complete}) to do completion.
+(@kbd{@key{ESC} @key{TAB}} and @kbd{C-M-i} do the same thing.)
+
+  Some variables have a small fixed set of possible legitimate values.
+These variables don't let you edit the value textually.  Instead, a
+@samp{[Value Menu]} button appears before the value; invoke this
+button to change the value.  For a boolean ``on or off'' value, the
+button says @samp{[Toggle]}, and it changes to the other value.
+@samp{[Value Menu]} and @samp{[Toggle]} simply edit the buffer; the
+changes take real effect when you use the @samp{Set for Current
+Session} operation.
+
+  Some variables have values with complex structure.  For example, the
+value of @code{file-coding-system-alist} is an association list.  Here
+is how it appears in the customization buffer:
+
+@smallexample
+File Coding System Alist: [Hide Value]
+[INS] [DEL] File regexp: \.elc\'
+            Choice: [Value Menu] Encoding/decoding pair:
+            Decoding: emacs-mule
+            Encoding: emacs-mule
+[INS] [DEL] File regexp: \(\`\|/\)loaddefs.el\'
+            Choice: [Value Menu] Encoding/decoding pair:
+            Decoding: raw-text
+            Encoding: raw-text-unix
+[INS] [DEL] File regexp: \.tar\'
+            Choice: [Value Menu] Encoding/decoding pair:
+            Decoding: no-conversion
+            Encoding: no-conversion
+[INS] [DEL] File regexp:
+            Choice: [Value Menu] Encoding/decoding pair:
+            Decoding: undecided
+            Encoding: nil
+[INS]
+   [State]: STANDARD.
+Alist to decide a coding system to use for a file I/O @r{@dots{}}
+                                operation. [Hide Rest]
+The format is ((PATTERN . VAL) ...),
+where PATTERN is a regular expression matching a file name,
+@r{[@dots{}more lines of documentation@dots{}]}
+@end smallexample
+
+@noindent
+Each association in the list appears on four lines, with several
+editable fields and/or buttons.  You can edit the regexps and coding
+systems using ordinary editing commands.  You can also invoke
+@samp{[Value Menu]} to switch to a different kind of value---for
+instance, to specify a function instead of a pair of coding systems.
+
+To delete an association from the list, invoke the @samp{[DEL]} button
+for that item.  To add an association, invoke @samp{[INS]} at the
+position where you want to add it.  There is an @samp{[INS]} button
+between each pair of associations, another at the beginning and another
+at the end, so you can add a new association at any position in the
+list.
+
+@kindex TAB @r{(customization buffer)}
+@kindex S-TAB @r{(customization buffer)}
+@findex widget-forward
+@findex widget-backward
+  Two special commands, @key{TAB} and @kbd{S-@key{TAB}}, are useful
+for moving through the customization buffer.  @key{TAB}
+(@code{widget-forward}) moves forward to the next button or editable
+field; @kbd{S-@key{TAB}} (@code{widget-backward}) moves backward to
+the previous button or editable field.
+
+  Typing @key{RET} on an editable field also moves forward, just like
+@key{TAB}.  We set it up this way because people often type @key{RET}
+when they are finished editing a field.  To insert a newline within an
+editable field, use @kbd{C-o} or @kbd{C-q C-j}.
+
+@cindex saving a setting
+@cindex settings, how to save
+  Setting the variable changes its value in the current Emacs session;
+@dfn{saving} the value changes it for future sessions as well.  To
+save the variable, invoke @samp{[State]} and select the @samp{Save for
+Future Sessions} operation.  This works by writing code so as to set
+the variable again, each time you start Emacs (@pxref{Saving
+Customizations}).
+
+  You can also restore the variable to its standard value by invoking
+@samp{[State]} and selecting the @samp{Erase Customization} operation.
+There are actually four reset operations:
+
+@table @samp
+@item Undo Edits
+If you have made some modifications and not yet set the variable,
+this restores the text in the customization buffer to match
+the actual value.
+
+@item Reset to Saved
+This restores the value of the variable to the last saved value,
+and updates the text accordingly.
+
+@item Erase Customization
+This sets the variable to its standard value, and updates the text
+accordingly.  This also eliminates any saved value for the variable,
+so that you will get the standard value in future Emacs sessions.
+
+@item Set to Backup Value
+This sets the variable to a previous value that was set in the
+customization buffer in this session.  If you customize a variable
+and then reset it, which discards the customized value,
+you can get the discarded value back again with this operation.
+@end table
+
+@cindex comments on customized settings
+  Sometimes it is useful to record a comment about a specific
+customization.  Use the @samp{Add Comment} item from the
+@samp{[State]} menu to create a field for entering the comment.  The
+comment you enter will be saved, and displayed again if you again view
+the same variable in a customization buffer, even in another session.
+
+  The state of a group indicates whether anything in that group has been
+edited, set or saved.
+
+  Near the top of the customization buffer there are two lines of buttons:
+
+@smallexample
+ [Set for Current Session] [Save for Future Sessions]
+ [Undo Edits] [Reset to Saved] [Erase Customization]   [Finish]
+@end smallexample
+
+@vindex custom-buffer-done-function
+@noindent
+Invoking @samp{[Finish]} either buries or kills this customization
+buffer according to the setting of the option
+@code{custom-buffer-done-kill}; the default is to bury the buffer.
+Each of the other buttons performs an operation---set, save or
+reset---on each of the settings in the buffer that could meaningfully
+be set, saved or reset.  They do not operate on settings whose values
+are hidden, nor on subgroups which are hidden or not visible in the buffer.
+
+@node Saving Customizations
+@subsection Saving Customizations
+
+  Saving customizations from the customization buffer works by writing
+code that future sessions will read, code to set up those
+customizations again.
+
+@vindex custom-file
+  Normally this saves customizations in your init file,
+@file{~/.emacs}.  If you wish, you can save customizations in another
+file instead.  To make this work, your @file{~/.emacs} should set
+@code{custom-file} to the name of that file.  Then you should load the
+file by calling @code{load}.  For example:
+
+@example
+(setq custom-file "~/.emacs-custom.el")
+(load custom-file)
+@end example
+
+  You can use @code{custom-file} to specify different customization
+files for different Emacs versions, like this:
+
+@example
+(cond ((< emacs-major-version 21)
+       ;; @r{Emacs 20 customization.}
+       (setq custom-file "~/.custom-20.el"))
+      ((and (= emacs-major-version 21) (< emacs-minor-version 4))
+       ;; @r{Emacs 21 customization, before version 21.4.}
+       (setq custom-file "~/.custom-21.el"))
+      ((< emacs-major-version 22)
+       ;; @r{Emacs version 21.4 or later.}
+       (setq custom-file "~/.custom-21.4.el"))
+      (t
+       ;; @r{Emacs version 22.1 or later.}
+       (setq custom-file "~/.custom-22.el")))
+
+(load custom-file)
+@end example
+
+  If Emacs was invoked with the @option{-q} or @option{--no-init-file}
+options (@pxref{Initial Options}), it will not let you save your
+customizations in your @file{~/.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.
+
+@node Face Customization
+@subsection Customizing Faces
+@cindex customizing faces
+@cindex bold font
+@cindex italic font
+@cindex fonts and faces
+
+  In addition to variables, some customization groups also include
+faces.  When you show the contents of a group, both the variables and
+the faces in the group appear in the customization buffer.  Here is an
+example of how a face looks:
+
+@smallexample
+Custom Changed Face:(sample) [Hide Face]
+   [State]: STANDARD.
+Face used when the customize item has been changed.
+Parent groups: [Custom Magic Faces]
+Attributes: [ ] Font Family: *
+            [ ] Width: *
+            [ ] Height: *
+            [ ] Weight: *
+            [ ] Slant: *
+            [ ] Underline: *
+            [ ] Overline: *
+            [ ] Strike-through: *
+            [ ] Box around text: *
+            [ ] Inverse-video: *
+            [X] Foreground: white       (sample)
+            [X] Background: blue        (sample)
+            [ ] Stipple: *
+            [ ] Inherit: *
+@end smallexample
+
+  Each face attribute has its own line.  The @samp{[@var{x}]} button
+before the attribute name indicates whether the attribute is
+@dfn{enabled}; @samp{[X]} means that it's enabled, and @samp{[ ]}
+means that it's disabled.  You can enable or disable the attribute by
+clicking that button.  When the attribute is enabled, you can change
+the attribute value in the usual ways.
+
+  For the colors, you can specify a color name (use @kbd{M-x
+list-colors-display} for a list of them) or a hexadecimal color
+specification of the form @samp{#@var{rr}@var{gg}@var{bb}}.
+(@samp{#000000} is black, @samp{#ff0000} is red, @samp{#00ff00} is
+green, @samp{#0000ff} is blue, and @samp{#ffffff} is white.)  On a
+black-and-white display, the colors you can use for the background are
+@samp{black}, @samp{white}, @samp{gray}, @samp{gray1}, and
+@samp{gray3}.  Emacs supports these shades of gray by using background
+stipple patterns instead of a color.
+
+  Setting, saving and resetting a face work like the same operations for
+variables (@pxref{Changing a Variable}).
+
+  A face can specify different appearances for different types of
+display.  For example, a face can make text red on a color display, but
+use a bold font on a monochrome display.  To specify multiple
+appearances for a face, select @samp{For All Kinds of Displays} in the
+menu you get from invoking @samp{[State]}.
+
+@findex modify-face
+  Another more basic way to set the attributes of a specific face is
+with @kbd{M-x modify-face}.  This command reads the name of a face, then
+reads the attributes one by one.  For the color and stipple attributes,
+the attribute's current value is the default---type just @key{RET} if
+you don't want to change that attribute.  Type @samp{none} if you want
+to clear out the attribute.
+
+@node Specific Customization
+@subsection Customizing Specific Items
+
+  Instead of finding the setting you want to change by navigating the
+structure of groups, here are other ways to specify the settings that
+you want to customize.
+
+@table @kbd
+@item M-x customize-option @key{RET} @var{option} @key{RET}
+Set up a customization buffer with just one user option variable,
+@var{option}.
+@item M-x customize-face @key{RET} @var{face} @key{RET}
+Set up a customization buffer with just one face, @var{face}.
+@item M-x customize-group @key{RET} @var{group} @key{RET}
+Set up a customization buffer with just one group, @var{group}.
+@item M-x customize-apropos @key{RET} @var{regexp} @key{RET}
+Set up a customization buffer with all the settings and groups that
+match @var{regexp}.
+@item M-x customize-changed @key{RET} @var{version} @key{RET}
+Set up a customization buffer with all the settings and groups
+whose meaning has changed since Emacs version @var{version}.
+@item M-x customize-saved
+Set up a customization buffer containing all settings that you
+have saved with customization buffers.
+@item M-x customize-unsaved
+Set up a customization buffer containing all settings that you have
+set but not saved.
+@end table
+
+@findex customize-option
+  If you want to alter a particular user option with the customization
+buffer, and you know its name, you can use the command @kbd{M-x
+customize-option} and specify the user option (variable) name.  This
+sets up the customization buffer with just one user option---the one
+that you asked for.  Editing, setting and saving the value work as
+described above, but only for the specified user option.  Minibuffer
+completion is handy if you only know part of the name.  However, this
+command can only see options that have been loaded in the current
+Emacs session.
+
+@findex customize-face
+  Likewise, you can modify a specific face, chosen by name, using
+@kbd{M-x customize-face}.  By default it operates on the face used
+on the character after point.
+
+@findex customize-group
+  You can also set up the customization buffer with a specific group,
+using @kbd{M-x customize-group}.  The immediate contents of the chosen
+group, including settings (user options and faces), and other groups,
+all appear as well (even if not already loaded).  However, the
+subgroups' own contents are not included.
+
+@findex customize-apropos
+  For a more general way of controlling what to customize, you can use
+@kbd{M-x customize-apropos}.  You specify a regular expression as
+argument; then all @emph{loaded} settings and groups whose names match
+this regular expression are set up in the customization buffer.  If
+you specify an empty regular expression, this includes @emph{all}
+loaded groups and settings---which takes a long time to set up.
+
+@findex customize-changed
+  When you upgrade to a new Emacs version, you might want to consider
+customizing new settings, and settings whose meanings or default
+values have changed.  To do this, use @kbd{M-x customize-changed} and
+specify a previous Emacs version number using the minibuffer.  It
+creates a customization buffer which shows all the settings and groups
+whose definitions have been changed since the specified version,
+loading them if necessary.
+
+@findex customize-saved
+@findex customize-unsaved
+  If you change settings and then decide the change was a mistake, you
+can use two special commands to revisit your previous changes.  Use
+@kbd{M-x customize-saved} to look at the settings that you have saved.
+Use @kbd{M-x customize-unsaved} to look at the settings that you
+have set but not saved.
+
+@node Custom Themes
+@subsection Customization Themes
+@cindex custom themes
+
+  @dfn{Custom themes} are collections of settings that can be enabled
+or disabled as a unit.  You can use Custom themes to switch quickly
+and easily between various collections of settings, and to transfer
+such collections from one computer to another.
+
+@findex customize-create-theme
+  To define a Custom theme, use @kbd{M-x customize-create-theme},
+which brings up a buffer named @samp{*New Custom Theme*}.  At the top
+of the buffer is an editable field where you can specify the name of
+the theme.  Click on the button labelled @samp{Insert Variable} to add
+a variable to the theme, and click on @samp{Insert Face} to add a
+face.  You can edit these values in the @samp{*New Custom Theme*}
+buffer like in an ordinary Customize buffer.  To remove an option from
+the theme, click on its @samp{State} button and select @samp{Delete}.
+
+@vindex custom-theme-directory
+  After adding the desired options, click on @samp{Save Theme} to save
+the Custom theme.  This writes the theme definition to a file
+@file{@var{foo}-theme.el} (where @var{foo} is the theme name you
+supplied), in the directory @file{~/.emacs.d/}.  You can specify the
+directory by setting @code{custom-theme-directory}.
+
+  You can view and edit the settings of a previously-defined theme by
+clicking on @samp{Visit Theme} and specifying the theme name.  You can
+also import the variables and faces that you have set using Customize
+by visiting the ``special'' theme named @samp{user}.  This theme, which
+records all the options that you set in the ordinary customization
+buffer, is always enabled, and always takes precedence over all other
+enabled Custom themes.  Additionally, the @samp{user} theme is
+recorded with code in your @file{.emacs} file, rather than a
+@file{user-theme.el} file.
+
+@vindex custom-enabled-themes
+  Once you have defined a Custom theme, you can use it by customizing
+the variable @code{custom-enabled-themes}.  This is a list of Custom
+themes that are @dfn{enabled}, or put into effect.  If you set
+@code{custom-enabled-themes} using the Customize interface, the theme
+definitions are automatically loaded from the theme files, if they
+aren't already.  If you save the value of @code{custom-enabled-themes}
+for future Emacs sessions, those Custom themes will be enabled
+whenever Emacs is started up.
+
+  If two enabled themes specify different values for an option, the
+theme occurring earlier in @code{custom-enabled-themes} takes effect.
+
+@findex load-theme
+@findex enable-theme
+@findex disable-theme
+  You can temporarily enable a Custom theme with @kbd{M-x
+enable-theme}.  This prompts for a theme name in the minibuffer, loads
+the theme from the theme file if necessary, and enables the theme.
+You can @dfn{disable} any enabled theme with the command @kbd{M-x
+disable-theme}; this returns the options specified in the theme to
+their original values.  To re-enable the theme, type @kbd{M-x
+enable-theme} again.  If a theme file is changed during your Emacs
+session, you can reload it by typing @kbd{M-x load-theme}.  (This also
+enables the theme.)
+
+@node Variables
+@section Variables
+@cindex variable
+@cindex option, user
+@cindex user option
+
+  A @dfn{variable} is a Lisp symbol which has a value.  The symbol's
+name is also called the name of the variable.  A variable name can
+contain any characters that can appear in a file, but conventionally
+variable names consist of words separated by hyphens.  A variable can
+have a documentation string which describes what kind of value it should
+have and how the value will be used.
+
+  Emacs Lisp allows any variable (with a few exceptions) to have any
+kind of value, but most variables that Emacs uses expect a value of a
+certain type.  Often the value should always be a string, or should
+always be a number.  Sometimes we say that a certain feature is turned
+on if a variable is ``non-@code{nil},'' meaning that if the variable's
+value is @code{nil}, the feature is off, but the feature is on for
+@emph{any} other value.  The conventional value to use to turn on the
+feature---since you have to pick one particular value when you set the
+variable---is @code{t}.
+
+  Emacs uses many Lisp variables for internal record keeping, but the
+most interesting variables for a non-programmer user are those meant
+for users to change---these are called @dfn{user options}.
+
+  Each user option that you can set with the customization buffer is
+in fact a Lisp variable.  Emacs does not (usually) change the values
+of these variables on its own; instead, you set the values in order to
+control the behavior of certain Emacs commands.  Use of the
+customization buffer is explained above (@pxref{Easy Customization});
+here we describe other aspects of Emacs variables.
+
+@menu
+* Examining::          Examining or setting one variable's value.
+* Hooks::              Hook variables let you specify programs for parts
+                         of Emacs to run on particular occasions.
+* Locals::             Per-buffer values of variables.
+* File Variables::      How files can specify variable values.
+@end menu
+
+@node Examining
+@subsection Examining and Setting Variables
+@cindex setting variables
+
+@table @kbd
+@item C-h v @var{var} @key{RET}
+Display the value and documentation of variable @var{var}
+(@code{describe-variable}).
+@item M-x set-variable @key{RET} @var{var} @key{RET} @var{value} @key{RET}
+Change the value of variable @var{var} to @var{value}.
+@end table
+
+  To examine the value of a single variable, use @kbd{C-h v}
+(@code{describe-variable}), which reads a variable name using the
+minibuffer, with completion.  It displays both the value and the
+documentation of the variable.  For example,
+
+@example
+C-h v fill-column @key{RET}
+@end example
+
+@noindent
+displays something like this:
+
+@smallexample
+fill-column is a variable defined in `C source code'.
+fill-column's value is 70
+Local in buffer custom.texi; global value is 70
+Automatically becomes buffer-local when set in any fashion.
+
+This variable is safe to use as a file local variable only if its value
+satisfies the predicate `integerp'.
+
+Documentation:
+*Column beyond which automatic line-wrapping should happen.
+Interactively, you can set the buffer local value using C-x f.
+
+You can customize this variable.
+@end smallexample
+
+@noindent
+The line that says you can customize the variable indicates that this
+variable is a user option.  (The star also indicates this, but it is
+an obsolete indicator that may eventually disappear.)  @kbd{C-h v} is
+not restricted to user options; it allows any variable name.
+
+@findex set-variable
+The most convenient way to set a specific user option variable is with
+@kbd{M-x set-variable}.  This reads the variable name with the
+minibuffer (with completion), and then reads a Lisp expression for the
+new value using the minibuffer a second time (you can insert the old
+value into the minibuffer for editing via @kbd{M-n}).  For example,
+
+@example
+M-x set-variable @key{RET} fill-column @key{RET} 75 @key{RET}
+@end example
+
+@noindent
+sets @code{fill-column} to 75.
+
+ @kbd{M-x set-variable} is limited to user option variables, but you can
+set any variable with a Lisp expression, using the function @code{setq}.
+Here is a @code{setq} expression to set @code{fill-column}:
+
+@example
+(setq fill-column 75)
+@end example
+
+  To execute an expression like this one, go to the @samp{*scratch*}
+buffer, type in the expression, and then type @kbd{C-j}.  @xref{Lisp
+Interaction}.
+
+  Setting variables, like all means of customizing Emacs except where
+otherwise stated, affects only the current Emacs session.  The only
+way to alter the variable in future sessions is to put something in
+the @file{~/.emacs} file to set it those sessions (@pxref{Init File}).
+
+@node Hooks
+@subsection Hooks
+@cindex hook
+@cindex running a hook
+
+  @dfn{Hooks} are an important mechanism for customization of Emacs.  A
+hook is a Lisp variable which holds a list of functions, to be called on
+some well-defined occasion.  (This is called @dfn{running the hook}.)
+The individual functions in the list are called the @dfn{hook functions}
+of the hook.  With rare exceptions, hooks in Emacs are empty when Emacs
+starts up, so the only hook functions in any given hook are the ones you
+explicitly put there as customization.
+
+  Most major modes run one or more @dfn{mode hooks} as the last step of
+initialization.  This makes it easy for you to customize the behavior of
+the mode, by setting up a hook function to override the local variable
+assignments already made by the mode.  But hooks are also used in other
+contexts.  For example, the hook @code{suspend-hook} runs just before
+Emacs suspends itself (@pxref{Exiting}).
+
+@cindex normal hook
+  Most Emacs hooks are @dfn{normal hooks}.  This means that running the
+hook operates by calling all the hook functions, unconditionally, with
+no arguments.  We have made an effort to keep most hooks normal so that
+you can use them in a uniform way.  Every variable in Emacs whose name
+ends in @samp{-hook} is a normal hook.
+
+@cindex abnormal hook
+  There are also a few @dfn{abnormal hooks}.  These variables' names end
+in @samp{-hooks} or @samp{-functions}, instead of @samp{-hook}.  What
+makes these hooks abnormal is that there is something peculiar about the
+way its functions are called---perhaps they are given arguments, or
+perhaps the values they return are used in some way.  For example,
+@code{find-file-not-found-functions} (@pxref{Visiting}) is abnormal because
+as soon as one hook function returns a non-@code{nil} value, the rest
+are not called at all.  The documentation of each abnormal hook variable
+explains in detail what is peculiar about it.
+
+@findex add-hook
+  You can set a hook variable with @code{setq} like any other Lisp
+variable, but the recommended way to add a hook function to a hook
+(either normal or abnormal) is by calling @code{add-hook}.
+@xref{Hooks,,, elisp, The Emacs Lisp Reference Manual}.
+
+  For example, here's how to set up a hook to turn on Auto Fill mode
+when entering Text mode and other modes based on Text mode:
+
+@example
+(add-hook 'text-mode-hook 'turn-on-auto-fill)
+@end example
+
+  The next example shows how to use a hook to customize the indentation
+of C code.  (People often have strong personal preferences for one
+format compared to another.)  Here the hook function is an anonymous
+lambda expression.
+
+@example
+@group
+(setq my-c-style
+  '((c-comment-only-line-offset . 4)
+@end group
+@group
+    (c-cleanup-list . (scope-operator
+                      empty-defun-braces
+                      defun-close-semi))
+@end group
+@group
+    (c-offsets-alist . ((arglist-close . c-lineup-arglist)
+                       (substatement-open . 0)))))
+@end group
+
+@group
+(add-hook 'c-mode-common-hook
+  '(lambda ()
+     (c-add-style "my-style" my-c-style t)))
+@end group
+@end example
+
+  It is best to design your hook functions so that the order in which
+they are executed does not matter.  Any dependence on the order is
+``asking for trouble.''  However, the order is predictable: the most
+recently added hook functions are executed first.
+
+@findex remove-hook
+  If you play with adding various different versions of a hook
+function by calling @code{add-hook} over and over, remember that all
+the versions you added will remain in the hook variable together.  You
+can clear out individual functions by calling @code{remove-hook}, or
+do @code{(setq @var{hook-variable} nil)} to remove everything.
+
+@node Locals
+@subsection Local Variables
+
+@table @kbd
+@item M-x make-local-variable @key{RET} @var{var} @key{RET}
+Make variable @var{var} have a local value in the current buffer.
+@item M-x kill-local-variable @key{RET} @var{var} @key{RET}
+Make variable @var{var} use its global value in the current buffer.
+@item M-x make-variable-buffer-local @key{RET} @var{var} @key{RET}
+Mark variable @var{var} so that setting it will make it local to the
+buffer that is current at that time.
+@end table
+
+@cindex local variables
+  Almost any variable can be made @dfn{local} to a specific Emacs
+buffer.  This means that its value in that buffer is independent of its
+value in other buffers.  A few variables are always local in every
+buffer.  Every other Emacs variable has a @dfn{global} value which is in
+effect in all buffers that have not made the variable local.
+
+@findex make-local-variable
+  @kbd{M-x make-local-variable} reads the name of a variable and makes
+it local to the current buffer.  Changing its value subsequently in
+this buffer will not affect others, and changes in its global value
+will not affect this buffer.
+
+@findex make-variable-buffer-local
+@cindex per-buffer variables
+  @kbd{M-x make-variable-buffer-local} marks a variable so it will
+become local automatically whenever it is set.  More precisely, once a
+variable has been marked in this way, the usual ways of setting the
+variable automatically do @code{make-local-variable} first.  We call
+such variables @dfn{per-buffer} variables.  Many variables in Emacs
+are normally per-buffer; the variable's document string tells you when
+this is so.  A per-buffer variable's global value is normally never
+effective in any buffer, but it still has a meaning: it is the initial
+value of the variable for each new buffer.
+
+  Major modes (@pxref{Major Modes}) always make variables local to the
+buffer before setting the variables.  This is why changing major modes
+in one buffer has no effect on other buffers.  Minor modes also work
+by setting variables---normally, each minor mode has one controlling
+variable which is non-@code{nil} when the mode is enabled
+(@pxref{Minor Modes}).  For many minor modes, the controlling variable
+is per buffer, and thus always buffer-local.  Otherwise, you can make
+it local in a specific buffer like any other variable.
+
+  A few variables cannot be local to a buffer because they are always
+local to each display instead (@pxref{Multiple Displays}).  If you try to
+make one of these variables buffer-local, you'll get an error message.
+
+@findex kill-local-variable
+  @kbd{M-x kill-local-variable} makes a specified variable cease to be
+local to the current buffer.  The global value of the variable
+henceforth is in effect in this buffer.  Setting the major mode kills
+all the local variables of the buffer except for a few variables
+specially marked as @dfn{permanent locals}.
+
+@findex setq-default
+  To set the global value of a variable, regardless of whether the
+variable has a local value in the current buffer, you can use the Lisp
+construct @code{setq-default}.  This construct is used just like
+@code{setq}, but it sets variables' global values instead of their local
+values (if any).  When the current buffer does have a local value, the
+new global value may not be visible until you switch to another buffer.
+Here is an example:
+
+@example
+(setq-default fill-column 75)
+@end example
+
+@noindent
+@code{setq-default} is the only way to set the global value of a variable
+that has been marked with @code{make-variable-buffer-local}.
+
+@findex default-value
+  Lisp programs can use @code{default-value} to look at a variable's
+default value.  This function takes a symbol as argument and returns its
+default value.  The argument is evaluated; usually you must quote it
+explicitly.  For example, here's how to obtain the default value of
+@code{fill-column}:
+
+@example
+(default-value 'fill-column)
+@end example
+
+@node File Variables
+@subsection Local Variables in Files
+@cindex local variables in files
+@cindex file local variables
+
+  A file can specify local variable values for use when you edit the
+file with Emacs.  Visiting the file checks for local variable
+specifications; it automatically makes these variables local to the
+buffer, and sets them to the values specified in the file.
+
+@menu
+* Specifying File Variables:: Specifying file local variables.
+* Safe File Variables::       Making sure file local variables are safe.
+@end menu
+
+@node Specifying File Variables
+@subsubsection Specifying File Variables
+
+  There are two ways to specify file local variable values: in the first
+line, or with a local variables list.  Here's how to specify them in the
+first line:
+
+@example
+-*- mode: @var{modename}; @var{var}: @var{value}; @dots{} -*-
+@end example
+
+@noindent
+You can specify any number of variables/value pairs in this way, each
+pair with a colon and semicolon as shown above.  @code{mode:
+@var{modename};} specifies the major mode; this should come first in the
+line.  The @var{value}s are not evaluated; they are used literally.
+Here is an example that specifies Lisp mode and sets two variables with
+numeric values:
+
+@smallexample
+;; -*- mode: Lisp; fill-column: 75; comment-column: 50; -*-
+@end smallexample
+
+  You can also specify the coding system for a file in this way: just
+specify a value for the ``variable'' named @code{coding}.  The ``value''
+must be a coding system name that Emacs recognizes.  @xref{Coding
+Systems}.  @w{@samp{unibyte: t}} specifies unibyte loading for a
+particular Lisp file.  @xref{Enabling Multibyte}.
+
+  The @code{eval} pseudo-variable, described below, can be specified in
+the first line as well.
+
+@cindex shell scripts, and local file variables
+  In shell scripts, the first line is used to identify the script
+interpreter, so you cannot put any local variables there.  To
+accommodate this, Emacs looks for local variable specifications in the
+@emph{second} line when the first line specifies an interpreter.
+
+  A @dfn{local variables list} goes near the end of the file, in the
+last page.  (It is often best to put it on a page by itself.)  The local
+variables list starts with a line containing the string @samp{Local
+Variables:}, and ends with a line containing the string @samp{End:}.  In
+between come the variable names and values, one set per line, as
+@samp{@var{variable}:@: @var{value}}.  The @var{value}s are not
+evaluated; they are used literally.  If a file has both a local
+variables list and a @samp{-*-} line, Emacs processes @emph{everything}
+in the @samp{-*-} line first, and @emph{everything} in the local
+variables list afterward.
+
+  Here is an example of a local variables list:
+
+@example
+;; Local Variables: **
+;; mode:lisp **
+;; comment-column:0 **
+;; comment-start: ";; "  **
+;; comment-end:"**" **
+;; End: **
+@end example
+
+  Each line starts with the prefix @samp{;; } and each line ends with
+the suffix @samp{ **}.  Emacs recognizes these as the prefix and
+suffix based on the first line of the list, by finding them
+surrounding the magic string @samp{Local Variables:}; then it
+automatically discards them from the other lines of the list.
+
+  The usual reason for using a prefix and/or suffix is to embed the
+local variables list in a comment, so it won't confuse other programs
+that the file is intended as input for.  The example above is for a
+language where comment lines start with @samp{;; } and end with
+@samp{**}; the local values for @code{comment-start} and
+@code{comment-end} customize the rest of Emacs for this unusual
+syntax.  Don't use a prefix (or a suffix) if you don't need one.
+
+  If you write a multi-line string value, you should put the prefix
+and suffix on each line, even lines that start or end within the
+string.  They will be stripped off for processing the list.  If you
+want to split a long string across multiple lines of the file, you can
+use backslash-newline, which is ignored in Lisp string constants.
+Here's an example of doing this:
+
+@example
+# Local Variables:
+# compile-command: "cc foo.c -Dfoo=bar -Dhack=whatever \
+#   -Dmumble=blaah"
+# End:
+@end example
+
+  Some ``variable names'' have special meanings in a local variables
+list.  Specifying the ``variable'' @code{mode} really sets the major
+mode, while any value specified for the ``variable'' @code{eval} is
+simply evaluated as an expression (its value is ignored).  A value for
+@code{coding} specifies the coding system for character code
+conversion of this file, and a value of @code{t} for @code{unibyte}
+says to visit the file in a unibyte buffer.  These four ``variables''
+are not really variables; setting them in any other context has no
+special meaning.
+
+  @emph{If @code{mode} is used to set a major mode, it should be the
+first ``variable'' in the list.}  Otherwise, the entries that precede
+it will usually be ignored, since most modes kill all local variables
+as part of their initialization.
+
+  You can use the @code{mode} ``variable'' to set minor modes as well
+as the major modes; in fact, you can use it more than once, first to
+set the major mode and then to set minor modes which are specific to
+particular buffers.  But most minor modes should not be specified in
+the file at all, because they represent user preferences.
+
+  For example, you may be tempted to try to turn on Auto Fill mode with
+a local variable list.  That is a mistake.  The choice of Auto Fill mode
+or not is a matter of individual taste, not a matter of the contents of
+particular files.  If you want to use Auto Fill, set up major mode hooks
+with your @file{.emacs} file to turn it on (when appropriate) for you
+alone (@pxref{Init File}).  Don't use a local variable list to impose
+your taste on everyone.
+
+  The start of the local variables list must be no more than 3000
+characters from the end of the file, and must be in the last page if the
+file is divided into pages.  Otherwise, Emacs will not notice it is
+there.  The purpose of this rule is so that a stray @samp{Local
+Variables:}@: not in the last page does not confuse Emacs, and so that
+visiting a long file that is all one page and has no local variables
+list need not take the time to search the whole file.
+
+  Use the command @code{normal-mode} to reset the local variables and
+major mode of a buffer according to the file name and contents,
+including the local variables list if any.  @xref{Choosing Modes}.
+
+@node Safe File Variables
+@subsubsection Safety of File Variables
+
+  File-local variables can be dangerous; when you visit someone else's
+file, there's no telling what its local variables list could do to
+your Emacs.  Improper values of the @code{eval} ``variable,'' and
+other variables such as @code{load-path}, could execute Lisp code you
+didn't intend to run.
+
+  Therefore, whenever Emacs encounters file local variable values that
+are not known to be safe, it displays the file's entire local
+variables list, and asks you for confirmation before setting them.
+You can type @kbd{y} or @key{SPC} to put the local variables list into
+effect, or @kbd{n} to ignore it.  When Emacs is run in batch mode
+(@pxref{Initial Options}), it can't really ask you, so it assumes the
+answer @kbd{n}.
+
+  Emacs normally recognizes certain variables/value pairs as safe.
+For instance, it is safe to give @code{comment-column} or
+@code{fill-column} any integer value.  If a file specifies only
+known-safe variable/value pairs, Emacs does not ask for confirmation
+before setting them.  Otherwise, you can tell Emacs to record all the
+variable/value pairs in this file as safe, by typing @kbd{!} at the
+confirmation prompt.  When Emacs encounters these variable/value pairs
+subsequently, in the same file or others, it will assume they are
+safe.
+
+@vindex safe-local-variable-values
+@cindex risky variable
+  Some variables, such as @code{load-path}, are considered
+particularly @dfn{risky}: there is seldom any reason to specify them
+as local variables, and changing them can be dangerous.  If a file
+contains only risky local variables, Emacs neither offers nor accepts
+@kbd{!} as input at the confirmation prompt.  If some of the local
+variables in a file are risky, and some are only potentially unsafe, you
+can enter @kbd{!} at the prompt.  It applies all the variables, but only
+marks the non-risky ones as safe for the future.  If you really want to
+record safe values for risky variables, do it directly by customizing
+@samp{safe-local-variable-values} (@pxref{Easy Customization}).
+
+@vindex enable-local-variables
+  The variable @code{enable-local-variables} allows you to change the
+way Emacs processes local variables.  Its default value is @code{t},
+which specifies the behavior described above.  If it is @code{nil},
+Emacs simply ignores all file local variables.  @code{:safe} means use
+only the safe values and ignore the rest.  Any other value says to
+query you about each file that has local variables, without trying to
+determine whether the values are known to be safe.
+
+@vindex enable-local-eval
+  The variable @code{enable-local-eval} controls whether Emacs
+processes @code{eval} variables.  The three possibilities for the
+variable's value are @code{t}, @code{nil}, and anything else, just as
+for @code{enable-local-variables}.  The default is @code{maybe}, which
+is neither @code{t} nor @code{nil}, so normally Emacs does ask for
+confirmation about processing @code{eval} variables.
+
+@vindex safe-local-eval-forms
+  But there is an exception.  The @code{safe-local-eval-forms} is a
+customizable list of eval forms which are safe.  Emacs does not ask
+for confirmation when it finds these forms for the @code{eval}
+variable.
+
+@node Key Bindings
+@section Customizing Key Bindings
+@cindex key bindings
+
+  This section describes @dfn{key bindings}, which map keys to commands,
+and @dfn{keymaps}, which record key bindings.  It also explains how
+to customize key bindings.
+
+  Recall that a command is a Lisp function whose definition provides for
+interactive use.  Like every Lisp function, a command has a function
+name, which usually consists of lower-case letters and hyphens.
+
+@menu
+* Keymaps::             Generalities.  The global keymap.
+* Prefix Keymaps::      Keymaps for prefix keys.
+* Local Keymaps::       Major and minor modes have their own keymaps.
+* Minibuffer Maps::     The minibuffer uses its own local keymaps.
+* Rebinding::           How to redefine one key's meaning conveniently.
+* Init Rebinding::      Rebinding keys with your init file, @file{.emacs}.
+* Function Keys::       Rebinding terminal function keys.
+* Named ASCII Chars::   Distinguishing @key{TAB} from @kbd{C-i}, and so on.
+* Mouse Buttons::       Rebinding mouse buttons in Emacs.
+* Disabling::           Disabling a command means confirmation is required
+                          before it can be executed.  This is done to protect
+                          beginners from surprises.
+@end menu
+
+@node Keymaps
+@subsection Keymaps
+@cindex keymap
+
+  The bindings between key sequences and command functions are recorded
+in data structures called @dfn{keymaps}.  Emacs has many of these, each
+used on particular occasions.
+
+  Recall that a @dfn{key sequence} (@dfn{key}, for short) is a sequence
+of @dfn{input events} that have a meaning as a unit.  Input events
+include characters, function keys and mouse buttons---all the inputs
+that you can send to the computer with your terminal.  A key sequence
+gets its meaning from its @dfn{binding}, which says what command it
+runs.  The function of keymaps is to record these bindings.
+
+@cindex global keymap
+  The @dfn{global} keymap is the most important keymap because it is
+always in effect.  The global keymap defines keys for Fundamental mode;
+most of these definitions are common to most or all major modes.  Each
+major or minor mode can have its own keymap which overrides the global
+definitions of some keys.
+
+  For example, a self-inserting character such as @kbd{g} is
+self-inserting because the global keymap binds it to the command
+@code{self-insert-command}.  The standard Emacs editing characters such
+as @kbd{C-a} also get their standard meanings from the global keymap.
+Commands to rebind keys, such as @kbd{M-x global-set-key}, actually work
+by storing the new binding in the proper place in the global map.
+@xref{Rebinding}.
+
+   Meta characters work differently; Emacs translates each Meta
+character into a pair of characters starting with @key{ESC}.  When you
+type the character @kbd{M-a} in a key sequence, Emacs replaces it with
+@kbd{@key{ESC} a}.  A meta key comes in as a single input event, but
+becomes two events for purposes of key bindings.  The reason for this is
+historical, and we might change it someday.
+
+@cindex function key
+  Most modern keyboards have function keys as well as character keys.
+Function keys send input events just as character keys do, and keymaps
+can have bindings for them.
+
+  On text terminals, typing a function key actually sends the computer a
+sequence of characters; the precise details of the sequence depends on
+which function key and on the model of terminal you are using.  (Often
+the sequence starts with @kbd{@key{ESC} [}.)  If Emacs understands your
+terminal type properly, it recognizes the character sequences forming
+function keys wherever they occur in a key sequence (not just at the
+beginning).  Thus, for most purposes, you can pretend the function keys
+reach Emacs directly and ignore their encoding as character sequences.
+
+@cindex mouse
+  Mouse buttons also produce input events.  These events come with other
+data---the window and position where you pressed or released the button,
+and a time stamp.  But only the choice of button matters for key
+bindings; the other data matters only if a command looks at it.
+(Commands designed for mouse invocation usually do look at the other
+data.)
+
+  A keymap records definitions for single events.  Interpreting a key
+sequence of multiple events involves a chain of keymaps.  The first
+keymap gives a definition for the first event; this definition is
+another keymap, which is used to look up the second event in the
+sequence, and so on.
+
+  Key sequences can mix function keys and characters.  For example,
+@kbd{C-x @key{SELECT}} is meaningful.  If you make @key{SELECT} a prefix
+key, then @kbd{@key{SELECT} C-n} makes sense.  You can even mix mouse
+events with keyboard events, but we recommend against it, because such
+key sequences are inconvenient to use.
+
+  As a user, you can redefine any key; but it is usually best to stick
+to key sequences that consist of @kbd{C-c} followed by a letter (upper
+or lower case).  These keys are ``reserved for users,'' so they won't
+conflict with any properly designed Emacs extension.  The function
+keys @key{F5} through @key{F9} are also reserved for users.  If you
+redefine some other key, your definition may be overridden by certain
+extensions or major modes which redefine the same key.
+
+@node Prefix Keymaps
+@subsection Prefix Keymaps
+
+  A prefix key such as @kbd{C-x} or @key{ESC} has its own keymap,
+which holds the definition for the event that immediately follows
+that prefix.
+
+  The definition of a prefix key is usually the keymap to use for
+looking up the following event.  The definition can also be a Lisp
+symbol whose function definition is the following keymap; the effect is
+the same, but it provides a command name for the prefix key that can be
+used as a description of what the prefix key is for.  Thus, the binding
+of @kbd{C-x} is the symbol @code{Control-X-prefix}, whose function
+definition is the keymap for @kbd{C-x} commands.  The definitions of
+@kbd{C-c}, @kbd{C-x}, @kbd{C-h} and @key{ESC} as prefix keys appear in
+the global map, so these prefix keys are always available.
+
+  Aside from ordinary prefix keys, there is a fictitious ``prefix key''
+which represents the menu bar; see @ref{Menu Bar,,,elisp, The Emacs Lisp
+Reference Manual}, for special information about menu bar key bindings.
+Mouse button events that invoke pop-up menus are also prefix keys; see
+@ref{Menu Keymaps,,,elisp, The Emacs Lisp Reference Manual}, for more
+details.
+
+  Some prefix keymaps are stored in variables with names:
+
+@itemize @bullet
+@item
+@vindex ctl-x-map
+@code{ctl-x-map} is the variable name for the map used for characters that
+follow @kbd{C-x}.
+@item
+@vindex help-map
+@code{help-map} is for characters that follow @kbd{C-h}.
+@item
+@vindex esc-map
+@code{esc-map} is for characters that follow @key{ESC}.  Thus, all Meta
+characters are actually defined by this map.
+@item
+@vindex ctl-x-4-map
+@code{ctl-x-4-map} is for characters that follow @kbd{C-x 4}.
+@item
+@vindex mode-specific-map
+@code{mode-specific-map} is for characters that follow @kbd{C-c}.
+@end itemize
+
+@node Local Keymaps
+@subsection Local Keymaps
+
+@cindex local keymap
+  So far we have explained the ins and outs of the global map.  Major
+modes customize Emacs by providing their own key bindings in @dfn{local
+keymaps}.  For example, C mode overrides @key{TAB} to make it indent the
+current line for C code.  Portions of text in the buffer can specify
+their own keymaps to substitute for the keymap of the buffer's major
+mode.
+
+@cindex minor mode keymap
+  Minor modes can also have local keymaps.  Whenever a minor mode is
+in effect, the definitions in its keymap override both the major
+mode's local keymap and the global keymap.
+
+  A local keymap can locally redefine a key as a prefix key by defining
+it as a prefix keymap.  If the key is also defined globally as a prefix,
+then its local and global definitions (both keymaps) effectively
+combine: both of them are used to look up the event that follows the
+prefix key.  Thus, if the mode's local keymap defines @kbd{C-c} as
+another keymap, and that keymap defines @kbd{C-z} as a command, this
+provides a local meaning for @kbd{C-c C-z}.  This does not affect other
+sequences that start with @kbd{C-c}; if those sequences don't have their
+own local bindings, their global bindings remain in effect.
+
+  Another way to think of this is that Emacs handles a multi-event key
+sequence by looking in several keymaps, one by one, for a binding of the
+whole key sequence.  First it checks the minor mode keymaps for minor
+modes that are enabled, then it checks the major mode's keymap, and then
+it checks the global keymap.  This is not precisely how key lookup
+works, but it's good enough for understanding the results in ordinary
+circumstances.
+
+@cindex rebinding major mode keys
+  Most major modes construct their keymaps when the mode is used for
+the first time in a session.  If you wish to change one of these
+keymaps, you must use the major mode's @dfn{mode hook}
+(@pxref{Hooks}).
+
+@findex define-key
+  For example, the command @code{texinfo-mode} to select Texinfo mode
+runs the hook @code{texinfo-mode-hook}.  Here's how you can use the hook
+to add local bindings (not very useful, we admit) for @kbd{C-c n} and
+@kbd{C-c p} in Texinfo mode:
+
+@example
+(add-hook 'texinfo-mode-hook
+          '(lambda ()
+             (define-key texinfo-mode-map "\C-cp"
+                         'backward-paragraph)
+             (define-key texinfo-mode-map "\C-cn"
+                         'forward-paragraph)))
+@end example
+
+@node Minibuffer Maps
+@subsection Minibuffer Keymaps
+
+@cindex minibuffer keymaps
+@vindex minibuffer-local-map
+@vindex minibuffer-local-ns-map
+@vindex minibuffer-local-completion-map
+@vindex minibuffer-local-must-match-map
+@vindex minibuffer-local-filename-completion-map
+@vindex minibuffer-local-must-match-filename-map
+  The minibuffer has its own set of local keymaps; they contain various
+completion and exit commands.
+
+@itemize @bullet
+@item
+@code{minibuffer-local-map} is used for ordinary input (no completion).
+@item
+@code{minibuffer-local-ns-map} is similar, except that @key{SPC} exits
+just like @key{RET}.  This is used mainly for Mocklisp compatibility.
+@item
+@code{minibuffer-local-completion-map} is for permissive completion.
+@item
+@code{minibuffer-local-must-match-map} is for strict completion and
+for cautious completion.
+@item
+Finally, @code{minibuffer-local-filename-completion-map} and
+@code{minibuffer-local-must-match-filename-map} are like the two
+previous ones, but they are specifically for file name completion.
+They do not bind @key{SPC}.
+@end itemize
+
+@node Rebinding
+@subsection Changing Key Bindings Interactively
+@cindex key rebinding, this session
+@cindex redefining keys, this session
+
+  The way to redefine an Emacs key is to change its entry in a keymap.
+You can change the global keymap, in which case the change is effective in
+all major modes (except those that have their own overriding local
+definitions for the same key).  Or you can change the current buffer's
+local map, which affects all buffers using the same major mode.
+
+@findex global-set-key
+@findex local-set-key
+@findex global-unset-key
+@findex local-unset-key
+@table @kbd
+@item M-x global-set-key @key{RET} @var{key} @var{cmd} @key{RET}
+Define @var{key} globally to run @var{cmd}.
+@item M-x local-set-key @key{RET} @var{key} @var{cmd} @key{RET}
+Define @var{key} locally (in the major mode now in effect) to run
+@var{cmd}.
+@item M-x global-unset-key @key{RET} @var{key}
+Make @var{key} undefined in the global map.
+@item M-x local-unset-key @key{RET} @var{key}
+Make @var{key} undefined locally (in the major mode now in effect).
+@end table
+
+  For example, suppose you like to execute commands in a subshell within
+an Emacs buffer, instead of suspending Emacs and executing commands in
+your login shell.  Normally, @kbd{C-z} is bound to the function
+@code{suspend-emacs} (when not using the X Window System), but you can
+change @kbd{C-z} to invoke an interactive subshell within Emacs, by
+binding it to @code{shell} as follows:
+
+@example
+M-x global-set-key @key{RET} C-z shell @key{RET}
+@end example
+
+@noindent
+@code{global-set-key} reads the command name after the key.   After you
+press the key, a message like this appears so that you can confirm that
+you are binding the key you want:
+
+@example
+Set key C-z to command:
+@end example
+
+  You can redefine function keys and mouse events in the same way; just
+type the function key or click the mouse when it's time to specify the
+key to rebind.
+
+  You can rebind a key that contains more than one event in the same
+way.  Emacs keeps reading the key to rebind until it is a complete key
+(that is, not a prefix key).  Thus, if you type @kbd{C-f} for
+@var{key}, that's the end; it enters the minibuffer immediately to
+read @var{cmd}.  But if you type @kbd{C-x}, since that's a prefix, it
+reads another character; if that is @kbd{4}, another prefix character,
+it reads one more character, and so on.  For example,
+
+@example
+M-x global-set-key @key{RET} C-x 4 $ spell-other-window @key{RET}
+@end example
+
+@noindent
+redefines @kbd{C-x 4 $} to run the (fictitious) command
+@code{spell-other-window}.
+
+  The two-character keys consisting of @kbd{C-c} followed by a letter
+are reserved for user customizations.  Lisp programs are not supposed to
+define these keys, so the bindings you make for them will be available
+in all major modes and will never get in the way of anything.
+
+  You can remove the global definition of a key with
+@code{global-unset-key}.  This makes the key @dfn{undefined}; if you
+type it, Emacs will just beep.  Similarly, @code{local-unset-key} makes
+a key undefined in the current major mode keymap, which makes the global
+definition (or lack of one) come back into effect in that major mode.
+
+  If you have redefined (or undefined) a key and you subsequently wish
+to retract the change, undefining the key will not do the job---you need
+to redefine the key with its standard definition.  To find the name of
+the standard definition of a key, go to a Fundamental mode buffer in a
+fresh Emacs and use @kbd{C-h c}.  The documentation of keys in this
+manual also lists their command names.
+
+  If you want to prevent yourself from invoking a command by mistake, it
+is better to disable the command than to undefine the key.  A disabled
+command is less work to invoke when you really want to.
+@xref{Disabling}.
+
+@node Init Rebinding
+@subsection Rebinding Keys in Your Init File
+
+  If you have a set of key bindings that you like to use all the time,
+you can specify them in your @file{.emacs} file by using their Lisp
+syntax.  (@xref{Init File}.)
+
+  The simplest method for doing this works for @acronym{ASCII} characters and
+Meta-modified @acronym{ASCII} characters only.  This method uses a string to
+represent the key sequence you want to rebind.  For example, here's how
+to bind @kbd{C-z} to @code{shell}:
+
+@example
+(global-set-key "\C-z" 'shell)
+@end example
+
+@noindent
+This example uses a string constant containing one character,
+@kbd{C-z}.  (@samp{\C-} is string syntax for a control character.)  The
+single-quote before the command name, @code{shell}, marks it as a
+constant symbol rather than a variable.  If you omit the quote, Emacs
+would try to evaluate @code{shell} immediately as a variable.  This
+probably causes an error; it certainly isn't what you want.
+
+  Here is another example that binds the key sequence @kbd{C-x M-l}:
+
+@example
+(global-set-key "\C-x\M-l" 'make-symbolic-link)
+@end example
+
+  To put @key{TAB}, @key{RET}, @key{ESC}, or @key{DEL} in the
+string, you can use the Emacs Lisp escape sequences, @samp{\t},
+@samp{\r}, @samp{\e}, and @samp{\d}.  Here is an example which binds
+@kbd{C-x @key{TAB}}:
+
+@example
+(global-set-key "\C-x\t" 'indent-rigidly)
+@end example
+
+  These examples show how to write some other special @acronym{ASCII} characters
+in strings for key bindings:
+
+@example
+(global-set-key "\r" 'newline)               ;; @key{RET}
+(global-set-key "\d" 'delete-backward-char)  ;; @key{DEL}
+(global-set-key "\C-x\e\e" 'repeat-complex-command)  ;; @key{ESC}
+@end example
+
+  When the key sequence includes function keys or mouse button events,
+or non-@acronym{ASCII} characters such as @code{C-=} or @code{H-a}, you must use
+the more general method of rebinding, which uses a vector to specify the
+key sequence.
+
+  The way to write a vector in Emacs Lisp is with square brackets around
+the vector elements.  Use spaces to separate the elements.  If an
+element is a symbol, simply write the symbol's name---no other
+delimiters or punctuation are needed.  If a vector element is a
+character, write it as a Lisp character constant: @samp{?} followed by
+the character as it would appear in a string.
+
+  Here are examples of using vectors to rebind @kbd{C-=} (a control
+character not in @acronym{ASCII}), @kbd{C-M-=} (not in @acronym{ASCII} because @kbd{C-=}
+is not), @kbd{H-a} (a Hyper character; @acronym{ASCII} doesn't have Hyper at
+all), @key{F7} (a function key), and @kbd{C-Mouse-1} (a
+keyboard-modified mouse button):
+
+@example
+(global-set-key [?\C-=] 'make-symbolic-link)
+(global-set-key [?\M-\C-=] 'make-symbolic-link)
+(global-set-key [?\H-a] 'make-symbolic-link)
+(global-set-key [f7] 'make-symbolic-link)
+(global-set-key [C-mouse-1] 'make-symbolic-link)
+@end example
+
+  You can use a vector for the simple cases too.  Here's how to
+rewrite the first six examples above to use vectors:
+
+@example
+(global-set-key [?\C-z] 'shell)
+(global-set-key [?\C-x ?l] 'make-symbolic-link)
+(global-set-key [?\C-x ?\t] 'indent-rigidly)
+(global-set-key [?\r] 'newline)
+(global-set-key [?\d] 'delete-backward-char)
+(global-set-key [?\C-x ?\e ?\e] 'repeat-complex-command)
+@end example
+
+@noindent
+As you see, you represent a multi-character key sequence with a vector
+by listing all of the characters, in order, within the square brackets
+that delimit the vector.
+
+  Language and coding systems can cause problems with key bindings
+for non-@acronym{ASCII} characters.  @xref{Init Non-ASCII}.
+
+@node Function Keys
+@subsection Rebinding Function Keys
+
+  Key sequences can contain function keys as well as ordinary
+characters.  Just as Lisp characters (actually integers) represent
+keyboard characters, Lisp symbols represent function keys.  If the
+function key has a word as its label, then that word is also the name of
+the corresponding Lisp symbol.  Here are the conventional Lisp names for
+common function keys:
+
+@table @asis
+@item @code{left}, @code{up}, @code{right}, @code{down}
+Cursor arrow keys.
+
+@item @code{begin}, @code{end}, @code{home}, @code{next}, @code{prior}
+Other cursor repositioning keys.
+
+@item @code{select}, @code{print}, @code{execute}, @code{backtab}
+@itemx @code{insert}, @code{undo}, @code{redo}, @code{clearline}
+@itemx @code{insertline}, @code{deleteline}, @code{insertchar}, @code{deletechar}
+Miscellaneous function keys.
+
+@item @code{f1}, @code{f2}, @dots{} @code{f35}
+Numbered function keys (across the top of the keyboard).
+
+@item @code{kp-add}, @code{kp-subtract}, @code{kp-multiply}, @code{kp-divide}
+@itemx @code{kp-backtab}, @code{kp-space}, @code{kp-tab}, @code{kp-enter}
+@itemx @code{kp-separator}, @code{kp-decimal}, @code{kp-equal}
+Keypad keys (to the right of the regular keyboard), with names or punctuation.
+
+@item @code{kp-0}, @code{kp-1}, @dots{} @code{kp-9}
+Keypad keys with digits.
+
+@item @code{kp-f1}, @code{kp-f2}, @code{kp-f3}, @code{kp-f4}
+Keypad PF keys.
+@end table
+
+  These names are conventional, but some systems (especially when using
+X) may use different names.  To make certain what symbol is used for a
+given function key on your terminal, type @kbd{C-h c} followed by that
+key.
+
+  A key sequence which contains function key symbols (or anything but
+@acronym{ASCII} characters) must be a vector rather than a string.
+Thus, to bind function key @samp{f1} to the command @code{rmail},
+write the following:
+
+@example
+(global-set-key [f1] 'rmail)
+@end example
+
+@noindent
+To bind the right-arrow key to the command @code{forward-char}, you can
+use this expression:
+
+@example
+(global-set-key [right] 'forward-char)
+@end example
+
+@noindent
+This uses the Lisp syntax for a vector containing the symbol
+@code{right}.  (This binding is present in Emacs by default.)
+
+  @xref{Init Rebinding}, for more information about using vectors for
+rebinding.
+
+  You can mix function keys and characters in a key sequence.  This
+example binds @kbd{C-x @key{NEXT}} to the command @code{forward-page}.
+
+@example
+(global-set-key [?\C-x next] 'forward-page)
+@end example
+
+@noindent
+where @code{?\C-x} is the Lisp character constant for the character
+@kbd{C-x}.  The vector element @code{next} is a symbol and therefore
+does not take a question mark.
+
+  You can use the modifier keys @key{CTRL}, @key{META}, @key{HYPER},
+@key{SUPER}, @key{ALT} and @key{SHIFT} with function keys.  To represent
+these modifiers, add the strings @samp{C-}, @samp{M-}, @samp{H-},
+@samp{s-}, @samp{A-} and @samp{S-} at the front of the symbol name.
+Thus, here is how to make @kbd{Hyper-Meta-@key{RIGHT}} move forward a
+word:
+
+@example
+(global-set-key [H-M-right] 'forward-word)
+@end example
+
+@cindex keypad
+  Many keyboards have a ``numeric keypad'' on the right hand side.
+The numeric keys in the keypad double up as cursor motion keys,
+toggled by a key labeled @samp{Num Lock}.  By default, Emacs
+translates these keys to the corresponding keys in the main keyboard.
+For example, when @samp{Num Lock} is on, the key labeled @samp{8} on
+the numeric keypad produces @code{kp-8}, which is translated to
+@kbd{8}; when @samp{Num Lock} is off, the same key produces
+@code{kp-up}, which is translated to @key{UP}.  If you rebind a key
+such as @kbd{8} or @key{UP}, it affects the equivalent keypad key too.
+However, if you rebind a @samp{kp-} key directly, that won't affect
+its non-keypad equivalent.
+
+  Emacs provides a convenient method for binding the numeric keypad
+keys, using the variables @code{keypad-setup},
+@code{keypad-numlock-setup}, @code{keypad-shifted-setup}, and
+@code{keypad-numlock-shifted-setup}.  These can be found in the
+@samp{keyboard} customization group (@pxref{Easy Customization}).  You
+can rebind the keys to perform other tasks, such as issuing numeric
+prefix arguments.
+
+@node Named ASCII Chars
+@subsection Named @acronym{ASCII} Control Characters
+
+  @key{TAB}, @key{RET}, @key{BS}, @key{LFD}, @key{ESC} and @key{DEL}
+started out as names for certain @acronym{ASCII} control characters,
+used so often that they have special keys of their own.  For instance,
+@key{TAB} was another name for @kbd{C-i}.  Later, users found it
+convenient to distinguish in Emacs between these keys and the ``same''
+control characters typed with the @key{CTRL} key.  Therefore, on most
+modern terminals, they are no longer the same, and @key{TAB} is
+distinguishable from @kbd{C-i}.
+
+  Emacs can distinguish these two kinds of input if the keyboard does.
+It treats the ``special'' keys as function keys named @code{tab},
+@code{return}, @code{backspace}, @code{linefeed}, @code{escape}, and
+@code{delete}.  These function keys translate automatically into the
+corresponding @acronym{ASCII} characters @emph{if} they have no
+bindings of their own.  As a result, neither users nor Lisp programs
+need to pay attention to the distinction unless they care to.
+
+  If you do not want to distinguish between (for example) @key{TAB} and
+@kbd{C-i}, make just one binding, for the @acronym{ASCII} character @key{TAB}
+(octal code 011).  If you do want to distinguish, make one binding for
+this @acronym{ASCII} character, and another for the ``function key'' @code{tab}.
+
+  With an ordinary @acronym{ASCII} terminal, there is no way to distinguish
+between @key{TAB} and @kbd{C-i} (and likewise for other such pairs),
+because the terminal sends the same character in both cases.
+
+@node Mouse Buttons
+@subsection Rebinding Mouse Buttons
+@cindex mouse button events
+@cindex rebinding mouse buttons
+@cindex click events
+@cindex drag events
+@cindex down events
+@cindex button down events
+
+  Emacs uses Lisp symbols to designate mouse buttons, too.  The ordinary
+mouse events in Emacs are @dfn{click} events; these happen when you
+press a button and release it without moving the mouse.  You can also
+get @dfn{drag} events, when you move the mouse while holding the button
+down.  Drag events happen when you finally let go of the button.
+
+  The symbols for basic click events are @code{mouse-1} for the leftmost
+button, @code{mouse-2} for the next, and so on.  Here is how you can
+redefine the second mouse button to split the current window:
+
+@example
+(global-set-key [mouse-2] 'split-window-vertically)
+@end example
+
+  The symbols for drag events are similar, but have the prefix
+@samp{drag-} before the word @samp{mouse}.  For example, dragging the
+first button generates a @code{drag-mouse-1} event.
+
+  You can also define bindings for events that occur when a mouse button
+is pressed down.  These events start with @samp{down-} instead of
+@samp{drag-}.  Such events are generated only if they have key bindings.
+When you get a button-down event, a corresponding click or drag event
+will always follow.
+
+@cindex double clicks
+@cindex triple clicks
+  If you wish, you can distinguish single, double, and triple clicks.  A
+double click means clicking a mouse button twice in approximately the
+same place.  The first click generates an ordinary click event.  The
+second click, if it comes soon enough, generates a double-click event
+instead.  The event type for a double-click event starts with
+@samp{double-}: for example, @code{double-mouse-3}.
+
+  This means that you can give a special meaning to the second click at
+the same place, but it must act on the assumption that the ordinary
+single click definition has run when the first click was received.
+
+  This constrains what you can do with double clicks, but user interface
+designers say that this constraint ought to be followed in any case.  A
+double click should do something similar to the single click, only
+``more so.''  The command for the double-click event should perform the
+extra work for the double click.
+
+  If a double-click event has no binding, it changes to the
+corresponding single-click event.  Thus, if you don't define a
+particular double click specially, it executes the single-click command
+twice.
+
+  Emacs also supports triple-click events whose names start with
+@samp{triple-}.  Emacs does not distinguish quadruple clicks as event
+types; clicks beyond the third generate additional triple-click events.
+However, the full number of clicks is recorded in the event list, so
+if you know Emacs Lisp you can distinguish if you really want to
+(@pxref{Accessing Events,,, elisp, The Emacs Lisp Reference Manual}).
+We don't recommend distinct meanings for more than three clicks, but
+sometimes it is useful for subsequent clicks to cycle through the same
+set of three meanings, so that four clicks are equivalent to one
+click, five are equivalent to two, and six are equivalent to three.
+
+  Emacs also records multiple presses in drag and button-down events.
+For example, when you press a button twice, then move the mouse while
+holding the button, Emacs gets a @samp{double-drag-} event.  And at the
+moment when you press it down for the second time, Emacs gets a
+@samp{double-down-} event (which is ignored, like all button-down
+events, if it has no binding).
+
+@vindex double-click-time
+  The variable @code{double-click-time} specifies how much time can
+elapse between clicks and still allow them to be grouped as a multiple
+click.  Its value is in units of milliseconds.  If the value is
+@code{nil}, double clicks are not detected at all.  If the value is
+@code{t}, then there is no time limit.  The default is 500.
+
+@vindex double-click-fuzz
+  The variable @code{double-click-fuzz} specifies how much the mouse
+can move between clicks and still allow them to be grouped as a multiple
+click.  Its value is in units of pixels on windowed displays and in
+units of 1/8 of a character cell on text-mode terminals; the default is
+3.
+
+  The symbols for mouse events also indicate the status of the modifier
+keys, with the usual prefixes @samp{C-}, @samp{M-}, @samp{H-},
+@samp{s-}, @samp{A-} and @samp{S-}.  These always precede @samp{double-}
+or @samp{triple-}, which always precede @samp{drag-} or @samp{down-}.
+
+  A frame includes areas that don't show text from the buffer, such as
+the mode line and the scroll bar.  You can tell whether a mouse button
+comes from a special area of the screen by means of dummy ``prefix
+keys.''  For example, if you click the mouse in the mode line, you get
+the prefix key @code{mode-line} before the ordinary mouse-button symbol.
+Thus, here is how to define the command for clicking the first button in
+a mode line to run @code{scroll-up}:
+
+@example
+(global-set-key [mode-line mouse-1] 'scroll-up)
+@end example
+
+  Here is the complete list of these dummy prefix keys and their
+meanings:
+
+@table @code
+@item mode-line
+The mouse was in the mode line of a window.
+@item vertical-line
+The mouse was in the vertical line separating side-by-side windows.  (If
+you use scroll bars, they appear in place of these vertical lines.)
+@item vertical-scroll-bar
+The mouse was in a vertical scroll bar.  (This is the only kind of
+scroll bar Emacs currently supports.)
+@item menu-bar
+The mouse was in the menu bar.
+@item header-line
+The mouse was in a header line.
+@ignore
+@item horizontal-scroll-bar
+The mouse was in a horizontal scroll bar.  Horizontal scroll bars do
+horizontal scrolling, and people don't use them often.
+@end ignore
+@end table
+
+  You can put more than one mouse button in a key sequence, but it isn't
+usual to do so.
+
+@node Disabling
+@subsection Disabling Commands
+@cindex disabled command
+
+  Disabling a command means that invoking it interactively asks for
+confirmation from the user.  The purpose of disabling a command is to
+prevent users from executing it by accident; we do this for commands
+that might be confusing to the uninitiated.
+
+  Attempting to invoke a disabled command interactively in Emacs
+displays a window containing the command's name, its documentation,
+and some instructions on what to do immediately; then Emacs asks for
+input saying whether to execute the command as requested, enable it
+and execute it, or cancel.  If you decide to enable the command, you
+must then answer another question---whether to do this permanently, or
+just for the current session.  (Enabling permanently works by
+automatically editing your @file{.emacs} file.)  You can also type
+@kbd{!} to enable @emph{all} commands, for the current session only.
+
+  The direct mechanism for disabling a command is to put a
+non-@code{nil} @code{disabled} property on the Lisp symbol for the
+command.  Here is the Lisp program to do this:
+
+@example
+(put 'delete-region 'disabled t)
+@end example
+
+  If the value of the @code{disabled} property is a string, that string
+is included in the message displayed when the command is used:
+
+@example
+(put 'delete-region 'disabled
+     "It's better to use `kill-region' instead.\n")
+@end example
+
+@findex disable-command
+@findex enable-command
+  You can make a command disabled either by editing the @file{.emacs}
+file directly, or with the command @kbd{M-x disable-command}, which edits
+the @file{.emacs} file for you.  Likewise, @kbd{M-x enable-command}
+edits @file{.emacs} to enable a command permanently.  @xref{Init File}.
+
+  If Emacs was invoked with the @option{-q} or @option{--no-init-file}
+options (@pxref{Initial Options}), it will not edit your
+@file{~/.emacs} init file.  Doing so could lose information
+because Emacs has not read your init file.
+
+  Whether a command is disabled is independent of what key is used to
+invoke it; disabling also applies if the command is invoked using
+@kbd{M-x}.  However, disabling a command has no effect on calling it
+as a function from Lisp programs.
+
+@node Syntax
+@section The Syntax Table
+@cindex syntax table
+
+  All the Emacs commands which parse words or balance parentheses are
+controlled by the @dfn{syntax table}.  The syntax table says which
+characters are opening delimiters, which are parts of words, which are
+string quotes, and so on.  It does this by assigning each character to
+one of fifteen-odd @dfn{syntax classes}.  In some cases it specifies
+some additional information also.
+
+  Each major mode has its own syntax table (though related major modes
+sometimes share one syntax table), which it installs in each buffer
+that uses the mode.  The syntax table installed in the current buffer
+is the one that all commands use, so we call it ``the'' syntax table.
+
+@kindex C-h s
+@findex describe-syntax
+  To display a description of the contents of the current syntax
+table, type @kbd{C-h s} (@code{describe-syntax}).  The description of
+each character includes the string you would have to give to
+@code{modify-syntax-entry} to set up that character's current syntax,
+starting with the character which designates its syntax class, plus
+some English text to explain its meaning.
+
+  A syntax table is actually a Lisp object, a char-table, whose
+elements are cons cells.  For full information on the syntax table,
+see @ref{Syntax Tables,, Syntax Tables, elisp, The Emacs Lisp
+Reference Manual}.
+
+@node Init File
+@section The Init File, @file{~/.emacs}
+@cindex init file
+@cindex Emacs initialization file
+@cindex key rebinding, permanent
+@cindex rebinding keys, permanently
+@cindex startup (init file)
+
+  When Emacs is started, it normally loads a Lisp program from the file
+@file{.emacs} or @file{.emacs.el} in your home directory (@pxref{Find Init}).
+We call this file your @dfn{init file} because it specifies how to
+initialize Emacs for you.  You can use the command line switch
+@samp{-q} to prevent loading your init file, and @samp{-u} (or
+@samp{--user}) to specify a different user's init file (@pxref{Initial
+Options}).
+
+  You can also use @file{~/.emacs.d/init.el} as the init file.  Emacs
+tries this if it cannot find @file{~/.emacs} or @file{~/.emacs.el}.
+
+@cindex @file{default.el}, the default init file
+  There can also be a @dfn{default init file}, which is the library
+named @file{default.el}, found via the standard search path for
+libraries.  The Emacs distribution contains no such library; your site
+may create one for local customizations.  If this library exists, it is
+loaded whenever you start Emacs (except when you specify @samp{-q}).
+But your init file, if any, is loaded first; if it sets
+@code{inhibit-default-init} non-@code{nil}, then @file{default} is not
+loaded.
+
+@cindex site init file
+@cindex @file{site-start.el}, the site startup file
+  Your site may also have a @dfn{site startup file}; this is named
+@file{site-start.el}, if it exists.  Like @file{default.el}, Emacs
+finds this file via the standard search path for Lisp libraries.
+Emacs loads this library before it loads your init file.  To inhibit
+loading of this library, use the option @samp{--no-site-file}.
+@xref{Initial Options}.  We recommend against using
+@file{site-start.el} for changes that some users may not like.  It is
+better to put them in @file{default.el}, so that users can more easily
+override them.
+
+  You can place @file{default.el} and @file{site-start.el} in any of
+the directories which Emacs searches for Lisp libraries.  The variable
+@code{load-path} (@pxref{Lisp Libraries}) specifies these directories.
+Many sites put these files in the @file{site-lisp} subdirectory of the
+Emacs installation directory, typically
+@file{/usr/local/share/emacs/site-lisp}.
+
+  If you have a large amount of code in your @file{.emacs} file, you
+should rename it to @file{~/.emacs.el}, and byte-compile it.  @xref{Byte
+Compilation,, Byte Compilation, elisp, the Emacs Lisp Reference Manual},
+for more information about compiling Emacs Lisp programs.
+
+  If you are going to write actual Emacs Lisp programs that go beyond
+minor customization, you should read the @cite{Emacs Lisp Reference Manual}.
+@ifnottex
+@xref{Top, Emacs Lisp, Emacs Lisp, elisp, the Emacs Lisp Reference
+Manual}.
+@end ifnottex
+
+@menu
+* Init Syntax::                Syntax of constants in Emacs Lisp.
+* Init Examples::       How to do some things with an init file.
+* Terminal Init::       Each terminal type can have an init file.
+* Find Init::          How Emacs finds the init file.
+* Init Non-ASCII::      Using non-@acronym{ASCII} characters in an init file.
+@end menu
+
+@node Init Syntax
+@subsection Init File Syntax
+
+  The @file{.emacs} file contains one or more Lisp function call
+expressions.  Each of these consists of a function name followed by
+arguments, all surrounded by parentheses.  For example, @code{(setq
+fill-column 60)} calls the function @code{setq} to set the variable
+@code{fill-column} (@pxref{Filling}) to 60.
+
+  You can set any Lisp variable with @code{setq}, but with certain
+variables @code{setq} won't do what you probably want in the
+@file{.emacs} file.  Some variables automatically become buffer-local
+when set with @code{setq}; what you want in @file{.emacs} is to set
+the default value, using @code{setq-default}.  Some customizable minor
+mode variables do special things to enable the mode when you set them
+with Customize, but ordinary @code{setq} won't do that; to enable the
+mode in your @file{.emacs} file, call the minor mode command.  The
+following section has examples of both of these methods.
+
+  The second argument to @code{setq} is an expression for the new
+value of the variable.  This can be a constant, a variable, or a
+function call expression.  In @file{.emacs}, constants are used most
+of the time.  They can be:
+
+@table @asis
+@item Numbers:
+Numbers are written in decimal, with an optional initial minus sign.
+
+@item Strings:
+@cindex Lisp string syntax
+@cindex string syntax
+Lisp string syntax is the same as C string syntax with a few extra
+features.  Use a double-quote character to begin and end a string constant.
+
+In a string, you can include newlines and special characters literally.
+But often it is cleaner to use backslash sequences for them: @samp{\n}
+for newline, @samp{\b} for backspace, @samp{\r} for carriage return,
+@samp{\t} for tab, @samp{\f} for formfeed (control-L), @samp{\e} for
+escape, @samp{\\} for a backslash, @samp{\"} for a double-quote, or
+@samp{\@var{ooo}} for the character whose octal code is @var{ooo}.
+Backslash and double-quote are the only characters for which backslash
+sequences are mandatory.
+
+@samp{\C-} can be used as a prefix for a control character, as in
+@samp{\C-s} for @acronym{ASCII} control-S, and @samp{\M-} can be used as a prefix for
+a Meta character, as in @samp{\M-a} for @kbd{Meta-A} or @samp{\M-\C-a} for
+@kbd{Control-Meta-A}.@refill
+
+@xref{Init Non-ASCII}, for information about including
+non-@acronym{ASCII} in your init file.
+
+@item Characters:
+Lisp character constant syntax consists of a @samp{?} followed by
+either a character or an escape sequence starting with @samp{\}.
+Examples: @code{?x}, @code{?\n}, @code{?\"}, @code{?\)}.  Note that
+strings and characters are not interchangeable in Lisp; some contexts
+require one and some contexts require the other.
+
+@xref{Init Non-ASCII}, for information about binding commands to
+keys which send non-@acronym{ASCII} characters.
+
+@item True:
+@code{t} stands for `true'.
+
+@item False:
+@code{nil} stands for `false'.
+
+@item Other Lisp objects:
+Write a single-quote (@code{'}) followed by the Lisp object you want.
+@end table
+
+@node Init Examples
+@subsection Init File Examples
+
+  Here are some examples of doing certain commonly desired things with
+Lisp expressions:
+
+@itemize @bullet
+@item
+Make @key{TAB} in C mode just insert a tab if point is in the middle of a
+line.
+
+@example
+(setq c-tab-always-indent nil)
+@end example
+
+Here we have a variable whose value is normally @code{t} for `true'
+and the alternative is @code{nil} for `false'.
+
+@item
+Make searches case sensitive by default (in all buffers that do not
+override this).
+
+@example
+(setq-default case-fold-search nil)
+@end example
+
+This sets the default value, which is effective in all buffers that do
+not have local values for the variable.  Setting @code{case-fold-search}
+with @code{setq} affects only the current buffer's local value, which
+is not what you probably want to do in an init file.
+
+@item
+@vindex user-mail-address
+Specify your own email address, if Emacs can't figure it out correctly.
+
+@example
+(setq user-mail-address "rumsfeld@@torture.gov")
+@end example
+
+Various Emacs packages that need your own email address use the value of
+@code{user-mail-address}.
+
+@item
+Make Text mode the default mode for new buffers.
+
+@example
+(setq default-major-mode 'text-mode)
+@end example
+
+Note that @code{text-mode} is used because it is the command for
+entering Text mode.  The single-quote before it makes the symbol a
+constant; otherwise, @code{text-mode} would be treated as a variable
+name.
+
+@need 1500
+@item
+Set up defaults for the Latin-1 character set
+which supports most of the languages of Western Europe.
+
+@example
+(set-language-environment "Latin-1")
+@end example
+
+@need 1500
+@item
+Turn off Line Number mode, a global minor mode.
+
+@example
+(line-number-mode 0)
+@end example
+
+@need 1500
+@item
+Turn on Auto Fill mode automatically in Text mode and related modes.
+
+@example
+(add-hook 'text-mode-hook
+  '(lambda () (auto-fill-mode 1)))
+@end example
+
+This shows how to add a hook function to a normal hook variable
+(@pxref{Hooks}).  The function we supply is a list starting with
+@code{lambda}, with a single-quote in front of it to make it a list
+constant rather than an expression.
+
+It's beyond the scope of this manual to explain Lisp functions, but for
+this example it is enough to know that the effect is to execute
+@code{(auto-fill-mode 1)} when Text mode is entered.  You can replace
+that with any other expression that you like, or with several
+expressions in a row.
+
+Emacs comes with a function named @code{turn-on-auto-fill} whose
+definition is @code{(lambda () (auto-fill-mode 1))}.  Thus, a simpler
+way to write the above example is as follows:
+
+@example
+(add-hook 'text-mode-hook 'turn-on-auto-fill)
+@end example
+
+@item
+Load the installed Lisp library named @file{foo} (actually a file
+@file{foo.elc} or @file{foo.el} in a standard Emacs directory).
+
+@example
+(load "foo")
+@end example
+
+When the argument to @code{load} is a relative file name, not starting
+with @samp{/} or @samp{~}, @code{load} searches the directories in
+@code{load-path} (@pxref{Lisp Libraries}).
+
+@item
+Load the compiled Lisp file @file{foo.elc} from your home directory.
+
+@example
+(load "~/foo.elc")
+@end example
+
+Here an absolute file name is used, so no searching is done.
+
+@item
+@cindex loading Lisp libraries automatically
+@cindex autoload Lisp libraries
+Tell Emacs to find the definition for the function @code{myfunction}
+by loading a Lisp library named @file{mypackage} (i.e.@: a file
+@file{mypackage.elc} or @file{mypackage.el}):
+
+@example
+(autoload 'myfunction "mypackage" "Do what I say." t)
+@end example
+
+@noindent
+Here the string @code{"Do what I say."} is the function's
+documentation string.  You specify it in the @code{autoload}
+definition so it will be available for help commands even when the
+package is not loaded.  The last argument, @code{t}, indicates that
+this function is interactive; that is, it can be invoked interactively
+by typing @kbd{M-x myfunction @key{RET}} or by binding it to a key.
+If the function is not interactive, omit the @code{t} or use
+@code{nil}.
+
+@item
+Rebind the key @kbd{C-x l} to run the function @code{make-symbolic-link}
+(@pxref{Init Rebinding}).
+
+@example
+(global-set-key "\C-xl" 'make-symbolic-link)
+@end example
+
+or
+
+@example
+(define-key global-map "\C-xl" 'make-symbolic-link)
+@end example
+
+Note once again the single-quote used to refer to the symbol
+@code{make-symbolic-link} instead of its value as a variable.
+
+@item
+Do the same thing for Lisp mode only.
+
+@example
+(define-key lisp-mode-map "\C-xl" 'make-symbolic-link)
+@end example
+
+@item
+Redefine all keys which now run @code{next-line} in Fundamental mode
+so that they run @code{forward-line} instead.
+
+@findex substitute-key-definition
+@example
+(substitute-key-definition 'next-line 'forward-line
+                           global-map)
+@end example
+
+@item
+Make @kbd{C-x C-v} undefined.
+
+@example
+(global-unset-key "\C-x\C-v")
+@end example
+
+One reason to undefine a key is so that you can make it a prefix.
+Simply defining @kbd{C-x C-v @var{anything}} will make @kbd{C-x C-v} a
+prefix, but @kbd{C-x C-v} must first be freed of its usual non-prefix
+definition.
+
+@item
+Make @samp{$} have the syntax of punctuation in Text mode.
+Note the use of a character constant for @samp{$}.
+
+@example
+(modify-syntax-entry ?\$ "." text-mode-syntax-table)
+@end example
+
+@item
+Enable the use of the command @code{narrow-to-region} without confirmation.
+
+@example
+(put 'narrow-to-region 'disabled nil)
+@end example
+
+@item
+Adjusting the configuration to various platforms and Emacs versions.
+
+Users typically want Emacs to behave the same on all systems, so the
+same init file is right for all platforms.  However, sometimes it
+happens that a function you use for customizing Emacs is not available
+on some platforms or in older Emacs versions.  To deal with that
+situation, put the customization inside a conditional that tests whether
+the function or facility is available, like this:
+
+@example
+(if (fboundp 'blink-cursor-mode)
+    (blink-cursor-mode 0))
+
+(if (boundp 'coding-category-utf-8)
+    (set-coding-priority '(coding-category-utf-8)))
+@end example
+
+@noindent
+You can also simply disregard the errors that occur if the
+function is not defined.
+
+@example
+(condition case ()
+    (set-face-background 'region "grey75")
+  (error nil))
+@end example
+
+A @code{setq} on a variable which does not exist is generally
+harmless, so those do not need a conditional.
+@end itemize
+
+@node Terminal Init
+@subsection Terminal-specific Initialization
+
+  Each terminal type can have a Lisp library to be loaded into Emacs when
+it is run on that type of terminal.  For a terminal type named
+@var{termtype}, the library is called @file{term/@var{termtype}} and it is
+found by searching the directories @code{load-path} as usual and trying the
+suffixes @samp{.elc} and @samp{.el}.  Normally it appears in the
+subdirectory @file{term} of the directory where most Emacs libraries are
+kept.@refill
+
+  The usual purpose of the terminal-specific library is to map the
+escape sequences used by the terminal's function keys onto more
+meaningful names, using @code{input-decode-map} (or
+@code{function-key-map} before it).  See the file
+@file{term/lk201.el} for an example of how this is done.  Many function
+keys are mapped automatically according to the information in the
+Termcap data base; the terminal-specific library needs to map only the
+function keys that Termcap does not specify.
+
+  When the terminal type contains a hyphen, only the part of the name
+before the first hyphen is significant in choosing the library name.
+Thus, terminal types @samp{aaa-48} and @samp{aaa-30-rv} both use
+the library @file{term/aaa}.  The code in the library can use
+@code{(getenv "TERM")} to find the full terminal type name.@refill
+
+@vindex term-file-prefix
+  The library's name is constructed by concatenating the value of the
+variable @code{term-file-prefix} and the terminal type.  Your @file{.emacs}
+file can prevent the loading of the terminal-specific library by setting
+@code{term-file-prefix} to @code{nil}.
+
+@vindex term-setup-hook
+  Emacs runs the hook @code{term-setup-hook} at the end of
+initialization, after both your @file{.emacs} file and any
+terminal-specific library have been read in.  Add hook functions to this
+hook if you wish to override part of any of the terminal-specific
+libraries and to define initializations for terminals that do not have a
+library.  @xref{Hooks}.
+
+@node Find Init
+@subsection How Emacs Finds Your Init File
+
+  Normally Emacs uses the environment variable @env{HOME}
+(@pxref{General Variables, HOME}) to find @file{.emacs}; that's what
+@samp{~} means in a file name.  If @file{.emacs} is not found inside
+@file{~/} (nor @file{.emacs.el}), Emacs looks for
+@file{~/.emacs.d/init.el} (which, like @file{~/.emacs.el}, can be
+byte-compiled).
+
+  However, if you run Emacs from a shell started by @code{su}, Emacs
+tries to find your own @file{.emacs}, not that of the user you are
+currently pretending to be.  The idea is that you should get your own
+editor customizations even if you are running as the super user.
+
+  More precisely, Emacs first determines which user's init file to use.
+It gets your user name from the environment variables @env{LOGNAME} and
+@env{USER}; if neither of those exists, it uses effective user-ID.
+If that user name matches the real user-ID, then Emacs uses @env{HOME};
+otherwise, it looks up the home directory corresponding to that user
+name in the system's data base of users.
+@c  LocalWords:  backtab
+
+@node Init Non-ASCII
+@subsection Non-@acronym{ASCII} Characters in Init Files
+@cindex international characters in @file{.emacs}
+@cindex non-@acronym{ASCII} characters in @file{.emacs}
+@cindex non-@acronym{ASCII} keys, binding
+@cindex rebinding non-@acronym{ASCII} keys
+
+  Language and coding systems may cause problems if your init file
+contains non-@acronym{ASCII} characters, such as accented letters, in
+strings or key bindings.
+
+  If you want to use non-@acronym{ASCII} characters in your init file,
+you should put a @w{@samp{-*-coding: @var{coding-system}-*-}} tag on
+the first line of the init file, and specify a coding system that
+supports the character(s) in question.  @xref{Recognize Coding}.  This
+is because the defaults for decoding non-@acronym{ASCII} text might
+not yet be set up by the time Emacs reads those parts of your init
+file which use such strings, possibly leading Emacs to decode those
+strings incorrectly.  You should then avoid adding Emacs Lisp code
+that modifies the coding system in other ways, such as calls to
+@code{set-language-environment}.
+
+  To bind non-@acronym{ASCII} keys, you must use a vector (@pxref{Init
+Rebinding}).  The string syntax cannot be used, since the
+non-@acronym{ASCII} characters will be interpreted as meta keys.  For
+instance:
+
+@example
+(global-set-key [?@var{char}] 'some-function)
+@end example
+
+@noindent
+Type @kbd{C-q}, followed by the key you want to bind, to insert @var{char}.
+
+  @strong{Warning:} if you change the keyboard encoding, or change
+between multibyte and unibyte mode, or anything that would alter which
+code @kbd{C-q} would insert for that character, this keybinding may
+stop working.  It is therefore advisable to use one and only one
+coding system, for your init file as well as the files you edit.  For
+example, don't mix the @samp{latin-1} and @samp{latin-9} coding
+systems.
+
+@ignore
+   arch-tag: c68abddb-4410-4fb5-925f-63394e971d93
+@end ignore
similarity index 100%
rename from man/dired.texi
rename to doc/emacs/dired.texi
diff --git a/doc/emacs/display.texi b/doc/emacs/display.texi
new file mode 100644 (file)
index 0000000..d4d2945
--- /dev/null
@@ -0,0 +1,1259 @@
+@c This is part of the Emacs manual.
+@c Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995, 1997, 2000, 2001,
+@c   2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+@c See file emacs.texi for copying conditions.
+@node Display, Search, Registers, Top
+@chapter Controlling the Display
+
+  Since only part of a large buffer fits in the window, Emacs tries to
+show a part that is likely to be interesting.  Display-control
+commands allow you to specify which part of the text you want to see,
+and how to display it.  Many variables also affect the details of
+redisplay.  Unless otherwise stated, the variables described in this
+chapter have their effect by customizing redisplay itself; therefore,
+their values only make a difference at the time of redisplay.
+
+@menu
+* Scrolling::             Commands to move text up and down in a window.
+* Auto Scrolling::         Redisplay scrolls text automatically when needed.
+* Horizontal Scrolling::   Moving text left and right in a window.
+* Follow Mode::            Follow mode lets two windows scroll as one.
+* Faces::                 How to change the display style using faces.
+* Standard Faces::         Emacs' predefined faces.
+* Font Lock::              Minor mode for syntactic highlighting using faces.
+* Highlight Interactively:: Tell Emacs what text to highlight.
+* Fringes::                Enabling or disabling window fringes.
+* Displaying Boundaries::  Displaying top and bottom of the buffer.
+* Useless Whitespace::     Showing possibly-spurious trailing whitespace.
+* Selective Display::      Hiding lines with lots of indentation.
+* Optional Mode Line::     Optional mode line display features.
+* Text Display::           How text characters are normally displayed.
+* Cursor Display::         Features for displaying the cursor.
+* Line Truncation::        Truncating lines to fit the screen width instead
+                             of continuing them to multiple screen lines.
+* Display Custom::         Information on variables for customizing display.
+@end menu
+
+@node Scrolling
+@section Scrolling
+
+  If a buffer contains text that is too large to fit entirely within a
+window that is displaying the buffer, Emacs shows a contiguous portion of
+the text.  The portion shown always contains point.
+
+@cindex scrolling
+  @dfn{Scrolling} means moving text up or down in the window so that
+different parts of the text are visible.  Scrolling ``forward'' or
+``up'' means that text moves up, and new text appears at the bottom.
+Scrolling ``backward'' or ``down'' moves text down, and new text
+appears at the top.
+
+  Scrolling happens automatically if you move point past the bottom or
+top of the window.  You can also scroll explicitly with the commands
+in this section.
+
+@table @kbd
+@item C-l
+Clear screen and redisplay, scrolling the selected window to center
+point vertically within it (@code{recenter}).
+@item C-v
+Scroll forward (a windowful or a specified number of lines) (@code{scroll-up}).
+@item @key{NEXT}
+@itemx @key{PAGEDOWN}
+Likewise, scroll forward.
+@item M-v
+Scroll backward (@code{scroll-down}).
+@item @key{PRIOR}
+@itemx @key{PAGEUP}
+Likewise, scroll backward.
+@item @var{arg} C-l
+Scroll so point is on line @var{arg} (@code{recenter}).
+@item C-M-l
+Scroll heuristically to bring useful information onto the screen
+(@code{reposition-window}).
+@end table
+
+@kindex C-l
+@findex recenter
+  The most basic scrolling command is @kbd{C-l} (@code{recenter}) with
+no argument.  It scrolls the selected window so that point is halfway
+down from the top of the window.  On a text terminal, it also clears
+the screen and redisplays all windows.  That is useful in case the
+screen is garbled (@pxref{Screen Garbled}).
+
+@kindex C-v
+@kindex M-v
+@kindex NEXT
+@kindex PRIOR
+@kindex PAGEDOWN
+@kindex PAGEUP
+@findex scroll-up
+@findex scroll-down
+  To read the buffer a windowful at a time, use @kbd{C-v}
+(@code{scroll-up}) with no argument.  This scrolls forward by nearly
+the whole window height.  The effect is to take the two lines at the
+bottom of the window and put them at the top, followed by nearly a
+whole windowful of lines that were not previously visible.  If point
+was in the text that scrolled off the top, it ends up at the new top
+of the window.
+
+@vindex next-screen-context-lines
+  @kbd{M-v} (@code{scroll-down}) with no argument scrolls backward in
+a similar way, also with overlap.  The number of lines of overlap that
+the @kbd{C-v} or @kbd{M-v} commands leave is controlled by the
+variable @code{next-screen-context-lines}; by default, it is 2.  The
+function keys @key{NEXT} and @key{PRIOR}, or @key{PAGEDOWN} and
+@key{PAGEUP}, are equivalent to @kbd{C-v} and @kbd{M-v}.
+
+  The commands @kbd{C-v} and @kbd{M-v} with a numeric argument scroll
+the text in the selected window up or down a few lines.  @kbd{C-v}
+with an argument moves the text and point up, together, that many
+lines; it brings the same number of new lines into view at the bottom
+of the window.  @kbd{M-v} with numeric argument scrolls the text
+downward, bringing that many new lines into view at the top of the
+window.  @kbd{C-v} with a negative argument is like @kbd{M-v} and vice
+versa.
+
+  The names of scroll commands are based on the direction that the
+text moves in the window.  Thus, the command to scroll forward is
+called @code{scroll-up} because it moves the text upward on the
+screen.  The keys @key{PAGEDOWN} and @key{PAGEUP} derive their names
+and customary meanings from a different convention that developed
+elsewhere; hence the strange result that @key{PAGEDOWN} runs
+@code{scroll-up}.
+
+@vindex scroll-preserve-screen-position
+  Some users like the full-screen scroll commands to keep point at the
+same screen line.  To enable this behavior, set the variable
+@code{scroll-preserve-screen-position} to a non-@code{nil} value.  In
+this mode, when these commands would scroll the text around point off
+the screen, or within @code{scroll-margin} lines of the edge, they
+move point to keep the same vertical position within the window.
+This mode is convenient for browsing through a file by scrolling by
+screenfuls; if you come back to the screen where you started, point
+goes back to the line where it started.  However, this mode is
+inconvenient when you move to the next screen in order to move point
+to the text there.
+
+  Another way to do scrolling is with @kbd{C-l} with a numeric argument.
+@kbd{C-l} does not clear the screen when given an argument; it only scrolls
+the selected window.  With a positive argument @var{n}, it repositions text
+to put point @var{n} lines down from the top.  An argument of zero puts
+point on the very top line.  Point does not move with respect to the text;
+rather, the text and point move rigidly on the screen.  @kbd{C-l} with a
+negative argument puts point that many lines from the bottom of the window.
+For example, @kbd{C-u - 1 C-l} puts point on the bottom line, and @kbd{C-u
+- 5 C-l} puts it five lines from the bottom.  @kbd{C-u C-l} scrolls to put
+point at the center (vertically) of the selected window.
+
+@kindex C-M-l
+@findex reposition-window
+  The @kbd{C-M-l} command (@code{reposition-window}) scrolls the current
+window heuristically in a way designed to get useful information onto
+the screen.  For example, in a Lisp file, this command tries to get the
+entire current defun onto the screen if possible.
+
+@node Auto Scrolling
+@section Automatic Scrolling
+
+@vindex scroll-conservatively
+  Redisplay scrolls the buffer automatically when point moves out of
+the visible portion of the text.  The purpose of automatic scrolling
+is to make point visible, but you can customize many aspects of how
+this is done.
+
+  Normally, automatic scrolling centers point vertically within the
+window.  However, if you set @code{scroll-conservatively} to a small
+number @var{n}, then if you move point just a little off the
+screen---less than @var{n} lines---then Emacs scrolls the text just
+far enough to bring point back on screen.  By default,
+@code{scroll-conservatively} is@tie{}0.
+
+@cindex aggressive scrolling
+@vindex scroll-up-aggressively
+@vindex scroll-down-aggressively
+  When the window does scroll by a longer distance, you can control
+how aggressively it scrolls, by setting the variables
+@code{scroll-up-aggressively} and @code{scroll-down-aggressively}.
+The value of @code{scroll-up-aggressively} should be either
+@code{nil}, or a fraction @var{f} between 0 and 1.  A fraction
+specifies where on the screen to put point when scrolling upward.
+More precisely, when a window scrolls up because point is above the
+window start, the new start position is chosen to put point @var{f}
+part of the window height from the top.  The larger @var{f}, the more
+aggressive the scrolling.
+
+  @code{nil}, which is the default, scrolls to put point at the center.
+So it is equivalent to .5.
+
+  Likewise, @code{scroll-down-aggressively} is used for scrolling
+down.  The value, @var{f}, specifies how far point should be placed
+from the bottom of the window; thus, as with
+@code{scroll-up-aggressively}, a larger value is more aggressive.
+
+@vindex scroll-margin
+  The variable @code{scroll-margin} restricts how close point can come
+to the top or bottom of a window.  Its value 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.  By default, @code{scroll-margin} is
+0.
+
+@node Horizontal Scrolling
+@section Horizontal Scrolling
+@cindex horizontal scrolling
+
+  @dfn{Horizontal scrolling} means shifting all the lines sideways
+within a window---so that some of the text near the left margin is not
+displayed at all.  When the text in a window is scrolled horizontally,
+text lines are truncated rather than continued (@pxref{Line
+Truncation}).  Whenever a window shows truncated lines, Emacs
+automatically updates its horizontal scrolling whenever point moves
+off the left or right edge of the screen.  You can also use these
+commands to do explicit horizontal scrolling.
+
+@table @kbd
+@item C-x <
+Scroll text in current window to the left (@code{scroll-left}).
+@item C-x >
+Scroll to the right (@code{scroll-right}).
+@end table
+
+@kindex C-x <
+@kindex C-x >
+@findex scroll-left
+@findex scroll-right
+  The command @kbd{C-x <} (@code{scroll-left}) scrolls the selected
+window to the left by @var{n} columns with argument @var{n}.  This moves
+part of the beginning of each line off the left edge of the window.
+With no argument, it scrolls by almost the full width of the window (two
+columns less, to be precise).
+
+  @kbd{C-x >} (@code{scroll-right}) scrolls similarly to the right.  The
+window cannot be scrolled any farther to the right once it is displayed
+normally (with each line starting at the window's left margin);
+attempting to do so has no effect.  This means that you don't have to
+calculate the argument precisely for @w{@kbd{C-x >}}; any sufficiently large
+argument will restore the normal display.
+
+  If you use those commands to scroll a window horizontally, that sets
+a lower bound for automatic horizontal scrolling.  Automatic scrolling
+will continue to scroll the window, but never farther to the right
+than the amount you previously set by @code{scroll-left}.
+
+@vindex hscroll-margin
+  The value of the variable @code{hscroll-margin} controls how close
+to the window's edges point is allowed to get before the window will
+be automatically scrolled.  It is measured in columns.  If the value
+is 5, then moving point within 5 columns of the edge causes horizontal
+scrolling away from that edge.
+
+@vindex hscroll-step
+  The variable @code{hscroll-step} determines how many columns to
+scroll the window when point gets too close to the edge.  If it's
+zero, horizontal scrolling centers point horizontally within the
+window.  If it's a positive integer, it specifies the number of
+columns to scroll by.  If it's a floating-point number, it specifies
+the fraction of the window's width to scroll by.  The default is zero.
+
+@vindex auto-hscroll-mode
+  To disable automatic horizontal scrolling, set the variable
+@code{auto-hscroll-mode} to @code{nil}.
+
+@node Follow Mode
+@section Follow Mode
+@cindex Follow mode
+@cindex mode, Follow
+@findex follow-mode
+@cindex windows, synchronizing
+@cindex synchronizing windows
+
+  @dfn{Follow mode} is a minor mode that makes two windows, both
+showing the same buffer, scroll as a single tall ``virtual window.''
+To use Follow mode, go to a frame with just one window, split it into
+two side-by-side windows using @kbd{C-x 3}, and then type @kbd{M-x
+follow-mode}.  From then on, you can edit the buffer in either of the
+two windows, or scroll either one; the other window follows it.
+
+  In Follow mode, if you move point outside the portion visible in one
+window and into the portion visible in the other window, that selects
+the other window---again, treating the two as if they were parts of
+one large window.
+
+  To turn off Follow mode, type @kbd{M-x follow-mode} a second time.
+
+@node Faces
+@section Faces: Controlling Text Display Style
+@cindex faces
+
+  You can specify various styles for displaying text using
+@dfn{faces}.  Each face can specify various @dfn{face attributes},
+such as the font family, the height, weight and slant of the
+characters, the foreground and background color, and underlining or
+overlining.  A face does not have to specify all of these attributes;
+often it inherits most of them from another face.
+
+  On graphical display, all the Emacs face attributes are meaningful.
+On a text-only terminal, only some of them work.  Some text-only
+terminals support inverse video, bold, and underline attributes; some
+support colors.  Text-only terminals generally do not support changing
+the height and width or the font family.
+
+  Most major modes assign faces to the text automatically through the
+work of Font Lock mode.  @xref{Font Lock}, for more information about
+Font Lock mode and syntactic highlighting.  You can print the current
+buffer with the highlighting that appears on your screen using the
+command @code{ps-print-buffer-with-faces}.  @xref{PostScript}.
+
+  You control the appearance of a part of the text in the buffer by
+specifying the face or faces to use for it.  The style of display used
+for any given character is determined by combining the attributes of
+all the applicable faces specified for that character.  Any attribute
+that isn't specified by these faces is taken from the @code{default} face,
+whose attributes reflect the default settings of the frame itself.
+
+  Enriched mode, the mode for editing formatted text, includes several
+commands and menus for specifying faces for text in the buffer.
+@xref{Format Faces}, for how to specify the font for text in the
+buffer.  @xref{Format Colors}, for how to specify the foreground and
+background color.
+
+@cindex face colors, setting
+@findex set-face-foreground
+@findex set-face-background
+  To alter the appearance of a face, use the customization buffer.
+@xref{Face Customization}.  You can also use X resources to specify
+attributes of particular faces (@pxref{Resources}).  Alternatively,
+you can change the foreground and background colors of a specific face
+with @kbd{M-x set-face-foreground} and @kbd{M-x set-face-background}.
+These commands prompt in the minibuffer for a face name and a color
+name, with completion, and then set that face to use the specified
+color.  Changing the colors of the @code{default} face also changes
+the foreground and background colors on all frames, both existing and
+those to be created in the future.  (You can also set foreground and
+background colors for the current frame only; see @ref{Frame
+Parameters}.)
+
+  If you want to alter the appearance of all Emacs frames, you need to
+customize the frame parameters in the variable
+@code{default-frame-alist}; see @ref{Creating Frames,
+default-frame-alist}.
+
+  Emacs can correctly display variable-width fonts, but Emacs commands
+that calculate width and indentation do not know how to calculate
+variable widths.  This can sometimes lead to incorrect results when
+you use variable-width fonts.  In particular, indentation commands can
+give inconsistent results, so we recommend you avoid variable-width
+fonts for editing program source code.  Filling will sometimes make
+lines too long or too short.  We plan to address these issues in
+future Emacs versions.
+
+@node Standard Faces
+@section Standard Faces
+
+@findex list-faces-display
+  To see what faces are currently defined, and what they look like,
+type @kbd{M-x list-faces-display}.  It's possible for a given face to
+look different in different frames; this command shows the appearance
+in the frame in which you type it.  With a prefix argument, this
+prompts for a regular expression, and displays only faces with names
+matching that regular expression.
+
+  Here are the standard faces for specifying text appearance.  You can
+apply them to specific text when you want the effects they produce.
+
+@table @code
+@item default
+This face is used for ordinary text that doesn't specify any face.
+@item bold
+This face uses a bold variant of the default font, if it has one.
+It's up to you to choose a default font that has a bold variant,
+if you want to use one.
+@item italic
+This face uses an italic variant of the default font, if it has one.
+@item bold-italic
+This face uses a bold italic variant of the default font, if it has one.
+@item underline
+This face underlines text.
+@item fixed-pitch
+This face forces use of a particular fixed-width font.
+@item variable-pitch
+This face forces use of a particular variable-width font.  It's
+reasonable to customize this face to use a different variable-width font,
+if you like, but you should not make it a fixed-width font.
+@item shadow
+This face is used for making the text less noticeable than the surrounding
+ordinary text.  Usually this can be achieved by using shades of gray in
+contrast with either black or white default foreground color.
+@end table
+
+  Here's an incomplete list of faces used to highlight parts of the
+text temporarily for specific purposes.  (Many other modes define
+their own faces for this purpose.)
+
+@table @code
+@item highlight
+This face is used for highlighting portions of text, in various modes.
+For example, mouse-sensitive text is highlighted using this face.
+@item isearch
+This face is used for highlighting the current Isearch match.
+@item query-replace
+This face is used for highlighting the current Query Replace match.
+@item lazy-highlight
+This face is used for lazy highlighting of Isearch and Query Replace
+matches other than the current one.
+@item region
+This face is used for displaying a selected region (when Transient Mark
+mode is enabled---see below).
+@item secondary-selection
+This face is used for displaying a secondary X selection (@pxref{Secondary
+Selection}).
+@item trailing-whitespace
+The face for highlighting excess spaces and tabs at the end of a line
+when @code{show-trailing-whitespace} is non-@code{nil}; see
+@ref{Useless Whitespace}.
+@item nobreak-space
+The face for displaying the character ``nobreak space.''
+@item escape-glyph
+The face for highlighting the @samp{\} or @samp{^} that indicates
+a control character.  It's also used when @samp{\} indicates a
+nobreak space or nobreak (soft) hyphen.
+@end table
+
+@cindex @code{region} face
+  When Transient Mark mode is enabled, the text of the region is
+highlighted when the mark is active.  This uses the face named
+@code{region}; you can control the style of highlighting by changing the
+style of this face (@pxref{Face Customization}).  @xref{Transient Mark},
+for more information about Transient Mark mode and activation and
+deactivation of the mark.
+
+  These faces control the appearance of parts of the Emacs frame.
+They exist as faces to provide a consistent way to customize the
+appearance of these parts of the frame.
+
+@table @code
+@item mode-line
+@itemx modeline
+This face is used for the mode line of the currently selected window,
+and for menu bars when toolkit menus are not used.  By default, it's
+drawn with shadows for a ``raised'' effect on graphical displays, and
+drawn as the inverse of the default face on non-windowed terminals.
+@code{modeline} is an alias for the @code{mode-line} face, for
+compatibility with old Emacs versions.
+@item mode-line-inactive
+Like @code{mode-line}, but used for mode lines of the windows other
+than the selected one (if @code{mode-line-in-non-selected-windows} is
+non-@code{nil}).  This face inherits from @code{mode-line}, so changes
+in that face affect mode lines in all windows.
+@item mode-line-highlight
+Like @code{highlight}, but used for portions of text on mode lines.
+@item mode-line-buffer-id
+This face is used for buffer identification parts in the mode line.
+@item header-line
+Similar to @code{mode-line} for a window's header line, which appears
+at the top of a window just as the mode line appears at the bottom.
+Most windows do not have a header line---only some special modes, such
+Info mode, create one.
+@item vertical-border
+This face is used for the vertical divider between windows.
+By default this face inherits from the @code{mode-line-inactive} face
+on character terminals.  On graphical displays the foreground color of
+this face is used for the vertical line between windows without
+scrollbars.
+@item minibuffer-prompt
+@cindex @code{minibuffer-prompt} face
+@vindex minibuffer-prompt-properties
+This face is used for the prompt strings displayed in the minibuffer.
+By default, Emacs automatically adds this face to the value of
+@code{minibuffer-prompt-properties}, which is a list of text
+properties used to display the prompt text.  (This variable takes
+effect when you enter the minibuffer.)
+@item fringe
+@cindex @code{fringe} face
+The face for the fringes to the left and right of windows on graphic
+displays.  (The fringes are the narrow portions of the Emacs frame
+between the text area and the window's right and left borders.)
+@xref{Fringes}.
+@item scroll-bar
+This face determines the visual appearance of the scroll bar.
+@xref{Scroll Bars}.
+@item border
+This face determines the color of the frame border.
+@item cursor
+This face determines the color of the cursor.
+@item mouse
+This face determines the color of the mouse pointer.
+@item tool-bar
+This face determines the color of tool bar icons.  @xref{Tool Bars}.
+@item tooltip
+This face is used for tooltips.  @xref{Tooltips}.
+@item menu
+@cindex menu bar appearance
+@cindex @code{menu} face, no effect if customized
+@cindex customization of @code{menu} face
+This face determines the colors and font of Emacs's menus.  @xref{Menu
+Bars}.  Setting the font of LessTif/Motif menus is currently not
+supported; attempts to set the font are ignored in this case.
+Likewise, attempts to customize this face in Emacs built with GTK and
+in the MS-Windows/Mac ports are ignored by the respective GUI toolkits;
+you need to use system-wide styles and options to change the
+appearance of the menus.
+@end table
+
+@node Font Lock
+@section Font Lock mode
+@cindex Font Lock mode
+@cindex mode, Font Lock
+@cindex syntax highlighting and coloring
+
+  Font Lock mode is a minor mode, always local to a particular buffer,
+which highlights (or ``fontifies'') the buffer contents according to
+the syntax of the text you are editing.  It can recognize comments and
+strings in most languages; in several languages, it can also recognize
+and properly highlight various other important constructs---for
+example, names of functions being defined or reserved keywords.
+Some special modes, such as Occur mode and Info mode, have completely
+specialized ways of assigning fonts for Font Lock mode.
+
+@findex font-lock-mode
+  Font Lock mode is turned on by default in all modes which support it.
+You can toggle font-lock for each buffer with the command @kbd{M-x
+font-lock-mode}.  Using a positive argument unconditionally turns Font
+Lock mode on, and a negative or zero argument turns it off.
+
+@findex global-font-lock-mode
+@vindex global-font-lock-mode
+  If you do not wish Font Lock mode to be turned on by default,
+customize the variable @code{global-font-lock-mode} using the Customize
+interface (@pxref{Easy Customization}), or use the function
+@code{global-font-lock-mode} in your @file{.emacs} file, like this:
+
+@example
+(global-font-lock-mode 0)
+@end example
+
+@noindent
+This variable, like all the variables that control Font Lock mode,
+take effect whenever fontification is done; that is, potentially at
+any time.
+
+@findex turn-on-font-lock
+  If you have disabled Global Font Lock mode, you can still enable Font
+Lock for specific major modes by adding the function
+@code{turn-on-font-lock} to the mode hooks (@pxref{Hooks}).  For
+example, to enable Font Lock mode for editing C files, you can do this:
+
+@example
+(add-hook 'c-mode-hook 'turn-on-font-lock)
+@end example
+
+  Font Lock mode uses several specifically named faces to do its job,
+including @code{font-lock-string-face}, @code{font-lock-comment-face},
+and others.  The easiest way to find them all is to use @kbd{M-x
+customize-group @key{RET} font-lock-faces @key{RET}}.  You can then
+use that customization buffer to customize the appearance of these
+faces.  @xref{Face Customization}.
+
+  You can also customize these faces using @kbd{M-x
+set-face-foreground} or @kbd{M-x set-face-background}.  @xref{Faces}.
+
+@vindex font-lock-maximum-decoration
+  The variable @code{font-lock-maximum-decoration} specifies the
+preferred level of fontification, for modes that provide multiple
+levels.  Level 1 is the least amount of fontification; some modes
+support levels as high as 3.  The normal default is ``as high as
+possible.''  You can specify an integer, which applies to all modes, or
+you can specify different numbers for particular major modes; for
+example, to use level 1 for C/C++ modes, and the default level
+otherwise, use this:
+
+@example
+(setq font-lock-maximum-decoration
+      '((c-mode . 1) (c++-mode . 1)))
+@end example
+
+@vindex font-lock-maximum-size
+  Fontification can be too slow for large buffers, so you can suppress
+it for buffers above a certain size.  The variable
+@code{font-lock-maximum-size} specifies a buffer size, beyond which
+buffer fontification is suppressed.
+
+@c @w is used below to prevent a bad page-break.
+@vindex font-lock-beginning-of-syntax-function
+@cindex incorrect fontification
+@cindex parenthesis in column zero and fontification
+@cindex brace in column zero and fontification
+  Comment and string fontification (or ``syntactic'' fontification)
+relies on analysis of the syntactic structure of the buffer text.  For
+the sake of speed, some modes, including Lisp mode, rely on a special
+convention: an open-parenthesis or open-brace in the leftmost column
+always defines the @w{beginning} of a defun, and is thus always
+outside any string or comment.  (@xref{Left Margin Paren}.)  If you
+don't follow this convention, Font Lock mode can misfontify the text
+that follows an open-parenthesis or open-brace in the leftmost column
+that is inside a string or comment.
+
+@cindex slow display during scrolling
+  The variable @code{font-lock-beginning-of-syntax-function} (always
+buffer-local) specifies how Font Lock mode can find a position
+guaranteed to be outside any comment or string.  In modes which use the
+leftmost column parenthesis convention, the default value of the variable
+is @code{beginning-of-defun}---that tells Font Lock mode to use the
+convention.  If you set this variable to @code{nil}, Font Lock no longer
+relies on the convention.  This avoids incorrect results, but the price
+is that, in some cases, fontification for a changed text must rescan
+buffer text from the beginning of the buffer.  This can considerably
+slow down redisplay while scrolling, particularly if you are close to
+the end of a large buffer.
+
+@findex font-lock-add-keywords
+  Font Lock highlighting patterns already exist for many modes, but you
+may want to fontify additional patterns.  You can use the function
+@code{font-lock-add-keywords}, to add your own highlighting patterns for
+a particular mode.  For example, to highlight @samp{FIXME:} words in C
+comments, use this:
+
+@example
+(font-lock-add-keywords
+ 'c-mode
+ '(("\\<\\(FIXME\\):" 1 font-lock-warning-face t)))
+@end example
+
+@findex font-lock-remove-keywords
+  To remove keywords from the font-lock highlighting patterns, use the
+function @code{font-lock-remove-keywords}.  @xref{Search-based
+Fontification,,, elisp, The Emacs Lisp Reference Manual}, for
+documentation of the format of this list.
+
+@cindex just-in-time (JIT) font-lock
+@cindex background syntax highlighting
+  Fontifying large buffers can take a long time.  To avoid large
+delays when a file is visited, Emacs fontifies only the visible
+portion of a buffer.  As you scroll through the buffer, each portion
+that becomes visible is fontified as soon as it is displayed.  The
+parts of the buffer that are not displayed are fontified
+``stealthily,'' in the background, i.e.@: when Emacs is idle.  You can
+control this background fontification, also called @dfn{Just-In-Time}
+(or @dfn{JIT}) Lock, by customizing variables in the customization
+group @samp{jit-lock}.  @xref{Specific Customization}.
+
+@node Highlight Interactively
+@section Interactive Highlighting
+@cindex highlighting by matching
+@cindex interactive highlighting
+@cindex Highlight Changes mode
+
+@findex highlight-changes-mode
+  Use @kbd{M-x highlight-changes-mode} to enable (or disable)
+Highlight Changes mode, a minor mode that uses faces (colors,
+typically) to indicate which parts of the buffer were changed most
+recently.
+
+@cindex Hi Lock mode
+@findex hi-lock-mode
+  Hi Lock mode highlights text that matches regular expressions you
+specify.  For example, you might wish to see all the references to a
+certain variable in a program source file, highlight certain parts in
+a voluminous output of some program, or make certain names stand out
+in an article.  Use the @kbd{M-x hi-lock-mode} command to enable (or
+disable) Hi Lock mode.  To enable Hi Lock mode for all buffers, use
+@kbd{M-x global-hi-lock-mode} or place @code{(global-hi-lock-mode 1)}
+in your @file{.emacs} file.
+
+  Hi Lock mode works like Font Lock mode (@pxref{Font Lock}), except
+that you specify explicitly the regular expressions to highlight.  You
+control them with these commands:
+
+@table @kbd
+@item C-x w h @var{regexp} @key{RET} @var{face} @key{RET}
+@kindex C-x w h
+@findex highlight-regexp
+Highlight text that matches @var{regexp} using face @var{face}
+(@code{highlight-regexp}).  The highlighting will remain as long as
+the buffer is loaded.  For example, to highlight all occurrences of
+the word ``whim'' using the default face (a yellow background)
+@kbd{C-x w h whim @key{RET} @key{RET}}.  Any face can be used for
+highlighting, Hi Lock provides several of its own and these are
+pre-loaded into a history list.  While being prompted for a face use
+@kbd{M-p} and @kbd{M-n} to cycle through them.
+
+You can use this command multiple times, specifying various regular
+expressions to highlight in different ways.
+
+@item C-x w r @var{regexp} @key{RET}
+@kindex C-x w r
+@findex unhighlight-regexp
+Unhighlight @var{regexp} (@code{unhighlight-regexp}).
+
+If you invoke this from the menu, you select the expression to
+unhighlight from a list.  If you invoke this from the keyboard, you
+use the minibuffer.  It will show the most recently added regular
+expression; use @kbd{M-p} to show the next older expression and
+@kbd{M-n} to select the next newer expression.  (You can also type the
+expression by hand, with completion.)  When the expression you want to
+unhighlight appears in the minibuffer, press @kbd{@key{RET}} to exit
+the minibuffer and unhighlight it.
+
+@item C-x w l @var{regexp} @key{RET} @var{face} @key{RET}
+@kindex C-x w l
+@findex highlight-lines-matching-regexp
+@cindex lines, highlighting
+@cindex highlighting lines of text
+Highlight entire lines containing a match for @var{regexp}, using face
+@var{face} (@code{highlight-lines-matching-regexp}).
+
+@item C-x w b
+@kindex C-x w b
+@findex hi-lock-write-interactive-patterns
+Insert all the current highlighting regexp/face pairs into the buffer
+at point, with comment delimiters to prevent them from changing your
+program.  (This key binding runs the
+@code{hi-lock-write-interactive-patterns} command.)
+
+These patterns are extracted from the comments, if appropriate, if you
+invoke @kbd{M-x hi-lock-find-patterns}, or if you visit the file while
+Hi Lock mode is enabled (since that runs @code{hi-lock-find-patterns}).
+
+@item C-x w i
+@kindex C-x w i
+@findex hi-lock-find-patterns
+Extract regexp/face pairs from comments in the current buffer
+(@code{hi-lock-find-patterns}).  Thus, you can enter patterns
+interactively with @code{highlight-regexp}, store them into the file
+with @code{hi-lock-write-interactive-patterns}, edit them (perhaps
+including different faces for different parenthesized parts of the
+match), and finally use this command (@code{hi-lock-find-patterns}) to
+have Hi Lock highlight the edited patterns.
+
+@vindex hi-lock-file-patterns-policy
+The variable @code{hi-lock-file-patterns-policy} controls whether Hi
+Lock mode should automatically extract and highlight patterns found in
+a file when it is visited.  Its value can be @code{nil} (never
+highlight), @code{t} (highlight the patterns), @code{ask} (query the
+user), or a function.  If it is a function,
+@code{hi-lock-find-patterns} calls it with the patterns as argument;
+if the function returns non-@code{nil}, the patterns are used.  The
+default is @code{nil}.  Note that patterns are always highlighted if
+you call @code{hi-lock-find-patterns} directly, regardless of the
+value of this variable.
+
+@vindex hi-lock-exclude-modes
+Also, @code{hi-lock-find-patterns} does nothing if the current major
+mode's symbol is a member of the list @code{hi-lock-exclude-modes}.
+@end table
+
+@node Fringes
+@section Window Fringes
+@cindex fringes
+
+  On a graphical display, each Emacs window normally has narrow
+@dfn{fringes} on the left and right edges.  The fringes display
+indications about the text in the window.
+
+  The most common use of the fringes is to indicate a continuation
+line, when one line of text is split into multiple lines on the
+screen.  The left fringe shows a curving arrow for each screen line
+except the first, indicating that ``this is not the real beginning.''
+The right fringe shows a curving arrow for each screen line except the
+last, indicating that ``this is not the real end.''
+
+  The fringes indicate line truncation with short horizontal arrows
+meaning ``there's more text on this line which is scrolled
+horizontally out of view;'' clicking the mouse on one of the arrows
+scrolls the display horizontally in the direction of the arrow.   The
+fringes can also indicate other things, such as empty lines, or where a
+program you are debugging is executing (@pxref{Debuggers}).
+
+@findex set-fringe-style
+@findex fringe-mode
+  You can enable and disable the fringes for all frames using
+@kbd{M-x fringe-mode}.  To enable and disable the fringes
+for the selected frame, use @kbd{M-x set-fringe-style}.
+
+@node Displaying Boundaries
+@section Displaying Boundaries
+
+@vindex indicate-buffer-boundaries
+  On a graphical display, Emacs can indicate the buffer boundaries in
+the fringes.  It indicates the first line and the last line with
+angle images in the fringes.  This can be combined with up and down
+arrow images which say whether it is possible to scroll the window up
+and down.
+
+  The buffer-local variable @code{indicate-buffer-boundaries} controls
+how the buffer boundaries and window scrolling is indicated in the
+fringes.  If the value is @code{left} or @code{right}, both angle and
+arrow bitmaps are displayed in the left or right fringe, respectively.
+
+  If value is an alist, each element @code{(@var{indicator} .
+@var{position})} specifies the position of one of the indicators.
+The @var{indicator} must be one of @code{top}, @code{bottom},
+@code{up}, @code{down}, or @code{t} which specifies the default
+position for the indicators not present in the alist.
+The @var{position} is one of @code{left}, @code{right}, or @code{nil}
+which specifies not to show this indicator.
+
+  For example, @code{((top . left) (t . right))} places the top angle
+bitmap in left fringe, the bottom angle bitmap in right fringe, and
+both arrow bitmaps in right fringe.  To show just the angle bitmaps in
+the left fringe, but no arrow bitmaps, use @code{((top .  left)
+(bottom . left))}.
+
+@vindex default-indicate-buffer-boundaries
+  The value of the variable @code{default-indicate-buffer-boundaries}
+is the default value for @code{indicate-buffer-boundaries} in buffers
+that do not override it.
+
+@node Useless Whitespace
+@section Useless Whitespace
+
+@cindex trailing whitespace
+@cindex whitespace, trailing
+@vindex show-trailing-whitespace
+  It is easy to leave unnecessary spaces at the end of a line, or
+empty lines at the end of a file, without realizing it.  In most
+cases, this @dfn{trailing whitespace} has no effect, but there are
+special circumstances where it matters.  It can also be a nuisance
+that the line has ``changed,'' when the change is just spaces added or
+removed at the end.
+
+  You can make trailing whitespace at the end of a line visible on the
+screen by setting the buffer-local variable
+@code{show-trailing-whitespace} to @code{t}.  Then Emacs displays
+trailing whitespace in the face @code{trailing-whitespace}.
+
+  This feature does not apply when point is at the end of the line
+containing the whitespace.  Strictly speaking, that is ``trailing
+whitespace'' nonetheless, but displaying it specially in that case
+looks ugly while you are typing in new text.  In this special case,
+the location of point is enough to show you that the spaces are
+present.
+
+@findex delete-trailing-whitespace
+  To delete all trailing whitespace within the current buffer's
+accessible portion (@pxref{Narrowing}), type @kbd{M-x
+delete-trailing-whitespace @key{RET}}.  (This command does not remove
+the form-feed characters.)
+
+@vindex indicate-empty-lines
+@vindex default-indicate-empty-lines
+@cindex unused lines
+@cindex fringes, and unused line indication
+  Emacs can indicate unused lines at the end of the window with a
+small image in the left fringe (@pxref{Fringes}).  The image appears
+for window lines that do not correspond to any buffer text.  Blank
+lines at the end of the buffer then stand out because they do not have
+this image in the fringe.
+
+  To enable this feature, set the buffer-local variable
+@code{indicate-empty-lines} to a non-@code{nil} value.  The default
+value of this variable is controlled by the variable
+@code{default-indicate-empty-lines}; by setting that variable, you
+can enable or disable this feature for all new buffers.  (This feature
+currently doesn't work on text-only terminals.)
+
+@node Selective Display
+@section Selective Display
+@cindex selective display
+@findex set-selective-display
+@kindex C-x $
+
+  Emacs has the ability to hide lines indented more than a certain number
+of columns (you specify how many columns).  You can use this to get an
+overview of a part of a program.
+
+  To hide lines in the current buffer, type @kbd{C-x $}
+(@code{set-selective-display}) with a numeric argument @var{n}.  Then
+lines with at least @var{n} columns of indentation disappear from the
+screen.  The only indication of their presence is that three dots
+(@samp{@dots{}}) appear at the end of each visible line that is
+followed by one or more hidden ones.
+
+  The commands @kbd{C-n} and @kbd{C-p} move across the hidden lines as
+if they were not there.
+
+  The hidden lines are still present in the buffer, and most editing
+commands see them as usual, so you may find point in the middle of the
+hidden text.  When this happens, the cursor appears at the end of the
+previous line, after the three dots.  If point is at the end of the
+visible line, before the newline that ends it, the cursor appears before
+the three dots.
+
+  To make all lines visible again, type @kbd{C-x $} with no argument.
+
+@vindex selective-display-ellipses
+  If you set the variable @code{selective-display-ellipses} to
+@code{nil}, the three dots do not appear at the end of a line that
+precedes hidden lines.  Then there is no visible indication of the
+hidden lines.  This variable becomes local automatically when set.
+
+  See also @ref{Outline Mode} for another way to hide part of
+the text in a buffer.
+
+@node Optional Mode Line
+@section Optional Mode Line Features
+
+@cindex buffer size display
+@cindex display of buffer size
+@findex size-indication-mode
+  The buffer percentage @var{pos} indicates the percentage of the
+buffer above the top of the window.  You can additionally display the
+size of the buffer by typing @kbd{M-x size-indication-mode} to turn on
+Size Indication mode.  The size will be displayed immediately
+following the buffer percentage like this:
+
+@example
+@var{POS} of @var{SIZE}
+@end example
+
+@noindent
+Here @var{SIZE} is the human readable representation of the number of
+characters in the buffer, which means that @samp{k} for 10^3, @samp{M}
+for 10^6, @samp{G} for 10^9, etc., are used to abbreviate.
+
+@cindex narrowing, and buffer size display
+  If you have narrowed the buffer (@pxref{Narrowing}), the size of the
+accessible part of the buffer is shown.
+
+@cindex line number display
+@cindex display of line number
+@findex line-number-mode
+  The current line number of point appears in the mode line when Line
+Number mode is enabled.  Use the command @kbd{M-x line-number-mode} to
+turn this mode on and off; normally it is on.  The line number appears
+after the buffer percentage @var{pos}, with the letter @samp{L} to
+indicate what it is.
+
+@cindex Column Number mode
+@cindex mode, Column Number
+@findex column-number-mode
+  Similarly, you can display the current column number by turning on
+Column number mode with @kbd{M-x column-number-mode}.  The column
+number is indicated by the letter @samp{C}.  However, when both of
+these modes are enabled, the line and column numbers are displayed in
+parentheses, the line number first, rather than with @samp{L} and
+@samp{C}.  For example: @samp{(561,2)}.  @xref{Minor Modes}, for more
+information about minor modes and about how to use these commands.
+
+@cindex narrowing, and line number display
+  If you have narrowed the buffer (@pxref{Narrowing}), the displayed
+line number is relative to the accessible portion of the buffer.
+Thus, it isn't suitable as an argument to @code{goto-line}.  (Use
+@code{what-line} command to see the line number relative to the whole
+file.)
+
+@vindex line-number-display-limit
+  If the buffer is very large (larger than the value of
+@code{line-number-display-limit}), then the line number doesn't appear.
+Emacs doesn't compute the line number when the buffer is large, because
+that would be too slow.  Set it to @code{nil} to remove the limit.
+
+@vindex line-number-display-limit-width
+  Line-number computation can also be slow if the lines in the buffer
+are too long.  For this reason, Emacs normally doesn't display line
+numbers if the average width, in characters, of lines near point is
+larger than the value of the variable
+@code{line-number-display-limit-width}.  The default value is 200
+characters.
+
+@findex display-time
+@cindex time (on mode line)
+  Emacs can optionally display the time and system load in all mode
+lines.  To enable this feature, type @kbd{M-x display-time} or customize
+the option @code{display-time-mode}.  The information added to the mode
+line usually appears after the buffer name, before the mode names and
+their parentheses.  It looks like this:
+
+@example
+@var{hh}:@var{mm}pm @var{l.ll}
+@end example
+
+@noindent
+@vindex display-time-24hr-format
+Here @var{hh} and @var{mm} are the hour and minute, followed always by
+@samp{am} or @samp{pm}.  @var{l.ll} is the average number of running
+processes in the whole system recently.  (Some fields may be missing if
+your operating system cannot support them.)  If you prefer time display
+in 24-hour format, set the variable @code{display-time-24hr-format}
+to @code{t}.
+
+@cindex mail (on mode line)
+@vindex display-time-use-mail-icon
+@vindex display-time-mail-face
+@vindex display-time-mail-file
+@vindex display-time-mail-directory
+  The word @samp{Mail} appears after the load level if there is mail
+for you that you have not read yet.  On a graphical display you can use
+an icon instead of @samp{Mail} by customizing
+@code{display-time-use-mail-icon}; this may save some space on the mode
+line.  You can customize @code{display-time-mail-face} to make the mail
+indicator prominent.  Use @code{display-time-mail-file} to specify
+the mail file to check, or set @code{display-time-mail-directory}
+to specify the directory to check for incoming mail (any nonempty regular
+file in the directory is considered as ``newly arrived mail'').
+
+@cindex mode line, 3D appearance
+@cindex attributes of mode line, changing
+@cindex non-integral number of lines in a window
+  By default, the mode line is drawn on graphics displays with
+3D-style highlighting, like that of a button when it is not being
+pressed.  If you don't like this effect, you can disable the 3D
+highlighting of the mode line, by customizing the attributes of the
+@code{mode-line} face.  @xref{Face Customization}.
+
+@cindex non-selected windows, mode line appearance
+  By default, the mode line of nonselected windows is displayed in a
+different face, called @code{mode-line-inactive}.  Only the selected
+window is displayed in the @code{mode-line} face.  This helps show
+which window is selected.  When the minibuffer is selected, since
+it has no mode line, the window from which you activated the minibuffer
+has its mode line displayed using @code{mode-line}; as a result,
+ordinary entry to the minibuffer does not change any mode lines.
+
+@vindex mode-line-in-non-selected-windows
+  You can disable use of @code{mode-line-inactive} by setting variable
+@code{mode-line-in-non-selected-windows} to @code{nil}; then all mode
+lines are displayed in the @code{mode-line} face.
+
+@vindex eol-mnemonic-unix
+@vindex eol-mnemonic-dos
+@vindex eol-mnemonic-mac
+@vindex eol-mnemonic-undecided
+  You can customize the mode line display for each of the end-of-line
+formats by setting each of the variables @code{eol-mnemonic-unix},
+@code{eol-mnemonic-dos}, @code{eol-mnemonic-mac}, and
+@code{eol-mnemonic-undecided} to the strings you prefer.
+
+@node Text Display
+@section How Text Is Displayed
+@cindex characters (in text)
+
+  @acronym{ASCII} printing characters (octal codes 040 through 0176) in Emacs
+buffers are displayed with their graphics, as are non-ASCII multibyte
+printing characters (octal codes above 0400).
+
+  Some @acronym{ASCII} control characters are displayed in special ways.  The
+newline character (octal code 012) is displayed by starting a new line.
+The tab character (octal code 011) is displayed by moving to the next
+tab stop column (normally every 8 columns).
+
+  Other @acronym{ASCII} control characters are normally displayed as a caret
+(@samp{^}) followed by the non-control version of the character; thus,
+control-A is displayed as @samp{^A}.  The caret appears in face
+@code{escape-glyph}.
+
+  Non-@acronym{ASCII} characters 0200 through 0237 (octal) are
+displayed with octal escape sequences; thus, character code 0230
+(octal) is displayed as @samp{\230}.  The backslash appears in face
+@code{escape-glyph}.
+
+@vindex ctl-arrow
+  If the variable @code{ctl-arrow} is @code{nil}, control characters in
+the buffer are displayed with octal escape sequences, except for newline
+and tab.  Altering the value of @code{ctl-arrow} makes it local to the
+current buffer; until that time, the default value is in effect.  The
+default is initially @code{t}.
+
+  The display of character codes 0240 through 0377 (octal) may be
+either as escape sequences or as graphics.  They do not normally occur
+in multibyte buffers, but if they do, they are displayed as Latin-1
+graphics.  In unibyte mode, if you enable European display they are
+displayed using their graphics (assuming your terminal supports them),
+otherwise as escape sequences.  @xref{Unibyte Mode}.
+
+@vindex nobreak-char-display
+@cindex no-break space, display
+@cindex no-break hyphen, display
+@cindex soft hyphen, display
+  Some character sets define ``no-break'' versions of the space and
+hyphen characters, which are used where a line should not be broken.
+Emacs normally displays these characters with special faces
+(respectively, @code{nobreak-space} and @code{escape-glyph}) to
+distinguish them from ordinary spaces and hyphens.  You can turn off
+this feature by setting the variable @code{nobreak-char-display} to
+@code{nil}.  If you set the variable to any other value, that means to
+prefix these characters with an escape character.
+
+@vindex tab-width
+@vindex default-tab-width
+  Normally, a tab character in the buffer is displayed as whitespace which
+extends to the next display tab stop position, and display tab stops come
+at intervals equal to eight spaces.  The number of spaces per tab is
+controlled by the variable @code{tab-width}, which is made local by
+changing it.  Note that how the tab character
+in the buffer is displayed has nothing to do with the definition of
+@key{TAB} as a command.  The variable @code{tab-width} must have an
+integer value between 1 and 1000, inclusive.  The variable
+@code{default-tab-width} controls the default value of this variable
+for buffers where you have not set it locally.
+
+  You can customize the way any particular character code is displayed
+by means of a display table.  @xref{Display Tables,, Display Tables,
+elisp, The Emacs Lisp Reference Manual}.
+
+@node Cursor Display
+@section Displaying the Cursor
+
+@findex blink-cursor-mode
+@vindex blink-cursor-alist
+@cindex cursor, locating visually
+@cindex cursor, blinking
+  You can customize the cursor's color, and whether it blinks, using
+the @code{cursor} Custom group (@pxref{Easy Customization}).  On
+a graphical display, the command @kbd{M-x blink-cursor-mode} enables
+or disables the blinking of the cursor.  (On text terminals, the
+terminal itself blinks the cursor, and Emacs has no control over it.)
+You can control how the cursor appears when it blinks off by setting
+the variable @code{blink-cursor-alist}.
+
+@vindex visible-cursor
+  Some text terminals offer two different cursors: the normal cursor
+and the very visible cursor, where the latter may be e.g. bigger or
+blinking.  By default Emacs uses the very visible cursor, and switches
+to it when you start or resume Emacs.  If the variable
+@code{visible-cursor} is @code{nil} when Emacs starts or resumes, it
+doesn't switch, so it uses the normal cursor.
+
+@cindex cursor in non-selected windows
+@vindex cursor-in-non-selected-windows
+  Normally, the cursor appears in non-selected windows in the ``off''
+state, with the same appearance as when the blinking cursor blinks
+``off.''  For a box cursor, this is a hollow box; for a bar cursor,
+this is a thinner bar.  To turn off cursors in non-selected windows,
+customize the variable @code{cursor-in-non-selected-windows} and assign
+it a @code{nil} value.
+
+@vindex x-stretch-cursor
+@cindex wide block cursor
+  On graphical displays, Emacs can optionally draw the block cursor
+as wide as the character under the cursor---for example, if the cursor
+is on a tab character, it would cover the full width occupied by that
+tab character.  To enable this feature, set the variable
+@code{x-stretch-cursor} to a non-@code{nil} value.
+
+@findex hl-line-mode
+@findex global-hl-line-mode
+@cindex highlight current line
+  To make the cursor even more visible, you can use HL Line mode, a
+minor mode that highlights the line containing point.  Use @kbd{M-x
+hl-line-mode} to enable or disable it in the current buffer.  @kbd{M-x
+global-hl-line-mode} enables or disables the same mode globally.
+
+@node Line Truncation
+@section Truncation of Lines
+
+@cindex truncation
+@cindex line truncation, and fringes
+  As an alternative to continuation, Emacs can display long lines by
+@dfn{truncation}.  This means that all the characters that do not fit
+in the width of the screen or window do not appear at all.  On
+graphical displays, a small straight arrow in the fringe indicates
+truncation at either end of the line.  On text-only terminals, @samp{$}
+appears in the first column when there is text truncated to the left,
+and in the last column when there is text truncated to the right.
+
+@vindex truncate-lines
+@findex toggle-truncate-lines
+  Horizontal scrolling automatically causes line truncation
+(@pxref{Horizontal Scrolling}).  You can explicitly enable line
+truncation for a particular buffer with the command @kbd{M-x
+toggle-truncate-lines}.  This works by locally changing the variable
+@code{truncate-lines}.  If that variable is non-@code{nil}, long lines
+are truncated; if it is @code{nil}, they are continued onto multiple
+screen lines.  Setting the variable @code{truncate-lines} in any way
+makes it local to the current buffer; until that time, the default
+value is in effect.  The default value is normally @code{nil}.
+
+@c @vindex truncate-partial-width-windows  @c Idx entry is in Split Windows.
+  If the variable @code{truncate-partial-width-windows} is
+non-@code{nil}, it forces truncation rather than continuation in any
+window less than the full width of the screen or frame, regardless of
+the value of @code{truncate-lines}.  For information about side-by-side
+windows, see @ref{Split Window}.  See also @ref{Display,, Display,
+elisp, The Emacs Lisp Reference Manual}.
+
+@vindex overflow-newline-into-fringe
+  If the variable @code{overflow-newline-into-fringe} is
+non-@code{nil} on a graphical display, then Emacs does not continue or
+truncate a line which is exactly as wide as the window.  Instead, the
+newline overflows into the right fringe, and the cursor appears in the
+fringe when positioned on that newline.
+
+@node Display Custom
+@section Customization of Display
+
+  This section describes variables (@pxref{Variables}) that you can
+change to customize how Emacs displays.  Beginning users can skip
+it.
+@c the reason for that pxref is because an xref early in the
+@c ``echo area'' section leads here.
+
+@vindex inverse-video
+  If the variable @code{inverse-video} is non-@code{nil}, Emacs attempts
+to invert all the lines of the display from what they normally are.
+
+@vindex visible-bell
+  If the variable @code{visible-bell} is non-@code{nil}, Emacs attempts
+to make the whole screen blink when it would normally make an audible bell
+sound.  This variable has no effect if your terminal does not have a way
+to make the screen blink.
+
+@vindex echo-keystrokes
+  The variable @code{echo-keystrokes} controls the echoing of multi-character
+keys; its value is the number of seconds of pause required to cause echoing
+to start, or zero, meaning don't echo at all.  The value takes effect when
+there is someting to echo.  @xref{Echo Area}.
+
+@vindex baud-rate
+  The variable @anchor{baud-rate}@code{baud-rate} holds the output
+speed of the terminal, as far as Emacs knows.  Setting this variable
+does not change the speed of actual data transmission, but the value
+is used for calculations.  On text-only terminals, it affects padding,
+and decisions about whether to scroll part of the screen or redraw it
+instead.  It also affects the behavior of incremental search.
+
+  On graphical displays, @code{baud-rate} is only used to determine
+how frequently to look for pending input during display updating.  A
+higher value of @code{baud-rate} means that check for pending input
+will be done less frequently.
+
+@cindex hourglass pointer display
+@vindex hourglass-delay
+  On graphical display, Emacs can optionally display the mouse pointer
+in a special shape to say that Emacs is busy.  To turn this feature on
+or off, customize the group @code{cursor}.  You can also control the
+amount of time Emacs must remain busy before the busy indicator is
+displayed, by setting the variable @code{hourglass-delay}.
+
+@vindex overline-margin
+  On graphical display, this variables specifies the vertical position
+of an overline above the text, including the height of the overline
+itself (1 pixel).  The default value is 2 pixels.
+
+@vindex x-underline-at-descent-line
+  On graphical display, Emacs normally draws an underline at the
+baseline level of the font.  If @code{x-underline-at-descent-line} is
+non-@code{nil}, Emacs draws the underline at the same height as the
+font's descent line.
+
+@findex tty-suppress-bold-inverse-default-colors
+  On some text-only terminals, bold face and inverse video together
+result in text that is hard to read.  Call the function
+@code{tty-suppress-bold-inverse-default-colors} with a non-@code{nil}
+argument to suppress the effect of bold-face in this case.
+
+@vindex no-redraw-on-reenter
+  On a text-only terminal, when you reenter Emacs after suspending, Emacs
+normally clears the screen and redraws the entire display.  On some
+terminals with more than one page of memory, it is possible to arrange
+the termcap entry so that the @samp{ti} and @samp{te} strings (output
+to the terminal when Emacs is entered and exited, respectively) switch
+between pages of memory so as to use one page for Emacs and another
+page for other output.  On such terminals, you might want to set the variable
+@code{no-redraw-on-reenter} non-@code{nil}; this tells Emacs to
+assume, when resumed, that the screen page it is using still contains
+what Emacs last wrote there.
+
+@ignore
+   arch-tag: 2219f910-2ff0-4521-b059-1bd231a536c4
+@end ignore
diff --git a/doc/emacs/doclicense.texi b/doc/emacs/doclicense.texi
new file mode 100644 (file)
index 0000000..1e5d579
--- /dev/null
@@ -0,0 +1,416 @@
+@c -*-texinfo-*-
+@center Version 1.2, November 2002
+
+@display
+Copyright (C) 2000,2001,2002  Free Software Foundation, Inc.
+51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+@end display
+@sp 1
+@enumerate 0
+@item
+PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document ``free'' in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of ``copyleft,'' which means that derivative
+works of the document must themselves be free in the same sense.  It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does.  But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book.  We recommend this License
+principally for works whose purpose is instruction or reference.
+
+@sp 1
+@item
+APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License.  Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein.  The ``Document,'' below,
+refers to any such manual or work.  Any member of the public is a
+licensee, and is addressed as ``you.''  You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A ``Modified Version'' of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A ``Secondary Section'' is a named appendix or a front-matter section of
+the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall subject
+(or to related matters) and contains nothing that could fall directly
+within that overall subject.  (Thus, if the Document is in part a
+textbook of mathematics, a Secondary Section may not explain any
+mathematics.)  The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The ``Invariant Sections'' are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License.  If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant.  The Document may contain zero
+Invariant Sections.  If the Document does not identify any Invariant
+Sections then there are none.
+
+The ``Cover Texts'' are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License.  A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A ``Transparent'' copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters.  A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text.  A copy that is not ``Transparent'' is called ``Opaque.''
+
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input format, SGML
+or XML using a publicly available DTD, and standard-conforming simple
+HTML, PostScript or PDF designed for human modification.  Examples of
+transparent image formats include PNG, XCF and JPG.  Opaque formats
+include proprietary formats that can be read and edited only by
+proprietary word processors, SGML or XML for which the DTD and/or
+processing tools are not generally available, and the
+machine-generated HTML, PostScript or PDF produced by some word
+processors for output purposes only.
+
+The ``Title Page'' means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page.  For works in
+formats which do not have any title page as such, ``Title Page'' means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+A section ``Entitled XYZ'' means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language.  (Here XYZ stands for a
+specific section name mentioned below, such as ``Acknowledgements,''
+``Dedications,'' ``Endorsements,'' or ``History.'')  To ``Preserve the Title''
+of such a section when you modify the Document means that it remains a
+section ``Entitled XYZ'' according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document.  These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+@sp 1
+@item
+VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License.  You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute.  However, you may accept
+compensation in exchange for copies.  If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+@sp 1
+@item
+COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover.  Both covers must also clearly and legibly identify
+you as the publisher of these copies.  The front cover must present
+the full title with all words of the title equally prominent and
+visible.  You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+@sp 1
+@item
+MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it.  In addition, you must do these things in the Modified Version:
+
+A. Use in the Title Page (and on the covers, if any) a title distinct
+   from that of the Document, and from those of previous versions
+   (which should, if there were any, be listed in the History section
+   of the Document).  You may use the same title as a previous version
+   if the original publisher of that version gives permission.@*
+B. List on the Title Page, as authors, one or more persons or entities
+   responsible for authorship of the modifications in the Modified
+   Version, together with at least five of the principal authors of the
+   Document (all of its principal authors, if it has fewer than five),
+   unless they release you from this requirement.@*
+C. State on the Title page the name of the publisher of the
+   Modified Version, as the publisher.@*
+D. Preserve all the copyright notices of the Document.@*
+E. Add an appropriate copyright notice for your modifications
+   adjacent to the other copyright notices.@*
+F. Include, immediately after the copyright notices, a license notice
+   giving the public permission to use the Modified Version under the
+   terms of this License, in the form shown in the Addendum below.@*
+G. Preserve in that license notice the full lists of Invariant Sections
+   and required Cover Texts given in the Document's license notice.@*
+H. Include an unaltered copy of this License.@*
+I. Preserve the section Entitled ``History,'' Preserve its Title, and add
+   to it an item stating at least the title, year, new authors, and
+   publisher of the Modified Version as given on the Title Page.  If
+   there is no section Entitled ``History'' in the Document, create one
+   stating the title, year, authors, and publisher of the Document as
+   given on its Title Page, then add an item describing the Modified
+   Version as stated in the previous sentence.@*
+J. Preserve the network location, if any, given in the Document for
+   public access to a Transparent copy of the Document, and likewise
+   the network locations given in the Document for previous versions
+   it was based on.  These may be placed in the ``History'' section.
+   You may omit a network location for a work that was published at
+   least four years before the Document itself, or if the original
+   publisher of the version it refers to gives permission.@*
+K. For any section Entitled ``Acknowledgements'' or ``Dedications,''
+   Preserve the Title of the section, and preserve in the section all
+   the substance and tone of each of the contributor acknowledgements
+   and/or dedications given therein.@*
+L. Preserve all the Invariant Sections of the Document,
+   unaltered in their text and in their titles.  Section numbers
+   or the equivalent are not considered part of the section titles.@*
+M. Delete any section Entitled ``Endorsements.''  Such a section
+   may not be included in the Modified Version.@*
+N. Do not retitle any existing section to be Entitled ``Endorsements''
+   or to conflict in title with any Invariant Section.@*
+O. Preserve any Warranty Disclaimers.@*
+@sp 1
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant.  To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled ``Endorsements,'' provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version.  Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity.  If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+@sp 1
+@item
+COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy.  If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled ``History''
+in the various original documents, forming one section Entitled
+``History''; likewise combine any sections Entitled ``Acknowledgements,''
+and any sections Entitled ``Dedications.''  You must delete all sections
+Entitled ``Endorsements.''
+@sp 1
+@item
+COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+@sp 1
+@item
+AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an ``aggregate'' if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+@sp 1
+@item
+TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections.  You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers.  In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled ``Acknowledgements,''
+``Dedications,'' or ``History,'' the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+@sp 1
+@item
+TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License.  Any other attempt to
+copy, modify, sublicense or distribute the Document is void, and will
+automatically terminate your rights under this License.  However,
+parties who have received copies, or rights, from you under this
+License will not have their licenses terminated so long as such
+parties remain in full compliance.
+@sp 1
+@item
+FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time.  Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.  See
+http://www.gnu.org/copyleft/.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License ``or any later version'' applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation.  If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+
+@end enumerate
+
+@unnumberedsec ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+@smallexample
+@group
+Copyright (C)  @var{year}  @var{your name}.
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the Free Software Foundation;
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+A copy of the license is included in the section entitled ``GNU
+Free Documentation License.''
+@end group
+@end smallexample
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the ``with...Texts.'' line with this:
+
+@smallexample
+@group
+with the Invariant Sections being @var{list their titles}, with the
+Front-Cover Texts being @var{list}, and with the Back-Cover Texts being
+@var{list}.
+@end group
+@end smallexample
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+
+@ignore
+   arch-tag: d68e7b7a-0c7c-4c15-905b-a9482214e25a
+@end ignore
diff --git a/doc/emacs/emacs-xtra.texi b/doc/emacs/emacs-xtra.texi
new file mode 100644 (file)
index 0000000..c442331
--- /dev/null
@@ -0,0 +1,126 @@
+\input texinfo    @c -*-texinfo-*-
+@comment %**start of header
+@setfilename ../../info/emacs-xtra
+@settitle Specialized Emacs Features
+@syncodeindex fn cp
+@syncodeindex vr cp
+@syncodeindex ky cp
+@comment %**end of header
+
+@copying
+This manual describes specialized features of Emacs.
+
+Copyright @copyright{} 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with the Front-Cover texts being ``A GNU
+Manual,'' and with the Back-Cover Texts as in (a) below.  A copy of the
+license is included in the section entitled ``GNU Free Documentation
+License'' in the Emacs manual.
+
+(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
+this GNU Manual, like GNU software.  Copies published by the Free
+Software Foundation raise funds for GNU development.''
+
+This document is part of a collection distributed under the GNU Free
+Documentation License.  If you want to distribute this document
+separately from the collection, you can do so by adding a copy of the
+license to the document, as described in section 6 of the license.
+@end quotation
+@end copying
+
+@dircategory Emacs
+@direntry
+* Emacs-Xtra: (emacs-xtra).    Specialized Emacs features.
+@end direntry
+
+@titlepage
+@title Specialized Emacs Features
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+@contents
+
+@ifnottex
+@node Top
+@top Specialized Emacs Features
+
+@insertcopying
+
+@end ifnottex
+
+@menu
+* Introduction::        What documentation belongs here?
+@iftex
+* Picture Mode::        Editing pictures made up of characters using 
+                         the quarter-plane screen model.
+
+* Autorevert::          Auto Reverting non-file buffers.
+* Subdir Switches::     Subdirectory switches in Dired.
+* Advanced Calendar/Diary Usage:: Advanced Calendar/Diary customization.
+* Emerge::              A convenient way of merging two versions of a program.
+* Advanced VC Usage::   Advanced VC (version control) features.
+* Fortran::             Fortran mode and its special features.
+* MS-DOS::              Using Emacs on MS-DOS (otherwise known as @dfn{MS-DOG}).
+@end iftex
+* Index::
+@end menu
+
+@node Introduction
+@unnumbered Introduction
+
+This manual contains detailed information about various features that
+are too specialized to be included in the printed Emacs manual.  It is
+intended to be readable by anyone having a basic knowledge of Emacs.
+However, certain sections may be intended for a more specialized
+audience, such as Elisp authors.  This should be clearly pointed out
+at the beginning of these sections.
+
+Certain packages, or collections of related features, have their own
+manuals, separate from the main Emacs User's manual.  This manual is
+intended as a complement, rather than an alternative, to reading those
+additional manuals; in a nutshell, it is a collection of smaller
+specialized features, too small or too obscure to justify their own
+manual.
+
+Sections intended specifically for Elisp programmers can follow the
+style of the Elisp manual.  Other sections should follow the style of
+the Emacs manual.
+
+@iftex
+@c ``Picture Mode'' is a chapter, not a section, so it's outside @raisesections.
+@include picture-xtra.texi
+
+@raisesections
+@include arevert-xtra.texi
+
+@include dired-xtra.texi
+
+@include cal-xtra.texi
+
+@include emerge-xtra.texi
+
+@include vc-xtra.texi
+
+@include fortran-xtra.texi
+
+@include msdog-xtra.texi
+
+@lowersections
+@end iftex
+
+@node Index
+@unnumbered Index
+
+@printindex cp
+
+@bye
+
+@ignore
+   arch-tag: 75c33f13-32c6-41b6-9537-847a312e2e49
+@end ignore
diff --git a/doc/emacs/emacs.texi b/doc/emacs/emacs.texi
new file mode 100644 (file)
index 0000000..96cf365
--- /dev/null
@@ -0,0 +1,1365 @@
+\input texinfo
+
+@setfilename ../../info/emacs
+@settitle GNU Emacs Manual
+
+@c The edition number appears in several places in this file
+@set EDITION   Sixteenth
+@set EMACSVER  23.0.50
+
+@copying
+This is the @value{EDITION} edition of the @cite{GNU Emacs Manual},@*
+updated for Emacs version @value{EMACSVER}.
+
+Copyright @copyright{} 1985, 1986, 1987, 1993, 1994, 1995, 1996, 1997,
+1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software
+Foundation, Inc.
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with the
+Invariant Sections being ``The GNU Manifesto,'' ``Distribution'' and
+``GNU GENERAL PUBLIC LICENSE,'' with the Front-Cover texts being ``A GNU
+Manual,'' and with the Back-Cover Texts as in (a) below.  A copy of the
+license is included in the section entitled ``GNU Free Documentation
+License.''
+
+(a) The FSF's Back-Cover Text is: ``You are free to copy and modify
+this GNU Manual. Buying copies from GNU Press supports the FSF in
+developing GNU and promoting software freedom.''
+@end quotation
+@end copying
+
+@dircategory Emacs
+@direntry
+* Emacs: (emacs).      The extensible self-documenting text editor.
+@end direntry
+
+@c in general, keep the following line commented out, unless doing a
+@c copy of this manual that will be published.  The manual should go
+@c onto the distribution in the full, 8.5 x 11" size.
+@c set smallbook
+
+@ifset smallbook
+@smallbook
+@end ifset
+
+@c per rms and peterb, use 10pt fonts for the main text, mostly to
+@c save on paper cost.
+@c Do this inside @tex for now, so current makeinfo does not complain.
+@tex
+@ifset smallbook
+@fonttextsize 10
+@set EMACSVER 22
+\global\let\urlcolor=\Black % don't print links in grayscale
+\global\let\linkcolor=\Black
+@end ifset
+\global\hbadness=6666 % don't worry about not-too-underfull boxes
+@end tex
+
+@defcodeindex op
+@synindex pg cp
+
+@iftex
+@kbdinputstyle code
+
+@shorttitlepage GNU Emacs Manual
+@end iftex
+
+@titlepage
+@sp 6
+@center @titlefont{GNU Emacs Manual}
+@sp 4
+@center @value{EDITION} Edition, Updated for Emacs Version @value{EMACSVER}.
+@sp 5
+@center Richard Stallman
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+
+@sp 2
+Published by the Free Software Foundation @*
+51 Franklin Street, Fifth Floor @*
+Boston, MA 02110-1301 USA @*
+ISBN 1-882114-86-8
+
+@sp 2
+Cover art by Etienne Suvasa.
+
+@end titlepage
+
+
+@summarycontents
+@contents
+
+
+@ifnottex
+@node Top, Distrib, (dir), (dir)
+@top The Emacs Editor
+
+Emacs is the extensible, customizable, self-documenting real-time
+display editor.  This Info file describes how to edit with Emacs and
+some of how to customize it; it corresponds to GNU Emacs version
+@value{EMACSVER}.
+
+@ifinfo
+To learn more about the Info documentation system, type @kbd{h}, and
+Emacs will take you to a programmed instruction sequence for the Info
+commands.
+@end ifinfo
+
+For information on extending Emacs, see @ref{Top, Emacs Lisp,, elisp, The
+Emacs Lisp Reference Manual}.
+@end ifnottex
+
+@ignore
+These subcategories have been deleted for simplicity
+and to avoid conflicts.
+Completion
+Backup Files
+Auto-Saving: Protection Against Disasters
+Snapshots
+Text Mode
+Outline Mode
+@TeX{} Mode
+Formatted Text
+Shell Command History
+
+The ones for Dired and Rmail have had the items turned into :: items
+to avoid conflicts.
+Also Running Shell Commands from Emacs
+and Sending Mail and Registers and Minibuffer.
+@end ignore
+
+@menu
+* Distrib::            How to get the latest Emacs distribution.
+* Copying::            The GNU General Public License gives you permission
+                         to redistribute GNU Emacs on certain terms;
+                         it also explains that there is no warranty.
+* GNU Free Documentation License:: The license for this documentation.
+* Intro::              An introduction to Emacs concepts.
+* Glossary::           Terms used in this manual.
+* Antinews::           Information about Emacs version 21.
+* Mac OS::              Using Emacs in the Mac.
+* Microsoft Windows::   Using Emacs on Microsoft Windows and MS-DOS.
+* Manifesto::          What's GNU?  Gnu's Not Unix!
+* Acknowledgments::     Major contributors to GNU Emacs.
+
+Indexes (each index contains a large menu)
+* Key Index::          An item for each standard Emacs key sequence.
+* Option Index::        An item for every command-line option.
+* Command Index::       An item for each command name.
+* Variable Index::      An item for each documented variable.
+* Concept Index::       An item for each concept.
+
+Important General Concepts
+* Screen::             How to interpret what you see on the screen.
+* User Input::         Kinds of input events (characters, buttons,
+                          function keys).
+* Keys::               Key sequences: what you type to request one
+                          editing action.
+* Commands::           Named functions run by key sequences to do editing.
+* Text Characters::     Character set for text (the contents of buffers
+                         and strings).
+* Entering Emacs::      Starting Emacs from the shell.
+* Exiting::            Stopping or killing Emacs.
+* Emacs Invocation::    Hairy startup options.
+
+Fundamental Editing Commands
+* Basic::              The most basic editing commands.
+* Minibuffer::         Entering arguments that are prompted for.
+* M-x::                        Invoking commands by their names.
+* Help::               Commands for asking Emacs about its commands.
+
+Important Text-Changing Commands
+* Mark::               The mark: how to delimit a ``region'' of text.
+* Killing::            Killing (cutting) text.
+* Yanking::            Recovering killed text.  Moving text. (Pasting.)
+* Accumulating Text::   Other ways of copying text.
+* Rectangles::         Operating on the text inside a rectangle on the screen.
+* Registers::          Saving a text string or a location in the buffer.
+* Display::            Controlling what text is displayed.
+* Search::             Finding or replacing occurrences of a string.
+* Fixit::              Commands especially useful for fixing typos.
+* Keyboard Macros::    A keyboard macro records a sequence of
+                         keystrokes to be replayed with a single command.
+
+Major Structures of Emacs
+* Files::              All about handling files.
+* Buffers::            Multiple buffers; editing several files at once.
+* Windows::            Viewing two pieces of text at once.
+* Frames::             Running the same Emacs session in multiple X windows.
+* International::       Using non-@acronym{ASCII} character sets (the MULE features).
+
+Advanced Features
+* Major Modes::                Text mode vs. Lisp mode vs. C mode ...
+* Indentation::                Editing the white space at the beginnings of lines.
+* Text::               Commands and modes for editing English.
+* Programs::           Commands and modes for editing programs.
+* Building::           Compiling, running and debugging programs.
+* Maintaining::         Features for maintaining large programs.
+* Abbrevs::            How to define text abbreviations to reduce
+                         the number of characters you must type.
+@ifnottex
+* Picture Mode::        Editing pictures made up of characters using
+                          the quarter-plane screen model.
+@end ifnottex
+* Sending Mail::        Sending mail in Emacs.
+* Rmail::              Reading mail in Emacs.
+* Dired::              You can ``edit'' a directory to manage files in it.
+* Calendar/Diary::      The calendar and diary facilities.
+* Gnus::               How to read netnews with Emacs.
+* Shell::              Executing shell commands from Emacs.
+* Emacs Server::        Using Emacs as an editing server for @code{mail}, etc.
+* Printing::           Printing hardcopies of buffers or regions.
+* Sorting::            Sorting lines, paragraphs or pages within Emacs.
+* Narrowing::          Restricting display and editing to a portion
+                         of the buffer.
+* Two-Column::         Splitting apart columns to edit them
+                         in side-by-side windows.
+* Editing Binary Files::Using Hexl mode to edit binary files.
+* Saving Emacs Sessions:: Saving Emacs state from one session to the next.
+* Recursive Edit::      A command can allow you to do editing
+                         "within the command".  This is called a
+                         "recursive editing level".
+* Emulation::          Emulating some other editors with Emacs.
+* Hyperlinking::        Following links in buffers.
+* Dissociated Press::   Dissociating text for fun.
+* Amusements::         Various games and hacks.
+* Customization::       Modifying the behavior of Emacs.
+* X Resources::         X resources for customizing Emacs.
+
+Recovery from Problems
+* Quitting::           Quitting and aborting.
+* Lossage::            What to do if Emacs is hung or malfunctioning.
+* Bugs::               How and when to report a bug.
+* Contributing::        How to contribute improvements to Emacs.
+* Service::            How to get help for your own Emacs needs.
+
+@c Do NOT modify the following 3 lines!  They must have this form to
+@c be correctly identified by `texinfo-multiple-files-update'.  In
+@c particular, the detailed menu header line MUST be identical to the
+@c value of `texinfo-master-menu-header'.  See texnfo-upd.el.
+
+@detailmenu
+ --- The Detailed Node Listing ---
+ ---------------------------------
+
+Here are some other nodes which are really inferiors of the ones
+already listed, mentioned here so you can get to them in one step:
+
+The Organization of the Screen
+
+* Point::              The place in the text where editing commands operate.
+* Echo Area::           Short messages appear at the bottom of the screen.
+* Mode Line::          Interpreting the mode line.
+* Menu Bar::            How to use the menu bar.
+
+Basic Editing Commands
+
+* Inserting Text::      Inserting text by simply typing it.
+* Moving Point::        How to move the cursor to the place where you want to
+                         change something.
+* Erasing::            Deleting and killing text.
+* Basic Undo::         Undoing recent changes in the text.
+* Basic Files::         Visiting, creating, and saving files.
+* Basic Help::          Asking what a character does.
+* Blank Lines::                Commands to make or delete blank lines.
+* Continuation Lines::  Lines too wide for the screen.
+* Position Info::       What page, line, row, or column is point on?
+* Arguments::          Numeric arguments for repeating a command.
+* Repeating::           A short-cut for repeating the previous command.
+
+The Minibuffer
+
+* Minibuffer File::     Entering file names with the minibuffer.
+* Minibuffer Edit::     How to edit in the minibuffer.
+* Completion::         An abbreviation facility for minibuffer input.
+* Minibuffer History:: Reusing recent minibuffer arguments.
+* Repetition::         Re-executing commands that used the minibuffer.
+
+Completion
+
+* Example: Completion Example.    Examples of using completion.
+* Commands: Completion Commands.  A list of completion commands.
+* Strict Completion::             Different types of completion.
+* Options: Completion Options.    Options for completion.
+
+Help
+
+* Help Summary::       Brief list of all Help commands.
+* Key Help::           Asking what a key does in Emacs.
+* Name Help::          Asking about a command, variable or function name.
+* Apropos::            Asking what pertains to a given topic.
+* Help Mode::           Special features of Help mode and Help buffers.
+* Library Keywords::   Finding Lisp libraries by keywords (topics).
+* Language Help::       Help relating to international language support.
+* Misc Help::          Other help commands.
+* Help Files::          Commands to display pre-written help files.
+* Help Echo::           Help on active text and tooltips (`balloon help')
+
+The Mark and the Region
+
+* Setting Mark::       Commands to set the mark.
+* Transient Mark::     How to make Emacs highlight the region--
+                         when there is one.
+* Momentary Mark::      Enabling Transient Mark mode momentarily.
+* Using Region::       Summary of ways to operate on contents of the region.
+* Marking Objects::    Commands to put region around textual units.
+* Mark Ring::          Previous mark positions saved so you can go back there.
+* Global Mark Ring::   Previous mark positions in various buffers.
+
+Killing and Moving Text
+
+* Deletion::           Commands for deleting small amounts of text and
+                         blank areas.
+* Killing by Lines::   How to kill entire lines of text at one time.
+* Other Kill Commands:: Commands to kill large regions of text and
+                         syntactic units such as words and sentences.
+* CUA Bindings::        Using @kbd{C-x}, @kbd{C-c}, @kbd{C-v} for copy
+                          and paste, with enhanced rectangle support.
+
+Yanking
+
+* Kill Ring::          Where killed text is stored.  Basic yanking.
+* Appending Kills::    Several kills in a row all yank together.
+* Earlier Kills::      Yanking something killed some time ago.
+
+Registers
+
+* RegPos::             Saving positions in registers.
+* RegText::            Saving text in registers.
+* RegRect::            Saving rectangles in registers.
+* RegConfig::           Saving window configurations in registers.
+* RegNumbers::          Numbers in registers.
+* RegFiles::           File names in registers.
+* Bookmarks::           Bookmarks are like registers, but persistent.
+
+Controlling the Display
+
+* Scrolling::             Moving text up and down in a window.
+* Auto Scrolling::         Redisplay scrolls text automatically when needed.
+* Horizontal Scrolling::   Moving text left and right in a window.
+* Follow Mode::            Follow mode lets two windows scroll as one.
+* Faces::                 How to change the display style using faces.
+* Standard Faces::         Emacs' predefined faces.
+* Font Lock::              Minor mode for syntactic highlighting using faces.
+* Highlight Interactively:: Tell Emacs what text to highlight.
+* Fringes::                Enabling or disabling window fringes.
+* Displaying Boundaries::  Displaying top and bottom of the buffer.
+* Useless Whitespace::     Showing possibly-spurious trailing whitespace.
+* Selective Display::      Hiding lines with lots of indentation.
+* Optional Mode Line::     Optional mode line display features.
+* Text Display::           How text characters are normally displayed.
+* Cursor Display::         Features for displaying the cursor.
+* Line Truncation::        Truncating lines to fit the screen width instead
+                             of continuing them to multiple screen lines.
+* Display Custom::         Information on variables for customizing display.
+
+Searching and Replacement
+
+* Incremental Search::    Search happens as you type the string.
+* Nonincremental Search::  Specify entire string and then search.
+* Word Search::                   Search for sequence of words.
+* Regexp Search::         Search for match for a regexp.
+* Regexps::               Syntax of regular expressions.
+* Regexp Backslash::       Regular expression constructs starting with `\'.
+* Regexp Example::         A complex regular expression explained.
+* Search Case::                   To ignore case while searching, or not.
+* Replace::               Search, and replace some or all matches.
+* Other Repeating Search:: Operating on all matches for some regexp.
+
+Incremental Search
+
+* Basic Isearch::       Basic incremental search commands.
+* Repeat Isearch::      Searching for the same string again.
+* Error in Isearch::    When your string is not found.
+* Special Isearch::     Special input in incremental search.
+* Non-ASCII Isearch::   How to search for non-ASCII characters.
+* Isearch Yank::        Commands that grab text into the search string
+                          or else edit the search string.
+* Highlight Isearch::   Isearch highlights the other possible matches.
+* Isearch Scroll::      Scrolling during an incremental search.
+* Slow Isearch::        Incremental search features for slow terminals.
+
+Replacement Commands
+
+* Unconditional Replace::  Replacing all matches for a string.
+* Regexp Replace::        Replacing all matches for a regexp.
+* Replacement and Case::   How replacements preserve case of letters.
+* Query Replace::         How to use querying.
+
+Commands for Fixing Typos
+
+* Undo::                Full details of Emacs undo commands.
+* Kill Errors::         Commands to kill a batch of recently entered text.
+* Transpose::          Exchanging two characters, words, lines, lists...
+* Fixing Case::         Correcting case of last word entered.
+* Spelling::           Apply spelling checker to a word or a whole buffer.
+
+Keyboard Macros
+
+* Basic Keyboard Macro::     Defining and running keyboard macros.
+* Keyboard Macro Ring::      Where previous keyboard macros are saved.
+* Keyboard Macro Counter::   Inserting incrementing numbers in macros.
+* Keyboard Macro Query::     Making keyboard macros do different things each time.
+* Save Keyboard Macro::      Giving keyboard macros names; saving them in files.
+* Edit Keyboard Macro::      Editing keyboard macros.
+* Keyboard Macro Step-Edit:: Interactively executing and editing a keyboard
+                                macro.
+
+File Handling
+
+* File Names::          How to type and edit file-name arguments.
+* Visiting::            Visiting a file prepares Emacs to edit the file.
+* Saving::              Saving makes your changes permanent.
+* Reverting::           Reverting cancels all the changes not saved.
+* Autorevert::          Auto Reverting non-file buffers.
+* Auto Save::           Auto Save periodically protects against loss of data.
+* File Aliases::        Handling multiple names for one file.
+* Version Control::     Version control systems (RCS, CVS and SCCS).
+* Directories::         Creating, deleting, and listing file directories.
+* Comparing Files::     Finding where two files differ.
+* Diff Mode::           Editing diff output.
+* Misc File Ops::       Other things you can do on files.
+* Compressed Files::    Accessing compressed files.
+* File Archives::       Operating on tar, zip, jar etc. archive files.
+* Remote Files::        Accessing files on other sites.
+* Quoted File Names::   Quoting special characters in file names.
+* File Name Cache::     Completion against a list of files you often use.
+* File Conveniences::   Convenience Features for Finding Files.
+* Filesets::            Handling sets of files.
+
+Saving Files
+
+* Save Commands::       Commands for saving files.
+* Backup::              How Emacs saves the old version of your file.
+* Customize Save::      Customizing the saving of files.
+* Interlocking::        How Emacs protects against simultaneous editing
+                          of one file by two users.
+* File Shadowing::      Copying files to "shadows" automatically.
+* Time Stamps::         Emacs can update time stamps on saved files.
+
+Backup Files
+
+* One or Many: Numbered Backups. Whether to make one backup file or many.
+* Names: Backup Names.         How backup files are named.
+* Deletion: Backup Deletion.   Emacs deletes excess numbered backups.
+* Copying: Backup Copying.     Backups can be made by copying or renaming.
+
+Auto-Saving: Protection Against Disasters
+
+* Files: Auto Save Files.       The file where auto-saved changes are
+                                  actually made until you save the file.
+* Control: Auto Save Control.   Controlling when and how often to auto-save.
+* Recover::                    Recovering text from auto-save files.
+
+Version Control
+
+* Introduction to VC::  How version control works in general.
+* VC Mode Line::        How the mode line shows version control status.
+* Basic VC Editing::    How to edit a file under version control.
+* Old Versions::        Examining and comparing old versions.
+* Secondary VC Commands:: The commands used a little less frequently.
+* Branches::            Multiple lines of development.
+* Remote Repositories:: Efficient access to remote CVS servers.
+* Snapshots::           Sets of file versions treated as a unit.
+* Miscellaneous VC::    Various other commands and features of VC.
+* Customizing VC::      Variables that change VC's behavior.
+
+Using Multiple Buffers
+
+* Select Buffer::       Creating a new buffer or reselecting an old one.
+* List Buffers::        Getting a list of buffers that exist.
+* Misc Buffer::                Renaming; changing read-onliness; copying text.
+* Kill Buffer::                Killing buffers you no longer need.
+* Several Buffers::     How to go through the list of all buffers
+                         and operate variously on several of them.
+* Indirect Buffers::    An indirect buffer shares the text of another buffer.
+* Buffer Convenience::  Convenience and customization features for
+                          buffer handling.
+
+Multiple Windows
+
+* Basic Window::        Introduction to Emacs windows.
+* Split Window::        New windows are made by splitting existing windows.
+* Other Window::        Moving to another window or doing something to it.
+* Pop Up Window::       Finding a file or buffer in another window.
+* Force Same Window::   Forcing certain buffers to appear in the selected
+                          window rather than in another window.
+* Change Window::       Deleting windows and changing their sizes.
+* Window Convenience::  Convenience functions for window handling.
+
+Frames and Graphical Displays
+
+* Cut and Paste::       Mouse commands for cut and paste.
+* Mouse References::    Using the mouse to select an item from a list.
+* Menu Mouse Clicks::   Mouse clicks that bring up menus.
+* Mode Line Mouse::     Mouse clicks on the mode line.
+* Creating Frames::     Creating additional Emacs frames with various contents.
+* Frame Commands::      Iconifying, deleting, and switching frames.
+* Speedbar::            How to make and use a speedbar frame.
+* Multiple Displays::   How one Emacs job can talk to several displays.
+* Special Buffer Frames::  You can make certain buffers have their own frames.
+* Frame Parameters::    Changing the colors and other modes of frames.
+* Scroll Bars::                How to enable and disable scroll bars; how to use them.
+* Wheeled Mice::        Using mouse wheels for scrolling.
+* Drag and Drop::       Using drag and drop to open files and insert text.
+* Menu Bars::          Enabling and disabling the menu bar.
+* Tool Bars::           Enabling and disabling the tool bar.
+* Dialog Boxes::        Controlling use of dialog boxes.
+* Tooltips::            Showing "tooltips", AKA "balloon help" for active text.
+* Mouse Avoidance::     Moving the mouse pointer out of the way.
+* Non-Window Terminals::  Multiple frames on terminals that show only one.
+* Text-Only Mouse::     Using the mouse in text-only terminals.
+
+International Character Set Support
+
+* International Chars::     Basic concepts of multibyte characters.
+* Enabling Multibyte::      Controlling whether to use multibyte characters.
+* Language Environments::   Setting things up for the language you use.
+* Input Methods::           Entering text characters not on your keyboard.
+* Select Input Method::     Specifying your choice of input methods.
+* Multibyte Conversion::    How single-byte characters convert to multibyte.
+* Coding Systems::          Character set conversion when you read and
+                              write files, and so on.
+* Recognize Coding::        How Emacs figures out which conversion to use.
+* Specify Coding::          Specifying a file's coding system explicitly.
+* Output Coding::           Choosing coding systems for output.
+* Text Coding::             Choosing conversion to use for file text.
+* Communication Coding::    Coding systems for interprocess communication.
+* File Name Coding::        Coding systems for file @emph{names}.
+* Terminal Coding::         Specifying coding systems for converting
+                              terminal input and output.
+* Fontsets::                Fontsets are collections of fonts
+                              that cover the whole spectrum of characters.
+* Defining Fontsets::       Defining a new fontset.
+* Undisplayable Characters::When characters don't display.
+* Unibyte Mode::            You can pick one European character set
+                              to use without multibyte characters.
+* Charsets::                How Emacs groups its internal character codes.
+
+Major Modes
+
+* Choosing Modes::      How major modes are specified or chosen.
+
+Indentation
+
+* Indentation Commands::  Various commands and techniques for indentation.
+* Tab Stops::            You can set arbitrary "tab stops" and then
+                           indent to the next tab stop when you want to.
+* Just Spaces::                  You can request indentation using just spaces.
+
+Commands for Human Languages
+
+* Words::              Moving over and killing words.
+* Sentences::          Moving over and killing sentences.
+* Paragraphs::         Moving over paragraphs.
+* Pages::              Moving over pages.
+* Filling::            Filling or justifying text.
+* Case::               Changing the case of text.
+* Text Mode::          The major modes for editing text files.
+* Outline Mode::        Editing outlines.
+* TeX Mode::           Editing input to the formatter TeX.
+* HTML Mode::           Editing HTML, SGML, and XML files.
+* Nroff Mode::         Editing input to the formatter nroff.
+* Formatted Text::      Editing formatted text directly in WYSIWYG fashion.
+* Text Based Tables::   Editing text-based tables in WYSIWYG fashion.
+
+Filling Text
+
+* Auto Fill::          Auto Fill mode breaks long lines automatically.
+* Refill::              Keeping paragraphs filled.
+* Fill Commands::       Commands to refill paragraphs and center lines.
+* Fill Prefix::                Filling paragraphs that are indented
+                          or in a comment, etc.
+* Adaptive Fill::       How Emacs can determine the fill prefix automatically.
+* Longlines::           Editing text with very long lines.
+
+Outline Mode
+
+* Format: Outline Format.         What the text of an outline looks like.
+* Motion: Outline Motion.         Special commands for moving through
+                                     outlines.
+* Visibility: Outline Visibility.  Commands to control what is visible.
+* Views: Outline Views.            Outlines and multiple views.
+* Foldout::                        Folding means zooming in on outlines.
+
+@TeX{} Mode
+
+* Editing: TeX Editing.   Special commands for editing in TeX mode.
+* LaTeX: LaTeX Editing.   Additional commands for LaTeX input files.
+* Printing: TeX Print.    Commands for printing part of a file with TeX.
+* Misc: TeX Misc.         Customization of TeX mode, and related features.
+
+Editing Formatted Text
+
+* Requesting Formatted Text::   Entering and exiting Enriched mode.
+* Hard and Soft Newlines::      There are two different kinds of newlines.
+* Editing Format Info::         How to edit text properties.
+* Faces: Format Faces.          Bold, italic, underline, etc.
+* Color: Format Colors.         Changing the color of text.
+* Indent: Format Indentation.   Changing the left and right margins.
+* Justification: Format Justification.
+                                Centering, setting text flush with the
+                                  left or right margin, etc.
+* Other: Format Properties.     The "special" text properties submenu.
+* Forcing Enriched Mode::       How to force use of Enriched mode.
+
+Editing Text-based Tables
+
+* Table Definition::    What is a text based table.
+* Table Creation::      How to create a table.
+* Table Recognition::   How to activate and deactivate tables.
+* Cell Commands::       Cell-oriented commands in a table.
+* Cell Justification::  Justifying cell contents.
+* Row Commands::        Manipulating rows of table cell.
+* Column Commands::     Manipulating columns of table cell.
+* Fixed Width Mode::    Fixing cell width.
+* Table Conversion::    Converting between plain text and tables.
+* Measuring Tables::    Analyzing table dimension.
+* Table Misc::          Table miscellany.
+
+Editing Programs
+
+* Program Modes::       Major modes for editing programs.
+* Defuns::              Commands to operate on major top-level parts
+                          of a program.
+* Program Indent::      Adjusting indentation to show the nesting.
+* Parentheses::         Commands that operate on parentheses.
+* Comments::           Inserting, killing, and aligning comments.
+* Documentation::       Getting documentation of functions you plan to call.
+* Hideshow::            Displaying blocks selectively.
+* Symbol Completion::   Completion on symbol names of your program or language.
+* Glasses::             Making identifiersLikeThis more readable.
+* Misc for Programs::   Other Emacs features useful for editing programs.
+* C Modes::             Special commands of C, C++, Objective-C,
+                          Java, and Pike modes.
+* Asm Mode::            Asm mode and its special features.
+* Fortran::             Fortran mode and its special features.
+
+Top-Level Definitions, or Defuns
+
+* Left Margin Paren::   An open-paren or similar opening delimiter
+                          starts a defun if it is at the left margin.
+* Moving by Defuns::    Commands to move over or mark a major definition.
+* Imenu::               Making buffer indexes as menus.
+* Which Function::      Which Function mode shows which function you are in.
+
+Indentation for Programs
+
+* Basic Indent::       Indenting a single line.
+* Multi-line Indent::   Commands to reindent many lines at once.
+* Lisp Indent::                Specifying how each Lisp function should be indented.
+* C Indent::           Extra features for indenting C and related modes.
+* Custom C Indent::    Controlling indentation style for C and related modes.
+
+Commands for Editing with Parentheses
+
+* Expressions::         Expressions with balanced parentheses.
+* Moving by Parens::    Commands for moving up, down and across
+                          in the structure of parentheses.
+* Matching::           Insertion of a close-delimiter flashes matching open.
+
+Manipulating Comments
+
+* Comment Commands::    Inserting, killing, and aligning comments.
+* Multi-Line Comments:: Commands for adding and editing multi-line comments.
+* Options for Comments::Customizing the comment features.
+
+Documentation Lookup
+
+* Info Lookup::         Looking up library functions and commands
+                          in Info files.
+* Man Page::            Looking up man pages of library functions and commands.
+* Lisp Doc::            Looking up Emacs Lisp functions, etc.
+
+C and Related Modes
+
+* Motion in C::         Commands to move by C statements, etc.
+* Electric C::          Colon and other chars can automatically reindent.
+* Hungry Delete::       A more powerful DEL command.
+* Other C Commands::    Filling comments, viewing expansion of macros,
+                          and other neat features.
+
+Compiling and Testing Programs
+
+* Compilation::                Compiling programs in languages other
+                         than Lisp (C, Pascal, etc.).
+* Compilation Mode::    The mode for visiting compiler errors.
+* Compilation Shell::   Customizing your shell properly
+                          for use in the compilation buffer.
+* Grep Searching::      Searching with grep.
+* Flymake::             Finding syntax errors on the fly.
+* Debuggers::          Running symbolic debuggers for non-Lisp programs.
+* Executing Lisp::     Various modes for editing Lisp programs,
+                         with different facilities for running
+                         the Lisp programs.
+* Lisp Libraries::      Creating Lisp programs to run in Emacs.
+* Lisp Eval::          Executing a single Lisp expression in Emacs.
+* Lisp Interaction::    Executing Lisp in an Emacs buffer.
+* External Lisp::      Communicating through Emacs with a separate Lisp.
+
+Running Debuggers Under Emacs
+
+* Starting GUD::       How to start a debugger subprocess.
+* Debugger Operation:: Connection between the debugger and source buffers.
+* Commands of GUD::    Key bindings for common commands.
+* GUD Customization::  Defining your own commands for GUD.
+* GDB Graphical Interface::  An enhanced mode that uses GDB features to
+                          implement a graphical debugging environment through
+                          Emacs.
+
+Maintaining Large Programs
+
+* Change Log::         Maintaining a change history for your program.
+* Format of ChangeLog:: What the change log file looks like.
+* Tags::               Go direct to any function in your program in one
+                         command.  Tags remembers which file it is in.
+* Emerge::              A convenient way of merging two versions of a program.
+
+Tags Tables
+
+* Tag Syntax::         Tag syntax for various types of code and text files.
+* Create Tags Table::  Creating a tags table with @code{etags}.
+* Etags Regexps::       Create arbitrary tags using regular expressions.
+* Select Tags Table::  How to visit a tags table.
+* Find Tag::           Commands to find the definition of a specific tag.
+* Tags Search::                Using a tags table for searching and replacing.
+* List Tags::          Listing and finding tags defined in a file.
+
+Abbrevs
+
+* Abbrev Concepts::     Fundamentals of defined abbrevs.
+* Defining Abbrevs::    Defining an abbrev, so it will expand when typed.
+* Expanding Abbrevs::   Controlling expansion: prefixes, canceling expansion.
+* Editing Abbrevs::     Viewing or editing the entire list of defined abbrevs.
+* Saving Abbrevs::      Saving the entire list of abbrevs for another session.
+* Dynamic Abbrevs::     Abbreviations for words already in the buffer.
+* Dabbrev Customization:: What is a word, for dynamic abbrevs.  Case handling.
+
+@ifnottex
+Editing Pictures
+
+* Basic Picture::         Basic concepts and simple commands of Picture Mode.
+* Insert in Picture::     Controlling direction of cursor motion
+                            after "self-inserting" characters.
+* Tabs in Picture::       Various features for tab stops and indentation.
+* Rectangles in Picture:: Clearing and superimposing rectangles.
+@end ifnottex
+
+Sending Mail
+
+* Mail Format::        Format of the mail being composed.
+* Mail Headers::        Details of permitted mail header fields.
+* Mail Aliases::        Abbreviating and grouping mail addresses.
+* Mail Mode::          Special commands for editing mail being composed.
+* Mail Amusements::     Distract the NSA's attention; add a fortune to a msg.
+* Mail Methods::        Using alternative mail-composition methods.
+
+Reading Mail with Rmail
+
+* Rmail Basics::        Basic concepts of Rmail, and simple use.
+* Rmail Scrolling::     Scrolling through a message.
+* Rmail Motion::        Moving to another message.
+* Rmail Deletion::      Deleting and expunging messages.
+* Rmail Inbox::         How mail gets into the Rmail file.
+* Rmail Files::         Using multiple Rmail files.
+* Rmail Output::        Copying message out to files.
+* Rmail Labels::        Classifying messages by labeling them.
+* Rmail Attributes::    Certain standard labels, called attributes.
+* Rmail Reply::         Sending replies to messages you are viewing.
+* Rmail Summary::       Summaries show brief info on many messages.
+* Rmail Sorting::       Sorting messages in Rmail.
+* Rmail Display::       How Rmail displays a message; customization.
+* Rmail Coding::        How Rmail handles decoding character sets.
+* Rmail Editing::       Editing message text and headers in Rmail.
+* Rmail Digest::        Extracting the messages from a digest message.
+* Out of Rmail::       Converting an Rmail file to mailbox format.
+* Rmail Rot13::         Reading messages encoded in the rot13 code.
+* Movemail::            More details of fetching new mail.
+* Remote Mailboxes::    Retrieving Mail from Remote Mailboxes.
+* Other Mailbox Formats:: Retrieving Mail from Local Mailboxes in
+                          Various Formats
+
+Dired, the Directory Editor
+
+* Dired Enter::             How to invoke Dired.
+* Dired Navigation::         How to move in the Dired buffer.
+* Dired Deletion::           Deleting files with Dired.
+* Flagging Many Files::      Flagging files based on their names.
+* Dired Visiting::           Other file operations through Dired.
+* Marks vs Flags::          Flagging for deletion vs marking.
+* Operating on Files::      How to copy, rename, print, compress, etc.
+                              either one file or several files.
+* Shell Commands in Dired::  Running a shell command on the marked files.
+* Transforming File Names::  Using patterns to rename multiple files.
+* Comparison in Dired::             Running `diff' by way of Dired.
+* Subdirectories in Dired::  Adding subdirectories to the Dired buffer.
+* Subdir Switches::          Subdirectory switches in Dired.
+* Subdirectory Motion::             Moving across subdirectories, and up and down.
+* Hiding Subdirectories::    Making subdirectories visible or invisible.
+* Dired Updating::           Discarding lines for files of no interest.
+* Dired and Find::          Using `find' to choose the files for Dired.
+* Wdired::                   Operating on files by editing the Dired buffer.
+* Image-Dired::              Viewing image thumbnails in Dired
+* Misc Dired Features::      Various other features.
+
+The Calendar and the Diary
+
+* Calendar Motion::     Moving through the calendar; selecting a date.
+* Scroll Calendar::     Bringing earlier or later months onto the screen.
+* Counting Days::       How many days are there between two dates?
+* General Calendar::    Exiting or recomputing the calendar.
+* Writing Calendar Files:: Writing calendars to files of various formats.
+* Holidays::            Displaying dates of holidays.
+* Sunrise/Sunset::      Displaying local times of sunrise and sunset.
+* Lunar Phases::        Displaying phases of the moon.
+* Other Calendars::     Converting dates to other calendar systems.
+* Diary::               Displaying events from your diary.
+* Appointments::       Reminders when it's time to do something.
+* Importing Diary::     Converting diary events to/from other formats.
+* Daylight Saving::    How to specify when daylight saving time is active.
+* Time Intervals::      Keeping track of time intervals.
+* Advanced Calendar/Diary Usage:: Advanced Calendar/Diary customization.
+
+Movement in the Calendar
+
+* Calendar Unit Motion::      Moving by days, weeks, months, and years.
+* Move to Beginning or End::  Moving to start/end of weeks, months, and years.
+* Specified Dates::          Moving to the current date or another
+                               specific date.
+
+Conversion To and From Other Calendars
+
+* Calendar Systems::      The calendars Emacs understands
+                            (aside from Gregorian).
+* To Other Calendar::     Converting the selected date to various calendars.
+* From Other Calendar::           Moving to a date specified in another calendar.
+* Mayan Calendar::        Moving to a date specified in a Mayan calendar.
+
+The Diary
+
+* Displaying the Diary::   Viewing diary entries and associated calendar dates.
+* Format of Diary File::   Entering events in your diary.
+* Date Formats::          Various ways you can specify dates.
+* Adding to Diary::       Commands to create diary entries.
+* Special Diary Entries::  Anniversaries, blocks of dates, cyclic entries, etc.
+
+Gnus
+
+* Buffers of Gnus::    The group, summary, and article buffers.
+* Gnus Startup::       What you should know about starting Gnus.
+* Summary of Gnus::    A short description of the basic Gnus commands.
+
+Running Shell Commands from Emacs
+
+* Single Shell::       How to run one shell command and return.
+* Interactive Shell::  Permanent shell taking input via Emacs.
+* Shell Mode::         Special Emacs commands used with permanent shell.
+* Shell Prompts::       Two ways to recognize shell prompts.
+* Shell History::       Repeating previous commands in a shell buffer.
+* Directory Tracking::  Keeping track when the subshell changes directory.
+* Shell Options::       Options for customizing Shell mode.
+* Terminal emulator::   An Emacs window as a terminal emulator.
+* Term Mode::           Special Emacs commands used in Term mode.
+* Paging in Term::      Paging in the terminal emulator.
+* Remote Host::                Connecting to another computer.
+
+Using Emacs as a Server
+
+* Invoking emacsclient:: Emacs client startup options.
+
+Printing Hard Copies
+
+* PostScript::          Printing buffers or regions as PostScript.
+* PostScript Variables:: Customizing the PostScript printing commands.
+* Printing Package::     An optional advanced printing interface.
+
+Hyperlinking and Navigation Features
+
+* Browse-URL::          Following URLs.
+* Goto-address::        Activating URLs.
+* FFAP::                Finding files etc. at point.
+
+Customization
+
+* Minor Modes::                Each minor mode is one feature you can turn on
+                         independently of any others.
+* Easy Customization::  Convenient way to browse and change user options.
+* Variables::          Many Emacs commands examine Emacs variables
+                         to decide what to do; by setting variables,
+                         you can control their functioning.
+* Key Bindings::       The keymaps say what command each key runs.
+                         By changing them, you can "redefine keys".
+* Syntax::             The syntax table controls how words and
+                         expressions are parsed.
+* Init File::          How to write common customizations in the
+                         @file{.emacs} file.
+
+Variables
+
+* Examining::          Examining or setting one variable's value.
+* Hooks::              Hook variables let you specify programs for parts
+                         of Emacs to run on particular occasions.
+* Locals::             Per-buffer values of variables.
+* File Variables::      How files can specify variable values.
+
+Customizing Key Bindings
+
+* Keymaps::             Generalities.  The global keymap.
+* Prefix Keymaps::      Keymaps for prefix keys.
+* Local Keymaps::       Major and minor modes have their own keymaps.
+* Minibuffer Maps::     The minibuffer uses its own local keymaps.
+* Rebinding::           How to redefine one key's meaning conveniently.
+* Init Rebinding::      Rebinding keys with your init file, @file{.emacs}.
+* Function Keys::       Rebinding terminal function keys.
+* Named ASCII Chars::   Distinguishing @key{TAB} from @kbd{C-i}, and so on.
+* Mouse Buttons::       Rebinding mouse buttons in Emacs.
+* Disabling::           Disabling a command means confirmation is required
+                          before it can be executed.  This is done to protect
+                          beginners from surprises.
+
+The Init File, @file{~/.emacs}
+
+* Init Syntax::                Syntax of constants in Emacs Lisp.
+* Init Examples::       How to do some things with an init file.
+* Terminal Init::       Each terminal type can have an init file.
+* Find Init::          How Emacs finds the init file.
+* Init Non-ASCII::      Using non-@acronym{ASCII} characters in an init file.
+
+Dealing with Emacs Trouble
+
+* DEL Does Not Delete:: What to do if @key{DEL} doesn't delete.
+* Stuck Recursive::     `[...]' in mode line around the parentheses.
+* Screen Garbled::      Garbage on the screen.
+* Text Garbled::        Garbage in the text.
+* Memory Full::         How to cope when you run out of memory.
+* After a Crash::       Recovering editing in an Emacs session that crashed.
+* Emergency Escape::    Emergency escape---
+                          What to do if Emacs stops responding.
+* Total Frustration::   When you are at your wits' end.
+
+Reporting Bugs
+
+* Bug Criteria::        Have you really found a bug?
+* Understanding Bug Reporting::        How to report a bug effectively.
+* Checklist::          Steps to follow for a good bug report.
+* Sending Patches::    How to send a patch for GNU Emacs.
+
+Command Line Arguments for Emacs Invocation
+
+* Action Arguments::   Arguments to visit files, load libraries,
+                         and call functions.
+* Initial Options::     Arguments that take effect while starting Emacs.
+* Command Example::     Examples of using command line arguments.
+* Resume Arguments::   Specifying arguments when you resume a running Emacs.
+* Environment::         Environment variables that Emacs uses.
+* Display X::           Changing the default display and using remote login.
+* Font X::             Choosing a font for text, under X.
+* Colors::             Choosing display colors.
+* Window Size X::       Start-up window size, under X.
+* Borders X::          Internal and external borders, under X.
+* Title X::             Specifying the initial frame's title.
+* Icons X::             Choosing what sort of icon to use, under X.
+* Misc X::              Other display options.
+
+Environment Variables
+
+* General Variables::  Environment variables that all versions of Emacs use.
+* Misc Variables::     Certain system specific variables.
+* MS-Windows Registry:: An alternative to the environment on MS-Windows.
+
+X Options and Resources
+
+* Resources::           Using X resources with Emacs (in general).
+* Table of Resources::  Table of specific X resources that affect Emacs.
+* Face Resources::      X resources for customizing faces.
+* Lucid Resources::     X resources for Lucid menus.
+* LessTif Resources::   X resources for LessTif and Motif menus.
+* GTK resources::       Resources for GTK widgets.
+
+Emacs and Mac OS
+
+* Mac Input::           Keyboard and mouse input on Mac.
+* Mac International::   International character sets on Mac.
+* Mac Environment Variables::  Setting environment variables for Emacs.
+* Mac Directories::     Volumes and directories on Mac.
+* Mac Font Specs::      Specifying fonts on Mac.
+* Mac Functions::       Mac-specific Lisp functions.
+
+Emacs and Microsoft Windows/MS-DOS
+
+* Text and Binary::     Text files use CRLF to terminate lines.
+* Windows Files::       File-name conventions on Windows.
+* ls in Lisp::          Emulation of @code{ls} for Dired.
+* Windows HOME::        Where Emacs looks for your @file{.emacs}.
+* Windows Keyboard::    Windows-specific keyboard features.
+* Windows Mouse::       Windows-specific mouse features.
+* Windows Processes::   Running subprocesses on Windows.
+* Windows Printing::    How to specify the printer on MS-Windows.
+* Windows Misc::        Miscellaneous Windows features.
+* MS-DOS::              Using Emacs on MS-DOS (otherwise known as @dfn{MS-DOG}).
+@end detailmenu
+@end menu
+
+@iftex
+@unnumbered Preface
+
+  This manual documents the use and simple customization of the Emacs
+editor.  Simple Emacs customizations do not require you to be a
+programmer, but if you are not interested in customizing, you can
+ignore the customization hints.
+
+  This is primarily a reference manual, but can also be used as a
+primer.  If you are new to Emacs, we recommend you start with
+the on-line, learn-by-doing tutorial, before reading the manual.  To
+run the tutorial, start Emacs and type @kbd{C-h t}.  The tutorial
+describes commands, tells you when to try them, and explains the
+results.
+
+  On first reading, just skim chapters 1 and 2, which describe the
+notational conventions of the manual and the general appearance of the
+Emacs display screen.  Note which questions are answered in these
+chapters, so you can refer back later.  After reading chapter 4, you
+should practice the commands shown there.  The next few chapters
+describe fundamental techniques and concepts that are used constantly.
+You need to understand them thoroughly, so experiment with them
+until you are fluent.
+
+  Chapters 14 through 19 describe intermediate-level features that are
+useful for many kinds of editing.  Chapter 20 and following chapters
+describe optional but useful features; read those chapters when you
+need them.
+
+  Read the Trouble chapter if Emacs does not seem to be working
+properly.  It explains how to cope with several common problems
+(@pxref{Lossage}), as well as when and how to report Emacs bugs
+(@pxref{Bugs}).
+
+  To find the documentation of a particular command, look in the index.
+Keys (character commands) and command names have separate indexes.
+There is also a glossary, with a cross reference for each term.
+
+  This manual is available as a printed book and also as an Info file.
+The Info file is for on-line perusal with the Info program, which is
+the principal means of accessing on-line documentation in the GNU
+system.  Both the Emacs Info file and an Info reader are included with
+GNU Emacs.  The Info file and the printed book contain substantially
+the same text and are generated from the same source files, which are
+also distributed with GNU Emacs.
+
+  GNU Emacs is a member of the Emacs editor family.  There are many
+Emacs editors, all sharing common principles of organization.  For
+information on the underlying philosophy of Emacs and the lessons
+learned from its development, see @cite{Emacs, the Extensible,
+Customizable Self-Documenting Display Editor}, available from
+@url{ftp://publications.ai.mit.edu/ai-publications/pdf/AIM-519A.pdf}.
+
+This edition of the manual is intended for use with GNU Emacs
+installed on GNU and Unix systems.  GNU Emacs can also be used on VMS,
+MS-DOS (also called MS-DOG), Microsoft Windows, and Macintosh systems.
+Those systems use different file name syntax; in addition, VMS and
+MS-DOS do not support all GNU Emacs features.  @xref{Microsoft
+Windows}, for information about using Emacs on Windows.
+@xref{Mac OS}, for information about using Emacs on Macintosh.  We
+don't try to describe VMS usage in this manual.
+@end iftex
+
+@node Distrib, Intro, Top, Top
+@unnumbered Distribution
+
+GNU Emacs is @dfn{free software}; this means that everyone is free to
+use it and free to redistribute it on certain conditions.  GNU Emacs
+is not in the public domain; it is copyrighted and there are
+restrictions on its distribution, but these restrictions are designed
+to permit everything that a good cooperating citizen would want to do.
+What is not allowed is to try to prevent others from further sharing
+any version of GNU Emacs that they might get from you.  The precise
+conditions are found in the GNU General Public License that comes with
+Emacs and also appears in this manual@footnote{This manual is itself
+covered by the GNU Free Documentation License.  This license is
+similar in spirit to the General Public License, but is more suitable
+for documentation.  @xref{GNU Free Documentation License}.}.
+@xref{Copying}.
+
+One way to get a copy of GNU Emacs is from someone else who has it.
+You need not ask for our permission to do so, or tell any one else;
+just copy it.  If you have access to the Internet, you can get the
+latest distribution version of GNU Emacs by anonymous FTP; see
+@url{http://www.gnu.org/software/emacs} on our website for more
+information.
+
+You may also receive GNU Emacs when you buy a computer.  Computer
+manufacturers are free to distribute copies on the same terms that apply to
+everyone else.  These terms require them to give you the full sources,
+including whatever changes they may have made, and to permit you to
+redistribute the GNU Emacs received from them under the usual terms of the
+General Public License.  In other words, the program must be free for you
+when you get it, not just free for the manufacturer.
+
+You can also order copies of GNU Emacs from the Free Software
+Foundation.  This is a convenient and reliable way to get a copy; it is
+also a good way to help fund our work.  We also sell hardcopy versions
+of this manual and @cite{An Introduction to Programming in Emacs Lisp},
+by Robert J. Chassell.  You can find an order form on our web site at
+@url{http://www.gnu.org/order/order.html}.  For further information,
+write to
+
+@display
+Free Software Foundation
+51 Franklin Street, Fifth Floor
+Boston, MA 02110-1301
+USA
+@end display
+
+The income from distribution fees goes to support the foundation's
+purpose: the development of new free software, and improvements to our
+existing programs including GNU Emacs.
+
+If you find GNU Emacs useful, please @strong{send a donation} to the
+Free Software Foundation to support our work.  Donations to the Free
+Software Foundation are tax deductible in the US.  If you use GNU Emacs
+at your workplace, please suggest that the company make a donation.  If
+company policy is unsympathetic to the idea of donating to charity, you
+might instead suggest ordering a CD-ROM from the Foundation
+occasionally, or subscribing to periodic updates.
+
+@iftex
+@node Acknowledgments, Intro, Distrib, Top
+@unnumberedsec Acknowledgments
+
+Contributors to GNU Emacs include Jari Aalto, Per Abrahamsen, Tomas
+Abrahamsson, Jay K.@: Adams, Michael Albinus, Nagy Andras, Ralf
+Angeli, Joe Arceneaux, Miles Bader, David Bakhash, Juanma Barranquero,
+Eli Barzilay, Steven L.@: Baur, Jay Belanger, Alexander L.@: Belikoff,
+Boaz Ben-Zvi, Karl Berry, Anna M.@: Bigatti, Ray Blaak, Jim Blandy, Johan Bockg@aa{}rd,
+Per Bothner, Terrence Brannon, Frank Bresz, Peter Breton, Emmanuel
+Briot, Kevin Broadey, Vincent Broman, David M.@: Brown, Georges
+Brun-Cottan, Joe Buehler, W@l{}odek Bzyl, Bill Carpenter, Per
+Cederqvist, Hans Chalupsky, Chris Chase, Bob Chassell, Andrew Choi,
+Sacha Chua, James Clark, Mike Clarkson, Glynn Clements, Andrew
+Csillag, Doug Cutting, Mathias Dahl, Satyaki Das, Michael DeCorte,
+Gary Delp, Matthieu Devin, Eri Ding, Jan Dj@"{a}rv, Carsten Dominik,
+Scott Draves, Benjamin Drieu, Viktor Dukhovni, John Eaton, Rolf Ebert,
+Paul Eggert, Stephen Eglen, Torbj@"orn Einarsson, Tsugutomo Enami,
+Hans Henrik Eriksen, Michael Ernst, Ata Etemadi, Frederick Farnbach,
+Oscar Figueiredo, Fred Fish, Karl Fogel, Gary Foster, Romain
+Francoise, Noah Friedman, Andreas Fuchs, Hallvard Furuseth, Keith
+Gabryelski, Peter S.@: Galbraith, Kevin Gallagher, Kevin Gallo, Juan
+Le@'{o}n Lahoz Garc@'{@dotless{i}}a, Howard Gayle, Stephen Gildea, Julien
+Gilles, David Gillespie, Bob Glickstein, Deepak Goel, Boris Goldowsky,
+Michelangelo Grigni, Odd Gripenstam, Kai Gro@ss{}johann, Michael
+Gschwind, Henry Guillaume, Doug Gwyn, Ken'ichi Handa, Lars Hansen,
+Chris Hanson, K. Shane Hartman, John Heidemann, Jon K.@: Hellan,
+Jesper Harder, Markus Heritsch, Karl Heuer, Manabu Higashida, Anders
+Holst, Jeffrey C.@: Honig, Kurt Hornik, Tom Houlder, Joakim Hove,
+Denis Howe, Lars Ingebrigtsen, Andrew Innes, Seiichiro Inoue, Pavel
+Janik, Paul Jarc, Ulf Jasper, Michael K. Johnson, Kyle Jones, Terry
+Jones, Simon Josefsson, Arne J@o{}rgensen, Tomoji Kagatani, Brewster
+Kahle, Lute Kamstra, David Kastrup, David Kaufman, Henry Kautz, Taichi
+Kawabata, Howard Kaye, Michael Kifer, Richard King, Peter Kleiweg,
+Shuhei Kobayashi, Pavel Kobiakov, Larry K.@: Kolodney, David M.@:
+Koppelman, Koseki Yoshinori, Robert Krawitz, Sebastian Kremer, Ryszard
+Kubiak, Geoff Kuenning, David K@aa{}gedal, Daniel LaLiberte, Mario
+Lang, Aaron Larson, James R.@: Larus, Vinicius Jose Latorre, Werner
+Lemberg, Frederic Lepied, Peter Liljenberg, Lars Lindberg, Chris
+Lindblad, Anders Lindgren, Thomas Link, Juri Linkov, Francis Litterio,
+Emilio C. Lopes, Dave Love, Sascha L@"{u}decke, Eric Ludlam,Alan
+Mackenzie, Christopher J.@: Madsen, Neil M.@: Mager, Ken Manheimer,
+Bill Mann, Brian Marick, Simon Marshall, Bengt Martensson, Charlie
+Martin, Thomas May, Roland McGrath, Will Mengarini, David Megginson,
+Ben A. Mesander, Wayne Mesard, Brad Miller, Lawrence Mitchell, Richard
+Mlynarik, Gerd Moellmann, Stefan Monnier, Morioka Tomohiko, Keith
+Moore, Glenn Morris, Diane Murray, Sen Nagata, Erik Naggum, Thomas
+Neumann, Thien-Thi Nguyen, Mike Newton, Jurgen Nickelsen, Dan
+Nicolaescu, Hrvoje Niksic, Jeff Norden, Andrew Norman, Alexandre
+Oliva, Bob Olson, Michael Olson, Takaaki Ota, Pieter E.@: J.@: Pareit,
+David Pearson, Jeff Peck, Damon Anton Permezel, Tom Perrine, William
+M.@: Perry, Per Persson, Jens Petersen, Daniel Pfeiffer, Richard L.@:
+Pieri, Fred Pierresteguy, Christian Plaunt, David Ponce, Francesco
+A.@: Potorti, Michael D. Prange, Mukesh Prasad, Ken Raeburn, Marko
+Rahamaa, Ashwin Ram, Eric S. Raymond, Paul Reilly, Edward M. Reingold,
+Alex Rezinsky, Rob Riepel, David Reitter, Nick Roberts, Roland B.@:
+Roberts, John Robinson, Danny Roozendaal, William Rosenblatt,
+Guillermo J.@: Rozas, Martin Rudalics, Ivar Rummelhoff, Jason Rumney,
+Wolfgang Rupprecht, Kevin Ryde, James B. Salem, Masahiko Sato, Jorgen
+Schaefer, Holger Schauer, William Schelter, Ralph Schleicher, Gregor
+Schmid, Michael Schmidt, Ronald S. Schnell, Philippe Schnoebelen, Jan
+Schormann, Alex Schroeder, Stephen Schoef, Raymond Scholz, Randal
+Schwartz, Oliver Seidel, Manuel Serrano, Hovav Shacham, Stanislav
+Shalunov, Marc Shapiro, Richard Sharman, Olin Shivers, Espen Skoglund,
+Rick Sladkey, Lynn Slater, Chris Smith, David Smith, Paul D.@: Smith,
+Andre Spiegel, Michael Staats, William Sommerfeld, Michael Staats,
+Reiner Steib, Sam Steingold, Ake Stenhoff, Peter Stephenson, Ken
+Stevens, Jonathan Stigelman, Martin Stjernholm, Kim F.@: Storm, Steve
+Strassman, Olaf Sylvester, Naoto Takahashi, Steven Tamm, Jean-Philippe
+Theberge, Jens T.@: Berger Thielemann, Spencer Thomas, Jim Thompson,
+Luc Teirlinck, Tom Tromey, Enami Tsugutomo, Eli Tziperman, Daiki Ueno,
+Masanobu Umeda, Rajesh Vaidheeswarran, Neil W.@: Van Dyke, Didier
+Verna, Ulrik Vieth, Geoffrey Voelker, Johan Vromans, Inge Wallin, John
+Paul Wallington, Colin Walters, Barry Warsaw, Morten Welinder, Joseph
+Brian Wells, Rodney Whitby, John Wiegley, Ed Wilkinson, Mike Williams,
+Bill Wohler, Steven A. Wood, Dale R.@: Worley, Francis J.@: Wright,
+Felix S. T. Wu, Tom Wurgler, Katsumi Yamaoka, Masatake Yamato,
+Jonathan Yavner, Ryan Yeske, Chong Yidong, Ilya Zakharevich, Milan
+Zamazal, Victor Zandy, Eli Zaretskii, Jamie Zawinski, Shenghuo Zhu,
+Ian T.@: Zimmermann, Reto Zimmermann, Neal Ziring, Teodor Zlatanov,
+and Detlev Zundel.
+@end iftex
+
+@node Intro, Glossary, Distrib, Top
+@unnumbered Introduction
+
+  You are reading about GNU Emacs, the GNU incarnation of the
+advanced, self-documenting, customizable, extensible editor Emacs.
+(The `G' in `GNU' is not silent.)
+
+  We call Emacs advanced because it provides much more than simple
+insertion and deletion.  It can control subprocesses, indent programs
+automatically, show two or more files at once, and edit formatted
+text.  Emacs editing commands operate in terms of characters, words,
+lines, sentences, paragraphs, and pages, as well as expressions and
+comments in various programming languages.
+
+  @dfn{Self-documenting} means that at any time you can type a special
+character, @kbd{Control-h}, to find out what your options are.  You can
+also use it to find out what any command does, or to find all the commands
+that pertain to a topic.  @xref{Help}.
+
+  @dfn{Customizable} means that you can alter Emacs commands' behavior
+in simple ways.  For example, if you use a programming language in
+which comments start with @samp{<**} and end with @samp{**>}, you can
+tell the Emacs comment manipulation commands to use those strings
+(@pxref{Comments}).  Another sort of customization is rearrangement of
+the command set.  For example, you can rebind the basic cursor motion
+commands (up, down, left and right) to any keys on the keyboard that
+you find comfortable.  @xref{Customization}.
+
+  @dfn{Extensible} means that you can go beyond simple customization
+and write entirely new commands---programs in the Lisp language to be
+run by Emacs's own Lisp interpreter.  Emacs is an ``on-line
+extensible'' system, which means that it is divided into many
+functions that call each other, any of which can be redefined in the
+middle of an editing session.  Almost any part of Emacs can be
+replaced without making a separate copy of all of Emacs.  Most of the
+editing commands of Emacs are written in Lisp; the few exceptions
+could have been written in Lisp but use C instead for efficiency.
+Writing an extension is programming, but non-programmers can use it
+afterwards.  @xref{Top, Emacs Lisp Intro, Preface, eintr, An
+Introduction to Programming in Emacs Lisp}, if you want to learn Emacs
+Lisp programming.
+
+   When running on a graphical display, Emacs provides its own menus
+and convenient handling of mouse buttons.  In addition, Emacs provides
+many of the benefits of a graphical display even on a text-only
+terminal.  For instance, it can highlight parts of a file, display and
+edit several files at once, move text between files, and edit files
+while running shell commands.
+
+@include screen.texi
+@include commands.texi
+@include entering.texi
+@include basic.texi
+@include mini.texi
+@include m-x.texi
+@include help.texi
+@include mark.texi
+@include killing.texi
+@include regs.texi
+@include display.texi
+@include search.texi
+@include fixit.texi
+@include kmacro.texi
+@include files.texi
+@include buffers.texi
+@include windows.texi
+@include frames.texi
+@include mule.texi
+@include major.texi
+@include indent.texi
+@include text.texi
+@include programs.texi
+@include building.texi
+@include maintaining.texi
+@include abbrevs.texi
+@ifnottex
+@include picture-xtra.texi
+@end ifnottex
+@include sending.texi
+@include rmail.texi
+@include dired.texi
+@include calendar.texi
+@include misc.texi
+@include custom.texi
+@include trouble.texi
+
+@node Copying, GNU Free Documentation License, Service, Top
+@appendix GNU GENERAL PUBLIC LICENSE
+@include gpl.texi
+
+@node GNU Free Documentation License, Emacs Invocation, Copying, Top
+@appendix GNU Free Documentation License
+@include doclicense.texi
+
+@include cmdargs.texi
+@include xresources.texi
+
+@include anti.texi
+@include macos.texi
+@include msdog.texi
+@include gnu.texi
+@include glossary.texi
+@ifnottex
+@include ack.texi
+@end ifnottex
+
+@c The Option Index is produced only in the on-line version,
+@c because the index entries related to command-line options
+@c tend to point to the same pages and all begin with a dash.
+@c This, and the need to keep the node links consistent, are
+@c the reasons for the funky @iftex/@ifnottex dance below.
+@c The Option Index is _not_ before Key Index, because that
+@c would require changes in the glossary.texi's @node line.
+@c It is not after Concept Index for similar reasons.
+
+@iftex
+@node Key Index, Command Index, Glossary, Top
+@unnumbered Key (Character) Index
+@printindex ky
+@end iftex
+
+@ifnottex
+@node Key Index, Option Index, Glossary, Top
+@unnumbered Key (Character) Index
+@printindex ky
+
+@node Option Index, Command Index, Key Index, Top
+@unnumbered Command-Line Options Index
+@printindex op
+
+@node Command Index, Variable Index, Option Index, Top
+@unnumbered Command and Function Index
+@printindex fn
+@end ifnottex
+
+@iftex
+@node Command Index, Variable Index, Key Index, Top
+@unnumbered Command and Function Index
+@printindex fn
+@end iftex
+
+@node Variable Index, Concept Index, Command Index, Top
+@unnumbered Variable Index
+@printindex vr
+
+@node Concept Index, Acknowledgments, Variable Index, Top
+@unnumbered Concept Index
+@printindex cp
+
+@bye
+
+@ignore
+   arch-tag: ed48740a-410b-46ea-9387-c9a9252a3392
+@end ignore
diff --git a/doc/emacs/emerge-xtra.texi b/doc/emacs/emerge-xtra.texi
new file mode 100644 (file)
index 0000000..e78f17e
--- /dev/null
@@ -0,0 +1,414 @@
+@c This is part of the Emacs manual.
+@c Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+@c See file emacs.texi for copying conditions.
+@c
+@c This file is included either in emacs-xtra.texi (when producing the
+@c printed version) or in the main Emacs manual (for the on-line version).
+@node Emerge
+@section Merging Files with Emerge
+@cindex Emerge
+@cindex merging files
+
+  It's not unusual for programmers to get their signals crossed and
+modify the same program in two different directions.  To recover from
+this confusion, you need to merge the two versions.  Emerge makes this
+easier.  For other ways to compare files, see
+@iftex
+@ref{Comparing Files,,, emacs, the Emacs Manual},
+@end iftex
+@ifnottex
+@ref{Comparing Files},
+@end ifnottex
+and @ref{Top, Ediff,, ediff, The Ediff Manual}.
+
+@menu
+* Overview of Emerge:: How to start Emerge.  Basic concepts.
+* Submodes of Emerge:: Fast mode vs. Edit mode.
+                         Skip Prefers mode and Auto Advance mode.
+* State of Difference::        You do the merge by specifying state A or B
+                         for each difference.
+* Merge Commands::     Commands for selecting a difference,
+                         changing states of differences, etc.
+* Exiting Emerge::     What to do when you've finished the merge.
+* Combining in Emerge::            How to keep both alternatives for a difference.
+* Fine Points of Emerge::   Misc.
+@end menu
+
+@node Overview of Emerge
+@subsection Overview of Emerge
+
+  To start Emerge, run one of these four commands:
+
+@table @kbd
+@item M-x emerge-files
+@findex emerge-files
+Merge two specified files.
+
+@item M-x emerge-files-with-ancestor
+@findex emerge-files-with-ancestor
+Merge two specified files, with reference to a common ancestor.
+
+@item M-x emerge-buffers
+@findex emerge-buffers
+Merge two buffers.
+
+@item M-x emerge-buffers-with-ancestor
+@findex emerge-buffers-with-ancestor
+Merge two buffers with reference to a common ancestor in a third
+buffer.
+@end table
+
+@cindex merge buffer (Emerge)
+@cindex A and B buffers (Emerge)
+  The Emerge commands compare two files or buffers, and display the
+comparison in three buffers: one for each input text (the @dfn{A buffer}
+and the @dfn{B buffer}), and one (the @dfn{merge buffer}) where merging
+takes place.  The merge buffer shows the full merged text, not just the
+differences.  Wherever the two input texts differ, you can choose which
+one of them to include in the merge buffer.
+
+  The Emerge commands that take input from existing buffers use only
+the accessible portions of those buffers, if they are narrowed.
+@iftex
+@xref{Narrowing,,, emacs, the Emacs Manual}.
+@end iftex
+@ifnottex
+@xref{Narrowing}.
+@end ifnottex
+
+
+  If a common ancestor version is available, from which the two texts to
+be merged were both derived, Emerge can use it to guess which
+alternative is right.  Wherever one current version agrees with the
+ancestor, Emerge presumes that the other current version is a deliberate
+change which should be kept in the merged version.  Use the
+@samp{with-ancestor} commands if you want to specify a common ancestor
+text.  These commands read three file or buffer names---variant A,
+variant B, and the common ancestor.
+
+  After the comparison is done and the buffers are prepared, the
+interactive merging starts.  You control the merging by typing special
+@dfn{merge commands} in the merge buffer (@pxref{Merge Commands}).
+For each run of differences between the input texts, you can choose
+which one of them to keep, or edit them both together.
+
+  The merge buffer uses a special major mode, Emerge mode, with commands
+for making these choices.  But you can also edit the buffer with
+ordinary Emacs commands.
+
+  At any given time, the attention of Emerge is focused on one
+particular difference, called the @dfn{selected} difference.  This
+difference is marked off in the three buffers like this:
+
+@example
+vvvvvvvvvvvvvvvvvvvv
+@var{text that differs}
+^^^^^^^^^^^^^^^^^^^^
+@end example
+
+@noindent
+Emerge numbers all the differences sequentially and the mode
+line always shows the number of the selected difference.
+
+  Normally, the merge buffer starts out with the A version of the text.
+But when the A version of a difference agrees with the common ancestor,
+then the B version is initially preferred for that difference.
+
+  Emerge leaves the merged text in the merge buffer when you exit.  At
+that point, you can save it in a file with @kbd{C-x C-w}.  If you give a
+numeric argument to @code{emerge-files} or
+@code{emerge-files-with-ancestor}, it reads the name of the output file
+using the minibuffer.  (This is the last file name those commands read.)
+Then exiting from Emerge saves the merged text in the output file.
+
+  Normally, Emerge commands save the output buffer in its file when you
+exit.  If you abort Emerge with @kbd{C-]}, the Emerge command does not
+save the output buffer, but you can save it yourself if you wish.
+
+@node Submodes of Emerge
+@subsection Submodes of Emerge
+
+  You can choose between two modes for giving merge commands: Fast mode
+and Edit mode.  In Fast mode, basic merge commands are single
+characters, but ordinary Emacs commands are disabled.  This is
+convenient if you use only merge commands.  In Edit mode, all merge
+commands start with the prefix key @kbd{C-c C-c}, and the normal Emacs
+commands are also available.  This allows editing the merge buffer, but
+slows down Emerge operations.
+
+  Use @kbd{e} to switch to Edit mode, and @kbd{C-c C-c f} to switch to
+Fast mode.  The mode line indicates Edit and Fast modes with @samp{E}
+and @samp{F}.
+
+  Emerge has two additional submodes that affect how particular merge
+commands work: Auto Advance mode and Skip Prefers mode.
+
+  If Auto Advance mode is in effect, the @kbd{a} and @kbd{b} commands
+advance to the next difference.  This lets you go through the merge
+faster as long as you simply choose one of the alternatives from the
+input.  The mode line indicates Auto Advance mode with @samp{A}.
+
+  If Skip Prefers mode is in effect, the @kbd{n} and @kbd{p} commands
+skip over differences in states prefer-A and prefer-B (@pxref{State of
+Difference}).  Thus you see only differences for which neither version
+is presumed ``correct.''  The mode line indicates Skip Prefers mode with
+@samp{S}.
+
+@findex emerge-auto-advance-mode
+@findex emerge-skip-prefers-mode
+  Use the command @kbd{s a} (@code{emerge-auto-advance-mode}) to set or
+clear Auto Advance mode.  Use @kbd{s s}
+(@code{emerge-skip-prefers-mode}) to set or clear Skip Prefers mode.
+These commands turn on the mode with a positive argument, turns it off
+with a negative or zero argument, and toggle the mode with no argument.
+
+@node State of Difference
+@subsection State of a Difference
+
+  In the merge buffer, a difference is marked with lines of @samp{v} and
+@samp{^} characters.  Each difference has one of these seven states:
+
+@table @asis
+@item A
+The difference is showing the A version.  The @kbd{a} command always
+produces this state; the mode line indicates it with @samp{A}.
+
+@item B
+The difference is showing the B version.  The @kbd{b} command always
+produces this state; the mode line indicates it with @samp{B}.
+
+@item default-A
+@itemx default-B
+The difference is showing the A or the B state by default, because you
+haven't made a choice.  All differences start in the default-A state
+(and thus the merge buffer is a copy of the A buffer), except those for
+which one alternative is ``preferred'' (see below).
+
+When you select a difference, its state changes from default-A or
+default-B to plain A or B.  Thus, the selected difference never has
+state default-A or default-B, and these states are never displayed in
+the mode line.
+
+The command @kbd{d a} chooses default-A as the default state, and @kbd{d
+b} chooses default-B.  This chosen default applies to all differences
+which you haven't ever selected and for which no alternative is preferred.
+If you are moving through the merge sequentially, the differences you
+haven't selected are those following the selected one.  Thus, while
+moving sequentially, you can effectively make the A version the default
+for some sections of the merge buffer and the B version the default for
+others by using @kbd{d a} and @kbd{d b} between sections.
+
+@item prefer-A
+@itemx prefer-B
+The difference is showing the A or B state because it is
+@dfn{preferred}.  This means that you haven't made an explicit choice,
+but one alternative seems likely to be right because the other
+alternative agrees with the common ancestor.  Thus, where the A buffer
+agrees with the common ancestor, the B version is preferred, because
+chances are it is the one that was actually changed.
+
+These two states are displayed in the mode line as @samp{A*} and @samp{B*}.
+
+@item combined
+The difference is showing a combination of the A and B states, as a
+result of the @kbd{x c} or @kbd{x C} commands.
+
+Once a difference is in this state, the @kbd{a} and @kbd{b} commands
+don't do anything to it unless you give them a numeric argument.
+
+The mode line displays this state as @samp{comb}.
+@end table
+
+@node Merge Commands
+@subsection Merge Commands
+
+  Here are the Merge commands for Fast mode; in Edit mode, precede them
+with @kbd{C-c C-c}:
+
+@table @kbd
+@item p
+Select the previous difference.
+
+@item n
+Select the next difference.
+
+@item a
+Choose the A version of this difference.
+
+@item b
+Choose the B version of this difference.
+
+@item C-u @var{n} j
+Select difference number @var{n}.
+
+@item .
+Select the difference containing point.  You can use this command in the
+merge buffer or in the A or B buffer.
+
+@item q
+Quit---finish the merge.
+
+@item C-]
+Abort---exit merging and do not save the output.
+
+@item f
+Go into Fast mode.  (In Edit mode, this is actually @kbd{C-c C-c f}.)
+
+@item e
+Go into Edit mode.
+
+@item l
+Recenter (like @kbd{C-l}) all three windows.
+
+@item -
+Specify part of a prefix numeric argument.
+
+@item @var{digit}
+Also specify part of a prefix numeric argument.
+
+@item d a
+Choose the A version as the default from here down in
+the merge buffer.
+
+@item d b
+Choose the B version as the default from here down in
+the merge buffer.
+
+@item c a
+Copy the A version of this difference into the kill ring.
+
+@item c b
+Copy the B version of this difference into the kill ring.
+
+@item i a
+Insert the A version of this difference at point.
+
+@item i b
+Insert the B version of this difference at point.
+
+@item m
+Put point and mark around the difference.
+
+@item ^
+Scroll all three windows down (like @kbd{M-v}).
+
+@item v
+Scroll all three windows up (like @kbd{C-v}).
+
+@item <
+Scroll all three windows left (like @kbd{C-x <}).
+
+@item >
+Scroll all three windows right (like @kbd{C-x >}).
+
+@item |
+Reset horizontal scroll on all three windows.
+
+@item x 1
+Shrink the merge window to one line.  (Use @kbd{C-u l} to restore it
+to full size.)
+
+@item x c
+Combine the two versions of this difference (@pxref{Combining in
+Emerge}).
+
+@item x f
+Show the names of the files/buffers Emerge is operating on, in a Help
+window.  (Use @kbd{C-u l} to restore windows.)
+
+@item x j
+Join this difference with the following one.
+(@kbd{C-u x j} joins this difference with the previous one.)
+
+@item x s
+Split this difference into two differences.  Before you use this
+command, position point in each of the three buffers at the place where
+you want to split the difference.
+
+@item x t
+Trim identical lines off the top and bottom of the difference.
+Such lines occur when the A and B versions are
+identical but differ from the ancestor version.
+@end table
+
+@node Exiting Emerge
+@subsection Exiting Emerge
+
+  The @kbd{q} command (@code{emerge-quit}) finishes the merge, storing
+the results into the output file if you specified one.  It restores the
+A and B buffers to their proper contents, or kills them if they were
+created by Emerge and you haven't changed them.  It also disables the
+Emerge commands in the merge buffer, since executing them later could
+damage the contents of the various buffers.
+
+  @kbd{C-]} aborts the merge.  This means exiting without writing the
+output file.  If you didn't specify an output file, then there is no
+real difference between aborting and finishing the merge.
+
+  If the Emerge command was called from another Lisp program, then its
+return value is @code{t} for successful completion, or @code{nil} if you
+abort.
+
+@node Combining in Emerge
+@subsection Combining the Two Versions
+
+  Sometimes you want to keep @emph{both} alternatives for a particular
+difference.  To do this, use @kbd{x c}, which edits the merge buffer
+like this:
+
+@example
+@group
+#ifdef NEW
+@var{version from A buffer}
+#else /* not NEW */
+@var{version from B buffer}
+#endif /* not NEW */
+@end group
+@end example
+
+@noindent
+@vindex emerge-combine-versions-template
+While this example shows C preprocessor conditionals delimiting the two
+alternative versions, you can specify the strings to use by setting
+the variable @code{emerge-combine-versions-template} to a string of your
+choice.  In the string, @samp{%a} says where to put version A, and
+@samp{%b} says where to put version B.  The default setting, which
+produces the results shown above, looks like this:
+
+@example
+@group
+"#ifdef NEW\n%a#else /* not NEW */\n%b#endif /* not NEW */\n"
+@end group
+@end example
+
+@node Fine Points of Emerge
+@subsection Fine Points of Emerge
+
+  During the merge, you mustn't try to edit the A and B buffers yourself.
+Emerge modifies them temporarily, but ultimately puts them back the way
+they were.
+
+  You can have any number of merges going at once---just don't use any one
+buffer as input to more than one merge at once, since the temporary
+changes made in these buffers would get in each other's way.
+
+  Starting Emerge can take a long time because it needs to compare the
+files fully.  Emacs can't do anything else until @code{diff} finishes.
+Perhaps in the future someone will change Emerge to do the comparison in
+the background when the input files are large---then you could keep on
+doing other things with Emacs until Emerge is ready to accept
+commands.
+
+@vindex emerge-startup-hook
+  After setting up the merge, Emerge runs the hook
+@code{emerge-startup-hook}.
+@iftex
+@xref{Hooks,,, emacs, the Emacs Manual}.
+@end iftex
+@ifnottex
+@xref{Hooks}.
+@end ifnottex
+
+@ignore
+   arch-tag: cda63f09-9c5f-4ea1-adb9-4a820fdfb24e
+@end ignore
similarity index 100%
rename from man/entering.texi
rename to doc/emacs/entering.texi
similarity index 93%
rename from man/files.texi
rename to doc/emacs/files.texi
index 7ba36916684ecfab4ed51149d9d3f43dde68940b..6e90cff577672464e91582f496109cd2dbb1b5a6 100644 (file)
@@ -1248,9 +1248,12 @@ customizable variable @code{vc-handled-backends} to @code{nil}
 @subsection Introduction to Version Control
 
   VC allows you to use a version control system from within Emacs,
-integrating the version control operations smoothly with editing.  VC
-provides a uniform interface to version control, so that regardless of
-which version control system is in use, you can use it the same way.
+integrating the version control operations smoothly with editing.
+Though VC cannot completely bridge the gaps between version-control
+systems with widely differing capabilities,  it does provide
+a uniform interface to many version control operations. Regardless of
+which version control system is in use, you will be able to do basic
+operations in much the same way.
 
   This section provides a general overview of version control, and
 describes the version control systems that VC supports.  You can skip
@@ -1268,7 +1271,7 @@ you want to use.
 @subsubsection Understanding the problems it addresses
 
   Version control systems provide you with three important capabilities: 
-reversibility, concurrency, and history.
+@dfn{reversibility}. @dfn{concurrency}, and @dfn{history}.
 
   The most basic capability you get from a version-control system is
 reversibility, the ability to back up to a saved, known-good state when
@@ -1289,88 +1292,106 @@ become a vitally important form of communication among developers.
 
 @cindex back end (version control)
   VC currently works with six different version control systems or
-``back ends'': CVS, GNU Arch, RCS, Meta-CVS, Subversion, and SCCS.
+``back ends'': SCCS, RCS, CVS, Meta-CVS, Subversion, GNU Arch,
+git, and Mercurial.
+@comment Omitting bzr because support is very scratchy and incomplete.
 
-@cindex CVS
-  CVS is a free version control system that is used for the majority
-of free software projects today.  It allows concurrent multi-user
-development either locally or over the network.  Some of its
-shortcomings, corrected by newer systems such as GNU Arch, are that it
-lacks atomic commits or support for renaming files.  VC supports all
-basic editing operations under CVS, but for some less common tasks you
-still need to call CVS from the command line.  Note also that before
-using CVS you must set up a repository, which is a subject too complex
-to treat here.
-
-@cindex GNU Arch
-@cindex Arch
-  GNU Arch is a new version control system that is designed for
-distributed work.  It differs in many ways from old well-known
-systems, such as CVS and RCS.  It supports different transports for
-interoperating between users, offline operations, and it has good
-branching and merging features.  It also supports atomic commits, and
-history of file renaming and moving.  VC does not support all
-operations provided by GNU Arch, so you must sometimes invoke it from
-the command line, or use a specialized module.
+@cindex SCCS
+  SCCS was the first version-control system ever built, and was long ago
+superseded by later and more advanced ones; Emacs supports it only for
+backward compatibility and historical reasons. VC compensates for
+certain features missing in SCCS (snapshots, for example) by
+implementing them itself, but some other VC features, such as multiple
+branches, are not available with SCCS.  Since SCCS is non-free you
+should not use it; use its free replacement CSSC instead.  But you
+should use CSSC only if for some reason you cannot use a more 
+recent and better-designed version-control system.
 
 @cindex RCS
   RCS is the free version control system around which VC was initially
-built.  The VC commands are therefore conceptually closest to RCS.
-Almost everything you can do with RCS can be done through VC.  You
-cannot use RCS over the network though, and it only works at the level
+built.  Almost everything you can do with RCS can be done through VC.  You
+cannot use RCS over the network, though, and it only works at the level
 of individual files, rather than projects.  You should use it if you
 want a simple, yet reliable tool for handling individual files.
 
+@cindex CVS
+  CVS is the free version control system that was until recently (as of
+2007) used for the majority of free software projects, though it is now
+being superseded by other systems.  It allows concurrent
+multi-user development either locally or over the network.  Some of its
+shortcomings, corrected by newer systems such as Subversion or GNU Arch,
+are that it lacks atomic commits or support for renaming files.  VC
+supports all basic editing operations under CVS, but for some less
+common tasks you still need to call CVS from the command line.  Note
+also that before using CVS you must set up a repository, which is a
+subject too complex to treat here.
+
+@cindex Meta-CVS
+  Meta-CVS uses CVS repositories, but has an enhanced client that
+uses client-side information to solve various of the known problems
+with CVS.  It is not widely used, having been overtaken by Subversion.
+The Emacs support for it is rudimentary, and may be removed in a
+future version.
+
 @cindex SVN
 @cindex Subversion
   Subversion is a free version control system designed to be similar
-to CVS but without CVS's problems.  Subversion supports atomic commits,
-and versions directories, symbolic links, meta-data, renames, copies,
-and deletes.  It can be used via http or via its own protocol.
-
-@cindex MCVS
-@cindex Meta-CVS
-  Meta-CVS is another attempt to solve problems arising in CVS.  It
-supports directory structure versioning, improved branching and
-merging, and use of symbolic links and meta-data in repositories.
+to CVS but without CVS's problems, and is now (2007) rapidly
+superseding CVS.  Subversion supports atomic commits of filesets, and
+versions directories, symbolic links, meta-data, renames, copies, and
+deletes.  It can be used via http or via its own protocol.
 
-@cindex SCCS
-  SCCS is a proprietary but widely used version control system.  In
-terms of capabilities, it is the weakest of the six that VC supports.
-VC compensates for certain features missing in SCCS (snapshots, for
-example) by implementing them itself, but some other VC features, such
-as multiple branches, are not available with SCCS.  Since SCCS is
-non-free, not respecting its users freedom, you should not use it;
-use its free replacement CSSC instead.  But you should use CSSC only
-if for some reason you cannot use RCS, or one of the higher-level
-systems such as CVS or GNU Arch.
-
-In the following, we discuss mainly RCS, SCCS and CVS.  Nearly
-everything said about CVS applies to GNU Arch, Subversion and Meta-CVS
-as well.
+@cindex GNU Arch
+@cindex Arch
+  GNU Arch is a new version control system that is designed for
+distributed work.  It differs in many ways from old well-known
+systems, such as CVS and RCS.  It supports different transports for
+interoperating between users, offline operations, and it has good
+branching and merging features.  It also supports atomic commits of
+fileset changes, and keeps a history of file renaming and moving.  VC
+does not support all operations provided by GNU Arch, so you must
+sometimes invoke it from the command line, or use a specialized
+module.
+
+@cindex git
+  git is a version-control system invented by Linus Torvalds to
+support Linux kernel development.  Like GNU Arch, it supports atomic
+commits of fileset changes, and keeps a history of file renaming and
+moving.  One significant feature of git is that it largely abolishes
+the notion of a single centralized repository; instead, each working
+copy of a git project is its own repository and coordination is done
+through repository-sync operations.  VC fully supports git, except
+that it doesn't do news merges and repository sync operations must
+be done from the command line.
+
+@cindex hg
+@cindex Mercurial
+  Mercurial is a distributed version-control systems broadly
+resembling GNU Arch and git, with atomic fileset commits and
+rename/move histories.  Like git it is fully decventralized.
+VC fully supports Mercurial, except for repository sync operations
+which still need to be done from the command line.
 
 @node VC Concepts
 @subsubsection Concepts of Version Control
 
-@cindex master file
+@cindex repository
 @cindex registered file
    When a file is under version control, we also say that it is
-@dfn{registered} in the version control system.  Each registered file
-has a corresponding @dfn{master file} which represents the file's
-present state plus its change history---enough to reconstruct the
-current version or any earlier version.  Usually the master file also
-records a @dfn{log entry} for each version, describing in words what was
-changed in that version.
+@dfn{registered} in the version control system.  The system has a
+@dfn{repository} which stores both the file's present state plus its
+change history---enough to reconstruct the current version or any
+earlier version.  The repository will also contain a @dfn{log entry} for
+each change to the file, describing in words what was modified in that 
+revision.
 
 @cindex work file
 @cindex checking out files
-  The file that is maintained under version control is sometimes called
-the @dfn{work file} corresponding to its master file.  You edit the work
-file and make changes in it, as you would with an ordinary file.  (With
-SCCS and RCS, you must @dfn{lock} the file before you start to edit it.)
-After you are done with a set of changes, you @dfn{check the file in},
-which records the changes in the master file, along with a log entry for
-them.
+  A file checked out of a version-control repository is sometimes called
+the @dfn{work file}.  You edit the work file and make changes in it, as
+you would with an ordinary file.  After you are done with a set of
+changes, you @dfn{check the file in}, which records the changes in the
+repository, along with a log entry for them.
 
   To go beyond these basic concepts, you will need to understand three
 ways in which version-control systems can differ from each other.  They
@@ -1427,7 +1448,7 @@ both locking and merging version control and tries to hide the differences
 between them as much as possible.
 
 @cindex files versus changesets.
-  On SCCS, RCS, CVS, and other early version-control systems, checkins
+  On SCCS. RCS, CVS, and other early version-control systems, checkins
 and other operations are @dfn{file-based}; each file has its own
 @dfn{master file} with its own comment- and revision history separate
 from that of all other files in the system.  Later systems, beginning
@@ -1439,14 +1460,18 @@ one file, but is attached to the changeset itself.
   Changeset-based version control is in general both more flexible and
 more powerful than file-based version control; usually, when a change to
 multiple files has to be backed out, it's good to be able to easily
-identify and remove all of it.
+identify and remove all of it.  But it took some years for designers to
+figure that out, and while file-based systems are passing out of use
+there are lots of legacy repositories still to be dealt with at time of
+writing in 2007.
 
 @cindex centralized vs. decentralized
+
   Early version-control systems were designed around a @dfn{centralized}
 model in which each project has only one repository used by all
 developers.  SCCS, RCS, CVS, and Subversion share this kind of model.
 It has two important problems. One is that a single repository is a
-single point of failure---if the repository server is down all work
+single point of failure--if the repository server is down all work
 stops.  The other is that you need to be connected live to the server to
 do checkins and checkouts; if you're offline, you can't work.
 
@@ -1478,7 +1503,7 @@ version-control system is invisible to VC mode.
 @cindex version control log
 
   Projects that use a revision control system can have @emph{two}
-types of log for changes.  One is the per-file log maintained by the
+types of log for changes.  One is the log maintained by the
 revision control system: each time you check in a change, you must
 fill out a @dfn{log entry} for the change (@pxref{Log Buffer}).  This
 kind of log is called the @dfn{version control log}, also the
@@ -1491,10 +1516,22 @@ A small program would use one @file{ChangeLog} file; a large program
 may well merit a @file{ChangeLog} file in each major directory.
 @xref{Change Log}.
 
-  A project maintained with version control can use just the per-file
-log, or it can use both kinds of logs.  It can handle some files one
-way and some files the other way.  Each project has its policy, which
-you should follow.
+  Actually, the fact that both kinds of log exist is partly a legacy from
+file-based version control.  Changelogs are a GNU convention, later 
+more widely adopted, that help developers to get a changeset-based
+view of a project even when its version-control system has that
+information split up in multiple file-based logs.  
+
+  Changeset-based version systems, on the other hand, often maintain
+a changeset-based modification log for the entire system that makes
+ChangeLogs mostly redundant.  The only advantage ChangeLogs retain is that
+it may be useful to be able to view the transaction history of a
+single directory separately from those of other directories.
+
+  A project maintained with version control can use just the
+version-control log, or it can use both kinds of logs.  It can
+handle some files one way and some files the other way.  Each project
+has its policy, which you should follow.
 
   When the policy is to use both, you typically want to write an entry
 for each change just once, then put it into both logs.  You can write
@@ -1509,7 +1546,6 @@ to copy it to @file{ChangeLog}
 (@pxref{Change Logs and VC}).
 @end ifnottex
 
-
 @node VC Mode Line
 @subsection Version Control and the Mode Line
 
@@ -1550,8 +1586,10 @@ Perform the next logical version control operation on this file.
 @findex vc-next-action
 @kindex C-x v v
   The precise action of this command depends on the state of the file,
-and whether the version control system uses locking or not.  SCCS and
-RCS normally use locking; CVS normally does not use locking.
+and whether the version control system uses locking or merging.  SCCS and
+RCS normally use locking; CVS and Subversion normally use
+merging but can be configured to do locking.  Later systems such as 
+GNU Arch and Mercurial always use merging.
 
 @findex vc-toggle-read-only
 @kindex C-x C-q @r{(Version Control)}
@@ -1603,25 +1641,27 @@ that there is no such thing as stealing a lock.
 @node Without Locking
 @subsubsection Basic Version Control without Locking
 
-  When there is no locking---the default for CVS---work files are always
-writable; you do not need to do anything before you begin to edit a
-file.  The status indicator on the mode line is @samp{-} if the file is
-unmodified; it flips to @samp{:} as soon as you save any changes in the
-work file.
+  When your version-control system is merging-based rather than
+locking-based---the default for CVS and Subversion, and the way GNU
+Arch always works---work files are always writable; you do not need to
+do anything before you begin to edit a file.  The status indicator on
+the mode line is @samp{-} if the file is unmodified; it flips to
+@samp{:} as soon as you save any changes in the work file.
 
-  Here is what @kbd{C-x v v} does when using CVS:
+  Here is what @kbd{C-x v v} does when using a merging-based system
+(such as CVS or Subversion in their defaiult merging mode):
 
 @itemize @bullet
 @item
-If some other user has checked in changes into the master file, Emacs
+If some other user has checked in changes into the repository, Emacs
 asks you whether you want to merge those changes into your own work
 file.  You must do this before you can check in your own changes.  (To
-pick up any recent changes from the master file @emph{without} trying
+pick up any recent changes from the repository @emph{without} trying
 to commit your own changes, type @kbd{C-x v m @key{RET}}.)
 @xref{Merging}.
 
 @item
-If there are no new changes in the master file, but you have made
+If there are no new changes in the repository, but you have made
 modifications in your work file, @kbd{C-x v v} checks in your changes.
 In order to do this, it first reads the log entry for the new version.
 @xref{Log Buffer}.
@@ -1632,19 +1672,21 @@ If the file is not modified, the @kbd{C-x v v} does nothing.
 
   These rules also apply when you use RCS in the mode that does not
 require locking, except that automatic merging of changes from the
-master file is not implemented.  Unfortunately, this means that nothing
+repository is not implemented.  Unfortunately, this means that nothing
 informs you if another user has checked in changes in the same file
 since you began editing it, and when this happens, his changes will be
 effectively removed when you check in your version (though they will
-remain in the master file, so they will not be entirely lost).  You must
+remain in the repository, so they will not be entirely lost).  You must
 therefore verify that the current version is unchanged, before you
-check in your changes.  We hope to eliminate this risk and provide
-automatic merging with RCS in a future Emacs version.
+check in your changes.
 
   In addition, locking is possible with RCS even in this mode, although
 it is not required; @kbd{C-x v v} with an unmodified file locks the
 file, just as it does with RCS in its normal (locking) mode.
 
+  Later systems like CVS, Subversion and Arch will notice conflicting 
+changes in the repository automatically and notify you when they occur.
+
 @node Advanced C-x v v
 @subsubsection Advanced Control in @kbd{C-x v v}
 
@@ -1714,7 +1756,7 @@ the revision control log.
   In the @samp{*VC-Log*} buffer, @kbd{C-c C-f} (@kbd{M-x
 log-edit-show-files}) shows the list of files to be committed in case
 you need to check that.  (This can be a list of more than one file if
-you use VC Dired mode or PCL-CVS.
+you use VC Dired mode or PCL-CVS.)
 @iftex
 @xref{VC Dired Mode,,,emacs-xtra, Specialized Emacs Features},
 @end iftex
@@ -1740,8 +1782,15 @@ this, use the history of previous log entries.  The commands @kbd{M-n},
 minibuffer history commands (except that these versions are used outside
 the minibuffer).
 
+  However, you can also browse the history of previous log entries to
+duplicate a checkin comment. This can be useful when you want several
+files to have checkin comments that vary only slightly from each
+other. The commands @kbd{M-n}, @kbd{M-p}, @kbd{M-s} and @kbd{M-r} for
+doing this work just like the minibuffer history commands (except that
+these versions are used outside the minibuffer).
+
 @vindex vc-log-mode-hook
-  Each time you check in a file, the log entry buffer is put into VC Log
+  Each time you check in a change, the log entry buffer is put into VC Log
 mode, which involves running two hooks: @code{text-mode-hook} and
 @code{vc-log-mode-hook}.  @xref{Hooks}.
 
@@ -1757,7 +1806,7 @@ Examine version @var{version} of the visited file, in a buffer of its
 own.
 
 @item C-x v =
-Compare the current buffer contents with the master version from which
+Compare the current buffer contents with the focus version from which
 you started editing.
 
 @item C-u C-x v = @var{file} @key{RET} @var{oldvers} @key{RET} @var{newvers} @key{RET}
@@ -1870,7 +1919,7 @@ the author's description of the changes in the revision on the current
 line.
 
 @item W
-Annotate the workfile version--the one you are editing.  If you used
+Annotate the focus version--the one you are editing.  If you used
 @kbd{P} and @kbd{N} to browse to other revisions, use this key to
 return to your current version.
 @end table
@@ -2116,10 +2165,10 @@ example above have branch numbers 1.2.1 and 1.2.2.
 @subsubsection Switching between Branches
 
   To switch between branches, type @kbd{C-u C-x v v} and specify the
-version number you want to select.  This version is then visited
-@emph{unlocked} (write-protected), so you can examine it before locking
-it.  Switching branches in this way is allowed only when the file is not
-locked.
+version number you want to select.  On a locking-based system, this
+version is then visited @emph{unlocked} (write-protected), so you can
+examine it before locking it.  Switching branches in this way is allowed
+only when the file is not locked.
 
   You can omit the minor version number, thus giving only the branch
 number; this takes you to the head version on the chosen branch.  If you
@@ -2144,10 +2193,14 @@ that point.
 
   To create a new branch at an older version (one that is no longer the
 head of a branch), first select that version (@pxref{Switching
-Branches}), then lock it with @kbd{C-x v v}.  You'll be asked to
-confirm, when you lock the old version, that you really mean to create a
-new branch---if you say no, you'll be offered a chance to lock the
-latest version instead.
+Branches}).  Your procedure will then differ depending on whether you
+are using a locking or merging-based VCS.
+
+  On a locking VCS, you will need to lock the old version branch with
+@kbd{C-x v v}.  You'll be asked to confirm, when you lock the old
+version, that you really mean to create a new branch---if you say no,
+you'll be offered a chance to lock the latest version instead.  On
+a merging-based VCS you will skip this step.
 
   Then make your changes and type @kbd{C-x v v} again to check in a new
 version.  This automatically creates a new branch starting from the
similarity index 100%
rename from man/fixit.texi
rename to doc/emacs/fixit.texi
diff --git a/doc/emacs/fortran-xtra.texi b/doc/emacs/fortran-xtra.texi
new file mode 100644 (file)
index 0000000..9249f5f
--- /dev/null
@@ -0,0 +1,548 @@
+@c This is part of the Emacs manual.
+@c Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+@c See file emacs.texi for copying conditions.
+@c
+@c This file is included either in emacs-xtra.texi (when producing the
+@c printed version) or in the main Emacs manual (for the on-line version).
+@node Fortran
+@section Fortran Mode
+@cindex Fortran mode
+@cindex mode, Fortran
+
+  Fortran mode provides special motion commands for Fortran statements
+and subprograms, and indentation commands that understand Fortran
+conventions of nesting, line numbers and continuation statements.
+Fortran mode has support for Auto Fill mode that breaks long lines into
+proper Fortran continuation lines.
+
+  Special commands for comments are provided because Fortran comments
+are unlike those of other languages.  Built-in abbrevs optionally save
+typing when you insert Fortran keywords.
+
+  Use @kbd{M-x fortran-mode} to switch to this major mode.  This
+command runs the hook @code{fortran-mode-hook}.
+@iftex
+@xref{Hooks,,, emacs, the Emacs Manual}.
+@end iftex
+@ifnottex
+@xref{Hooks}.
+@end ifnottex
+
+@cindex Fortran77 and Fortran90
+@findex f90-mode
+@findex fortran-mode
+  Fortran mode is meant for editing Fortran77 ``fixed format'' (and also
+``tab format'') source code.  For editing the modern Fortran90 or
+Fortran95 ``free format'' source code, use F90 mode (@code{f90-mode}).
+Emacs normally uses Fortran mode for files with extension @samp{.f},
+@samp{.F} or @samp{.for}, and F90 mode for the extension @samp{.f90} and
+@samp{.f95}.  GNU Fortran supports both kinds of format.
+
+@menu
+* Motion: Fortran Motion.       Moving point by statements or subprograms.
+* Indent: Fortran Indent.       Indentation commands for Fortran.
+* Comments: Fortran Comments.   Inserting and aligning comments.
+* Autofill: Fortran Autofill.   Auto fill support for Fortran.
+* Columns: Fortran Columns.     Measuring columns for valid Fortran.
+* Abbrev: Fortran Abbrev.       Built-in abbrevs for Fortran keywords.
+@end menu
+
+@node Fortran Motion
+@subsection Motion Commands
+
+  In addition to the normal commands for moving by and operating on
+``defuns'' (Fortran subprograms---functions and subroutines, as well as
+modules for F90 mode), Fortran mode provides special commands to move by
+statements and other program units.
+
+@table @kbd
+@kindex C-c C-n @r{(Fortran mode)}
+@findex fortran-next-statement
+@findex f90-next-statement
+@item C-c C-n
+Move to the beginning of the next statement
+(@code{fortran-next-statement}/@code{f90-next-statement}).
+
+@kindex C-c C-p @r{(Fortran mode)}
+@findex fortran-previous-statement
+@findex f90-previous-statement
+@item C-c C-p
+Move to the beginning of the previous statement
+(@code{fortran-previous-statement}/@code{f90-previous-statement}).
+If there is no previous statement (i.e. if called from the first
+statement in the buffer), move to the start of the buffer.
+
+@kindex C-c C-e @r{(F90 mode)}
+@findex f90-next-block
+@item C-c C-e
+Move point forward to the start of the next code block
+(@code{f90-next-block}).  A code block is a subroutine,
+@code{if}--@code{endif} statement, and so forth.  This command exists
+for F90 mode only, not Fortran mode.  With a numeric argument, this
+moves forward that many blocks.
+
+@kindex C-c C-a @r{(F90 mode)}
+@findex f90-previous-block
+@item C-c C-a
+Move point backward to the previous code block
+(@code{f90-previous-block}).  This is like @code{f90-next-block}, but
+moves backwards.
+
+@kindex C-M-n @r{(Fortran mode)}
+@findex fortran-end-of-block
+@findex f90-end-of-block
+@item C-M-n
+Move to the end of the current code block
+(@code{fortran-end-of-block}/@code{f90-end-of-block}).  With a numeric
+argument, move forward that number of blocks.  The mark is set before
+moving point.  The F90 mode version of this command checks for
+consistency of block types and labels (if present), but it does not
+check the outermost block since that may be incomplete.
+
+@kindex C-M-p @r{(Fortran mode)}
+@findex fortran-beginning-of-block
+@findex f90-beginning-of-block
+@item C-M-p
+Move to the start of the current code block
+(@code{fortran-beginning-of-block}/@code{f90-beginning-of-block}). This
+is like @code{fortran-end-of-block}, but moves backwards.
+@end table
+
+@node Fortran Indent
+@subsection Fortran Indentation
+
+  Special commands and features are needed for indenting Fortran code in
+order to make sure various syntactic entities (line numbers, comment line
+indicators and continuation line flags) appear in the columns that are
+required for standard, fixed (or tab) format Fortran.
+
+@menu
+* Commands: ForIndent Commands.  Commands for indenting and filling Fortran.
+* Contline: ForIndent Cont.      How continuation lines indent.
+* Numbers:  ForIndent Num.       How line numbers auto-indent.
+* Conv:     ForIndent Conv.      Conventions you must obey to avoid trouble.
+* Vars:     ForIndent Vars.      Variables controlling Fortran indent style.
+@end menu
+
+@node ForIndent Commands
+@subsubsection Fortran Indentation and Filling Commands
+
+@table @kbd
+@item C-M-j
+Break the current line at point and set up a continuation line
+(@code{fortran-split-line}).
+@item M-^
+Join this line to the previous line (@code{fortran-join-line}).
+@item C-M-q
+Indent all the lines of the subprogram point is in
+(@code{fortran-indent-subprogram}).
+@item M-q
+Fill a comment block or statement.
+@end table
+
+@kindex C-M-q @r{(Fortran mode)}
+@findex fortran-indent-subprogram
+  The key @kbd{C-M-q} runs @code{fortran-indent-subprogram}, a command
+to reindent all the lines of the Fortran subprogram (function or
+subroutine) containing point.
+
+@kindex C-M-j @r{(Fortran mode)}
+@findex fortran-split-line
+  The key @kbd{C-M-j} runs @code{fortran-split-line}, which splits
+a line in the appropriate fashion for Fortran.  In a non-comment line,
+the second half becomes a continuation line and is indented
+accordingly.  In a comment line, both halves become separate comment
+lines.
+
+@kindex M-^ @r{(Fortran mode)}
+@kindex C-c C-d @r{(Fortran mode)}
+@findex fortran-join-line
+  @kbd{M-^} or @kbd{C-c C-d} runs the command @code{fortran-join-line},
+which joins a continuation line back to the previous line, roughly as
+the inverse of @code{fortran-split-line}.  The point must be on a
+continuation line when this command is invoked.
+
+@kindex M-q @r{(Fortran mode)}
+@kbd{M-q} in Fortran mode fills the comment block or statement that
+point is in.  This removes any excess statement continuations.
+
+@node ForIndent Cont
+@subsubsection Continuation Lines
+@cindex Fortran continuation lines
+
+@vindex fortran-continuation-string
+  Most Fortran77 compilers allow two ways of writing continuation lines.
+If the first non-space character on a line is in column 5, then that
+line is a continuation of the previous line.  We call this @dfn{fixed
+format}.  (In GNU Emacs we always count columns from 0; but note that
+the Fortran standard counts from 1.)  The variable
+@code{fortran-continuation-string} specifies what character to put in
+column 5.  A line that starts with a tab character followed by any digit
+except @samp{0} is also a continuation line.  We call this style of
+continuation @dfn{tab format}.  (Fortran90 introduced ``free format,''
+with another style of continuation lines).
+
+@vindex indent-tabs-mode @r{(Fortran mode)}
+@vindex fortran-analyze-depth
+@vindex fortran-tab-mode-default
+  Fortran mode can use either style of continuation line.  When you
+enter Fortran mode, it tries to deduce the proper continuation style
+automatically from the buffer contents.  It does this by scanning up to
+@code{fortran-analyze-depth} (default 100) lines from the start of the
+buffer.  The first line that begins with either a tab character or six
+spaces determines the choice.  If the scan fails (for example, if the
+buffer is new and therefore empty), the value of
+@code{fortran-tab-mode-default} (@code{nil} for fixed format, and
+non-@code{nil} for tab format) is used.  @samp{/t} in the mode line
+indicates tab format is selected.  Fortran mode sets the value of
+@code{indent-tabs-mode} accordingly.
+
+  If the text on a line starts with the Fortran continuation marker
+@samp{$}, or if it begins with any non-whitespace character in column
+5, Fortran mode treats it as a continuation line.  When you indent a
+continuation line with @key{TAB}, it converts the line to the current
+continuation style.  When you split a Fortran statement with
+@kbd{C-M-j}, the continuation marker on the newline is created according
+to the continuation style.
+
+  The setting of continuation style affects several other aspects of
+editing in Fortran mode.  In fixed format mode, the minimum column
+number for the body of a statement is 6.  Lines inside of Fortran
+blocks that are indented to larger column numbers always use only the
+space character for whitespace.  In tab format mode, the minimum
+column number for the statement body is 8, and the whitespace before
+column 8 must always consist of one tab character.
+
+@node ForIndent Num
+@subsubsection Line Numbers
+
+  If a number is the first non-whitespace in the line, Fortran
+indentation assumes it is a line number and moves it to columns 0
+through 4.  (Columns always count from 0 in GNU Emacs.)
+
+@vindex fortran-line-number-indent
+  Line numbers of four digits or less are normally indented one space.
+The variable @code{fortran-line-number-indent} controls this; it
+specifies the maximum indentation a line number can have.  The default
+value of the variable is 1.  Fortran mode tries to prevent line number
+digits passing column 4, reducing the indentation below the specified
+maximum if necessary.  If @code{fortran-line-number-indent} has the
+value 5, line numbers are right-justified to end in column 4.
+
+@vindex fortran-electric-line-number
+  Simply inserting a line number is enough to indent it according to
+these rules.  As each digit is inserted, the indentation is recomputed.
+To turn off this feature, set the variable
+@code{fortran-electric-line-number} to @code{nil}.
+
+
+@node ForIndent Conv
+@subsubsection Syntactic Conventions
+
+  Fortran mode assumes that you follow certain conventions that simplify
+the task of understanding a Fortran program well enough to indent it
+properly:
+
+@itemize @bullet
+@item
+Two nested @samp{do} loops never share a @samp{continue} statement.
+
+@item
+Fortran keywords such as @samp{if}, @samp{else}, @samp{then}, @samp{do}
+and others are written without embedded whitespace or line breaks.
+
+Fortran compilers generally ignore whitespace outside of string
+constants, but Fortran mode does not recognize these keywords if they
+are not contiguous.  Constructs such as @samp{else if} or @samp{end do}
+are acceptable, but the second word should be on the same line as the
+first and not on a continuation line.
+@end itemize
+
+@noindent
+If you fail to follow these conventions, the indentation commands may
+indent some lines unaesthetically.  However, a correct Fortran program
+retains its meaning when reindented even if the conventions are not
+followed.
+
+@node ForIndent Vars
+@subsubsection Variables for Fortran Indentation
+
+@vindex fortran-do-indent
+@vindex fortran-if-indent
+@vindex fortran-structure-indent
+@vindex fortran-continuation-indent
+@vindex fortran-check-all-num@dots{}
+@vindex fortran-minimum-statement-indent@dots{}
+  Several additional variables control how Fortran indentation works:
+
+@table @code
+@item fortran-do-indent
+Extra indentation within each level of @samp{do} statement (default 3).
+
+@item fortran-if-indent
+Extra indentation within each level of @samp{if}, @samp{select case}, or
+@samp{where} statements (default 3).
+
+@item fortran-structure-indent
+Extra indentation within each level of @samp{structure}, @samp{union},
+@samp{map}, or @samp{interface} statements (default 3).
+
+@item fortran-continuation-indent
+Extra indentation for bodies of continuation lines (default 5).
+
+@item fortran-check-all-num-for-matching-do
+In Fortran77, a numbered @samp{do} statement is ended by any statement
+with a matching line number.  It is common (but not compulsory) to use a
+@samp{continue} statement for this purpose.  If this variable has a
+non-@code{nil} value, indenting any numbered statement must check for a
+@samp{do} that ends there.  If you always end @samp{do} statements with
+a @samp{continue} line (or if you use the more modern @samp{enddo}),
+then you can speed up indentation by setting this variable to
+@code{nil}.  The default is @code{nil}.
+
+@item fortran-blink-matching-if
+If this is @code{t}, indenting an @samp{endif} (or @samp{enddo}
+statement moves the cursor momentarily to the matching @samp{if} (or
+@samp{do}) statement to show where it is.  The default is @code{nil}.
+
+@item fortran-minimum-statement-indent-fixed
+Minimum indentation for Fortran statements when using fixed format
+continuation line style.  Statement bodies are never indented less than
+this much.  The default is 6.
+
+@item fortran-minimum-statement-indent-tab
+Minimum indentation for Fortran statements for tab format continuation line
+style.  Statement bodies are never indented less than this much.  The
+default is 8.
+@end table
+
+The variables controlling the indentation of comments are described in
+the following section.
+
+@node Fortran Comments
+@subsection Fortran Comments
+
+  The usual Emacs comment commands assume that a comment can follow a
+line of code.  In Fortran77, the standard comment syntax requires an
+entire line to be just a comment.  Therefore, Fortran mode replaces the
+standard Emacs comment commands and defines some new variables.
+
+@vindex fortran-comment-line-start
+  Fortran mode can also handle the Fortran90 comment syntax where comments
+start with @samp{!} and can follow other text.  Because only some Fortran77
+compilers accept this syntax, Fortran mode will not insert such comments
+unless you have said in advance to do so.  To do this, set the variable
+@code{fortran-comment-line-start} to @samp{"!"}.
+
+@table @kbd
+@item M-;
+Align comment or insert new comment (@code{fortran-indent-comment}).
+
+@item C-x ;
+Applies to nonstandard @samp{!} comments only.
+
+@item C-c ;
+Turn all lines of the region into comments, or (with argument) turn them back
+into real code (@code{fortran-comment-region}).
+@end table
+
+@findex fortran-indent-comment
+  @kbd{M-;} in Fortran mode is redefined as the command
+@code{fortran-indent-comment}.  Like the usual @kbd{M-;} command, this
+recognizes any kind of existing comment and aligns its text appropriately;
+if there is no existing comment, a comment is inserted and aligned.  But
+inserting and aligning comments are not the same in Fortran mode as in
+other modes.
+
+  When a new comment must be inserted, if the current line is blank, a
+full-line comment is inserted.  On a non-blank line, a nonstandard @samp{!}
+comment is inserted if you have said you want to use them.  Otherwise a
+full-line comment is inserted on a new line before the current line.
+
+  Nonstandard @samp{!} comments are aligned like comments in other
+languages, but full-line comments are different.  In a standard full-line
+comment, the comment delimiter itself must always appear in column zero.
+What can be aligned is the text within the comment.  You can choose from
+three styles of alignment by setting the variable
+@code{fortran-comment-indent-style} to one of these values:
+
+@vindex fortran-comment-indent-style
+@vindex fortran-comment-line-extra-indent
+@table @code
+@item fixed
+Align the text at a fixed column, which is the sum of
+@code{fortran-comment-line-extra-indent} and the minimum statement
+indentation.  This is the default.
+
+The minimum statement indentation is
+@code{fortran-minimum-statement-indent-fixed} for fixed format
+continuation line style and @code{fortran-minimum-statement-indent-tab}
+for tab format style.
+
+@item relative
+Align the text as if it were a line of code, but with an additional
+@code{fortran-comment-line-extra-indent} columns of indentation.
+
+@item nil
+Don't move text in full-line comments automatically.
+@end table
+
+@vindex fortran-comment-indent-char
+  In addition, you can specify the character to be used to indent within
+full-line comments by setting the variable
+@code{fortran-comment-indent-char} to the single-character string you want
+to use.
+
+@vindex fortran-directive-re
+  Compiler directive lines, or preprocessor lines, have much the same
+appearance as comment lines.  It is important, though, that such lines
+never be indented at all, no matter what the value of
+@code{fortran-comment-indent-style}.  The variable
+@code{fortran-directive-re} is a regular expression that specifies which
+lines are directives.  Matching lines are never indented, and receive
+distinctive font-locking.
+
+  The normal Emacs comment command @kbd{C-x ;} has not been redefined.  If
+you use @samp{!} comments, this command can be used with them.  Otherwise
+it is useless in Fortran mode.
+
+@kindex C-c ; @r{(Fortran mode)}
+@findex fortran-comment-region
+@vindex fortran-comment-region
+  The command @kbd{C-c ;} (@code{fortran-comment-region}) turns all the
+lines of the region into comments by inserting the string @samp{C$$$} at
+the front of each one.  With a numeric argument, it turns the region
+back into live code by deleting @samp{C$$$} from the front of each line
+in it.  The string used for these comments can be controlled by setting
+the variable @code{fortran-comment-region}.  Note that here we have an
+example of a command and a variable with the same name; these two uses
+of the name never conflict because in Lisp and in Emacs it is always
+clear from the context which one is meant.
+
+@node Fortran Autofill
+@subsection Auto Fill in Fortran Mode
+
+  Fortran mode has specialized support for Auto Fill mode, which is a
+minor mode that automatically splits statements as you insert them
+when they become too wide.  Splitting a statement involves making
+continuation lines using @code{fortran-continuation-string}
+(@pxref{ForIndent Cont}).  This splitting happens when you type
+@key{SPC}, @key{RET}, or @key{TAB}, and also in the Fortran
+indentation commands.  You activate Auto Fill in Fortran mode in the
+normal way.
+@iftex
+@xref{Auto Fill,,, emacs, the Emacs Manual}.
+@end iftex
+@ifnottex
+@xref{Auto Fill}.
+@end ifnottex
+
+@vindex fortran-break-before-delimiters
+   Auto Fill breaks lines at spaces or delimiters when the lines get
+longer than the desired width (the value of @code{fill-column}).  The
+delimiters (besides whitespace) that Auto Fill can break at are
+@samp{+}, @samp{-}, @samp{/}, @samp{*}, @samp{=}, @samp{<}, @samp{>},
+and @samp{,}.  The line break comes after the delimiter if the
+variable @code{fortran-break-before-delimiters} is @code{nil}.
+Otherwise (and by default), the break comes before the delimiter.
+
+  To enable Auto Fill in all Fortran buffers, add
+@code{turn-on-auto-fill} to @code{fortran-mode-hook}.
+@iftex
+@xref{Hooks,,, emacs, the Emacs Manual}.
+@end iftex
+@ifnottex
+@xref{Hooks}.
+@end ifnottex
+
+@node Fortran Columns
+@subsection Checking Columns in Fortran
+
+@table @kbd
+@item C-c C-r
+Display a ``column ruler'' momentarily above the current line
+(@code{fortran-column-ruler}).
+@item C-c C-w
+Split the current window horizontally temporarily so that it is 72
+columns wide (@code{fortran-window-create-momentarily}).  This may
+help you avoid making lines longer than the 72-character limit that
+some Fortran compilers impose.
+@item C-u C-c C-w
+Split the current window horizontally so that it is 72 columns wide
+(@code{fortran-window-create}).  You can then continue editing.
+@item M-x fortran-strip-sequence-nos
+Delete all text in column 72 and beyond.
+@end table
+
+@kindex C-c C-r @r{(Fortran mode)}
+@findex fortran-column-ruler
+  The command @kbd{C-c C-r} (@code{fortran-column-ruler}) shows a column
+ruler momentarily above the current line.  The comment ruler is two lines
+of text that show you the locations of columns with special significance in
+Fortran programs.  Square brackets show the limits of the columns for line
+numbers, and curly brackets show the limits of the columns for the
+statement body.  Column numbers appear above them.
+
+  Note that the column numbers count from zero, as always in GNU Emacs.
+As a result, the numbers may be one less than those you are familiar
+with; but the positions they indicate in the line are standard for
+Fortran.
+
+@vindex fortran-column-ruler-fixed
+@vindex fortran-column-ruler-tabs
+  The text used to display the column ruler depends on the value of the
+variable @code{indent-tabs-mode}.  If @code{indent-tabs-mode} is
+@code{nil}, then the value of the variable
+@code{fortran-column-ruler-fixed} is used as the column ruler.
+Otherwise, the value of the variable @code{fortran-column-ruler-tab} is
+displayed.  By changing these variables, you can change the column ruler
+display.
+
+@kindex C-c C-w @r{(Fortran mode)}
+@findex fortran-window-create-momentarily
+  @kbd{C-c C-w} (@code{fortran-window-create-momentarily}) temporarily
+splits the current window horizontally, making a window 72 columns
+wide, so you can see any lines that are too long.  Type a space to
+restore the normal width.
+
+@kindex C-u C-c C-w @r{(Fortran mode)}
+@findex fortran-window-create
+  You can also split the window horizontally and continue editing with
+the split in place.  To do this, use @kbd{C-u C-c C-w} (@code{M-x
+fortran-window-create}).  By editing in this window you can
+immediately see when you make a line too wide to be correct Fortran.
+
+@findex fortran-strip-sequence-nos
+  The command @kbd{M-x fortran-strip-sequence-nos} deletes all text in
+column 72 and beyond, on all lines in the current buffer.  This is the
+easiest way to get rid of old sequence numbers.
+
+@node Fortran Abbrev
+@subsection Fortran Keyword Abbrevs
+
+  Fortran mode provides many built-in abbrevs for common keywords and
+declarations.  These are the same sort of abbrev that you can define
+yourself.  To use them, you must turn on Abbrev mode.
+@iftex
+@xref{Abbrevs,,, emacs, the Emacs Manual}.
+@end iftex
+@ifnottex
+@xref{Abbrevs}.
+@end ifnottex
+
+  The built-in abbrevs are unusual in one way: they all start with a
+semicolon.  You cannot normally use semicolon in an abbrev, but Fortran
+mode makes this possible by changing the syntax of semicolon to ``word
+constituent.''
+
+  For example, one built-in Fortran abbrev is @samp{;c} for
+@samp{continue}.  If you insert @samp{;c} and then insert a punctuation
+character such as a space or a newline, the @samp{;c} expands automatically
+to @samp{continue}, provided Abbrev mode is enabled.@refill
+
+  Type @samp{;?} or @samp{;C-h} to display a list of all the built-in
+Fortran abbrevs and what they stand for.
+
+@ignore
+   arch-tag: 23ed7c36-1517-4646-9235-2d5ade5f06f6
+@end ignore
similarity index 100%
rename from man/frames.texi
rename to doc/emacs/frames.texi
similarity index 100%
rename from man/glossary.texi
rename to doc/emacs/glossary.texi
diff --git a/doc/emacs/gnu.texi b/doc/emacs/gnu.texi
new file mode 100644 (file)
index 0000000..1cf85f4
--- /dev/null
@@ -0,0 +1,567 @@
+@c This is part of the Emacs manual.
+@c Copyright (C) 1985, 1986, 1987, 1993, 1995, 2001, 2002, 2003, 2004,
+@c   2005, 2006, 2007  Free Software Foundation, Inc.
+@ifclear justgnu
+@node Manifesto,, Microsoft Windows, Top
+@unnumbered The GNU Manifesto
+@end ifclear
+@ifset justgnu
+Copyright @copyright{} 1985, 1993, 2001, 2002, 2003, 2004,
+2005, 2006, 2007  Free Software Foundation, Inc.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with the Front-Cover texts being ``A GNU
+Manual'', and with the Back-Cover Texts as in (a) below.  A copy of the
+license is included in the section entitled ``GNU Free Documentation
+License'' in the Emacs manual.
+
+(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
+this GNU Manual, like GNU software.  Copies published by the Free
+Software Foundation raise funds for GNU development.''
+
+This document is part of a collection distributed under the GNU Free
+Documentation License.  If you want to distribute this document
+separately from the collection, you can do so by adding a copy of the
+license to the document, as described in section 6 of the license.
+
+@node Top
+@top The GNU Manifesto
+@end ifset
+
+@quotation
+The GNU Manifesto which appears below was written by Richard Stallman at
+the beginning of the GNU project, to ask for participation and support.
+For the first few years, it was updated in minor ways to account for
+developments, but now it seems best to leave it unchanged as most people
+have seen it.
+
+Since that time, we have learned about certain common misunderstandings
+that different wording could help avoid.  Footnotes added in 1993 help
+clarify these points.
+
+For up-to-date information about available GNU software, please see
+our web site, @uref{http://www.gnu.org}.  For software tasks and other
+ways to contribute, see @uref{http://www.gnu.org/help}.
+@end quotation
+
+@unnumberedsec What's GNU?  Gnu's Not Unix!
+
+GNU, which stands for Gnu's Not Unix, is the name for the complete
+Unix-compatible software system which I am writing so that I can give it
+away free to everyone who can use it.@footnote{The wording here was
+careless.  The intention was that nobody would have to pay for
+@emph{permission} to use the GNU system.  But the words don't make this
+clear, and people often interpret them as saying that copies of GNU
+should always be distributed at little or no charge.  That was never the
+intent; later on, the manifesto mentions the possibility of companies
+providing the service of distribution for a profit.  Subsequently I have
+learned to distinguish carefully between ``free'' in the sense of
+freedom and ``free'' in the sense of price.  Free software is software
+that users have the freedom to distribute and change.  Some users may
+obtain copies at no charge, while others pay to obtain copies---and if
+the funds help support improving the software, so much the better.  The
+important thing is that everyone who has a copy has the freedom to
+cooperate with others in using it.} Several other volunteers are helping
+me.  Contributions of time, money, programs and equipment are greatly
+needed.
+
+So far we have an Emacs text editor with Lisp for writing editor commands,
+a source level debugger, a yacc-compatible parser generator, a linker, and
+around 35 utilities.  A shell (command interpreter) is nearly completed.  A
+new portable optimizing C compiler has compiled itself and may be released
+this year.  An initial kernel exists but many more features are needed to
+emulate Unix.  When the kernel and compiler are finished, it will be
+possible to distribute a GNU system suitable for program development.  We
+will use @TeX{} as our text formatter, but an nroff is being worked on.  We
+will use the free, portable X window system as well.  After this we will
+add a portable Common Lisp, an Empire game, a spreadsheet, and hundreds of
+other things, plus on-line documentation.  We hope to supply, eventually,
+everything useful that normally comes with a Unix system, and more.
+
+GNU will be able to run Unix programs, but will not be identical to Unix.
+We will make all improvements that are convenient, based on our experience
+with other operating systems.  In particular, we plan to have longer
+file names, file version numbers, a crashproof file system, file name
+completion perhaps, terminal-independent display support, and perhaps
+eventually a Lisp-based window system through which several Lisp programs
+and ordinary Unix programs can share a screen.  Both C and Lisp will be
+available as system programming languages.  We will try to support UUCP,
+MIT Chaosnet, and Internet protocols for communication.
+
+GNU is aimed initially at machines in the 68000/16000 class with virtual
+memory, because they are the easiest machines to make it run on.  The extra
+effort to make it run on smaller machines will be left to someone who wants
+to use it on them.
+
+To avoid horrible confusion, please pronounce the `G' in the word `GNU'
+when it is the name of this project.
+
+@unnumberedsec Why I Must Write GNU
+
+I consider that the golden rule requires that if I like a program I must
+share it with other people who like it.  Software sellers want to divide
+the users and conquer them, making each user agree not to share with
+others.  I refuse to break solidarity with other users in this way.  I
+cannot in good conscience sign a nondisclosure agreement or a software
+license agreement.  For years I worked within the Artificial Intelligence
+Lab to resist such tendencies and other inhospitalities, but eventually
+they had gone too far: I could not remain in an institution where such
+things are done for me against my will.
+
+So that I can continue to use computers without dishonor, I have decided to
+put together a sufficient body of free software so that I will be able to
+get along without any software that is not free.  I have resigned from the
+AI lab to deny MIT any legal excuse to prevent me from giving GNU away.
+
+@unnumberedsec Why GNU Will Be Compatible with Unix
+
+Unix is not my ideal system, but it is not too bad.  The essential features
+of Unix seem to be good ones, and I think I can fill in what Unix lacks
+without spoiling them.  And a system compatible with Unix would be
+convenient for many other people to adopt.
+
+@unnumberedsec How GNU Will Be Available
+
+GNU is not in the public domain.  Everyone will be permitted to modify and
+redistribute GNU, but no distributor will be allowed to restrict its
+further redistribution.  That is to say, proprietary modifications will not
+be allowed.  I want to make sure that all versions of GNU remain free.
+
+@unnumberedsec Why Many Other Programmers Want to Help
+
+I have found many other programmers who are excited about GNU and want to
+help.
+
+Many programmers are unhappy about the commercialization of system
+software.  It may enable them to make more money, but it requires them to
+feel in conflict with other programmers in general rather than feel as
+comrades.  The fundamental act of friendship among programmers is the
+sharing of programs; marketing arrangements now typically used essentially
+forbid programmers to treat others as friends.  The purchaser of software
+must choose between friendship and obeying the law.  Naturally, many decide
+that friendship is more important.  But those who believe in law often do
+not feel at ease with either choice.  They become cynical and think that
+programming is just a way of making money.
+
+By working on and using GNU rather than proprietary programs, we can be
+hospitable to everyone and obey the law.  In addition, GNU serves as an
+example to inspire and a banner to rally others to join us in sharing.
+This can give us a feeling of harmony which is impossible if we use
+software that is not free.  For about half the programmers I talk to, this
+is an important happiness that money cannot replace.
+
+@unnumberedsec How You Can Contribute
+
+I am asking computer manufacturers for donations of machines and money.
+I'm asking individuals for donations of programs and work.
+
+One consequence you can expect if you donate machines is that GNU will run
+on them at an early date.  The machines should be complete, ready to use
+systems, approved for use in a residential area, and not in need of
+sophisticated cooling or power.
+
+I have found very many programmers eager to contribute part-time work for
+GNU.  For most projects, such part-time distributed work would be very hard
+to coordinate; the independently-written parts would not work together.
+But for the particular task of replacing Unix, this problem is absent.  A
+complete Unix system contains hundreds of utility programs, each of which
+is documented separately.  Most interface specifications are fixed by Unix
+compatibility.  If each contributor can write a compatible replacement for
+a single Unix utility, and make it work properly in place of the original
+on a Unix system, then these utilities will work right when put together.
+Even allowing for Murphy to create a few unexpected problems, assembling
+these components will be a feasible task.  (The kernel will require closer
+communication and will be worked on by a small, tight group.)
+
+If I get donations of money, I may be able to hire a few people full or
+part time.  The salary won't be high by programmers' standards, but I'm
+looking for people for whom building community spirit is as important as
+making money.  I view this as a way of enabling dedicated people to devote
+their full energies to working on GNU by sparing them the need to make a
+living in another way.
+
+@unnumberedsec Why All Computer Users Will Benefit
+
+Once GNU is written, everyone will be able to obtain good system
+software free, just like air.@footnote{This is another place I failed to
+distinguish carefully between the two different meanings of ``free.''
+The statement as it stands is not false---you can get copies of GNU
+software at no charge, from your friends or over the net.  But it does
+suggest the wrong idea.}
+
+This means much more than just saving everyone the price of a Unix license.
+It means that much wasteful duplication of system programming effort will
+be avoided.  This effort can go instead into advancing the state of the
+art.
+
+Complete system sources will be available to everyone.  As a result, a user
+who needs changes in the system will always be free to make them himself,
+or hire any available programmer or company to make them for him.  Users
+will no longer be at the mercy of one programmer or company which owns the
+sources and is in sole position to make changes.
+
+Schools will be able to provide a much more educational environment by
+encouraging all students to study and improve the system code.  Harvard's
+computer lab used to have the policy that no program could be installed on
+the system if its sources were not on public display, and upheld it by
+actually refusing to install certain programs.  I was very much inspired by
+this.
+
+Finally, the overhead of considering who owns the system software and what
+one is or is not entitled to do with it will be lifted.
+
+Arrangements to make people pay for using a program, including licensing of
+copies, always incur a tremendous cost to society through the cumbersome
+mechanisms necessary to figure out how much (that is, which programs) a
+person must pay for.  And only a police state can force everyone to obey
+them.  Consider a space station where air must be manufactured at great
+cost: charging each breather per liter of air may be fair, but wearing the
+metered gas mask all day and all night is intolerable even if everyone can
+afford to pay the air bill.  And the TV cameras everywhere to see if you
+ever take the mask off are outrageous.  It's better to support the air
+plant with a head tax and chuck the masks.
+
+Copying all or parts of a program is as natural to a programmer as
+breathing, and as productive.  It ought to be as free.
+
+@unnumberedsec Some Easily Rebutted Objections to GNU's Goals
+
+@quotation
+``Nobody will use it if it is free, because that means they can't rely
+on any support.''
+
+``You have to charge for the program to pay for providing the
+support.''
+@end quotation
+
+If people would rather pay for GNU plus service than get GNU free without
+service, a company to provide just service to people who have obtained GNU
+free ought to be profitable.@footnote{Several such companies now exist.}
+
+We must distinguish between support in the form of real programming work
+and mere handholding.  The former is something one cannot rely on from a
+software vendor.  If your problem is not shared by enough people, the
+vendor will tell you to get lost.
+
+If your business needs to be able to rely on support, the only way is to
+have all the necessary sources and tools.  Then you can hire any available
+person to fix your problem; you are not at the mercy of any individual.
+With Unix, the price of sources puts this out of consideration for most
+businesses.  With GNU this will be easy.  It is still possible for there to
+be no available competent person, but this problem cannot be blamed on
+distribution arrangements.  GNU does not eliminate all the world's problems,
+only some of them.
+
+Meanwhile, the users who know nothing about computers need handholding:
+doing things for them which they could easily do themselves but don't know
+how.
+
+Such services could be provided by companies that sell just hand-holding
+and repair service.  If it is true that users would rather spend money and
+get a product with service, they will also be willing to buy the service
+having got the product free.  The service companies will compete in quality
+and price; users will not be tied to any particular one.  Meanwhile, those
+of us who don't need the service should be able to use the program without
+paying for the service.
+
+@quotation
+``You cannot reach many people without advertising,
+and you must charge for the program to support that.''
+
+``It's no use advertising a program people can get free.''
+@end quotation
+
+There are various forms of free or very cheap publicity that can be used to
+inform numbers of computer users about something like GNU.  But it may be
+true that one can reach more microcomputer users with advertising.  If this
+is really so, a business which advertises the service of copying and
+mailing GNU for a fee ought to be successful enough to pay for its
+advertising and more.  This way, only the users who benefit from the
+advertising pay for it.
+
+On the other hand, if many people get GNU from their friends, and such
+companies don't succeed, this will show that advertising was not really
+necessary to spread GNU.  Why is it that free market advocates don't
+want to let the free market decide this?@footnote{The Free Software
+Foundation raises most of its funds from a distribution service,
+although it is a charity rather than a company.  If @emph{no one}
+chooses to obtain copies by ordering from the FSF, it will be unable
+to do its work.  But this does not mean that proprietary restrictions
+are justified to force every user to pay.  If a small fraction of all
+the users order copies from the FSF, that is sufficient to keep the FSF
+afloat.  So we ask users to choose to support us in this way.  Have you
+done your part?}
+
+@quotation
+``My company needs a proprietary operating system
+to get a competitive edge.''
+@end quotation
+
+GNU will remove operating system software from the realm of competition.
+You will not be able to get an edge in this area, but neither will your
+competitors be able to get an edge over you.  You and they will compete in
+other areas, while benefiting mutually in this one.  If your business is
+selling an operating system, you will not like GNU, but that's tough on
+you.  If your business is something else, GNU can save you from being
+pushed into the expensive business of selling operating systems.
+
+I would like to see GNU development supported by gifts from many
+manufacturers and users, reducing the cost to each.@footnote{A group of
+computer companies recently pooled funds to support maintenance of the
+GNU C Compiler.}
+
+@quotation
+``Don't programmers deserve a reward for their creativity?''
+@end quotation
+
+If anything deserves a reward, it is social contribution.  Creativity can
+be a social contribution, but only in so far as society is free to use the
+results.  If programmers deserve to be rewarded for creating innovative
+programs, by the same token they deserve to be punished if they restrict
+the use of these programs.
+
+@quotation
+``Shouldn't a programmer be able to ask for a reward for his creativity?''
+@end quotation
+
+There is nothing wrong with wanting pay for work, or seeking to maximize
+one's income, as long as one does not use means that are destructive.  But
+the means customary in the field of software today are based on
+destruction.
+
+Extracting money from users of a program by restricting their use of it is
+destructive because the restrictions reduce the amount and the ways that
+the program can be used.  This reduces the amount of wealth that humanity
+derives from the program.  When there is a deliberate choice to restrict,
+the harmful consequences are deliberate destruction.
+
+The reason a good citizen does not use such destructive means to become
+wealthier is that, if everyone did so, we would all become poorer from the
+mutual destructiveness.  This is Kantian ethics; or, the Golden Rule.
+Since I do not like the consequences that result if everyone hoards
+information, I am required to consider it wrong for one to do so.
+Specifically, the desire to be rewarded for one's creativity does not
+justify depriving the world in general of all or part of that creativity.
+
+@quotation
+``Won't programmers starve?''
+@end quotation
+
+I could answer that nobody is forced to be a programmer.  Most of us cannot
+manage to get any money for standing on the street and making faces.  But
+we are not, as a result, condemned to spend our lives standing on the
+street making faces, and starving.  We do something else.
+
+But that is the wrong answer because it accepts the questioner's implicit
+assumption: that without ownership of software, programmers cannot possibly
+be paid a cent.  Supposedly it is all or nothing.
+
+The real reason programmers will not starve is that it will still be
+possible for them to get paid for programming; just not paid as much as
+now.
+
+Restricting copying is not the only basis for business in software.  It is
+the most common basis because it brings in the most money.  If it were
+prohibited, or rejected by the customer, software business would move to
+other bases of organization which are now used less often.  There are
+always numerous ways to organize any kind of business.
+
+Probably programming will not be as lucrative on the new basis as it is
+now.  But that is not an argument against the change.  It is not considered
+an injustice that sales clerks make the salaries that they now do.  If
+programmers made the same, that would not be an injustice either.  (In
+practice they would still make considerably more than that.)
+
+@quotation
+``Don't people have a right to control how their creativity is used?''
+@end quotation
+
+``Control over the use of one's ideas'' really constitutes control over
+other people's lives; and it is usually used to make their lives more
+difficult.
+
+People who have studied the issue of intellectual property
+rights@footnote{In the 80s I had not yet realized how confusing it was
+to speak of ``the issue'' of ``intellectual property.''  That term is
+obviously biased; more subtle is the fact that it lumps together
+various disparate laws which raise very different issues.  Nowadays I
+urge people to reject the term ``intellectual property'' entirely,
+lest it lead others to suppose that those laws form one coherent
+issue.  The way to be clear is to discuss patents, copyrights, and
+trademarks separately.  See
+@uref{http://www.gnu.org/philosophy/not-ipr.xhtml} for more
+explanation of how this term spreads confusion and bias.} carefully
+(such as lawyers) say that there is no intrinsic right to intellectual
+property.  The kinds of supposed intellectual property rights that the
+government recognizes were created by specific acts of legislation for
+specific purposes.
+
+For example, the patent system was established to encourage inventors to
+disclose the details of their inventions.  Its purpose was to help society
+rather than to help inventors.  At the time, the life span of 17 years for
+a patent was short compared with the rate of advance of the state of the
+art.  Since patents are an issue only among manufacturers, for whom the
+cost and effort of a license agreement are small compared with setting up
+production, the patents often do not do much harm.  They do not obstruct
+most individuals who use patented products.
+
+The idea of copyright did not exist in ancient times, when authors
+frequently copied other authors at length in works of non-fiction.  This
+practice was useful, and is the only way many authors' works have survived
+even in part.  The copyright system was created expressly for the purpose
+of encouraging authorship.  In the domain for which it was
+invented---books, which could be copied economically only on a printing
+press---it did little harm, and did not obstruct most of the individuals
+who read the books.
+
+All intellectual property rights are just licenses granted by society
+because it was thought, rightly or wrongly, that society as a whole would
+benefit by granting them.  But in any particular situation, we have to ask:
+are we really better off granting such license?  What kind of act are we
+licensing a person to do?
+
+The case of programs today is very different from that of books a hundred
+years ago.  The fact that the easiest way to copy a program is from one
+neighbor to another, the fact that a program has both source code and
+object code which are distinct, and the fact that a program is used rather
+than read and enjoyed, combine to create a situation in which a person who
+enforces a copyright is harming society as a whole both materially and
+spiritually; in which a person should not do so regardless of whether the
+law enables him to.
+
+@quotation
+``Competition makes things get done better.''
+@end quotation
+
+The paradigm of competition is a race: by rewarding the winner, we
+encourage everyone to run faster.  When capitalism really works this way,
+it does a good job; but its defenders are wrong in assuming it always works
+this way.  If the runners forget why the reward is offered and become
+intent on winning, no matter how, they may find other strategies---such as,
+attacking other runners.  If the runners get into a fist fight, they will
+all finish late.
+
+Proprietary and secret software is the moral equivalent of runners in a
+fist fight.  Sad to say, the only referee we've got does not seem to
+object to fights; he just regulates them (``For every ten yards you run,
+you can fire one shot'').  He really ought to break them up, and penalize
+runners for even trying to fight.
+
+@quotation
+``Won't everyone stop programming without a monetary incentive?''
+@end quotation
+
+Actually, many people will program with absolutely no monetary incentive.
+Programming has an irresistible fascination for some people, usually the
+people who are best at it.  There is no shortage of professional musicians
+who keep at it even though they have no hope of making a living that way.
+
+But really this question, though commonly asked, is not appropriate to the
+situation.  Pay for programmers will not disappear, only become less.  So
+the right question is, will anyone program with a reduced monetary
+incentive?  My experience shows that they will.
+
+For more than ten years, many of the world's best programmers worked at the
+Artificial Intelligence Lab for far less money than they could have had
+anywhere else.  They got many kinds of non-monetary rewards: fame and
+appreciation, for example.  And creativity is also fun, a reward in itself.
+
+Then most of them left when offered a chance to do the same interesting
+work for a lot of money.
+
+What the facts show is that people will program for reasons other than
+riches; but if given a chance to make a lot of money as well, they will
+come to expect and demand it.  Low-paying organizations do poorly in
+competition with high-paying ones, but they do not have to do badly if the
+high-paying ones are banned.
+
+@quotation
+``We need the programmers desperately.  If they demand that we
+stop helping our neighbors, we have to obey.''
+@end quotation
+
+You're never so desperate that you have to obey this sort of demand.
+Remember: millions for defense, but not a cent for tribute!
+
+@quotation
+``Programmers need to make a living somehow.''
+@end quotation
+
+In the short run, this is true.  However, there are plenty of ways that
+programmers could make a living without selling the right to use a program.
+This way is customary now because it brings programmers and businessmen the
+most money, not because it is the only way to make a living.  It is easy to
+find other ways if you want to find them.  Here are a number of examples.
+
+A manufacturer introducing a new computer will pay for the porting of
+operating systems onto the new hardware.
+
+The sale of teaching, hand-holding and maintenance services could also
+employ programmers.
+
+People with new ideas could distribute programs as
+freeware@footnote{Subsequently we have discovered the need to
+distinguish between ``free software'' and ``freeware''.  The term
+``freeware'' means software you are free to redistribute, but usually
+you are not free to study and change the source code, so most of it is
+not free software.  See
+@uref{http://www.gnu.org/philosophy/words-to-avoid.html} for more
+explanation.}, asking for donations from satisfied users, or selling
+hand-holding services.  I have met people who are already working this
+way successfully.
+
+Users with related needs can form users' groups, and pay dues.  A group
+would contract with programming companies to write programs that the
+group's members would like to use.
+
+All sorts of development can be funded with a Software Tax:
+
+@quotation
+Suppose everyone who buys a computer has to pay x percent of
+the price as a software tax.  The government gives this to
+an agency like the NSF to spend on software development.
+
+But if the computer buyer makes a donation to software development
+himself, he can take a credit against the tax.  He can donate to
+the project of his own choosing---often, chosen because he hopes to
+use the results when it is done.  He can take a credit for any amount
+of donation up to the total tax he had to pay.
+
+The total tax rate could be decided by a vote of the payers of
+the tax, weighted according to the amount they will be taxed on.
+
+The consequences:
+
+@itemize @bullet
+@item
+The computer-using community supports software development.
+@item
+This community decides what level of support is needed.
+@item
+Users who care which projects their share is spent on
+can choose this for themselves.
+@end itemize
+@end quotation
+
+In the long run, making programs free is a step toward the post-scarcity
+world, where nobody will have to work very hard just to make a living.
+People will be free to devote themselves to activities that are fun, such
+as programming, after spending the necessary ten hours a week on required
+tasks such as legislation, family counseling, robot repair and asteroid
+prospecting.  There will be no need to be able to make a living from
+programming.
+
+We have already greatly reduced the amount of work that the whole society
+must do for its actual productivity, but only a little of this has
+translated itself into leisure for workers because much nonproductive
+activity is required to accompany productive activity.  The main causes of
+this are bureaucracy and isometric struggles against competition.  Free
+software will greatly reduce these drains in the area of software
+production.  We must do this, in order for technical gains in productivity
+to translate into less work for us.
+
+@ignore
+   arch-tag: 21eb38f8-6fa0-480a-91cd-f3dab7148542
+@end ignore
diff --git a/doc/emacs/gpl.texi b/doc/emacs/gpl.texi
new file mode 100644 (file)
index 0000000..7fe5c3e
--- /dev/null
@@ -0,0 +1,721 @@
+@c The GNU General Public License.
+@center Version 3, 29 June 2007
+
+@c This file is intended to be included within another document,
+@c hence no sectioning command or @node.  
+
+@display
+Copyright @copyright{} 2007 Free Software Foundation, Inc. @url{http://fsf.org/}
+
+Everyone is permitted to copy and distribute verbatim copies of this
+license document, but changing it is not allowed.
+@end display
+
+@heading Preamble
+
+The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom
+to share and change all versions of a program---to make sure it remains
+free software for all its users.  We, the Free Software Foundation,
+use the GNU General Public License for most of our software; it
+applies also to any other work released this way by its authors.  You
+can apply it to your programs, too.
+
+When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you
+have certain responsibilities if you distribute copies of the
+software, or if you modify it: responsibilities to respect the freedom
+of others.
+
+For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too,
+receive or can get the source code.  And you must show them these
+terms so they know their rights.
+
+Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the
+manufacturer can do so.  This is fundamentally incompatible with the
+aim of protecting users' freedom to change the software.  The
+systematic pattern of such abuse occurs in the area of products for
+individuals to use, which is precisely where it is most unacceptable.
+Therefore, we have designed this version of the GPL to prohibit the
+practice for those products.  If such problems arise substantially in
+other domains, we stand ready to extend this provision to those
+domains in future versions of the GPL, as needed to protect the
+freedom of users.
+
+Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish
+to avoid the special danger that patents applied to a free program
+could make it effectively proprietary.  To prevent this, the GPL
+assures that patents cannot be used to render the program non-free.
+
+The precise terms and conditions for copying, distribution and
+modification follow.
+
+@heading TERMS AND CONDITIONS
+
+@enumerate 0
+@item Definitions.
+
+``This License'' refers to version 3 of the GNU General Public License.
+
+``Copyright'' also means copyright-like laws that apply to other kinds
+of works, such as semiconductor masks.
+
+``The Program'' refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as ``you''.  ``Licensees'' and
+``recipients'' may be individuals or organizations.
+
+To ``modify'' a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of
+an exact copy.  The resulting work is called a ``modified version'' of
+the earlier work or a work ``based on'' the earlier work.
+
+A ``covered work'' means either the unmodified Program or a work based
+on the Program.
+
+To ``propagate'' a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+To ``convey'' a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user
+through a computer network, with no transfer of a copy, is not
+conveying.
+
+An interactive user interface displays ``Appropriate Legal Notices'' to
+the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+@item Source Code.
+
+The ``source code'' for a work means the preferred form of the work for
+making modifications to it.  ``Object code'' means any non-source form
+of a work.
+
+A ``Standard Interface'' means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+The ``System Libraries'' of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+``Major Component'', in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+The ``Corresponding Source'' for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+The Corresponding Source need not include anything that users can
+regenerate automatically from other parts of the Corresponding Source.
+
+The Corresponding Source for a work in source code form is that same
+work.
+
+@item Basic Permissions.
+
+All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+You may make, run and propagate covered works that you do not convey,
+without conditions so long as your license otherwise remains in force.
+You may convey covered works to others for the sole purpose of having
+them make modifications exclusively for you, or provide you with
+facilities for running those works, provided that you comply with the
+terms of this License in conveying all material for which you do not
+control copyright.  Those thus making or running the covered works for
+you must do so exclusively on your behalf, under your direction and
+control, on terms that prohibit them from making any copies of your
+copyrighted material outside their relationship with you.
+
+Conveying under any other circumstances is permitted solely under the
+conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+@item Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such
+circumvention is effected by exercising rights under this License with
+respect to the covered work, and you disclaim any intention to limit
+operation or modification of the work as a means of enforcing, against
+the work's users, your or third parties' legal rights to forbid
+circumvention of technological measures.
+
+@item Conveying Verbatim Copies.
+
+You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+@item Conveying Modified Source Versions.
+
+You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these
+conditions:
+
+@enumerate a
+@item 
+The work must carry prominent notices stating that you modified it,
+and giving a relevant date.
+
+@item
+The work must carry prominent notices stating that it is released
+under this License and any conditions added under section 7.  This
+requirement modifies the requirement in section 4 to ``keep intact all
+notices''.
+
+@item
+You must license the entire work, as a whole, under this License to
+anyone who comes into possession of a copy.  This License will
+therefore apply, along with any applicable section 7 additional terms,
+to the whole of the work, and all its parts, regardless of how they
+are packaged.  This License gives no permission to license the work in
+any other way, but it does not invalidate such permission if you have
+separately received it.
+
+@item
+If the work has interactive user interfaces, each must display
+Appropriate Legal Notices; however, if the Program has interactive
+interfaces that do not display Appropriate Legal Notices, your work
+need not make them do so.
+@end enumerate
+
+A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+``aggregate'' if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+@item  Conveying Non-Source Forms.
+
+You may convey a covered work in object code form under the terms of
+sections 4 and 5, provided that you also convey the machine-readable
+Corresponding Source under the terms of this License, in one of these
+ways:
+
+@enumerate a
+@item
+Convey the object code in, or embodied in, a physical product
+(including a physical distribution medium), accompanied by the
+Corresponding Source fixed on a durable physical medium customarily
+used for software interchange.
+
+@item
+Convey the object code in, or embodied in, a physical product
+(including a physical distribution medium), accompanied by a written
+offer, valid for at least three years and valid for as long as you
+offer spare parts or customer support for that product model, to give
+anyone who possesses the object code either (1) a copy of the
+Corresponding Source for all the software in the product that is
+covered by this License, on a durable physical medium customarily used
+for software interchange, for a price no more than your reasonable
+cost of physically performing this conveying of source, or (2) access
+to copy the Corresponding Source from a network server at no charge.
+
+@item
+Convey individual copies of the object code with a copy of the written
+offer to provide the Corresponding Source.  This alternative is
+allowed only occasionally and noncommercially, and only if you
+received the object code with such an offer, in accord with subsection
+6b.
+
+@item
+Convey the object code by offering access from a designated place
+(gratis or for a charge), and offer equivalent access to the
+Corresponding Source in the same way through the same place at no
+further charge.  You need not require recipients to copy the
+Corresponding Source along with the object code.  If the place to copy
+the object code is a network server, the Corresponding Source may be
+on a different server (operated by you or a third party) that supports
+equivalent copying facilities, provided you maintain clear directions
+next to the object code saying where to find the Corresponding Source.
+Regardless of what server hosts the Corresponding Source, you remain
+obligated to ensure that it is available for as long as needed to
+satisfy these requirements.
+
+@item
+Convey the object code using peer-to-peer transmission, provided you
+inform other peers where the object code and Corresponding Source of
+the work are being offered to the general public at no charge under
+subsection 6d.
+
+@end enumerate
+
+A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+A ``User Product'' is either (1) a ``consumer product'', which means any
+tangible personal property which is normally used for personal,
+family, or household purposes, or (2) anything designed or sold for
+incorporation into a dwelling.  In determining whether a product is a
+consumer product, doubtful cases shall be resolved in favor of
+coverage.  For a particular product received by a particular user,
+``normally used'' refers to a typical or common use of that class of
+product, regardless of the status of the particular user or of the way
+in which the particular user actually uses, or expects or is expected
+to use, the product.  A product is a consumer product regardless of
+whether the product has substantial commercial, industrial or
+non-consumer uses, unless such uses represent the only significant
+mode of use of the product.
+
+``Installation Information'' for a User Product means any methods,
+procedures, authorization keys, or other information required to
+install and execute modified versions of a covered work in that User
+Product from a modified version of its Corresponding Source.  The
+information must suffice to ensure that the continued functioning of
+the modified object code is in no case prevented or interfered with
+solely because modification has been made.
+
+If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or
+updates for a work that has been modified or installed by the
+recipient, or for the User Product in which it has been modified or
+installed.  Access to a network may be denied when the modification
+itself materially and adversely affects the operation of the network
+or violates the rules and protocols for communication across the
+network.
+
+Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+@item Additional Terms.
+
+``Additional permissions'' are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders
+of that material) supplement the terms of this License with terms:
+
+@enumerate a
+@item
+Disclaiming warranty or limiting liability differently from the terms
+of sections 15 and 16 of this License; or
+
+@item
+Requiring preservation of specified reasonable legal notices or author
+attributions in that material or in the Appropriate Legal Notices
+displayed by works containing it; or
+
+@item
+Prohibiting misrepresentation of the origin of that material, or
+requiring that modified versions of such material be marked in
+reasonable ways as different from the original version; or
+
+@item
+Limiting the use for publicity purposes of names of licensors or
+authors of the material; or
+
+@item
+Declining to grant rights under trademark law for use of some trade
+names, trademarks, or service marks; or
+
+@item
+Requiring indemnification of licensors and authors of that material by
+anyone who conveys the material (or modified versions of it) with
+contractual assumptions of liability to the recipient, for any
+liability that these contractual assumptions directly impose on those
+licensors and authors.
+@end enumerate
+
+All other non-permissive additional terms are considered ``further
+restrictions'' within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions; the
+above requirements apply either way.
+
+@item Termination.
+
+You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+However, if you cease all violation of this License, then your license
+from a particular copyright holder is reinstated (a) provisionally,
+unless and until the copyright holder explicitly and finally
+terminates your license, and (b) permanently, if the copyright holder
+fails to notify you of the violation by some reasonable means prior to
+60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+@item Acceptance Not Required for Having Copies.
+
+You are not required to accept this License in order to receive or run
+a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+@item Automatic Licensing of Downstream Recipients.
+
+Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+An ``entity transaction'' is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+@item Patents.
+
+A ``contributor'' is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's ``contributor version''.
+
+A contributor's ``essential patent claims'' are all patent claims owned
+or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, ``control'' includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+In the following three paragraphs, a ``patent license'' is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To ``grant'' such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  ``Knowingly relying'' means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+A patent license is ``discriminatory'' if it does not include within the
+scope of its coverage, prohibits the exercise of, or is conditioned on
+the non-exercise of one or more of the rights that are specifically
+granted under this License.  You may not convey a covered work if you
+are a party to an arrangement with a third party that is in the
+business of distributing software, under which you make payment to the
+third party based on the extent of your activity of conveying the
+work, and under which the third party grants, to any of the parties
+who would receive the covered work from you, a discriminatory patent
+license (a) in connection with copies of the covered work conveyed by
+you (or copies made from those copies), or (b) primarily for and in
+connection with specific products or compilations that contain the
+covered work, unless you entered into that arrangement, or that patent
+license was granted, prior to 28 March 2007.
+
+Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+@item No Surrender of Others' Freedom.
+
+If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey
+a covered work so as to satisfy simultaneously your obligations under
+this License and any other pertinent obligations, then as a
+consequence you may not convey it at all.  For example, if you agree
+to terms that obligate you to collect a royalty for further conveying
+from those to whom you convey the Program, the only way you could
+satisfy both those terms and this License would be to refrain entirely
+from conveying the Program.
+
+@item Use with the GNU Affero General Public License.
+
+Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+@item Revised Versions of this License.
+
+The Free Software Foundation may publish revised and/or new versions
+of the GNU General Public License from time to time.  Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies that a certain numbered version of the GNU General Public
+License ``or any later version'' applies to it, you have the option of
+following the terms and conditions either of that numbered version or
+of any later version published by the Free Software Foundation.  If
+the Program does not specify a version number of the GNU General
+Public License, you may choose any version ever published by the Free
+Software Foundation.
+
+If the Program specifies that a proxy can decide which future versions
+of the GNU General Public License can be used, that proxy's public
+statement of acceptance of a version permanently authorizes you to
+choose that version for the Program.
+
+Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+@item Disclaimer of Warranty.
+
+THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM ``AS IS'' WITHOUT
+WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND
+PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE PROGRAM PROVE
+DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
+CORRECTION.
+
+@item Limitation of Liability.
+
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR
+CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES
+ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT
+NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR
+LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM
+TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER
+PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+@item Interpretation of Sections 15 and 16.
+
+If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+@end enumerate
+
+@heading END OF TERMS AND CONDITIONS
+
+@heading How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these
+terms.
+
+To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the ``copyright'' line and a pointer to where the full notice is found.
+
+@smallexample
+@var{one line to give the program's name and a brief idea of what it does.}  
+Copyright (C) @var{year} @var{name of author}
+
+This program 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.
+
+This program 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 this program.  If not, see @url{http://www.gnu.org/licenses/}.
+@end smallexample
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+@smallexample
+@var{program} Copyright (C) @var{year} @var{name of author} 
+This program comes with ABSOLUTELY NO WARRANTY; for details type @samp{show w}.
+This is free software, and you are welcome to redistribute it
+under certain conditions; type @samp{show c} for details.
+@end smallexample
+
+The hypothetical commands @samp{show w} and @samp{show c} should show
+the appropriate parts of the General Public License.  Of course, your
+program's commands might be different; for a GUI interface, you would
+use an ``about box''.
+
+You should also get your employer (if you work as a programmer) or school,
+if any, to sign a ``copyright disclaimer'' for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+@url{http://www.gnu.org/licenses/}.
+
+The GNU General Public License does not permit incorporating your
+program into proprietary programs.  If your program is a subroutine
+library, you may consider it more useful to permit linking proprietary
+applications with the library.  If this is what you want to do, use
+the GNU Lesser General Public License instead of this License.  But
+first, please read @url{http://www.gnu.org/philosophy/why-not-lgpl.html}.
+
+@ignore
+   arch-tag: 8b9947e1-c830-4d70-8907-a97e556731ba
+@end ignore
similarity index 100%
rename from man/help.texi
rename to doc/emacs/help.texi
similarity index 100%
rename from man/indent.texi
rename to doc/emacs/indent.texi
similarity index 100%
rename from man/killing.texi
rename to doc/emacs/killing.texi
similarity index 100%
rename from man/kmacro.texi
rename to doc/emacs/kmacro.texi
diff --git a/doc/emacs/m-x.texi b/doc/emacs/m-x.texi
new file mode 100644 (file)
index 0000000..7a5b80f
--- /dev/null
@@ -0,0 +1,75 @@
+@c This is part of the Emacs manual.
+@c Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995, 1997, 2001, 2002,
+@c   2003, 2004, 2005, 2006, 2007  Free Software Foundation, Inc.
+@c See file emacs.texi for copying conditions.
+@node M-x, Help, Minibuffer, Top
+@chapter Running Commands by Name
+
+  Every Emacs command has a name that you can use to run it.  For
+convenience, many commands also have key bindings.  You can run those
+commands by typing the keys, or run them by name.  Most Emacs commands
+have no key bindings, so the only way to run them is by name.
+(@xref{Key Bindings}, for how to set up key bindings.)
+
+  By convention, a command name consists of one or more words,
+separated by hyphens; for example, @code{auto-fill-mode} or
+@code{manual-entry}.  Command names mostly use complete English words
+to make them easier to remember.
+
+@kindex M-x
+  To run a command by name, start with @kbd{M-x}, type the command
+name, then terminate it with @key{RET}.  @kbd{M-x} uses the minibuffer
+to read the command name.  The string @samp{M-x} appears at the
+beginning of the minibuffer as a @dfn{prompt} to remind you to enter a
+command name to be run.  @key{RET} exits the minibuffer and runs the
+command.  @xref{Minibuffer}, for more information on the minibuffer.
+
+  You can use completion to enter the command name.  For example,
+to invoke the command @code{forward-char}, you can type
+
+@example
+M-x forward-char @key{RET}
+@end example
+
+@noindent
+or
+
+@example
+M-x forw @key{TAB} c @key{RET}
+@end example
+
+@noindent
+Note that @code{forward-char} is the same command that you invoke with
+the key @kbd{C-f}.  The existence of a key binding does not stop you
+from running the command by name.
+
+  To cancel the @kbd{M-x} and not run a command, type @kbd{C-g} instead
+of entering the command name.  This takes you back to command level.
+
+  To pass a numeric argument to the command you are invoking with
+@kbd{M-x}, specify the numeric argument before @kbd{M-x}.  The
+argument value appears in the prompt while the command name is being
+read, and finally @kbd{M-x} passes the argument to that command.
+
+@vindex suggest-key-bindings
+  When the command you run with @kbd{M-x} has a key binding, Emacs
+mentions this in the echo area after running the command.  For
+example, if you type @kbd{M-x forward-word}, the message says that you
+can run the same command by typing @kbd{M-f}.  You can turn off these
+messages by setting the variable @code{suggest-key-bindings} to
+@code{nil}.
+
+  In this manual, when we speak of running a command by name, we often
+omit the @key{RET} that terminates the name.  Thus we might say
+@kbd{M-x auto-fill-mode} rather than @kbd{M-x auto-fill-mode
+@key{RET}}.  We mention the @key{RET} only for emphasis, such as when
+the command is followed by arguments.
+
+@findex execute-extended-command
+  @kbd{M-x} works by running the command
+@code{execute-extended-command}, which is responsible for reading the
+name of another command and invoking it.
+
+@ignore
+   arch-tag: b67bff53-9628-4666-b94e-eda972a7ba56
+@end ignore
similarity index 100%
rename from man/macos.texi
rename to doc/emacs/macos.texi
similarity index 100%
rename from man/major.texi
rename to doc/emacs/major.texi
diff --git a/doc/emacs/makefile.w32-in b/doc/emacs/makefile.w32-in
new file mode 100644 (file)
index 0000000..d34ab66
--- /dev/null
@@ -0,0 +1,144 @@
+#### -*- Makefile -*- for the Emacs Manual
+
+# Copyright (C) 2003, 2004, 2005, 2006, 2007 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, 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; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+# Boston, MA 02110-1301, USA.
+
+# Where to find the source code.  The source code for Emacs's C kernel is
+# expected to be in $(srcdir)/src, and the source code for Emacs's
+# utility programs is expected to be in $(srcdir)/lib-src.  This is
+# set by the configure script's `--srcdir' option.
+srcdir=.
+
+infodir = $(srcdir)/../../info
+
+# The makeinfo program is part of the Texinfo distribution.
+MAKEINFO = makeinfo --force
+MULTI_INSTALL_INFO = $(srcdir)\..\..\nt\multi-install-info.bat
+INFO_TARGETS = $(infodir)/emacs
+DVI_TARGETS =  emacs.dvi
+INFOSOURCES = info.texi
+
+# The following rule does not work with all versions of `make'.
+.SUFFIXES: .texi .dvi
+.texi.dvi:
+       texi2dvi $<
+
+TEXI2DVI = texi2dvi
+ENVADD = $(srcdir)\..\..\nt\envadd.bat "TEXINPUTS=$(srcdir);$(TEXINPUTS)" \
+        "MAKEINFO=$(MAKEINFO) -I$(srcdir)" /C
+
+EMACS_XTRA=\
+       $(srcdir)/arevert-xtra.texi \
+       $(srcdir)/cal-xtra.texi \
+       $(srcdir)/dired-xtra.texi \
+       $(srcdir)/picture-xtra.texi \
+       $(srcdir)/emerge-xtra.texi \
+       $(srcdir)/vc-xtra.texi \
+       $(srcdir)/vc1-xtra.texi \
+       $(srcdir)/vc2-xtra.texi \
+       $(srcdir)/fortran-xtra.texi \
+       $(srcdir)/msdog-xtra.texi
+
+EMACSSOURCES= \
+       $(srcdir)/emacs.texi \
+       $(srcdir)/doclicense.texi \
+       $(srcdir)/screen.texi \
+       $(srcdir)/commands.texi \
+       $(srcdir)/entering.texi \
+       $(srcdir)/basic.texi \
+       $(srcdir)/mini.texi \
+       $(srcdir)/m-x.texi \
+       $(srcdir)/help.texi \
+       $(srcdir)/mark.texi \
+       $(srcdir)/killing.texi \
+       $(srcdir)/regs.texi \
+       $(srcdir)/display.texi \
+       $(srcdir)/search.texi \
+       $(srcdir)/fixit.texi \
+       $(srcdir)/files.texi \
+       $(srcdir)/buffers.texi \
+       $(srcdir)/windows.texi \
+       $(srcdir)/frames.texi \
+       $(srcdir)/mule.texi \
+       $(srcdir)/major.texi \
+       $(srcdir)/indent.texi \
+       $(srcdir)/text.texi \
+       $(srcdir)/programs.texi \
+       $(srcdir)/building.texi \
+       $(srcdir)/maintaining.texi \
+       $(srcdir)/abbrevs.texi \
+       $(srcdir)/sending.texi \
+       $(srcdir)/rmail.texi \
+       $(srcdir)/dired.texi \
+       $(srcdir)/calendar.texi \
+       $(srcdir)/misc.texi \
+       $(srcdir)/custom.texi \
+       $(srcdir)/trouble.texi \
+       $(srcdir)/cmdargs.texi \
+       $(srcdir)/xresources.texi \
+       $(srcdir)/anti.texi \
+       $(srcdir)/macos.texi \
+       $(srcdir)/msdog.texi \
+       $(srcdir)/gnu.texi \
+       $(srcdir)/glossary.texi \
+       $(srcdir)/ack.texi \
+       $(srcdir)/kmacro.texi \
+       $(EMACS_XTRA)
+
+info: $(INFO_TARGETS)
+
+dvi: $(DVI_TARGETS)
+
+# Note that all the Info targets build the Info files
+# in srcdir.  There is no provision for Info files
+# to exist in the build directory.
+# In a distribution of Emacs, the Info files should be up to date.
+
+$(infodir)/dir:
+       $(MULTI_INSTALL_INFO) --info-dir=$(infodir) $(INFO_TARGETS)
+
+$(infodir)/emacs: $(EMACSSOURCES)
+       $(MAKEINFO) emacs.texi
+
+emacs.dvi: $(EMACSSOURCES)
+       $(ENVADD) $(TEXI2DVI) $(srcdir)/emacs.texi
+
+emacs-xtra.dvi: emacs-xtra.texi $(EMACS_XTRA)
+       $(ENVADD) $(TEXI2DVI) $(srcdir)/emacs-xtra.texi
+
+mostlyclean:
+       - $(DEL) *.log *.cp *.fn *.ky *.pg *.vr core *.tp *.core gnustmp.*
+
+clean: mostlyclean
+       - $(DEL) *.dvi
+       - $(DEL) $(infodir)/emacs*
+
+distclean: clean
+
+maintainer-clean: distclean
+       - $(DEL) *.aux *.cps *.fns *.kys *.pgs *.vrs *.toc
+# Don't delete these, because they are outside the current directory.
+#      for file in $(INFO_TARGETS); do rm -f $${file}*; done
+
+
+# Formerly this directory had texindex.c and getopt.c in it
+# and this makefile built them to make texindex.
+# That caused trouble because this is run entirely in the source directory.
+# Since we expect to get texi2dvi from elsewhere,
+# it is ok to expect texindex from elsewhere also.
diff --git a/doc/emacs/mark.texi b/doc/emacs/mark.texi
new file mode 100644 (file)
index 0000000..be446ab
--- /dev/null
@@ -0,0 +1,452 @@
+@c This is part of the Emacs manual.
+@c Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995, 1997, 2001, 2002,
+@c   2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+@c See file emacs.texi for copying conditions.
+@node Mark, Killing, Help, Top
+@chapter The Mark and the Region
+@cindex mark
+@cindex setting a mark
+@cindex region
+
+  Many Emacs commands operate on an arbitrary contiguous part of the
+current buffer.  To specify the text for such a command to operate on,
+you set @dfn{the mark} at one end of it, and move point to the other
+end.  The text between point and the mark is called @dfn{the region}.
+Emacs highlights the region whenever there is one, if you enable
+Transient Mark mode (@pxref{Transient Mark}).
+
+  Certain Emacs commands set the mark; other editing commands do not
+affect it, so the mark remains where you set it last.  Each Emacs
+buffer has its own mark, and setting the mark in one buffer has no
+effect on other buffers' marks.  When you return to a buffer that was
+current earlier, its mark is at the same place as before.
+
+  The ends of the region are always point and the mark.  It doesn't
+matter which of them was put in its current place first, or which one
+comes earlier in the text---the region starts from point or the mark
+(whichever comes first), and ends at point or the mark (whichever
+comes last).  Every time you move point, or set the mark in a new
+place, the region changes.
+
+  Many commands that insert text, such as @kbd{C-y} (@code{yank}) and
+@kbd{M-x insert-buffer}, position point and the mark at opposite ends
+of the inserted text, so that the region consists of the text just
+inserted.
+
+  Aside from delimiting the region, the mark is also useful for
+remembering a spot that you may want to go back to.  To make this
+feature more useful, each buffer remembers 16 previous locations of the
+mark in the @dfn{mark ring}.
+
+@menu
+* Setting Mark::       Commands to set the mark.
+* Transient Mark::     How to make Emacs highlight the region--
+                         when there is one.
+* Momentary Mark::      Enabling Transient Mark mode momentarily.
+* Using Region::       Summary of ways to operate on contents of the region.
+* Marking Objects::    Commands to put region around textual units.
+* Mark Ring::          Previous mark positions saved so you can go back there.
+* Global Mark Ring::    Previous mark positions in various buffers.
+@end menu
+
+@node Setting Mark
+@section Setting the Mark
+
+  Here are some commands for setting the mark:
+
+@table @kbd
+@item C-@key{SPC}
+Set the mark where point is (@code{set-mark-command}).
+@item C-@@
+The same.
+@item C-x C-x
+Interchange mark and point (@code{exchange-point-and-mark}).
+@item Drag-Mouse-1
+Set point and the mark around the text you drag across.
+@item Mouse-3
+Set the mark where point is, then move point to where you click
+(@code{mouse-save-then-kill}).
+@end table
+
+  For example, suppose you wish to convert part of the buffer to
+upper case, using the @kbd{C-x C-u} (@code{upcase-region}) command,
+which operates on the text in the region.  You can first go to the
+beginning of the text to be capitalized, type @kbd{C-@key{SPC}} to put
+the mark there, move to the end, and then type @kbd{C-x C-u}.  Or, you
+can set the mark at the end of the text, move to the beginning, and then
+type @kbd{C-x C-u}.
+
+@kindex C-SPC
+@findex set-mark-command
+  The most common way to set the mark is with the @kbd{C-@key{SPC}} command
+(@code{set-mark-command}).  This sets the mark where point is.  Then you
+can move point away, leaving the mark behind.
+
+  There are two ways to set the mark with the mouse.  You can drag mouse
+button one across a range of text; that puts point where you release the
+mouse button, and sets the mark at the other end of that range.  Or you
+can click mouse button three, which sets the mark at point (like
+@kbd{C-@key{SPC}}) and then moves point where you clicked (like
+@kbd{Mouse-1}).
+
+  Using the mouse to mark a region copies the region into the kill
+ring in addition to setting the mark; that gives behavior consistent
+with other window-driven applications.  If you don't want to modify
+the kill ring, you must use keyboard commands to set the mark.
+@xref{Mouse Commands}.
+
+@kindex C-x C-x
+@findex exchange-point-and-mark
+  When Emacs was developed, terminals had only one cursor, so Emacs
+does not show where the mark is located--you have to remember.  If you
+enable Transient Mark mode (see below), then the region is highlighted
+when it is active; you can tell mark is at the other end of the
+highlighted region.  But this only applies when the mark is active.
+
+  The usual solution to this problem is to set the mark and then use
+it soon, before you forget where it is.  Alternatively, you can see
+where the mark is with the command @kbd{C-x C-x}
+(@code{exchange-point-and-mark}) which puts the mark where point was
+and point where the mark was.  The extent of the region is unchanged,
+but the cursor and point are now at the previous position of the mark.
+In Transient Mark mode, this command also reactivates the mark.
+
+  @kbd{C-x C-x} is also useful when you are satisfied with the position
+of point but want to move the other end of the region (where the mark
+is); do @kbd{C-x C-x} to put point at that end of the region, and then
+move it.  Using @kbd{C-x C-x} a second time, if necessary, puts the mark at
+the new position with point back at its original position.
+
+  For more facilities that allow you to go to previously set marks, see
+@ref{Mark Ring}.
+
+@kindex C-@@
+  There is no such character as @kbd{C-@key{SPC}} in @acronym{ASCII};
+when you type @key{SPC} while holding down @key{CTRL} on a text
+terminal, what you get is the character @kbd{C-@@}.  This key is also
+bound to @code{set-mark-command}--so unless you are unlucky enough to
+have a text terminal where typing @kbd{C-@key{SPC}} does not produce
+@kbd{C-@@}, you might as well think of this character as
+@kbd{C-@key{SPC}}.
+
+@node Transient Mark
+@section Transient Mark Mode
+@cindex mode, Transient Mark
+@cindex Transient Mark mode
+@cindex highlighting region
+@cindex region highlighting
+
+  On a terminal that supports colors, Emacs has the ability to
+highlight the current region.  But normally it does not.  Why not?
+
+  In the normal mode of use, every command that sets the mark also
+activates it, and nothing ever deactivates it.  Thus, once you have
+set the mark in a buffer, there is @emph{always} a region in that
+buffer.  Highlighting the region all the time would be a nuisance.  So
+normally Emacs highlights the region only immediately after you have
+selected one with the mouse.
+
+  If you want region highlighting, you can use Transient Mark mode.
+This is a more rigid mode of operation in which the region ``lasts''
+only until you use it; operating on the region text deactivates the
+mark, so there is no region any more.  Therefore, you must explicitly
+set up a region for each command that uses one.
+
+  When Transient Mark mode is enabled, Emacs highlights the region,
+whenever there is a region.  In Transient Mark mode, most of the time
+there is no region; therefore, highlighting the region when it exists
+is useful and not annoying.
+
+@findex transient-mark-mode
+  To enable Transient Mark mode, type @kbd{M-x transient-mark-mode}.
+This command toggles the mode; you can use the same command to turn
+the mode off again.
+
+  Here are the details of Transient Mark mode:
+
+@itemize @bullet
+@item
+To set the mark, type @kbd{C-@key{SPC}} (@code{set-mark-command}).
+This makes the mark active and thus begins highlighting of the region.
+As you move point, you will see the highlighted region grow and
+shrink.
+
+@item
+The mouse commands for specifying the mark also make it active.  So do
+keyboard commands whose purpose is to specify a region, including
+@kbd{M-@@}, @kbd{C-M-@@}, @kbd{M-h}, @kbd{C-M-h}, @kbd{C-x C-p}, and
+@kbd{C-x h}.
+
+@item
+You can tell that the mark is active because the region is highlighted.
+
+@item
+When the mark is active, you can execute commands that operate on the
+region, such as killing, indenting, or writing to a file.
+
+@item
+Any change to the buffer, such as inserting or deleting a character,
+deactivates the mark.  This means any subsequent command that operates
+on a region will get an error and refuse to operate.  You can make the
+region active again by typing @kbd{C-x C-x}.
+
+@item
+If Delete Selection mode is also enabled, some commands delete the
+region when used while the mark is active.  @xref{Mouse Commands}.
+
+@item
+Quitting with @kbd{C-g} deactivates the mark.
+
+@item
+Commands like @kbd{M->} and @kbd{C-s}, that ``leave the mark behind'' in
+addition to some other primary purpose, do not activate the new mark.
+You can activate the new region by executing @kbd{C-x C-x}
+(@code{exchange-point-and-mark}).
+
+@item
+Commands that normally set the mark before moving long distances (like
+@kbd{M-<} and @kbd{C-s}) do not alter the mark in Transient Mark mode
+when the mark is active.
+
+@item
+Some commands operate on the region if a region is active.  For
+instance, @kbd{C-x u} in Transient Mark mode operates on the region,
+when there is a region.  (Outside Transient Mark mode, you must type
+@kbd{C-u C-x u} if you want it to operate on the region.)
+@xref{Undo}.  Other commands that act this way are identified in their
+own documentation.
+@end itemize
+
+  The highlighting of the region uses the @code{region} face; you can
+customize the appearance of the highlighted region by changing this
+face.  @xref{Face Customization}.
+
+@vindex highlight-nonselected-windows
+  When multiple windows show the same buffer, they can have different
+regions, because they can have different values of point (though they
+all share one common mark position).  Ordinarily, only the selected
+window highlights its region (@pxref{Windows}).  However, if the
+variable @code{highlight-nonselected-windows} is non-@code{nil}, then
+each window highlights its own region (provided that Transient Mark mode
+is enabled and the mark in the window's buffer is active).
+
+@vindex mark-even-if-inactive
+  If the variable @code{mark-even-if-inactive} is non-@code{nil} in
+Transient Mark mode, then commands can use the mark and the region
+even when it is inactive.  Region highlighting appears and disappears
+just as it normally does in Transient Mark mode, but the mark doesn't
+really go away when the highlighting disappears, so you can still use
+region commands.
+
+@cindex Zmacs mode
+  Transient Mark mode is also sometimes known as ``Zmacs mode''
+because the Zmacs editor on the MIT Lisp Machine handled the mark in a
+similar way.
+
+@node Momentary Mark
+@section Using Transient Mark Mode Momentarily
+
+  If you don't like Transient Mark mode in general, you might still
+want to use it once in a while.  To do this, type @kbd{C-@key{SPC}
+C-@key{SPC}} or @kbd{C-u C-x C-x}.  These commands set or activate the
+mark, and enable Transient Mark mode only until the mark is
+deactivated.
+
+@table @kbd
+@item C-@key{SPC} C-@key{SPC}
+@kindex C-@key{SPC} C-@key{SPC}
+Set the mark at point (like plain @kbd{C-@key{SPC}}), and enable
+Transient Mark mode just once until the mark is deactivated.  (This is
+not really a separate command; you are using the @kbd{C-@key{SPC}}
+command twice.)
+
+@item C-u C-x C-x
+@kindex C-u C-x C-x
+Activate the mark without changing it; enable Transient Mark mode just
+once, until the mark is deactivated.  (This is the @kbd{C-x C-x}
+command, @code{exchange-point-and-mark}, with a prefix argument.)
+@end table
+
+  One of the secondary features of Transient Mark mode is that certain
+commands operate only on the region, when there is an active region.
+If you don't use Transient Mark mode, the region once set never
+becomes inactive, so there is no way for these commands to make such a
+distinction.  Enabling Transient Mark mode momentarily gives you a way
+to use these commands on the region.
+
+  Momentary use of Transient Mark mode is also a way to highlight the
+region for the time being.
+
+@node Using Region
+@section Operating on the Region
+
+@cindex operations on a marked region
+  Once you have a region and the mark is active, here are some of the
+ways you can operate on the region:
+
+@itemize @bullet
+@item
+Kill it with @kbd{C-w} (@pxref{Killing}).
+@item
+Save it in a register with @kbd{C-x r s} (@pxref{Registers}).
+@item
+Save it in a buffer or a file (@pxref{Accumulating Text}).
+@item
+Convert case with @kbd{C-x C-l} or @kbd{C-x C-u} (@pxref{Case}).
+@item
+Indent it with @kbd{C-x @key{TAB}} or @kbd{C-M-\} (@pxref{Indentation}).
+@item
+Fill it as text with @kbd{M-x fill-region} (@pxref{Filling}).
+@item
+Print hardcopy with @kbd{M-x print-region} (@pxref{Printing}).
+@item
+Evaluate it as Lisp code with @kbd{M-x eval-region} (@pxref{Lisp Eval}).
+@item
+Undo changes within it using @kbd{C-u C-x u} (@pxref{Undo}).
+@end itemize
+
+  Most commands that operate on the text in the region have the word
+@code{region} in their names.
+
+@node Marking Objects
+@section Commands to Mark Textual Objects
+
+@cindex marking sections of text
+  Here are the commands for placing point and the mark around a textual
+object such as a word, list, paragraph or page.
+
+@table @kbd
+@item M-@@
+Set mark after end of next word (@code{mark-word}).  This command and
+the following one do not move point.
+@item C-M-@@
+Set mark after end of following balanced expression (@code{mark-sexp}).
+@item M-h
+Put region around current paragraph (@code{mark-paragraph}).
+@item C-M-h
+Put region around current defun (@code{mark-defun}).
+@item C-x h
+Put region around the entire buffer (@code{mark-whole-buffer}).
+@item C-x C-p
+Put region around current page (@code{mark-page}).
+@end table
+
+@kbd{M-@@} (@code{mark-word}) puts the mark at the end of the next
+word, while @kbd{C-M-@@} (@code{mark-sexp}) puts it at the end of the
+next balanced expression (@pxref{Expressions}).  These commands handle
+arguments just like @kbd{M-f} and @kbd{C-M-f}.  Repeating these
+commands extends the region.  For example, you can type either
+@kbd{C-u 2 M-@@} or @kbd{M-@@ M-@@} to mark the next two words.  These
+commands also extend the region in Transient Mark mode, regardless of
+the last command.
+
+@kindex C-x h
+@findex mark-whole-buffer
+   Other commands set both point and mark, to delimit an object in the
+buffer.  For example, @kbd{M-h} (@code{mark-paragraph}) moves point to
+the beginning of the paragraph that surrounds or follows point, and
+puts the mark at the end of that paragraph (@pxref{Paragraphs}).  It
+prepares the region so you can indent, case-convert, or kill a whole
+paragraph.  With a prefix argument, if the argument's value is positive,
+@kbd{M-h} marks that many paragraphs starting with the one surrounding
+point.  If the prefix argument is @minus{}@var{n}, @kbd{M-h} also
+marks @var{n} paragraphs, running back form the one surrounding point.
+In that last case, point moves forward to the end of that paragraph,
+and the mark goes at the start of the region.  Repeating the @kbd{M-h}
+command extends the region to subsequent paragraphs.
+
+  @kbd{C-M-h} (@code{mark-defun}) similarly puts point before, and the
+mark after, the current (or following) major top-level definition, or
+defun (@pxref{Moving by Defuns}).  Repeating @kbd{C-M-h} extends
+the region to subsequent defuns.
+
+  @kbd{C-x C-p} (@code{mark-page}) puts point before the current page,
+and mark at the end (@pxref{Pages}).  The mark goes after the
+terminating page delimiter (to include it in the region), while point
+goes after the preceding page delimiter (to exclude it).  A numeric
+argument specifies a later page (if positive) or an earlier page (if
+negative) instead of the current page.
+
+  Finally, @kbd{C-x h} (@code{mark-whole-buffer}) sets up the entire
+buffer as the region, by putting point at the beginning and the mark at
+the end.  (In some programs this is called ``select all.'')
+
+  In Transient Mark mode, all of these commands activate the mark.
+
+@node Mark Ring
+@section The Mark Ring
+
+@kindex C-u C-SPC
+@cindex mark ring
+@kindex C-u C-@@
+  Aside from delimiting the region, the mark is also useful for
+remembering a spot that you may want to go back to.  To make this
+feature more useful, each buffer remembers 16 previous locations of the
+mark, in the @dfn{mark ring}.  Commands that set the mark also push the
+old mark onto this ring.  To return to a marked location, use @kbd{C-u
+C-@key{SPC}} (or @kbd{C-u C-@@}); this is the command
+@code{set-mark-command} given a numeric argument.  It moves point to
+where the mark was, and restores the mark from the ring of former
+marks.
+
+@vindex set-mark-command-repeat-pop
+  If you set @code{set-mark-command-repeat-pop} to non-@code{nil},
+then when you repeat the character @kbd{C-@key{SPC}} after typing
+@kbd{C-u C-@key{SPC}}, each repetition moves point to a previous mark
+position from the ring.  The mark positions you move through in this
+way are not lost; they go to the end of the ring.
+
+  Each buffer has its own mark ring.  All editing commands use the current
+buffer's mark ring.  In particular, @kbd{C-u C-@key{SPC}} always stays in
+the same buffer.
+
+  Many commands that can move long distances, such as @kbd{M-<}
+(@code{beginning-of-buffer}), start by setting the mark and saving the
+old mark on the mark ring.  This is to make it easier for you to move
+back later.  Searches set the mark if they move point.  However, in
+Transient Mark mode, these commands do not set the mark when the mark
+is already active.  You can tell when a command sets the mark because
+it displays @samp{Mark set} in the echo area.
+
+  If you want to move back to the same place over and over, the mark
+ring may not be convenient enough.  If so, you can record the position
+in a register for later retrieval (@pxref{RegPos,, Saving Positions in
+Registers}).
+
+@vindex mark-ring-max
+  The variable @code{mark-ring-max} specifies the maximum number of
+entries to keep in the mark ring.  If that many entries exist and
+another one is pushed, the earliest one in the list is discarded.  Repeating
+@kbd{C-u C-@key{SPC}} cycles through the positions currently in the
+ring.
+
+@vindex mark-ring
+  The variable @code{mark-ring} holds the mark ring itself, as a list of
+marker objects, with the most recent first.  This variable is local in
+every buffer.
+
+@node Global Mark Ring
+@section The Global Mark Ring
+@cindex global mark ring
+
+  In addition to the ordinary mark ring that belongs to each buffer,
+Emacs has a single @dfn{global mark ring}.  It records a sequence of
+buffers in which you have recently set the mark, so you can go back
+to those buffers.
+
+  Setting the mark always makes an entry on the current buffer's mark
+ring.  If you have switched buffers since the previous mark setting, the
+new mark position makes an entry on the global mark ring also.  The
+result is that the global mark ring records a sequence of buffers that
+you have been in, and, for each buffer, a place where you set the mark.
+
+@kindex C-x C-@key{SPC}
+@findex pop-global-mark
+  The command @kbd{C-x C-@key{SPC}} (@code{pop-global-mark}) jumps to
+the buffer and position of the latest entry in the global ring.  It also
+rotates the ring, so that successive uses of @kbd{C-x C-@key{SPC}} take
+you to earlier and earlier buffers.
+
+@ignore
+   arch-tag: f35e4d82-911b-4cfc-a3d7-3c87b2abba20
+@end ignore
diff --git a/doc/emacs/mini.texi b/doc/emacs/mini.texi
new file mode 100644 (file)
index 0000000..b57e794
--- /dev/null
@@ -0,0 +1,580 @@
+@c This is part of the Emacs manual.
+@c Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995, 1997, 2000, 2001,
+@c   2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+@c See file emacs.texi for copying conditions.
+@node Minibuffer, M-x, Basic, Top
+@chapter The Minibuffer
+@cindex minibuffer
+
+  The @dfn{minibuffer} is where Emacs commands read complicated
+arguments (anything more a single number).  We call it the
+``minibuffer'' because it's a special-purpose buffer with a small
+amount of screen space.  Minibuffer arguments can be file names,
+buffer names, Lisp function names, Emacs command names, Lisp
+expressions, and many other things---whatever the command wants to
+read.  You can use the usual Emacs editing commands in the minibuffer
+to edit the argument text.
+
+@cindex prompt
+  When the minibuffer is in use, it appears in the echo area, with a
+cursor.  The minibuffer display starts with a @dfn{prompt} in a
+distinct color; it says what kind of input is expected and how it will
+be used.  Often the prompt is derived from the name of the command
+that is reading the argument.  The prompt normally ends with a colon.
+
+@cindex default argument
+  Sometimes a @dfn{default argument} appears in the prompt, inside
+parentheses before the colon.  The default will be used as the
+argument value if you just type @key{RET}.  For example, commands that
+read buffer names show a buffer name as the default.  You can type
+@key{RET} to operate on that default buffer.
+
+  The simplest way to enter a minibuffer argument is to type the text,
+then @key{RET} to exit the minibuffer.  You can cancel the minibuffer,
+and the command that wants the argument, by typing @kbd{C-g}.
+
+  Since the minibuffer appears in the echo area, it can conflict with
+other uses of the echo area.  Here is how Emacs handles such
+conflicts:
+
+@itemize @bullet
+@item
+An error occurs while the minibuffer is active.
+  
+The error message hides the minibuffer for a few seconds, or until you
+type something.  Then the minibuffer comes back.
+
+@item
+A command such as @kbd{C-x =} needs to display a message in the echo
+area.
+
+The message hides the minibuffer for a few seconds, or until you type
+something.  Then the minibuffer comes back.
+
+@item
+Keystrokes don't echo while the minibuffer is in use.
+@end itemize
+
+@menu
+* File: Minibuffer File.  Entering file names with the minibuffer.
+* Edit: Minibuffer Edit.  How to edit in the minibuffer.
+* Completion::           An abbreviation facility for minibuffer input.
+* Minibuffer History::    Reusing recent minibuffer arguments.
+* Repetition::           Re-executing commands that used the minibuffer.
+@end menu
+
+@node Minibuffer File
+@section Minibuffers for File Names
+
+  When you use the minibuffer to enter a file name, it starts out with
+some initial text---the @dfn{default directory}, ending in a slash.
+The file you specify will be in this directory unless you alter or
+replace it.
+
+@c Separate paragraph to clean up ugly page break--rms
+@need 1500
+  For example, if the minibuffer starts out with these contents:
+
+@example
+Find File: /u2/emacs/src/
+@end example
+
+@noindent
+(where @samp{Find File:@: } is the prompt), and you type
+@kbd{buffer.c} as input, that specifies the file
+@file{/u2/emacs/src/buffer.c}.  You can specify the parent directory
+by adding @file{..}; thus, if you type @kbd{../lisp/simple.el}, you
+will get @file{/u2/emacs/lisp/simple.el}.  Alternatively, you can use
+@kbd{M-@key{DEL}} to kill the directory names you don't want
+(@pxref{Words}).
+
+  You can kill the entire default with @kbd{C-a C-k}, but there's no
+need to do that.  It's easier to ignore the default, and enter an
+absolute file name starting with a slash or a tilde after the default
+directory.  For example, to specify @file{/etc/termcap}, just type
+that name:
+
+@example
+Find File: /u2/emacs/src//etc/termcap
+@end example
+
+@noindent
+@cindex // in file name
+@cindex double slash in file name
+@cindex slashes repeated in file name
+@findex file-name-shadow-mode
+GNU Emacs interprets a double slash (which is not normally useful in
+file names) as, ``ignore everything before the second slash in the
+pair.''  In the example above. @samp{/u2/emacs/src/} is ignored, so
+you get @file{/etc/termcap}.  The ignored part of the file name is
+dimmed if the terminal allows it; to disable this dimming, turn off
+File Name Shadow mode (a minor mode) with the command
+@kbd{M-x file-name-shadow-mode}.
+
+  If the variable @code{insert-default-directory} is @code{nil}, the
+default directory is never inserted in the minibuffer---so the
+minibuffer starts out empty.  Nonetheless, relative file name
+arguments are still interpreted based on the same default directory.
+
+@node Minibuffer Edit
+@section Editing in the Minibuffer
+
+  The minibuffer is an Emacs buffer (albeit a peculiar one), and the
+usual Emacs commands are available for editing the argument text.
+
+  Since @key{RET} in the minibuffer is defined to exit the minibuffer,
+you can't use it to insert a newline in the minibuffer.  To do that,
+type @kbd{C-o} or @kbd{C-q C-j}.  (The newline character is really the
+@acronym{ASCII} character control-J.)
+
+  The minibuffer has its own window, which normally has space in the
+frame at all times, but it only acts like an Emacs window when the
+minibuffer is active.  When active, this window is much like any other
+Emacs window; for instance, you can switch to another window (with
+@kbd{C-x o}), edit text there, then return to the minibuffer window to
+finish the argument.  You can even kill text in another window, return
+to the minibuffer window, and then yank the text into the argument.
+@xref{Windows}.
+
+@cindex height of minibuffer
+@cindex size of minibuffer
+@cindex growing minibuffer
+@cindex resizing minibuffer
+  There are some restrictions on the minibuffer window, however: you
+cannot kill it, or split it, or switch buffers in it---the minibuffer
+and its window are permanently attached.
+
+@vindex resize-mini-windows
+  The minibuffer window expands vertically as necessary to hold the
+text that you put in the minibuffer.  If @code{resize-mini-windows} is
+@code{t} (the default), the window always resizes as needed by its
+contents.  If its value is the symbol @code{grow-only}, the window
+grows automatically as needed, but shrinks (back to the normal size)
+only when the minibuffer becomes inactive.  If its value is
+@code{nil}, you have to adjust the height yourself.
+
+@vindex max-mini-window-height
+  The variable @code{max-mini-window-height} controls the maximum
+height for resizing the minibuffer window: a floating-point number
+specifies a fraction of the frame's height; an integer specifies the
+maximum number of lines; @code{nil} means do not resize the minibuffer
+window automatically.  The default value is 0.25.
+
+  The @kbd{C-M-v} command in the minibuffer scrolls the help text from
+commands that display help text of any sort in another window.
+@kbd{M-@key{PAGEUP}} and @kbd{M-@key{PAGEDOWN}} also operate on that
+help text.  This is especially useful with long lists of possible
+completions.  @xref{Other Window}.
+
+@vindex enable-recursive-minibuffers
+  Emacs normally disallows most commands that use the minibuffer while
+the minibuffer is active.  (Entering the minibuffer from the
+minibuffer can be confusing.)  To allow such commands in the
+minibuffer, set the variable @code{enable-recursive-minibuffers} to
+@code{t}.
+
+@node Completion
+@section Completion
+@cindex completion
+  
+  Some arguments allow @dfn{completion} to enter their value.  This
+means that after you type part of the argument, Emacs can fill in the
+rest, or some of it, based on what you have typed so far.
+
+  When completion is available, certain keys---@key{TAB}, @key{RET},
+and @key{SPC}---are rebound to complete the text in the minibuffer
+before point into a longer string chosen from a set of @dfn{completion
+alternatives} provided by the command that requested the argument.
+(@key{SPC} does not do completion in reading file names, because it is
+common to use spaces in file names on some systems.)  @kbd{?} displays
+a list of the possible completions at any time.
+
+  For example, @kbd{M-x} uses the minibuffer to read the name of a
+command, so it provides a list of all Emacs command names for
+completion candidates.  The completion keys match the minibuffer text
+against these candidates, find any additional name characters implied
+by the text already present in the minibuffer, and add those
+characters.  This makes it possible to type @kbd{M-x ins @key{SPC} b
+@key{RET}} instead of @kbd{M-x insert-buffer @key{RET}}, for example.
+
+  Case is significant in completion when it is significant in the
+argument you are entering (buffer names, file names, command names,
+for instance).  Thus, @samp{fo} does not complete to @samp{Foo}.
+Completion ignores case distinctions for certain arguments in which
+case does not matter.
+
+  Completion acts only on the text before point.  If there is text in
+the minibuffer after point---i.e., if you move point backward after
+typing some text into the minibuffer---it remains unchanged.
+
+@menu
+* Example: Completion Example.    Examples of using completion.
+* Commands: Completion Commands.  A list of completion commands.
+* Strict Completion::             Different types of completion.
+* Options: Completion Options.    Options for completion.
+@end menu
+
+@node Completion Example
+@subsection Completion Example
+
+@kindex TAB @r{(completion)}
+  A concrete example may help here.  If you type @kbd{M-x au
+@key{TAB}}, the @key{TAB} looks for alternatives (in this case,
+command names) that start with @samp{au}.  There are several,
+including @code{auto-fill-mode} and @code{auto-save-mode}, but they
+all begin with @code{auto-}, so the @samp{au} in the minibuffer
+completes to @samp{auto-}.
+
+  If you type @key{TAB} again immediately, it cannot determine the
+next character; it could be any of @samp{cfilrs}.  So it does not add
+any characters; instead, @key{TAB} displays a list of all possible
+completions in another window.
+
+  Now type @kbd{f @key{TAB}}.  This @key{TAB} sees @samp{auto-f}.  The
+only command name starting with that is @code{auto-fill-mode}, so
+completion fills in the rest of that.  You have been able to enter
+@samp{auto-fill-mode} by typing just @kbd{au @key{TAB} f @key{TAB}}.
+
+@node Completion Commands
+@subsection Completion Commands
+
+  Here is a list of the completion commands defined in the minibuffer
+when completion is allowed.
+
+@table @kbd
+@item @key{TAB}
+@findex minibuffer-complete
+Complete the text before point in the minibuffer as much as possible
+(@code{minibuffer-complete}).
+@item @key{SPC}
+Complete up to one word from the minibuffer text before point
+(@code{minibuffer-complete-word}).  @key{SPC} for completion is not
+available when entering a file name, since file names often include
+spaces.
+@item @key{RET}
+Submit the text in the minibuffer as the argument, possibly completing
+first as described
+@iftex
+in the next subsection (@code{minibuffer-complete-and-exit}).
+@end iftex
+@ifnottex
+in the next node (@code{minibuffer-complete-and-exit}).  @xref{Strict
+Completion}.
+@end ifnottex
+@item ?
+Display a list of possible completions of the text before point
+(@code{minibuffer-completion-help}).
+@end table
+
+@kindex SPC
+@findex minibuffer-complete-word
+  @key{SPC} completes like @key{TAB}, but only up to the next hyphen
+or space.  If you have @samp{auto-f} in the minibuffer and type
+@key{SPC}, it finds that the completion is @samp{auto-fill-mode}, but
+it only inserts @samp{ill-}, giving @samp{auto-fill-}.  Another
+@key{SPC} at this point completes all the way to
+@samp{auto-fill-mode}.  The command that implements this behavior is
+called @code{minibuffer-complete-word}.
+
+  When you display a list of possible completions, you can choose
+one from it:
+
+@table @kbd
+@findex mouse-choose-completion
+@item Mouse-1
+@itemx Mouse-2
+Clicking mouse button 1 or 2 on a completion possibility chooses that
+completion (@code{mouse-choose-completion}).  You must click in the
+list of completions, not in the minibuffer.
+
+@findex switch-to-completions
+@item @key{PRIOR}
+@itemx M-v
+Typing @key{PRIOR} or @key{PAGE-UP}, or @kbd{M-v}, while in the
+minibuffer, selects the window showing the completion list buffer
+(@code{switch-to-completions}).  This paves the way for using the
+commands below.  (Selecting that window in other ways has the same
+effect.)
+
+@findex choose-completion
+@item @key{RET}
+Typing @key{RET} @emph{in the completion list buffer} chooses the
+completion that point is in or next to (@code{choose-completion}).  To
+use this command, you must first switch to the completion list window.
+
+@findex next-completion
+@item @key{RIGHT}
+Typing the right-arrow key @key{RIGHT} @emph{in the completion list
+buffer} moves point to the following completion possibility
+(@code{next-completion}).
+
+@findex previous-completion
+@item @key{LEFT}
+Typing the left-arrow key @key{LEFT} @emph{in the completion list
+buffer} moves point to the previous completion possibility
+(@code{previous-completion}).
+@end table
+
+@node Strict Completion
+@subsection Strict Completion
+
+  There are three different ways that @key{RET} can do completion,
+depending on how the argument will be used.
+
+@itemize @bullet
+@item
+@dfn{Strict} completion accepts only known completion candidates.  For
+example, when @kbd{C-x k} reads the name of a buffer to kill, only the
+name of an existing buffer makes sense.  In strict completion,
+@key{RET} refuses to exit if the text in the minibuffer does not
+complete to an exact match.
+
+@item
+@dfn{Cautious} completion is similar to strict completion, except that
+@key{RET} exits only if the text is an already exact match.
+Otherwise, @key{RET} does not exit, but it does complete the text.  If
+that completes to an exact match, a second @key{RET} will exit.
+
+Cautious completion is used for reading file names for files that must
+already exist, for example.
+
+@item
+@dfn{Permissive} completion allows any input; the completion
+candidates are just suggestions.  For example, when @kbd{C-x C-f}
+reads the name of a file to visit, any file name is allowed, including
+nonexistent file (in case you want to create a file).  In permissive
+completion, @key{RET} does not complete, it just submits the argument
+as you have entered it.
+@end itemize
+
+  The completion commands display a list of all possible completions
+whenever they can't determine even one more character by completion.
+Also, typing @kbd{?} explicitly requests such a list.  You can scroll
+the list with @kbd{C-M-v} (@pxref{Other Window}).
+
+@node Completion Options
+@subsection Completion Options
+
+@vindex completion-ignored-extensions
+@cindex ignored file names, in completion
+  When completing file names, certain file names are usually ignored.
+The variable @code{completion-ignored-extensions} contains a list of
+strings; a file name ending in any of those strings is ignored as a
+completion candidate.  The standard value of this variable has several
+elements including @code{".o"}, @code{".elc"}, @code{".dvi"} and
+@code{"~"}.  The effect is that, for example, @samp{foo} can complete
+to @samp{foo.c} even though @samp{foo.o} exists as well.  However, if
+@emph{all} the possible completions end in ``ignored'' strings, then
+they are not ignored.  Displaying a list of possible completions
+disregards @code{completion-ignored-extensions}; it shows them all.
+
+  If an element of @code{completion-ignored-extensions} ends in a
+slash (@file{/}), it's a subdirectory name; then that directory and
+its contents are ignored.  Elements of
+@code{completion-ignored-extensions} which do not end in a slash are
+ordinary file names, and do not apply to names of directories.
+
+@vindex completion-auto-help
+  If @code{completion-auto-help} is set to @code{nil}, the completion
+commands never display a list of possibilities; you must type @kbd{?}
+to display the list.
+
+@cindex Partial Completion mode
+@vindex partial-completion-mode
+@findex partial-completion-mode
+  Partial Completion mode implements a more powerful kind of
+completion that can complete multiple words in parallel.  For example,
+it can complete the command name abbreviation @code{p-b} into
+@code{print-buffer} if no other command starts with two words whose
+initials are @samp{p} and @samp{b}.
+
+  To enable this mode, use @kbd{M-x partial-completion-mode}, or
+customize the variable @code{partial-completion-mode}.  This mode
+binds special partial completion commands to @key{TAB}, @key{SPC},
+@key{RET}, and @kbd{?} in the minibuffer.  The usual completion
+commands are available on @kbd{M-@key{TAB}} (or @kbd{C-M-i}),
+@kbd{M-@key{SPC}}, @kbd{M-@key{RET}} and @kbd{M-?}.
+
+  Partial completion of directories in file names uses @samp{*} to
+indicate the places for completion; thus, @file{/u*/b*/f*} might
+complete to @file{/usr/bin/foo}.  For remote files, partial completion
+enables completion of methods, user names and host names.
+@xref{Remote Files}.
+
+@vindex PC-include-file-path
+@vindex PC-disable-includes
+  Partial Completion mode also extends @code{find-file} so that
+@samp{<@var{include}>} looks for the file named @var{include} in the
+directories in the path @code{PC-include-file-path}.  If you set
+@code{PC-disable-includes} to non-@code{nil}, this feature is
+disabled.
+
+@cindex Icomplete mode
+@findex icomplete-mode
+  Icomplete mode presents a constantly-updated display that tells you
+what completions are available for the text you've entered so far.  The
+command to enable or disable this minor mode is @kbd{M-x
+icomplete-mode}.
+
+@node Minibuffer History
+@section Minibuffer History
+@cindex minibuffer history
+@cindex history of minibuffer input
+
+  Every argument that you enter with the minibuffer is saved on a
+@dfn{minibuffer history list} so you can easily use it again later.
+Special commands fetch the text of an earlier argument into the
+minibuffer, replacing the old minibuffer contents.  You can think of
+them as moving through the history of previous arguments.
+
+@table @kbd
+@item @key{UP}
+@itemx M-p
+Move to the previous item in the minibuffer history, an earlier argument
+(@code{previous-history-element}).
+@item @key{DOWN}
+@itemx M-n
+Move to the next item in the minibuffer history
+(@code{next-history-element}).
+@item M-r @var{regexp} @key{RET}
+Move to an earlier item in the minibuffer history that 
+matches @var{regexp} (@code{previous-matching-history-element}).
+@item M-s @var{regexp} @key{RET}
+Move to a later item in the minibuffer history that matches
+@var{regexp} (@code{next-matching-history-element}).
+@end table
+
+@kindex M-p @r{(minibuffer history)}
+@kindex M-n @r{(minibuffer history)}
+@findex next-history-element
+@findex previous-history-element
+  To move through the minibuffer history list one item at a time, use
+@kbd{M-p} or up-arrow (@code{previous-history-element}) to fetch the
+next earlier minibuffer input, and use @kbd{M-n} or down-arrow
+(@code{next-history-element}) to fetch the next later input.  These
+commands don't move the cursor, they pull different saved strings into
+the minibuffer.  But you can think of them as ``moving'' through the
+history list.
+
+  The input that you fetch from the history entirely replaces the
+contents of the minibuffer.  To use it again unchanged, just type
+@key{RET}.  You can also edit the text before you reuse it; this does
+not change the history element that you ``moved'' to, but your new
+argument does go at the end of the history list in its own right.
+
+  For many minibuffer arguments there is a ``default'' value.  You can
+insert the default value into the minibuffer as text by using
+@kbd{M-n}.  You can think of this as moving ``into the future'' in the
+history.
+
+@findex previous-matching-history-element
+@findex next-matching-history-element
+@kindex M-r @r{(minibuffer history)}
+@kindex M-s @r{(minibuffer history)}
+  There are also commands to search forward or backward through the
+history; they search for history elements that match a regular
+expression.  @kbd{M-r} (@code{previous-matching-history-element})
+searches older elements in the history, while @kbd{M-s}
+(@code{next-matching-history-element}) searches newer elements.  These
+commands are unusual; they use the minibuffer to read the regular
+expression even though they are invoked from the minibuffer.  As with
+incremental searching, an upper-case letter in the regular expression
+makes the search case-sensitive (@pxref{Search Case}).
+
+@ignore
+  We may change the precise way these commands read their arguments.
+Perhaps they will search for a match for the string given so far in the
+minibuffer; perhaps they will search for a literal match rather than a
+regular expression match; perhaps they will only accept matches at the
+beginning of a history element; perhaps they will read the string to
+search for incrementally like @kbd{C-s}.  To find out what interface is
+actually available, type @kbd{C-h f previous-matching-history-element}.
+@end ignore
+
+  All uses of the minibuffer record your input on a history list, but
+there are separate history lists for different kinds of arguments.
+For example, there is a list for file names, used by all the commands
+that read file names.  (As a special feature, this history list
+records the absolute file name, even if the name you entered was not
+absolute.)
+
+  There are several other specific history lists, including one for
+buffer names, one for arguments of commands like @code{query-replace},
+one used by @kbd{M-x} for command names, and one used by
+@code{compile} for compilation commands.  Finally, there is one
+``miscellaneous'' history list that most minibuffer arguments use.
+
+@vindex history-length
+  The variable @code{history-length} specifies the maximum length of a
+minibuffer history list; adding a new element deletes the oldest
+element if the list gets too long.  If the value of
+@code{history-length} is @code{t}, though, there is no maximum length.
+
+@vindex history-delete-duplicates
+  The variable @code{history-delete-duplicates} specifies whether to
+delete duplicates in history.  If it is @code{t}, adding a new element
+deletes from the list all other elements that are equal to it.
+
+@node Repetition
+@section Repeating Minibuffer Commands
+@cindex command history
+@cindex history of commands
+
+  Every command that uses the minibuffer once is recorded on a special
+history list, the @dfn{command history}, together with the values of
+its arguments, so that you can repeat the entire command.  In
+particular, every use of @kbd{M-x} is recorded there, since @kbd{M-x}
+uses the minibuffer to read the command name.
+
+@findex list-command-history
+@table @kbd
+@item C-x @key{ESC} @key{ESC}
+Re-execute a recent minibuffer command from the command history
+ (@code{repeat-complex-command}).
+@item M-x list-command-history
+Display the entire command history, showing all the commands
+@kbd{C-x @key{ESC} @key{ESC}} can repeat, most recent first.
+@end table
+
+@kindex C-x ESC ESC
+@findex repeat-complex-command
+  @kbd{C-x @key{ESC} @key{ESC}} is used to re-execute a recent command
+that used the minibuffer.  With no argument, it repeats the last such
+command.  A numeric argument specifies which command to repeat; 1
+means the last one, 2 the previous, and so on.
+
+  @kbd{C-x @key{ESC} @key{ESC}} works by turning the previous command
+into a Lisp expression and then entering a minibuffer initialized with
+the text for that expression.  Even if you don't understand Lisp
+syntax, it will probably be obvious which command is displayed for
+repetition.  If you type just @key{RET}, that repeats the command
+unchanged.  You can also change the command by editing the Lisp
+expression before you execute it.  The repeated command is added to
+the front of the command history unless it is identical to the most
+recently item.
+
+  Once inside the minibuffer for @kbd{C-x @key{ESC} @key{ESC}}, you can
+use the minibuffer history commands (@kbd{M-p}, @kbd{M-n}, @kbd{M-r},
+@kbd{M-s}; @pxref{Minibuffer History}) to move through the history list
+of saved entire commands.  After finding the desired previous command,
+you can edit its expression as usual and then repeat it by typing
+@key{RET}.
+
+@vindex isearch-resume-in-command-history
+  Incremental search does not, strictly speaking, use the minibuffer.
+Therefore, although it behaves like a complex command, it normally
+does not appear in the history list for @kbd{C-x @key{ESC} @key{ESC}}.
+You can make incremental search commands appear in the history by
+setting @code{isearch-resume-in-command-history} to a non-@code{nil}
+value.  @xref{Incremental Search}.
+
+@vindex command-history
+  The list of previous minibuffer-using commands is stored as a Lisp
+list in the variable @code{command-history}.  Each element is a Lisp
+expression which describes one command and its arguments.  Lisp programs
+can re-execute a command by calling @code{eval} with the
+@code{command-history} element.
+
+@ignore
+   arch-tag: ba913cfd-b70e-400f-b663-22b2c309227f
+@end ignore
similarity index 100%
rename from man/misc.texi
rename to doc/emacs/misc.texi
diff --git a/doc/emacs/msdog-xtra.texi b/doc/emacs/msdog-xtra.texi
new file mode 100644 (file)
index 0000000..432f288
--- /dev/null
@@ -0,0 +1,687 @@
+@c This is part of the Emacs manual.
+@c Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+@c See file emacs.texi for copying conditions.
+@c
+@c This file is included either in emacs-xtra.texi (when producing the
+@c printed version) or in the main Emacs manual (for the on-line version).
+@node MS-DOS
+@section Emacs and MS-DOS
+@cindex MS-DOG
+@cindex MS-DOS peculiarities
+
+  This section briefly describes the peculiarities of using Emacs on
+the MS-DOS ``operating system'' (also known as ``MS-DOG'').
+@iftex
+Information about Emacs and Microsoft's current operating system
+Windows (also known as ``Losedows) is in the main Emacs manual
+(@pxref{Microsoft Systems,,, emacs, the Emacs Manual}).
+@end iftex
+@ifnottex
+Information about peculiarities common to MS-DOS and Microsoft's
+current operating systems Windows (also known as ``Losedows) is in
+@ref{Microsoft Windows}.
+@end ifnottex
+
+  If you build Emacs for MS-DOS, the binary will also run on Windows
+3.X, Windows NT, Windows 9X/ME, Windows 2000/XP, or OS/2 as a DOS
+application; all of this chapter applies for all of those systems, if
+you use an Emacs that was built for MS-DOS.
+
+@iftex
+  @xref{Text and Binary,,,emacs, the Emacs Manual}, for information
+@end iftex
+@ifnottex
+  @xref{Text and Binary}, for information
+@end ifnottex
+about Emacs' special handling of text files under MS-DOS (and Windows).
+
+@menu
+* Keyboard: MS-DOS Keyboard.   Keyboard conventions on MS-DOS.
+* Mouse: MS-DOS Mouse.         Mouse conventions on MS-DOS.
+* Display: MS-DOS Display.     Fonts, frames and display size on MS-DOS.
+* Files: MS-DOS File Names.    File name conventions on MS-DOS.
+* Printing: MS-DOS Printing.   Printing specifics on MS-DOS.
+* I18N: MS-DOS and MULE.       Support for internationalization on MS-DOS.
+* Processes: MS-DOS Processes. Running subprocesses on MS-DOS.
+@end menu
+
+@node MS-DOS Keyboard
+@subsection Keyboard Usage on MS-DOS
+
+@kindex DEL @r{(MS-DOS)}
+@kindex BS @r{(MS-DOS)}
+  The key that is called @key{DEL} in Emacs (because that's how it is
+designated on most workstations) is known as @key{BS} (backspace) on a
+PC.  That is why the PC-specific terminal initialization remaps the
+@key{BS} key to act as @key{DEL}; the @key{DELETE} key is remapped to act
+as @kbd{C-d} for the same reasons.
+
+@kindex C-g @r{(MS-DOS)}
+@kindex C-BREAK @r{(MS-DOS)}
+@cindex quitting on MS-DOS
+  Emacs built for MS-DOS recognizes @kbd{C-@key{BREAK}} as a quit
+character, just like @kbd{C-g}.  This is because Emacs cannot detect
+that you have typed @kbd{C-g} until it is ready for more input.  As a
+consequence, you cannot use @kbd{C-g} to stop a running command
+@iftex
+(@pxref{Quitting,,,emacs, the Emacs Manual}).
+@end iftex
+@ifnottex
+(@pxref{Quitting}).
+@end ifnottex
+By contrast, @kbd{C-@key{BREAK}} @emph{is} detected as soon as you
+type it (as @kbd{C-g} is on other systems), so it can be used to stop
+a running command and for emergency escape
+@iftex
+(@pxref{Emergency Escape,,,emacs, the Emacs Manual}).
+@end iftex
+@ifnottex
+(@pxref{Emergency Escape}).
+@end ifnottex
+
+@cindex Meta (under MS-DOS)
+@cindex Hyper (under MS-DOS)
+@cindex Super (under MS-DOS)
+@vindex dos-super-key
+@vindex dos-hyper-key
+  The PC keyboard maps use the left @key{ALT} key as the @key{META} key.
+You have two choices for emulating the @key{SUPER} and @key{HYPER} keys:
+choose either the right @key{CTRL} key or the right @key{ALT} key by
+setting the variables @code{dos-hyper-key} and @code{dos-super-key} to 1
+or 2 respectively.  If neither @code{dos-super-key} nor
+@code{dos-hyper-key} is 1, then by default the right @key{ALT} key is
+also mapped to the @key{META} key.  However, if the MS-DOS international
+keyboard support program @file{KEYB.COM} is installed, Emacs will
+@emph{not} map the right @key{ALT} to @key{META}, since it is used for
+accessing characters like @kbd{~} and @kbd{@@} on non-US keyboard
+layouts; in this case, you may only use the left @key{ALT} as @key{META}
+key.
+
+@kindex C-j @r{(MS-DOS)}
+@vindex dos-keypad-mode
+  The variable @code{dos-keypad-mode} is a flag variable that controls
+what key codes are returned by keys in the numeric keypad.  You can also
+define the keypad @key{ENTER} key to act like @kbd{C-j}, by putting the
+following line into your @file{_emacs} file:
+
+@smallexample
+;; @r{Make the @key{ENTER} key from the numeric keypad act as @kbd{C-j}.}
+(define-key function-key-map [kp-enter] [?\C-j])
+@end smallexample
+
+@node MS-DOS Mouse
+@subsection Mouse Usage on MS-DOS
+
+@cindex mouse support under MS-DOS
+  Emacs on MS-DOS supports a mouse (on the default terminal only).
+The mouse commands work as documented, including those that use menus
+and the menu bar
+@iftex
+(@pxref{Menu Bar,,,emacs, the Emacs Manual}).
+@end iftex
+@ifnottex
+(@pxref{Menu Bar}).
+@end ifnottex
+ Scroll bars don't work in MS-DOS Emacs.  PC mice usually have only
+two buttons; these act as @kbd{Mouse-1} and @kbd{Mouse-2}, but if you
+press both of them together, that has the effect of @kbd{Mouse-3}.  If
+the mouse does have 3 buttons, Emacs detects that at startup, and all
+the 3 buttons function normally, as on X.
+
+  Help strings for menu-bar and pop-up menus are displayed in the echo
+area when the mouse pointer moves across the menu items.  Highlighting
+of mouse-sensitive text
+@iftex
+(@pxref{Mouse References,,,emacs, the Emacs Manual})
+@end iftex
+@ifnottex
+(@pxref{Mouse References})
+@end ifnottex
+is also supported.
+
+@cindex mouse, set number of buttons
+@findex msdos-set-mouse-buttons
+  Some versions of mouse drivers don't report the number of mouse
+buttons correctly.  For example, mice with a wheel report that they
+have 3 buttons, but only 2 of them are passed to Emacs; the clicks on
+the wheel, which serves as the middle button, are not passed.  In
+these cases, you can use the @kbd{M-x msdos-set-mouse-buttons} command
+to tell Emacs how many mouse buttons to expect.  You could make such a
+setting permanent by adding this fragment to your @file{_emacs} init
+file:
+
+@example
+;; @r{Treat the mouse like a 2-button mouse.}
+(msdos-set-mouse-buttons 2)
+@end example
+
+@cindex Windows clipboard support
+  Emacs built for MS-DOS supports clipboard operations when it runs on
+Windows.  Commands that put text on the kill ring, or yank text from
+the ring, check the Windows clipboard first, just as Emacs does on the
+X Window System
+@iftex
+(@pxref{Mouse Commands,,,emacs, the Emacs Manual}).
+@end iftex
+@ifnottex
+(@pxref{Mouse Commands}).
+@end ifnottex
+Only the primary selection and the cut buffer are supported by MS-DOS
+Emacs on Windows; the secondary selection always appears as empty.
+
+  Due to the way clipboard access is implemented by Windows, the
+length of text you can put into the clipboard is limited by the amount
+of free DOS memory that is available to Emacs.  Usually, up to 620KB of
+text can be put into the clipboard, but this limit depends on the system
+configuration and is lower if you run Emacs as a subprocess of
+another program.  If the killed text does not fit, Emacs outputs a
+message saying so, and does not put the text into the clipboard.
+
+  Null characters also cannot be put into the Windows clipboard.  If the
+killed text includes null characters, Emacs does not put such text into
+the clipboard, and displays in the echo area a message to that effect.
+
+@vindex dos-display-scancodes
+  The variable @code{dos-display-scancodes}, when non-@code{nil},
+directs Emacs to display the @acronym{ASCII} value and the keyboard scan code of
+each keystroke; this feature serves as a complement to the
+@code{view-lossage} command, for debugging.
+
+@node MS-DOS Display
+@subsection Display on MS-DOS
+@cindex faces under MS-DOS
+@cindex fonts, emulating under MS-DOS
+
+  Display on MS-DOS cannot use font variants, like bold or italic, but
+it does support multiple faces, each of which can specify a foreground
+and a background color.  Therefore, you can get the full functionality
+of Emacs packages that use fonts (such as @code{font-lock}, Enriched
+Text mode, and others) by defining the relevant faces to use different
+colors.  Use the @code{list-colors-display} command
+@iftex
+(@pxref{Frame Parameters,,,emacs, the Emacs Manual})
+@end iftex
+@ifnottex
+(@pxref{Frame Parameters})
+@end ifnottex
+and the @code{list-faces-display} command
+@iftex
+(@pxref{Faces,,,emacs, the Emacs Manual})
+@end iftex
+@ifnottex
+(@pxref{Faces})
+@end ifnottex
+to see what colors and faces are available and what they look like.
+
+  @xref{MS-DOS and MULE}, later in this chapter, for information on
+how Emacs displays glyphs and characters that aren't supported by the
+native font built into the DOS display.
+
+@cindex cursor shape on MS-DOS
+  When Emacs starts, it changes the cursor shape to a solid box.  This
+is for compatibility with other systems, where the box cursor is the
+default in Emacs.  This default shape can be changed to a bar by
+specifying the @code{cursor-type} parameter in the variable
+@code{default-frame-alist}
+@iftex
+(@pxref{Creating Frames,,,emacs, the Emacs Manual}).
+@end iftex
+@ifnottex
+(@pxref{Creating Frames}).
+@end ifnottex
+The MS-DOS terminal doesn't support a vertical-bar cursor,
+so the bar cursor is horizontal, and the @code{@var{width}} parameter,
+if specified by the frame parameters, actually determines its height.
+For this reason, the @code{bar} and @code{hbar} cursor types produce
+the same effect on MS-DOS.  As an extension, the bar cursor
+specification can include the starting scan line of the cursor as well
+as its width, like this:
+
+@example
+ '(cursor-type bar @var{width} . @var{start})
+@end example
+
+@noindent
+In addition, if the @var{width} parameter is negative, the cursor bar
+begins at the top of the character cell.
+
+@cindex frames on MS-DOS
+  The MS-DOS terminal can only display a single frame at a time.  The
+Emacs frame facilities work on MS-DOS much as they do on text-only
+terminals
+@iftex
+(@pxref{Frames,,,emacs, the Emacs Manual}).
+@end iftex
+@ifnottex
+(@pxref{Frames}).
+@end ifnottex
+When you run Emacs from a DOS window on MS-Windows, you can make the
+visible frame smaller than the full screen, but Emacs still cannot
+display more than a single frame at a time.
+
+@cindex frame size under MS-DOS
+@findex mode4350
+@findex mode25
+  The @code{mode4350} command switches the display to 43 or 50
+lines, depending on your hardware; the @code{mode25} command switches
+to the default 80x25 screen size.
+
+  By default, Emacs only knows how to set screen sizes of 80 columns by
+25, 28, 35, 40, 43 or 50 rows.  However, if your video adapter has
+special video modes that will switch the display to other sizes, you can
+have Emacs support those too.  When you ask Emacs to switch the frame to
+@var{n} rows by @var{m} columns dimensions, it checks if there is a
+variable called @code{screen-dimensions-@var{n}x@var{m}}, and if so,
+uses its value (which must be an integer) as the video mode to switch
+to.  (Emacs switches to that video mode by calling the BIOS @code{Set
+Video Mode} function with the value of
+@code{screen-dimensions-@var{n}x@var{m}} in the @code{AL} register.)
+For example, suppose your adapter will switch to 66x80 dimensions when
+put into video mode 85.  Then you can make Emacs support this screen
+size by putting the following into your @file{_emacs} file:
+
+@example
+(setq screen-dimensions-66x80 85)
+@end example
+
+  Since Emacs on MS-DOS can only set the frame size to specific
+supported dimensions, it cannot honor every possible frame resizing
+request.  When an unsupported size is requested, Emacs chooses the next
+larger supported size beyond the specified size.  For example, if you
+ask for 36x80 frame, you will get 40x80 instead.
+
+  The variables @code{screen-dimensions-@var{n}x@var{m}} are used only
+when they exactly match the specified size; the search for the next
+larger supported size ignores them.  In the above example, even if your
+VGA supports 38x80 dimensions and you define a variable
+@code{screen-dimensions-38x80} with a suitable value, you will still get
+40x80 screen when you ask for a 36x80 frame.  If you want to get the
+38x80 size in this case, you can do it by setting the variable named
+@code{screen-dimensions-36x80} with the same video mode value as
+@code{screen-dimensions-38x80}.
+
+  Changing frame dimensions on MS-DOS has the effect of changing all the
+other frames to the new dimensions.
+
+@node MS-DOS File Names
+@subsection File Names on MS-DOS
+@cindex file names under MS-DOS
+@cindex init file, default name under MS-DOS
+
+  On MS-DOS, file names are case-insensitive and limited to eight
+characters, plus optionally a period and three more characters.  Emacs
+knows enough about these limitations to handle file names that were
+meant for other operating systems.  For instance, leading dots
+@samp{.}  in file names are invalid in MS-DOS, so Emacs transparently
+converts them to underscores @samp{_}; thus your default init file
+@iftex
+(@pxref{Init File,,,emacs, the Emacs Manual})
+@end iftex
+@ifnottex
+(@pxref{Init File})
+@end ifnottex
+is called @file{_emacs} on MS-DOS.  Excess characters before or after
+the period are generally ignored by MS-DOS itself; thus, if you visit
+the file @file{LongFileName.EvenLongerExtension}, you will silently
+get @file{longfile.eve}, but Emacs will still display the long file
+name on the mode line.  Other than that, it's up to you to specify
+file names which are valid under MS-DOS; the transparent conversion as
+described above only works on file names built into Emacs.
+
+@cindex backup file names on MS-DOS
+  The above restrictions on the file names on MS-DOS make it almost
+impossible to construct the name of a backup file
+@iftex
+(@pxref{Backup Names,,,emacs, the Emacs Manual})
+@end iftex
+@ifnottex
+(@pxref{Backup Names})
+@end ifnottex
+without losing some of the original file name characters.  For
+example, the name of a backup file for @file{docs.txt} is
+@file{docs.tx~} even if single backup is used.
+
+@cindex file names under Windows 95/NT
+@cindex long file names in DOS box under Windows 95/NT
+  If you run Emacs as a DOS application under Windows 9X, Windows ME, or
+Windows 2000/XP, you can turn on support for long file names.  If you do
+that, Emacs doesn't truncate file names or convert them to lower case;
+instead, it uses the file names that you specify, verbatim.  To enable
+long file name support, set the environment variable @env{LFN} to
+@samp{y} before starting Emacs.  Unfortunately, Windows NT doesn't allow
+DOS programs to access long file names, so Emacs built for MS-DOS will
+only see their short 8+3 aliases.
+
+@cindex @env{HOME} directory under MS-DOS
+  MS-DOS has no notion of home directory, so Emacs on MS-DOS pretends
+that the directory where it is installed is the value of the @env{HOME}
+environment variable.  That is, if your Emacs binary,
+@file{emacs.exe}, is in the directory @file{c:/utils/emacs/bin}, then
+Emacs acts as if @env{HOME} were set to @samp{c:/utils/emacs}.  In
+particular, that is where Emacs looks for the init file @file{_emacs}.
+With this in mind, you can use @samp{~} in file names as an alias for
+the home directory, as you would on GNU or Unix.  You can also set
+@env{HOME} variable in the environment before starting Emacs; its
+value will then override the above default behavior.
+
+  Emacs on MS-DOS handles the directory name @file{/dev} specially,
+because of a feature in the emulator libraries of DJGPP that pretends
+I/O devices have names in that directory.  We recommend that you avoid
+using an actual directory named @file{/dev} on any disk.
+
+@node MS-DOS Printing
+@subsection Printing and MS-DOS
+
+  Printing commands, such as @code{lpr-buffer}
+@iftex
+(@pxref{Printing,,,emacs, the Emacs Manual}) and @code{ps-print-buffer}
+(@pxref{PostScript,,,emacs, the Emacs Manual})
+@end iftex
+@ifnottex
+(@pxref{Printing}) and @code{ps-print-buffer} (@pxref{PostScript})
+@end ifnottex
+can work on MS-DOS by sending the output to one of the printer ports,
+if a Posix-style @code{lpr} program is unavailable.  The same Emacs
+variables control printing on all systems, but in some cases they have
+different default values on MS-DOS.
+
+@iftex
+@xref{Windows Printing,,,emacs, the Emacs Manual},
+@end iftex
+@ifnottex
+@xref{Windows Printing},
+@end ifnottex
+for details about setting up printing to a networked printer.
+
+  Some printers expect DOS codepage encoding of non-@acronym{ASCII} text, even
+though they are connected to a Windows machine which uses a different
+encoding for the same locale.  For example, in the Latin-1 locale, DOS
+uses codepage 850 whereas Windows uses codepage 1252.  @xref{MS-DOS and
+MULE}.  When you print to such printers from Windows, you can use the
+@kbd{C-x RET c} (@code{universal-coding-system-argument}) command before
+@kbd{M-x lpr-buffer}; Emacs will then convert the text to the DOS
+codepage that you specify.  For example, @kbd{C-x RET c cp850-dos RET
+M-x lpr-region RET} will print the region while converting it to the
+codepage 850 encoding.  You may need to create the @code{cp@var{nnn}}
+coding system with @kbd{M-x codepage-setup}.
+
+@vindex dos-printer
+@vindex dos-ps-printer
+  For backwards compatibility, the value of @code{dos-printer}
+(@code{dos-ps-printer}), if it has a value, overrides the value of
+@code{printer-name} (@code{ps-printer-name}), on MS-DOS.
+
+
+@node MS-DOS and MULE
+@subsection International Support on MS-DOS
+@cindex international support @r{(MS-DOS)}
+
+  Emacs on MS-DOS supports the same international character sets as it
+does on GNU, Unix and other platforms
+@iftex
+(@pxref{International,,,emacs, the Emacs Manual}),
+@end iftex
+@ifnottex
+(@pxref{International}),
+@end ifnottex
+including coding systems for converting between the different
+character sets.  However, due to incompatibilities between
+MS-DOS/MS-Windows and other systems, there are several DOS-specific
+aspects of this support that you should be aware of.  This section
+describes these aspects.
+
+  The description below is largely specific to the MS-DOS port of
+Emacs, especially where it talks about practical implications for
+Emacs users.  For other operating systems, see the @file{code-pages.el}
+package, which implements support for MS-DOS- and MS-Windows-specific
+encodings for all platforms other than MS-DOS.
+
+@table @kbd
+@item M-x dos-codepage-setup
+Set up Emacs display and coding systems as appropriate for the current
+DOS codepage.
+
+@item M-x codepage-setup
+Create a coding system for a certain DOS codepage.
+@end table
+
+@cindex codepage, MS-DOS
+@cindex DOS codepages
+  MS-DOS is designed to support one character set of 256 characters at
+any given time, but gives you a variety of character sets to choose
+from.  The alternative character sets are known as @dfn{DOS codepages}.
+Each codepage includes all 128 @acronym{ASCII} characters, but the other 128
+characters (codes 128 through 255) vary from one codepage to another.
+Each DOS codepage is identified by a 3-digit number, such as 850, 862,
+etc.
+
+  In contrast to X, which lets you use several fonts at the same time,
+MS-DOS normally doesn't allow use of several codepages in a single
+session.  MS-DOS was designed to load a single codepage at system
+startup, and require you to reboot in order to change
+it@footnote{Normally, one particular codepage is burnt into the
+display memory, while other codepages can be installed by modifying
+system configuration files, such as @file{CONFIG.SYS}, and rebooting.
+While there is third-party software that allows changing the codepage
+without rebooting, we describe here how a stock MS-DOS system
+behaves.}.  Much the same limitation applies when you run DOS
+executables on other systems such as MS-Windows.
+
+@cindex unibyte operation @r{(MS-DOS)}
+  If you invoke Emacs on MS-DOS with the @samp{--unibyte} option
+@iftex
+(@pxref{Initial Options,,,emacs, the Emacs Manual}),
+@end iftex
+@ifnottex
+(@pxref{Initial Options}),
+@end ifnottex
+Emacs does not perform any conversion of non-@acronym{ASCII}
+characters.  Instead, it reads and writes any non-@acronym{ASCII}
+characters verbatim, and sends their 8-bit codes to the display
+verbatim.  Thus, unibyte Emacs on MS-DOS supports the current
+codepage, whatever it may be, but cannot even represent any other
+characters.
+
+@vindex dos-codepage
+  For multibyte operation on MS-DOS, Emacs needs to know which
+characters the chosen DOS codepage can display.  So it queries the
+system shortly after startup to get the chosen codepage number, and
+stores the number in the variable @code{dos-codepage}.  Some systems
+return the default value 437 for the current codepage, even though the
+actual codepage is different.  (This typically happens when you use the
+codepage built into the display hardware.)  You can specify a different
+codepage for Emacs to use by setting the variable @code{dos-codepage} in
+your init file.
+
+@cindex language environment, automatic selection on @r{MS-DOS}
+  Multibyte Emacs supports only certain DOS codepages: those which can
+display Far-Eastern scripts, like the Japanese codepage 932, and those
+that encode a single ISO 8859 character set.
+
+  The Far-Eastern codepages can directly display one of the MULE
+character sets for these countries, so Emacs simply sets up to use the
+appropriate terminal coding system that is supported by the codepage.
+The special features described in the rest of this section mostly
+pertain to codepages that encode ISO 8859 character sets.
+
+  For the codepages which correspond to one of the ISO character sets,
+Emacs knows the character set name based on the codepage number.  Emacs
+automatically creates a coding system to support reading and writing
+files that use the current codepage, and uses this coding system by
+default.  The name of this coding system is @code{cp@var{nnn}}, where
+@var{nnn} is the codepage number.@footnote{The standard Emacs coding
+systems for ISO 8859 are not quite right for the purpose, because
+typically the DOS codepage does not match the standard ISO character
+codes.  For example, the letter @samp{@,{c}} (@samp{c} with cedilla) has
+code 231 in the standard Latin-1 character set, but the corresponding
+DOS codepage 850 uses code 135 for this glyph.}
+
+@cindex mode line @r{(MS-DOS)}
+  All the @code{cp@var{nnn}} coding systems use the letter @samp{D}
+(for ``DOS'') as their mode-line mnemonic.  Since both the terminal
+coding system and the default coding system for file I/O are set to
+the proper @code{cp@var{nnn}} coding system at startup, it is normal
+for the mode line on MS-DOS to begin with @samp{-DD\-}.
+@iftex
+@xref{Mode Line,,,emacs, the Emacs Manual}.
+@end iftex
+@ifnottex
+@xref{Mode Line}.
+@end ifnottex
+Far-Eastern DOS terminals do not use the @code{cp@var{nnn}} coding
+systems, and thus their initial mode line looks like the Emacs
+default.
+
+  Since the codepage number also indicates which script you are using,
+Emacs automatically runs @code{set-language-environment} to select the
+language environment for that script
+@iftex
+(@pxref{Language Environments,,,emacs, the Emacs Manual}).
+@end iftex
+@ifnottex
+(@pxref{Language Environments}).
+@end ifnottex
+
+  If a buffer contains a character belonging to some other ISO 8859
+character set, not the one that the chosen DOS codepage supports, Emacs
+displays it using a sequence of @acronym{ASCII} characters.  For example, if the
+current codepage doesn't have a glyph for the letter @samp{@`o} (small
+@samp{o} with a grave accent), it is displayed as @samp{@{`o@}}, where
+the braces serve as a visual indication that this is a single character.
+(This may look awkward for some non-Latin characters, such as those from
+Greek or Hebrew alphabets, but it is still readable by a person who
+knows the language.)  Even though the character may occupy several
+columns on the screen, it is really still just a single character, and
+all Emacs commands treat it as one.
+
+@cindex IBM graphics characters (MS-DOS)
+@cindex box-drawing characters (MS-DOS)
+@cindex line-drawing characters (MS-DOS)
+  Not all characters in DOS codepages correspond to ISO 8859
+characters---some are used for other purposes, such as box-drawing
+characters and other graphics.  Emacs maps these characters to two
+special character sets called @code{eight-bit-control} and
+@code{eight-bit-graphic}, and displays them as their IBM glyphs.
+However, you should be aware that other systems might display these
+characters differently, so you should avoid them in text that might be
+copied to a different operating system, or even to another DOS machine
+that uses a different codepage.
+
+@vindex dos-unsupported-character-glyph
+  Emacs supports many other characters sets aside from ISO 8859, but it
+cannot display them on MS-DOS.  So if one of these multibyte characters
+appears in a buffer, Emacs on MS-DOS displays them as specified by the
+@code{dos-unsupported-character-glyph} variable; by default, this glyph
+is an empty triangle.  Use the @kbd{C-u C-x =} command to display the
+actual code and character set of such characters.
+@iftex
+@xref{Position Info,,,emacs, the Emacs Manual}.
+@end iftex
+@ifnottex
+@xref{Position Info}.
+@end ifnottex
+
+@findex codepage-setup
+  By default, Emacs defines a coding system to support the current
+codepage.  To define a coding system for some other codepage (e.g., to
+visit a file written on a DOS machine in another country), use the
+@kbd{M-x codepage-setup} command.  It prompts for the 3-digit code of
+the codepage, with completion, then creates the coding system for the
+specified codepage.  You can then use the new coding system to read and
+write files, but you must specify it explicitly for the file command
+when you want to use it
+@iftex
+(@pxref{Text Coding,,,emacs, the Emacs Manual}).
+@end iftex
+@ifnottex
+(@pxref{Text Coding}).
+@end ifnottex
+
+  These coding systems are also useful for visiting a file encoded using
+a DOS codepage, using Emacs running on some other operating system.
+
+@cindex MS-Windows codepages
+  MS-Windows provides its own codepages, which are different from the
+DOS codepages for the same locale.  For example, DOS codepage 850
+supports the same character set as Windows codepage 1252; DOS codepage
+855 supports the same character set as Windows codepage 1251, etc.
+The MS-Windows version of Emacs uses the current codepage for display
+when invoked with the @samp{-nw} option.  Support for codepages in the
+Windows port of Emacs is part of the @file{code-pages.el} package.
+
+@node MS-DOS Processes
+@subsection Subprocesses on MS-DOS
+
+@cindex compilation under MS-DOS
+@cindex inferior processes under MS-DOS
+@findex compile @r{(MS-DOS)}
+@findex grep @r{(MS-DOS)}
+  Because MS-DOS is a single-process ``operating system,''
+asynchronous subprocesses are not available.  In particular, Shell
+mode and its variants do not work.  Most Emacs features that use
+asynchronous subprocesses also don't work on MS-DOS, including
+Shell mode and GUD.  When in doubt, try and see; commands that
+don't work output an error message saying that asynchronous processes
+aren't supported.
+
+  Compilation under Emacs with @kbd{M-x compile}, searching files with
+@kbd{M-x grep} and displaying differences between files with @kbd{M-x
+diff} do work, by running the inferior processes synchronously.  This
+means you cannot do any more editing until the inferior process
+finishes.
+
+  Spell checking also works, by means of special support for synchronous
+invocation of the @code{ispell} program.  This is slower than the
+asynchronous invocation on other platforms
+
+  Instead of the Shell mode, which doesn't work on MS-DOS, you can use
+the @kbd{M-x eshell} command.  This invokes the Eshell package that
+implements a Posix-like shell entirely in Emacs Lisp.
+
+  By contrast, Emacs compiled as a native Windows application
+@strong{does} support asynchronous subprocesses.
+@iftex
+@xref{Windows Processes,,,emacs, the Emacs Manual}.
+@end iftex
+@ifnottex
+@xref{Windows Processes}.
+@end ifnottex
+
+@cindex printing under MS-DOS
+  Printing commands, such as @code{lpr-buffer}
+@iftex
+(@pxref{Printing,,,emacs, the Emacs Manual}) and
+@code{ps-print-buffer} (@pxref{PostScript,,,emacs, the Emacs Manual}),
+work in MS-DOS by sending the output to one of the printer ports.
+@xref{MS-DOS Printing,,,emacs, the Emacs Manual}.
+@end iftex
+@ifnottex
+(@pxref{Printing}) and @code{ps-print-buffer} (@pxref{PostScript}),
+work in MS-DOS by sending the output to one of the printer ports.
+@xref{MS-DOS Printing}.
+@end ifnottex
+
+  When you run a subprocess synchronously on MS-DOS, make sure the
+program terminates and does not try to read keyboard input.  If the
+program does not terminate on its own, you will be unable to terminate
+it, because MS-DOS provides no general way to terminate a process.
+Pressing @kbd{C-c} or @kbd{C-@key{BREAK}} might sometimes help in these
+cases.
+
+  Accessing files on other machines is not supported on MS-DOS.  Other
+network-oriented commands such as sending mail, Web browsing, remote
+login, etc., don't work either, unless network access is built into
+MS-DOS with some network redirector.
+
+@cindex directory listing on MS-DOS
+@vindex dired-listing-switches @r{(MS-DOS)}
+  Dired on MS-DOS uses the @code{ls-lisp} package where other
+platforms use the system @code{ls} command.  Therefore, Dired on
+MS-DOS supports only some of the possible options you can mention in
+the @code{dired-listing-switches} variable.  The options that work are
+@samp{-A}, @samp{-a}, @samp{-c}, @samp{-i}, @samp{-r}, @samp{-S},
+@samp{-s}, @samp{-t}, and @samp{-u}.
+
+@ignore
+   arch-tag: 868d50ff-07f8-4a13-a807-dab6f1cdb431
+@end ignore
similarity index 100%
rename from man/msdog.texi
rename to doc/emacs/msdog.texi
similarity index 100%
rename from man/mule.texi
rename to doc/emacs/mule.texi
diff --git a/doc/emacs/picture-xtra.texi b/doc/emacs/picture-xtra.texi
new file mode 100644 (file)
index 0000000..ad3b9f2
--- /dev/null
@@ -0,0 +1,291 @@
+@c This is part of the Emacs manual.
+@c Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+@c See file emacs.texi for copying conditions.
+@c
+@c This file is included either in emacs-xtra.texi (when producing the
+@c printed version) or in the main Emacs manual (for the on-line version).
+@node Picture Mode
+@chapter Editing Pictures
+@cindex pictures
+@cindex making pictures out of text characters
+@findex edit-picture
+
+  To edit a picture made out of text characters (for example, a picture
+of the division of a register into fields, as a comment in a program),
+use the command @kbd{M-x edit-picture} to enter Picture mode.
+
+  In Picture mode, editing is based on the @dfn{quarter-plane} model of
+text, according to which the text characters lie studded on an area that
+stretches infinitely far to the right and downward.  The concept of the end
+of a line does not exist in this model; the most you can say is where the
+last nonblank character on the line is found.
+
+  Of course, Emacs really always considers text as a sequence of
+characters, and lines really do have ends.  But Picture mode replaces
+the most frequently-used commands with variants that simulate the
+quarter-plane model of text.  They do this by inserting spaces or by
+converting tabs to spaces.
+
+  Most of the basic editing commands of Emacs are redefined by Picture mode
+to do essentially the same thing but in a quarter-plane way.  In addition,
+Picture mode defines various keys starting with the @kbd{C-c} prefix to
+run special picture editing commands.
+
+  One of these keys, @kbd{C-c C-c}, is particularly important.  Often a
+picture is part of a larger file that is usually edited in some other
+major mode.  @kbd{M-x edit-picture} records the name of the previous
+major mode so you can use the @kbd{C-c C-c} command
+(@code{picture-mode-exit}) later to go back to that mode.  @kbd{C-c C-c}
+also deletes spaces from the ends of lines, unless given a numeric
+argument.
+
+  The special commands of Picture mode all work in other modes (provided
+the @file{picture} library is loaded), but are not bound to keys except
+in Picture mode.  The descriptions below talk of moving ``one column''
+and so on, but all the picture mode commands handle numeric arguments as
+their normal equivalents do.
+
+@vindex picture-mode-hook
+  Turning on Picture mode runs the hook @code{picture-mode-hook}.
+Additional extensions to Picture mode can be found in
+@file{artist.el}.
+
+@menu
+* Basic Picture::         Basic concepts and simple commands of Picture Mode.
+* Insert in Picture::     Controlling direction of cursor motion
+                            after "self-inserting" characters.
+* Tabs in Picture::       Various features for tab stops and indentation.
+* Rectangles in Picture:: Clearing and superimposing rectangles.
+@end menu
+
+@node Basic Picture
+@section Basic Editing in Picture Mode
+
+@findex picture-forward-column
+@findex picture-backward-column
+@findex picture-move-down
+@findex picture-move-up
+@cindex editing in Picture mode
+
+  Most keys do the same thing in Picture mode that they usually do, but
+do it in a quarter-plane style.  For example, @kbd{C-f} is rebound to
+run @code{picture-forward-column}, a command which moves point one
+column to the right, inserting a space if necessary so that the actual
+end of the line makes no difference.  @kbd{C-b} is rebound to run
+@code{picture-backward-column}, which always moves point left one
+column, converting a tab to multiple spaces if necessary.  @kbd{C-n} and
+@kbd{C-p} are rebound to run @code{picture-move-down} and
+@code{picture-move-up}, which can either insert spaces or convert tabs
+as necessary to make sure that point stays in exactly the same column.
+@kbd{C-e} runs @code{picture-end-of-line}, which moves to after the last
+nonblank character on the line.  There is no need to change @kbd{C-a},
+as the choice of screen model does not affect beginnings of
+lines.
+
+@findex picture-newline
+  Insertion of text is adapted to the quarter-plane screen model
+through the use of Overwrite mode
+@iftex
+(@pxref{Minor Modes,,, emacs, the Emacs Manual}.)
+@end iftex
+@ifnottex
+(@pxref{Minor Modes}.)
+@end ifnottex
+Self-inserting characters replace existing text, column by column,
+rather than pushing existing text to the right.  @key{RET} runs
+@code{picture-newline}, which just moves to the beginning of the
+following line so that new text will replace that line.
+
+@findex picture-backward-clear-column
+@findex picture-clear-column
+@findex picture-clear-line
+  In Picture mode, the commands that normally delete or kill text,
+instead erase text (replacing it with spaces).  @key{DEL}
+(@code{picture-backward-clear-column}) replaces the preceding
+character with a space rather than removing it; this moves point
+backwards.  @kbd{C-d} (@code{picture-clear-column}) replaces the next
+character or characters with spaces, but does not move point.  (If you
+want to clear characters to spaces and move forward over them, use
+@key{SPC}.)  @kbd{C-k} (@code{picture-clear-line}) really kills the
+contents of lines, but does not delete the newlines from the buffer.
+
+@findex picture-open-line
+  To do actual insertion, you must use special commands.  @kbd{C-o}
+(@code{picture-open-line}) creates a blank line after the current
+line; it never splits a line.  @kbd{C-M-o} (@code{split-line}) makes
+sense in Picture mode, so it is not changed.  @kbd{C-j}
+(@code{picture-duplicate-line}) inserts another line with the same
+contents below the current line.
+
+@kindex C-c C-d @r{(Picture mode)}
+   To do actual deletion in Picture mode, use @kbd{C-w}, @kbd{C-c C-d}
+(which is defined as @code{delete-char}, as @kbd{C-d} is in other
+modes), or one of the picture rectangle commands (@pxref{Rectangles in
+Picture}).
+
+@node Insert in Picture
+@section Controlling Motion after Insert
+
+@findex picture-movement-up
+@findex picture-movement-down
+@findex picture-movement-left
+@findex picture-movement-right
+@findex picture-movement-nw
+@findex picture-movement-ne
+@findex picture-movement-sw
+@findex picture-movement-se
+@kindex C-c < @r{(Picture mode)}
+@kindex C-c > @r{(Picture mode)}
+@kindex C-c ^ @r{(Picture mode)}
+@kindex C-c . @r{(Picture mode)}
+@kindex C-c ` @r{(Picture mode)}
+@kindex C-c ' @r{(Picture mode)}
+@kindex C-c / @r{(Picture mode)}
+@kindex C-c \ @r{(Picture mode)}
+  Since ``self-inserting'' characters in Picture mode overwrite and move
+point, there is no essential restriction on how point should be moved.
+Normally point moves right, but you can specify any of the eight
+orthogonal or diagonal directions for motion after a ``self-inserting''
+character.  This is useful for drawing lines in the buffer.
+
+@table @kbd
+@item C-c <
+@itemx C-c @key{LEFT}
+Move left after insertion (@code{picture-movement-left}).
+@item C-c >
+@itemx C-c @key{RIGHT}
+Move right after insertion (@code{picture-movement-right}).
+@item C-c ^
+@itemx C-c @key{UP}
+Move up after insertion (@code{picture-movement-up}).
+@item C-c .
+@itemx C-c @key{DOWN}
+Move down after insertion (@code{picture-movement-down}).
+@item C-c `
+@itemx C-c @key{HOME}
+Move up and left (``northwest'') after insertion (@code{picture-movement-nw}).
+@item C-c '
+@itemx C-c @key{PAGEUP}
+Move up and right (``northeast'') after insertion
+(@code{picture-movement-ne}).
+@item C-c /
+@itemx C-c @key{END}
+Move down and left (``southwest'') after insertion
+@*(@code{picture-movement-sw}).
+@item C-c \
+@itemx C-c @key{PAGEDOWN}
+Move down and right (``southeast'') after insertion
+@*(@code{picture-movement-se}).
+@end table
+
+@kindex C-c C-f @r{(Picture mode)}
+@kindex C-c C-b @r{(Picture mode)}
+@findex picture-motion
+@findex picture-motion-reverse
+  Two motion commands move based on the current Picture insertion
+direction.  The command @kbd{C-c C-f} (@code{picture-motion}) moves in the
+same direction as motion after ``insertion'' currently does, while @kbd{C-c
+C-b} (@code{picture-motion-reverse}) moves in the opposite direction.
+
+@node Tabs in Picture
+@section Picture Mode Tabs
+
+@kindex M-TAB @r{(Picture mode)}
+@findex picture-tab-search
+@vindex picture-tab-chars
+  Two kinds of tab-like action are provided in Picture mode.  Use
+@kbd{M-@key{TAB}} (@code{picture-tab-search}) for context-based tabbing.
+With no argument, it moves to a point underneath the next
+``interesting'' character that follows whitespace in the previous
+nonblank line.  ``Next'' here means ``appearing at a horizontal position
+greater than the one point starts out at.''  With an argument, as in
+@kbd{C-u M-@key{TAB}}, this command moves to the next such interesting
+character in the current line.  @kbd{M-@key{TAB}} does not change the
+text; it only moves point.  ``Interesting'' characters are defined by
+the variable @code{picture-tab-chars}, which should define a set of
+characters.  The syntax for this variable is like the syntax used inside
+of @samp{[@dots{}]} in a regular expression---but without the @samp{[}
+and the @samp{]}.  Its default value is @code{"!-~"}.
+
+@findex picture-tab
+  @key{TAB} itself runs @code{picture-tab}, which operates based on the
+current tab stop settings; it is the Picture mode equivalent of
+@code{tab-to-tab-stop}.  Normally it just moves point, but with a numeric
+argument it clears the text that it moves over.
+
+@kindex C-c TAB @r{(Picture mode)}
+@findex picture-set-tab-stops
+  The context-based and tab-stop-based forms of tabbing are brought
+together by the command @kbd{C-c @key{TAB}} (@code{picture-set-tab-stops}).
+This command sets the tab stops to the positions which @kbd{M-@key{TAB}}
+would consider significant in the current line.  The use of this command,
+together with @key{TAB}, can get the effect of context-based tabbing.  But
+@kbd{M-@key{TAB}} is more convenient in the cases where it is sufficient.
+
+  It may be convenient to prevent use of actual tab characters in
+pictures.  For example, this prevents @kbd{C-x @key{TAB}} from messing
+up the picture.  You can do this by setting the variable
+@code{indent-tabs-mode} to @code{nil}.
+
+@node Rectangles in Picture
+@section Picture Mode Rectangle Commands
+@cindex rectangles and Picture mode
+@cindex Picture mode and rectangles
+
+  Picture mode defines commands for working on rectangular pieces of
+the text in ways that fit with the quarter-plane model.  The standard
+rectangle commands may also be useful.
+@iftex
+@xref{Rectangles,,, emacs, the Emacs Manual}.
+@end iftex
+@ifnottex
+@xref{Rectangles}.
+@end ifnottex
+
+@table @kbd
+@item C-c C-k
+Clear out the region-rectangle with spaces
+(@code{picture-clear-rectangle}).  With argument, delete the text.
+@item C-c C-w @var{r}
+Similar, but save rectangle contents in register @var{r} first
+(@code{picture-clear-rectangle-to-register}).
+@item C-c C-y
+Copy last killed rectangle into the buffer by overwriting, with upper
+left corner at point (@code{picture-yank-rectangle}).  With argument,
+insert instead.
+@item C-c C-x @var{r}
+Similar, but use the rectangle in register @var{r}
+(@code{picture-yank-rectangle-from-register}).
+@end table
+
+@kindex C-c C-k @r{(Picture mode)}
+@kindex C-c C-w @r{(Picture mode)}
+@findex picture-clear-rectangle
+@findex picture-clear-rectangle-to-register
+  The picture rectangle commands @kbd{C-c C-k}
+(@code{picture-clear-rectangle}) and @kbd{C-c C-w}
+(@code{picture-clear-rectangle-to-register}) differ from the standard
+rectangle commands in that they normally clear the rectangle instead of
+deleting it; this is analogous with the way @kbd{C-d} is changed in Picture
+mode.
+
+  However, deletion of rectangles can be useful in Picture mode, so
+these commands delete the rectangle if given a numeric argument.
+@kbd{C-c C-k} either with or without a numeric argument saves the
+rectangle for @kbd{C-c C-y}.
+
+@kindex C-c C-y @r{(Picture mode)}
+@kindex C-c C-x @r{(Picture mode)}
+@findex picture-yank-rectangle
+@findex picture-yank-rectangle-from-register
+  The Picture mode commands for yanking rectangles differ from the
+standard ones in that they overwrite instead of inserting.  This is
+the same way that Picture mode insertion of other text differs from
+other modes.  @kbd{C-c C-y} (@code{picture-yank-rectangle}) inserts
+(by overwriting) the rectangle that was most recently killed, while
+@kbd{C-c C-x} (@code{picture-yank-rectangle-from-register}) does
+likewise for the rectangle found in a specified register.
+
+@ignore
+   arch-tag: 10e423ad-d896-42f2-a7e8-7018adeaf8c2
+@end ignore
diff --git a/doc/emacs/programs.texi b/doc/emacs/programs.texi
new file mode 100644 (file)
index 0000000..2472d7d
--- /dev/null
@@ -0,0 +1,1773 @@
+@c This is part of the Emacs manual.
+@c Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995, 1997, 1999, 2000,
+@c   2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+@c See file emacs.texi for copying conditions.
+@node Programs, Building, Text, Top
+@chapter Editing Programs
+@cindex Lisp editing
+@cindex C editing
+@cindex program editing
+
+  Emacs provides many features to facilitate editing programs.  Some
+of these features can
+
+@itemize @bullet
+@item
+Find or move over top-level definitions (@pxref{Defuns}).
+@item
+Apply the usual indentation conventions of the language
+(@pxref{Program Indent}).
+@item
+Balance parentheses (@pxref{Parentheses}).
+@item
+Insert, kill or align comments (@pxref{Comments}).
+@item
+Highlight program syntax (@pxref{Font Lock}).
+@end itemize
+
+  This chapter describes these features and many more.
+
+@menu
+* Program Modes::       Major modes for editing programs.
+* Defuns::              Commands to operate on major top-level parts
+                          of a program.
+* Program Indent::      Adjusting indentation to show the nesting.
+* Parentheses::         Commands that operate on parentheses.
+* Comments::           Inserting, killing, and aligning comments.
+* Documentation::       Getting documentation of functions you plan to call.
+* Hideshow::            Displaying blocks selectively.
+* Symbol Completion::   Completion on symbol names of your program or language.
+* Glasses::             Making identifiersLikeThis more readable.
+* Misc for Programs::   Other Emacs features useful for editing programs.
+* C Modes::             Special commands of C, C++, Objective-C,
+                          Java, and Pike modes.
+* Asm Mode::            Asm mode and its special features.
+@ifnottex
+* Fortran::             Fortran mode and its special features.
+@end ifnottex
+@end menu
+
+@node Program Modes
+@section Major Modes for Programming Languages
+@cindex modes for programming languages
+
+  Emacs has specialized major modes for various programming languages.
+@xref{Major Modes}.  A programming language major mode typically
+specifies the syntax of expressions, the customary rules for
+indentation, how to do syntax highlighting for the language, and how
+to find the beginning of a function definition.  It often customizes
+or provides facilities for compiling and debugging programs as well.
+
+  Ideally, Emacs should provide a major mode for each programming
+language that you might want to edit; if it doesn't have a mode for
+your favorite language, you can contribute one.  But often the mode
+for one language can serve for other syntactically similar languages.
+The major mode for language @var{l} is called @code{@var{l}-mode},
+and you can select it by typing @kbd{M-x @var{l}-mode @key{RET}}.
+@xref{Choosing Modes}.
+
+@cindex Perl mode
+@cindex Icon mode
+@cindex Makefile mode
+@cindex Tcl mode
+@cindex CPerl mode
+@cindex DSSSL mode
+@cindex Octave mode
+@cindex Metafont mode
+@cindex Modula2 mode
+@cindex Prolog mode
+@cindex Python mode
+@cindex Simula mode
+@cindex VHDL mode
+@cindex M4 mode
+@cindex Shell-script mode
+@cindex Delphi mode
+@cindex PostScript mode
+@cindex Conf mode
+@cindex DNS mode
+  The existing programming language major modes include Lisp, Scheme (a
+variant of Lisp) and the Scheme-based DSSSL expression language, Ada,
+ASM, AWK, C, C++, Delphi (Object Pascal), Fortran (free format and fixed
+format), Icon, IDL (CORBA), IDLWAVE, Java, Metafont (@TeX{}'s
+companion for font creation), Modula2, Objective-C, Octave, Pascal,
+Perl, Pike, PostScript, Prolog, Python, Simula, Tcl, and VHDL.  An
+alternative mode for Perl is called CPerl mode.  Modes are available for
+the scripting languages of the common GNU and Unix shells, VMS DCL, and
+MS-DOS/MS-Windows @samp{BAT} files.  There are also major modes for
+editing makefiles, DNS master files, and various sorts of configuration
+files.
+
+@kindex DEL @r{(programming modes)}
+@findex c-electric-backspace
+  In most programming languages, indentation should vary from line to
+line to illustrate the structure of the program.  So the major modes
+for programming languages arrange for @key{TAB} to update the
+indentation of the current line.  They also rebind @key{DEL} to treat
+a tab as if it were the equivalent number of spaces; this lets you
+delete one column of indentation without worrying whether the
+whitespace consists of spaces or tabs.  Use @kbd{C-b C-d} to delete a
+tab character before point, in these modes.
+
+  Separate manuals are available for the modes for Ada (@pxref{Top, , Ada
+Mode, ada-mode, Ada Mode}), C/C++/Objective C/Java/Corba IDL/Pike/AWK
+(@pxref{Top, , CC Mode, ccmode, CC Mode}) and the IDLWAVE modes
+(@pxref{Top, , IDLWAVE, idlwave, IDLWAVE User Manual}).  For Fortran
+mode, see
+@iftex
+@ref{Fortran,,, emacs-xtra, Specialized Emacs Features}.
+@end iftex
+@ifnottex
+@ref{Fortran}.
+@end ifnottex
+
+
+@cindex mode hook
+@vindex c-mode-hook
+@vindex lisp-mode-hook
+@vindex emacs-lisp-mode-hook
+@vindex lisp-interaction-mode-hook
+@vindex scheme-mode-hook
+  Turning on a major mode runs a normal hook called the @dfn{mode
+hook}, which is the value of a Lisp variable.  Each major mode has a
+mode hook, and the hook's name is always made from the mode command's
+name by adding @samp{-hook}.  For example, turning on C mode runs the
+hook @code{c-mode-hook}, while turning on Lisp mode runs the hook
+@code{lisp-mode-hook}.  The purpose of the mode hook is to give you a
+place to set up customizations for that major mode.  @xref{Hooks}.
+
+@node Defuns
+@section Top-Level Definitions, or Defuns
+
+  In Emacs, a major definition at the top level in the buffer,
+something like a function, is called a @dfn{defun}.  The name comes
+from Lisp, but in Emacs we use it for all languages.
+
+@menu
+* Left Margin Paren::   An open-paren or similar opening delimiter
+                          starts a defun if it is at the left margin.
+* Moving by Defuns::    Commands to move over or mark a major definition.
+* Imenu::               Making buffer indexes as menus.
+* Which Function::      Which Function mode shows which function you are in.
+@end menu
+
+@node Left Margin Paren
+@subsection Left Margin Convention
+
+@cindex open-parenthesis in leftmost column
+@cindex ( in leftmost column
+  Emacs assumes by default that any opening delimiter found at the
+left margin is the start of a top-level definition, or defun.
+Therefore, @strong{don't put an opening delimiter at the left margin
+unless it should have that significance}.  For instance, never put an
+open-parenthesis at the left margin in a Lisp file unless it is the
+start of a top-level list.  
+
+  If you don't follow this convention, not only will you have trouble
+when you explicitly use the commands for motion by defuns; other
+features that use them will also give you trouble.  This includes
+the indentation commands (@pxref{Program Indent}) and Font Lock
+mode (@pxref{Font Lock}).
+
+  The most likely problem case is when you want an opening delimiter
+at the start of a line inside a string.  To avoid trouble, put an
+escape character (@samp{\}, in C and Emacs Lisp, @samp{/} in some
+other Lisp dialects) before the opening delimiter.  This will not
+affect the contents of the string, but will prevent that opening
+delimiter from starting a defun.  Here's an example:
+
+@example
+  (insert "Foo:
+\(bar)
+")
+@end example
+
+  To help you catch violations of this convention, Font Lock mode
+highlights confusing opening delimiters (those that ought to be
+quoted) in bold red.
+
+If you need to override this convention, you can so by setting this
+user option:
+
+@defvar open-paren-in-column-0-is-defun-start
+If this user option is set to @code{t} (the default), opening
+parentheses or braces at column zero always start defuns.  When it's
+@code{nil}, defuns are found by searching for parens or braces at the
+outermost level.
+@end defvar
+
+  Usually, you shouldn't need to set
+@code{open-paren-in-column-0-is-defun-start} to @code{nil}.  However,
+if your buffer contains parentheses or braces in column zero which
+don't start defuns and this confuses Emacs, it sometimes helps to set
+the option to @code{nil}.  Be aware, though, that this will make
+scrolling and display in large buffers quite sluggish, and that
+parentheses and braces must be correctly matched throughout the buffer
+for it to work properly.
+
+  In the earliest days, the original Emacs found defuns by moving
+upward a level of parentheses or braces until there were no more
+levels to go up.  This always required scanning all the way back to
+the beginning of the buffer, even for a small function.  To speed up
+the operation, we changed Emacs to assume that any opening delimiter
+at the left margin is the start of a defun.  This heuristic is nearly
+always right, and avoids the need to scan back to the beginning of the
+buffer.  However, now that modern computers are so powerful, this
+scanning is rarely slow enough to annoy, so we've provided a way to
+disable the heuristic.
+
+@node Moving by Defuns
+@subsection Moving by Defuns
+@cindex defuns
+
+  These commands move point or set up the region based on top-level
+major definitions, also called @dfn{defuns}.
+
+@table @kbd
+@item C-M-a
+Move to beginning of current or preceding defun
+(@code{beginning-of-defun}).
+@item C-M-e
+Move to end of current or following defun (@code{end-of-defun}).
+@item C-M-h
+Put region around whole current or following defun (@code{mark-defun}).
+@end table
+
+@cindex move to beginning or end of function
+@cindex function, move to beginning or end
+@kindex C-M-a
+@kindex C-M-e
+@kindex C-M-h
+@findex beginning-of-defun
+@findex end-of-defun
+@findex mark-defun
+  The commands to move to the beginning and end of the current defun
+are @kbd{C-M-a} (@code{beginning-of-defun}) and @kbd{C-M-e}
+(@code{end-of-defun}).  If you repeat one of these commands, or use a
+positive numeric argument, each repetition moves to the next defun in
+the direction of motion.
+
+  @kbd{C-M-a} with a negative argument @minus{}@var{n} moves forward
+@var{n} times to the next beginning of a defun.  This is not exactly
+the same place that @kbd{C-M-e} with argument @var{n} would move to;
+the end of this defun is not usually exactly the same place as the
+beginning of the following defun.  (Whitespace, comments, and perhaps
+declarations can separate them.)  Likewise, @kbd{C-M-e} with a
+negative argument moves back to an end of a defun, which is not quite
+the same as @kbd{C-M-a} with a positive argument.
+
+@kindex C-M-h @r{(C mode)}
+@findex c-mark-function
+  To operate on the current defun, use @kbd{C-M-h} (@code{mark-defun})
+which puts point at the beginning and mark at the end of the current
+defun.  This is the easiest way to get ready to kill the defun in
+order to move it to a different place in the file.  If you use the
+command while point is between defuns, it uses the following defun.
+Successive uses of @kbd{C-M-h}, or using it in Transient Mark mode
+when the mark is active, extends the end of the region to include one
+more defun each time.
+
+  In C mode, @kbd{C-M-h} runs the function @code{c-mark-function},
+which is almost the same as @code{mark-defun}; the difference is that
+it backs up over the argument declarations, function name and returned
+data type so that the entire C function is inside the region.  This is
+an example of how major modes adjust the standard key bindings so that
+they do their standard jobs in a way better fitting a particular
+language.  Other major modes may replace any or all of these key
+bindings for that purpose.
+
+@node Imenu
+@subsection Imenu
+@cindex index of buffer definitions
+@cindex buffer definitions index
+@cindex tags
+
+  The Imenu facility offers a way to find the major definitions in
+a file by name.  It is also useful in text formatter major modes,
+where it treats each chapter, section, etc., as a definition.
+(@xref{Tags}, for a more powerful feature that handles multiple files
+together.)
+
+@findex imenu
+  If you type @kbd{M-x imenu}, it reads the name of a definition using
+the minibuffer, then moves point to that definition.  You can use
+completion to specify the name; the command always displays the whole
+list of valid names.
+
+@findex imenu-add-menubar-index
+  Alternatively, you can bind the command @code{imenu} to a mouse
+click.  Then it displays mouse menus for you to select a definition
+name.  You can also add the buffer's index to the menu bar by calling
+@code{imenu-add-menubar-index}.  If you want to have this menu bar
+item available for all buffers in a certain major mode, you can do
+this by adding @code{imenu-add-menubar-index} to its mode hook.  But
+if you have done that, you will have to wait a little while each time
+you visit a file in that mode, while Emacs finds all the definitions
+in that buffer.
+
+@vindex imenu-auto-rescan
+  When you change the contents of a buffer, if you add or delete
+definitions, you can update the buffer's index based on the
+new contents by invoking the @samp{*Rescan*} item in the menu.
+Rescanning happens automatically if you set @code{imenu-auto-rescan} to
+a non-@code{nil} value.  There is no need to rescan because of small
+changes in the text.
+
+@vindex imenu-sort-function
+  You can customize the way the menus are sorted by setting the
+variable @code{imenu-sort-function}.  By default, names are ordered as
+they occur in the buffer; if you want alphabetic sorting, use the
+symbol @code{imenu--sort-by-name} as the value.  You can also
+define your own comparison function by writing Lisp code.
+
+  Imenu provides the information to guide Which Function mode
+@ifnottex
+(@pxref{Which Function}).
+@end ifnottex
+@iftex
+(see below).
+@end iftex
+The Speedbar can also use it (@pxref{Speedbar}).
+
+@node Which Function
+@subsection Which Function Mode
+@cindex current function name in mode line
+
+  Which Function mode is a minor mode that displays the current
+function name in the mode line, updating it as you move around in a
+buffer.
+
+@findex which-function-mode
+@vindex which-func-modes
+  To either enable or disable Which Function mode, use the command
+@kbd{M-x which-function-mode}.  This command is global; it applies to
+all buffers, both existing ones and those yet to be created.  However,
+it takes effect only in certain major modes, those listed in the value
+of @code{which-func-modes}.  If the value is @code{t}, then Which
+Function mode applies to all major modes that know how to support
+it---in other words, all the major modes that support Imenu.
+
+@node Program Indent
+@section Indentation for Programs
+@cindex indentation for programs
+
+  The best way to keep a program properly indented is to use Emacs to
+reindent it as you change it.  Emacs has commands to indent properly
+either a single line, a specified number of lines, or all of the lines
+inside a single parenthetical grouping.
+
+@menu
+* Basic Indent::       Indenting a single line.
+* Multi-line Indent::   Commands to reindent many lines at once.
+* Lisp Indent::                Specifying how each Lisp function should be indented.
+* C Indent::           Extra features for indenting C and related modes.
+* Custom C Indent::    Controlling indentation style for C and related modes.
+@end menu
+
+@cindex pretty-printer
+  Emacs also provides a Lisp pretty-printer in the library @code{pp}.
+This program reformats a Lisp object with indentation chosen to look nice.
+
+@node Basic Indent
+@subsection Basic Program Indentation Commands
+
+  The basic indentation commands indent a single line according to the
+usual conventions of the language you are editing.
+
+@need 1000
+@table @kbd
+@item @key{TAB}
+Adjust indentation of current line.
+@item C-j
+Insert a newline, then adjust indentation of following line
+(@code{newline-and-indent}).
+@end table
+
+@kindex TAB @r{(programming modes)}
+@findex c-indent-command
+@findex indent-line-function
+@findex indent-for-tab-command
+  The basic indentation command is @key{TAB}, which gives the current line
+the correct indentation as determined from the previous lines.  The
+function that @key{TAB} runs depends on the major mode; it is
+@code{lisp-indent-line}
+in Lisp mode, @code{c-indent-command} in C mode, etc.  These functions
+understand the syntax and conventions of different languages, but they all do
+conceptually the same job: @key{TAB} in any programming-language major mode
+inserts or deletes whitespace at the beginning of the current line,
+independent of where point is in the line.  If point was inside the
+whitespace at the beginning of the line, @key{TAB} puts it at the end of
+that whitespace; otherwise, @key{TAB} keeps point fixed with respect to
+the characters around it.
+
+  Use @kbd{C-q @key{TAB}} to insert a tab character at point.
+
+@kindex C-j
+@findex newline-and-indent
+  When entering lines of new code, use @kbd{C-j}
+(@code{newline-and-indent}), which inserts a newline and then adjusts
+indentation after it.  (It also deletes any trailing whitespace which
+remains before the new newline.)  Thus, @kbd{C-j} at the end of a line
+creates a blank line with appropriate indentation.  In programming
+language modes, it is equivalent to @key{RET} @key{TAB}.
+
+  @key{TAB} indents a line that starts within a parenthetical grouping
+under the preceding line within the grouping, or the text after the
+parenthesis.  Therefore, if you manually give one of these lines a
+nonstandard indentation, the lines below will tend to follow it.  This
+behavior is convenient in cases where you have overridden the standard
+result of @key{TAB} because you find it unaesthetic for a particular
+line.
+
+  In some modes, an open-parenthesis, open-brace or other opening
+delimiter at the left margin is assumed by Emacs (including the
+indentation routines) to be the start of a function.  This speeds up
+indentation commands.  If you will be editing text which contains
+opening delimiters in column zero that aren't the beginning of a
+functions, even inside strings or comments, you must set
+@code{open-paren-in-column-0-is-defun-start}.  @xref{Left Margin
+Paren}, for more information on this.
+
+  Normally, lines are indented with tabs and spaces.  If you want Emacs
+to use spaces only, set @code{indent-tabs-mode} (@pxref{Just Spaces}).
+
+@node Multi-line Indent
+@subsection Indenting Several Lines
+
+  When you wish to reindent several lines of code which have been
+altered or moved to a different level in the parenthesis structure,
+you have several commands available.
+
+@table @kbd
+@item C-M-q
+Reindent all the lines within one parenthetical grouping (@code{indent-pp-sexp}).
+@item C-M-\
+Reindent all lines in the region (@code{indent-region}).
+@item C-u @key{TAB}
+Shift an entire parenthetical grouping rigidly sideways so that its
+first line is properly indented.
+@item M-x indent-code-rigidly
+Shift all the lines in the region rigidly sideways, but do not alter
+lines that start inside comments and strings.
+@end table
+
+@kindex C-M-q
+@findex indent-pp-sexp
+  You can reindent the contents of a single parenthetical grouping by
+positioning point before the beginning of it and typing @kbd{C-M-q}
+(@code{indent-pp-sexp} in Lisp mode, @code{c-indent-exp} in C mode; also
+bound to other suitable commands in other modes).  The indentation of
+the line where the grouping starts is not changed; therefore this
+changes only the relative indentation within the grouping, not its
+overall indentation.  To correct that as well, type @key{TAB} first.
+
+  Another way to specify the range to be reindented is with the
+region.  The command @kbd{C-M-\} (@code{indent-region}) applies
+@key{TAB} to every line whose first character is between point and
+mark.
+
+@kindex C-u TAB
+  If you like the relative indentation within a grouping, but not the
+indentation of its first line, you can type @kbd{C-u @key{TAB}} to
+reindent the whole grouping as a rigid unit.  (This works in Lisp
+modes and C and related modes.)  @key{TAB} with a numeric argument
+reindents the current line as usual, then reindents by the same amount
+all the lines in the parenthetical grouping starting on the current
+line.  It is clever, though, and does not alter lines that start
+inside strings.  Neither does it alter C preprocessor lines when in C
+mode, but it does reindent any continuation lines that may be attached
+to them.
+
+@findex indent-code-rigidly
+  You can also perform this operation on the region, using the command
+@kbd{M-x indent-code-rigidly}.  It rigidly shifts all the lines in the
+region sideways, like @code{indent-rigidly} does (@pxref{Indentation
+Commands}).  It doesn't alter the indentation of lines that start
+inside a string, unless the region also starts inside that string.
+The prefix arg specifies the number of columns to indent.
+
+@node Lisp Indent
+@subsection Customizing Lisp Indentation
+@cindex customizing Lisp indentation
+
+  The indentation pattern for a Lisp expression can depend on the function
+called by the expression.  For each Lisp function, you can choose among
+several predefined patterns of indentation, or define an arbitrary one with
+a Lisp program.
+
+  The standard pattern of indentation is as follows: the second line of the
+expression is indented under the first argument, if that is on the same
+line as the beginning of the expression; otherwise, the second line is
+indented underneath the function name.  Each following line is indented
+under the previous line whose nesting depth is the same.
+
+@vindex lisp-indent-offset
+  If the variable @code{lisp-indent-offset} is non-@code{nil}, it overrides
+the usual indentation pattern for the second line of an expression, so that
+such lines are always indented @code{lisp-indent-offset} more columns than
+the containing list.
+
+@vindex lisp-body-indent
+  Certain functions override the standard pattern.  Functions whose
+names start with @code{def} treat the second lines as the start of
+a @dfn{body}, by indenting the second line @code{lisp-body-indent}
+additional columns beyond the open-parenthesis that starts the
+expression.
+
+@cindex @code{lisp-indent-function} property
+  You can override the standard pattern in various ways for individual
+functions, according to the @code{lisp-indent-function} property of
+the function name.  Normally you would use this for macro definitions
+and specify it using the @code{declare} construct (@pxref{Defining
+Macros,,, elisp, the Emacs Lisp Reference Manual}).
+
+@node C Indent
+@subsection Commands for C Indentation
+
+  Here are special features for indentation in C mode and related modes:
+
+@table @code
+@item C-c C-q
+@kindex C-c C-q @r{(C mode)}
+@findex c-indent-defun
+Reindent the current top-level function definition or aggregate type
+declaration (@code{c-indent-defun}).
+
+@item C-M-q
+@kindex C-M-q @r{(C mode)}
+@findex c-indent-exp
+Reindent each line in the balanced expression that follows point
+(@code{c-indent-exp}).  A prefix argument inhibits warning messages
+about invalid syntax.
+
+@item @key{TAB}
+@findex c-indent-command
+Reindent the current line, and/or in some cases insert a tab character
+(@code{c-indent-command}).
+
+@vindex c-tab-always-indent
+If @code{c-tab-always-indent} is @code{t}, this command always reindents
+the current line and does nothing else.  This is the default.
+
+If that variable is @code{nil}, this command reindents the current line
+only if point is at the left margin or in the line's indentation;
+otherwise, it inserts a tab (or the equivalent number of spaces,
+if @code{indent-tabs-mode} is @code{nil}).
+
+Any other value (not @code{nil} or @code{t}) means always reindent the
+line, and also insert a tab if within a comment or a string.
+@end table
+
+  To reindent the whole current buffer, type @kbd{C-x h C-M-\}.  This
+first selects the whole buffer as the region, then reindents that
+region.
+
+  To reindent the current block, use @kbd{C-M-u C-M-q}.  This moves
+to the front of the block and then reindents it all.
+
+@node Custom C Indent
+@subsection Customizing C Indentation
+@cindex style (for indentation)
+
+  C mode and related modes use a flexible mechanism for customizing
+indentation.  C mode indents a source line in two steps: first it
+classifies the line syntactically according to its contents and
+context; second, it determines the indentation offset associated by
+your selected @dfn{style} with the syntactic construct and adds this
+onto the indentation of the @dfn{anchor statement}.
+
+@table @kbd
+@item C-c . @key{RET} @var{style} @key{RET}
+Select a predefined style @var{style} (@code{c-set-style}).
+@end table
+
+  A @dfn{style} is a named collection of customizations that can be
+used in C mode and the related modes.  @ref{Styles,,, ccmode, The CC
+Mode Manual}, for a complete description.  Emacs comes with several
+predefined styles, including @code{gnu}, @code{k&r}, @code{bsd},
+@code{stroustrup}, @code{linux}, @code{python}, @code{java},
+@code{whitesmith}, @code{ellemtel}, and @code{awk}.  Some of these
+styles are primarily intended for one language, but any of them can be
+used with any of the languages supported by these modes.  To find out
+what a style looks like, select it and reindent some code, e.g., by
+typing @key{C-M-q} at the start of a function definition.
+
+@kindex C-c . @r{(C mode)}
+@findex c-set-style
+  To choose a style for the current buffer, use the command @w{@kbd{C-c
+.}}.  Specify a style name as an argument (case is not significant).
+This command affects the current buffer only, and it affects only
+future invocations of the indentation commands; it does not reindent
+the code already in the buffer.  To reindent the whole buffer in the
+new style, you can type @kbd{C-x h C-M-\}.
+
+@vindex c-default-style
+  You can also set the variable @code{c-default-style} to specify the
+default style for various major modes.  Its value should be either the
+style's name (a string) or an alist, in which each element specifies
+one major mode and which indentation style to use for it.  For
+example,
+
+@example
+(setq c-default-style
+      '((java-mode . "java") (awk-mode . "awk") (other . "gnu")))
+@end example
+
+@noindent
+specifies explicit choices for Java and AWK modes, and the default
+@samp{gnu} style for the other C-like modes.  (These settings are
+actually the defaults.)  This variable takes effect when you select
+one of the C-like major modes; thus, if you specify a new default
+style for Java mode, you can make it take effect in an existing Java
+mode buffer by typing @kbd{M-x java-mode} there.
+
+  The @code{gnu} style specifies the formatting recommended by the GNU
+Project for C; it is the default, so as to encourage use of our
+recommended style.
+
+  @xref{Indentation Engine Basics,,, ccmode, the CC Mode Manual}, and
+@ref{Customizing Indentation,,, ccmode, the CC Mode Manual}, for more
+information on customizing indentation for C and related modes,
+including how to override parts of an existing style and how to define
+your own styles.
+
+@node Parentheses
+@section Commands for Editing with Parentheses
+
+@findex check-parens
+@cindex unbalanced parentheses and quotes
+  This section describes the commands and features that take advantage
+of the parenthesis structure in a program, or help you keep it
+balanced.
+
+  When talking about these facilities, the term ``parenthesis'' also
+includes braces, brackets, or whatever delimiters are defined to match
+in pairs.  The major mode controls which delimiters are significant,
+through the syntax table (@pxref{Syntax}).  In Lisp, only parentheses
+count; in C, these commands apply to braces and brackets too.
+
+  You can use @kbd{M-x check-parens} to find any unbalanced
+parentheses and unbalanced string quotes in the buffer.
+
+@menu
+* Expressions::         Expressions with balanced parentheses.
+* Moving by Parens::    Commands for moving up, down and across
+                          in the structure of parentheses.
+* Matching::           Insertion of a close-delimiter flashes matching open.
+@end menu
+
+@node Expressions
+@subsection Expressions with Balanced Parentheses
+
+@cindex sexp
+@cindex expression
+@cindex balanced expression
+  These commands deal with balanced expressions, also called
+@dfn{sexps}@footnote{The word ``sexp'' is used to refer to an
+expression in Lisp.}.
+
+@table @kbd
+@item C-M-f
+Move forward over a balanced expression (@code{forward-sexp}).
+@item C-M-b
+Move backward over a balanced expression (@code{backward-sexp}).
+@item C-M-k
+Kill balanced expression forward (@code{kill-sexp}).
+@item C-M-t
+Transpose expressions (@code{transpose-sexps}).
+@item C-M-@@
+@itemx C-M-@key{SPC}
+Put mark after following expression (@code{mark-sexp}).
+@end table
+
+  Each programming language major mode customizes the definition of
+balanced expressions to suit that language.  Balanced expressions
+typically include symbols, numbers, and string constants, as well as
+any pair of matching delimiters and their contents.  Some languages
+have obscure forms of expression syntax that nobody has bothered to
+implement in Emacs.
+
+@cindex Control-Meta
+  By convention, the keys for these commands are all Control-Meta
+characters.  They usually act on expressions just as the corresponding
+Meta characters act on words.  For instance, the command @kbd{C-M-b}
+moves backward over a balanced expression, just as @kbd{M-b} moves
+back over a word.
+
+@kindex C-M-f
+@kindex C-M-b
+@findex forward-sexp
+@findex backward-sexp
+  To move forward over a balanced expression, use @kbd{C-M-f}
+(@code{forward-sexp}).  If the first significant character after point
+is an opening delimiter (@samp{(} in Lisp; @samp{(}, @samp{[} or
+@samp{@{} in C), @kbd{C-M-f} moves past the matching closing
+delimiter.  If the character begins a symbol, string, or number,
+@kbd{C-M-f} moves over that.
+
+  The command @kbd{C-M-b} (@code{backward-sexp}) moves backward over a
+balanced expression.  The detailed rules are like those above for
+@kbd{C-M-f}, but with directions reversed.  If there are prefix
+characters (single-quote, backquote and comma, in Lisp) preceding the
+expression, @kbd{C-M-b} moves back over them as well.  The balanced
+expression commands move across comments as if they were whitespace,
+in most modes.
+
+  @kbd{C-M-f} or @kbd{C-M-b} with an argument repeats that operation the
+specified number of times; with a negative argument, it moves in the
+opposite direction.
+
+@cindex killing expressions
+@kindex C-M-k
+@findex kill-sexp
+  Killing a whole balanced expression can be done with @kbd{C-M-k}
+(@code{kill-sexp}).  @kbd{C-M-k} kills the characters that @kbd{C-M-f}
+would move over.
+
+@cindex transposition of expressions
+@kindex C-M-t
+@findex transpose-sexps
+  A somewhat random-sounding command which is nevertheless handy is
+@kbd{C-M-t} (@code{transpose-sexps}), which drags the previous
+balanced expression across the next one.  An argument serves as a
+repeat count, moving the previous expression over that many following
+ones.  A negative argument drags the previous balanced expression
+backwards across those before it (thus canceling out the effect of
+@kbd{C-M-t} with a positive argument).  An argument of zero, rather
+than doing nothing, transposes the balanced expressions ending at or
+after point and the mark.
+
+@kindex C-M-@@
+@kindex C-M-@key{SPC}
+@findex mark-sexp
+  To set the region around the next balanced expression in the buffer,
+use @kbd{C-M-@@} (@code{mark-sexp}), which sets mark at the same place
+that @kbd{C-M-f} would move to.  @kbd{C-M-@@} takes arguments like
+@kbd{C-M-f}.  In particular, a negative argument is useful for putting
+the mark at the beginning of the previous balanced expression.  The
+alias @kbd{C-M-@key{SPC}} is equivalent to @kbd{C-M-@@}.  When you
+repeat this command, or use it in Transient Mark mode when the mark is
+active, it extends the end of the region by one sexp each time.
+
+  In languages that use infix operators, such as C, it is not possible
+to recognize all balanced expressions as such because there can be
+multiple possibilities at a given position.  For example, C mode does
+not treat @samp{foo + bar} as a single expression, even though it
+@emph{is} one C expression; instead, it recognizes @samp{foo} as one
+expression and @samp{bar} as another, with the @samp{+} as punctuation
+between them.  Both @samp{foo + bar} and @samp{foo} are legitimate
+choices for ``the expression following point'' when point is at the
+@samp{f}, so the expression commands must perforce choose one or the
+other to operate on.  Note that @samp{(foo + bar)} is recognized as a
+single expression in C mode, because of the parentheses.
+
+@node Moving by Parens
+@subsection Moving in the Parenthesis Structure
+
+@cindex parenthetical groupings
+@cindex parentheses, moving across
+@cindex matching parenthesis and braces, moving to
+@cindex braces, moving across
+@cindex list commands
+  The Emacs commands for handling parenthetical groupings see nothing
+except parentheses (or whatever characters must balance in the
+language you are working with), and the escape characters that might
+be used to quote those.  They are mainly intended for editing
+programs, but can be useful for editing any text that has parentheses.
+They are sometimes called ``list'' commands because in Lisp these
+groupings are lists.
+
+@table @kbd
+@item C-M-n
+Move forward over a parenthetical group (@code{forward-list}).
+@item C-M-p
+Move backward over a parenthetical group (@code{backward-list}).
+@item C-M-u
+Move up in parenthesis structure (@code{backward-up-list}).
+@item C-M-d
+Move down in parenthesis structure (@code{down-list}).
+@end table
+
+@kindex C-M-n
+@kindex C-M-p
+@findex forward-list
+@findex backward-list
+  The ``list'' commands @kbd{C-M-n} (@code{forward-list}) and
+@kbd{C-M-p} (@code{backward-list}) move over one (or @var{n})
+parenthetical groupings, skipping blithely over any amount of text
+that doesn't include meaningful parentheses (symbols, strings, etc.).
+
+@kindex C-M-u
+@findex backward-up-list
+  @kbd{C-M-n} and @kbd{C-M-p} try to stay at the same level in the
+parenthesis structure.  To move @emph{up} one (or @var{n}) levels, use
+@kbd{C-M-u} (@code{backward-up-list}).  @kbd{C-M-u} moves backward up
+past one unmatched opening delimiter.  A positive argument serves as a
+repeat count; a negative argument reverses the direction of motion, so
+that the command moves forward and up one or more levels.
+
+@kindex C-M-d
+@findex down-list
+  To move @emph{down} in the parenthesis structure, use @kbd{C-M-d}
+(@code{down-list}).  In Lisp mode, where @samp{(} is the only opening
+delimiter, this is nearly the same as searching for a @samp{(}.  An
+argument specifies the number of levels to go down.
+
+@node Matching
+@subsection Automatic Display Of Matching Parentheses
+@cindex matching parentheses
+@cindex parentheses, displaying matches
+
+  The Emacs parenthesis-matching feature is designed to show
+automatically how parentheses (and other matching delimiters) match in
+the text.  Whenever you type a self-inserting character that is a
+closing delimiter, the cursor moves momentarily to the location of the
+matching opening delimiter, provided that is on the screen.  If it is
+not on the screen, Emacs displays some of the text near it in the echo
+area.  Either way, you can tell which grouping you are closing off.
+
+  If the opening delimiter and closing delimiter are mismatched---such
+as in @samp{[x)}---a warning message is displayed in the echo area.
+
+@vindex blink-matching-paren
+@vindex blink-matching-paren-distance
+@vindex blink-matching-delay
+  Three variables control parenthesis match display:
+
+  @code{blink-matching-paren} turns the feature on or off: @code{nil}
+disables it, but the default is @code{t} to enable match display.
+
+  @code{blink-matching-delay} says how many seconds to leave the
+cursor on the matching opening delimiter, before bringing it back to
+the real location of point; the default is 1, but on some systems it
+is useful to specify a fraction of a second.
+
+  @code{blink-matching-paren-distance} specifies how many characters
+back to search to find the matching opening delimiter.  If the match
+is not found in that distance, scanning stops, and nothing is displayed.
+This is to prevent the scan for the matching delimiter from wasting
+lots of time when there is no match.  The default is 25600.
+
+@cindex Show Paren mode
+@cindex highlighting matching parentheses
+@findex show-paren-mode
+  Show Paren mode provides a more powerful kind of automatic matching.
+Whenever point is after a closing delimiter, that delimiter and its
+matching opening delimiter are both highlighted; otherwise, if point
+is before an opening delimiter, the matching closing delimiter is
+highlighted.  (There is no need to highlight the opening delimiter in
+that case, because the cursor appears on top of that character.)  Use
+the command @kbd{M-x show-paren-mode} to enable or disable this mode.
+
+  Show Paren mode uses the faces @code{show-paren-match} and
+@code{show-paren-mismatch} to highlight parentheses; you can customize
+them to control how highlighting looks.  @xref{Face Customization}.
+
+@node Comments
+@section Manipulating Comments
+@cindex comments
+
+  Because comments are such an important part of programming, Emacs
+provides special commands for editing and inserting comments.  It can
+also do spell checking on comments with Flyspell Prog mode
+(@pxref{Spelling}).
+
+@menu
+* Comment Commands::    Inserting, killing, and aligning comments.
+* Multi-Line Comments:: Commands for adding and editing multi-line comments.
+* Options for Comments::Customizing the comment features.
+@end menu
+
+@node Comment Commands
+@subsection Comment Commands
+@cindex indentation for comments
+@cindex alignment for comments
+
+  The comment commands in this table insert, kill and align comments.
+They are described in this section and following sections.
+
+@table @asis
+@item @kbd{M-;}
+Insert or realign comment on current line; alternatively, comment or
+uncomment the region (@code{comment-dwim}).
+@item @kbd{C-u M-;}
+Kill comment on current line (@code{comment-kill}).
+@item @kbd{C-x ;}
+Set comment column (@code{comment-set-column}).
+@item @kbd{C-M-j}
+@itemx @kbd{M-j}
+Like @key{RET} followed by inserting and aligning a comment
+(@code{comment-indent-new-line}).  @xref{Multi-Line Comments}.
+@item @kbd{M-x comment-region}
+@itemx @kbd{C-c C-c} (in C-like modes)
+Add or remove comment delimiters on all the lines in the region.
+@end table
+
+@kindex M-;
+@findex comment-dwim
+  The command to create or align a comment is @kbd{M-;}
+(@code{comment-dwim}).  The word ``dwim'' is an acronym for ``Do What
+I Mean''; it indicates that this command can be used for many
+different jobs relating to comments, depending on the situation where
+you use it.
+
+  If there is no comment already on the line, @kbd{M-;} inserts a new
+comment, aligned at a specific column called the @dfn{comment column}.
+The new comment begins with the string Emacs thinks comments should
+start with (the value of @code{comment-start}; see below).  Point is
+after that string, so you can insert the text of the comment right
+away.  If the major mode has specified a string to terminate comments,
+@kbd{M-;} inserts that after point, to keep the syntax valid.
+
+  If the text of the line extends past the comment column, this
+command aligns the comment start string to a suitable boundary
+(usually, at least one space is inserted).
+
+  You can also use @kbd{M-;} to align an existing comment.  If a line
+already contains the comment-start string, @kbd{M-;} realigns it to
+the conventional alignment and moves point after it.  (Exception:
+comments starting in column 0 are not moved.)  Even when an existing
+comment is properly aligned, @kbd{M-;} is still useful for moving
+directly to the start of the text inside the comment.
+
+@findex comment-kill
+@kindex C-u M-;
+  @kbd{C-u M-;} kills any comment on the current line, along with the
+whitespace before it.  To reinsert the comment on another line, move
+to the end of that line, do @kbd{C-y}, and then do @kbd{M-;} to
+realign it.
+
+  Note that @kbd{C-u M-;} is not a distinct key; it is @kbd{M-;}
+(@code{comment-dwim}) with a prefix argument.  That command is
+programmed so that when it receives a prefix argument it calls
+@code{comment-kill}.  However, @code{comment-kill} is a valid command
+in its own right, and you can bind it directly to a key if you wish.
+
+  @kbd{M-;} does two other jobs when used with an active region in
+Transient Mark mode (@pxref{Transient Mark}).  Then it either adds or
+removes comment delimiters on each line of the region.  (If every line
+is a comment, it removes comment delimiters from each; otherwise, it
+adds comment delimiters to each.)  If you are not using Transient Mark
+mode, then you should use the commands @code{comment-region} and
+@code{uncomment-region} to do these jobs (@pxref{Multi-Line Comments}),
+or else enable Transient Mark mode momentarily (@pxref{Momentary Mark}).
+A prefix argument used in these circumstances specifies how many
+comment delimiters to add or how many to delete.
+
+  Some major modes have special rules for aligning certain kinds of
+comments in certain contexts.  For example, in Lisp code, comments which
+start with two semicolons are indented as if they were lines of code,
+instead of at the comment column.  Comments which start with three
+semicolons are supposed to start at the left margin and are often used
+for sectioning purposes.  Emacs understands
+these conventions by indenting a double-semicolon comment using @key{TAB},
+and by not changing the indentation of a triple-semicolon comment at all.
+
+@example
+;; This function is just an example.
+;;; Here either two or three semicolons are appropriate.
+(defun foo (x)
+;;;  And now, the first part of the function:
+  ;; The following line adds one.
+  (1+ x))           ; This line adds one.
+@end example
+
+  For C-like modes, you can configure the exact effect of @kbd{M-;}
+more flexibly than for most buffers by setting the variables
+@code{c-indent-comment-alist} and
+@code{c-indent-comments-syntactically-p}.  For example, on a line
+ending in a closing brace, @kbd{M-;} puts the comment one space after
+the brace rather than at @code{comment-column}.  For full details see
+@ref{Comment Commands,,, ccmode, The CC Mode Manual}. 
+
+@node Multi-Line Comments
+@subsection Multiple Lines of Comments
+
+@kindex C-M-j
+@kindex M-j
+@cindex blank lines in programs
+@findex comment-indent-new-line
+
+  If you are typing a comment and wish to continue it on another line,
+you can use the command @kbd{C-M-j} or @kbd{M-j}
+(@code{comment-indent-new-line}).  If @code{comment-multi-line}
+(@pxref{Options for Comments}) is non-@code{nil}, it moves to a new
+line within the comment.  Otherwise it closes the comment and starts a
+new comment on a new line.  When Auto Fill mode is on, going past the
+fill column while typing a comment causes the comment to be continued
+in just this fashion.
+
+@kindex C-c C-c (C mode)
+@findex comment-region
+  To turn existing lines into comment lines, use the @kbd{M-x
+comment-region} command (or type @kbd{C-c C-c} in C-like modes).  It
+adds comment delimiters to the lines that start in the region, thus
+commenting them out.  With a negative argument, it does the
+opposite---it deletes comment delimiters from the lines in the region.
+
+  With a positive argument, @code{comment-region} duplicates the last
+character of the comment start sequence it adds; the argument
+specifies how many copies of the character to insert.  Thus, in Lisp
+mode, @kbd{C-u 2 M-x comment-region} adds @samp{;;} to each line.
+Duplicating the comment delimiter is a way of calling attention to the
+comment.  It can also affect how the comment is aligned or indented.
+In Lisp, for proper indentation, you should use an argument of two or
+three, if between defuns; if within a defun, it must be three.
+
+  You can configure C Mode such that when you type a @samp{/} at the
+start of a line in a multi-line block comment, this closes the
+comment.  Enable the @code{comment-close-slash} clean-up for this.
+@xref{Clean-ups,,, ccmode, The CC Mode Manual}.
+
+@node Options for Comments
+@subsection Options Controlling Comments
+
+@vindex comment-column
+@kindex C-x ;
+@findex comment-set-column
+  The @dfn{comment column}, the column at which Emacs tries to place
+comments, is stored in the variable @code{comment-column}.  You can
+set it to a number explicitly.  Alternatively, the command @kbd{C-x ;}
+(@code{comment-set-column}) sets the comment column to the column
+point is at.  @kbd{C-u C-x ;} sets the comment column to match the
+last comment before point in the buffer, and then does a @kbd{M-;} to
+align the current line's comment under the previous one.
+
+  The variable @code{comment-column} is per-buffer: setting the variable
+in the normal fashion affects only the current buffer, but there is a
+default value which you can change with @code{setq-default}.
+@xref{Locals}.  Many major modes initialize this variable for the
+current buffer.
+
+@vindex comment-start-skip
+  The comment commands recognize comments based on the regular
+expression that is the value of the variable @code{comment-start-skip}.
+Make sure this regexp does not match the null string.  It may match more
+than the comment starting delimiter in the strictest sense of the word;
+for example, in C mode the value of the variable is
+@c This stops M-q from breaking the line inside that @code.
+@code{@w{"/\\*+ *\\|//+ *"}}, which matches extra stars and spaces
+after the @samp{/*} itself, and accepts C++ style comments also.
+(Note that @samp{\\} is needed in Lisp syntax to include a @samp{\} in
+the string, which is needed to deny the first star its special meaning
+in regexp syntax.  @xref{Regexp Backslash}.)
+
+@vindex comment-start
+@vindex comment-end
+  When a comment command makes a new comment, it inserts the value of
+@code{comment-start} to begin it.  The value of @code{comment-end} is
+inserted after point, so that it will follow the text that you will
+insert into the comment.  When @code{comment-end} is non-empty, it
+should start with a space.  For example, in C mode,
+@code{comment-start} has the value @w{@code{"/* "}} and
+@code{comment-end} has the value @w{@code{" */"}}.
+
+@vindex comment-padding
+  The variable @code{comment-padding} specifies how many spaces
+@code{comment-region} should insert on each line between the comment
+delimiter and the line's original text.  The default is 1, to insert
+one space.  @code{nil} means 0.  Alternatively, @code{comment-padding}
+can hold the actual string to insert.
+
+@vindex comment-multi-line
+  The variable @code{comment-multi-line} controls how @kbd{C-M-j}
+(@code{indent-new-comment-line}) behaves when used inside a comment.
+Specifically, when @code{comment-multi-line} is @code{nil}, the
+command inserts a comment terminator, begins a new line, and finally
+inserts a comment starter.  Otherwise it does not insert the
+terminator and starter, so it effectively continues the current
+comment across multiple lines.  In languages that allow multi-line
+comments, the choice of value for this variable is a matter of taste.
+The default for this variable depends on the major mode.
+
+@vindex comment-indent-function
+  The variable @code{comment-indent-function} should contain a function
+that will be called to compute the alignment for a newly inserted
+comment or for aligning an existing comment.  It is set differently by
+various major modes.  The function is called with no arguments, but with
+point at the beginning of the comment, or at the end of a line if a new
+comment is to be inserted.  It should return the column in which the
+comment ought to start.  For example, in Lisp mode, the indent hook
+function bases its decision on how many semicolons begin an existing
+comment, and on the code in the preceding lines.
+
+@node Documentation
+@section Documentation Lookup
+
+  Emacs provides several features you can use to look up the
+documentation of functions, variables and commands that you plan to
+use in your program.
+
+@menu
+* Info Lookup::         Looking up library functions and commands
+                          in Info files.
+* Man Page::            Looking up man pages of library functions and commands.
+* Lisp Doc::            Looking up Emacs Lisp functions, etc.
+@end menu
+
+@node Info Lookup
+@subsection Info Documentation Lookup
+
+@findex info-lookup-symbol
+@findex info-lookup-file
+@kindex C-h S
+  For many major modes, that apply to languages that have
+documentation in Info, you can use @kbd{C-h S}
+(@code{info-lookup-symbol}) to view the Info documentation for a
+symbol used in the program.  You specify the symbol with the
+minibuffer; the default is the symbol appearing in the buffer at
+point.  For example, in C mode this looks for the symbol in the C
+Library Manual.  The command only works if the appropriate manual's
+Info files are installed.
+
+  The major mode determines where to look for documentation for the
+symbol---which Info files to look in, and which indices to search.
+You can also use @kbd{M-x info-lookup-file} to look for documentation
+for a file name.
+
+  If you use @kbd{C-h S} in a major mode that does not support it,
+it asks you to specify the ``symbol help mode.''  You should enter
+a command such as @code{c-mode} that would select a major
+mode which @kbd{C-h S} does support.
+
+@node Man Page
+@subsection Man Page Lookup
+
+@cindex manual page
+  On Unix, the main form of on-line documentation was the @dfn{manual
+page} or @dfn{man page}.  In the GNU operating system, we aim to
+replace man pages with better-organized manuals that you can browse
+with Info (@pxref{Misc Help}).  This process is not finished, so it is
+still useful to read manual pages.
+
+@findex manual-entry
+  You can read the man page for an operating system command, library
+function, or system call, with the @kbd{M-x man} command.  It
+runs the @code{man} program to format the man page; if the system
+permits, it runs @code{man} asynchronously, so that you can keep on
+editing while the page is being formatted.  (On MS-DOS and MS-Windows
+3, you cannot edit while Emacs waits for @code{man} to finish.)  The
+result goes in a buffer named @samp{*Man @var{topic}*}.  These buffers
+use a special major mode, Man mode, that facilitates scrolling and
+jumping to other manual pages.  For details, type @kbd{C-h m} while in
+a man page buffer.
+
+@cindex sections of manual pages
+  Each man page belongs to one of ten or more @dfn{sections}, each
+named by a digit or by a digit and a letter.  Sometimes there are
+multiple man pages with the same name in different sections.  To read
+a man page from a specific section, type
+@samp{@var{topic}(@var{section})} or @samp{@var{section} @var{topic}}
+when @kbd{M-x manual-entry} prompts for the topic.  For example, to
+read the man page for the C library function @code{chmod} (as opposed
+to a command of the same name), type @kbd{M-x manual-entry @key{RET}
+chmod(2) @key{RET}}.  (@code{chmod} is a system call, so it is in
+section @samp{2}.)
+
+@vindex Man-switches
+  If you do not specify a section, the results depend on how the
+@code{man} program works on your system.  Some of them display only
+the first man page they find.  Others display all man pages that have
+the specified name, so you can move between them with the @kbd{M-n}
+and @kbd{M-p} keys@footnote{On some systems, the @code{man} program
+accepts a @samp{-a} command-line option which tells it to display all
+the man pages for the specified topic.  If you want this behavior, you
+can add this option to the value of the variable @code{Man-switches}.}.
+The mode line shows how many manual pages are present in the Man buffer.
+
+@vindex Man-fontify-manpage-flag
+  By default, Emacs highlights the text in man pages.  For a long man
+page, highlighting can take substantial time.  You can turn off
+highlighting of man pages by setting the variable
+@code{Man-fontify-manpage-flag} to @code{nil}.
+
+@findex Man-fontify-manpage
+  If you insert the text of a man page into an Emacs buffer in some
+other fashion, you can use the command @kbd{M-x Man-fontify-manpage} to
+perform the same conversions that @kbd{M-x manual-entry} does.
+
+@findex woman
+@cindex manual pages, on MS-DOS/MS-Windows
+  An alternative way of reading manual pages is the @kbd{M-x woman}
+command@footnote{The name of the command, @code{woman}, is an acronym
+for ``w/o (without) man,'' since it doesn't use the @code{man}
+program.}.  Unlike @kbd{M-x man}, it does not run any external
+programs to format and display the man pages; instead it does the job
+in Emacs Lisp, so it works on systems such as MS-Windows, where the
+@code{man} program (and other programs it uses) are not generally
+available.
+
+  @kbd{M-x woman} prompts for a name of a manual page, and provides
+completion based on the list of manual pages that are installed on
+your machine; the list of available manual pages is computed
+automatically the first time you invoke @code{woman}.  The word at
+point in the current buffer is used to suggest the default for the
+name the manual page.
+
+  With a numeric argument, @kbd{M-x woman} recomputes the list of the
+manual pages used for completion.  This is useful if you add or delete
+manual pages.
+
+  If you type a name of a manual page and @kbd{M-x woman} finds that
+several manual pages by the same name exist in different sections, it
+pops up a window with possible candidates asking you to choose one of
+them.
+
+  For more information about setting up and using @kbd{M-x woman}, see
+@ref{Top, WoMan, Browse UN*X Manual Pages WithOut Man, woman, The WoMan
+Manual}.
+
+@node Lisp Doc
+@subsection Emacs Lisp Documentation Lookup
+
+  As you edit Lisp code to be run in Emacs, you can use the commands
+@kbd{C-h f} (@code{describe-function}) and @kbd{C-h v}
+(@code{describe-variable}) to view documentation of functions and
+variables that you want to use.  These commands use the minibuffer to
+read the name of a function or variable to document, and display the
+documentation in a window.  Their default arguments are based on the
+code in the neighborhood of point.  For @kbd{C-h f}, the default is
+the function called in the innermost list containing point.  @kbd{C-h
+v} uses the symbol name around or adjacent to point as its default.
+
+@cindex Eldoc mode
+@findex eldoc-mode
+  A more automatic but less powerful method is Eldoc mode.  This minor
+mode constantly displays in the echo area the argument list for the
+function being called at point.  (In other words, it finds the
+function call that point is contained in, and displays the argument
+list of that function.)  If point is over a documented variable, it
+shows the first line of the variable's docstring.  Eldoc mode applies
+in Emacs Lisp and Lisp Interaction modes, and perhaps a few others
+that provide special support for looking up doc strings.  Use the
+command @kbd{M-x eldoc-mode} to enable or disable this feature.
+
+@node Hideshow
+@section Hideshow minor mode
+
+@findex hs-minor-mode
+  Hideshow minor mode provides selective display of portions of a
+program, known as @dfn{blocks}.  You can use @kbd{M-x hs-minor-mode}
+to enable or disable this mode, or add @code{hs-minor-mode} to the
+mode hook for certain major modes in order to enable it automatically
+for those modes.
+
+  Just what constitutes a block depends on the major mode.  In C mode
+or C++ mode, they are delimited by braces, while in Lisp mode and
+similar modes they are delimited by parentheses.  Multi-line comments
+also count as blocks.
+
+@findex hs-hide-all
+@findex hs-hide-block
+@findex hs-show-all
+@findex hs-show-block
+@findex hs-show-region
+@findex hs-hide-level
+@findex hs-minor-mode
+@kindex C-c @@ C-h
+@kindex C-c @@ C-s
+@kindex C-c @@ C-M-h
+@kindex C-c @@ C-M-s
+@kindex C-c @@ C-r
+@kindex C-c @@ C-l
+@kindex S-Mouse-2
+@table @kbd
+@item C-c @@ C-h
+Hide the current block (@code{hs-hide-block}).
+@item C-c @@ C-s
+Show the current block (@code{hs-show-block}).
+@item C-c @@ C-c
+Either hide or show the current block (@code{hs-toggle-hiding}).
+@item S-Mouse-2
+Either hide or show the block you click on (@code{hs-mouse-toggle-hiding}).
+@item C-c @@ C-M-h
+Hide all top-level blocks (@code{hs-hide-all}).
+@item C-c @@ C-M-s
+Show everything in the buffer (@code{hs-show-all}).
+@item C-c @@ C-l
+Hide all blocks @var{n} levels below this block
+(@code{hs-hide-level}).
+@end table
+
+@vindex hs-hide-comments-when-hiding-all
+@vindex hs-isearch-open
+@vindex hs-special-modes-alist
+  These variables exist for customizing Hideshow mode.
+
+@table @code
+@item hs-hide-comments-when-hiding-all
+Non-@code{nil} says that @kbd{hs-hide-all} should hide comments too.
+
+@item hs-isearch-open
+Specifies what kind of hidden blocks incremental search should make
+visible.  The value should be one of these four symbols:
+
+@table @code
+@item code
+Open only code blocks.
+@item comment
+Open only comments.
+@item t
+Open both code blocks and comments.
+@item nil
+Open neither code blocks nor comments.
+@end table
+
+@item hs-special-modes-alist
+A list of elements, each specifying how to initialize Hideshow
+variables for one major mode.  See the variable's documentation string
+for more information.
+@end table
+
+@node Symbol Completion
+@section Completion for Symbol Names
+@cindex completion (symbol names)
+
+  In Emacs, completion is something you normally do in the minibuffer.
+But one kind of completion is available in all buffers: completion for
+symbol names.
+
+@kindex M-TAB
+  The character @kbd{M-@key{TAB}} runs a command to complete the
+partial symbol before point against the set of meaningful symbol
+names.  This command inserts at point any additional characters that
+it can determine from the partial name.
+
+  If your window manager defines @kbd{M-@key{TAB}} to switch windows,
+you can type @kbd{@key{ESC} @key{TAB}} or @kbd{C-M-i} instead.
+However, most window managers let you customize these shortcuts, and
+we recommend that you change any that get in the way of use of Emacs.
+
+  If the partial name in the buffer has multiple possible completions
+that differ in the very next character, so that it is impossible to
+complete even one more character, @kbd{M-@key{TAB}} displays a list of
+all possible completions in another window.
+
+@cindex tags-based completion
+@cindex Info index completion
+@findex complete-symbol
+  In most programming language major modes, @kbd{M-@key{TAB}} runs the
+command @code{complete-symbol}, which provides two kinds of completion.
+Normally it does completion based on a tags table (@pxref{Tags}); with a
+numeric argument (regardless of the value), it does completion based on
+the names listed in the Info file indexes for your language.  Thus, to
+complete the name of a symbol defined in your own program, use
+@kbd{M-@key{TAB}} with no argument; to complete the name of a standard
+library function, use @kbd{C-u M-@key{TAB}}.  Of course, Info-based
+completion works only if there is an Info file for the standard library
+functions of your language, and only if it is installed at your site.
+
+@cindex Lisp symbol completion
+@cindex completion (Lisp symbols)
+@findex lisp-complete-symbol
+  In Emacs-Lisp mode, the name space for completion normally consists of
+nontrivial symbols present in Emacs---those that have function
+definitions, values or properties.  However, if there is an
+open-parenthesis immediately before the beginning of the partial symbol,
+only symbols with function definitions are considered as completions.
+The command which implements this is @code{lisp-complete-symbol}.
+
+  In Text mode and related modes, @kbd{M-@key{TAB}} completes words
+based on the spell-checker's dictionary.  @xref{Spelling}.
+
+@node Glasses
+@section Glasses minor mode
+@cindex Glasses mode
+@cindex identifiers, making long ones readable
+@cindex StudlyCaps, making them readable
+@findex glasses-mode
+
+  Glasses minor mode makes @samp{unreadableIdentifiersLikeThis}
+readable by altering the way they display.  It knows two different
+ways to do this: by displaying underscores between a lower-case letter
+and the following capital letter, and by emboldening the capital
+letters.  It does not alter the buffer text, only the way they
+display, so you can use it even on read-only buffers.  You can use the
+command @kbd{M-x glasses-mode} to enable or disable the mode in the
+current buffer; you can also add @code{glasses-mode} to the mode hook
+of the programming language major modes in which you normally want
+to use Glasses mode.
+
+@node Misc for Programs
+@section Other Features Useful for Editing Programs
+
+  A number of Emacs commands that aren't designed specifically for
+editing programs are useful for that nonetheless.
+
+  The Emacs commands that operate on words, sentences and paragraphs
+are useful for editing code.  Most symbols names contain words
+(@pxref{Words}); sentences can be found in strings and comments
+(@pxref{Sentences}).  Paragraphs in the strict sense can be found in
+program code (in long comments), but the paragraph commands are useful
+in other places too, because programming language major modes define
+paragraphs to begin and end at blank lines (@pxref{Paragraphs}).
+Judicious use of blank lines to make the program clearer will also
+provide useful chunks of text for the paragraph commands to work on.
+Auto Fill mode, if enabled in a programming language major mode,
+indents the new lines which it creates.
+
+  The selective display feature is useful for looking at the overall
+structure of a function (@pxref{Selective Display}).  This feature
+hides the lines that are indented more than a specified amount.
+Programming modes often support Outline minor mode (@pxref{Outline
+Mode}).  The Foldout package provides folding-editor features
+(@pxref{Foldout}).
+
+  The ``automatic typing'' features may be useful for writing programs.
+@xref{Top,,Autotyping, autotype, Autotyping}.
+
+@node C Modes
+@section C and Related Modes
+@cindex C mode
+@cindex Java mode
+@cindex Pike mode
+@cindex IDL mode
+@cindex CORBA IDL mode
+@cindex Objective C mode
+@cindex C++ mode
+@cindex AWK mode
+@cindex mode, Java
+@cindex mode, C
+@cindex mode, C++
+@cindex mode, Objective C
+@cindex mode, CORBA IDL
+@cindex mode, Pike
+@cindex mode, AWK
+
+  This section gives a brief description of the special features
+available in C, C++, Objective-C, Java, CORBA IDL, Pike and AWK modes.
+(These are called ``C mode and related modes.'')  @xref{Top, , CC Mode,
+ccmode, CC Mode}, for a more extensive description of these modes
+and their special features.
+
+@menu
+* Motion in C::                 Commands to move by C statements, etc.
+* Electric C::                  Colon and other chars can automatically reindent.
+* Hungry Delete::               A more powerful DEL command.
+* Other C Commands::            Filling comments, viewing expansion of macros,
+                                and other neat features.
+@end menu
+
+@node Motion in C
+@subsection C Mode Motion Commands
+
+  This section describes commands for moving point, in C mode and
+related modes.
+
+@table @code
+@item M-x c-beginning-of-defun
+@itemx M-x c-end-of-defun
+@findex c-beginning-of-defun
+@findex c-end-of-defun
+Move point to the beginning or end of the current function or
+top-level definition.  These are found by searching for the least
+enclosing braces.  (By contrast, @code{beginning-of-defun} and
+@code{end-of-defun} search for braces in column zero.)  If you are
+editing code where the opening brace of a function isn't placed in
+column zero, you may wish to bind @code{C-M-a} and @code{C-M-e} to
+these commands.  @xref{Moving by Defuns}.
+
+@item C-c C-u
+@kindex C-c C-u @r{(C mode)}
+@findex c-up-conditional
+Move point back to the containing preprocessor conditional, leaving the
+mark behind.  A prefix argument acts as a repeat count.  With a negative
+argument, move point forward to the end of the containing
+preprocessor conditional.
+
+@samp{#elif} is equivalent to @samp{#else} followed by @samp{#if}, so
+the function will stop at a @samp{#elif} when going backward, but not
+when going forward.
+
+@item C-c C-p
+@kindex C-c C-p @r{(C mode)}
+@findex c-backward-conditional
+Move point back over a preprocessor conditional, leaving the mark
+behind.  A prefix argument acts as a repeat count.  With a negative
+argument, move forward.
+
+@item C-c C-n
+@kindex C-c C-n @r{(C mode)}
+@findex c-forward-conditional
+Move point forward across a preprocessor conditional, leaving the mark
+behind.  A prefix argument acts as a repeat count.  With a negative
+argument, move backward.
+
+@item M-a
+@kindex M-a (C mode)
+@findex c-beginning-of-statement
+Move point to the beginning of the innermost C statement
+(@code{c-beginning-of-statement}).  If point is already at the beginning
+of a statement, move to the beginning of the preceding statement.  With
+prefix argument @var{n}, move back @var{n} @minus{} 1 statements.
+
+In comments or in strings which span more than one line, this command
+moves by sentences instead of statements.
+
+@item M-e
+@kindex M-e (C mode)
+@findex c-end-of-statement
+Move point to the end of the innermost C statement or sentence; like
+@kbd{M-a} except that it moves in the other direction
+(@code{c-end-of-statement}).
+@end table
+
+@node Electric C
+@subsection Electric C Characters
+
+  In C mode and related modes, certain printing characters are
+@dfn{electric}---in addition to inserting themselves, they also
+reindent the current line, and optionally also insert newlines.  The
+``electric'' characters are @kbd{@{}, @kbd{@}}, @kbd{:}, @kbd{#},
+@kbd{;}, @kbd{,}, @kbd{<}, @kbd{>}, @kbd{/}, @kbd{*}, @kbd{(}, and
+@kbd{)}.
+
+  You might find electric indentation inconvenient if you are editing
+chaotically indented code.  If you are new to CC Mode, you might find
+it disconcerting.  You can toggle electric action with the command
+@kbd{C-c C-l}; when it is enabled, @samp{/l} appears in the mode line
+after the mode name:
+
+@table @kbd
+@item C-c C-l
+@kindex C-c C-l @r{(C mode)}
+@findex c-toggle-electric-state
+Toggle electric action (@code{c-toggle-electric-state}).  With a
+prefix argument, this command enables electric action if the argument
+is positive, disables it if it is negative.
+@end table
+
+  Electric characters insert newlines only when, in addition to the
+electric state, the @dfn{auto-newline} feature is enabled (indicated
+by @samp{/la} in the mode line after the mode name).  You can turn
+this feature on or off with the command @kbd{C-c C-a}:
+
+@table @kbd
+@item C-c C-a
+@kindex C-c C-a @r{(C mode)}
+@findex c-toggle-auto-newline
+Toggle the auto-newline feature (@code{c-toggle-auto-newline}).  With a
+prefix argument, this command turns the auto-newline feature on if the
+argument is positive, and off if it is negative.
+@end table
+
+  Usually the CC Mode style configures the exact circumstances in
+which Emacs inserts auto-newlines.  You can also configure this
+directly.  @xref{Custom Auto-newlines,,, ccmode, The CC Mode Manual}.
+
+@node Hungry Delete
+@subsection Hungry Delete Feature in C
+@cindex hungry deletion (C Mode)
+
+  If you want to delete an entire block of whitespace at point, you
+can use @dfn{hungry deletion}.  This deletes all the contiguous
+whitespace either before point or after point in a single operation.
+@dfn{Whitespace} here includes tabs and newlines, but not comments or
+preprocessor commands.
+
+@table @kbd
+@item C-c C-@key{DEL}
+@itemx C-c @key{DEL}
+@findex c-hungry-delete-backwards
+@kindex C-c C-@key{DEL} (C Mode)
+@kindex C-c @key{DEL} (C Mode)
+@code{c-hungry-delete-backwards}---Delete the entire block of whitespace
+preceding point.
+
+@item C-c C-d
+@itemx C-c C-@key{DELETE}
+@itemx C-c @key{DELETE}
+@findex c-hungry-delete-forward
+@kindex C-c C-d (C Mode)
+@kindex C-c C-@key{DELETE} (C Mode)
+@kindex C-c @key{DELETE} (C Mode)
+@code{c-hungry-delete-forward}---Delete the entire block of whitespace
+following point.
+@end table
+
+  As an alternative to the above commands, you can enable @dfn{hungry
+delete mode}.  When this feature is enabled (indicated by @samp{/h} in
+the mode line after the mode name), a single @key{DEL} deletes all
+preceding whitespace, not just one space, and a single @kbd{C-c C-d}
+(but @emph{not} plain @key{DELETE}) deletes all following whitespace.
+
+@table @kbd
+@item M-x c-toggle-hungry-state
+@findex c-toggle-hungry-state
+Toggle the hungry-delete feature
+(@code{c-toggle-hungry-state})@footnote{This command had the binding
+@kbd{C-c C-d} in earlier versions of Emacs.  @kbd{C-c C-d} is now
+bound to @code{c-hungry-delete-forward}.}.  With a prefix argument,
+this command turns the hungry-delete feature on if the argument is
+positive, and off if it is negative.
+@end table
+
+@vindex c-hungry-delete-key
+   The variable @code{c-hungry-delete-key} controls whether the
+hungry-delete feature is enabled.
+
+@node Other C Commands
+@subsection Other Commands for C Mode
+
+@table @kbd
+@item C-c C-w
+@itemx M-x c-subword-mode
+@findex c-subword-mode
+Enable (or disable) @dfn{subword mode}.  In subword mode, Emacs's word
+commands recognize upper case letters in
+@samp{StudlyCapsIdentifiers} as word boundaries.  This is indicated by
+the flag @samp{/w} on the mode line after the mode name
+(e.g. @samp{C/law}).  You can even use @kbd{M-x c-subword-mode} in
+non-CC Mode buffers.
+
+In the GNU project, we recommend using underscores to separate words
+within an identifier in C or C++, rather than using case distinctions.
+
+@item M-x c-context-line-break
+@findex c-context-line-break
+This command inserts a line break and indents the new line in a manner
+appropriate to the context.  In normal code, it does the work of
+@kbd{C-j} (@code{newline-and-indent}), in a C preprocessor line it
+additionally inserts a @samp{\} at the line break, and within comments
+it's like @kbd{M-j} (@code{c-indent-new-comment-line}).
+
+@code{c-context-line-break} isn't bound to a key by default, but it
+needs a binding to be useful.  The following code will bind it to
+@kbd{C-j}.  We use @code{c-initialization-hook} here to make sure
+the keymap is loaded before we try to change it.
+
+@smallexample
+(defun my-bind-clb ()
+  (define-key c-mode-base-map "\C-j" 'c-context-line-break))
+(add-hook 'c-initialization-hook 'my-bind-clb)
+@end smallexample
+
+@item C-M-h
+Put mark at the end of a function definition, and put point at the
+beginning (@code{c-mark-function}).
+
+@item M-q
+@kindex M-q @r{(C mode)}
+@findex c-fill-paragraph
+Fill a paragraph, handling C and C++ comments (@code{c-fill-paragraph}).
+If any part of the current line is a comment or within a comment, this
+command fills the comment or the paragraph of it that point is in,
+preserving the comment indentation and comment delimiters.
+
+@item C-c C-e
+@cindex macro expansion in C
+@cindex expansion of C macros
+@findex c-macro-expand
+@kindex C-c C-e @r{(C mode)}
+Run the C preprocessor on the text in the region, and show the result,
+which includes the expansion of all the macro calls
+(@code{c-macro-expand}).  The buffer text before the region is also
+included in preprocessing, for the sake of macros defined there, but the
+output from this part isn't shown.
+
+When you are debugging C code that uses macros, sometimes it is hard to
+figure out precisely how the macros expand.  With this command, you
+don't have to figure it out; you can see the expansions.
+
+@item C-c C-\
+@findex c-backslash-region
+@kindex C-c C-\ @r{(C mode)}
+Insert or align @samp{\} characters at the ends of the lines of the
+region (@code{c-backslash-region}).  This is useful after writing or
+editing a C macro definition.
+
+If a line already ends in @samp{\}, this command adjusts the amount of
+whitespace before it.  Otherwise, it inserts a new @samp{\}.  However,
+the last line in the region is treated specially; no @samp{\} is
+inserted on that line, and any @samp{\} there is deleted.
+
+@item M-x cpp-highlight-buffer
+@cindex preprocessor highlighting
+@findex cpp-highlight-buffer
+Highlight parts of the text according to its preprocessor conditionals.
+This command displays another buffer named @samp{*CPP Edit*}, which
+serves as a graphic menu for selecting how to display particular kinds
+of conditionals and their contents.  After changing various settings,
+click on @samp{[A]pply these settings} (or go to that buffer and type
+@kbd{a}) to rehighlight the C mode buffer accordingly.
+
+@item C-c C-s
+@findex c-show-syntactic-information
+@kindex C-c C-s @r{(C mode)}
+Display the syntactic information about the current source line
+(@code{c-show-syntactic-information}).  This information directs how
+the line is indented.
+
+@item M-x cwarn-mode
+@itemx M-x global-cwarn-mode
+@findex cwarn-mode
+@findex global-cwarn-mode
+@vindex global-cwarn-mode
+@cindex CWarn mode
+@cindex suspicious constructions in C, C++
+CWarn minor mode highlights certain suspicious C and C++ constructions:
+
+@itemize @bullet{}
+@item
+Assignments inside expressions.
+@item
+Semicolon following immediately after @samp{if}, @samp{for}, and @samp{while}
+(except after a @samp{do @dots{} while} statement);
+@item
+C++ functions with reference parameters.
+@end itemize
+
+@noindent
+You can enable the mode for one buffer with the command @kbd{M-x
+cwarn-mode}, or for all suitable buffers with the command @kbd{M-x
+global-cwarn-mode} or by customizing the variable
+@code{global-cwarn-mode}.  You must also enable Font Lock mode to make
+it work.
+
+@item M-x hide-ifdef-mode
+@findex hide-ifdef-mode
+@cindex Hide-ifdef mode
+Hide-ifdef minor mode hides selected code within @samp{#if} and
+@samp{#ifdef} preprocessor blocks.  See the documentation string of
+@code{hide-ifdef-mode} for more information.
+
+@item M-x ff-find-related-file
+@cindex related files
+@findex ff-find-related-file
+@vindex ff-related-file-alist
+Find a file ``related'' in a special way to the file visited by the
+current buffer.  Typically this will be the header file corresponding
+to a C/C++ source file, or vice versa.  The variable
+@code{ff-related-file-alist} specifies how to compute related file
+names.
+@end table
+
+@node Asm Mode
+@section Asm Mode
+
+@cindex Asm mode
+@cindex assembler mode
+Asm mode is a major mode for editing files of assembler code.  It
+defines these commands:
+
+@table @kbd
+@item @key{TAB}
+@code{tab-to-tab-stop}.
+@item C-j
+Insert a newline and then indent using @code{tab-to-tab-stop}.
+@item :
+Insert a colon and then remove the indentation from before the label
+preceding colon.  Then do @code{tab-to-tab-stop}.
+@item ;
+Insert or align a comment.
+@end table
+
+  The variable @code{asm-comment-char} specifies which character
+starts comments in assembler syntax.
+
+@ifnottex
+@include fortran-xtra.texi
+@end ifnottex
+
+@ignore
+   arch-tag: c7ee7409-40a4-45c7-bfb7-ae7f2c74d0c0
+@end ignore
similarity index 100%
rename from man/regs.texi
rename to doc/emacs/regs.texi
similarity index 99%
rename from man/rmail.texi
rename to doc/emacs/rmail.texi
index 7c36a31ff18da6cf26ac43a710fb282b464d5f2b..9ccdffedca156b606d8ee5c2b9c9946b9575d826 100644 (file)
@@ -955,27 +955,36 @@ Rmail by saving the Rmail file and switching to another buffer.
 
 @node Rmail Sorting
 @section Sorting the Rmail File
+@cindex sorting Rmail file
+@cindex Rmail file sorting
 
 @table @kbd
+@findex rmail-sort-by-date
 @item M-x rmail-sort-by-date
 Sort messages of current Rmail file by date.
 
+@findex rmail-sort-by-subject
 @item M-x rmail-sort-by-subject
 Sort messages of current Rmail file by subject.
 
+@findex rmail-sort-by-author
 @item M-x rmail-sort-by-author
 Sort messages of current Rmail file by author's name.
 
+@findex rmail-sort-by-recipient
 @item M-x rmail-sort-by-recipient
 Sort messages of current Rmail file by recipient's names.
 
+@findex rmail-sort-by-correspondent
 @item M-x rmail-sort-by-correspondent
 Sort messages of current Rmail file by the name of the other
 correspondent.
 
+@findex rmail-sort-by-lines
 @item M-x rmail-sort-by-lines
 Sort messages of current Rmail file by size (number of lines).
 
+@findex rmail-sort-by-keywords
 @item M-x rmail-sort-by-keywords @key{RET} @var{labels} @key{RET}
 Sort messages of current Rmail file by labels.  The argument
 @var{labels} should be a comma-separated list of labels.  The order of
similarity index 100%
rename from man/screen.texi
rename to doc/emacs/screen.texi
diff --git a/doc/emacs/search.texi b/doc/emacs/search.texi
new file mode 100644 (file)
index 0000000..1a8a637
--- /dev/null
@@ -0,0 +1,1361 @@
+@c This is part of the Emacs manual.
+@c Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995, 1997, 2000, 2001, 2002,
+@c   2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+@c See file emacs.texi for copying conditions.
+@node Search, Fixit, Display, Top
+@chapter Searching and Replacement
+@cindex searching
+@cindex finding strings within text
+
+  Like other editors, Emacs has commands for searching for occurrences of
+a string.  The principal search command is unusual in that it is
+@dfn{incremental}; it begins to search before you have finished typing the
+search string.  There are also nonincremental search commands more like
+those of other editors.
+
+  Besides the usual @code{replace-string} command that finds all
+occurrences of one string and replaces them with another, Emacs has a
+more flexible replacement command called @code{query-replace}, which
+asks interactively which occurrences to replace.  There are also
+commands to find and operate on all matches for a pattern.
+
+  You can also search multiple files under control of a tags
+table (@pxref{Tags Search}) or through the Dired @kbd{A} command
+(@pxref{Operating on Files}), or ask the @code{grep} program to do it
+(@pxref{Grep Searching}).
+
+
+@menu
+* Incremental Search::         Search happens as you type the string.
+* Nonincremental Search::      Specify entire string and then search.
+* Word Search::                        Search for sequence of words.
+* Regexp Search::              Search for match for a regexp.
+* Regexps::                    Syntax of regular expressions.
+* Regexp Backslash::            Regular expression constructs starting with `\'.
+* Regexp Example::              A complex regular expression explained.
+* Search Case::                        To ignore case while searching, or not.
+* Replace::                    Search, and replace some or all matches.
+* Other Repeating Search::     Operating on all matches for some regexp.
+@end menu
+
+@node Incremental Search
+@section Incremental Search
+@cindex incremental search
+@cindex isearch
+
+  An incremental search begins searching as soon as you type the first
+character of the search string.  As you type in the search string, Emacs
+shows you where the string (as you have typed it so far) would be
+found.  When you have typed enough characters to identify the place you
+want, you can stop.  Depending on what you plan to do next, you may or
+may not need to terminate the search explicitly with @key{RET}.
+
+@table @kbd
+@item C-s
+Incremental search forward (@code{isearch-forward}).
+@item C-r
+Incremental search backward (@code{isearch-backward}).
+@end table
+
+@menu
+* Basic Isearch::       Basic incremental search commands.
+* Repeat Isearch::      Searching for the same string again.
+* Error in Isearch::    When your string is not found.
+* Special Isearch::     Special input in incremental search.
+* Non-ASCII Isearch::   How to search for non-ASCII characters.
+* Isearch Yank::        Commands that grab text into the search string
+                          or else edit the search string.
+* Highlight Isearch::   Isearch highlights the other possible matches.
+* Isearch Scroll::      Scrolling during an incremental search.
+* Slow Isearch::        Incremental search features for slow terminals.
+@end menu
+
+@node Basic Isearch
+@subsection Basics of Incremental Search
+
+@kindex C-s
+@findex isearch-forward
+  @kbd{C-s} starts a forward incremental search.  It reads characters
+from the keyboard, and moves point past the next occurrence of those
+characters.  If you type @kbd{C-s} and then @kbd{F}, that puts the
+cursor after the first @samp{F} (the first following the starting point, since
+this is a forward search).  Then if you type an @kbd{O}, you will see
+the cursor move to just after the first @samp{FO} (the @samp{F} in that
+@samp{FO} may or may not be the first @samp{F}).  After another
+@kbd{O}, the cursor moves to just after the first @samp{FOO} after the place
+where you started the search.  At each step, the buffer text that
+matches the search string is highlighted, if the terminal can do that;
+the current search string is always displayed in the echo area.
+
+  If you make a mistake in typing the search string, you can cancel
+characters with @key{DEL}.  Each @key{DEL} cancels the last character of
+search string.  This does not happen until Emacs is ready to read another
+input character; first it must either find, or fail to find, the character
+you want to erase.  If you do not want to wait for this to happen, use
+@kbd{C-g} as described below.
+
+  When you are satisfied with the place you have reached, you can type
+@key{RET}, which stops searching, leaving the cursor where the search
+brought it.  Also, any command not specially meaningful in searches
+stops the searching and is then executed.  Thus, typing @kbd{C-a}
+would exit the search and then move to the beginning of the line.
+@key{RET} is necessary only if the next command you want to type is a
+printing character, @key{DEL}, @key{RET}, or another character that is
+special within searches (@kbd{C-q}, @kbd{C-w}, @kbd{C-r}, @kbd{C-s},
+@kbd{C-y}, @kbd{M-y}, @kbd{M-r}, @kbd{M-c}, @kbd{M-e}, and some other
+meta-characters).
+
+  When you exit the incremental search, it sets the mark where point
+@emph{was} before the search.  That is convenient for moving back
+there.  In Transient Mark mode, incremental search sets the mark
+without activating it, and does so only if the mark is not already
+active.
+
+@node Repeat Isearch
+@subsection Repeating Incremental Search
+
+  Sometimes you search for @samp{FOO} and find one, but not the one you
+expected to find.  There was a second @samp{FOO} that you forgot
+about, before the one you were aiming for.  In this event, type
+another @kbd{C-s} to move to the next occurrence of the search string.
+You can repeat this any number of times.  If you overshoot, you can
+cancel some @kbd{C-s} characters with @key{DEL}.
+
+  After you exit a search, you can search for the same string again by
+typing just @kbd{C-s C-s}: the first @kbd{C-s} is the key that invokes
+incremental search, and the second @kbd{C-s} means ``search again.''
+
+  If a search is failing and you ask to repeat it by typing another
+@kbd{C-s}, it starts again from the beginning of the buffer.
+Repeating a failing reverse search with @kbd{C-r} starts again from
+the end.  This is called @dfn{wrapping around}, and @samp{Wrapped}
+appears in the search prompt once this has happened.  If you keep on
+going past the original starting point of the search, it changes to
+@samp{Overwrapped}, which means that you are revisiting matches that
+you have already seen.
+
+  To reuse earlier search strings, use the @dfn{search ring}.  The
+commands @kbd{M-p} and @kbd{M-n} move through the ring to pick a search
+string to reuse.  These commands leave the selected search ring element
+in the minibuffer, where you can edit it.  To edit the current search
+string in the minibuffer without replacing it with items from the
+search ring, type @kbd{M-e}.  Type @kbd{C-s} or @kbd{C-r}
+to terminate editing the string and search for it.
+
+  You can change to searching backwards with @kbd{C-r}.  For instance,
+if you are searching forward but you realize you were looking for
+something above the starting point, you can do this.  Repeated
+@kbd{C-r} keeps looking for more occurrences backwards.  A @kbd{C-s}
+starts going forwards again.  @kbd{C-r} in a search can be canceled
+with @key{DEL}.
+
+@kindex C-r
+@findex isearch-backward
+  If you know initially that you want to search backwards, you can use
+@kbd{C-r} instead of @kbd{C-s} to start the search, because @kbd{C-r}
+as a key runs a command (@code{isearch-backward}) to search backward.
+A backward search finds matches that end before the starting point,
+just as a forward search finds matches that begin after it.
+
+@node Error in Isearch
+@subsection Errors in Incremental Search
+
+  If your string is not found at all, the echo area says @samp{Failing
+I-Search}.  The cursor is after the place where Emacs found as much of your
+string as it could.  Thus, if you search for @samp{FOOT}, and there is no
+@samp{FOOT}, you might see the cursor after the @samp{FOO} in @samp{FOOL}.
+At this point there are several things you can do.  If your string was
+mistyped, you can rub some of it out and correct it.  If you like the place
+you have found, you can type @key{RET} or some other Emacs command to
+remain there.  Or you can type @kbd{C-g}, which
+removes from the search string the characters that could not be found (the
+@samp{T} in @samp{FOOT}), leaving those that were found (the @samp{FOO} in
+@samp{FOOT}).  A second @kbd{C-g} at that point cancels the search
+entirely, returning point to where it was when the search started.
+
+@cindex quitting (in search)
+  The @kbd{C-g} ``quit'' character does special things during searches;
+just what it does depends on the status of the search.  If the search has
+found what you specified and is waiting for input, @kbd{C-g} cancels the
+entire search.  The cursor moves back to where you started the search.  If
+@kbd{C-g} is typed when there are characters in the search string that have
+not been found---because Emacs is still searching for them, or because it
+has failed to find them---then the search string characters which have not
+been found are discarded from the search string.  With them gone, the
+search is now successful and waiting for more input, so a second @kbd{C-g}
+will cancel the entire search.
+
+@node Special Isearch
+@subsection Special Input for Incremental Search
+
+  An upper-case letter in the search string makes the search
+case-sensitive.  If you delete the upper-case character from the search
+string, it ceases to have this effect.  @xref{Search Case}.
+
+  To search for a newline, type @kbd{C-j}.  To search for another
+control character, such as control-S or carriage return, you must quote
+it by typing @kbd{C-q} first.  This function of @kbd{C-q} is analogous
+to its use for insertion (@pxref{Inserting Text}): it causes the
+following character to be treated the way any ``ordinary'' character is
+treated in the same context.  You can also specify a character by its
+octal code: enter @kbd{C-q} followed by a sequence of octal digits.
+
+  @kbd{M-%} typed in incremental search invokes @code{query-replace}
+or @code{query-replace-regexp} (depending on search mode) with the
+current search string used as the string to replace.  @xref{Query
+Replace}.
+
+  Entering @key{RET} when the search string is empty launches
+nonincremental search (@pxref{Nonincremental Search}).
+
+@vindex isearch-mode-map
+  To customize the special characters that incremental search understands,
+alter their bindings in the keymap @code{isearch-mode-map}.  For a list
+of bindings, look at the documentation of @code{isearch-mode} with
+@kbd{C-h f isearch-mode @key{RET}}.
+
+@node Non-ASCII Isearch
+@subsection Isearch for Non-@acronym{ASCII} Characters
+@cindex searching for non-@acronym{ASCII} characters
+@cindex input method, during incremental search
+
+  To enter non-@acronym{ASCII} characters in an incremental search,
+you can use @kbd{C-q} (see the previous section), but it is easier to
+use an input method (@pxref{Input Methods}).  If an input method is
+enabled in the current buffer when you start the search, you can use
+it in the search string also.  Emacs indicates that by including the
+input method mnemonic in its prompt, like this:
+
+@example
+I-search [@var{im}]:
+@end example
+
+@noindent
+@findex isearch-toggle-input-method
+@findex isearch-toggle-specified-input-method
+where @var{im} is the mnemonic of the active input method.
+
+  You can toggle (enable or disable) the input method while you type
+the search string with @kbd{C-\} (@code{isearch-toggle-input-method}).
+You can turn on a certain (non-default) input method with @kbd{C-^}
+(@code{isearch-toggle-specified-input-method}), which prompts for the
+name of the input method.  The input method you enable during
+incremental search remains enabled in the current buffer afterwards.
+
+@node Isearch Yank
+@subsection Isearch Yanking
+
+  The characters @kbd{C-w} and @kbd{C-y} can be used in incremental
+search to grab text from the buffer into the search string.  This
+makes it convenient to search for another occurrence of text at point.
+@kbd{C-w} copies the character or word after point as part of the
+search string, advancing point over it.  (The decision, whether to
+copy a character or a word, is heuristic.)  Another @kbd{C-s} to
+repeat the search will then search for a string including that
+character or word.
+
+  @kbd{C-y} is similar to @kbd{C-w} but copies all the rest of the
+current line into the search string.  If point is already at the end
+of a line, it grabs the entire next line.  Both @kbd{C-y} and
+@kbd{C-w} convert the text they copy to lower case if the search is
+currently not case-sensitive; this is so the search remains
+case-insensitive.
+
+  @kbd{C-M-w} and @kbd{C-M-y} modify the search string by only one
+character at a time: @kbd{C-M-w} deletes the last character from the
+search string and @kbd{C-M-y} copies the character after point to the
+end of the search string.  An alternative method to add the character
+after point into the search string is to enter the minibuffer by
+@kbd{M-e} and to type @kbd{C-f} at the end of the search string in the
+minibuffer.
+
+  The character @kbd{M-y} copies text from the kill ring into the search
+string.  It uses the same text that @kbd{C-y} as a command would yank.
+@kbd{Mouse-2} in the echo area does the same.
+@xref{Yanking}.
+
+@node Highlight Isearch
+@subsection Lazy Search Highlighting
+@cindex lazy search highlighting
+@vindex isearch-lazy-highlight
+
+  When you pause for a little while during incremental search, it
+highlights all other possible matches for the search string.  This
+makes it easier to anticipate where you can get to by typing @kbd{C-s}
+or @kbd{C-r} to repeat the search.  The short delay before highlighting
+other matches helps indicate which match is the current one.
+If you don't like this feature, you can turn it off by setting
+@code{isearch-lazy-highlight} to @code{nil}.
+
+@cindex faces for highlighting search matches
+  You can control how this highlighting looks by customizing the faces
+@code{isearch} (used for the current match) and @code{lazy-highlight}
+(for all the other matches).
+
+@node Isearch Scroll
+@subsection Scrolling During Incremental Search
+
+  You can enable the use of vertical scrolling during incremental
+search (without exiting the search) by setting the customizable
+variable @code{isearch-allow-scroll} to a non-@code{nil} value.  This
+applies to using the vertical scroll-bar and to certain keyboard
+commands such as @kbd{@key{PRIOR}} (@code{scroll-down}),
+@kbd{@key{NEXT}} (@code{scroll-up}) and @kbd{C-l} (@code{recenter}).
+You must run these commands via their key sequences to stay in the
+search---typing @kbd{M-x} will terminate the search.  You can give
+prefix arguments to these commands in the usual way.
+
+  This feature won't let you scroll the current match out of visibility,
+however.
+
+  The feature also affects some other commands, such as @kbd{C-x 2}
+(@code{split-window-vertically}) and @kbd{C-x ^}
+(@code{enlarge-window}) which don't exactly scroll but do affect where
+the text appears on the screen.  In general, it applies to any command
+whose name has a non-@code{nil} @code{isearch-scroll} property.  So you
+can control which commands are affected by changing these properties.
+
+  For example, to make @kbd{C-h l} usable within an incremental search
+in all future Emacs sessions, use @kbd{C-h c} to find what command it
+runs.  (You type @kbd{C-h c C-h l}; it says @code{view-lossage}.)
+Then you can put the following line in your @file{.emacs} file
+(@pxref{Init File}):
+
+@example
+(put 'view-lossage 'isearch-scroll t)
+@end example
+
+@noindent
+This feature can be applied to any command that doesn't permanently
+change point, the buffer contents, the match data, the current buffer,
+or the selected window and frame.  The command must not itself attempt
+an incremental search.
+
+@node Slow Isearch
+@subsection Slow Terminal Incremental Search
+
+  Incremental search on a slow terminal uses a modified style of display
+that is designed to take less time.  Instead of redisplaying the buffer at
+each place the search gets to, it creates a new single-line window and uses
+that to display the line that the search has found.  The single-line window
+comes into play as soon as point moves outside of the text that is already
+on the screen.
+
+  When you terminate the search, the single-line window is removed.
+Emacs then redisplays the window in which the search was done, to show
+its new position of point.
+
+@vindex search-slow-speed
+  The slow terminal style of display is used when the terminal baud rate is
+less than or equal to the value of the variable @code{search-slow-speed},
+initially 1200.  See also the discussion of the variable @code{baud-rate}
+(@pxref{baud-rate,, Customization of Display}).
+
+@vindex search-slow-window-lines
+  The number of lines to use in slow terminal search display is controlled
+by the variable @code{search-slow-window-lines}.  Its normal value is 1.
+
+@node Nonincremental Search
+@section Nonincremental Search
+@cindex nonincremental search
+
+  Emacs also has conventional nonincremental search commands, which require
+you to type the entire search string before searching begins.
+
+@table @kbd
+@item C-s @key{RET} @var{string} @key{RET}
+Search for @var{string}.
+@item C-r @key{RET} @var{string} @key{RET}
+Search backward for @var{string}.
+@end table
+
+  To do a nonincremental search, first type @kbd{C-s @key{RET}}.  This
+enters the minibuffer to read the search string; terminate the string
+with @key{RET}, and then the search takes place.  If the string is not
+found, the search command signals an error.
+
+  When you type @kbd{C-s @key{RET}}, the @kbd{C-s} invokes incremental
+search as usual.  That command is specially programmed to invoke
+nonincremental search, @code{search-forward}, if the string you
+specify is empty.  (Such an empty argument would otherwise be
+useless.)  But it does not call @code{search-forward} right away.  First
+it checks the next input character to see if is @kbd{C-w},
+which specifies a word search.
+@ifnottex
+@xref{Word Search}.
+@end ifnottex
+@kbd{C-r @key{RET}} does likewise, for a reverse incremental search.
+
+@findex search-forward
+@findex search-backward
+  Forward and backward nonincremental searches are implemented by the
+commands @code{search-forward} and @code{search-backward}.  These
+commands may be bound to keys in the usual manner.  The feature that you
+can get to them via the incremental search commands exists for
+historical reasons, and to avoid the need to find separate key sequences
+for them.
+
+@node Word Search
+@section Word Search
+@cindex word search
+
+  Word search searches for a sequence of words without regard to how the
+words are separated.  More precisely, you type a string of many words,
+using single spaces to separate them, and the string can be found even
+if there are multiple spaces, newlines, or other punctuation characters
+between these words.
+
+  Word search is useful for editing a printed document made with a text
+formatter.  If you edit while looking at the printed, formatted version,
+you can't tell where the line breaks are in the source file.  With word
+search, you can search without having to know them.
+
+@table @kbd
+@item C-s @key{RET} C-w @var{words} @key{RET}
+Search for @var{words}, ignoring details of punctuation.
+@item C-r @key{RET} C-w @var{words} @key{RET}
+Search backward for @var{words}, ignoring details of punctuation.
+@end table
+
+  Word search as a special case of nonincremental search is invoked
+with @kbd{C-s @key{RET} C-w}.  This is followed by the search string,
+which must always be terminated with @key{RET}.  Being nonincremental,
+this search does not start until the argument is terminated.  It works
+by constructing a regular expression and searching for that; see
+@ref{Regexp Search}.
+
+  Use @kbd{C-r @key{RET} C-w} to do backward word search.
+
+  You can also invoke word search with @kbd{C-s M-e C-w} or @kbd{C-r
+M-e C-w} followed by the search string and terminated with @key{RET},
+@kbd{C-s} or @kbd{C-r}.  This puts word search into incremental mode
+where you can use all keys available for incremental search.  However,
+when you type more words in incremental word search, it will fail
+until you type complete words.
+
+@findex word-search-forward
+@findex word-search-backward
+  Forward and backward word searches are implemented by the commands
+@code{word-search-forward} and @code{word-search-backward}.  These
+commands may be bound to keys in the usual manner.  They are available
+via the incremental search commands both for historical reasons and
+to avoid the need to find separate key sequences for them.
+
+@node Regexp Search
+@section Regular Expression Search
+@cindex regular expression
+@cindex regexp
+
+  A @dfn{regular expression} (@dfn{regexp}, for short) is a pattern
+that denotes a class of alternative strings to match, possibly
+infinitely many.  GNU Emacs provides both incremental and
+nonincremental ways to search for a match for a regexp.  The syntax of
+regular expressions is explained in the following section.
+
+@kindex C-M-s
+@findex isearch-forward-regexp
+@kindex C-M-r
+@findex isearch-backward-regexp
+  Incremental search for a regexp is done by typing @kbd{C-M-s}
+(@code{isearch-forward-regexp}), by invoking @kbd{C-s} with a
+prefix argument (whose value does not matter), or by typing @kbd{M-r}
+within a forward incremental search.  This command reads a
+search string incrementally just like @kbd{C-s}, but it treats the
+search string as a regexp rather than looking for an exact match
+against the text in the buffer.  Each time you add text to the search
+string, you make the regexp longer, and the new regexp is searched
+for.  To search backward for a regexp, use @kbd{C-M-r}
+(@code{isearch-backward-regexp}), @kbd{C-r} with a prefix argument,
+or @kbd{M-r} within a backward incremental search.
+
+  All of the control characters that do special things within an
+ordinary incremental search have the same function in incremental regexp
+search.  Typing @kbd{C-s} or @kbd{C-r} immediately after starting the
+search retrieves the last incremental search regexp used; that is to
+say, incremental regexp and non-regexp searches have independent
+defaults.  They also have separate search rings that you can access with
+@kbd{M-p} and @kbd{M-n}.
+
+@vindex search-whitespace-regexp
+  If you type @key{SPC} in incremental regexp search, it matches any
+sequence of whitespace characters, including newlines.  If you want to
+match just a space, type @kbd{C-q @key{SPC}}.  You can control what a
+bare space matches by setting the variable
+@code{search-whitespace-regexp} to the desired regexp.
+
+  In some cases, adding characters to the regexp in an incremental regexp
+search can make the cursor move back and start again.  For example, if
+you have searched for @samp{foo} and you add @samp{\|bar}, the cursor
+backs up in case the first @samp{bar} precedes the first @samp{foo}.
+
+  Forward and backward regexp search are not symmetrical, because
+regexp matching in Emacs always operates forward, starting with the
+beginning of the regexp.  Thus, forward regexp search scans forward,
+trying a forward match at each possible starting position.  Backward
+regexp search scans backward, trying a forward match at each possible
+starting position.  These search methods are not mirror images.
+
+@findex re-search-forward
+@findex re-search-backward
+  Nonincremental search for a regexp is done by the functions
+@code{re-search-forward} and @code{re-search-backward}.  You can invoke
+these with @kbd{M-x}, or bind them to keys, or invoke them by way of
+incremental regexp search with @kbd{C-M-s @key{RET}} and @kbd{C-M-r
+@key{RET}}.
+
+  If you use the incremental regexp search commands with a prefix
+argument, they perform ordinary string search, like
+@code{isearch-forward} and @code{isearch-backward}.  @xref{Incremental
+Search}.
+
+@node Regexps
+@section Syntax of Regular Expressions
+@cindex syntax of regexps
+
+  This manual describes regular expression features that users
+typically want to use.  There are additional features that are
+mainly used in Lisp programs; see @ref{Regular Expressions,,,
+elisp, The Emacs Lisp Reference Manual}.
+
+  Regular expressions have a syntax in which a few characters are
+special constructs and the rest are @dfn{ordinary}.  An ordinary
+character is a simple regular expression which matches that same
+character and nothing else.  The special characters are @samp{$},
+@samp{^}, @samp{.}, @samp{*}, @samp{+}, @samp{?}, @samp{[}, and
+@samp{\}.  The character @samp{]} is special if it ends a character
+alternative (see later).  The character @samp{-} is special inside a
+character alternative.  Any other character appearing in a regular
+expression is ordinary, unless a @samp{\} precedes it.  (When you use
+regular expressions in a Lisp program, each @samp{\} must be doubled,
+see the example near the end of this section.)
+
+  For example, @samp{f} is not a special character, so it is ordinary, and
+therefore @samp{f} is a regular expression that matches the string
+@samp{f} and no other string.  (It does @emph{not} match the string
+@samp{ff}.)  Likewise, @samp{o} is a regular expression that matches
+only @samp{o}.  (When case distinctions are being ignored, these regexps
+also match @samp{F} and @samp{O}, but we consider this a generalization
+of ``the same string,'' rather than an exception.)
+
+  Any two regular expressions @var{a} and @var{b} can be concatenated.  The
+result is a regular expression which matches a string if @var{a} matches
+some amount of the beginning of that string and @var{b} matches the rest of
+the string.@refill
+
+  As a simple example, we can concatenate the regular expressions @samp{f}
+and @samp{o} to get the regular expression @samp{fo}, which matches only
+the string @samp{fo}.  Still trivial.  To do something nontrivial, you
+need to use one of the special characters.  Here is a list of them.
+
+@table @asis
+@item @kbd{.}@: @r{(Period)}
+is a special character that matches any single character except a newline.
+Using concatenation, we can make regular expressions like @samp{a.b}, which
+matches any three-character string that begins with @samp{a} and ends with
+@samp{b}.@refill
+
+@item @kbd{*}
+is not a construct by itself; it is a postfix operator that means to
+match the preceding regular expression repetitively as many times as
+possible.  Thus, @samp{o*} matches any number of @samp{o}s (including no
+@samp{o}s).
+
+@samp{*} always applies to the @emph{smallest} possible preceding
+expression.  Thus, @samp{fo*} has a repeating @samp{o}, not a repeating
+@samp{fo}.  It matches @samp{f}, @samp{fo}, @samp{foo}, and so on.
+
+The matcher processes a @samp{*} construct by matching, immediately,
+as many repetitions as can be found.  Then it continues with the rest
+of the pattern.  If that fails, backtracking occurs, discarding some
+of the matches of the @samp{*}-modified construct in case that makes
+it possible to match the rest of the pattern.  For example, in matching
+@samp{ca*ar} against the string @samp{caaar}, the @samp{a*} first
+tries to match all three @samp{a}s; but the rest of the pattern is
+@samp{ar} and there is only @samp{r} left to match, so this try fails.
+The next alternative is for @samp{a*} to match only two @samp{a}s.
+With this choice, the rest of the regexp matches successfully.@refill
+
+@item @kbd{+}
+is a postfix operator, similar to @samp{*} except that it must match
+the preceding expression at least once.  So, for example, @samp{ca+r}
+matches the strings @samp{car} and @samp{caaaar} but not the string
+@samp{cr}, whereas @samp{ca*r} matches all three strings.
+
+@item @kbd{?}
+is a postfix operator, similar to @samp{*} except that it can match the
+preceding expression either once or not at all.  For example,
+@samp{ca?r} matches @samp{car} or @samp{cr}; nothing else.
+
+@item @kbd{*?}, @kbd{+?}, @kbd{??}
+@cindex non-greedy regexp matching
+are non-greedy variants of the operators above.  The normal operators
+@samp{*}, @samp{+}, @samp{?} are @dfn{greedy} in that they match as
+much as they can, as long as the overall regexp can still match.  With
+a following @samp{?}, they are non-greedy: they will match as little
+as possible.
+
+Thus, both @samp{ab*} and @samp{ab*?} can match the string @samp{a}
+and the string @samp{abbbb}; but if you try to match them both against
+the text @samp{abbb}, @samp{ab*} will match it all (the longest valid
+match), while @samp{ab*?}  will match just @samp{a} (the shortest
+valid match).
+
+Non-greedy operators match the shortest possible string starting at a
+given starting point; in a forward search, though, the earliest
+possible starting point for match is always the one chosen.  Thus, if
+you search for @samp{a.*?$} against the text @samp{abbab} followed by
+a newline, it matches the whole string.  Since it @emph{can} match
+starting at the first @samp{a}, it does.
+
+@item @kbd{\@{@var{n}\@}}
+is a postfix operator that specifies repetition @var{n} times---that
+is, the preceding regular expression must match exactly @var{n} times
+in a row.  For example, @samp{x\@{4\@}} matches the string @samp{xxxx}
+and nothing else.
+
+@item @kbd{\@{@var{n},@var{m}\@}}
+is a postfix operator that specifies repetition between @var{n} and
+@var{m} times---that is, the preceding regular expression must match
+at least @var{n} times, but no more than @var{m} times.  If @var{m} is
+omitted, then there is no upper limit, but the preceding regular
+expression must match at least @var{n} times.@* @samp{\@{0,1\@}} is
+equivalent to @samp{?}. @* @samp{\@{0,\@}} is equivalent to
+@samp{*}. @* @samp{\@{1,\@}} is equivalent to @samp{+}.
+
+@item @kbd{[ @dots{} ]}
+is a @dfn{character set}, which begins with @samp{[} and is terminated
+by @samp{]}.  In the simplest case, the characters between the two
+brackets are what this set can match.
+
+Thus, @samp{[ad]} matches either one @samp{a} or one @samp{d}, and
+@samp{[ad]*} matches any string composed of just @samp{a}s and @samp{d}s
+(including the empty string), from which it follows that @samp{c[ad]*r}
+matches @samp{cr}, @samp{car}, @samp{cdr}, @samp{caddaar}, etc.
+
+You can also include character ranges in a character set, by writing the
+starting and ending characters with a @samp{-} between them.  Thus,
+@samp{[a-z]} matches any lower-case @acronym{ASCII} letter.  Ranges may be
+intermixed freely with individual characters, as in @samp{[a-z$%.]},
+which matches any lower-case @acronym{ASCII} letter or @samp{$}, @samp{%} or
+period.
+
+Note that the usual regexp special characters are not special inside a
+character set.  A completely different set of special characters exists
+inside character sets: @samp{]}, @samp{-} and @samp{^}.
+
+To include a @samp{]} in a character set, you must make it the first
+character.  For example, @samp{[]a]} matches @samp{]} or @samp{a}.  To
+include a @samp{-}, write @samp{-} as the first or last character of the
+set, or put it after a range.  Thus, @samp{[]-]} matches both @samp{]}
+and @samp{-}.
+
+To include @samp{^} in a set, put it anywhere but at the beginning of
+the set.  (At the beginning, it complements the set---see below.)
+
+When you use a range in case-insensitive search, you should write both
+ends of the range in upper case, or both in lower case, or both should
+be non-letters.  The behavior of a mixed-case range such as @samp{A-z}
+is somewhat ill-defined, and it may change in future Emacs versions.
+
+@item @kbd{[^ @dots{} ]}
+@samp{[^} begins a @dfn{complemented character set}, which matches any
+character except the ones specified.  Thus, @samp{[^a-z0-9A-Z]} matches
+all characters @emph{except} @acronym{ASCII} letters and digits.
+
+@samp{^} is not special in a character set unless it is the first
+character.  The character following the @samp{^} is treated as if it
+were first (in other words, @samp{-} and @samp{]} are not special there).
+
+A complemented character set can match a newline, unless newline is
+mentioned as one of the characters not to match.  This is in contrast to
+the handling of regexps in programs such as @code{grep}.
+
+@item @kbd{^}
+is a special character that matches the empty string, but only at the
+beginning of a line in the text being matched.  Otherwise it fails to
+match anything.  Thus, @samp{^foo} matches a @samp{foo} that occurs at
+the beginning of a line.
+
+For historical compatibility reasons, @samp{^} can be used with this
+meaning only at the beginning of the regular expression, or after
+@samp{\(} or @samp{\|}.
+
+@item @kbd{$}
+is similar to @samp{^} but matches only at the end of a line.  Thus,
+@samp{x+$} matches a string of one @samp{x} or more at the end of a line.
+
+For historical compatibility reasons, @samp{$} can be used with this
+meaning only at the end of the regular expression, or before @samp{\)}
+or @samp{\|}.
+
+@item @kbd{\}
+has two functions: it quotes the special characters (including
+@samp{\}), and it introduces additional special constructs.
+
+Because @samp{\} quotes special characters, @samp{\$} is a regular
+expression that matches only @samp{$}, and @samp{\[} is a regular
+expression that matches only @samp{[}, and so on.
+
+See the following section for the special constructs that begin
+with @samp{\}.
+@end table
+
+  Note: for historical compatibility, special characters are treated as
+ordinary ones if they are in contexts where their special meanings make no
+sense.  For example, @samp{*foo} treats @samp{*} as ordinary since there is
+no preceding expression on which the @samp{*} can act.  It is poor practice
+to depend on this behavior; it is better to quote the special character anyway,
+regardless of where it appears.
+
+As a @samp{\} is not special inside a character alternative, it can
+never remove the special meaning of @samp{-} or @samp{]}.  So you
+should not quote these characters when they have no special meaning
+either.  This would not clarify anything, since backslashes can
+legitimately precede these characters where they @emph{have} special
+meaning, as in @samp{[^\]} (@code{"[^\\]"} for Lisp string syntax),
+which matches any single character except a backslash.
+
+@node Regexp Backslash
+@section Backslash in Regular Expressions
+
+  For the most part, @samp{\} followed by any character matches only
+that character.  However, there are several exceptions: two-character
+sequences starting with @samp{\} that have special meanings.  The
+second character in the sequence is always an ordinary character when
+used on its own.  Here is a table of @samp{\} constructs.
+
+@table @kbd
+@item \|
+specifies an alternative.  Two regular expressions @var{a} and @var{b}
+with @samp{\|} in between form an expression that matches some text if
+either @var{a} matches it or @var{b} matches it.  It works by trying to
+match @var{a}, and if that fails, by trying to match @var{b}.
+
+Thus, @samp{foo\|bar} matches either @samp{foo} or @samp{bar}
+but no other string.@refill
+
+@samp{\|} applies to the largest possible surrounding expressions.  Only a
+surrounding @samp{\( @dots{} \)} grouping can limit the grouping power of
+@samp{\|}.@refill
+
+Full backtracking capability exists to handle multiple uses of @samp{\|}.
+
+@item \( @dots{} \)
+is a grouping construct that serves three purposes:
+
+@enumerate
+@item
+To enclose a set of @samp{\|} alternatives for other operations.
+Thus, @samp{\(foo\|bar\)x} matches either @samp{foox} or @samp{barx}.
+
+@item
+To enclose a complicated expression for the postfix operators @samp{*},
+@samp{+} and @samp{?} to operate on.  Thus, @samp{ba\(na\)*} matches
+@samp{bananana}, etc., with any (zero or more) number of @samp{na}
+strings.@refill
+
+@item
+To record a matched substring for future reference.
+@end enumerate
+
+This last application is not a consequence of the idea of a
+parenthetical grouping; it is a separate feature that is assigned as a
+second meaning to the same @samp{\( @dots{} \)} construct.  In practice
+there is usually no conflict between the two meanings; when there is
+a conflict, you can use a ``shy'' group.
+
+@item \(?: @dots{} \)
+@cindex shy group, in regexp
+specifies a ``shy'' group that does not record the matched substring;
+you can't refer back to it with @samp{\@var{d}}.  This is useful
+in mechanically combining regular expressions, so that you
+can add groups for syntactic purposes without interfering with
+the numbering of the groups that are meant to be referred to.
+
+@item \@var{d}
+@cindex back reference, in regexp
+matches the same text that matched the @var{d}th occurrence of a
+@samp{\( @dots{} \)} construct.  This is called a @dfn{back
+reference}.
+
+After the end of a @samp{\( @dots{} \)} construct, the matcher remembers
+the beginning and end of the text matched by that construct.  Then,
+later on in the regular expression, you can use @samp{\} followed by the
+digit @var{d} to mean ``match the same text matched the @var{d}th time
+by the @samp{\( @dots{} \)} construct.''
+
+The strings matching the first nine @samp{\( @dots{} \)} constructs
+appearing in a regular expression are assigned numbers 1 through 9 in
+the order that the open-parentheses appear in the regular expression.
+So you can use @samp{\1} through @samp{\9} to refer to the text matched
+by the corresponding @samp{\( @dots{} \)} constructs.
+
+For example, @samp{\(.*\)\1} matches any newline-free string that is
+composed of two identical halves.  The @samp{\(.*\)} matches the first
+half, which may be anything, but the @samp{\1} that follows must match
+the same exact text.
+
+If a particular @samp{\( @dots{} \)} construct matches more than once
+(which can easily happen if it is followed by @samp{*}), only the last
+match is recorded.
+
+@item \`
+matches the empty string, but only at the beginning of the string or
+buffer (or its accessible portion) being matched against.
+
+@item \'
+matches the empty string, but only at the end of the string or buffer
+(or its accessible portion) being matched against.
+
+@item \=
+matches the empty string, but only at point.
+
+@item \b
+matches the empty string, but only at the beginning or
+end of a word.  Thus, @samp{\bfoo\b} matches any occurrence of
+@samp{foo} as a separate word.  @samp{\bballs?\b} matches
+@samp{ball} or @samp{balls} as a separate word.@refill
+
+@samp{\b} matches at the beginning or end of the buffer
+regardless of what text appears next to it.
+
+@item \B
+matches the empty string, but @emph{not} at the beginning or
+end of a word.
+
+@item \<
+matches the empty string, but only at the beginning of a word.
+@samp{\<} matches at the beginning of the buffer only if a
+word-constituent character follows.
+
+@item \>
+matches the empty string, but only at the end of a word.  @samp{\>}
+matches at the end of the buffer only if the contents end with a
+word-constituent character.
+
+@item \w
+matches any word-constituent character.  The syntax table
+determines which characters these are.  @xref{Syntax}.
+
+@item \W
+matches any character that is not a word-constituent.
+
+@item \_<
+matches the empty string, but only at the beginning of a symbol.
+A symbol is a sequence of one or more symbol-constituent characters.
+A symbol-constituent character is a character whose syntax is either
+@samp{w} or @samp{_}.  @samp{\_<} matches at the beginning of the
+buffer only if a symbol-constituent character follows.
+
+@item \_>
+matches the empty string, but only at the end of a symbol.  @samp{\_>}
+matches at the end of the buffer only if the contents end with a
+symbol-constituent character.
+
+@item \s@var{c}
+matches any character whose syntax is @var{c}.  Here @var{c} is a
+character that designates a particular syntax class: thus, @samp{w}
+for word constituent, @samp{-} or @samp{ } for whitespace, @samp{.}
+for ordinary punctuation, etc.  @xref{Syntax}.
+
+@item \S@var{c}
+matches any character whose syntax is not @var{c}.
+
+@cindex categories of characters
+@cindex characters which belong to a specific language
+@findex describe-categories
+@item \c@var{c}
+matches any character that belongs to the category @var{c}.  For
+example, @samp{\cc} matches Chinese characters, @samp{\cg} matches
+Greek characters, etc.  For the description of the known categories,
+type @kbd{M-x describe-categories @key{RET}}.
+
+@item \C@var{c}
+matches any character that does @emph{not} belong to category
+@var{c}.
+@end table
+
+  The constructs that pertain to words and syntax are controlled by the
+setting of the syntax table (@pxref{Syntax}).
+
+@node Regexp Example
+@section Regular Expression Example
+
+  Here is a complicated regexp---a simplified version of the regexp
+that Emacs uses, by default, to recognize the end of a sentence
+together with any whitespace that follows.  We show its Lisp syntax to
+distinguish the spaces from the tab characters.  In Lisp syntax, the
+string constant begins and ends with a double-quote.  @samp{\"} stands
+for a double-quote as part of the regexp, @samp{\\} for a backslash as
+part of the regexp, @samp{\t} for a tab, and @samp{\n} for a newline.
+
+@example
+"[.?!][]\"')]*\\($\\| $\\|\t\\|  \\)[ \t\n]*"
+@end example
+
+@noindent
+This contains four parts in succession: a character set matching
+period, @samp{?}, or @samp{!}; a character set matching
+close-brackets, quotes, or parentheses, repeated zero or more times; a
+set of alternatives within backslash-parentheses that matches either
+end-of-line, a space at the end of a line, a tab, or two spaces; and a
+character set matching whitespace characters, repeated any number of
+times.
+
+  To enter the same regexp in incremental search, you would type
+@key{TAB} to enter a tab, and @kbd{C-j} to enter a newline.  You would
+also type single backslashes as themselves, instead of doubling them
+for Lisp syntax.  In commands that use ordinary minibuffer input to
+read a regexp, you would quote the @kbd{C-j} by preceding it with a
+@kbd{C-q} to prevent @kbd{C-j} from exiting the minibuffer.
+
+@node Search Case
+@section Searching and Case
+
+  Incremental searches in Emacs normally ignore the case of the text
+they are searching through, if you specify the text in lower case.
+Thus, if you specify searching for @samp{foo}, then @samp{Foo} and
+@samp{foo} are also considered a match.  Regexps, and in particular
+character sets, are included: @samp{[ab]} would match @samp{a} or
+@samp{A} or @samp{b} or @samp{B}.@refill
+
+  An upper-case letter anywhere in the incremental search string makes
+the search case-sensitive.  Thus, searching for @samp{Foo} does not find
+@samp{foo} or @samp{FOO}.  This applies to regular expression search as
+well as to string search.  The effect ceases if you delete the
+upper-case letter from the search string.
+
+  Typing @kbd{M-c} within an incremental search toggles the case
+sensitivity of that search.  The effect does not extend beyond the
+current incremental search to the next one, but it does override the
+effect of including an upper-case letter in the current search.
+
+@vindex case-fold-search
+@vindex default-case-fold-search
+  If you set the variable @code{case-fold-search} to @code{nil}, then
+all letters must match exactly, including case.  This is a per-buffer
+variable; altering the variable affects only the current buffer, but
+there is a default value in @code{default-case-fold-search} that you
+can also set.  @xref{Locals}.  This variable applies to nonincremental
+searches also, including those performed by the replace commands
+(@pxref{Replace}) and the minibuffer history matching commands
+(@pxref{Minibuffer History}).
+
+  Several related variables control case-sensitivity of searching and
+matching for specific commands or activities.  For instance,
+@code{tags-case-fold-search} controls case sensitivity for
+@code{find-tag}.  To find these variables, do @kbd{M-x
+apropos-variable @key{RET} case-fold-search @key{RET}}.
+
+@node Replace
+@section Replacement Commands
+@cindex replacement
+@cindex search-and-replace commands
+@cindex string substitution
+@cindex global substitution
+
+  Global search-and-replace operations are not needed often in Emacs,
+but they are available.  In addition to the simple @kbd{M-x
+replace-string} command which replaces all occurrences,
+there is @kbd{M-%} (@code{query-replace}), which presents each occurrence
+of the pattern and asks you whether to replace it.
+
+  The replace commands normally operate on the text from point to the
+end of the buffer; however, in Transient Mark mode (@pxref{Transient
+Mark}), when the mark is active, they operate on the region.  The
+basic replace commands replace one string (or regexp) with one
+replacement string.  It is possible to perform several replacements in
+parallel using the command @code{expand-region-abbrevs}
+(@pxref{Expanding Abbrevs}).
+
+@menu
+* Unconditional Replace::      Replacing all matches for a string.
+* Regexp Replace::             Replacing all matches for a regexp.
+* Replacement and Case::       How replacements preserve case of letters.
+* Query Replace::              How to use querying.
+@end menu
+
+@node Unconditional Replace, Regexp Replace, Replace, Replace
+@subsection Unconditional Replacement
+@findex replace-string
+
+@table @kbd
+@item M-x replace-string @key{RET} @var{string} @key{RET} @var{newstring} @key{RET}
+Replace every occurrence of @var{string} with @var{newstring}.
+@end table
+
+  To replace every instance of @samp{foo} after point with @samp{bar},
+use the command @kbd{M-x replace-string} with the two arguments
+@samp{foo} and @samp{bar}.  Replacement happens only in the text after
+point, so if you want to cover the whole buffer you must go to the
+beginning first.  All occurrences up to the end of the buffer are
+replaced; to limit replacement to part of the buffer, narrow to that
+part of the buffer before doing the replacement (@pxref{Narrowing}).
+In Transient Mark mode, when the region is active, replacement is
+limited to the region (@pxref{Transient Mark}).
+
+  When @code{replace-string} exits, it leaves point at the last
+occurrence replaced.  It sets the mark to the prior position of point
+(where the @code{replace-string} command was issued); use @kbd{C-u
+C-@key{SPC}} to move back there.
+
+  A numeric argument restricts replacement to matches that are surrounded
+by word boundaries.  The argument's value doesn't matter.
+
+  @xref{Replacement and Case}, for details about case-sensitivity in
+replace commands.
+
+  What if you want to exchange @samp{x} and @samp{y}: replace every @samp{x} with a @samp{y} and vice versa?  You can do it this way:
+
+@example
+M-x replace-string @key{RET} x @key{RET} @@TEMP@@ @key{RET}
+M-< M-x replace-string @key{RET} y @key{RET} x @key{RET}
+M-< M-x replace-string @key{RET} @@TEMP@@ @key{RET} y @key{RET}
+@end example
+
+@noindent
+This works provided the string @samp{@@TEMP@@} does not appear
+in your text.
+
+@node Regexp Replace, Replacement and Case, Unconditional Replace, Replace
+@subsection Regexp Replacement
+@findex replace-regexp
+
+  The @kbd{M-x replace-string} command replaces exact matches for a
+single string.  The similar command @kbd{M-x replace-regexp} replaces
+any match for a specified pattern.
+
+@table @kbd
+@item M-x replace-regexp @key{RET} @var{regexp} @key{RET} @var{newstring} @key{RET}
+Replace every match for @var{regexp} with @var{newstring}.
+@end table
+
+@cindex back reference, in regexp replacement
+  In @code{replace-regexp}, the @var{newstring} need not be constant:
+it can refer to all or part of what is matched by the @var{regexp}.
+@samp{\&} in @var{newstring} stands for the entire match being
+replaced.  @samp{\@var{d}} in @var{newstring}, where @var{d} is a
+digit, stands for whatever matched the @var{d}th parenthesized
+grouping in @var{regexp}.  (This is called a ``back reference.'')
+@samp{\#} refers to the count of replacements already made in this
+command, as a decimal number.  In the first replacement, @samp{\#}
+stands for @samp{0}; in the second, for @samp{1}; and so on.  For
+example,
+
+@example
+M-x replace-regexp @key{RET} c[ad]+r @key{RET} \&-safe @key{RET}
+@end example
+
+@noindent
+replaces (for example) @samp{cadr} with @samp{cadr-safe} and @samp{cddr}
+with @samp{cddr-safe}.
+
+@example
+M-x replace-regexp @key{RET} \(c[ad]+r\)-safe @key{RET} \1 @key{RET}
+@end example
+
+@noindent
+performs the inverse transformation.  To include a @samp{\} in the
+text to replace with, you must enter @samp{\\}.
+
+  If you want to enter part of the replacement string by hand each
+time, use @samp{\?} in the replacement string.  Each replacement will
+ask you to edit the replacement string in the minibuffer, putting
+point where the @samp{\?} was.
+
+  The remainder of this subsection is intended for specialized tasks
+and requires knowledge of Lisp.  Most readers can skip it.
+
+  You can use Lisp expressions to calculate parts of the
+replacement string.  To do this, write @samp{\,} followed by the
+expression in the replacement string.  Each replacement calculates the
+value of the expression and converts it to text without quoting (if
+it's a string, this means using the string's contents), and uses it in
+the replacement string in place of the expression itself.  If the
+expression is a symbol, one space in the replacement string after the
+symbol name goes with the symbol name, so the value replaces them
+both.
+
+  Inside such an expression, you can use some special sequences.
+@samp{\&} and @samp{\@var{n}} refer here, as usual, to the entire
+match as a string, and to a submatch as a string.  @var{n} may be
+multiple digits, and the value of @samp{\@var{n}} is @code{nil} if
+subexpression @var{n} did not match.  You can also use @samp{\#&} and
+@samp{\#@var{n}} to refer to those matches as numbers (this is valid
+when the match or submatch has the form of a numeral).  @samp{\#} here
+too stands for the number of already-completed replacements.
+
+  Repeating our example to exchange @samp{x} and @samp{y}, we can thus
+do it also this way:
+
+@example
+M-x replace-regexp @key{RET} \(x\)\|y @key{RET}
+\,(if \1 "y" "x") @key{RET}
+@end example
+
+  For computing replacement strings for @samp{\,}, the @code{format}
+function is often useful (@pxref{Formatting Strings,,, elisp, The Emacs
+Lisp Reference Manual}).  For example, to add consecutively numbered
+strings like @samp{ABC00042} to columns 73 @w{to 80} (unless they are
+already occupied), you can use
+
+@example
+M-x replace-regexp @key{RET} ^.\@{0,72\@}$ @key{RET}
+\,(format "%-72sABC%05d" \& \#) @key{RET}
+@end example
+
+@node Replacement and Case, Query Replace, Regexp Replace, Replace
+@subsection Replace Commands and Case
+
+  If the first argument of a replace command is all lower case, the
+command ignores case while searching for occurrences to
+replace---provided @code{case-fold-search} is non-@code{nil}.  If
+@code{case-fold-search} is set to @code{nil}, case is always significant
+in all searches.
+
+@vindex case-replace
+  In addition, when the @var{newstring} argument is all or partly lower
+case, replacement commands try to preserve the case pattern of each
+occurrence.  Thus, the command
+
+@example
+M-x replace-string @key{RET} foo @key{RET} bar @key{RET}
+@end example
+
+@noindent
+replaces a lower case @samp{foo} with a lower case @samp{bar}, an
+all-caps @samp{FOO} with @samp{BAR}, and a capitalized @samp{Foo} with
+@samp{Bar}.  (These three alternatives---lower case, all caps, and
+capitalized, are the only ones that @code{replace-string} can
+distinguish.)
+
+  If upper-case letters are used in the replacement string, they remain
+upper case every time that text is inserted.  If upper-case letters are
+used in the first argument, the second argument is always substituted
+exactly as given, with no case conversion.  Likewise, if either
+@code{case-replace} or @code{case-fold-search} is set to @code{nil},
+replacement is done without case conversion.
+
+@node Query Replace,, Replacement and Case, Replace
+@subsection Query Replace
+@cindex query replace
+
+@table @kbd
+@item M-% @var{string} @key{RET} @var{newstring} @key{RET}
+@itemx M-x query-replace @key{RET} @var{string} @key{RET} @var{newstring} @key{RET}
+Replace some occurrences of @var{string} with @var{newstring}.
+@item C-M-% @var{regexp} @key{RET} @var{newstring} @key{RET}
+@itemx M-x query-replace-regexp @key{RET} @var{regexp} @key{RET} @var{newstring} @key{RET}
+Replace some matches for @var{regexp} with @var{newstring}.
+@end table
+
+@kindex M-%
+@findex query-replace
+  If you want to change only some of the occurrences of @samp{foo} to
+@samp{bar}, not all of them, then you cannot use an ordinary
+@code{replace-string}.  Instead, use @kbd{M-%} (@code{query-replace}).
+This command finds occurrences of @samp{foo} one by one, displays each
+occurrence and asks you whether to replace it.  Aside from querying,
+@code{query-replace} works just like @code{replace-string}.  It
+preserves case, like @code{replace-string}, provided
+@code{case-replace} is non-@code{nil}, as it normally is
+(@pxref{Replacement and Case}).  A numeric argument means consider
+only occurrences that are bounded by word-delimiter characters.
+
+@kindex C-M-%
+@findex query-replace-regexp
+  @kbd{C-M-%} performs regexp search and replace (@code{query-replace-regexp}).
+It works like @code{replace-regexp} except that it queries
+like @code{query-replace}.
+
+@cindex faces for highlighting query replace
+  These commands highlight the current match using the face
+@code{query-replace}.  They highlight other matches using
+@code{lazy-highlight} just like incremental search (@pxref{Incremental
+Search}).
+
+  The characters you can type when you are shown a match for the string
+or regexp are:
+
+@ignore @c Not worth it.
+@kindex SPC @r{(query-replace)}
+@kindex DEL @r{(query-replace)}
+@kindex , @r{(query-replace)}
+@kindex RET @r{(query-replace)}
+@kindex . @r{(query-replace)}
+@kindex ! @r{(query-replace)}
+@kindex ^ @r{(query-replace)}
+@kindex C-r @r{(query-replace)}
+@kindex C-w @r{(query-replace)}
+@kindex C-l @r{(query-replace)}
+@end ignore
+
+@c WideCommands
+@table @kbd
+@item @key{SPC}
+to replace the occurrence with @var{newstring}.
+
+@item @key{DEL}
+to skip to the next occurrence without replacing this one.
+
+@item , @r{(Comma)}
+to replace this occurrence and display the result.  You are then asked
+for another input character to say what to do next.  Since the
+replacement has already been made, @key{DEL} and @key{SPC} are
+equivalent in this situation; both move to the next occurrence.
+
+You can type @kbd{C-r} at this point (see below) to alter the replaced
+text.  You can also type @kbd{C-x u} to undo the replacement; this exits
+the @code{query-replace}, so if you want to do further replacement you
+must use @kbd{C-x @key{ESC} @key{ESC} @key{RET}} to restart
+(@pxref{Repetition}).
+
+@item @key{RET}
+to exit without doing any more replacements.
+
+@item .@: @r{(Period)}
+to replace this occurrence and then exit without searching for more
+occurrences.
+
+@item !
+to replace all remaining occurrences without asking again.
+
+@item ^
+to go back to the position of the previous occurrence (or what used to
+be an occurrence), in case you changed it by mistake or want to
+reexamine it.
+
+@item C-r
+to enter a recursive editing level, in case the occurrence needs to be
+edited rather than just replaced with @var{newstring}.  When you are
+done, exit the recursive editing level with @kbd{C-M-c} to proceed to
+the next occurrence.  @xref{Recursive Edit}.
+
+@item C-w
+to delete the occurrence, and then enter a recursive editing level as in
+@kbd{C-r}.  Use the recursive edit to insert text to replace the deleted
+occurrence of @var{string}.  When done, exit the recursive editing level
+with @kbd{C-M-c} to proceed to the next occurrence.
+
+@item e
+to edit the replacement string in the minibuffer.  When you exit the
+minibuffer by typing @key{RET}, the minibuffer contents replace the
+current occurrence of the pattern.  They also become the new
+replacement string for any further occurrences.
+
+@item C-l
+to redisplay the screen.  Then you must type another character to
+specify what to do with this occurrence.
+
+@item C-h
+to display a message summarizing these options.  Then you must type
+another character to specify what to do with this occurrence.
+@end table
+
+  Some other characters are aliases for the ones listed above: @kbd{y},
+@kbd{n} and @kbd{q} are equivalent to @key{SPC}, @key{DEL} and
+@key{RET}.
+
+  Aside from this, any other character exits the @code{query-replace},
+and is then reread as part of a key sequence.  Thus, if you type
+@kbd{C-k}, it exits the @code{query-replace} and then kills to end of
+line.
+
+  To restart a @code{query-replace} once it is exited, use @kbd{C-x
+@key{ESC} @key{ESC}}, which repeats the @code{query-replace} because it
+used the minibuffer to read its arguments.  @xref{Repetition, C-x ESC
+ESC}.
+
+  @xref{Operating on Files}, for the Dired @kbd{Q} command which
+performs query replace on selected files.  See also @ref{Transforming
+File Names}, for Dired commands to rename, copy, or link files by
+replacing regexp matches in file names.
+
+@node Other Repeating Search
+@section Other Search-and-Loop Commands
+
+  Here are some other commands that find matches for a regular
+expression.  They all ignore case in matching, if the pattern contains
+no upper-case letters and @code{case-fold-search} is non-@code{nil}.
+Aside from @code{occur} and its variants, all operate on the text from
+point to the end of the buffer, or on the active region in Transient
+Mark mode.
+
+@findex list-matching-lines
+@findex occur
+@findex multi-occur
+@findex multi-occur-in-matching-buffers
+@findex how-many
+@findex delete-non-matching-lines
+@findex delete-matching-lines
+@findex flush-lines
+@findex keep-lines
+
+@table @kbd
+@item M-x occur @key{RET} @var{regexp} @key{RET}
+Display a list showing each line in the buffer that contains a match
+for @var{regexp}.  To limit the search to part of the buffer, narrow
+to that part (@pxref{Narrowing}).  A numeric argument @var{n}
+specifies that @var{n} lines of context are to be displayed before and
+after each matching line.  Currently, @code{occur} can not correctly
+handle multiline matches.
+
+@kindex RET @r{(Occur mode)}
+@kindex o @r{(Occur mode)}
+@kindex C-o @r{(Occur mode)}
+The buffer @samp{*Occur*} containing the output serves as a menu for
+finding the occurrences in their original context.  Click
+@kbd{Mouse-2} on an occurrence listed in @samp{*Occur*}, or position
+point there and type @key{RET}; this switches to the buffer that was
+searched and moves point to the original of the chosen occurrence.
+@kbd{o} and @kbd{C-o} display the match in another window; @kbd{C-o}
+does not select it.
+
+After using @kbd{M-x occur}, you can use @code{next-error} to visit
+the occurrences found, one by one.  @ref{Compilation Mode}.
+
+@item M-x list-matching-lines
+Synonym for @kbd{M-x occur}.
+
+@item M-x multi-occur @key{RET} @var{buffers} @key{RET} @var{regexp} @key{RET}
+This function is just like @code{occur}, except it is able to search
+through multiple buffers.  It asks you to specify the buffer names one by one.
+
+@item M-x multi-occur-in-matching-buffers @key{RET} @var{bufregexp} @key{RET} @var{regexp} @key{RET}
+This function is similar to @code{multi-occur}, except the buffers to
+search are specified by a regular expression that matches visited
+file names.  With a prefix argument, it uses the regular expression to match
+buffer names instead.
+
+@item M-x how-many @key{RET} @var{regexp} @key{RET}
+Print the number of matches for @var{regexp} that exist in the buffer
+after point.  In Transient Mark mode, if the region is active, the
+command operates on the region instead.
+
+@item M-x flush-lines @key{RET} @var{regexp} @key{RET}
+This command deletes each line that contains a match for @var{regexp},
+operating on the text after point; it deletes the current line
+if it contains a match starting after point.  In Transient Mark mode,
+if the region is active, the command operates on the region instead;
+it deletes a line partially contained in the region if it contains a
+match entirely contained in the region.
+
+If a match is split across lines, @code{flush-lines} deletes all those
+lines.  It deletes the lines before starting to look for the next
+match; hence, it ignores a match starting on the same line at which
+another match ended.
+
+@item M-x keep-lines @key{RET} @var{regexp} @key{RET}
+This command deletes each line that @emph{does not} contain a match for
+@var{regexp}, operating on the text after point; if point is not at the
+beginning of a line, it always keeps the current line.  In Transient
+Mark mode, if the region is active, the command operates on the region
+instead; it never deletes lines that are only partially contained in
+the region (a newline that ends a line counts as part of that line).
+
+If a match is split across lines, this command keeps all those lines.
+@end table
+
+@ignore
+   arch-tag: fd9d8e77-66af-491c-b212-d80999613e3e
+@end ignore
similarity index 100%
rename from man/sending.texi
rename to doc/emacs/sending.texi
similarity index 98%
rename from man/text.texi
rename to doc/emacs/text.texi
index 3a0e091ea40943b8b211d631fd67d58c710b8d5a..9cfd4ffe9226300ade43224ac57aca66e5b80fe7 100644 (file)
@@ -486,9 +486,11 @@ The section on init files says how to arrange this permanently for yourself.
 
 @table @kbd
 @item M-q
-Fill current paragraph (@code{fill-paragraph}).
+Fill current paragraph or active region (@code{fill-paragraph-or-region}).
 @item C-x f
 Set the fill column (@code{set-fill-column}).
+@item M-x fill-paragraph
+Fill current paragraph (@code{fill-paragraph}).
 @item M-x fill-region
 Fill each paragraph in the region (@code{fill-region}).
 @item M-x fill-region-as-paragraph
@@ -497,34 +499,39 @@ Fill the region, considering it as one paragraph.
 Center a line.
 @end table
 
-@kindex M-q
 @findex fill-paragraph
-  To refill a paragraph, use the command @kbd{M-q}
-(@code{fill-paragraph}).  This operates on the paragraph that point is
-inside, or the one after point if point is between paragraphs.
-Refilling works by removing all the line-breaks, then inserting new ones
-where necessary.
+  To refill a paragraph, use @kbd{M-x fill-paragraph}.  This operates
+on the paragraph that point is inside, or the one after point if point
+is between paragraphs.  Refilling works by removing all the
+line-breaks, then inserting new ones where necessary.
 
 @findex fill-region
   To refill many paragraphs, use @kbd{M-x fill-region}, which
 finds the paragraphs in the region and fills each of them.
 
+@kindex M-q
+@findex fill-paragraph-or-region
+  The command @kbd{M-q} (@code{fill-paragraph-or-region}), operates on
+the active region like @code{fill-region} when the mark is active in
+Transient Mark mode.  Otherwise, it operates on the current paragraph
+like @code{fill-paragraph}.
+
 @findex fill-region-as-paragraph
-  @kbd{M-q} and @code{fill-region} use the same criteria as @kbd{M-h}
-for finding paragraph boundaries (@pxref{Paragraphs}).  For more
-control, you can use @kbd{M-x fill-region-as-paragraph}, which refills
-everything between point and mark as a single paragraph.  This command
-deletes any blank lines within the region, so separate blocks of text
-end up combined into one block.
+  @kbd{M-q}, @code{fill-paragraph} and @code{fill-region} use the same
+criteria as @kbd{M-h} for finding paragraph boundaries (@pxref{Paragraphs}).
+For more control, you can use @kbd{M-x fill-region-as-paragraph},
+which refills everything between point and mark as a single paragraph.
+This command deletes any blank lines within the region, so separate
+blocks of text end up combined into one block.
 
 @cindex justification
   A numeric argument to @kbd{M-q} tells it to @dfn{justify} the text
 as well as filling it.  This means that extra spaces are inserted to
 make the right margin line up exactly at the fill column.  To remove
 the extra spaces, use @kbd{M-q} with no argument.  (Likewise for
-@code{fill-region}.)  Another way to control justification, and choose
-other styles of filling, is with the @code{justification} text
-property; see @ref{Format Justification}.
+@code{fill-paragraph} and @code{fill-region}.)  Another way to control
+justification, and choose other styles of filling, is with the
+@code{justification} text property; see @ref{Format Justification}.
 
 @kindex M-s @r{(Text mode)}
 @cindex centering
@@ -588,7 +595,7 @@ fill prefix automatically (@pxref{Adaptive Fill}).
 @item C-x .
 Set the fill prefix (@code{set-fill-prefix}).
 @item M-q
-Fill a paragraph using current fill prefix (@code{fill-paragraph}).
+Fill a paragraph using current fill prefix (@code{fill-paragraph-or-region}).
 @item M-x fill-individual-paragraphs
 Fill the region, considering each change of indentation as starting a
 new paragraph.
@@ -2249,7 +2256,7 @@ margin width either with a numeric argument or in the minibuffer.
 
   Sometimes, as a result of editing, the filling of a paragraph becomes
 messed up---parts of the paragraph may extend past the left or right
-margins.  When this happens, use @kbd{M-q} (@code{fill-paragraph}) to
+margins.  When this happens, use @kbd{M-q} (@code{fill-paragraph-or-region}) to
 refill the paragraph.
 
   The fill prefix, if any, works in addition to the specified paragraph
similarity index 100%
rename from man/trouble.texi
rename to doc/emacs/trouble.texi
similarity index 100%
rename from man/vc-xtra.texi
rename to doc/emacs/vc-xtra.texi
similarity index 100%
rename from man/vc1-xtra.texi
rename to doc/emacs/vc1-xtra.texi
diff --git a/doc/emacs/vc2-xtra.texi b/doc/emacs/vc2-xtra.texi
new file mode 100644 (file)
index 0000000..83f2808
--- /dev/null
@@ -0,0 +1,789 @@
+@c This is part of the Emacs manual.
+@c Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+@c See file emacs.texi for copying conditions.
+@c
+@c This file is included either in vc-xtra.texi (when producing the
+@c printed version) or in the main Emacs manual (for the on-line version).
+@node Remote Repositories
+@subsection Remote Repositories
+@cindex remote repositories (CVS)
+
+  A common way of using CVS is to set up a central CVS repository on
+some Internet host, then have each developer check out a personal
+working copy of the files on his local machine.  Committing changes to
+the repository, and picking up changes from other users into one's own
+working area, then works by direct interactions with the CVS server.
+
+  One difficulty is that access to the CVS server is often slow, and
+that developers might need to work off-line as well.  VC is designed
+to reduce the amount of network interaction necessary.
+
+@menu
+* Version Backups::        Keeping local copies of repository versions.
+* Local Version Control::  Using another version system for local editing.
+@end menu
+
+@node Version Backups
+@subsubsection Version Backups
+@cindex version backups
+
+@cindex automatic version backups
+  When VC sees that the CVS repository for a file is on a remote
+machine, it automatically makes local backups of unmodified versions
+of the file---@dfn{automatic version backups}.  This means that you
+can compare the file to the repository version (@kbd{C-x v =}), or
+revert to that version (@kbd{C-x v u}), without any network
+interactions.
+
+  The local copy of the unmodified file is called a @dfn{version
+backup} to indicate that it corresponds exactly to a version that is
+stored in the repository.  Note that version backups are not the same
+as ordinary Emacs backup files
+@iftex
+(@pxref{Backup,,,emacs, the Emacs Manual}).
+@end iftex
+@ifnottex
+(@pxref{Backup}).
+@end ifnottex
+But they follow a similar naming convention.
+
+  For a file that comes from a remote CVS repository, VC makes a
+version backup whenever you save the first changes to the file, and
+removes it after you have committed your modified version to the
+repository. You can disable the making of automatic version backups by
+setting @code{vc-cvs-stay-local} to @code{nil} (@pxref{CVS Options}).
+
+@cindex manual version backups
+  The name of the automatic version backup for version @var{version}
+of file @var{file} is @code{@var{file}.~@var{version}.~}.  This is
+almost the same as the name used by @kbd{C-x v ~}
+@iftex
+(@pxref{Old Versions,,,emacs, the Emacs Manual}),
+@end iftex
+@ifnottex
+(@pxref{Old Versions}),
+@end ifnottex
+the only difference being the additional dot (@samp{.})  after the
+version number.  This similarity is intentional, because both kinds of
+files store the same kind of information.  The file made by @kbd{C-x v
+~} acts as a @dfn{manual version backup}.
+
+  All the VC commands that operate on old versions of a file can use
+both kinds of version backups.  For instance, @kbd{C-x v ~} uses
+either an automatic or a manual version backup, if possible, to get
+the contents of the version you request.  Likewise, @kbd{C-x v =} and
+@kbd{C-x v u} use either an automatic or a manual version backup, if
+one of them exists, to get the contents of a version to compare or
+revert to.  If you changed a file outside of Emacs, so that no
+automatic version backup was created for the previous text, you can
+create a manual backup of that version using @kbd{C-x v ~}, and thus
+obtain the benefit of the local copy for Emacs commands.
+
+  The only difference in Emacs's handling of manual and automatic
+version backups, once they exist, is that Emacs deletes automatic
+version backups when you commit to the repository.  By contrast,
+manual version backups remain until you delete them.
+
+@node Local Version Control
+@subsubsection Local Version Control
+@cindex local version control
+@cindex local back end (version control)
+
+When you make many changes to a file that comes from a remote
+repository, it can be convenient to have version control on your local
+machine as well.  You can then record intermediate versions, revert to
+a previous state, etc., before you actually commit your changes to the
+remote server.
+
+VC lets you do this by putting a file under a second, local version
+control system, so that the file is effectively registered in two
+systems at the same time.  For the description here, we will assume
+that the remote system is CVS, and you use RCS locally, although the
+mechanism works with any combination of version control systems
+(@dfn{back ends}).
+
+To make it work with other back ends, you must make sure that the
+``more local'' back end comes before the ``more remote'' back end in
+the setting of @code{vc-handled-backends} (@pxref{Customizing VC}).  By
+default, this variable is set up so that you can use remote CVS and
+local RCS as described here.
+
+To start using local RCS for a file that comes from a remote CVS
+server, you must @emph{register the file in RCS}, by typing @kbd{C-u
+C-x v v rcs @key{RET}}.  (In other words, use @code{vc-next-action} with a
+prefix argument, and specify RCS as the back end.)
+
+You can do this at any time; it does not matter whether you have
+already modified the file with respect to the version in the CVS
+repository.  If possible, VC tries to make the RCS master start with
+the unmodified repository version, then checks in any local changes
+as a new version.  This works if you have not made any changes yet, or
+if the unmodified repository version exists locally as a version
+backup (@pxref{Version Backups}).  If the unmodified version is not
+available locally, the RCS master starts with the modified version;
+the only drawback to this is that you cannot compare your changes
+locally to what is stored in the repository.
+
+The version number of the RCS master is derived from the current CVS
+version, starting a branch from it.  For example, if the current CVS
+version is 1.23, the local RCS branch will be 1.23.1.  Version 1.23 in
+the RCS master will be identical to version 1.23 under CVS; your first
+changes are checked in as 1.23.1.1.  (If the unmodified file is not
+available locally, VC will check in the modified file twice, both as
+1.23 and 1.23.1.1, to make the revision numbers consistent.)
+
+If you do not use locking under CVS (the default), locking is also
+disabled for RCS, so that editing under RCS works exactly as under
+CVS.
+
+When you are done with local editing, you can commit the final version
+back to the CVS repository by typing @kbd{C-u C-x v v cvs @key{RET}}.
+This initializes the log entry buffer
+@iftex
+(@pxref{Log Buffer,,,emacs, the Emacs Manual})
+@end iftex
+@ifnottex
+(@pxref{Log Buffer})
+@end ifnottex
+to contain all the log entries you have recorded in the RCS master;
+you can edit them as you wish, and then commit in CVS by typing
+@kbd{C-c C-c}.  If the commit is successful, VC removes the RCS
+master, so that the file is once again registered under CVS only.
+(The RCS master is not actually deleted, just renamed by appending
+@samp{~} to the name, so that you can refer to it later if you wish.)
+
+While using local RCS, you can pick up recent changes from the CVS
+repository into your local file, or commit some of your changes back
+to CVS, without terminating local RCS version control.  To do this,
+switch to the CVS back end temporarily, with the @kbd{C-x v b} command:
+
+@table @kbd
+@item C-x v b
+Switch to another back end that the current file is registered
+under (@code{vc-switch-backend}).
+
+@item C-u C-x v b @var{backend} @key{RET}
+Switch to @var{backend} for the current file.
+@end table
+
+@kindex C-x v b
+@findex vc-switch-backend
+@kbd{C-x v b} does not change the buffer contents, or any files; it
+only changes VC's perspective on how to handle the file.  Any
+subsequent VC commands for that file will operate on the back end that
+is currently selected.
+
+If the current file is registered in more than one back end, typing
+@kbd{C-x v b} ``cycles'' through all of these back ends.  With a
+prefix argument, it asks for the back end to use in the minibuffer.
+
+Thus, if you are using local RCS, and you want to pick up some recent
+changes in the file from remote CVS, first visit the file, then type
+@kbd{C-x v b} to switch to CVS, and finally use @kbd{C-x v m
+@key{RET}} to merge the news
+@iftex
+(@pxref{Merging,,,emacs, the Emacs Manual}).
+@end iftex
+@ifnottex
+(@pxref{Merging}).
+@end ifnottex
+You can then switch back to RCS by typing @kbd{C-x v b} again, and
+continue to edit locally.
+
+But if you do this, the revision numbers in the RCS master no longer
+correspond to those of CVS.  Technically, this is not a problem, but
+it can become difficult to keep track of what is in the CVS repository
+and what is not.  So we suggest that you return from time to time to
+CVS-only operation, by committing your local changes back to the
+repository using @kbd{C-u C-x v v cvs @key{RET}}.
+
+@node Snapshots
+@subsection Snapshots
+@cindex snapshots and version control
+
+  A @dfn{snapshot} is a named set of file versions (one for each
+registered file) that you can treat as a unit.  One important kind of
+snapshot is a @dfn{release}, a (theoretically) stable version of the
+system that is ready for distribution to users.
+
+@menu
+* Making Snapshots::           The snapshot facilities.
+* Snapshot Caveats::           Things to be careful of when using snapshots.
+@end menu
+
+@node Making Snapshots
+@subsubsection Making and Using Snapshots
+
+  There are two basic commands for snapshots; one makes a
+snapshot with a given name, the other retrieves a named snapshot.
+
+@table @code
+@kindex C-x v s
+@findex vc-create-snapshot
+@item C-x v s @var{name} @key{RET}
+Define the last saved versions of every registered file in or under the
+current directory as a snapshot named @var{name}
+(@code{vc-create-snapshot}).
+
+@kindex C-x v r
+@findex vc-retrieve-snapshot
+@item C-x v r @var{name} @key{RET}
+For all registered files at or below the current directory level, select
+whatever versions correspond to the snapshot @var{name}
+(@code{vc-retrieve-snapshot}).
+
+This command reports an error if any files are locked at or below the
+current directory, without changing anything; this is to avoid
+overwriting work in progress.
+@end table
+
+  A snapshot uses a very small amount of resources---just enough to record
+the list of file names and which version belongs to the snapshot.  Thus,
+you need not hesitate to create snapshots whenever they are useful.
+
+  You can give a snapshot name as an argument to @kbd{C-x v =} or
+@kbd{C-x v ~}
+@iftex
+(@pxref{Old Versions,,,emacs, the Emacs Manual}).
+@end iftex
+@ifnottex
+(@pxref{Old Versions}).
+@end ifnottex
+Thus, you can use it to compare a snapshot against the current files,
+or two snapshots against each other, or a snapshot against a named
+version.
+
+@node Snapshot Caveats
+@subsubsection Snapshot Caveats
+
+@cindex named configurations (RCS)
+  VC's snapshot facilities are modeled on RCS's named-configuration
+support.  They use RCS's native facilities for this, so
+snapshots made using RCS through VC are visible even when you bypass VC.
+
+  With CVS, Meta-CVS, and Subversion, VC also uses the native
+mechanism provided by that back end to make snapshots and retrieve them
+(@dfn{tags} for CVS and Meta-CVS, @dfn{copies} for Subversion).
+
+@c worded verbosely to avoid overfull hbox.
+  For SCCS, VC implements snapshots itself.  The files it uses contain
+name/file/version-number triples.  These snapshots are visible only
+through VC.
+
+  There is no support for VC snapshots using GNU Arch yet.
+
+  A snapshot is a set of checked-in versions.  So make sure that all the
+files are checked in and not locked when you make a snapshot.
+
+  File renaming and deletion can create some difficulties with snapshots.
+This is not a VC-specific problem, but a general design issue in version
+control systems that no one has solved very well yet.
+
+  If you rename a registered file, you need to rename its master along
+with it (the command @code{vc-rename-file} does this automatically).  If
+you are using SCCS, you must also update the records of the snapshot, to
+mention the file by its new name (@code{vc-rename-file} does this,
+too).  An old snapshot that refers to a master file that no longer
+exists under the recorded name is invalid; VC can no longer retrieve
+it.  It would be beyond the scope of this manual to explain enough about
+RCS and SCCS to explain how to update the snapshots by hand.
+
+  Using @code{vc-rename-file} makes the snapshot remain valid for
+retrieval, but it does not solve all problems.  For example, some of the
+files in your program probably refer to others by name.  At the very
+least, the makefile probably mentions the file that you renamed.  If you
+retrieve an old snapshot, the renamed file is retrieved under its new
+name, which is not the name that the makefile expects.  So the program
+won't really work as retrieved.
+
+@node Miscellaneous VC
+@subsection Miscellaneous Commands and Features of VC
+
+  This section explains the less-frequently-used features of VC.
+
+@menu
+* Change Logs and VC::  Generating a change log file from log entries.
+* Renaming and VC::     A command to rename both the source and master
+                          file correctly.
+* Version Headers::     Inserting version control headers into working files.
+@end menu
+
+@node Change Logs and VC
+@subsubsection Change Logs and VC
+
+  If you use RCS or CVS for a program and also maintain a change log
+file for it
+@iftex
+(@pxref{Change Log,,,emacs, the Emacs Manual}),
+@end iftex
+@ifnottex
+(@pxref{Change Log}),
+@end ifnottex
+you can generate change log entries automatically from the version
+control log entries:
+
+@table @kbd
+@item C-x v a
+@kindex C-x v a
+@findex vc-update-change-log
+Visit the current directory's change log file and, for registered files
+in that directory, create new entries for versions checked in since the
+most recent entry in the change log file.
+(@code{vc-update-change-log}).
+
+This command works with RCS or CVS only, not with any of the other
+back ends.
+
+@item C-u C-x v a
+As above, but only find entries for the current buffer's file.
+
+@item M-1 C-x v a
+As above, but find entries for all the currently visited files that are
+maintained with version control.  This works only with RCS, and it puts
+all entries in the log for the default directory, which may not be
+appropriate.
+@end table
+
+  For example, suppose the first line of @file{ChangeLog} is dated
+1999-04-10, and that the only check-in since then was by Nathaniel
+Bowditch to @file{rcs2log} on 1999-05-22 with log text @samp{Ignore log
+messages that start with `#'.}.  Then @kbd{C-x v a} visits
+@file{ChangeLog} and inserts text like this:
+
+@iftex
+@medbreak
+@end iftex
+@smallexample
+@group
+1999-05-22  Nathaniel Bowditch  <nat@@apn.org>
+
+        * rcs2log: Ignore log messages that start with `#'.
+@end group
+@end smallexample
+@iftex
+@medbreak
+@end iftex
+
+@noindent
+You can then edit the new change log entry further as you wish.
+
+  Some of the new change log entries may duplicate what's already in
+ChangeLog.  You will have to remove these duplicates by hand.
+
+  Normally, the log entry for file @file{foo} is displayed as @samp{*
+foo: @var{text of log entry}}.  The @samp{:} after @file{foo} is omitted
+if the text of the log entry starts with @w{@samp{(@var{functionname}):
+}}.  For example, if the log entry for @file{vc.el} is
+@samp{(vc-do-command): Check call-process status.}, then the text in
+@file{ChangeLog} looks like this:
+
+@iftex
+@medbreak
+@end iftex
+@smallexample
+@group
+1999-05-06  Nathaniel Bowditch  <nat@@apn.org>
+
+        * vc.el (vc-do-command): Check call-process status.
+@end group
+@end smallexample
+@iftex
+@medbreak
+@end iftex
+
+  When @kbd{C-x v a} adds several change log entries at once, it groups
+related log entries together if they all are checked in by the same
+author at nearly the same time.  If the log entries for several such
+files all have the same text, it coalesces them into a single entry.
+For example, suppose the most recent check-ins have the following log
+entries:
+
+@flushleft
+@bullet{} For @file{vc.texinfo}: @samp{Fix expansion typos.}
+@bullet{} For @file{vc.el}: @samp{Don't call expand-file-name.}
+@bullet{} For @file{vc-hooks.el}: @samp{Don't call expand-file-name.}
+@end flushleft
+
+@noindent
+They appear like this in @file{ChangeLog}:
+
+@iftex
+@medbreak
+@end iftex
+@smallexample
+@group
+1999-04-01  Nathaniel Bowditch  <nat@@apn.org>
+
+        * vc.texinfo: Fix expansion typos.
+
+        * vc.el, vc-hooks.el: Don't call expand-file-name.
+@end group
+@end smallexample
+@iftex
+@medbreak
+@end iftex
+
+  Normally, @kbd{C-x v a} separates log entries by a blank line, but you
+can mark several related log entries to be clumped together (without an
+intervening blank line) by starting the text of each related log entry
+with a label of the form @w{@samp{@{@var{clumpname}@} }}.  The label
+itself is not copied to @file{ChangeLog}.  For example, suppose the log
+entries are:
+
+@flushleft
+@bullet{} For @file{vc.texinfo}: @samp{@{expand@} Fix expansion typos.}
+@bullet{} For @file{vc.el}: @samp{@{expand@} Don't call expand-file-name.}
+@bullet{} For @file{vc-hooks.el}: @samp{@{expand@} Don't call expand-file-name.}
+@end flushleft
+
+@noindent
+Then the text in @file{ChangeLog} looks like this:
+
+@iftex
+@medbreak
+@end iftex
+@smallexample
+@group
+1999-04-01  Nathaniel Bowditch  <nat@@apn.org>
+
+        * vc.texinfo: Fix expansion typos.
+        * vc.el, vc-hooks.el: Don't call expand-file-name.
+@end group
+@end smallexample
+@iftex
+@medbreak
+@end iftex
+
+  A log entry whose text begins with @samp{#} is not copied to
+@file{ChangeLog}.  For example, if you merely fix some misspellings in
+comments, you can log the change with an entry beginning with @samp{#}
+to avoid putting such trivia into @file{ChangeLog}.
+
+@node Renaming and VC
+@subsubsection Renaming VC Work Files and Master Files
+
+@findex vc-rename-file
+  When you rename a registered file, you must also rename its master
+file correspondingly to get proper results.  Use @code{vc-rename-file}
+to rename the source file as you specify, and rename its master file
+accordingly.  It also updates any snapshots (@pxref{Snapshots}) that
+mention the file, so that they use the new name; despite this, the
+snapshot thus modified may not completely work (@pxref{Snapshot
+Caveats}).
+
+  Some back ends do not provide an explicit rename operation to their
+repositories.  After issuing @code{vc-rename-file}, use @kbd{C-x v v}
+on the original and renamed buffers and provide the necessary edit
+log.
+
+  You cannot use @code{vc-rename-file} on a file that is locked by
+someone else.
+
+@node Version Headers
+@subsubsection Inserting Version Control Headers
+
+   Sometimes it is convenient to put version identification strings
+directly into working files.  Certain special strings called
+@dfn{version headers} are replaced in each successive version by the
+number of that version, the name of the user who created it, and other
+relevant information.  All of the back ends that VC supports have such
+a mechanism, except GNU Arch.
+
+  VC does not normally use the information contained in these headers.
+The exception is RCS---with RCS, version headers are sometimes more
+reliable than the master file to determine which version of the file
+you are editing.  Note that in a multi-branch environment, version
+headers are necessary to make VC behave correctly
+@iftex
+(@pxref{Multi-User Branching,,,emacs, the Emacs Manual}).
+@end iftex
+@ifnottex
+(@pxref{Multi-User Branching}).
+@end ifnottex
+
+  Searching for RCS version headers is controlled by the variable
+@code{vc-consult-headers}.  If it is non-@code{nil} (the default),
+Emacs searches for headers to determine the version number you are
+editing.  Setting it to @code{nil} disables this feature.
+
+  Note that although CVS uses the same kind of version headers as RCS
+does, VC never searches for these headers if you are using CVS,
+regardless of the above setting.
+
+@kindex C-x v h
+@findex vc-insert-headers
+  You can use the @kbd{C-x v h} command (@code{vc-insert-headers}) to
+insert a suitable header string.
+
+@table @kbd
+@item C-x v h
+Insert headers in a file for use with your version-control system.
+@end table
+
+@vindex vc-@var{backend}-header
+  The default header string is @samp{@w{$}Id$} for RCS and
+@samp{@w{%}W%} for SCCS.  You can specify other headers to insert by
+setting the variables @code{vc-@var{backend}-header} where
+@var{backend} is @code{rcs} or @code{sccs}.
+
+  Instead of a single string, you can specify a list of strings; then
+each string in the list is inserted as a separate header on a line of
+its own.
+
+  It may be necessary to use apparently-superfluous backslashes when
+writing the strings that you put in this variable.  For instance, you
+might write @code{"$Id\$"} rather than @code{"$Id@w{$}"}.  The extra
+backslash prevents the string constant from being interpreted as a
+header, if the Emacs Lisp file containing it is maintained with
+version control.
+
+@vindex vc-comment-alist
+  Each header is inserted surrounded by tabs, inside comment delimiters,
+on a new line at point.  Normally the ordinary comment
+start and comment end strings of the current mode are used, but for
+certain modes, there are special comment delimiters for this purpose;
+the variable @code{vc-comment-alist} specifies them.  Each element of
+this list has the form @code{(@var{mode} @var{starter} @var{ender})}.
+
+@vindex vc-static-header-alist
+  The variable @code{vc-static-header-alist} specifies further strings
+to add based on the name of the buffer.  Its value should be a list of
+elements of the form @code{(@var{regexp} . @var{format})}.  Whenever
+@var{regexp} matches the buffer name, @var{format} is inserted as part
+of the header.  A header line is inserted for each element that matches
+the buffer name, and for each string specified by
+@code{vc-@var{backend}-header}.  The header line is made by processing the
+string from @code{vc-@var{backend}-header} with the format taken from the
+element.  The default value for @code{vc-static-header-alist} is as follows:
+
+@example
+@group
+(("\\.c$" .
+  "\n#ifndef lint\nstatic char vcid[] = \"\%s\";\n\
+#endif /* lint */\n"))
+@end group
+@end example
+
+@noindent
+It specifies insertion of text of this form:
+
+@example
+@group
+
+#ifndef lint
+static char vcid[] = "@var{string}";
+#endif /* lint */
+@end group
+@end example
+
+@noindent
+Note that the text above starts with a blank line.
+
+  If you use more than one version header in a file, put them close
+together in the file.  The mechanism in @code{revert-buffer} that
+preserves markers may not handle markers positioned between two version
+headers.
+
+@node Customizing VC
+@subsection Customizing VC
+
+@vindex vc-handled-backends
+The variable @code{vc-handled-backends} determines which version
+control systems VC should handle.  The default value is @code{(RCS CVS
+SVN SCCS BZR GIT HG Arch MCVS)}, so it contains all the version systems
+that are currently supported.  If you want VC to ignore one or more of
+these systems, exclude its name from the list.  To disable VC entirely,
+set this variable to @code{nil}.
+
+The order of systems in the list is significant: when you visit a file
+registered in more than one system (@pxref{Local Version Control}), VC
+uses the system that comes first in @code{vc-handled-backends} by
+default.  The order is also significant when you register a file for
+the first time, see
+@iftex
+@ref{Registering,,,emacs, the Emacs Manual},
+@end iftex
+@ifnottex
+@ref{Registering},
+@end ifnottex
+for details.
+
+@menu
+* General VC Options::  Options that apply to multiple back ends.
+* RCS and SCCS::        Options for RCS and SCCS.
+* CVS Options::         Options for CVS.
+@end menu
+
+@node General VC Options
+@subsubsection General Options
+
+@vindex vc-make-backup-files
+  Emacs normally does not save backup files for source files that are
+maintained with version control.  If you want to make backup files even
+for files that use version control, set the variable
+@code{vc-make-backup-files} to a non-@code{nil} value.
+
+@vindex vc-keep-workfiles
+  Normally the work file exists all the time, whether it is locked or
+not.  If you set @code{vc-keep-workfiles} to @code{nil}, then checking
+in a new version with @kbd{C-x v v} deletes the work file; but any
+attempt to visit the file with Emacs creates it again.  (With CVS, work
+files are always kept.)
+
+@vindex vc-follow-symlinks
+  Editing a version-controlled file through a symbolic link can be
+dangerous.  It bypasses the version control system---you can edit the
+file without locking it, and fail to check your changes in.  Also,
+your changes might overwrite those of another user.  To protect against
+this, VC checks each symbolic link that you visit, to see if it points
+to a file under version control.
+
+  The variable @code{vc-follow-symlinks} controls what to do when a
+symbolic link points to a version-controlled file.  If it is @code{nil},
+VC only displays a warning message.  If it is @code{t}, VC automatically
+follows the link, and visits the real file instead, telling you about
+this in the echo area.  If the value is @code{ask} (the default), VC
+asks you each time whether to follow the link.
+
+@vindex vc-suppress-confirm
+  If @code{vc-suppress-confirm} is non-@code{nil}, then @kbd{C-x v v}
+and @kbd{C-x v i} can save the current buffer without asking, and
+@kbd{C-x v u} also operates without asking for confirmation.  (This
+variable does not affect @kbd{C-x v c}; that operation is so drastic
+that it should always ask for confirmation.)
+
+@vindex vc-command-messages
+  VC mode does much of its work by running the shell commands for RCS,
+CVS and SCCS.  If @code{vc-command-messages} is non-@code{nil}, VC
+displays messages to indicate which shell commands it runs, and
+additional messages when the commands finish.
+
+@vindex vc-path
+  You can specify additional directories to search for version control
+programs by setting the variable @code{vc-path}.  These directories
+are searched before the usual search path.  It is rarely necessary to
+set this variable, because VC normally finds the proper files
+automatically.
+
+@node RCS and SCCS
+@subsubsection Options for RCS and SCCS
+
+@cindex non-strict locking (RCS)
+@cindex locking, non-strict (RCS)
+  By default, RCS uses locking to coordinate the activities of several
+users, but there is a mode called @dfn{non-strict locking} in which
+you can check-in changes without locking the file first.  Use
+@samp{rcs -U} to switch to non-strict locking for a particular file,
+see the @code{rcs} manual page for details.
+
+  When deducing the version control state of an RCS file, VC first
+looks for an RCS version header string in the file (@pxref{Version
+Headers}).  If there is no header string, VC normally looks at the
+file permissions of the work file; this is fast.  But there might be
+situations when the file permissions cannot be trusted.  In this case
+the master file has to be consulted, which is rather expensive.  Also
+the master file can only tell you @emph{if} there's any lock on the
+file, but not whether your work file really contains that locked
+version.
+
+@vindex vc-consult-headers
+  You can tell VC not to use version headers to determine the file
+status by setting @code{vc-consult-headers} to @code{nil}.  VC then
+always uses the file permissions (if it is supposed to trust them), or
+else checks the master file.
+
+@vindex vc-mistrust-permissions
+  You can specify the criterion for whether to trust the file
+permissions by setting the variable @code{vc-mistrust-permissions}.
+Its value can be @code{t} (always mistrust the file permissions and
+check the master file), @code{nil} (always trust the file
+permissions), or a function of one argument which makes the decision.
+The argument is the directory name of the @file{RCS} subdirectory.  A
+non-@code{nil} value from the function says to mistrust the file
+permissions.  If you find that the file permissions of work files are
+changed erroneously, set @code{vc-mistrust-permissions} to @code{t}.
+Then VC always checks the master file to determine the file's status.
+
+  VC determines the version control state of files under SCCS much as
+with RCS.  It does not consider SCCS version headers, though.  Thus,
+the variable @code{vc-mistrust-permissions} affects SCCS use, but
+@code{vc-consult-headers} does not.
+
+@node CVS Options
+@subsubsection Options specific for CVS
+
+@cindex locking (CVS)
+  By default, CVS does not use locking to coordinate the activities of
+several users; anyone can change a work file at any time.  However,
+there are ways to restrict this, resulting in behavior that resembles
+locking.
+
+@cindex CVSREAD environment variable (CVS)
+  For one thing, you can set the @env{CVSREAD} environment variable
+(the value you use makes no difference).  If this variable is defined,
+CVS makes your work files read-only by default.  In Emacs, you must
+type @kbd{C-x v v} to make the file writable, so that editing works
+in fact similar as if locking was used.  Note however, that no actual
+locking is performed, so several users can make their files writable
+at the same time.  When setting @env{CVSREAD} for the first time, make
+sure to check out all your modules anew, so that the file protections
+are set correctly.
+
+@cindex cvs watch feature
+@cindex watching files (CVS)
+  Another way to achieve something similar to locking is to use the
+@dfn{watch} feature of CVS.  If a file is being watched, CVS makes it
+read-only by default, and you must also use @kbd{C-x v v} in Emacs to
+make it writable.  VC calls @code{cvs edit} to make the file writable,
+and CVS takes care to notify other developers of the fact that you
+intend to change the file.  See the CVS documentation for details on
+using the watch feature.
+
+@vindex vc-stay-local
+@vindex vc-cvs-stay-local
+@cindex remote repositories (CVS)
+  When a file's repository is on a remote machine, VC tries to keep
+network interactions to a minimum.  This is controlled by the variable
+@code{vc-cvs-stay-local}.  There is another variable,
+@code{vc-stay-local}, which enables the feature also for other back
+ends that support it, including CVS.  In the following, we will talk
+only about @code{vc-cvs-stay-local}, but everything applies to
+@code{vc-stay-local} as well.
+
+If @code{vc-cvs-stay-local} is @code{t} (the default), then VC uses
+only the entry in the local CVS subdirectory to determine the file's
+state (and possibly information returned by previous CVS commands).
+One consequence of this is that when you have modified a file, and
+somebody else has already checked in other changes to the file, you
+are not notified of it until you actually try to commit.  (But you can
+try to pick up any recent changes from the repository first, using
+@kbd{C-x v m @key{RET}},
+@iftex
+@pxref{Merging,,,emacs, the Emacs Manual}).
+@end iftex
+@ifnottex
+@pxref{Merging}).
+@end ifnottex
+
+  When @code{vc-cvs-stay-local} is @code{t}, VC also makes local
+version backups, so that simple diff and revert operations are
+completely local (@pxref{Version Backups}).
+
+  On the other hand, if you set @code{vc-cvs-stay-local} to @code{nil},
+then VC queries the remote repository @emph{before} it decides what to
+do in @code{vc-next-action} (@kbd{C-x v v}), just as it does for local
+repositories.  It also does not make any version backups.
+
+  You can also set @code{vc-cvs-stay-local} to a regular expression
+that is matched against the repository host name; VC then stays local
+only for repositories from hosts that match the pattern.
+
+@vindex vc-cvs-global-switches
+  You can specify additional command line options to pass to all CVS
+operations in the variable @code{vc-cvs-global-switches}.  These
+switches are inserted immediately after the @code{cvs} command, before
+the name of the operation to invoke.
+
+@ignore
+   arch-tag: 140b8629-4339-4b5e-9e50-72453e51615e
+@end ignore
similarity index 100%
rename from man/windows.texi
rename to doc/emacs/windows.texi
diff --git a/doc/emacs/xresources.texi b/doc/emacs/xresources.texi
new file mode 100644 (file)
index 0000000..c402ec8
--- /dev/null
@@ -0,0 +1,1216 @@
+@c This is part of the Emacs manual.
+@c Copyright (C) 1987, 1993, 1994, 1995, 1997, 2001, 2002, 2003,
+@c   2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+@c See file emacs.texi for copying conditions.
+@node X Resources, Antinews, Emacs Invocation, Top
+@appendix X Options and Resources
+
+  You can customize some X-related aspects of Emacs behavior using X
+resources, as is usual for programs that use X.  On MS-Windows, you
+can customize some of the same aspects using the system registry.
+@xref{MS-Windows Registry}.  Likewise, Emacs on MacOS Carbon emulates X
+resources using the Preferences system.  @xref{Mac Environment Variables}.
+
+  When Emacs is built using an ``X toolkit'', such as Lucid or
+LessTif, you need to use X resources to customize the appearance of
+the widgets, including the menu-bar, scroll-bar, and dialog boxes.
+This is because the libraries that implement these don't provide for
+customization through Emacs.  GTK+ widgets use a separate system of
+@ifnottex
+``GTK resources'', which we will also describe.
+@end ifnottex
+@iftex
+``GTK resources.''  In this chapter we describe the most commonly used
+resource specifications.  For full documentation, see the online
+manual.
+
+@c Add xref for LessTif/Motif menu resources.
+@end iftex
+
+
+@menu
+* Resources::           Using X resources with Emacs (in general).
+* Table of Resources::  Table of specific X resources that affect Emacs.
+* Face Resources::      X resources for customizing faces.
+* Lucid Resources::     X resources for Lucid menus.
+* LessTif Resources::   X resources for LessTif and Motif menus.
+* GTK resources::       Resources for GTK widgets.
+@end menu
+
+@node Resources
+@appendixsec X Resources
+@cindex resources
+@cindex X resources
+@cindex @file{~/.Xdefaults} file
+@cindex @file{~/.Xresources} file
+
+  Programs running under the X Window System organize their user
+options under a hierarchy of classes and resources.  You can specify
+default values for these options in your X resources file, usually
+named @file{~/.Xdefaults} or @file{~/.Xresources}.
+If changes in @file{~/.Xdefaults} do not
+take effect, it is because your X server stores its own list of
+resources; to update them, use the shell command @command{xrdb}---for
+instance, @samp{xrdb ~/.Xdefaults}.
+
+  Each line in the file specifies a value for one option or for a
+collection of related options, for one program or for several programs
+(optionally even for all programs).
+
+@cindex Registry (MS-Windows)
+  MS-Windows systems do not support @file{~/.Xdefaults} files, so
+instead Emacs compiled for Windows looks for X resources in the
+Windows Registry, first under the key
+@samp{HKEY_CURRENT_USER\SOFTWARE\GNU\Emacs} and then under the key
+@samp{HKEY_LOCAL_MACHINE\SOFTWARE\GNU\Emacs}.  The menu and scroll
+bars are native widgets on MS-Windows, so they are only customizable
+via the system-wide settings in the Display Control Panel.  You can
+also set resources using the @samp{-xrm} command line option (see
+below.)
+
+@iftex
+  Applications such as Emacs look for resources with specific names
+and their particular meanings.  Case distinctions are significant in
+these names.  Each resource specification in @file{~/.Xdefaults}
+states the name of the program and the name of the resource.  For
+Emacs, the program name is @samp{Emacs}.  It looks like this:
+
+@example
+Emacs.borderWidth: 2
+@end example
+@end iftex
+@ifnottex
+  Programs define named resources with particular meanings.  They also
+define how to group resources into named classes.  For instance, in
+Emacs, the @samp{internalBorder} resource controls the width of the
+internal border, and the @samp{borderWidth} resource controls the width
+of the external border.  Both of these resources are part of the
+@samp{BorderWidth} class.  Case distinctions are significant in these
+names.
+
+  Every resource definition is associated with a specific program
+name---the name of the executable file that you ran.  For Emacs, that
+is normally @samp{emacs}.  To specify a definition for all instances
+of Emacs, regardless of their names, use @samp{Emacs}.
+
+  In @file{~/.Xdefaults}, you can specify a value for a single resource
+on one line, like this:
+
+@example
+emacs.borderWidth: 2
+@end example
+
+@noindent
+Or you can use a class name to specify the same value for all resources
+in that class.  Here's an example:
+
+@example
+emacs.BorderWidth: 2
+@end example
+
+  If you specify a value for a class, it becomes the default for all
+resources in that class.  You can specify values for individual
+resources as well; these override the class value, for those particular
+resources.  Thus, this example specifies 2 as the default width for all
+borders, but overrides this value with 4 for the external border:
+
+@example
+emacs.BorderWidth: 2
+emacs.borderWidth: 4
+@end example
+@end ifnottex
+
+  The order in which the lines appear in the file does not matter.
+Also, command-line options always override the X resources file.
+
+@ifnottex
+Here is a list of X command-line options and their corresponding
+resource names.
+
+@table @samp
+@item -name @var{name}
+@opindex --name
+@itemx --name=@var{name}
+@cindex resource name, command-line argument
+Use @var{name} as the resource name (and the title) for the initial
+Emacs frame.  This option does not affect subsequent frames, but Lisp
+programs can specify frame names when they create frames.
+
+If you don't specify this option, the default is to use the Emacs
+executable's name as the resource name.
+
+@item -xrm @var{resource-values}
+@opindex --xrm
+@itemx --xrm=@var{resource-values}
+@cindex resource values, command-line argument
+Specify X resource values for this Emacs job (see below).
+@end table
+
+  For consistency, @samp{-name} also specifies the name to use for
+other resource values that do not belong to any particular frame.
+
+  The resources that name Emacs invocations also belong to a class; its
+name is @samp{Emacs}.  If you write @samp{Emacs} instead of
+@samp{emacs}, the resource applies to all frames in all Emacs jobs,
+regardless of frame titles and regardless of the name of the executable
+file.  Here is an example:
+
+@example
+Emacs.BorderWidth: 2
+Emacs.borderWidth: 4
+@end example
+
+  You can specify a string of additional resource values for Emacs to
+use with the command line option @samp{-xrm @var{resources}}.  The text
+@var{resources} should have the same format that you would use inside a file
+of X resources.  To include multiple resource specifications in
+@var{resources}, put a newline between them, just as you would in a file.
+You can also use @samp{#include "@var{filename}"} to include a file full
+of resource specifications.  Resource values specified with @samp{-xrm}
+take precedence over all other resource specifications.
+
+  One way to experiment with the effect of different resource settings
+is to use the @code{editres} program.  Select @samp{Get Tree} from the
+@end ifnottex
+@iftex
+  You can experiment with the effect of different resource settings
+with the @code{editres} program.  Select @samp{Get Tree} from the
+@end iftex
+@samp{Commands} menu, then click on an Emacs frame.  This will display
+a tree showing the structure of X toolkit widgets used in an Emacs
+frame.  Select one of them, such as @samp{menubar}, then select
+@samp{Show Resource Box} from the @samp{Commands} menu.  This displays
+a list of all the meaningful X resources for that widget, and allows
+you to edit them.  Changes take effect when you click on the
+@samp{Apply} button.  (See the @code{editres} man page for more
+details.)
+
+@node Table of Resources
+@appendixsec Table of X Resources for Emacs
+
+  This table lists the resource names that designate options for
+Emacs, not counting those for the appearance of the menu bar, each
+with the class that it belongs to:
+
+@table @asis
+@item @code{background} (class @code{Background})
+Background color name.
+
+@ifnottex
+@item @code{bitmapIcon} (class @code{BitmapIcon})
+Use a bitmap icon (a picture of a gnu) if @samp{on}, let the window
+manager choose an icon if @samp{off}.
+@end ifnottex
+
+@item @code{borderColor} (class @code{BorderColor})
+Color name for the external border.
+
+@ifnottex
+@item @code{borderWidth} (class @code{BorderWidth})
+Width in pixels of the external border.
+@end ifnottex
+
+@item @code{cursorColor} (class @code{Foreground})
+Color name for text cursor (point).
+
+@ifnottex
+@item @code{cursorBlink} (class @code{CursorBlink})
+Specifies whether to make the cursor blink. The default is @samp{on}.  Use
+@samp{off} or @samp{false} to turn cursor blinking off.
+@end ifnottex
+
+@item @code{font} (class @code{Font})
+Font name (or fontset name, @pxref{Fontsets}) for @code{default} font.
+
+@item @code{foreground} (class @code{Foreground})
+Color name for text.
+
+@item @code{geometry} (class @code{Geometry})
+Window size and position.  Be careful not to specify this resource as
+@samp{emacs*geometry}, because that may affect individual menus as well
+as the Emacs frame itself.
+
+If this resource specifies a position, that position applies only to the
+initial Emacs frame (or, in the case of a resource for a specific frame
+name, only that frame).  However, the size, if specified here, applies to
+all frames.
+
+@ifnottex
+@item @code{fullscreen} (class @code{Fullscreen})
+The desired fullscreen size.  The value can be one of @code{fullboth},
+@code{fullwidth} or @code{fullheight}, which correspond to
+the command-line options @samp{-fs}, @samp{-fw}, and @samp{-fh}
+(@pxref{Window Size X}).
+
+Note that this applies to the initial frame only.
+@end ifnottex
+
+@item @code{iconName} (class @code{Title})
+Name to display in the icon.
+
+@item @code{internalBorder} (class @code{BorderWidth})
+Width in pixels of the internal border.
+
+@item @code{lineSpacing} (class @code{LineSpacing})
+@cindex line spacing
+@cindex leading
+Additional space (@dfn{leading}) between lines, in pixels.
+
+@item @code{menuBar} (class @code{MenuBar})
+@cindex menu bar
+Give frames menu bars if @samp{on}; don't have menu bars if @samp{off}.
+@ifnottex
+@xref{Lucid Resources}, and @ref{LessTif Resources},
+@end ifnottex
+@iftex
+@xref{Lucid Resources},
+@end iftex
+for how to control the appearance of the menu bar if you have one.
+
+@ifnottex
+@item @code{minibuffer} (class @code{Minibuffer})
+If @samp{none}, don't make a minibuffer in this frame.
+It will use a separate minibuffer frame instead.
+
+@item @code{paneFont} (class @code{Font})
+@cindex font for menus
+Font name for menu pane titles, in non-toolkit versions of Emacs.
+@end ifnottex
+
+@item @code{pointerColor} (class @code{Foreground})
+Color of the mouse cursor.
+
+@ifnottex
+@item @code{privateColormap} (class @code{PrivateColormap})
+If @samp{on}, use a private color map, in the case where the ``default
+visual'' of class PseudoColor and Emacs is using it.
+
+@item @code{reverseVideo} (class @code{ReverseVideo})
+Switch foreground and background default colors if @samp{on}, use colors as
+specified if @samp{off}.
+@end ifnottex
+
+@item @code{screenGamma} (class @code{ScreenGamma})
+@cindex gamma correction
+Gamma correction for colors, equivalent to the frame parameter
+@code{screen-gamma}.
+
+@item @code{scrollBarWidth} (class @code{ScrollBarWidth})
+@cindex scrollbar width
+The scroll bar width in pixels, equivalent to the frame parameter
+@code{scroll-bar-width}.
+
+@ifnottex
+@item @code{selectionFont} (class @code{SelectionFont})
+Font name for pop-up menu items, in non-toolkit versions of Emacs.  (For
+toolkit versions, see @ref{Lucid Resources}, also see @ref{LessTif
+Resources}.)
+
+@item @code{selectionTimeout} (class @code{SelectionTimeout})
+Number of milliseconds to wait for a selection reply.
+If the selection owner doesn't reply in this time, we give up.
+A value of 0 means wait as long as necessary.
+
+@item @code{synchronous} (class @code{Synchronous})
+@cindex debugging X problems
+@cindex synchronous X mode
+Run Emacs in synchronous mode if @samp{on}.  Synchronous mode is
+useful for debugging X problems.
+@end ifnottex
+
+@item @code{title} (class @code{Title})
+Name to display in the title bar of the initial Emacs frame.
+
+@item @code{toolBar} (class @code{ToolBar})
+@cindex tool bar
+Number of lines to reserve for the tool bar.  A zero value suppresses
+the tool bar.  If the value is non-zero and
+@code{auto-resize-tool-bars} is non-@code{nil}, the tool bar's size
+will be changed automatically so that all tool bar items are visible.
+  If the value of @code{auto-resize-tool-bars} is @code{grow-only},
+the tool bar expands automatically, but does not contract automatically.
+To contract the tool bar, you must redraw the frame by entering @kbd{C-l}.
+
+@item @code{useXIM} (class @code{UseXIM})
+@cindex XIM
+@cindex X input methods
+@cindex input methods, X
+Turn off use of X input methods (XIM) if @samp{false} or @samp{off}.
+This is only relevant if your Emacs is actually built with XIM
+support.  It is potentially useful to turn off XIM for efficiency,
+especially slow X client/server links.
+
+@item @code{verticalScrollBars} (class @code{ScrollBars})
+Give frames scroll bars if @samp{on}; don't have scroll bars if
+@samp{off}.
+
+@ifnottex
+@item @code{visualClass} (class @code{VisualClass})
+Specify the ``visual'' that X should use.  This tells X how to handle
+colors.
+
+The value should start with one of @samp{TrueColor},
+@samp{PseudoColor}, @samp{DirectColor}, @samp{StaticColor},
+@samp{GrayScale}, and @samp{StaticGray}, followed by
+@samp{-@var{depth}}, where @var{depth} is the number of color planes.
+Most terminals only allow a few ``visuals,'' and the @samp{dpyinfo}
+program outputs information saying which ones.
+@end ifnottex
+@end table
+
+@node Face Resources
+@appendixsec X Resources for Faces
+
+  You can use resources to customize the appearance of particular
+faces (@pxref{Faces}):
+
+@table @code
+@item @var{face}.attributeForeground
+Foreground color for face @var{face}.
+@item @var{face}.attributeBackground
+Background color for face @var{face}.
+@item @var{face}.attributeUnderline
+Underline flag for face @var{face}.  Use @samp{on} or @samp{true} for
+yes.
+@item @var{face}.attributeStrikeThrough
+@itemx @var{face}.attributeOverline
+@itemx @var{face}.attributeBox
+@itemx @var{face}.attributeInverse
+Likewise, for other boolean font attributes.
+@item @var{face}.attributeStipple
+The name of a pixmap data file to use for the stipple pattern, or
+@code{false} to not use stipple for the face @var{face}.
+@item @var{face}.attributeBackgroundPixmap
+The background pixmap for the face @var{face}.  Should be a name of a
+pixmap file or @code{false}.
+@item @var{face}.attributeFont
+Font name (full XFD name or valid X abbreviation) for face @var{face}.
+Instead of this, you can specify the font through separate attributes.
+@end table
+
+  Instead of using @code{attributeFont} to specify a font name, you can
+select a font through these separate attributes:
+
+@table @code
+@item @var{face}.attributeFamily
+Font family for face @var{face}.
+@item @var{face}.attributeHeight
+Height of the font to use for face @var{face}: either an integer
+specifying the height in units of 1/10@dmn{pt}, or a floating point
+number that specifies a scale factor to scale the underlying face's
+default font, or a function to be called with the default height which
+will return a new height.
+@item @var{face}.attributeWidth
+@itemx @var{face}.attributeWeight
+@itemx @var{face}.attributeSlant
+Each of these resources corresponds to a like-named font attribute,
+and you write the resource value the same as the symbol you would use
+for the font attribute value.
+@item @var{face}.attributeBold
+Bold flag for face @var{face}---instead of @code{attributeWeight}.  Use @samp{on} or @samp{true} for
+yes.
+@item @var{face}.attributeItalic
+Italic flag for face @var{face}---instead of @code{attributeSlant}.
+@end table
+
+@node Lucid Resources
+@appendixsec Lucid Menu X Resources
+@cindex Menu X Resources (Lucid widgets)
+@cindex Lucid Widget X Resources
+
+@ifnottex
+  If the Emacs installed at your site was built to use the X toolkit
+with the Lucid menu widgets, then the menu bar is a separate widget and
+has its own resources.  The resource names contain @samp{pane.menubar}
+(following, as always, the name of the Emacs invocation, or @samp{Emacs},
+which stands for all Emacs invocations).  Specify them like this:
+
+@example
+Emacs.pane.menubar.@var{resource}:  @var{value}
+@end example
+
+@noindent
+For example, to specify the font @samp{8x16} for the menu-bar items,
+write this:
+@end ifnottex
+@iftex
+   If the Emacs installed at your site was built to use the X toolkit
+with the Lucid menu widgets, then the menu bar is a separate widget
+and has its own resources.  The resource specifications start with
+@samp{Emacs.pane.menubar}---for instance, to specify the font
+@samp{8x16} for the menu-bar items, write this:
+@end iftex
+
+@example
+Emacs.pane.menubar.font:  8x16
+@end example
+
+@noindent
+Resources for @emph{non-menubar} toolkit pop-up menus have
+@samp{menu*} instead of @samp{pane.menubar}.  For example, to specify
+the font @samp{8x16} for the pop-up menu items, write this:
+
+@example
+Emacs.menu*.font:      8x16
+@end example
+
+@noindent
+For dialog boxes, use @samp{dialog*}:
+
+@example
+Emacs.dialog*.font:    8x16
+@end example
+
+@noindent
+The Lucid menus can display multilingual text in your locale.  For
+more information about fontsets see the man page for
+@code{XCreateFontSet}.  To enable multilingual menu text you specify a
+@code{fontSet} resource instead of the font resource.  If both
+@code{font} and @code{fontSet} resources are specified, the
+@code{fontSet} resource is used.
+
+  Thus, to specify @samp{-*-helvetica-medium-r-*--*-120-*-*-*-*-*-*,*}
+for both the popup and menu bar menus, write this:
+
+@example
+Emacs*menu*fontSet:  -*-helvetica-medium-r-*--*-120-*-*-*-*-*-*,*
+@end example
+
+@noindent
+The @samp{*menu*} as a wildcard matches @samp{pane.menubar} and
+@samp{menu@dots{}}.
+
+Experience shows that on some systems you may need to add
+@samp{shell.}@: before the @samp{pane.menubar} or @samp{menu*}.  On
+some other systems, you must not add @samp{shell.}.  The generic wildcard
+approach should work on both kinds of systems.
+
+  Here is a list of the specific resources for menu bars and pop-up menus:
+
+@table @code
+@item font
+Font for menu item text.
+@item fontSet
+Fontset for menu item text.
+@item foreground
+Color of the foreground.
+@item background
+Color of the background.
+@item buttonForeground
+In the menu bar, the color of the foreground for a selected item.
+@ifnottex
+@item horizontalSpacing
+Horizontal spacing in pixels between items.  Default is 3.
+@item verticalSpacing
+Vertical spacing in pixels between items.  Default is 2.
+@item arrowSpacing
+Horizontal spacing between the arrow (which indicates a submenu) and
+the associated text.  Default is 10.
+@item shadowThickness
+Thickness of shadow line around the widget.  Default is 1.
+
+Also determines the thickness of shadow lines around other objects,
+for instance 3D buttons and arrows.  If you have the impression that
+the arrows in the menus do not stand out clearly enough or that the
+difference between ``in'' and ``out'' buttons is difficult to see, set
+this to 2.  If you have no problems with visibility, the default
+probably looks better.  The background color may also have some effect
+on the contrast.
+@end ifnottex
+@item margin
+The margin of the menu bar, in characters.  Default is 1.
+@end table
+
+@ifnottex
+@node LessTif Resources
+@appendixsec LessTif Menu X Resources
+@cindex Menu X Resources (LessTif widgets)
+@cindex LessTif Widget X Resources
+
+  If the Emacs installed at your site was built to use the X toolkit
+with the LessTif or Motif widgets, then the menu bar, the dialog
+boxes, the pop-up menus, and the file-selection box are separate
+widgets and have their own resources.
+
+  The resource names for the menu bar contain @samp{pane.menubar}
+(following, as always, the name of the Emacs invocation, or
+@samp{Emacs}, which stands for all Emacs invocations).  Specify them
+like this:
+
+@smallexample
+Emacs.pane.menubar.@var{subwidget}.@var{resource}:  @var{value}
+@end smallexample
+
+  Each individual string in the menu bar is a subwidget; the subwidget's
+name is the same as the menu item string.  For example, the word
+@samp{File} in the menu bar is part of a subwidget named
+@samp{emacs.pane.menubar.File}.  Most likely, you want to specify the
+same resources for the whole menu bar.  To do this, use @samp{*} instead
+of a specific subwidget name.  For example, to specify the font
+@samp{8x16} for the menu-bar items, write this:
+
+@smallexample
+Emacs.pane.menubar.*.fontList:  8x16
+@end smallexample
+
+@noindent
+This also specifies the resource value for submenus.
+
+  Each item in a submenu in the menu bar also has its own name for X
+resources; for example, the @samp{File} submenu has an item named
+@samp{Save (current buffer)}.  A resource specification for a submenu
+item looks like this:
+
+@smallexample
+Emacs.pane.menubar.popup_*.@var{menu}.@var{item}.@var{resource}: @var{value}
+@end smallexample
+
+@noindent
+For example, here's how to specify the font for the @samp{Save (current
+buffer)} item:
+
+@smallexample
+Emacs.pane.menubar.popup_*.File.Save (current buffer).fontList: 8x16
+@end smallexample
+
+@noindent
+For an item in a second-level submenu, such as @samp{Complete Word}
+under @samp{Spell Checking} under @samp{Tools}, the resource fits this
+template:
+
+@smallexample
+Emacs.pane.menubar.popup_*.popup_*.@var{menu}.@var{resource}: @var{value}
+@end smallexample
+
+@noindent
+For example,
+
+@smallexample
+Emacs.pane.menubar.popup_*.popup_*.Spell Checking.Complete Word: @var{value}
+@end smallexample
+
+@noindent
+(This should be one long line.)
+
+  It's impossible to specify a resource for all the menu-bar items
+without also specifying it for the submenus as well.  So if you want the
+submenu items to look different from the menu bar itself, you must ask
+for that in two steps.  First, specify the resource for all of them;
+then, override the value for submenus alone.  Here is an example:
+
+@smallexample
+Emacs.pane.menubar.*.fontList:  8x16
+Emacs.pane.menubar.popup_*.fontList: 8x16
+@end smallexample
+
+@noindent
+For LessTif pop-up menus, use @samp{menu*} instead of
+@samp{pane.menubar}.  For example, to specify the font @samp{8x16} for
+the pop-up menu items, write this:
+
+@smallexample
+Emacs.menu*.fontList:  8x16
+@end smallexample
+
+@noindent
+For LessTif dialog boxes, use @samp{dialog} instead of @samp{menu}:
+
+@example
+Emacs.dialog*.fontList: 8x16
+Emacs.dialog*.foreground: hotpink
+@end example
+
+To specify resources for the LessTif file-selection box, use
+@samp{fsb*}, like this:
+
+@example
+Emacs.fsb*.fontList: 8x16
+@end example
+
+@iftex
+@medbreak
+@end iftex
+  Here is a list of the specific resources for LessTif menu bars and
+pop-up menus:
+
+@table @code
+@item armColor
+The color to show in an armed button.
+@item fontList
+The font to use.
+@item marginBottom
+@itemx marginHeight
+@itemx marginLeft
+@itemx marginRight
+@itemx marginTop
+@itemx marginWidth
+Amount of space to leave around the item, within the border.
+@item borderWidth
+The width of the border around the menu item, on all sides.
+@item shadowThickness
+The width of the border shadow.
+@item bottomShadowColor
+The color for the border shadow, on the bottom and the right.
+@item topShadowColor
+The color for the border shadow, on the top and the left.
+@end table
+@end ifnottex
+
+
+@node GTK resources
+@appendixsec GTK resources
+@iftex
+  The most common way to customize the GTK widgets Emacs uses (menus, dialogs
+tool bars and scroll bars) is by choosing an appropriate theme, for example
+with the GNOME theme selector.  You can also do Emacs specific customization
+by inserting GTK style directives in the file @file{~/.emacs.d/gtkrc}.  Some GTK
+themes ignore customizations in @file{~/.emacs.d/gtkrc} so not everything
+works with all themes.  To customize Emacs font, background, faces, etc., use
+the normal X resources (@pxref{Resources}).  We will present some examples of
+customizations here, but for a more detailed description, see the online manual
+
+  The first example is just one line.  It changes the font on all GTK widgets
+to courier with size 12:
+
+@smallexample
+gtk-font-name = "courier 12"
+@end smallexample
+
+  The thing to note is that the font name is not an X font name, like
+-*-helvetica-medium-r-*--*-120-*-*-*-*-*-*, but a Pango font name.  A Pango
+font name is basically of the format "family style size", where the style
+is optional as in the case above.  A name with a style could be for example:
+
+@smallexample
+gtk-font-name = "helvetica bold 10"
+@end smallexample
+
+  To customize widgets you first define a style and then apply the style to
+the widgets.  Here is an example that sets the font for menus, but not
+for other widgets:
+
+@smallexample
+# @r{Define the style @samp{menufont}.}
+style "menufont"
+@{
+  font_name = "helvetica bold 14"  # This is a Pango font name
+@}
+
+# @r{Specify that widget type @samp{*emacs-menuitem*} uses @samp{menufont}.}
+widget "*emacs-menuitem*" style "menufont"
+@end smallexample
+
+The widget name in this example contains wildcards, so the style will be
+applied to all widgets that match "*emacs-menuitem*".  The widgets are
+named by the way they are contained, from the outer widget to the inner widget.
+So to apply the style "my_style" (not shown) with the full, absolute name, for
+the menubar and the scroll bar in Emacs we use:
+
+@smallexample
+widget "Emacs.pane.menubar" style "my_style"
+widget "Emacs.pane.emacs.verticalScrollBar" style "my_style"
+@end smallexample
+
+But to avoid having to type it all, wildcards are often used.  @samp{*}
+matches zero or more characters and @samp{?} matches one character.  So "*"
+matches all widgets.
+
+  Each widget has a class (for example GtkMenuItem) and a name (emacs-menuitem).
+You can assign styles by name or by class.  In this example we have used the
+class:
+
+@smallexample
+style "menufont"
+@{
+  font_name = "helvetica bold 14"
+@}
+
+widget_class "*GtkMenuBar" style "menufont"
+@end smallexample
+
+@noindent
+The names and classes for the GTK widgets Emacs uses are:
+
+@multitable {@code{verticalScrollbar plus}} {@code{GtkFileSelection} and some}
+@item @code{emacs-filedialog}
+@tab @code{GtkFileSelection}
+@item @code{emacs-dialog}
+@tab @code{GtkDialog}
+@item @code{Emacs}
+@tab @code{GtkWindow}
+@item @code{pane}
+@tab @code{GtkVHbox}
+@item @code{emacs}
+@tab @code{GtkFixed}
+@item @code{verticalScrollBar}
+@tab @code{GtkVScrollbar}
+@item @code{emacs-toolbar}
+@tab @code{GtkToolbar}
+@item @code{menubar}
+@tab @code{GtkMenuBar}
+@item @code{emacs-menuitem}
+@tab anything in menus
+@end multitable
+
+  GTK absolute names are quite strange when it comes to menus
+and dialogs.  The names do not start with @samp{Emacs}, as they are
+free-standing windows and not contained (in the GTK sense) by the
+Emacs GtkWindow.  To customize the dialogs and menus, use wildcards like this:
+
+@smallexample
+widget "*emacs-dialog*" style "my_dialog_style"
+widget "*emacs-filedialog* style "my_file_style"
+widget "*emacs-menuitem* style "my_menu_style"
+@end smallexample
+
+  If you specify a customization in @file{~/.emacs.d/gtkrc}, then it
+automatically applies only to Emacs, since other programs don't read
+that file.  For example, the drop down menu in the file dialog can not
+be customized by any absolute widget name, only by an absolute class
+name.  This is because the widgets in the drop down menu do not
+have names and the menu is not contained in the Emacs GtkWindow.  To
+have all menus in Emacs look the same, use this in
+@file{~/.emacs.d/gtkrc}:
+
+@smallexample
+widget_class "*Menu*" style "my_menu_style"
+@end smallexample
+
+  Here is a more elaborate example, showing how to change the parts of
+the scroll bar:
+
+@smallexample
+style "scroll"
+@{
+  fg[NORMAL] = "red"@ @ @ @ @ # @r{The arrow color.}
+  bg[NORMAL] = "yellow"@ @ # @r{The thumb and background around the arrow.}
+  bg[ACTIVE] = "blue"@ @ @ @ # @r{The trough color.}
+  bg[PRELIGHT] = "white"@ # @r{The thumb color when the mouse is over it.}
+@}
+
+widget "*verticalScrollBar*" style "scroll"
+@end smallexample
+@end iftex
+
+@ifnottex
+@cindex GTK resources and customization
+@cindex resource files for GTK
+@cindex @file{~/.gtkrc-2.0} file
+@cindex @file{~/.emacs.d/gtkrc} file
+
+  If Emacs was built to use the GTK widget set, then the menu bar, tool bar,
+scroll bar and the dialogs are customized with the standard GTK
+customization file, @file{~/.gtkrc-2.0}, or with the Emacs specific
+file @file{~/.emacs.d/gtkrc}.  We recommend that you use
+@file{~/.emacs.d/gtkrc} for customizations, since @file{~/.gtkrc-2.0}
+seems to be ignored when running GConf with GNOME.  These files apply
+only to GTK widget features.  To customize Emacs font, background,
+faces, etc., use the normal X resources (@pxref{Resources}).
+
+  Some GTK themes override these mechanisms, which means that using
+these mechanisms will not work to customize them.
+
+  In these files you first define a style and say what it means; then
+you specify to apply the style to various widget types (@pxref{GTK
+widget names}).  Here is an example of how to change the font for
+Emacs menus:
+
+@smallexample
+# @r{Define the style @samp{menufont}.}
+style "menufont"
+@{
+  font_name = "helvetica bold 14"  # This is a Pango font name
+@}
+
+# @r{Specify that widget type @samp{*emacs-menuitem*} uses @samp{menufont}.}
+widget "*emacs-menuitem*" style "menufont"
+@end smallexample
+
+  Here is a more elaborate example, showing how to change the parts of
+the scroll bar:
+
+@smallexample
+style "scroll"
+@{
+  fg[NORMAL] = "red"@ @ @ @ @ # @r{The arrow color.}
+  bg[NORMAL] = "yellow"@ @ # @r{The thumb and background around the arrow.}
+  bg[ACTIVE] = "blue"@ @ @ @ # @r{The trough color.}
+  bg[PRELIGHT] = "white"@ # @r{The thumb color when the mouse is over it.}
+@}
+
+widget "*verticalScrollBar*" style "scroll"
+@end smallexample
+
+  There are also parameters that affect GTK as a whole.  For example,
+the property @code{gtk-font-name} sets the default font for GTK.  You
+must use Pango font names (@pxref{GTK styles}).  A GTK resources file
+that just sets a default font looks like this:
+
+@smallexample
+gtk-font-name = "courier 12"
+@end smallexample
+
+  The GTK resources file is fully described in the GTK API document.
+This can be found in
+@file{@var{prefix}/share/gtk-doc/html/gtk/gtk-resource-files.html},
+where @file{prefix} is the directory in which the GTK libraries were
+installed (usually @file{/usr} or @file{/usr/local}).  You can also
+find the document online, at
+@uref{http://developer.gnome.org/doc/API/2.0/gtk/gtk-Resource-Files.html}.
+
+@menu
+* GTK widget names::      How widgets in GTK are named in general.
+* GTK Names in Emacs::    GTK widget names in Emacs.
+* GTK styles::            What can be customized in a GTK widget.
+@end menu
+
+@node GTK widget names
+@appendixsubsec GTK widget names
+@cindex GTK widget names
+
+  A GTK widget is specified by its @dfn{widget class} and
+@dfn{widget name}.  The widget class is the type of the widget: for
+example, @code{GtkMenuBar}.  The widget name is the name given to a
+specific widget.  A widget always has a class, but need not have a
+name.
+
+  @dfn{Absolute names} are sequences of widget names or widget
+classes, corresponding to hierarchies of widgets embedded within
+other widgets.  For example, if a @code{GtkWindow} named @code{top}
+contains a @code{GtkVBox} named @code{box}, which in turn contains
+a @code{GtkMenuBar} called @code{menubar}, the absolute class name
+of the menu-bar widget is @code{GtkWindow.GtkVBox.GtkMenuBar}, and
+its absolute widget name is @code{top.box.menubar}.
+
+  When assigning a style to a widget, you can use the absolute class
+name or the absolute widget name.
+
+  There are two commands to specify changes for widgets:
+
+@table @asis
+@item @code{widget_class}
+specifies a style for widgets based on the absolute class name.
+
+@item @code{widget}
+specifies a style for widgets based on the absolute class name,
+or just the class.
+@end table
+
+@noindent
+You must specify the class and the style in double-quotes, and put
+these commands at the top level in the GTK customization file, like
+this:
+
+@smallexample
+style "menufont"
+@{
+  font_name = "helvetica bold 14"
+@}
+
+widget "top.box.menubar" style "menufont"
+widget_class "GtkWindow.GtkVBox.GtkMenuBar" style "menufont"
+@end smallexample
+
+  Matching of absolute names uses shell wildcard syntax: @samp{*}
+matches zero or more characters and @samp{?} matches one character.
+This example assigns @code{base_style} to all widgets:
+
+@smallexample
+widget "*" style "base_style"
+@end smallexample
+
+  Given the absolute class name @code{GtkWindow.GtkVBox.GtkMenuBar}
+and the corresponding absolute widget name @code{top.box.menubar}, all
+these examples specify @code{my_style} for the menu bar:
+
+@smallexample
+widget_class "GtkWindow.GtkVBox.GtkMenuBar" style "my_style"
+widget_class "GtkWindow.*.GtkMenuBar" style "my_style"
+widget_class "*GtkMenuBar" style "my_style"
+widget "top.box.menubar" style "my_style"
+widget "*box*menubar" style "my_style"
+widget "*menubar" style "my_style"
+widget "*menu*" style "my_style"
+@end smallexample
+
+@node GTK Names in Emacs
+@appendixsubsec GTK Widget Names in Emacs
+@cindex GTK widget names
+@cindex GTK widget classes
+
+  In Emacs, the top level widget for a frame is a @code{GtkWindow}
+that contains a @code{GtkVBox}.  The @code{GtkVBox} contains the
+@code{GtkMenuBar} and a @code{GtkFixed} widget.  The vertical scroll
+bars, @code{GtkVScrollbar}, are contained in the @code{GtkFixed}
+widget.  The text you write in Emacs is drawn in the @code{GtkFixed}
+widget.
+
+  Dialogs in Emacs are @code{GtkDialog} widgets.  The file dialog is a
+@code{GtkFileSelection} widget.
+
+@noindent
+To set a style for the menu bar using the absolute class name, use:
+
+@smallexample
+widget_class "GtkWindow.GtkVBox.GtkMenuBar" style "my_style"
+@end smallexample
+
+@noindent
+For the scroll bar, the absolute class name is:
+
+@smallexample
+widget_class
+  "GtkWindow.GtkVBox.GtkFixed.GtkVScrollbar"
+     style "my_style"
+@end smallexample
+
+@noindent
+The names for the emacs widgets, and their classes, are:
+
+@multitable {@code{verticalScrollbar plus}} {@code{GtkFileSelection} and some}
+@item @code{emacs-filedialog}
+@tab @code{GtkFileSelection}
+@item @code{emacs-dialog}
+@tab @code{GtkDialog}
+@item @code{Emacs}
+@tab @code{GtkWindow}
+@item @code{pane}
+@tab @code{GtkVHbox}
+@item @code{emacs}
+@tab @code{GtkFixed}
+@item @code{verticalScrollBar}
+@tab @code{GtkVScrollbar}
+@item @code{emacs-toolbar}
+@tab @code{GtkToolbar}
+@item @code{menubar}
+@tab @code{GtkMenuBar}
+@item @code{emacs-menuitem}
+@tab anything in menus
+@end multitable
+
+@noindent
+Thus, for Emacs you can write the two examples above as:
+
+@smallexample
+widget "Emacs.pane.menubar" style "my_style"
+widget "Emacs.pane.emacs.verticalScrollBar" style "my_style"
+@end smallexample
+
+  GTK absolute names are quite strange when it comes to menus
+and dialogs.  The names do not start with @samp{Emacs}, as they are
+free-standing windows and not contained (in the GTK sense) by the
+Emacs GtkWindow.  To customize the dialogs and menus, use wildcards like this:
+
+@smallexample
+widget "*emacs-dialog*" style "my_dialog_style"
+widget "*emacs-filedialog* style "my_file_style"
+widget "*emacs-menuitem* style "my_menu_style"
+@end smallexample
+
+  If you specify a customization in @file{~/.emacs.d/gtkrc}, then it
+automatically applies only to Emacs, since other programs don't read
+that file.  For example, the drop down menu in the file dialog can not
+be customized by any absolute widget name, only by an absolute class
+name.  This is because the widgets in the drop down menu do not
+have names and the menu is not contained in the Emacs GtkWindow.  To
+have all menus in Emacs look the same, use this in
+@file{~/.emacs.d/gtkrc}:
+
+@smallexample
+widget_class "*Menu*" style "my_menu_style"
+@end smallexample
+
+@node GTK styles
+@appendixsubsec GTK styles
+@cindex GTK styles
+
+  In a GTK style you specify the appearance widgets shall have.  You
+can specify foreground and background color, background pixmap and
+font.  The edit widget (where you edit the text) in Emacs is a GTK
+widget, but trying to specify a style for the edit widget will have no
+effect.  This is so that Emacs compiled for GTK is compatible with
+Emacs compiled for other X toolkits.  The settings for foreground,
+background and font for the edit widget is taken from the X resources;
+@pxref{Resources}.  Here is an example of two style declarations,
+@samp{default} and @samp{ruler}:
+
+@smallexample
+pixmap_path "/usr/share/pixmaps:/usr/include/X11/pixmaps"
+
+style "default"
+@{
+  font_name = "helvetica 12"
+
+  bg[NORMAL] = @{ 0.83, 0.80, 0.73 @}
+  bg[SELECTED] = @{ 0.0, 0.55, 0.55 @}
+  bg[INSENSITIVE] = @{ 0.77, 0.77, 0.66 @}
+  bg[ACTIVE] = @{ 0.0, 0.55, 0.55 @}
+  bg[PRELIGHT] = @{ 0.0, 0.55, 0.55 @}
+
+  fg[NORMAL] = "black"
+  fg[SELECTED] = @{ 0.9, 0.9, 0.9 @}
+  fg[ACTIVE] = "black"
+  fg[PRELIGHT] = @{ 0.9, 0.9, 0.9 @}
+
+  base[INSENSITIVE] = "#777766"
+  text[INSENSITIVE] = @{ 0.60, 0.65, 0.57 @}
+
+  bg_pixmap[NORMAL] = "background.xpm"
+  bg_pixmap[INSENSITIVE] = "background.xpm"
+  bg_pixmap[ACTIVE] = "background.xpm"
+  bg_pixmap[PRELIGHT] = "<none>"
+
+@}
+
+style "ruler" = "default"
+@{
+  font_name = "helvetica 8"
+@}
+
+@end smallexample
+
+  The style @samp{ruler} inherits from @samp{default}.  This way you can build
+on existing styles.  The syntax for fonts and colors is described below.
+
+  As this example shows, it is possible to specify several values for
+foreground and background depending on the widget's @dfn{state}.  The
+possible states are:
+
+@table @code
+@item NORMAL
+This is the default state for widgets.
+@item ACTIVE
+This is the state for a widget that is ready to do something.  It is
+also for the trough of a scroll bar, i.e.  @code{bg[ACTIVE] = "red"}
+sets the scroll bar trough to red.  Buttons that have been pressed but
+not released yet (``armed'') are in this state.
+@item PRELIGHT
+This is the state for a widget that can be manipulated, when the mouse
+pointer is over it---for example when the mouse is over the thumb in
+the scroll bar or over a menu item.  When the mouse is over a button
+that is not pressed, the button is in this state.
+@item SELECTED
+This is the state for data that has been selected by the user.  It can
+be selected text or items selected in a list.  This state is not used
+in Emacs.
+@item INSENSITIVE
+This is the state for widgets that are visible, but they can not be
+manipulated in the usual way---for example, buttons that can't be
+pressed, and disabled menu items.  To display disabled menu items in
+yellow, use @code{fg[INSENSITIVE] = "yellow"}.
+@end table
+
+  Here are the things that can go in a style declaration:
+
+@table @code
+@item bg[@var{state}] = @var{color}
+This specifies the background color for the widget.  Note that
+editable text doesn't use @code{bg}; it uses @code{base} instead.
+
+@item base[@var{state}] = @var{color}
+This specifies the background color for editable text.  In Emacs, this
+color is used for the background of the text fields in the file
+dialog.
+
+@item bg_pixmap[@var{state}] = "@var{pixmap}"
+This specifies an image background (instead of a background color).
+@var{pixmap} should be the image file name.  GTK can use a number of
+image file formats, including XPM, XBM, GIF, JPEG and PNG.  If you
+want a widget to use the same image as its parent, use
+@samp{<parent>}.  If you don't want any image, use @samp{<none>}.
+@samp{<none>} is the way to cancel a background image inherited from a
+parent style.
+
+You can't specify the file by its absolute file name.  GTK looks for
+the pixmap file in directories specified in @code{pixmap_path}.
+@code{pixmap_path} is a colon-separated list of directories within
+double quotes, specified at the top level in a @file{gtkrc} file
+(i.e. not inside a style definition; see example above):
+
+@smallexample
+pixmap_path "/usr/share/pixmaps:/usr/include/X11/pixmaps"
+@end smallexample
+
+@item fg[@var{state}] = @var{color}
+This specifies the foreground color for widgets to use.  It is the
+color of text in menus and buttons, and the color for the arrows in
+the scroll bar.  For editable text, use @code{text}.
+
+@item text[@var{state}] = @var{color}
+This is the color for editable text.  In Emacs, this color is used for the
+text fields in the file dialog.
+
+@item font_name = "@var{font}"
+This specifies the font for text in the widget.  @var{font} is a
+Pango font name, for example @samp{Sans Italic 10}, @samp{Helvetica
+Bold 12}, @samp{Courier 14}, @samp{Times 18}.  See below for exact
+syntax.  The names are case insensitive.
+@end table
+
+  There are three ways to specify a color: by name, in hexadecimal
+form, and with an RGB triplet.
+
+@noindent
+A color name is written within double quotes, for example @code{"red"}.
+
+@noindent
+Hexadecimal form is the same as in X:
+@code{#@var{rrrr}@var{gggg}@var{bbbb}}, where all three color specs
+must have the same number of hex digits (1, 2, 3 or 4).
+
+@noindent
+An RGB triplet looks like @code{@{ @var{r}, @var{g}, @var{b} @}},
+where @var{r}, @var{g} and @var{b} are either integers in the range
+0-65535 or floats in the range 0.0-1.0.
+
+  Pango font names have the form ``@var{family-list} @var{style-options}
+@var{size}.''
+@cindex Pango font name
+@noindent
+@var{family-list} is a comma separated list of font families optionally
+terminated by a comma.  This way you can specify several families and the
+first one found will be used.  @var{family} corresponds to the second part in
+an X font name, for example in
+
+@smallexample
+-adobe-times-medium-r-normal--12-120-75-75-p-64-iso10646-1
+@end smallexample
+
+@noindent
+the family name is @samp{times}.
+
+@noindent
+@var{style-options} is a whitespace separated list of words where each word
+is a style, variant, weight, or stretch.  The default value for all of
+these is @code{normal}.
+
+@noindent
+A `style' corresponds to the fourth part of an X font name.  In X font
+names it is the character @samp{r}, @samp{i} or @samp{o}; in Pango
+font names the corresponding values are @code{normal}, @code{italic},
+or @code{oblique}.
+
+@noindent
+A `variant' is either @code{normal} or @code{small-caps}.
+Small caps is a font with the lower case characters replaced by
+smaller variants of the capital characters.
+
+@noindent
+Weight describes the ``boldness'' of a font.  It corresponds to the third
+part of an X font name.  It is one of @code{ultra-light}, @code{light},
+@code{normal}, @code{bold}, @code{ultra-bold}, or @code{heavy}.
+
+@noindent
+Stretch gives the width of the font relative to other designs within a
+family.  It corresponds to the fifth part of an X font name.  It is one of
+@code{ultra-condensed}, @code{extra-condensed}, @code{condensed},
+@code{semi-condensed}, @code{normal}, @code{semi-expanded},
+@code{expanded}, @code{extra-expanded}, or @code{ultra-expanded}.
+
+@noindent
+@var{size} is a decimal number that describes the font size in points.
+@end ifnottex
+
+@ignore
+   arch-tag: 9b6ff773-48b6-41f6-b2f9-f114b8bdd97f
+@end ignore
diff --git a/doc/misc/.gitignore b/doc/misc/.gitignore
new file mode 100644 (file)
index 0000000..3ff56b4
--- /dev/null
@@ -0,0 +1,23 @@
+*.aux
+*.cp
+*.cps
+*.dvi
+*.fn
+*.fns
+*.ky
+*.kys
+*.log
+*.op
+*.ops
+*.pdf
+*.pg
+*.pgs
+*.ps
+*.tmp
+*.toc
+*.tp
+*.tps
+*.vr
+*.vrs
+Makefile
+makefile
diff --git a/doc/misc/ChangeLog b/doc/misc/ChangeLog
new file mode 100644 (file)
index 0000000..056ad37
--- /dev/null
@@ -0,0 +1,3918 @@
+2007-10-06  Michael Albinus  <michael.albinus@gmx.de>
+
+       * tramp.texi (External packages): New section.
+
+2007-09-29  Juri Linkov  <juri@jurta.org>
+
+       * info.texi (Help-Int): Document `L' (`Info-history').
+
+2007-09-26  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi: Change links to webpage and maintained email.
+       (Remember): Promote to Chapter, significant changes.
+       (Fast access to TODO states): New section.
+       (Faces for TODO keywords): New section.
+       (Export options): Example for #+DATE.
+       (Progress logging): Section moved.
+
+2007-09-26  Bill Wohler  <wohler@newt.com>
+
+       * mh-e.texi (HTML): Mention binding of S-mouse-2 to
+       browse-url-at-mouse.
+
+2007-09-20  Eduard Wiebe  <usenet@pusto.de>  (tiny change)
+
+       * flymake.texi (Customizable variables): Face names don't end in -face.
+       Fix flymake-err-line-patterns template.
+       (Example -- Configuring a tool called directly): Fix init-function.
+       (Highlighting erroneous lines): Face names don't end in -face.
+
+2007-09-18  Exal de Jesus Garcia Carrillo  <exal@gmx.de>  (tiny change)
+
+       * erc.texi (Special-Features): Fix small typo.
+
+2007-09-14  Michael Albinus  <michael.albinus@gmx.de>
+
+       * tramp.texi (Filename Syntax): Provide links to "Inline methods"
+       and "External transfer methods".
+
+2007-09-13  Jay Belanger  <jay.p.belanger@gmail.com>
+
+       * calc.texi (Predefined Units): Add some history.
+
+2007-09-08  Michael Olson  <mwolson@gnu.org>
+
+       * erc.texi (Copying): New section included from gpl.texi.  This matches
+       the look of the upstream ERC manual.
+
+2007-09-07  Jay Belanger  <jay.p.belanger@gmail.com>
+
+       * calc.texi (History and Acknowledgements): Adjust the
+       "thanks".
+       (Random Numbers): Clarify the distribution of `random'.
+
+2007-09-06  Glenn Morris  <rgm@gnu.org>
+
+       * Move manual sources from man/ to subdirectories of doc/.
+        Split into the Emacs manual in emacs/, and other manuals in misc/.
+       Change all setfilename commands to use ../../info.
+       * Makefile.in: Move the parts of the old man/Makefile.in that do not
+       refer to the Emacs manual here.
+       (infodir): New variable.
+       (INFO_TARGETS, info): Use infodir.  Also used by all info targets.
+       (cc-mode.texi, faq.texi): Update references to source file locations.
+       * makefile.w32-in: Move the parts of the old man/makefile.w32-in that
+       do not refer to the Emacs manual here.
+       (infodir, MULTI_INSTALL_INFO, ENVADD): Go up one more level.
+
+       * Makefile.in: Add `basename' versions of all info targets, for
+       convenience when rebuilding just one manual.
+       (../etc/GNU): Delete obsolete target.
+       (.SUFFIXES): Use $(TEXI2DVI) rather than texi2dvi.
+       (mostlyclean): Add *.op, *.ops.  Move *.aux *.cps *.fns *.kys *.pgs
+        *.vrs *.toc here...
+        (maintainer-clean): ...from here.
+
+       * makefile.w32-in (../etc/GNU): Delete obsolete target.
+
+2007-09-01  Jay Belanger  <jay.p.belanger@gmail.com>
+
+       * calc.texi (Date Conversions): Clarify definition of
+       Julian day numbering.
+       (Date Forms): Clarify definition of Julian day numbering;
+       add some history.
+
+2007-08-30  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi: Version 5.07
+
+2007-08-24  IRIE Tetsuya  <irie@t.email.ne.jp>  (tiny change)
+
+       * message.texi (MIME): Replace mml-attach with mml-attach-file.
+
+2007-08-22  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi (Adding hyperlink types): New section.
+       (Embedded LaTeX): Chapter updated because of LaTeX export.
+       (LaTeX export): New section.
+       (Using links out): New section.
+
+2007-08-22  Glenn Morris  <rgm@gnu.org>
+
+       * faq.texi (Learning how to do something): Refcards now in
+       etc/refcards/ directory.
+
+2007-08-22  Michael Albinus  <michael.albinus@gmx.de>
+
+       * tramp.texi (Remote Programs): Persistency file must be cleared when
+       changing `tramp-remote-path'.
+       (Filename Syntax): Don't use @var{} constructs inside the @trampfn
+       macro.
+
+2007-08-17  Jay Belanger  <jay.p.belanger@gmail.com>
+
+       * calc.texi: Move contents to beginning of file.
+       (Algebraic Entry): Fix the formatting of an example.
+
+2007-08-15  Jay Belanger  <jay.p.belanger@gmail.com>
+
+       * calc.texi (Basic Operations on Units): Mention exact versus
+       inexact conversions.
+
+2007-08-14  Jay Belanger  <jay.p.belanger@gmail.com>
+
+       * calc.texi (Basic Operations on Units): Mention default
+       values for new units.
+       (Quick Calculator Mode): Mention that binary format will
+       be displayed.
+
+2007-08-14  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (Selecting a Group): Mention gnus-maximum-newsgroup.
+
+2007-08-10  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (NNTP): Mention nntp-xref-number-is-evil.
+
+2007-08-08  Glenn Morris  <rgm@gnu.org>
+
+       * gnus.texi, sieve.texi: Replace `iff'.
+
+2007-08-03  Jay Belanger  <jay.p.belanger@gmail.com>
+
+       * calc.texi (Basic Graphics): Mention the graphing of error
+       forms.
+       (Graphics Options): Mention how `g s' handles error forms.
+       (Curve Fitting): Mention plotting the curves.
+       (Standard Nonlinear Models): Add additional models.
+       (Curve Fitting Details): Mention the Levenberg-Marquardt method.
+       (Linear Fits): Correct result.
+
+2007-08-01  Alan Mackenzie  <acm@muc.de>
+
+       * cc-mode.texi (Mailing Lists and Bug Reports): Correct "-no-site-file"
+       to "--no-site-file".
+
+2007-07-29  Michael Albinus  <michael.albinus@gmx.de>
+
+       * tramp.texi (Frequently Asked Questions): Point to mode line
+       extension in Emacs 23.1.
+
+       * trampver.texi: Update release number.
+
+2007-07-27  Glenn Morris  <rgm@gnu.org>
+
+       * calc.texi (Copying): Include license text from gpl.texi, rather than
+       in-line.
+
+2007-07-25  Glenn Morris  <rgm@gnu.org>
+
+       * calc.texi (Copying): Replace license with GPLv3.
+
+       * Relicense all FSF files to GPLv3 or later.
+
+2007-07-22  Michael Albinus  <michael.albinus@gmx.de>
+
+       Sync with Tramp 2.1.10.
+
+       * tramp.texi (trampfn): Expand macro implementation in order to handle
+       empty arguments.
+       (trampfnmhl, trampfnuhl, trampfnhl): Remove macros.  Replace all
+       occurencies by trampfn.
+       (Frequently Asked Questions): Extend example code for host
+       identification in the modeline. Add bbdb to approaches shortening Tramp
+       file names to be typed.
+
+       * trampver.texi: Update release number.
+
+2007-07-17  Michael Albinus  <michael.albinus@gmx.de>
+
+       * tramp.texi: Move @setfilename ../info/tramp up, outside the header
+       section.  Reported by <poti@potis.org>.
+       (Remote processes): Arguments of the program to be debugged are taken
+       literally.
+       (Frequently Asked Questions): Simplify recentf example.
+
+2007-07-14  Karl Berry  <karl@gnu.org>
+
+       * info.texi (@copying): New Back-Cover Text.
+
+       * info.texi (Quitting Info): Move to proper place in source.
+       (Reported by Benno Schulenberg.)
+
+2007-07-13  Eli Zaretskii  <eliz@gnu.org>
+
+       * Makefile.in (../info/emacs-mime): Use --enable-encoding.
+
+       * makefile.w32-in ($(infodir)/emacs-mime): Ditto.
+
+       * emacs-mime.texi: Add @documentencoding directive.
+
+2007-07-12  Nick Roberts  <nickrob@snap.net.nz>
+
+       * tramp.texi (Remote processes): Add an anchor to the subsection
+       "Running a debugger on a remote host".
+
+2007-07-12  Michael Albinus  <michael.albinus@gmx.de>
+
+       * tramp.texi (Remote processes): Don't call it "experimental" any
+       longer.  Add subsection about running a debugger on a remote host.
+
+2007-07-10  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi (Properties and columns): Chapter rewritten.
+
+2007-07-08  Michael Albinus  <michael.albinus@gmx.de>
+
+       * tramp.texi:
+       * trampver.texi: Migrate to Tramp 2.1.
+
+2007-07-02  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi (Properties): New chapter.
+
+2007-07-02  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus-faq.texi ([3.2]): Fix locating of environment variables in the
+       Control Panel.
+
+       * gnus.texi (Misc Article): Add index entry for
+       gnus-single-article-buffer.
+
+2007-06-27  Andreas Seltenreich  <andreas@gate450.dyndns.org>
+
+       * gnus.texi (Starting Up): Fix typo.
+
+2007-06-25  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (Asynchronous Fetching): Fix typo.
+
+2007-06-20  Jay Belanger  <jay.p.belanger@gmail.com>
+
+       * calc.texi:Change ifinfo to ifnottex (as appropriate) throughout.
+       (About This Manual): Remove redundant information.
+       (Getting Started): Mention author.
+       (Basic Arithmetic, Customizing Calc): Make description of the
+       variable `calc-multiplication-has-precedence' match its new effect.
+
+2007-06-19  Jay Belanger  <jay.p.belanger@gmail.com>
+
+       * calc.texi (Basic Arithmetic, Customizing Calc): Mention
+       the variable `calc-multiplication-has-precedence'.
+
+2007-06-19  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi (Tag): Section swapped with node Timestamps.
+       (Formula syntax for Lisp): Document new `L' flag.
+
+2007-06-06  Andreas Seltenreich  <andreas@gate450.dyndns.org>
+
+       * gnus.texi (Misc Group Stuff, Summary Buffer)
+       (Server Commands, Article Keymap): Fix typo.  s/function/command/.
+
+2007-06-06  Juanma Barranquero  <lekktu@gmail.com>
+
+       * cc-mode.texi (Comment Commands, Getting Started, Style Variables):
+       * gnus.texi (Article Buttons, Mail Source Customization)
+       (Sending or Not Sending, Customizing NNDiary):
+       * message.texi (Message Headers):
+       * mh-e.texi (HTML): Fix typos.
+
+2007-06-07  Michael Albinus  <michael.albinus@gmx.de>
+
+       Sync with Tramp 2.0.56.
+
+       * tramp.texi (Frequently Asked Questions): Improve ~/.zshrc
+       settings.  Reported by Ted Zlatanov <tzz@lifelogs.com>.
+
+2007-06-02  Chong Yidong  <cyd@stupidchicken.com>
+
+       * Version 22.1 released.
+
+2007-05-26  Michael Olson  <mwolson@gnu.org>
+
+       * erc.texi (Modules): Fix references to completion modules.
+
+2007-05-09  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus.texi (Running NNDiary): Use ~/.gnus.el instead of gnusrc.
+
+2007-05-09  Didier Verna  <didier@xemacs.org>
+
+       * gnus.texi (Email Based Diary): New.  Proper documentation for the
+       nndiary back end and the gnus-diary library.
+
+2007-05-03  Karl Berry  <karl@gnu.org>
+
+       * .cvsignore (*.pdf): New entry.
+
+       * texinfo.tex: Update from current version for better pdf generation.
+
+2007-04-30  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus.texi (Article Highlighting): Clarify gnus-cite-parse-max-size.
+
+2007-04-28  Glenn Morris  <rgm@gnu.org>
+
+       * faq.texi (New in Emacs 22): Restore mention of python.el pending
+       consideration of legal status.
+
+2007-04-27  J.D. Smith  <jdsmith@as.arizona.edu>
+
+       * idlwave.texi: Minor updates for IDLWAVE 6.1.
+
+2007-04-24  Chong Yidong  <cyd@stupidchicken.com>
+
+       * faq.texi (New in Emacs 22): python.el removed.
+
+2007-04-23  Jay Belanger  <jay.p.belanger@gmail.com>
+
+       * calc.texi (Reporting bugs): Update maintainer's address.
+
+2007-04-22  Chong Yidong  <cyd@stupidchicken.com>
+
+       * faq.texi (New in Emacs 22): Rename "tumme" to "image-dired".
+
+2007-04-15  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi (Title page): Remove the date.
+       (Basic Arithmetic): Emphasize that / binds less strongly than *.
+       (The Standard Calc Interface): Change trail title.
+       (Floats): Mention that when non-decimal floats are entered, only
+       approximations are stored.
+       (Copying): Move to the appendices.
+       (GNU Free Documentation License): Add as an appendix.
+
+2007-04-15  Chong Yidong  <cyd@stupidchicken.com>
+
+       * ada-mode.texi, autotype.texi, cc-mode.texi, cl.texi:
+       * dired-x.texi, ebrowse.texi, ediff.texi:
+       * emacs-mime.texi, erc.texi, eshell.texi:
+       * eudc.texi, flymake.texi, forms.texi, gnus.texi:
+       * idlwave.texi, message.texi, newsticker.texi, org.texi:
+       * pcl-cvs.texi, pgg.texi, rcirc.texi, reftex.texi, sc.texi:
+       * ses.texi, sieve.texi, smtpmail.texi, speedbar.texi:
+       * tramp.texi, url.texi, vip.texi, viper.texi, widget.texi:
+       * woman.texi: Include GFDL.
+
+       * doclicense.texi: Remove node heading, so that it can be included by
+       other files.
+
+       * dired-x.texi: Relicence under GFDL.  Remove date from title page.
+
+       * calc.texi (Algebraic Tutorial): Emphasize that / binds less strongly
+       than *.
+
+2007-04-14  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi (Formula syntax for Calc): Emphasize the operator precedence
+       in Calc.
+
+2007-04-09  Romain Francoise  <romain@orebokech.com>
+
+       * faq.texi (New in Emacs 22): Mention improvements to the Windows and
+       Mac OS ports.  Make it clear that mouse-1 complements and doesn't
+       replace mouse-2.
+
+2007-04-08  Chong Yidong  <cyd@stupidchicken.com>
+
+       * woman.texi (Word at point, Interface Options): woman-topic-at-point
+       renamed to woman-use-topic-at-point.  Document new behavior.
+
+2007-04-08  Richard Stallman  <rms@gnu.org>
+
+       * url.texi: Fix some indexing.
+       (Disk Caching): Drop discussion of old/other Emacs versions.
+
+2007-04-07  Chong Yidong  <cyd@stupidchicken.com>
+
+       * url.texi (Disk Caching): Say Emacs 21 "and later".
+
+       * cc-mode.texi (Font Locking Preliminaries): Link to Emacs manual node
+       on Font locking which now mentions JIT lock.
+
+2007-04-01  Michael Olson  <mwolson@gnu.org>
+
+       * erc.texi: Update for the ERC 5.2 release.
+
+2007-03-31  David Kastrup  <dak@gnu.org>
+
+       * woman.texi (Topic, Interface Options): Explain changes semantics of
+       woman-manpath in order to consider MANPATH_MAP entries.
+
+2007-03-31  Eli Zaretskii  <eliz@gnu.org>
+
+       * emacs-mime.texi (Non-MIME): Postscript -> PostScript.
+
+2007-03-26  Richard Stallman  <rms@gnu.org>
+
+       * pgg.texi (Caching passphrase): Clean up previous change.
+
+2007-03-25  Thien-Thi Nguyen  <ttn@gnu.org>
+
+       * gnus.texi (Setting Process Marks): Fix typo.
+
+2007-03-25  Romain Francoise  <romain@orebokech.com>
+
+       * faq.texi (New in Emacs 22): Reorganize using an itemized list for
+       readability, and include various fixes by Daniel Brockman, Nick Roberts
+       and Dieter Wilhelm.
+
+2007-03-24  Thien-Thi Nguyen  <ttn@gnu.org>
+
+       * gnus.texi (Splitting Mail): Reword "splitting"-as-adj to be -as-noun.
+
+       * gnus.texi (Mail Source Specifiers): Fix typo.
+
+2007-03-22  Ralf Angeli  <angeli@caeruleus.net>
+
+       * reftex.texi (Imprint): Update maintainer information.
+
+2007-03-15  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * message.texi (Message Buffers): Update documentation for
+       message-generate-new-buffers.
+
+2007-03-15  Daiki Ueno  <ueno@unixuser.org>
+
+       * pgg.texi (Caching passphrase): Describe pgg-passphrase-coding-system.
+
+2007-03-21  Glenn Morris  <rgm@gnu.org>
+
+       * eshell.texi (Known problems): Emacs 22 comes with eshell 2.4.2.
+
+2007-03-19  Chong Yidong  <cyd@stupidchicken.com>
+
+       * eshell.texi (Known problems): Emacs 21 -> 22.
+
+       * cc-mode.texi (Performance Issues): Update note about 21.3 to 22.1.
+
+2007-03-18  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi (Time Zones): Mention that the DST rules changed in 2007.
+
+2007-03-12  Glenn Morris  <rgm@gnu.org>
+
+       * calc.texi (Time Zones): Switch to new North America DST rule.
+
+       * calc.texi: Replace "daylight savings" with "daylight
+       saving" in text throughout.
+
+2007-03-11  Andreas Seltenreich  <uwi7@rz.uni-karlsruhe.de>
+
+       * gnus.texi (Mail and Post): Update documentation for gnus-user-agent.
+       The variable now uses a list of symbols instead of just a symbol.
+       Reported by Christoph Conrad <christoph.conrad@gmx.de>.
+
+2007-03-06  Romain Francoise  <romain@orebokech.com>
+
+       * faq.texi (New in Emacs 22): Don't say "now" too much.  Add MH-E to
+       new packages, and mention Gnus update.
+
+2007-02-27  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (NNTP): Mention nntp-never-echoes-commands and
+       nntp-open-connection-functions-never-echo-commands.
+
+2007-02-27  Chong Yidong  <cyd@stupidchicken.com>
+
+       * pgg.texi (Caching passphrase): Document gpg-agent usage, gpg-agent
+       problems on the console, and security risk in not using gpg-agent.
+
+2007-02-25  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi (The spreadsheet): Renamed from "Table calculations".
+       Completely reorganized and rewritten.
+       (CamelCase links): Section removed.
+       (Repeating items): New section.
+       (Tracking TODO state changes): New section.
+       (Agenda views): Chapter reorganized and rewritten.
+       (HTML export): Section rewritten.
+       (Tables in arbitrary syntax): New section.
+       (Summary): Better feature summary.
+       (Activation): Document problem with cut-and-paste of Lisp code
+       from PDF files.
+       (Visibility cycling): Document indirect buffer use.
+       (Structure editing): Document sorting.
+       (Remember): Section rewritten.
+       (Time stamps): Better description of time stamp types.
+       (Tag searches): Document regular expression search for tags.
+       (Stuck projects): New section.
+       (In-buffer settings): New keywords.
+       (History and Acknowledgments): Updated description.
+
+2007-02-24  Alan Mackenzie  <acm@muc.de>
+
+       * cc-mode.texi (Movement Commands): Insert two missing command names.
+       (Getting Started): Slight wording correction (use conditional).
+
+2007-02-22  Kim F. Storm  <storm@cua.dk>
+
+       * widget.texi (User Interface, Basic Types): Document need to put some
+       text before the %v escape in :format string in editable-field widget.
+
+2007-02-18  Romain Francoise  <romain@orebokech.com>
+
+       * pcl-cvs.texi (Miscellaneous commands): q runs `cvs-bury-buffer', not
+       `cvs-mode-quit'.
+
+2007-02-10  Markus Triska  <markus.triska@gmx.at>
+
+       * widget.texi (Programming Example): Put constant strings in :format.
+
+2007-02-07  Juanma Barranquero  <lekktu@gmail.com>
+
+       * faq.texi (Fullscreen mode on MS-Windows): New node.
+
+2007-02-04  David Kastrup  <dak@gnu.org>
+
+       * faq.texi (AUCTeX): Update version number.  Should probably be done
+       for other packages as well.
+
+2007-01-28  Andreas Seltenreich  <uwi7@rz.uni-karlsruhe.de>
+
+       * gnus.texi (Batching Agents): Fix example.  Reported by Tassilo Horn
+       <tassilo@member.fsf.org>.
+
+2007-01-27  Eli Zaretskii  <eliz@gnu.org>
+
+       * msdog.texi (ls in Lisp): Document ls-lisp-format-time-list and
+       ls-lisp-use-localized-time-format.
+
+2007-01-20  Markus Triska  <markus.triska@gmx.at>
+
+       * flymake.texi (Flymake mode): find-file-hook instead of ...-hooks.
+
+2007-01-13  Michael Olson  <mwolson@gnu.org>
+
+       * erc.texi (Modules): Mention capab-identify module.
+
+2007-01-05  Michael Olson  <mwolson@gnu.org>
+
+       * erc.texi (Getting Started): Update for /RECONNECT command.
+
+2007-01-04  Richard Stallman  <rms@gnu.org>
+
+       * ebrowse.texi: Change C-c b to C-c C-m.
+
+2007-01-03  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus.texi (Customizing Articles): Use index entries for gnus-treat-*
+       variables only in info to avoid redundant entries in the printed
+       manual.
+
+2007-01-02  Daiki Ueno  <ueno@unixuser.org>
+
+       * message.texi (Using PGP/MIME): Document gpg-agent usage.
+
+2007-01-02  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * message.texi (Security): Split into sub-nodes.
+
+2007-01-01  Alan Mackenzie  <acm@muc.de>
+
+       * cc-mode.texi ("Limitations and Known Bugs"): Document problems with
+       eval-after-load in Emacs <=21 and a workaround.  Document that
+       trigraphs are not supported.
+
+2007-01-01  Alan Mackenzie  <acm@muc.de>
+
+       * cc-mode.texi ("Filling and Breaking"): Amend the doc for
+       c-context-line-break.  When invoked within a string, preserve
+       whitespace.  Add a backslash only when also in a macro.
+
+2007-01-01  Alan Mackenzie  <acm@muc.de>
+
+       * cc-mode.texi ("Choosing a Style"): Mention c-file-style.
+
+2007-01-01  Alan Mackenzie  <acm@muc.de>
+
+       * cc-mode.texi ("Movement Commands", "Sample .emacs File"): C-M-[ae]
+       are now bound by default to c-\(beginning\|end\)-of-defun by default.
+
+2007-01-01  Alan Mackenzie  <acm@muc.de>
+
+       * cc-mode.texi ("Other Commands"): Move c-set-style (C-c .) here from
+       "Choosing a Style".
+
+       * cc-mode.texi ("Styles"): Add @dfn{style}.
+
+2006-12-30  Michael Albinus  <michael.albinus@gmx.de>
+
+       Sync with Tramp 2.0.55.
+
+       * trampver.texi: Update release number.
+
+2006-12-29  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus.texi (Customizing Articles): Add index entries for all
+       gnus-treat-* variables.
+
+2006-12-29  Jouni K. Sepp\e,Ad\e(Bnen  <jks@iki.fi>
+
+       * gnus.texi (IMAP): Fix incorrect explanation of
+       nnimap-search-uids-not-since-is-evil in documentation for
+       nnimap-expunge-search-string.
+
+2006-12-27  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus.texi (ifile spam filtering): Rename spam-ifile-database-path to
+       spam-ifile-database.
+
+2006-12-26  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus.texi (Spam Package Configuration Examples): Don't encourage to
+       rebind C-s.
+
+2006-12-26  Jouni K. Sepp\e,Ad\e(Bnen  <jks@iki.fi>
+
+       * gnus.texi (Group Parameters, Group Maintenance, Topic Commands)
+       (Mail Group Commands, Expiring Mail, IMAP): Add index entries for
+       "expiring mail".
+       (IMAP): Document nnimap-search-uids-not-since-is-evil and
+       nnimap-nov-is-evil.
+
+2006-12-25  Kevin Ryde  <user42@zip.com.au>
+
+       * cl.texi (Sorting Sequences): In sort*, add a little cautionary note
+       about the key procedure being used heavily.
+
+2006-12-24  Chong Yidong  <cyd@stupidchicken.com>
+
+       * pgg.texi (Caching passphrase): Default for pgg-gpg-use-agent changed
+       to t.
+       (Prerequisites): Add explanation about gpg-agent.
+
+2006-12-22  Kevin Ryde  <user42@zip.com.au>
+
+       * cl.texi (Sorting Sequences): Typo in sort*, example showed plain
+       "sort" instead of "sort*".
+
+2006-12-19  Richard Stallman  <rms@gnu.org>
+
+       * calc.texi (History and Acknowledgements): Recognize that Emacs
+       now does have floating point.
+
+2006-12-19  Michael Albinus  <michael.albinus@gmx.de>
+
+       * tramp.texi (External transfer methods): Describe new method `scpc'.
+
+2006-12-17  Sascha Wilde  <wilde@sha-bang.de>
+
+       * pgg.texi: Added short note on gpg-agent to the introduction.
+
+2006-12-13  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus.texi (Hiding Headers): Document that `long-to' and `many-to'
+       also applies to Cc.
+
+2006-12-12  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus.texi (X-Face): Clarify.  Say which programs are required
+       on Windows.
+
+2006-12-08  Michael Olson  <mwolson@gnu.org>
+
+       * erc.texi (Modules): Remove documentation for list module.
+
+2006-12-05  Micha\e,Ak\e(Bl Cadilhac  <michael.cadilhac@lrde.org>
+
+       * faq.texi (^M in the shell buffer): Ditto.
+
+2006-11-20  Michael Olson  <mwolson@gnu.org>
+
+       * erc.texi: Call this the 5.2 stable pre-release of ERC.
+
+2006-11-17  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi: Fix typos.
+       (Agenda commands): Document `C-k'.
+
+2006-11-16  Eli Zaretskii  <eliz@gnu.org>
+
+       * url.texi (http/https): Fix a typo in the HTTP URL.
+
+2006-11-14  Stephen Leake  <stephen_leake@stephe-leake.org>
+
+       * ada-mode.texi: Total rewrite.
+
+2006-11-13  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi: Minor typo fixes.
+
+2006-11-13  Bill Wohler  <wohler@newt.com>
+
+       Release MH-E manual version 8.0.3.
+
+       * mh-e.texi (VERSION, EDITION, UPDATED, UPDATE-MONTH): Update for
+       release 8.0.3.
+
+       * mh-e.texi (Incorporating Mail): Use output of "mhparam Path"
+       to set MAILDIR.
+       (Reading Mail): Document the customization of read-mail-command
+       for MH-E.
+       (Viewing Attachments): Document mm-discouraged-alternatives.
+       (Tool Bar): Fix Texinfo for mh-xemacs-use-tool-bar-flag.
+       (Junk): Add more information about the settings of mh-junk-background
+       in a program.  Add /usr/bin/mh to PATH in examples.
+
+2006-11-12  Richard Stallman  <rms@gnu.org>
+
+       * woman.texi: Update author address but say he no longer maintains it.
+
+2006-11-10  Carsten Dominik  <carsten.dominik@gmail.com>
+
+       * org.texi (ARCHIVE tag): Document C-TAB for forcing cycling of
+       archived trees.
+       (Checkboxes): Section moved to chapter 5, and extended.
+       (The date/time prompt): New section.
+       (Link abbreviations): New section.
+       (Presentation and sorting): New section.
+       (Custom agenda views): Section completely rewritten.
+       (Summary): Compare with Planner.
+       (Feedback): More info about creating backtraces.
+       (Plain lists): Modified example.
+       (Breaking down tasks): New section.
+       (Custom time format): New section.
+       (Time stamps): Document inactive timestamps.
+       (Setting tags): More details about fast tag selection.
+       (Block agenda): New section.
+       (Custom agenda views): Section rewritten.
+       (Block agenda): New section.
+
+2006-11-07  Michael Albinus  <michael.albinus@gmx.de>
+
+       * tramp.texi (Configuration): scp is the default method.
+       (Default Method): Use ssh as example for another method.
+
+2006-10-27  Richard Stallman  <rms@gnu.org>
+
+       * woman.texi: Downcase nroff/troff/roff.
+       (Installation): Chapter deleted.  Some xrefs deleted.
+       (Background): woman doesn't advise man ;-).
+
+2006-10-26  Roberto Rodr\e,Am\e(Bguez  <lanubeblanca@googlemail.com>  (tiny change)
+
+       * ada-mode.texi (Project files, Identifier completion)
+       (Automatic Casing, Debugging, Using non-standard file names)
+       (Working Remotely): Fix typos.
+
+2006-10-20  Masatake YAMATO  <jet@gyve.org>
+
+       * cc-mode.texi (Sample .emacs File): Added missing `)' in
+       sample code `my-c-initialization-hook'.
+
+2006-10-19  Stuart D. Herring  <herring@lanl.gov>
+
+       * widget.texi: Fix typos.
+
+2006-10-19  Michael Albinus  <michael.albinus@gmx.de>
+
+       * tramp.texi (Frequently Asked Questions): Remove questions marked with
+       "???".  There have been no complaints for years, so the information
+       must be appropriate.
+
+2006-10-16  Richard Stallman  <rms@gnu.org>
+
+       * widget.texi: Use @var instead of capitalization.
+       Clarify many widget type descriptions.
+
+2006-10-13  Andreas Seltenreich  <uwi7@rz.uni-karlsruhe.de>
+
+       * gnus.texi (Other modes): Fix typo.  Add alternative index entry for
+       gnus-dired-attach.
+       (Selecting a Group): Fix typo.
+
+2006-10-12  Roberto Rodr\e,Am\e(Bguez  <lanubeblanca@googlemail.com>  (tiny change)
+
+       * widget.texi: Fix typos.
+
+2006-10-06  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus.texi (Image Enhancements): Update for Emacs 22.
+
+       * gnus-faq.texi ([1.3]): Update.
+
+2006-10-06  Richard Stallman  <rms@gnu.org>
+
+       * faq.texi (Displaying the current line or column):
+       Delete "As of Emacs 20".
+
+2006-10-06  Romain Francoise  <romain@orebokech.com>
+
+       * faq.texi (VM): VM works with Emacs 22 too.
+
+2006-10-06  Richard Stallman  <rms@gnu.org>
+
+       * ebrowse.texi: Remove Emacs version "21" from title.
+
+2006-10-02  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus.texi (Foreign Groups): Say where change of editing commands are
+       stored.  Add reference to `gnus-parameters'.
+
+2006-09-15  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi, mh-e.texi (GNU GENERAL PUBLIC LICENSE):
+       Change "Library Public License" to "Lesser Public License"
+       throughout.  Use "yyyy" to represent year.
+
+2006-09-15  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi (Setting tags): Typo fix.
+
+2006-09-14  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus.texi (Oort Gnus): Add @xref for `mm-fill-flowed'.
+
+2006-09-12  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * reftex.texi (Citations Outside LaTeX): Simplify lisp example.
+
+2006-09-12  Paul Eggert  <eggert@cs.ucla.edu>
+
+       * faq.texi (Escape sequences in shell output): EMACS is now set
+       to Emacs's absolute file name, not to "t".
+       (^M in the shell buffer): Likewise.
+       * misc.texi (Interactive Shell): Likewise.
+
+2006-09-11  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus.texi (Mail Source Specifiers): Mention problem of duplicate
+       mails with pop3-leave-mail-on-server.  Fix wording.
+       (Limiting): Improve gnus-summary-limit-to-articles.
+       (X-Face): Fix typo.
+
+2006-09-11  Simon Josefsson  <jas@extundo.com>
+
+       * smtpmail.texi (Authentication): Explain TLS and SSL better, based on
+       suggested by Phillip Lord <phillip.lord@newcastle.ac.uk>.
+
+2006-09-06  Simon Josefsson  <jas@extundo.com>
+
+       * smtpmail.texi (Authentication): Mention SSL.
+
+2006-09-01  Eli Zaretskii  <eliz@gnu.org>
+
+       * rcirc.texi (Internet Relay Chat, Useful IRC commands):
+       Don't use @indicateurl.
+
+       * cc-mode.texi (Subword Movement): Don't use @headitem.
+       (Custom Braces, Clean-ups): Don't use @tie.
+
+2006-08-29  Michael Albinus  <michael.albinus@gmx.de>
+
+       Sync with Tramp 2.0.54.
+
+       * tramp.texi (Bug Reports): The Tramp mailing list is moderated now.
+       Suggested by Adrian Phillips <a.phillips@met.no>.
+
+2006-08-15  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi (Installation, Activation): Split from Installation and
+       Activation.
+       (Clocking work time): Documented new features.
+
+2006-08-13  Alex Schroeder  <alex@gnu.org>
+
+       * rcirc.texi (Configuration): Use correct variable in rcirc-authinfo
+       example.
+
+2006-08-12  Eli Zaretskii  <eliz@gnu.org>
+
+       * faq.texi (How to add fonts): New node.
+
+2006-08-05  Romain Francoise  <romain@orebokech.com>
+
+       * faq.texi (New in Emacs 22): Expand.
+
+2006-08-03  Michael Olson  <mwolson@gnu.org>
+
+       * erc.texi: Update for ERC 5.1.4.
+
+2006-07-28  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (Oort Gnus): Mention that the Lisp files are now installed
+       in .../site-lisp/gnus/ by default.
+       [ From gnus-news.texi in the trunk. ]
+
+2006-07-27  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus.texi (MIME Commands): Additions for yEnc.
+
+2006-07-24  Richard Stallman  <rms@gnu.org>
+
+       * pgg.texi, org.texi, info.texi, forms.texi, flymake.texi:
+       * faq.texi: Move periods and commas inside quotes.
+
+2006-07-20  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi (Error forms): Mention M-+ keybinding for `calc-plus-minus'.
+
+2006-07-18  Chong Yidong  <cyd@stupidchicken.com>
+
+       * faq.texi (Security risks with Emacs): Document Emacs 22
+       file-local-variable mechanism.
+
+2006-07-12  Michael Olson  <mwolson@gnu.org>
+
+       * erc.texi: Update for ERC 5.1.3.
+
+2006-07-12  Alex Schroeder  <alex@gnu.org>
+
+       * rcirc.texi: Fix typos.
+       (Getting started with rcirc): New calling convention for M-x irc.
+       Mention #rcirc.  Removed channel tracking.
+       (Configuration): Changed the names of all variables that got changed
+       recently, eg. rcirc-server to rcirc-default-server.  Added
+       documentation for rcirc-authinfo, some background for Bitlbee, and
+       rcirc-track-minor-mode.
+       (Scrolling conservatively): Fixed the xref from Auto Scrolling to just
+       Scrolling.
+       (Reconnecting after you have lost the connection): Fixed example code
+       to match code changes.
+
+2006-07-10  Nick Roberts  <nickrob@snap.net.nz>
+
+       * gnus.texi, message.texi: Fix typos.
+
+2006-07-07  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi (Exporting): Document `C-c C-e' as the prefix for exporting
+       commands.
+       (Global TODO list): Document the use of the variables
+       `org-agenda-todo-ignore-scheduled' and
+       `org-agenda-todo-list-sublevels'.
+
+2006-07-05  Richard Stallman  <rms@gnu.org>
+
+       * faq.texi (Scrolling only one line): Fix xref.
+
+2006-07-05  Thien-Thi Nguyen  <ttn@gnu.org>
+
+       * faq.texi (Evaluating Emacs Lisp code):
+       Throughout, replace eval-current-buffer with eval-buffer.
+
+2006-07-03  Richard Stallman  <rms@gnu.org>
+
+       * rcirc.texi (Scrolling conservatively): Fix xref.
+
+       * pcl-cvs.texi (Viewing differences): Usage fix.
+
+2006-07-03  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi (Agenda commands): Document `s' key to save all org-mode
+       buffers.
+
+2006-06-30  Ralf Angeli  <angeli@caeruleus.net>
+
+       * pcl-cvs.texi (Customizing Faces): Remove -face suffix from face
+       names.  Mention `cvs-msg' face.
+
+2006-06-29  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi (Checkboxes): New section.
+
+2006-06-28  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi (Embedded LaTeX): Fix typos and implement small improvements
+       throughout this chapter.
+
+2006-06-27  Chong Yidong  <cyd@stupidchicken.com>
+
+       * info.texi (Help-Small-Screen): Clarify placement of "All" and "Top"
+       text for standalone vs Emacs info.
+       (Help): Clarify header line description.  Use mouse-1 for clicks.
+       (Help-P): Use mouse-1 for clicks.
+       (Help-^L): "Top" and "All" not displayed with dashes in Emacs.
+       (Help-^L, Help-M, Help-Int, Search Index, Go to node)
+       (Choose menu subtopic): Remove gratuitous Emacs command names.
+       (Help-FOO): Put usual behavior first.
+       (Help-Xref): Clicking on xrefs works in Emacs.
+       (Search Text): Clarify what the default behavior is.
+       (Create Info buffer): Fix Emacs window/X window confusion.
+       (Emacs Info Variables): Fix for new Emacs init file behavior.
+
+2006-06-24  Andreas Seltenreich  <uwi7@rz.uni-karlsruhe.de>
+
+       * gnus.texi (Summary Buffer Lines): Fix typo.
+
+2006-06-23  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi (Embedded LaTeX): New chapter.
+       (Archiving): Section rewritten.
+       (Enhancing text): Some parts moved to the new chapter about LaTeX.
+
+2006-06-20  Bill Wohler  <wohler@newt.com>
+
+       Release MH-E manual version 8.0.1.
+
+       * mh-e.texi (VERSION, EDITION, UPDATED, UPDATE-MONTH): Update for
+       release 8.0.1.
+       (Preface): Depend on GNU mailutils 1.0 and higher.
+
+2006-06-19  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * message.texi (News Headers): Update message-syntax-checks section.
+
+2006-06-19  Karl Berry  <karl@gnu.org>
+
+       * info.texi (Advanced): Mention C-q, especially with ?.
+
+2006-06-19  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi (Publishing links): Document the `:link-validation-function'
+       property.
+       (Extensions and Hacking): New chapter, includes some sections of the
+       "Miscellaneous" chapter.
+
+2006-06-10  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi (Progress logging): New section.
+
+2006-05-29  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * viper.texi (Viper Specials):
+       * gnus.texi (Example Setup):
+       * faq.texi (Backspace invokes help):
+       * dired-x.texi (Optional Installation Dired Jump):
+       * calc.texi (Defining Simple Commands): Use ;; instead of ;;; to better
+       follow coding conventions.
+
+2006-05-18  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus.texi (Saving Articles): Clarify gnus-summary-save-article-mail.
+
+2006-06-06  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi (ASCII export): Document indentation adaptation.
+       (Setting tags): Document mutually-exclusive tags.
+
+2006-06-05  Romain Francoise  <romain@orebokech.com>
+
+       * url.texi (irc): Mention new funs `url-irc-rcirc' and `url-irc-erc'.
+       Fix typo.
+
+       * gnus-faq.texi (Question 8.6): Update reference to the Gnus
+       channel (#gnus@irc.freenode.net).
+       Fix typos.  Update copyright notice.
+
+       * cc-mode.texi (Getting Started, Indentation Commands, Config Basics)
+       (Custom Filling and Breaking, Custom Braces, Syntactic Symbols)
+       (Line-Up Functions, Custom Macros):
+       * ediff.texi (Window and Frame Configuration)
+       (Highlighting Difference Regions, Highlighting Difference Regions):
+       * emacs-mime.texi (Display Customization):
+       * erc.texi (History):
+       * eshell.texi (Known problems):
+       * eudc.texi (Overview, BBDB):
+       * gnus.texi (NNTP, IMAP, Advanced Scoring Examples)
+       (The problem of spam, SpamOracle, Extending the Spam package)
+       (Conformity, Terminology):
+       * idlwave.texi (Routine Info, Routine Info)
+       (Class and Keyword Inheritance, Padding Operators)
+       (Breakpoints and Stepping, Electric Debug Mode)
+       (Examining Variables, Troubleshooting):
+       * org.texi (Creating timestamps):
+       * reftex.texi (Commands, Options, Changes):
+       * tramp.texi (Inline methods, Password caching)
+       (Auto-save and Backup, Issues):
+       * vip.texi (Files, Commands in Insert Mode):
+       * viper.texi (Emacs Preliminaries, States in Viper)
+       (Packages that Change Keymaps, Viper Specials, Groundwork):
+       Fix various typos.
+
+2006-05-31  Michael Ernst  <mernst@alum.mit.edu>
+
+       * ediff.texi: Fix typos.
+
+2006-05-30  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi: Small typo fixes.
+
+2006-05-29  Michael Albinus  <michael.albinus@gmx.de>
+
+       * tramp.texi (Frequently Asked Questions): Disable zsh zle.
+
+2006-05-27  Thien-Thi Nguyen  <ttn@gnu.org>
+
+       * pcl-cvs.texi: Fix typos.
+       (Customization): Say "us".
+
+2006-05-26  Eli Zaretskii  <eliz@gnu.org>
+
+       * org.texi: Remove bogus @setfilename.
+
+2006-05-26  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi (ASCII export): Omit command name.
+       (HTML export): Add prefix to all lines in Local Variable example.
+       (Acknowledgments): Typeset names in italics.
+
+2006-05-24  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi (Plain lists): Add new item navigation commands.
+       (External links): Document elisp and info links.
+       (Custom searches): New section.
+       (Publishing): New chapter.
+       (HTML export): Include a list of supported CSS classes.
+       (Setting tags): Describe the fast-tag-setting interface.
+
+2006-05-20  Luc Teirlinck  <teirllm@auburn.edu>
+
+       * dired-x.texi: ifinfo -> ifnottex.
+
+2006-05-18  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus.texi (Saving Articles): Clarify gnus-summary-save-article-mail.
+
+2006-05-12  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * message.texi (Interface): Add tool bar customization.
+       (MIME): Index and text additions for mml-attach.
+       (MIME): Describe mml-dnd-protocol-alist and
+       mml-dnd-attach-options.
+
+       * gnus.texi (Oort Gnus): Reorder entries in sections.
+       Fix some entries.
+       (Starting Up): Add references to "Emacs for Heathens" and to
+       "Finding the News".  Add user-full-name and user-mail-address.
+       (Group Buffer Format): Add tool bar customization and update.
+       (Summary Buffer): Add tool bar customization.
+       (Posting Styles): Add message-alternative-emails.
+
+2006-05-09  Michael Albinus  <michael.albinus@gmx.de>
+
+       * tramp.texi (Filename completion): Improve wording.
+
+2006-05-07  Romain Francoise  <romain@orebokech.com>
+
+       * faq.texi (Using regular expressions): Fix typo.
+       (Packages that do not come with Emacs): Fix capitalization.
+       (Replacing text across multiple files): Expand node to explain how
+       to use `dired-do-query-replace-regexp' in more detail, based on
+       suggestion by Eric Hanchrow <offby1@blarg.net>.
+
+2006-05-06  Michael Albinus  <michael.albinus@gmx.de>
+
+       * tramp.texi (Filename completion): Completion of remote files'
+       method, user name and host name is active only in partial
+       completion mode.
+
+2006-05-06  Bill Wohler  <wohler@newt.com>
+
+       Release MH-E manual version 8.0.
+
+       * mh-e.texi (VERSION, EDITION, UPDATED, UPDATE-MONTH): Update for
+       release 8.0.
+
+2006-05-06  Bill Wohler  <wohler@newt.com>
+
+       * mh-e.texi (MH-BOOK-HOME): Change from
+       http://www.ics.uci.edu/~mh/book/mh to
+       http://rand-mh.sourceforge.net/book/mh.
+       Replace .htm suffix with .html for MH book files.
+       (Using This Manual): Update key binding for getting relevant
+       chapter in Info from command key.
+       (Ranges): Fix itemx.
+
+2006-05-05  Karl Berry  <karl@gnu.org>
+
+       * texinfo.tex (\definetextfonsizexi, \definetextfonsizex): New cmds.
+       (\fonttextsize): New user-level command to change text font size.
+
+2006-04-26  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * pgg.texi (Caching passphrase): Fix markup and typos.  Simplify.
+
+2006-04-26  Sascha Wilde  <wilde@sha-bang.de>  (tiny change)
+
+       * pgg.texi (Caching passphrase): Add pgg-gpg-use-agent.
+
+2006-04-24  Bill Wohler  <wohler@newt.com>
+
+       * mh-e.texi (Getting Started): Make it more explicit that you need
+       to install MH.  Add pointers to current MH implementations.
+
+2006-04-21  Bill Wohler  <wohler@newt.com>
+
+       Release MH-E manual version 7.94.
+
+       * mh-e.texi (VERSION, EDITION, UPDATED, UPDATE-MONTH): Update for
+       release 7.94.
+
+2006-04-21  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi: Many small fixes.
+       (Handling links): Rename from "Managing links".
+
+2006-04-20  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus.texi (Spam Statistics Package): Fix typo in @pxref.
+       (Splitting mail using spam-stat): Fix @xref.
+
+2006-04-20  Chong Yidong  <cyd@stupidchicken.com>
+
+       * gnus.texi (Spam Package): Major revision of the text.
+       Previouly this node was "Filtering Spam Using The Spam ELisp Package".
+
+2006-04-20  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi (Time stamps): Better explanation of the purpose of
+       different time stamps.
+       (Structure editing, Plain lists): More details on how new items
+       and headings are inserted.
+
+2006-04-18  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi (Formula syntax): Fix link to Calc Manual.
+
+2006-04-17  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus.texi (Emacsen): Don't support Emacs 20.7 and XEmacs 21.1.
+
+2006-04-17  Bill Wohler  <wohler@newt.com>
+
+       * mh-e.texi (Folders): Update mh-before-quit-hook and
+       mh-quit-hook example with code that removes the buffers rather
+       than just bury them.
+
+2006-04-17  Michael Albinus  <michael.albinus@gmx.de>
+
+       Sync with Tramp 2.0.53.
+
+2006-04-13  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi (Updating settings): New section.
+       (Visibility cycling): Better names for the startup folding
+       options.
+       (Exporting): Completely restructured.
+       (The very busy C-c C-c key): New section.
+       (Summary of in-buffer settings): New section.
+
+2006-04-11  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus.texi, gnus-faq.texi, message.texi: Gnus v5.10.8 is released.
+
+2006-04-10  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus.texi (Misc Group Stuff, Summary Buffer, Article Keymap)
+       (Server Commands): Key `v' is reserved for users.
+
+2006-04-11  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi (Link format): New section, emphasis on bracket links.
+       (External links): Document bracket links.
+       (FAQ): Expand to cover shell links and the new link format.
+
+2006-04-09  Kevin Ryde  <user42@zip.com.au>
+
+       * org.texi (Formula syntax): Typo in node name of calc-eval xref.
+
+2006-04-07  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus.texi (Summary Buffer Lines): Add `*'.
+
+2006-04-07  Jochen K\e,A|\e(Bpper  <jochen@fhi-berlin.mpg.de>
+
+       * gnus.texi (Group Parameters):
+       Mention gnus-permanently-visible-groups.
+
+2006-04-06  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (Face): Fix typo.
+
+2006-04-05  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus.texi (X-Face): Clarify.
+       (Face): Need Emacs with PNG support.
+
+2006-04-06  Richard Stallman  <rms@gnu.org>
+
+       * idlwave.texi: Delete the blocks "not suitable for inclusion with
+       Emacs".
+
+2006-04-06  J.D. Smith  <jdsmith@as.arizona.edu>
+
+       * idlwave.texi: Updated for IDLWAVE version 6.0, factoring out
+       blocks not suitable for inclusion with Emacs using variable
+       PARTOFEMACS.
+
+2006-04-04  Simon Josefsson  <jas@extundo.com>
+
+       * gnus.texi (Security): Improve.
+
+2006-04-02  Bill Wohler  <wohler@newt.com>
+
+       * mh-e.texi (Getting Started, Junk, Bug Reports)
+       (MH FAQ and Support): Fix URLs.
+
+2006-03-31  Romain Francoise  <romain@orebokech.com>
+
+       * gnus.texi (Virtual Groups): `nnvirtual-always-rescan' defaults
+       to t, not nil (and has for the past eight years).
+
+2006-03-31  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * message.texi, gnus.texi: Bump version to 5.11.
+
+2006-03-29  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus.texi (Top): Add comment about version line.
+
+       * message.texi (Top): Ditto.  Change to take named versions into
+       account.
+
+2006-03-28  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus.texi (Posting Styles): Add x-face-file to example.
+       (X-Face): Refer to posting styles.
+
+       * gnus-faq.texi ([5.8]): Add x-face-file.
+       ([8.4]): Add links to gmane.emacs.gnus.user and
+       gmane.emacs.gnus.general.
+
+2006-03-27  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus-faq.texi: Use .invalid.
+       ([5.4]): Fix gnus-posting-styles example.
+
+2006-03-27  Romain Francoise  <romain@orebokech.com>
+
+       * faq.texi (Emacs/W3): Rename from `w3-mode'.  Mention that
+       Emacs/W3 needs a new maintainer.
+       (Ispell): Update author and version info.
+       (Mailcrypt): Mention PGG.
+       (New in Emacs 22): Add PGG to the list of new packages.
+       Include minor changes from "Ramprasad B" <ramprasad_i82@yahoo.com>
+       updating dead URLs.
+
+2006-03-25  Karl Berry  <karl@gnu.org>
+
+       * ada-mode.texi, autotype.texi, calc.texi, cc-mode.texi, cl.texi,
+       * dired-x.texi, ebrowse.texi, ediff.texi, emacs-mime.texi, erc.texi,
+       * eshell.texi, eudc.texi, faq.texi, forms.texi, gnus.texi, idlwave.texi,
+       * info.texi, message.texi, mh-e.texi, pcl-cvs.texi, pgg.texi,
+       * rcirc.texi, reftex.texi, sc.texi, ses.texi, sieve.texi,
+       * speedbar.texi, url.texi, vip.texi, viper.texi, widget.texi,
+       * woman.texi: (1) use @copyright{} instead of (C) in typeset text;
+       (2) do not indent copyright year list (or anything else).
+
+2006-03-21  Bill Wohler  <wohler@newt.com>
+
+       * mh-e.texi (Folders): Various edits.
+
+2006-03-20  Romain Francoise  <romain@orebokech.com>
+
+       * gnus.texi (Mail Folders): Grammar fix.
+
+2006-03-19  Bill Wohler  <wohler@newt.com>
+
+       * mh-e.texi (Replying): Document Mail-Followup-To.
+       Change manually-formatted table to multitable.  Add debugging info.
+       Move description of mh-reply-default-reply-to into paragraph
+       that describes its values.
+
+2006-03-17  Bill Wohler  <wohler@newt.com>
+
+       * mh-e.texi: Use smallexample and smalllisp consistenly.
+       (Sending Mail Tour): Update method of entering
+       addresses and subject.
+       (Sending Mail Tour, Reading Mail Tour, Processing Mail Tour)
+       (Adding Attachments, Searching): Update screenshots for Emacs 22.
+
+2006-03-15  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi: Version number change only.
+
+2006-03-14  Bill Wohler  <wohler@newt.com>
+
+       * mh-e.texi: Add index entries around each paragraph rather than
+       depend on entries from beginning of node.  Doing so ensures that
+       index entries are less likely to be forgotten if text is cut and
+       pasted, and are necessary anyway if the references are on a
+       separate page.  It seems that makeinfo is now (v. 4.8) only
+       producing one index entry per node, so there is no longer any
+       excuse not to.  Use subheading instead of heading.  The incorrect
+       use of heading produced very large fonts in Info--as large as the
+       main heading.
+       (From Bill Wohler): MH-E never did appear in Emacs 21--MH-E
+       versions 6 and 7 appeared *around* the time of these Emacs releases.
+
+2006-03-13  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi (Clean view): Document new startup options.
+
+2006-03-11  Bill Wohler  <wohler@newt.com>
+
+       * mh-e.texi (Preface, More About MH-E, Options, HTML, Folders)
+       (Composing, Scan Line Formats): Fix @refs.
+       (Getting Started): Define MH profile and MH profile components.
+       (Incorporating Mail, Reading Mail, Viewing, Printing)
+       (Sending Mail, Forwarding, Editing Drafts, Inserting Letter)
+       (Signature, Aliases, Scan Line Formats): Use @code instead of @samp
+       for string constants.
+       (Tool Bar): Remove spurious quote.
+       (Junk): Use ``...'' instead of "...".
+       (Scan Line Formats): Replace @samp with @kbd.
+
+2006-03-10  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (NoCeM): Mention gnus-use-nocem can also be a number.
+
+2006-03-10  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus.texi (Fancy Mail Splitting): Improve sentences so as to be
+       easy to understand.
+
+2006-03-09  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi: Markup fix.
+       (Fancy Mail Splitting): Specify new feature.
+
+2006-03-08  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (Fancy Mail Splitting): Improve descriptions about
+       partial-words matching.
+
+2006-03-07  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * emacs-mime.texi (Display Customization): Reword image/.* stuff.
+
+       * gnus.texi (Oort Gnus): Add note about `gnus-load'.
+       (MIME Commands): Fix mm-discouraged-alternatives.
+
+2006-03-07  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi: Version number change only.
+
+2006-03-06  Bill Wohler  <wohler@newt.com>
+
+       * mh-e.texi: Move from SourceForge repository to Savannah.
+       This is version 7.93, which is a total rewrite from the previous
+       edition 1.3 for MH-E version 5.0.2, and corresponds to MH-E
+       version 7.93.
+
+2006-03-03  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus.texi (Oort Gnus): Add `mm-fill-flowed'.
+
+2006-03-01  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi (Interaction): Add item about `org-mouse.el' by
+       Piotr Zielinski.
+       (Managing links): Document that also mouse-1 can be used to
+       activate a link.
+       (Headlines, FAQ): Add entry about hiding leading stars.
+       (Miscellaneous): Resort the sections in this chapter to a more
+       logical sequence.
+
+2006-02-27  Simon Josefsson  <jas@extundo.com>
+
+       * emacs-mime.texi (Flowed text): Add mm-fill-flowed.  (Sync
+       2004-01-27 from the trunk).
+
+2006-02-24  Alan Mackenzie  <bug-cc-mode@gnu.org>
+
+       * cc-mode.texi: Rename c-hungry-backspace to
+       c-hungry-delete-backwards, at the request of RMS.  Leave the old
+       name as an alias.
+
+2006-02-24  Alan Mackenzie  <bug-cc-mode@gnu.org>
+
+       * cc-mode.texi: Correct the definition of c-beginning-of-defun, to
+       include the function header within the defun.
+
+2006-02-24  Alan Mackenzie  <bug-cc-mode@gnu.org>
+
+       * cc-mode.texi: Correct two typos.
+
+2006-02-24  Alan Mackenzie  <bug-cc-mode@gnu.org>
+
+       * cc-mode.texi (Comment Commands): State that C-u M-; kills any
+       existing comment.
+       (Electric Keys): Add a justification for electric indentation.
+       (Hungry WS Deletion): Clear up the names and complications of the
+       BACKSPACE and DELETE keys.
+
+2006-02-23  Juri Linkov  <juri@jurta.org>
+
+       * faq.texi (Common requests): Move `Turning on auto-fill by
+       default' after `Wrapping words automatically'.  Move `Working with
+       unprintable characters' before `Searching for/replacing newlines'.
+       Move `Replacing highlighted text' after `Highlighting a region'.
+       Merge `Repeating commands' and `Repeating a command as many times
+       as possible' into the former.
+       (Packages that do not come with Emacs): Add refs to Gmane and
+       etc/MORE.STUFF.
+
+2006-02-23  Juri Linkov  <juri@jurta.org>
+
+       * faq.texi (Newsgroup archives): Update URLs of GNU mail archives.
+       (Reporting bugs): Suggest using `M-x report-emacs-bug'.
+       Add xref to `(emacs)Reporting Bugs'.
+       (Getting a printed manual): Add URL to other formats of the manual.
+       (Common requests): Fix menu.
+       (Highlighting a region): Remove ref to `Turning on syntax highlighting'.
+       (Horizontal scrolling): Mention `truncate-partial-width-windows'.
+       (Inserting text at the beginning of each line): Add pxref to
+       `Changing the included text prefix'.
+       (Forcing the cursor to remain in the same column): Mention `track-eol'
+       and `set-goal-column'.  Add pxref to `(emacs)Moving Point'.
+       (Replacing text across multiple files): Add keybinding `Q' for
+       `dired-do-query-replace'.
+
+2006-02-22  Carsten Dominik  <dominik@science.uva.nl>
+
+       * reftex.texi: Version number and date change only.
+
+       * org.texi (Internal Links): Rewrite to cover the modified
+       linking system.
+
+2006-02-17  Eli Zaretskii  <eliz@gnu.org>
+
+       * faq.texi: Remove the coding cookie, it's not needed anymore.
+
+2006-02-13  YAMAMOTO Mitsuharu  <mituharu@math.s.chiba-u.ac.jp>
+
+       * faq.texi (Colors on a TTY): Mention Mac OS port.
+
+2006-02-12  Karl Berry  <karl@gnu.org>
+
+       * faq.texi (Emacs for Atari ST): Use Sch@"auble instead of the
+       8-bit accented a.
+
+2006-02-09  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus.texi (Gnus Versions): Add history beyond start of Oort.
+
+2006-02-08  Romain Francoise  <romain@orebokech.com>
+
+       * faq.texi (Top): Remove paragraph about the FAQ being a
+       transitional document, etc.
+       (Searching for/replacing newlines): New node.
+       (Yanking text in isearch): New node.
+       (Inserting text at the beginning of each line): Rename and make
+       more general, mention `M-;' in Message mode.
+
+2006-02-07  Luc Teirlinck  <teirllm@auburn.edu>
+
+       * faq.texi (Meta key does not work in xterm)
+       (Emacs does not display 8-bit characters)
+       (Inputting eight-bit characters): Update xrefs.
+
+2006-02-06  Romain Francoise  <romain@orebokech.com>
+
+       * faq.texi (VM): VM now at version 7.19.
+       Set myself as maintainer of this file.
+
+2006-02-04  Michael Olson  <mwolson@gnu.org>
+
+       * erc.texi (History): Note that ERC is now included with Emacs.
+
+2006-01-31  Romain Francoise  <romain@orebokech.com>
+
+       * message.texi (Message Headers): Explain what
+       `message-alternative-emails' does in more detail.
+       Update copyright year.
+
+2006-01-30  Juanma Barranquero  <lekktu@gmail.com>
+
+       * makefile.w32-in (clean): Add newsticker, sieve, pgg, erc and rcirc.
+
+2006-01-29  Richard M. Stallman  <rms@gnu.org>
+
+       * cc-mode.texi (Indentation Commands): Inserts newline, not "linefeed".
+
+2006-01-29  Michael Olson  <mwolson@gnu.org>
+
+       * makefile.w32-in ($(infodir)/erc, erc.dvi): New targets.
+
+       * Makefile.in (INFO_TARGETS, DVI_TARGETS): Add ERC.
+
+       * faq.texi (New in Emacs 22): Mention ERC.
+
+2006-01-28  Luc Teirlinck  <teirllm@auburn.edu>
+
+       * rcirc.texi: Capitalize dir entry for consistency with the entry
+       in info/dir and other entries in the Emacs category.
+       Fix typos.  Delete trailing whitespace.
+
+2006-01-28  Bj\e,Av\e(Brn Lindstr\e,Av\e(Bm  <bkhl@elektrubadur.se>
+
+       * rcirc.texi: Some @cindex changes, some changes from @kbd to @key.
+
+2006-01-27  Eli Zaretskii  <eliz@gnu.org>
+
+       * makefile.w32-in ($(infodir)/rcirc, rcirc.dvi): New targets.
+       (INFO_TARGETS, DVI_TARGETS): Add rcirc.
+
+       * Makefile.in (../info/rcirc, rcirc.dvi): New targets.
+       (INFO_TARGETS, DVI_TARGETS): Add rcirc.
+
+2006-01-27  Alex Schroeder  <alex@gnu.org>
+
+       * rcirc.texi: New file.
+
+2006-01-23  Juri Linkov  <juri@jurta.org>
+
+       * widget.texi (User Interface): Add S-TAB for widget-backward.
+
+2006-01-22  Michael Albinus  <michael.albinus@gmx.de>
+
+       Sync with Tramp 2.0.52.
+
+       * tramp.texi (Frequently Asked Questions): Remove Ange-FTP item.
+       Add Tramp disabling item.  New item for common connection problems.
+       (various): Apply "ftp" as method for the download URL.
+       (Bug Reports): Refer to FAQ for common problems.
+
+2006-01-21  Eli Zaretskii  <eliz@gnu.org>
+
+       * widget.texi (User Interface): Use @key for TAB.
+
+       * ses.texi (Formulas, Printer functions): Use @key for TAB.
+
+       * ebrowse.texi (Switching to Tree, Symbol Completion): Use @key
+       for TAB.
+
+       * cc-mode.texi (Indentation Calculation): Use @key for TAB.
+
+2006-01-16  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi: Update copyright.
+
+2006-01-13  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (Article Washing): Additions.
+
+2006-01-08  Alex Schroeder  <alex@gnu.org>
+
+       * pgg.texi (Caching passphrase): Rewording.
+
+2006-01-13  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi (Agenda commands): Document tags command.
+
+2006-01-10  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (RSS): Document nnrss-wash-html-in-text-plain-parts.
+
+2006-01-06  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (RSS): Addition.
+
+2005-12-22  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (Summary Post Commands): Fix function bound to `S O p'.
+
+2005-12-19  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * emacs-mime.texi (Display Customization): Add setting example to
+       mm-discouraged-alternatives.
+
+2006-01-09  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * flymake.texi (Obtaining Flymake): Remove chapter since Emacs's
+       version is the canonical version.
+
+2006-01-08  Alex Schroeder  <alex@gnu.org>
+
+       * pgg.texi (Caching passphrase): Rewording.
+
+2006-01-06  Eli Zaretskii  <eliz@gnu.org>
+
+       * flymake.texi (Obtaining Flymake): Update Flymake's CVS
+       repository URL.
+
+2006-01-06  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi: Removed the accidentally re-added empty line in the
+       direntry.
+
+2006-01-05  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi (Agenda Views): Chapter reorganized.
+
+2005-12-29  Romain Francoise  <romain@orebokech.com>
+
+       * faq.texi (Using Customize): New node.
+
+2005-12-28  Luc Teirlinck  <teirllm@auburn.edu>
+
+       * org.texi: Remove blank line in @direntry.  It is non-standard
+       and recursively produces blank lines all over the dir file (when
+       using Texinfo 4.8).
+
+2005-12-21  Luc Teirlinck  <teirllm@auburn.edu>
+
+       * widget.texi (atoms): Delete obsolete remark about `file' widget.
+
+2005-12-20  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi (Tags): Boolean logic documented.
+       (Agenda Views): Document custom commands.
+
+2005-12-20  David Kastrup  <dak@gnu.org>
+
+       * faq.texi (AUCTeX): Update version and mailing list info.
+
+2005-12-17  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (MIME Commands): Mention addition of
+       multipart/alternative to gnus-buttonized-mime-types and add xref
+       to mm-discouraged-alternatives.
+
+       * emacs-mime.texi (Display Customization): Mention addition of
+       "image/.*" and add xref to gnus-buttonized-mime-types in the
+       mm-discouraged-alternatives section.
+
+2005-12-16  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi (Tags): New section.
+       (Agenda Views): Chapter reorganized.
+
+2005-12-16  Eli Zaretskii  <eliz@gnu.org>
+
+       * org.texi (Internal Links): Add a missing comma after an @xref.
+
+2005-12-14  Chong Yidong  <cyd@stupidchicken.com>
+
+       * faq.texi (Filling paragraphs with a single space): No need to
+       change sentence-end now.
+
+2005-12-13  Romain Francoise  <romain@orebokech.com>
+
+       * faq.texi (Scrolling only one line): Use `scroll-conservatively'.
+
+2005-12-12  Jay Belanger  <belanger@truman.edu>
+
+       * faq.texi (Calc): Update version number.
+
+2005-12-12  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi (Progress Logging): New section.
+
+2005-12-10  Romain Francoise  <romain@orebokech.com>
+
+       Update the Emacs FAQ for the 22.1 release.
+
+       * faq.texi: Set VER to `22.1'.
+       (Basic editing): Explain how to use localized versions of the
+       Tutorial.  Mention that `C-h r' displays the manual.  Delete
+       obsolete WWW link to an Emacs 18 tutorial.
+       (Getting a printed manual): Point to the new locations of the
+       manuals on the GNU Web site.
+       (Emacs Lisp documentation): Explain that the Emacs Lisp manual is
+       available via Info (it was previously distributed separately).
+       (Installing Texinfo documentation): The latest version of Texinfo
+       is 4.8, not 4.0.
+       (Informational files for Emacs): COPYING is the GNU General Public
+       License, not the Emacs General Public License.
+       (Informational files for Emacs): Delete obsolete link to the
+       GNUinfo pages as they have been removed from the GNU Web site.
+       (New in Emacs 22): New node.
+       (Setting up a customization file): Say that most packages support
+       Customize nowadays.
+       (Colors on a TTY): Delete reference to instructions on how to
+       enable syntax highlighting, it is now enabled by default.
+       (Turning on abbrevs by default): Emacs now reads the abbrevs file
+       at startup automatically.
+       (Controlling case sensitivity): Mention `M-c' in isearch.
+       (Using an already running Emacs process): Emacs now creates the
+       socket in `/tmp/emacsUID'.  Fix typos.  Change default location of
+       gnuserv.  As emacsclient can now run Lisp code as well, delete a
+       sentence praising gnuserv for that.  Simplify description of how
+       the client/server operation works.
+       (Compiler error messages): Delete obsolete text (compile.el has
+       been rewritten).
+       (Indenting switch statements): Fix typo.
+       (Matching parentheses): Simplify setup instructions, mention the
+       menu bar item in the Options menu.
+       (Repeating a command as many times as possible): Mention `C-x e'.
+       (Going to a line by number): Mention new keymap and bindings
+       `M-g M-g', `M-g M-p' and `M-g M-n'.
+       (Turning on syntax highlighting): Now on by default.  Simplify.
+       (Replacing highlighted text): Use `1', not `t'.
+       (Problems with very large files): The maximum size is now 256MB on
+       32-bit machines.
+       (^M in the shell buffer): Mention `comint-process-echoes'.
+       (Emacs for Apple computers): Emacs 22 has native support for Mac
+       OS X.
+       (Translating names to IP addresses): Delete node.
+       (Binding keys to commands): Fix typo.
+       (SPC no longer completes file names): New node.
+       (MIME with Emacs mail packages): Delete section about the Emacs
+       MIME FAQ (it's not reachable anymore).
+
+2005-12-08  Alan Mackenzie  <bug-cc-mode@gnu.org>
+
+       * cc-mode.texi: The manual has been extensively revised: the
+       information about using CC Mode has been separated from the larger
+       and more difficult chapters about configuration.  It has been
+       updated for CC Mode 5.31.
+
+2005-12-05  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * pgg.texi (User Commands): Fix description of pgg-verify-region.
+       (Selecting an implementation): Fix descriptions.
+
+2005-11-30  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * message.texi (Various Message Variables): Addition.
+
+2005-11-29  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * message.texi: Fix default values.
+
+2005-11-25  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * message.texi (Header Commands): Clarify descriptions of
+       message-cross-post-followup-to, message-reduce-to-to-cc, and
+       message-insert-wide-reply.
+       (Various Commands): Fix kindex for message-kill-to-signature;
+       clarify description of message-tab.
+
+2005-11-22  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * message.texi (Mailing Lists): Fix description about MFT.
+
+       * gnus.texi (Emacs Lisp): Use ~/.gnus.el instead of ~/.emacs.
+
+2005-11-17  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (Slow Terminal Connection): Replace old description
+       with new one.
+
+2005-11-16  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (Oort Gnus): Use ~/.gnus.el instead of ~/.emacs;
+       replace X-Draft-Headers with X-Draft-From.
+
+2005-11-14  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (Various Various): Fix the default value of
+       nnheader-max-head-length.
+       (Gnus Versions): Fix typo.
+
+2005-12-08  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi (Structure editing): Document new functionality of
+       M-RET.
+
+2005-12-06  Luc Teirlinck  <teirllm@auburn.edu>
+
+       * org.texi (Internal Links): Fix Texinfo usage.
+
+2005-12-06  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi (TODO basics): Document the global todo list.
+       (TODO items): Documents sparse tree for specific TODO
+       keywords.
+
+2005-11-30  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi (Plain Lists): Typos fixed.
+
+2005-11-28  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi: Change references of `M-#' to `C-x *' prefix.
+
+2005-11-24  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi (Structure editing): New item moving commands added.
+       (Plain Lists): New section.
+
+2005-11-18  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi (FAQ): Document `org-table-tab-jumps-over-hlines'.
+       (Agenda): Document commands `org-cycle-agenda-files' and
+       `org-agenda-file-to-front'
+       (Built-in table editor): Document `org-table-sort-lines'.
+       (HTML formatting): Export of hand-formatted lists.
+
+2005-11-10  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (XVarious): Fix description of gnus-use-toolbar; add
+       new variable gnus-toolbar-thickness.
+
+2005-11-08  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (XVarious): Revert description of gnus-use-toolbar.
+
+2005-11-07  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (X-Face): Fix description.
+       (XVarious): Remove gnus-xmas-logo-color-alist and
+       gnus-xmas-logo-color-style; fix description of gnus-use-toolbar.
+
+2005-11-01  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (Group Parameters): Mention new variable
+       gnus-parameters-case-fold-search.
+       (Home Score File): Addition.
+
+2005-11-04  Ulf Jasper  <ulf.jasper@web.de>
+
+       * newsticker.texi: VERSION changed to 1.9.  Updated UPDATED.
+       (Overview): List supported feed types.
+       (Installation): No installation necessary when using autoload.
+       (Configuration): Rename "RSS" to "news".
+
+2005-11-04  Ken Manheimer  <ken.manheimer@gmail.com>
+
+       * pgg.texi (User Commands): Document additional passphrase
+       argument for pgg-encrypt-*, pgg-decrypt-*, and pgg-sign-* functions.
+       (Backend methods): Likewise for corresponding pgg-scheme-* functions.
+
+2005-11-04  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi: Version number changed to 3.19.
+
+2005-10-29  Sascha Wilde  <wilde@sha-bang.de>
+
+       * pgg.texi (How to use): Update the example to add autoload of
+       pgg-encrypt-symmetric-region.
+       (User Commands): Document pgg-encrypt-symmetric-region.
+       (Backend methods): Document pgg-scheme-encrypt-symmetric-region.
+
+2005-10-27  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi (Predefined Units): Fix the symbol for a TeX points,
+       mention other TeX-related units.
+
+2005-10-23  Lars Hansen  <larsh@soem.dk>
+
+       * dired-x.texi (Miscellaneous Commands): Replace
+       dired-do-relative-symlink by dired-do-relsymlink and
+       dired-do-relative-symlink-regexp by dired-do-relsymlink-regexp.
+
+2005-10-23  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi (Predefined Units): Use `alpha' for the fine structure
+       constant.
+
+2005-10-23  Michael Albinus  <michael.albinus@gmx.de>
+
+       * faq.texi (Bugs and problems): Replace
+       `dired-move-to-filename-regexp' by
+       `directory-listing-before-filename-regexp'.
+
+2005-10-22  Eli Zaretskii  <eliz@gnu.org>
+
+       * newsticker.texi (UPDATED): Set value.
+
+2005-10-17  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (Document Groups): Remove duplicate item.
+
+2005-10-21  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi (Summary): Mention iCalendar support.
+       (Exporting): Document iCalendar support.
+
+2005-10-18  Romain Francoise  <romain@orebokech.com>
+
+       * viper.texi (Viper Specials): Capitalize GNU.
+
+2005-10-17  Juri Linkov  <juri@jurta.org>
+
+       * info.texi (Getting Started, Search Index, Expert Info):
+       Fix wording.
+       (Search Text): Replace `echo area' with `mode line'.
+       (Search Index): Both `i' and `,' find all index entries.
+       Replace example `C-f' with `C-l' (which exists in index of Info
+       manual) and delete spaces in its keyboard input sequence.
+       Delete unnecessary explanations about literal characters.
+
+2005-10-14  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (Document Server Internals): Addition.
+
+2005-10-13  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (A note on namespaces): Fix RFC reference.
+
+2005-10-12  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (RSS): Fix key description.
+
+2005-10-11  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi: Emacs/w3 -> Emacs/W3.
+       (Browsing the Web): Fix description.
+       (Web Searches): Ditto.
+       (Customizing W3): Ditto.
+
+2005-10-07  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (Maildir): Clarify expire-age and expire-group.
+
+2005-10-11  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi (Integration): Mention using `a i' to compute definite
+       integrals.
+
+2005-10-11  Juri Linkov  <juri@jurta.org>
+
+       * info.texi: Rearrange nodes.
+       (Top): Update menu.  Change ref `Info for Experts' to
+       `Advanced Info Commands'.
+       (Getting Started): Fix description of manual's parts.
+       (Help-Int): Change xref `Info Search' to `Search Index', and
+       `Expert Info' to `Advanced'.
+       (Advanced): Move node one level up.
+       (Search Text, Search Index): New nodes split out from `Info Search'.
+       (Go to node, Choose menu subtopic, Create Info buffer): New nodes
+       split out from `Advanced'.
+       (Advanced, Emacs Info Variables): De-document editing an Info file
+       in Info.
+       (Emacs Info Variables): Move node from `Expert Info' to `Advanced'.
+       (Creating an Info File): Delete node and move its text to
+       `Expert Info'.
+
+2005-10-10  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi (Workflow states): Documented that change in keywords
+       becomes active only after restart of Emacs.
+
+2005-10-08  Michael Albinus  <michael.albinus@gmx.de>
+
+       Sync with Tramp 2.0.51.
+
+2005-10-08  Nick Roberts  <nickrob@snap.net.nz>
+
+       * speedbar.texi (Introduction): Describe new location of speedbar
+       on menubar.
+       (Basic Key Bindings): Remove descriptions of bindings that have
+       been removed.
+
+2005-10-05  Nick Roberts  <nickrob@snap.net.nz>
+
+       * speedbar.texi (GDB): Describe use of watch expressions.
+
+2005-09-28  Simon Josefsson  <jas@extundo.com>
+
+       * message.texi (IDNA): Fix.
+
+2005-09-28  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (NNTP): Remove nntp-buggy-select, nntp-read-timeout,
+       nntp-server-hook, and nntp-warn-about-losing-connection; fix
+       description of nntp-open-connection-function.
+       (Common Variables): Fix descriptions.
+
+2005-09-26  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (Server Buffer Format): Document the %a format spec.
+
+2005-09-22  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (Mail): Fix gnus-confirm-mail-reply-to-news entry.
+
+2005-09-23  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi Version 3.16.
+
+2005-09-19  Miles Bader  <miles@gnu.org>
+
+       * newsticker.texi: Get rid of CVS keywords.
+
+2005-09-15  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (Finding the Parent): Fix description of how Gnus
+       finds article.
+
+2005-09-14  Jari Aalto  <jari.aalto@cante.net>
+
+       * gnus.texi (Advanced Scoring Examples): New examples to teach how
+       to drop off non-answered articles.
+
+2005-09-19  Juanma Barranquero  <lekktu@gmail.com>
+
+       * makefile.w32-in (newsticker.dvi): Use parentheses instead of curly
+       braces (which are unsupported by NMAKE) for macro `srcdir'.
+
+2005-09-17  Eli Zaretskii  <eliz@gnu.org>
+
+       * makefile.w32-in (INFO_TARGETS, DVI_TARGETS): Add newsticker targets.
+       (../info/newsticker, newsticker.dvi): New targets.
+
+2005-09-17  Ulf Jasper  <ulf.jasper@web.de>
+
+       * newsticker.texi: Replace @command with @code.  Replace @example
+       with @lisp.
+       (Top): Added explanations to menu items.
+       (GNU Free Documentation License): Removed.
+
+2005-09-16  Romain Francoise  <romain@orebokech.com>
+
+       Update all files to specify GFDL version 1.2.
+
+       * doclicense.texi (GNU Free Documentation License): Update to
+       version 1.2.
+
+2005-09-15  Richard M. Stallman  <rms@gnu.org>
+
+       * newsticker.texi: Fix @setfilename.
+
+       * Makefile.in (INFO_TARGETS, DVI_TARGETS): Add newsticker targets.
+       (../info/newsticker, newsticker.dvi): New targets.
+
+2005-08-30  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi: Version 3.15.
+
+2005-08-29  Luc Teirlinck  <teirllm@auburn.edu>
+
+       * ses.texi: Combine all three indices into one.
+       Correct a few typos.
+
+2005-08-19  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * emacs-mime.texi (time-date): Fix description of safe-date-to-time.
+
+2005-08-18  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * emacs-mime.texi (Handles): Remove duplicate item.
+       (Encoding Customization): Fix the default value for
+       mm-coding-system-priorities.
+       (Charset Translation): Emacs doesn't use mm-mime-mule-charset-alist.
+       (Basic Functions): Fix reference.
+
+2005-08-09  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (Charsets): Fj hierarchy uses iso-2022-jp.
+
+2005-08-18  Richard M. Stallman  <rms@gnu.org>
+
+       * faq.texi (Obtaining the FAQ): Delete refs to Lerner's email
+       and web site.
+
+       * faq.texi (Swapping keys): Xref for normal-erase-is-backspace-mode,
+       not keyboard-translate.
+
+2005-08-11  Richard M. Stallman  <rms@gnu.org>
+
+       * faq.texi (Using regular expressions): Fix xref.
+
+2005-08-09  Juri Linkov  <juri@jurta.org>
+
+       * info.texi (Help-P): Replace `Prev' with `Previous'.
+       (Help-M, Help-Xref): Add S-TAB.
+       (Help-FOO): Update `u' command.
+       (Help-Xref): Move info about Mouse-2 from `Help-Int'.
+       Update info about visibility of xref parts.
+       (Help-Int): Fix `m' command.  Rename `Info-last' to
+       `Info-history-back'.  Add `Info-history-forward'.
+       (Advanced): Fix `g*' and `M-n' commands.
+       (Info Search): Add `index-apropos' in stand-alone browser.
+       Add isearch commands.
+       (Emacs Info Variables): Remove `Info-fontify'.
+       Add `Info-mode-hook'.  Update face names.
+       Add `Info-fontify-maximum-menu-size',
+       `Info-fontify-visited-nodes', `Info-isearch-search'.
+
+2005-08-07  Michael Albinus  <michael.albinus@gmx.de>
+
+       Sync with Tramp 2.0.50.
+
+       * tramp.texi: Use @option{} consequently for method names.
+       (Inline methods, External transfer methods): Remove references to
+       Cygwin.
+       (Issues with Cygwin ssh): Explain trouble with Cygwin's ssh
+       implementation.
+
+2005-07-27  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus.texi (Startup Files): Fix name of gnus-site-init-file.
+       Mention that gnus-init-file is not read when Emacs is invoked with
+       --no-init-file or -q.
+
+2005-07-19  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi: Version 3.14.
+
+2005-07-04  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi: Version 3.13.
+
+2005-07-18  Juri Linkov  <juri@jurta.org>
+
+       * calc.texi (Time Zones, Logical Operations):
+       * cl.texi (Overview):
+       * org.texi (TODO types):
+       * sc.texi (Emacs 18 MUAs):
+       * speedbar.texi (Top):
+       * url.texi (History):
+       Delete duplicate duplicate words.
+
+2005-07-16  Johan Bockgard  <bojohan@users.sourceforge.net>  (tiny change)
+
+       * cl.texi (Type Predicates): Document `atom' type.
+
+2005-07-04  Lute Kamstra  <lute@gnu.org>
+
+       Update FSF's address in GPL notices.
+
+       * calc.texi (Copying):
+       * doclicense.texi (GNU Free Documentation License):
+       * faq.texi (Contacting the FSF):
+       * mh-e.texi (Copying): Update FSF's address.
+
+2005-07-03  Richard M. Stallman  <rms@gnu.org>
+
+       * flymake.texi (Example -- Configuring a tool called directly):
+       Update name of flymake-build-relative-filename.
+
+2005-06-29  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (NoCeM): gnus-nocem-verifyer defaults to pgg-verify.
+
+2005-06-29  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi: Version 3.12.
+
+2005-06-24  Eli Zaretskii  <eliz@gnu.org>
+
+       * makefile.w32-in (MAKEINFO): Use --force.
+       (INFO_TARGETS, DVI_TARGETS): Make identical to the lists in
+       Makefile.in.
+       (gnus.dvi): Use "..." to quote Sed args, so that it works with
+       more shells.
+
+2005-06-23  Richard M. Stallman  <rms@gnu.org>
+
+       * speedbar.texi (Creating a display): Texinfo usage fixes.
+
+       * tramp.texi (Customizing Completion, Auto-save and Backup):
+       Texinfo usage fixes.
+
+2005-06-23  Juanma Barranquero  <lekktu@gmail.com>
+
+       * dired-x.texi (Miscellaneous Commands):
+       * ediff.texi (Miscellaneous):
+       * gnus.texi (MIME Commands, Fancy Mail Splitting, Agent Visuals)
+       (Agent Variables):
+       * info.texi (Help-Xref):
+       * message.texi (Message Headers):
+       * org.texi (Remember):
+       * reftex.texi (Options (Defining Label Environments)):
+       (Options (Index Support)):
+       (Options (Viewing Cross-References)):
+       (Options (Misc)):
+       (Changes):
+       * speedbar.texi (Creating a display):
+       * tramp.texi (Customizing Completion, Auto-save and Backup):
+       Texinfo usage fix.
+
+2005-06-13  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi: Version 3.11.
+
+2005-06-12  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi (Getting Started): Remove extra menu item.
+
+2005-05-31  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi (Notations Used in This Manual): Use @kbd for key
+       sequence.
+       (Demonstration of Calc): Mention another way of starting Calc.
+       (Starting Calc): Mention long name of M-#.
+       (Embedded Mode Overview): Remove unnecessary instruction.
+       (Other M-# commands): Rephrase `M-# 0' explanation.
+       (Basic Embedded Mode): Rewrite discussion of prefix arguments to
+       reflect current behavior.
+
+2005-05-30  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi (Hooks): Change description of calc-window-hook and
+       calc-trail-window-hook to match usage.
+       (Computational Functions): Add more constant-generating functions.
+       (Customizable Variables): Use defvar.
+
+2005-05-28  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi (Assignments in Embedded Mode): Fix variable name.
+       (Basic Embedded Mode): Explain behavior of arguments to
+       calc-embedded-mode.
+
+2005-05-27  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi (Queries in Keyboard Macros): Rewrite to reflect
+       current behavior.
+
+2005-05-25  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi: Change Calc version number throughout.
+       (Keypad Mode): Change location in info output.
+       (Keypad mode overview): Move picture of keypad.
+
+2005-05-21  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi (Storing variables): Mention that only most variables
+       are void to begin with.
+
+2005-05-21  Kevin Ryde  <user42@zip.com.au>
+
+       * widget.texi (Basic Types): Update cross ref from "Enabling
+       Mouse-1 to Follow Links" to "Links and Mouse-1" per recent
+       lispref/text.texi change.
+
+2005-05-20  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi: Version 3.09.
+
+2005-05-18  Carsten Dominik  <dominik@science.uva.nl>
+
+       * reftex.texi: Version 4.28.
+
+2005-05-16  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi (Storing Variables): Mention `calc-copy-special-constant'.
+
+2005-05-14  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi (Default Simplifications): Insert missing ! (logical
+       not operator).
+
+2005-05-14  Michael Albinus  <michael.albinus@gmx.de>
+
+       Sync with Tramp 2.0.49.
+
+2005-05-10  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi (Default Simplifications): Mention that 0^0 simplifies
+       to 1.
+
+2005-04-29  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi: Version 3.08, structure reorganized.
+
+2005-04-24  Richard M. Stallman  <rms@gnu.org>
+
+       * faq.texi: Delete info about lazy-lock.el and fast-lock.el.
+
+2005-04-15  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.texi: Update to version 3.06.
+
+2005-04-13  Lute Kamstra  <lute@gnu.org>
+
+       * cc-mode.texi: Prevent creating an unnecessary empty cc-mode.ss file.
+
+2005-04-10  Thien-Thi Nguyen  <ttn@gnu.org>
+
+       * cl.texi (Porting Common Lisp): Fix typo.
+
+2005-04-06  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (RSS): Addition.
+
+2005-04-04  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi: Change Calc version number.
+       (Customizable variables): Fix description of calc-language-alist.
+       (Copying): Put in version 2 of GPL.
+
+2005-04-01  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi (Troubleshooting Commands): Remove comment about
+       installation.
+       (Installation): Remove section.
+       (Customizable Variables): New section.
+       (Basic Embedded Mode, Customizing Embedded Mode, Graphics)
+       (Graphical Devices): Add references to Customizable Variables.
+
+2005-03-25  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * emacs-mime.texi (Display Customization): Markup fixes.
+       (rfc2047): Update.
+
+2005-03-23  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus-faq.texi: Replaced with auto-generated version.
+
+2005-03-26  Stephan Stahl  <stahl@eos.franken.de>  (tiny change)
+
+       * dired-x.texi (Multiple Dired Directories): default-directory was
+       renamed to dired-default-directory.
+
+2005-03-26  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi (Simplifying Formulas, Rewrite Rules):
+       Change description of top and bottom of fraction.
+       (Modulo Forms): Move description of how to create modulo forms to
+       earlier in the section.
+       (Fraction Mode): Suggest using : to get a fraction by dividing.
+       (Basic Arithmetic): Adjust placement of command name.
+       (Truncating the Stack): Emphasize that "hidden" entries are still
+       visible.
+       (Installation): Move discussion of printing manual to "About This
+       Manual".
+       (About This Manual): Mention how to print the manual.
+       (Reporting Bugs): Remove first person.
+       (Building Vectors): Add algebraic version of append.
+       (Manipulating Vectors): Fix algebraic version of calc-reverse-vector.
+       (Grouping Digits): Fix typo.
+
+2005-03-25  Werner Lemberg  <wl@gnu.org>
+
+       * calc.texi, cl.texi, gnus.texi, idlwave.texi, reftex.texi:
+       Replace `legal' with `valid'.
+
+2005-03-25  Werner Lemberg  <wl@gnu.org>
+
+       * calc.texi, reftex.texi: Replace `illegal' with `invalid'.
+
+2005-03-24  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi (General Mode Commands)
+       (Mode Settings in Embedded Mode): Add some explanation of
+       recording mode settings.
+
+2005-03-24  Richard M. Stallman  <rms@gnu.org>
+
+       * calc.texi: Remove praise of non-free software.
+
+       * idlwave.texi: Don't say where to get IDL or its non-free manual.
+       (Installation): Node deleted.
+
+2005-03-23  Richard M. Stallman  <rms@gnu.org>
+
+       * url.texi (HTTP language/coding): Improve last change.
+
+2005-03-22  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi (Embedded Mode): Add new information on changing
+       modes.
+
+2005-03-20  Michael Albinus  <michael.albinus@gmx.de>
+
+       Sync with Tramp 2.0.48.
+
+       * trampver.texi.in: Replace "Emacs" by "GNU Emacs".
+
+       * tramp.texi: Replace "Emacs" by "GNU Emacs".  Replace "Linux" by
+       "GNU/Linux".  Change all addresses to .gnu.org.
+       (Default Method): Offer shortened syntax for "su" and "sudo"
+       methods.
+
+2005-03-07  Richard M. Stallman  <rms@gnu.org>
+
+       * url.texi: Fix usage of "e.g.".
+       (HTTP language/coding): Explain the rules for these strings.
+
+2005-03-06  Richard M. Stallman  <rms@gnu.org>
+
+       * woman.texi (Introduction): Minor cleanups.
+
+       * url.texi (HTTP language/coding): Get rid of "Emacs 21".
+
+       * pcl-cvs.texi (About PCL-CVS): Get rid of "Emacs 21".
+       (Installation): Node deleted.
+
+       * mh-e.texi (Preface): Get rid of "Emacs 21".
+
+       * eshell.texi (Installation): Delete node (for Emacs 20).
+
+2005-03-05  Thien-Thi Nguyen  <ttn@gnu.org>
+
+       * flymake.texi: Refill and tweak style in @lisp blocks.
+
+2005-03-03  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus.texi (Slow/Expensive Connection): Don't abbreviate "very".
+
+2005-03-01  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi (Trigonometric and Hyperbolic Functions):
+       Mention additional functions.
+       (Algebraic Simplifications): Mention additional simplifications.
+
+2005-02-18  Jonathan Yavner  <jyavner@member.fsf.org>
+
+       * ses.texi: Add concept/function/variable indices (this work was
+       donated by Brad Collins <brad@chenla.org>, copyright-assignment
+       papers on file at FSF).
+
+2005-02-10  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi: Change @LaTeX to La@TeX throughout.
+       Redefine @expr as @math for TeX output.
+       Redefine @texline as a no-op for TeX output.
+       Define @tfn, replace @t by @tfn throughout.
+
+2005-02-09  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi: Add macro for LaTeX for info output.
+
+2005-02-08  Kim F. Storm  <storm@cua.dk>
+
+       * texinfo.tex (LaTex): Add def.
+
+2005-02-06  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi (TeX Language Mode): Add mention of LaTeX mode, and
+       change name to "TeX and LaTeX Language Modes."  Mention LaTeX mode
+       throughout manual.
+
+2005-01-28  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus.texi: Some edits based on comments from David Abrahams.
+
+2005-01-24  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (RSS): Fix the keystroke.
+
+2005-01-24  David Kastrup  <dak@gnu.org>
+
+       * faq.texi: Update AUCTeX version info.
+
+2005-01-16  Xavier Maillard  <zedek@gnu-rox.org>  (tiny change)
+
+       * gnus-faq.texi ([4.1]): Typo.
+
+2005-01-19  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi (Keep Arguments): Mention that keeping arguments
+       doesn't work with keyboard macros.
+
+2005-01-16  Richard M. Stallman  <rms@gnu.org>
+
+       * autotype.texi (Autoinserting): Fix small error.
+
+2005-01-16  Michael Albinus  <michael.albinus@gmx.de>
+
+       Sync with Tramp 2.0.47.
+
+       * tramp.texi (Compilation): New section, describing compilation of
+       remote files.
+
+2005-01-11  Kim F. Storm  <storm@cua.dk>
+
+       * widget.texi (Basic Types): Add :follow-link keyword.
+
+2005-01-09  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi (Basic Commands): Describe new behavior of calc-reset.
+
+2005-01-08  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi: Change throughout to reflect new default value of
+       calc-settings-file.
+
+2005-01-06  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * message.texi (Reply): `message-reply-to-function' should return
+       a list.  Suggested by ARISAWA Akihiro <ari@mbf.ocn.co.jp>.
+
+2005-01-06  Hiroshi Fujishima  <pooh@nature.tsukuba.ac.jp>  (tiny change)
+
+       * faq.texi (Changing load-path): Fix typo.
+
+2005-01-05  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi (Programming Tutorial): Replace kbd command by
+       appropriate characters for a keyboard macro.
+
+2005-01-04  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi (Basic Tutorial, Programming Tutorial): Remove caveats
+       for Lucid Emacs.
+       (Programming Tutorial): Mention that the user needs to be in the
+       right mode to compute some functions.
+
+2005-01-04  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi (Rewrite rules): Remove an exercise (on 0^0) which is
+       no longer applicable.
+
+2005-01-01  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi (Programming Tutorial): Changed description of how to
+       edit keyboard macros to match current behavior.
+
+2004-12-31  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi: Mention C-cC-c as the way to finish editing throughout.
+
+2004-12-20  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi (Types Tutorial): Emphasize that you can't divide by
+       zero.
+
+2004-12-17  Luc Teirlinck  <teirllm@auburn.edu>
+
+       * cc-mode.texi (Text Filling and Line Breaking): Put period after
+       @xref.
+       (Font Locking): Avoid @strong{Note:}.
+
+2004-12-17  Michael Albinus  <michael.albinus@gmx.de>
+
+       Sync with Tramp 2.0.46.
+
+       * tramp.texi (bottom): Add arch-tag.  It was lost, somehow.
+
+2004-12-16  Luc Teirlinck  <teirllm@auburn.edu>
+
+       * url.texi: Correct typos.
+       (Retrieving URLs): @var{nil}->@code{nil}.
+       (HTTP language/coding, mailto): Replace  "GNU Emacs Manual" with
+       the standard "The GNU Emacs Manual" in fifth argument of @xref's.
+       (Dealing with HTTP documents): @inforef->@xref.
+
+2004-12-15  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi: Consistently capitalized all mode names.
+       (Answers to Exercises): Mention that an answer can be a fraction
+       when in Fraction mode.
+
+2004-12-13  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi: Fix some TeX definitions.
+
+2004-12-09  Luc Teirlinck  <teirllm@auburn.edu>
+
+       * reftex.texi (Imprint): Remove erroneous @value's.
+
+2004-12-08  Luc Teirlinck  <teirllm@auburn.edu>
+
+       * makefile.w32-in (INFO_TARGETS, DVI_TARGETS, $(infodir)/org)
+       (org.dvi, $(infodir)/url, url.dvi, clean): Add org and url manuals.
+
+2004-12-08  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi (Starting Calc): Remove comment about installation.
+       (Keypad Mode Overview): Remove comment about Emacs 19 support.
+
+2004-12-08  Luc Teirlinck  <teirllm@auburn.edu>
+
+       * url.texi: Update @setfilename.
+       (Getting Started): No need to worry about Gnus versions.
+       (Dealing with HTTP documents): Use @inforef.
+
+       * org.texi: Fix @direntry file name.
+
+2004-12-07  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * url.texi: New file.
+
+       * Makefile.in (INFO_TARGETS, DVI_TARGETS, ../info/url, url.dvi): Add it.
+
+2004-12-06  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi (Using Calc): Remove paragraph about installation.
+
+2004-12-06  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi: Use more Texinfo macros and less TeX defs.
+       Remove @refill's.
+
+2004-12-06  Richard M. Stallman  <rms@gnu.org>
+
+       * org.texi: New file.
+
+2004-12-05  Richard M. Stallman  <rms@gnu.org>
+
+       * Makefile.in (org.dvi, ../info/org): New targets.
+       (INFO_TARGETS): Add ../info/org.
+       (DVI_TARGETS): Add org.dvi.
+       (maintainer-clean): Remove the info files in the info dir.
+
+2004-11-26  Eli Zaretskii  <eliz@gnu.org>
+
+       * idlwave.texi: Fix the setfilename directive to put the produced
+       file in ../info.
+       (Continued Statement Indentation): Resurrect Jan D.'s change from
+       2004-11-03 that was lost when a newer version of idlwave.texi was
+       imported.
+
+2004-12-08  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus-faq.texi ([5.1]): Added missing bracket.
+
+       * gnus.texi (Filtering Spam Using The Spam ELisp Package): Index
+       `spam-initialize'.
+
+2004-11-22  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * message.texi (Various Message Variables): Mention that all mail
+       file variables are derived from `message-directory'.
+
+       * gnus.texi (Splitting Mail): Clarify bogus group.
+
+2004-11-02  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * emacs-mime.texi (Encoding Customization): Fix
+       mm-coding-system-priorities entry.
+
+2004-11-03  Jan Dj\e,Ad\e(Brv  <jan.h.d@swipnet.se>
+
+       * idlwave.texi (Continued Statement Indentation):
+       * reftex.texi (Options (Index Support)):
+       (Displaying and Editing the Index, Table of Contents):
+       * speedbar.texi (Creating a display, Major Display Modes): Replace
+       non-nil with non-@code{nil}.
+
+2004-10-21  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi (Algebraic-Style Calculations): Removed a comment.
+
+2004-10-18  Luc Teirlinck  <teirllm@auburn.edu>
+
+       * calc.texi (Reporting Bugs): Double up `@'.
+
+2004-10-18  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi (Reporting Bugs): Changed the address that bugs
+       should be sent to.
+
+2004-10-15  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus.texi (New Features): Add 5.11.
+
+       * message.texi (Resending): Remove wrong default value.
+
+       * gnus.texi (Mail Source Specifiers): Describe possible problems
+       of `pop3-leave-mail-on-server'.  Add `pop3-movemail' and
+       `pop3-leave-mail-on-server' to the index.
+
+2004-10-15  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * message.texi (Canceling News): Add how to set a password.
+
+2004-10-12  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi (Help Commands): Changed the descriptions of
+       calc-describe-function and calc-describe-variable to match their
+       current behavior.
+
+2004-10-12  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus-faq.texi ([5.9]): Improve code for reply-in-news.
+
+2004-10-12  Michael Albinus  <michael.albinus@gmx.de>
+
+       Sync with Tramp 2.0.45.
+
+       * tramp.texi (Frequently Asked Questions): Comment paragraph about
+       plink link.  The URL is outdated.  Originator contacted for
+       clarification.
+
+2004-10-10  Juri Linkov  <juri@jurta.org>
+
+       * gnus.texi (Top, Marking Articles): Join two menus in one node
+       because a node can have only one menu.
+
+2004-10-09  Juri Linkov  <juri@jurta.org>
+
+       * gnus.texi (Fancy Mail Splitting): Remove backslash in the
+       example of nnmail-split-fancy.
+
+2004-10-06  Karl Berry  <karl@gnu.org>
+
+       * info.texi (@kbd{1}--@kbd{9}): No space around --, for
+       consistency with other uses of dashes.
+
+2004-10-05  Karl Berry  <karl@gnu.org>
+
+       * info.texi: Consistently use --- throughout, periods at end of
+       menu descriptions, and a couple typos.
+
+2004-09-26  Jesper Harder  <harder@ifa.au.dk>
+
+       * sieve.texi (Manage Sieve API): nil -> @code{nil}.
+       * pgg.texi (User Commands, Backend methods): Do.
+       * gnus.texi: Markup fixes.
+       (Setting Process Marks): Fix `M P a' entry.
+       * emacs-mime.texi: Fixes.
+
+2004-09-23  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus-faq.texi ([5.12]): Fix code example for FQDN in Message-Ids
+       again.
+       Use 5.10 instead of 5.10.0.
+
+2004-09-20  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus.texi (Summary Mail Commands): S D e.
+
+2004-09-20  Raymond Scholz  <ray-2004@zonix.de>  (tiny change)
+
+       * gnus.texi (Misc Article): Refer to `Summary Buffer Mode Line' in
+       the gnus-article-mode-line-format section.
+
+2004-09-20  Helmut Waitzmann  <Helmut.Waitzmann@web.de>  (tiny change)
+
+       * gnus.texi (Various Summary Stuff): Fix the documentation for
+       gnus-newsgroup-variables.
+
+2004-09-20  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus.texi (MIME Commands): Added
+       gnus-mime-display-multipart-as-mixed,
+       gnus-mime-display-multipart-alternative-as-mixed,
+       gnus-mime-display-multipart-related-as-mixed.
+       (Mail Source Customization): Clarify `mail-source-directory'.
+       (Splitting Mail): Mention gnus-group-find-new-groups.
+       (SpamOracle): Fixed typo.
+
+       * gnus-faq.texi: Untabify.
+       ([6.3]): nnir.el is in contrib directory.
+
+       * message.texi (News Headers): Clarify how a unique ID is created.
+
+       * gnus.texi (Batching Agents): Fixed typo in example.  Reported
+       by Hiroshi Fujishima <pooh@nature.tsukuba.ac.jp>.
+
+2004-09-20  Andre Srinivasan  <andre@e2open.com>
+
+       * gnus.texi (Group Parameters): Added more on hooks.  (Small
+       change.)
+
+2004-09-20  Florian Weimer  <fw@deneb.enyo.de>
+
+       * gnus.texi (Charsets): Point to relevant section in emacs-mime.
+
+2004-09-22  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi (Vectors as Lists): Added a warning that the tutorial
+       might be hidden during part of the session.
+
+2004-09-20  Jay Belanger  <belanger@truman.edu>
+
+       * calc.texi (Notations Used in This Manual): Put in an earlier
+       mention that DEL could be called Backspace.
+
+2004-09-10  Simon Josefsson  <jas@extundo.com>
+
+       * gnus.texi (IMAP): Add example.  Suggested and partially written
+       by Steinar Bang <sb@dod.no>.
+
+2004-09-10  Teodor Zlatanov  <tzz@lifelogs.com>
+
+       * gnus.texi (IMAP): Add comments about imaps synonym to imap in
+       netrc syntax.
+
+2004-09-10  Teodor Zlatanov  <tzz@lifelogs.com>
+
+       * gnus.texi (Spam ELisp Package Sequence of Events): Some clarifications.
+       (Spam ELisp Package Global Variables): More clarifications.
+
+2004-09-10  Teodor Zlatanov  <tzz@lifelogs.com>
+
+       * gnus.texi (Spam ELisp Package Filtering of Incoming Mail):
+       Mention spam-split does not modify incoming mail.
+
+2004-09-10  Teodor Zlatanov  <tzz@lifelogs.com>
+
+       * gnus.texi (Spam ELisp Package Sequence of Events): Fix typo.
+
+2004-09-10  Eli Zaretskii  <eliz@gnu.org>
+
+       * Makefile.in (../info/gnus, gnus.dvi): Depend on gnus-faq.texi.
+
+2004-09-09  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * makefile.w32-in (sieve, pgg): Use $(infodir).
+
+2004-09-08  Dhruva Krishnamurthy  <dhruva.krishnamurthy@gmail.com>  (tiny change)
+
+       * makefile.w32-in: Fix PGG and Sieve entries.
+
+2004-08-28  Eli Zaretskii  <eliz@gnu.org>
+
+       * faq.texi (Emacs for MS-DOS): Update URLs for the MS-DOS port of
+       Emacs and related programs.
+
+2004-08-27  Richard M. Stallman  <rms@gnu.org>
+
+       * faq.texi: Fix texinfo usage, esp. doublequotes.
+       (Difference between Emacs and XEmacs): Some clarification.
+
+       * faq.texi (Difference between Emacs and XEmacs):
+       Explain not to contrast XEmacs with GNU Emacs.
+
+2004-08-26  Richard M. Stallman  <rms@gnu.org>
+
+       * faq.texi (Difference between Emacs and XEmacs): Rewrite.
+
+2004-08-22  David Kastrup  <dak@gnu.org>
+
+       * reftex.texi (AUCTeX): Update links, section name.
+
+       * faq.texi (Calc): Update availability (included in 22.1).
+       (AUCTeX): Update availability, information, versions, description.
+
+2004-08-14  Eli Zaretskii  <eliz@gnu.org>
+
+       * Makefile.in (../info/tramp, tramp.dvi): Depend on trampver.texi.
+
+2004-08-11  Martin Stjernholm  <bug-cc-mode@gnu.org>
+
+       * cc-mode.texi: Various updates for CC Mode 5.30.9.
+
+2004-08-10  Michael Albinus  <michael.albinus@gmx.de>
+
+       Sync with Tramp 2.0.44.
+
+2004-08-05  Lars Hansen  <larsh@math.ku.dk>
+
+       * widget.texi (User Interface): Update how to separate the
+       editable field of an editable-field widget from other widgets.
+       (Programming Example): Add text after field.
+
+2004-08-31  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * emacs-mime.texi (Encoding Customization): Add a note to the
+       mm-content-transfer-encoding-defaults entry.
+       (rfc2047): Update.
+
+       * gnus.texi (Article Highlighting): Add
+       gnus-cite-ignore-quoted-from.
+       (POP before SMTP): New node.
+       (Posting Styles): Addition.
+       (Splitting Mail): Add nnmail-split-lowercase-expanded.
+       (Fancy Mail Splitting): Ditto.
+       (X-Face): Add gnus-x-face.
+
+2004-08-30  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * emacs-mime.texi, gnus-faq.texi, gnus.texi, message.texi,
+       * pgg.texi, sieve.texi: Use @copying and @insertcopying.
+
+2004-08-22  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus.texi (Mail Source Specifiers): Describe
+       `pop3-leave-mail-on-server'.
+
+2004-08-02  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * Makefile.in, makefile.w32-in: Added PGG and Sieve files.
+
+       * pgg.texi, sieve.texi: Import from the v5_10 branch of the Gnus
+       repository.  Change setfilename.
+
+       * emacs-mime.texi, gnus-faq.texi, gnus.texi, message.texi: Ditto.
+
+2004-07-02  Juri Linkov  <juri@jurta.org>
+
+       * pcl-cvs.texi (Viewing differences): Add `d r'.
+
+2004-06-29  Jesper Harder  <harder@ifa.au.dk>
+
+       * ses.texi, viper.texi, flymake.texi, faq.texi:
+       * eshell.texi, ediff.texi: Markup fixes.
+
+2004-06-21  Karl Berry  <karl@gnu.org>
+
+       * info.texi (Top): Mention that only Emacs has mouse support.
+       (Getting Started): Mention this in a few other places.
+
+2004-06-13  Luc Teirlinck  <teirllm@auburn.edu>
+
+       * autotype.texi (Copyrights, Timestamps): Recommend
+       `before-save-hook' instead of `write-file-functions'.
+
+2004-06-13  Lars Hansen  <larsh@math.ku.dk>
+
+       * dired-x.texi (dired-mark-omitted): Update keybinding.
+
+2004-06-10  Kim F. Storm  <storm@cua.dk>
+
+       * pcl-cvs.texi (Viewing differences): Add 'd y'.
+
+2004-06-05  Lars Hansen  <larsh@math.ku.dk>
+
+       * dired-x.texi (variable dired-omit-mode): Rename from
+       dired-omit-files-p.
+       (function dired-omit-mode): Rename from dired-omit-toggle.
+       Call dired-omit-mode rather than set dired-omit-files-p.
+       (dired-mark-omitted): Describe command.
+
+2004-05-29  Michael Albinus  <michael.albinus@gmx.de>
+
+       Version 2.0.41 of Tramp released.
+
+2004-05-29  Juanma Barranquero  <lektu@terra.es>
+
+       * makefile.w32-in (../info/flymake, flymake.dvi): New targets.
+       (INFO_TARGETS, DVI_TARGETS): Add Flymake.
+
+2004-05-29  Richard M. Stallman  <rms@gnu.org>
+
+       * cl.texi (Top): Call this chapter `Introduction'.
+       (Overview): In TeX, no section heading here.
+
+       * cc-mode.texi: Put commas after i.e. and e.g.  Minor cleanups.
+
+2004-05-29  Eli Zaretskii  <eliz@gnu.org>
+
+       * Makefile.in (../info/flymake, flymake.dvi): New targets.
+       (INFO_TARGETS, DVI_TARGETS): Add Flymake.
+
+2004-05-29  Pavel Kobiakov  <pk_at_work@yahoo.com>
+
+       * flymake.texi: New file.
+
+2004-05-28  Simon Josefsson  <jas@extundo.com>
+
+       * smtpmail.texi (Authentication): Improve STARTTLS discussion.
+
+2004-05-07  Kai Grossjohann  <kai@emptydomain.de>
+
+       Version 2.0.40 of Tramp released.
+
+2004-04-25  Michael Albinus  <Michael.Albinus@alcatel.de>
+
+       Complete rework, based on review by Karl Berry <karl@gnu.org>.
+
+       * tramp.texi (Auto-save and Backup): Explain exploitation of new
+       variables `tramp-backup-directory-alist' and
+       `tramp-bkup-backup-directory-info'.
+       (Overview, Connection types)
+       (External transfer methods, Default Method)
+       (Windows setup hints): Remove restriction of password entering
+       with external methods.
+       (Auto-save and Backup): Make file name example
+       (X)Emacs neutral.  In case of XEmacs, `bkup-backup-directory-info'
+       and `auto-save-directory' must be used.
+       (Frequently Asked Questions): Use "MS Windows NT/2000/XP" (not
+       only "NT").  Remove doubled entry "What kinds of systems does
+       @tramp{} work on".
+       (tramp): Macro removed.
+       (Obtaining Tramp): Flag removed from title.
+       (all): "tramp-" and "-" removed from flag names.  Flags `tramp'
+       and `trampver' used properly.  Flag `tramp-inst' replaced by
+       `installchapter'.  Installation related text adapted.
+
+2004-04-28  Masatake YAMATO  <jet@gyve.org>
+
+       * widget.texi (Programming Example): Remove overlays.
+
+2004-04-27  Jesper Harder  <harder@ifa.au.dk>
+
+       * faq.texi, viper.texi, dired-x.texi, autotype.texi: lisp -> Lisp.
+
+2004-04-23  Juanma Barranquero  <lektu@terra.es>
+
+       * makefile.w32-in: Add "-*- makefile -*-" mode tag.
+
+2004-04-05  Jesper Harder  <harder@ifa.au.dk>
+
+       * info.texi (Info Search): Add info-apropos.
+
+2004-03-22  Juri Linkov  <juri@jurta.org>
+
+       * faq.texi: Fix help key bindings.
+
+2004-03-17  Luc Teirlinck  <teirllm@auburn.edu>
+
+       * info.texi (Advanced): Replace @unnumberedsubsec by @subheading
+       (as suggested by Karl Berry).  Update information about colored
+       stars in menus.  Add new subheading describing M-n.
+
+2004-03-12  Richard M. Stallman  <rms@gnu.org>
+
+       * cl.texi (Top): Rename top node's title.
+
+2004-03-08  Karl Berry  <karl@gnu.org>
+
+       * info.texi: \input texinfo.tex instead of just texinfo, to avoid
+       problems making the texinfo distribution.
+
+2004-02-29  Simon Josefsson  <jas@extundo.com>
+
+       * smtpmail.texi (Authentication): Changed the list of supported
+       authentication mechanisms from CRAM-MD5, PLAIN and LOGIN-MD5 to
+       CRAM-MD5 and LOGIN, tiny patch from Andreas Voegele
+       <voegelas@gmx.net>.
+
+2004-02-29  Juanma Barranquero  <lektu@terra.es>
+
+       * makefile.w32-in (mostlyclean, clean, maintainer-clean):
+       Use $(DEL) instead of rm, and ignore exit code.
+
+2004-02-29  Kai Grossjohann  <kgrossjo@eu.uu.net>
+
+       Tramp version 2.0.39 released.
+
+2004-02-29  Michael Albinus  <Michael.Albinus@alcatel.de>
+
+       * tramp.texi (Customizing Completion): Explain new functions
+       `tramp-parse-shostkeys' and `tramp-parse-sknownhosts'.
+       (all): Savannah URLs unified to "http://savannah.nongnu.org".
+       (Top): Refer to Savannah mailing list as the major one.  Mention
+       older mailing lists in HTML mode only.
+       (Auto-save and Backup): Add auto-save.  Based on wording of Kai.
+       (Frequently Asked Questions): Remote hosts must not be Unix-like
+       for "smb" method.
+       (Password caching): New node.
+       (External transfer methods): Refer to password caching for "smb"
+       method.
+
+2004-02-17  Karl Berry  <karl@gnu.org>
+
+       * info.texi (Help-Int): Mention the new line number feature.
+
+2004-02-14  Jonathan Yavner  <jyavner@member.fsf.org>
+
+       * ses.texi (Advanced Features): New functionality for
+       ses-set-header-row (defaults to current row unless C-u used).
+       (Acknowledgements): Add Stefan Monnier.
+
+2003-12-29  Kevin Ryde  <user42@zip.com.au>
+
+       * viper.texi (Vi Macros): Fix reference to the Emacs manual.
+
+2003-11-30  Kai Grossjohann  <kai.grossjohann@gmx.net>
+
+       Tramp version 2.0.38 released.
+
+       * tramp.texi (Remote shell setup): Warn of environment variables
+       FRUMPLE if user frumple exists.  Suggested by Sven Gabriel
+       <sven.gabriel@imk.fzk.de>.
+       (Configuration): Tramp now chooses base64/uuencode
+       automatically.  Update wording accordingly.
+       (Top): More description for the `Default Method' menu entry.
+       (Default Method): Use @code, not @var, for Lisp variables.
+       (Default Method): New subsection `Which method is the right one
+       for me?'  Suggested by Christian Kirsch.
+       (Configuration): Pointer to new subsection added.
+       (Default Method): Too many "use" in one sentence.
+       Rephrase.  Reported by Christian Kirsch.
+       (Filename Syntax): Old `su' example is probably a left-over from
+       the sm/su method naming.  Replace with `ssh', instead.
+       (External transfer methods, Auto-save and Backup):
+       Typo fixes.
+
+2003-11-02  Michael Albinus  <Michael.Albinus@alcatel.de>
+
+       * tramp.texi (all): Harmonize all occurences of @tramp{}.
+       (Top): Mention japanese manual only if flag `jamanual' is set.
+       Insert section `Japanese manual' in menu.
+
+2003-11-26  Thien-Thi Nguyen  <ttn@gnu.org>
+
+       * eshell.texi (Known Problems): Add doc item.
+
+2003-11-22  Martin Stjernholm  <bug-cc-mode@gnu.org>
+
+       * cc-mode.texi: Update for CC Mode 5.30.
+
+       Note: Please refrain from doing purely cosmetic changes like
+       removing trailing whitespace in this manual; it clobbers cvs
+       merging for no good reason.
+
+2003-11-02  Jesper Harder  <harder@ifa.au.dk>  (tiny change)
+
+       * man/ediff.texi, man/tramp.texi, man/vip.texi, man/viper.texi:
+       * man/widget.texi, man/woman.texi: Replace @sc{ascii} and ASCII with
+       @acronym{ASCII}.
+
+2003-10-26  Karl Berry  <karl@gnu.org>
+
+       * info.texi (Info Search): Echo area, not echo are.  From Debian
+       diff.
+
+2003-10-26  Per Abrahamsen  <abraham@dina.kvl.dk>
+
+       * widget.texi (Defining New Widgets): Document new beavior of
+       :buttons and :children keywords.
+
+2003-10-22  Miles Bader  <miles@gnu.org>
+
+       * Makefile.in (info): Move before $(top_srcdir)/info.
+
+2003-10-17  Thien-Thi Nguyen  <ttn@gnu.org>
+
+       * tramp.texi (Inline methods): Small grammar fix.
+       (External transfer methods): Likewise.
+
+2003-10-08  Nick Roberts  <nick@nick.uklinux.net>
+
+       * speedbar.texi: Remove paragraph for GUD that is no longer true.
+
+2003-10-06  Luc Teirlinck  <teirllm@auburn.edu>
+
+       * texinfo.tex: Replace `%' in arch tagline by @ignore.
+
+2003-09-30  Richard M. Stallman  <rms@gnu.org>
+
+       * dired-x.texi (Miscellaneous Commands): Delete M-g, w, T.
+
+       * widget.texi (User Interface): Fix typos.
+
+       * pcl-cvs.texi, cl.texi, woman.texi, ediff.texi: Fix @strong{Note:}.
+
+2003-09-29  Thien-Thi Nguyen  <ttn@gnu.org>
+
+       * pcl-cvs.texi (Selected Files): Fix typo.
+
+2003-09-21  Karl Berry  <karl@gnu.org>
+
+       * info.texi (] and [ commands): No period at end of section title.
+
+2003-09-04  Miles Bader  <miles@gnu.org>
+
+       * Makefile.in (top_srcdir): New variable.
+       ($(top_srcdir)/info): New rule.
+       (info): Depend on it.
+
+2003-09-03  Peter Runestig  <peter@runestig.com>
+
+       * makefile.w32-in: New file.
+
+2003-08-26  Per Abrahamsen  <abraham@dina.kvl.dk>
+
+       * widget.texi (User Interface): Explain the need of static text
+       around an editable field.
+
+2003-08-19  Luc Teirlinck  <teirllm@mail.auburn.edu>
+
+       * widget.texi (Basic Types): The argument to `:help-echo' can now
+       be a form that evaluates to a string.
+
+2003-08-18  Kim F. Storm  <storm@cua.dk>
+
+       * calc.texi (Queries in Macros): Update xref to keyboard macro query.
+
+2003-08-16  Richard M. Stallman  <rms@gnu.org>
+
+       * dired-x.texi (Shell Command Guessing): Explain *.
+
+2003-08-16  Chunyu Wang  <spr@db.cs.hit.edu.cn>  (tiny change)
+
+       * pcl-cvs.texi (Log Edit Mode): Fix key binding for
+       log-edit-insert-changelog.
+
+2003-08-03  Karl Berry  <karl@gnu.org>
+
+       * info.texi: Need @contents.
+
+2003-07-20  Kai Gro\e,A_\e(Bjohann  <kai.grossjohann@gmx.net>
+
+       Tramp version 2.0.36 released.
+
+       * tramp.texi (Remote shell setup): Explain about problems with
+       non-Bourne commands in ~/.profile and ~/.shrc.
+
+2003-07-07  Luc Teirlinck  <teirllm@mail.auburn.edu>
+
+       * info.texi (Help-Inv, Help-M, Help-Xref): Update following
+       renaming of `vis-mode' to `visible-mode'.
+
+2003-07-04  Luc Teirlinck  <teirllm@mail.auburn.edu>
+
+       * info.texi (Top, Help-Small-Screen): Remove accidentally added
+       next, prev and up pointers.
+
+2003-07-02  Luc Teirlinck  <teirllm@mail.auburn.edu>
+
+       * info.texi (Help): Mention existence of Emacs and stand-alone
+       Info at the very beginning of the tutorial.
+       (Help-Inv): New node.
+       (Help-]): New node.
+       (Help-M): Systematically point out the differences between default
+       Emacs and stand-alone versions.  Delete second menu.
+       (Help-Xref): Systematically point out the differences between
+       default Emacs and stand-alone versions.
+       (Help-Int): Change `l' example.
+       (Expert Info): Fix typos.
+       (Emacs Info Variables): Mention `Info-hide-note-references' and
+       new default for `Info-scroll-prefer-subnodes'.
+
+2003-06-17  Kai Gro\e,A_\e(Bjohann  <kai.grossjohann@gmx.net>
+
+       Version 2.0.35 of Tramp released.
+
+       * tramp.texi: From Michael Albinus <Michael.Albinus@alcatel.de>:
+       (Inline methods): Add methods `remsh' and `plink1'.
+       (External transfer methods): Add method `remcp'.
+       (Multi-hop Methods): Add method `remsh'.
+       Small patch from Adrian Aichner <adrian@xemacs.org>:
+       Fix minor typos.
+       (Concept Index): Added to make manual searchable via
+       `Info-index'.
+       (Version Control): Add cindex entry.
+
+2003-05-24  Kai Gro\e,A_\e(Bjohann  <kai.grossjohann@gmx.net>
+
+       * trampver.texi: Version 2.0.34 released.
+
+2003-05-03  Glenn Morris  <gmorris@ast.cam.ac.uk>
+
+       * faq.texi: Improve previous changes.
+
+2003-05-02  Glenn Morris  <gmorris@ast.cam.ac.uk>
+
+       * faq.texi: Update copyright and maintenance details.
+       Update some package URLs, versions, and maintainers.
+       Remove many references to the Emacs Lisp Archive.
+
+2003-04-23  Simon Josefsson  <jas@extundo.com>
+
+       * smtpmail.texi: Fix license (the invariant sections mentioned has
+       never been part of the smtp manual).  Align info dir entry with
+       other emacs packages.
+
+2003-04-08  Michael Albinus  <Michael.Albinus@alcatel.de>
+
+       * tramp.texi: Version 2.0.33 released.
+       Remove installation chapter.  Remove XEmacs specifics.
+
+2003-03-29  Richard M. Stallman  <rms@gnu.org>
+
+       * tramp.texi (Top): Undo the previous renaming.
+       (emacs-other-name, emacs-other-dir, emacs-other-file-name): Delete.
+
+2003-03-29  Kai Gro\e,A_\e(Bjohann  <kai.grossjohann@gmx.net>
+
+       * Makefile.in (../info/tramp): Compile Emacs, instead of XEmacs,
+       version of manual.
+
+       * tramp.texi (Auto-save and Backup): New node.
+
+2003-03-29  Michael Albinus  <Michael.Albinus@alcatel.de>
+
+       * tramp.texi (Top): Include trampver.texi.  Rename "Emacs" to "GNU
+       Emacs" in order to have better differentiation to "XEmacs".
+       `emacs-other-name', `emacs-other-dir' and `emacs-other-file-name'
+       are new macros in order to point to the other Emacs flavor where
+       appropriate.  In info case, point to node `Installation' in order
+       to explain how to generate the other way.  In html case, make a
+       link to the other html file.
+       (Obtaining TRAMP): Added a paragraph saying to perform `autoconf'
+       after CVS checkout/update.
+       (Installation): Completely rewritten.
+       (Installation parameters, Load paths): New sections under
+       `Installation'.
+
+2003-02-28  Kai Gro\e,A_\e(Bjohann  <kai.grossjohann@uni-duisburg.de>
+
+       * tramp.texi: Version 2.0.30 released.
+       Replace word "path" with "localname" where used as a component of
+       a Tramp file name.
+
+2003-02-28  Michael Albinus  <Michael.Albinus@alcatel.de>
+
+       * tramp.texi (Frequently Asked Questions): `tramp-chunksize'
+       introduced.
+       (Installation): Explain what to do if files from the tramp/contrib
+       directory are needed.
+
+2003-02-23  Alex Schroeder  <alex@emacswiki.org>
+
+       * smtpmail.texi (How Mail Works): New.
+
+2003-02-22  Alex Schroeder  <alex@emacswiki.org>
+
+       * smtpmail.texi: New file.
+
+       * Makefile.in: Build SMTP manual.
+
+2003-02-05  Kai Gro\e,A_\e(Bjohann  <kai.grossjohann@uni-duisburg.de>
+
+       * tramp.texi: Version 2.0.29 released.
+       (Installation): In Emacs, use M-x texinfo-format-buffer RET, not
+       M-x makeinfo-buffer RET.  Reported by gebser@ameritech.net.
+
+2003-02-01  Michael Albinus  <Michael.Albinus@alcatel.de>
+
+       * tramp.texi (Frequently Asked Questions): Explain a workaround if
+       another package loads accidently Ange-FTP.
+
+2003-01-24  Michael Albinus  <Michael.Albinus@alcatel.de>
+
+       * tramp.texi (Customizing Completion): Add function
+       `tramp-parse-sconfig'.  Change example of
+       `tramp-set-completion-function', because parsing of ssh config
+       files looks more natural.
+
+2003-01-15  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus.texi: Do not use `path' in several locations.
+
+2002-12-26  Kai Gro\e,A_\e(Bjohann  <kai.grossjohann@uni-duisburg.de>
+
+       * tramp.texi (External transfer methods): New method `smb'.  From
+       Michael Albinus.
+
+2002-11-05  Karl Berry  <karl@gnu.org>
+
+       * info.texi (Info-fontify): Reorder face list to avoid bad line
+       breaks.
+
+2002-10-06  Kai Gro\e,A_\e(Bjohann  <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+
+       * tramp.texi: Move @copying to standard place.  Use
+       @insertcopying.
+
+2002-10-02  Karl Berry  <karl@gnu.org>
+
+       * (ada-mode.texi autotype.texi calc.texi cc-mode.texi cl.texi
+       dired-x.texi ebrowse.texi ediff.texi emacs-mime.texi
+       eshell.texi eudc.texi faq.texi forms.texi idlwave.texi info.texi
+       message.texi mh-e.texi pcl-cvs.texi reftex.texi sc.texi ses.texi
+       speedbar.texi vip.texi viper.texi widget.texi woman.texi):
+       Per rms, update all manuals to use @copying instead of @ifinfo.
+       Also use @ifnottex instead of @ifinfo around the top node, where
+       needed for the sake of the HTML output.
+       (The Gnus manual is not fixed since it's not clear to me how it
+       works; and the Tramp manual already uses @copying, although in an
+       unusual way.  All others were changed.)
+
+2002-09-10  Jonathan Yavner  <jyavner@engineer.com>
+
+       * Makefile.in (INFO_TARGETS, DVI_TARGETS): Add SES.
+       (../info/ses, ses.dvi): New targets.
+       * ses.texi: New file.
+
+2002-09-06  Pavel Jan\e,Am\e(Bk  <Pavel@Janik.cz>
+
+       * texinfo.tex: Update to texinfo 4.2.
+
+2002-08-27  Carsten Dominik  <dominik@sand.science.uva.nl>
+
+       * reftex.texi: Update to RefTeX 4.19.
+
+2002-06-17  Kai Gro\e,A_\e(Bjohann  <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+
+       * Makefile.in (INFO_TARGETS, DVI_TARGETS): Add Tramp.
+       (../info/tramp, tramp.dvi): New targets.
+
+2002-01-04  Eli Zaretskii  <eliz@is.elta.co.il>
+
+       * Makefile.in (DVI_TARGETS): Add calc.dvi.
+       (calc.dvi): Uncomment.
+
+2001-11-07  Eli Zaretskii  <eliz@is.elta.co.il>
+
+       * Makefile.in (INFO_TARGETS): Add ../info/calc.
+       (../info/calc): New target.
+
+2001-10-20  Gerd Moellmann  <gerd@gnu.org>
+
+       * (Version 21.1 released.)
+
+2001-10-05  Gerd Moellmann  <gerd@gnu.org>
+
+       * Branch for 21.1.
+
+2001-04-14  Eli Zaretskii  <eliz@is.elta.co.il>
+
+       * Makefile.in (../info/info): Use an explicit -o switch to
+       makeinfo.
+
+2001-03-05  Gerd Moellmann  <gerd@gnu.org>
+
+       * Makefile.in (mostlyclean, maintainer-clean): Delete more files.
+
+2000-12-20  Eli Zaretskii  <eliz@is.elta.co.il>
+
+       * Makefile.in (../info/idlwave): Use --no-split.
+
+2000-12-14  Dave Love  <fx@gnu.org>
+
+       * Makefile.in (mostlyclean): Remove gnustmp.*
+       (gnus.dvi): Change rule to remove @latex stuff.
+
+2000-10-19  Eric M. Ludlam  <zappo@ultranet.com>
+
+       * Makefile.in (Speedbar): Add build targets for speedbar.texi.
+
+2000-10-13  John Wiegley  <johnw@gnu.org>
+
+       * Makefile.in: Add build targets for eshell.texi.
+
+2000-09-25  Gerd Moellmann  <gerd@gnu.org>
+
+       * Makefile.in: Remove/comment speedbar stuff.
+
+2000-09-22  Dave Love  <fx@gnu.org>
+
+       * Makefile.in: Add emacs-mime.
+
+2000-08-08  Eli Zaretskii  <eliz@is.elta.co.il>
+
+       * Makefile.in (INFO_TARGETS): Add ../info/woman.
+       (DVI_TARGETS): Add woman.dvi.
+       (../info/woman, woman.dvi): New targets.
+
+2000-05-31  Stefan Monnier  <monnier@cs.yale.edu>
+
+       * .cvsignore (*.tmp): New entry.  Seems to be used for @macro.
+
+       * pcl-cvs.texi: New file.
+       * Makefile.in (INFO_TARGETS, DVI_TARGETS: Add pcl-cvs.
+       (../info/pcl-cvs, pcl-cvs.dvi): New targets.
+
+2000-05-11  Gerd Moellmann  <gerd@gnu.org>
+
+       * Makefile.in (INFO_TARGETS): Add info/ebrowse.
+       (../info/ebrowse, ebrowse.dvi): New targets.
+
+2000-01-13  Gerd Moellmann  <gerd@gnu.org>
+
+       * Makefile.in (INFO_TARGETS): Add eudc.
+       (DVI_TARGETS): Add eudc.dvi.
+       (../info/eudc, eudc.dvi): New targets.
+
+2000-01-05  Eli Zaretskii  <eliz@is.elta.co.il>
+
+       * Makefile.in (INFO_TARGETS): Rename emacs-faq to efaq (for
+       compatibility with 8+3 filesystems).
+       (../info/efaq): Rename from emacs-faq.
+
+2000-01-03  Eli Zaretskii  <eliz@is.elta.co.il>
+
+       * Makefile.in (INFO_TARGETS, DVI_TARGETS): Add idlwave.
+       (../info/idlwave, idlwave.dvi): New targets.
+
+1999-10-23  Dave Love  <fx@gnu.org>
+
+       * Makefile.in: Use autotype.texi.
+
+1999-10-12  Stefan Monnier  <monnier@cs.yale.edu>
+
+       * Makefile.in (faq): Use ../info/emacs-faq.info (as specified in the
+       faq.texi file) rather than ../info/faq.
+
+1999-10-07  Gerd Moellmann  <gerd@gnu.org>
+
+       * Makefile.in (INFO_TARGETS, DVI_TARGETS): Add ada-mode.
+       (../info/ada-mode, ada-mode.dvi): New targets.
+
+1999-09-01  Dave Love  <fx@gnu.org>
+
+       * Makefile.in: Add faq.
+
+1999-07-12  Richard Stallman  <rms@gnu.org>
+
+       * Version 20.4 released.
+
+1998-08-19  Richard Stallman  <rms@psilocin.ai.mit.edu>
+
+       * Version 20.3 released.
+
+1998-04-06  Andreas Schwab  <schwab@gnu.org>
+
+       * Makefile.in (ENVADD): Enviroment vars to pass to texi2dvi.  Use
+       it in dvi targets.
+       (../etc/GNU): Change to $(srcdir) first.
+
+1998-03-11  Carsten Dominik  <cd@delysid.gnu.org>
+
+       * reftex.texi: Update for RefTeX version 3.22.
+
+1998-02-08  Richard Stallman  <rms@psilocin.gnu.org>
+
+       * Makefile.in (reftex.dvi, ../info/reftex): New targets.
+       (INFO_TARGETS, DVI_TARGETS): Add the new targets.
+
+1997-09-23  Paul Eggert  <eggert@twinsun.com>
+
+       * Makefile.in: Merge changes mistakenly made to `Makefile'.
+       (../info/viper, viper.dvi): Remove dependency on viper-cmd.texi.
+
+1997-09-19  Richard Stallman  <rms@psilocin.gnu.ai.mit.edu>
+
+       * Version 20.2 released.
+
+1997-09-15  Richard Stallman  <rms@psilocin.gnu.ai.mit.edu>
+
+       * Version 20.1 released.
+
+1997-07-10  Richard Stallman  <rms@psilocin.gnu.ai.mit.edu>
+
+       * Makefile (../info/viper, viper.dvi): Delete viper-cmd.texi dep.
+
+1996-08-11  Richard Stallman  <rms@psilocin.gnu.ai.mit.edu>
+
+       * Version 19.33 released.
+
+1996-07-31  Richard Stallman  <rms@psilocin.gnu.ai.mit.edu>
+
+       * Version 19.32 released.
+
+1996-06-27  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * Makefile.in: Add rules for the Message manual.
+
+1996-06-26  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * gnus.texi: New version.
+
+       * message.texi: New manual.
+
+1996-06-20  Richard Stallman  <rms@psilocin.gnu.ai.mit.edu>
+
+       * Makefile.in (All info targets): cd $(srcdir) to do the work.
+
+1996-06-19  Richard Stallman  <rms@psilocin.gnu.ai.mit.edu>
+
+       * Makefile.in (All info targets): Specify $(srcdir) in input files.
+       Specify -I option.
+       (All dvi targets): Set the TEXINPUTS variable.
+
+1996-05-25  Karl Heuer  <kwzh@gnu.ai.mit.edu>
+
+       * Version 19.31 released.
+
+1996-01-07  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
+
+       * Makefile.in (../info/ccmode): Rename from ../info/cc-mode.
+       (INFO_TARGETS): Use new name.  This avoids name conflict on MSDOS.
+
+1995-11-29  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+
+       * Makefile.in (../info/cc-mode, cc-mode.dvi): New targets.
+       (INFO_TARGETS): Add ../info/cc-mode.
+       (DVI_TARGETS): Add cc-mode.dvi.
+
+1996-05-25  Karl Heuer  <kwzh@gnu.ai.mit.edu>
+
+       * Version 19.31 released.
+
+1995-11-24  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+
+       * Version 19.30 released.
+
+1995-11-04  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * gnus.texi: New file.
+
+1995-11-04  Erik Naggum  <erik@naggum.no>
+
+       * gnus.texi: File deleted.
+
+1995-11-02  Stephen Gildea  <gildea@stop.mail-abuse.org>
+
+       * mh-e.texi: "Function Index" -> "Command Index" to work with
+       Emacs 19.30 C-h C-k support of separately-documented commands.
+
+1995-06-26  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+
+       * Makefile.in (../info/ediff, ediff.dvi): New targets.
+       (INFO_TARGETS, DVI_TARGETS): Add those new targets.
+
+1995-04-24  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+
+       * Makefile.in (INFO_TARGETS, DVI_TARGETS): Add viper targets.
+       (../info/viper, viper.dvi): New targets.
+
+1995-04-20  Kevin Rodgers  <kevinr@ihs.com>
+
+       * dired-x.texi (Installation): Change the example to set
+       buffer-local variables like dired-omit-files-p in
+       dired-mode-hook.
+
+1995-04-17  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+
+       * Makefile.in (INFO_TARGETS, DVI_TARGETS): Add mh-e targets.
+       (../info/mh-e, mh-e.dvi): New targets.
+
+1995-02-07  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+
+       * Makefile.in (maintainer-clean): Rename from realclean.
+
+1994-11-23  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+
+       * Makefile.in: New file.
+       * Makefile: File deleted.
+
+1994-11-19  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+
+       * Makefile (TEXINDEX_OBJS): Variable deleted.
+       (texindex, texindex.o, getopt.o): Rules deleted.
+       All deps on texindex deleted.
+       (distclean): Don't delete texindex.
+       (mostlyclean): Don't delete *.o.
+       * texindex.c, getopt.c: Files deleted.
+
+1994-09-07  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+
+       * Version 19.26 released.
+
+1994-05-30  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+
+       * Version 19.25 released.
+
+1994-05-23  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+
+       * Version 19.24 released.
+
+1994-05-16  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+
+       * Version 19.23 released.
+
+1994-04-17  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+
+       * Makefile: Delete spurious tab.
+
+1994-02-16  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+
+       * Makefile (.SUFFIXES): New rule.
+
+1994-01-15  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+
+       * Makefile (dired-x.dvi, ../info/dired-x): New targets.
+       (INFO_TARGETS, DVI_TARGETS): Add the new targets.
+
+1994-01-08  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+
+       * Makefile (../info/sc): Rename from sc.info.
+       (../info/cl): Likewise.
+       (INFO_TARGETS): Use new names.
+
+1993-12-04  Richard Stallman  (rms@srarc2)
+
+       * getopt.c: New file.
+       * Makefile (TEXINDEX_OBJS): Use getopt.o in this dir, not ../lib-src.
+       (getopt.o): New rule.
+       (dvi): Don't depend on texindex.
+       (cl.dvi, forms.dvi, vip.dvi, gnus.dvi, sc.dvi):
+       Depend on texindex.
+
+1993-12-03  Richard Stallman  (rms@srarc2)
+
+       * Makefile (../info/sc.info): Rename from ../info/sc.
+       (TEXI2DVI): New variable.
+       (cl.dvi forms.dvi, sc.dvi, vip.dvi, gnus.dvi, info.dvi):
+       Add explicit commands.
+       (TEXINDEX_OBJS): Delete duplicate getopt.o.
+
+1993-11-27  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+
+       * Version 19.22 released.
+
+1993-11-18  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+
+       * Makefile (TEXINDEX_OBJS): Delete spurious period.
+
+1993-11-16  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+
+       * Version 19.21 released.
+
+1993-11-15  Paul Eggert  (eggert@twinsun.com)
+
+       * man/Makefile (../info/cl.info): Rename from ../info/cl.
+
+1993-11-15  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+
+       * Makefile (../etc/GNU): New target.
+       (EMACSSOURCES): Add gnu1.texi.
+
+1993-11-14  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+
+       * Makefile (realclean): Don't delete the Info files.
+
+1993-10-25  Brian Fox  (bfox@albert.gnu.ai.mit.edu)
+
+       * forms.texi: Fix forms.texi so that it will format correctly.
+       Add missing `@end iftex', fix bad reference.
+
+       * info.texi, info-stn.texi: New files implement texinfo version of
+       `info' file.
+
+1993-10-20  Brian Fox  (bfox@ai.mit.edu)
+
+       * Makefile: Fix targets for texindex, new info.texi files.
+       * info-stnd.texi: New file implements info for standalone info
+       reader.
+       * info.texi: Update to include recent changes to "../info/info".
+       New source file for ../info/info; includes info-stnd.texi.
+
+       * texindex.c: Include "../src/config.h" if building in emacs.
+
+       * Makefile: Change all files to FILENAME.texi, force all targets
+       to be FILENAME, not FILENAME.info.  This changes sc.texinfo,
+       vip.texinfo, forms.texinfo, cl.texinfo.
+       Add target to build texindex.c, defining `emacs'.
+
+       * forms.texi: Install new file to match version 2.3 of forms.el.
+
+1993-08-14  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+
+       * Version 19.19 released.
+
+1993-08-10  Simon Leinen  (simon@lia.di.epfl.ch)
+
+       * sc.texinfo: Fix info file name.
+
+       * Makefile (info): Add gnus and sc.
+       (dvi): Add gnus.dvi and sc.dvi.
+       (../info/sc, sc.dvi): New targets.
+
+1993-08-08  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+
+       * Version 19.18 released.
+
+1993-07-20  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+
+       * Makefile: Fix source file names of the separate manuals.
+       (gnus.dvi, ../info/gnus): New targets.
+
+1993-07-18  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+
+       * Version 19.17 released.
+
+1993-07-10  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+
+       * split-man: Fix typos in last change.
+
+1993-07-06  Jim Blandy  (jimb@geech.gnu.ai.mit.edu)
+
+       * Version 19.16 released.
+
+1993-06-19  Jim Blandy  (jimb@wookumz.gnu.ai.mit.edu)
+
+       * version 19.15 released.
+
+1993-06-18  Jim Blandy  (jimb@geech.gnu.ai.mit.edu)
+
+       * Makefile (distclean): It's rm, not rf.
+
+1993-06-17  Jim Blandy  (jimb@wookumz.gnu.ai.mit.edu)
+
+       * Version 19.14 released.
+
+1993-06-16  Jim Blandy  (jimb@wookumz.gnu.ai.mit.edu)
+
+       * Makefile: New file.
+
+1993-06-08  Jim Blandy  (jimb@wookumz.gnu.ai.mit.edu)
+
+       * Version 19.13 released.
+
+1993-05-27  Jim Blandy  (jimb@geech.gnu.ai.mit.edu)
+
+       * Version 19.9 released.
+
+1993-05-25  Jim Blandy  (jimb@wookumz.gnu.ai.mit.edu)
+
+       * Version 19.8 released.
+
+1993-05-22  Jim Blandy  (jimb@geech.gnu.ai.mit.edu)
+
+       * Version 19.7 released.
+
+1990-08-30  David Lawrence  (tale@pogo.ai.mit.edu)
+
+       * gnus.texinfo: New file.  Removed installation instructions.
+
+1990-05-25  Richard Stallman  (rms@sugar-bombs.ai.mit.edu)
+
+       * texindex.tex: If USG, include sys/types.h and sys/fcntl.h.
+
+1989-01-17  Robert J. Chassell  (bob@rice-chex.ai.mit.edu)
+
+       * texinfo.tex: Change spelling of `\sc' font to `\smallcaps' and
+       then define `\sc' as the command for smallcaps in Texinfo.  This
+       means that the @sc command will produce small caps.  bfox has
+       made the corresponding change to makeinfo and texinfm.el.
+
+1988-08-16  Robert J. Chassell  (bob@frosted-flakes.ai.mit.edu)
+
+       * vip.texinfo: Remove menu entry Adding Lisp Code in node
+       Customization since the menu entry did not point to anything.
+       Also add an @finalout command to remove overfull hboxes from the
+       printed output.
+
+       * cl.texinfo: Add @bye, \input line and @settitle to file.
+       This file is clearly intended to be a chapter of some other work,
+       but the other work does not yet exist.
+
+1988-07-25  Robert J. Chassell  (bob@frosted-flakes.ai.mit.edu)
+
+       * texinfo.texinfo: Three typos corrected.
+
+;; Local Variables:
+;; coding: iso-2022-7bit
+;; fill-column: 79
+;; add-log-time-zone-rule: t
+;; End:
+
+    Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002,
+      2003, 2004, 2005, 2006, 2007 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, 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; see the file COPYING.  If not, write to the
+  Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+  Boston, MA 02110-1301, USA.
+
+;; arch-tag: 08b2903e-900c-4c72-a4a9-e76416a80803
similarity index 57%
rename from man/Makefile.in
rename to doc/misc/Makefile.in
index 00088b74b5140a8f5b3c0e708d5684436a4d1e44..65caeb77ecbf40ace20b3c775c9b40b31708f2bf 100644 (file)
@@ -1,4 +1,4 @@
-#### Makefile for the Emacs Manual and other documentation.
+#### Makefile for documentation other than the Emacs manual.
 
 # Copyright (C) 1994, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
 #   2004, 2005, 2006, 2007 Free Software Foundation, Inc.
@@ -20,7 +20,8 @@
 # the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 # Boston, MA 02110-1301, USA.
 
-# Where to find the source code.  $(srcdir) will be the man
+
+# Where to find the source code.  $(srcdir) will be the man-aux
 # subdirectory of the source tree.  This is
 # set by the configure script's `--srcdir' option.
 srcdir=@srcdir@
@@ -29,177 +30,210 @@ top_srcdir=@top_srcdir@
 # Tell make where to find source files; this is needed for the makefiles.
 VPATH=@srcdir@
 
+## Where the output files go.
+## Note that the setfilename command in the .texi files assumes this.
+infodir=../../info
 
 # The makeinfo program is part of the Texinfo distribution.
 # Use --force so that it generates output even if there are errors.
 MAKEINFO = makeinfo --force
-INFO_TARGETS = ../info/emacs ../info/ccmode ../info/cl \
-               ../info/dired-x ../info/ediff ../info/forms ../info/gnus \
-               ../info/message ../info/sieve ../info/pgg ../info/emacs-mime \
-               ../info/info ../info/mh-e ../info/reftex \
-               ../info/sc ../info/vip ../info/viper ../info/widget \
-               ../info/efaq ../info/ada-mode ../info/autotype ../info/calc \
-               ../info/idlwave ../info/eudc ../info/ebrowse ../info/pcl-cvs \
-               ../info/woman ../info/eshell ../info/org ../info/url \
-               ../info/speedbar ../info/tramp ../info/ses ../info/smtpmail \
-               ../info/flymake ../info/newsticker ../info/rcirc ../info/erc
-DVI_TARGETS =  emacs.dvi calc.dvi cc-mode.dvi cl.dvi dired-x.dvi \
-                ediff.dvi forms.dvi gnus.dvi message.dvi emacs-mime.dvi \
-                 gnus.dvi message.dvi sieve.dvi pgg.dvi mh-e.dvi \
-                reftex.dvi sc.dvi vip.dvi viper.dvi widget.dvi faq.dvi \
-                ada-mode.dvi autotype.dvi idlwave.dvi eudc.dvi ebrowse.dvi \
-                pcl-cvs.dvi woman.dvi eshell.dvi org.dvi url.dvi \
-                speedbar.dvi tramp.dvi ses.dvi smtpmail.dvi flymake.dvi \
-                 newsticker.dvi emacs-xtra.dvi rcirc.dvi erc.dvi
-INFOSOURCES = info.texi
+
+INFO_TARGETS = \
+       $(infodir)/ada-mode \
+       $(infodir)/autotype \
+       $(infodir)/calc \
+       $(infodir)/ccmode \
+       $(infodir)/cl \
+       $(infodir)/dired-x \
+       $(infodir)/ebrowse \
+       $(infodir)/ediff \
+       $(infodir)/emacs-mime \
+       $(infodir)/erc \
+       $(infodir)/eshell \
+       $(infodir)/eudc \
+       $(infodir)/efaq \
+       $(infodir)/flymake \
+       $(infodir)/forms \
+       $(infodir)/gnus \
+       $(infodir)/idlwave \
+       $(infodir)/info \
+       $(infodir)/message \
+       $(infodir)/mh-e \
+       $(infodir)/newsticker \
+       $(infodir)/org \
+       $(infodir)/pcl-cvs \
+       $(infodir)/pgg \
+       $(infodir)/rcirc \
+       $(infodir)/reftex \
+       $(infodir)/sc \
+       $(infodir)/ses \
+       $(infodir)/sieve \
+       $(infodir)/smtpmail \
+       $(infodir)/speedbar \
+       $(infodir)/tramp \
+       $(infodir)/url \
+       $(infodir)/vip \
+       $(infodir)/viper \
+       $(infodir)/widget \
+       $(infodir)/woman
+
+DVI_TARGETS = \
+       ada-mode.dvi \
+       autotype.dvi \
+       calc.dvi \
+       cc-mode.dvi \
+       cl.dvi \
+       dired-x.dvi \
+       ebrowse.dvi \
+       ediff.dvi \
+       emacs-mime.dvi \
+       erc.dvi \
+       eshell.dvi \
+       eudc.dvi \
+       faq.dvi \
+       flymake.dvi \
+       forms.dvi \
+       gnus.dvi \
+       idlwave.dvi \
+       info.dvi \
+       message.dvi \
+       mh-e.dvi \
+       newsticker.dvi \
+       org.dvi \
+       pcl-cvs.dvi \
+       pgg.dvi \
+       rcirc.dvi \
+       reftex.dvi \
+       sc.dvi \
+       ses.dvi \
+       sieve.dvi \
+       smtpmail.dvi \
+       speedbar.dvi \
+       tramp.dvi \
+       url.dvi \
+       vip.dvi \
+       viper.dvi \
+       widget.dvi \
+       woman.dvi
+
+
+TEXI2DVI = texi2dvi
 
 # The following rule does not work with all versions of `make'.
 .SUFFIXES: .texi .dvi
 .texi.dvi:
-       texi2dvi $<
+       $(TEXI2DVI) $<
 
-TEXI2DVI = texi2dvi
 ENVADD = TEXINPUTS="$(srcdir):$(TEXINPUTS)" MAKEINFO="$(MAKEINFO) -I$(srcdir)"
 
-EMACS_XTRA=\
-       $(srcdir)/arevert-xtra.texi \
-       $(srcdir)/cal-xtra.texi \
-       $(srcdir)/dired-xtra.texi \
-       $(srcdir)/picture-xtra.texi \
-       $(srcdir)/emerge-xtra.texi \
-       $(srcdir)/vc-xtra.texi \
-       $(srcdir)/vc1-xtra.texi \
-       $(srcdir)/vc2-xtra.texi \
-       $(srcdir)/fortran-xtra.texi \
-       $(srcdir)/msdog-xtra.texi
-
-EMACSSOURCES= \
-       ${srcdir}/emacs.texi \
-       ${srcdir}/doclicense.texi \
-       ${srcdir}/gpl.texi \
-       ${srcdir}/screen.texi \
-       ${srcdir}/commands.texi \
-       ${srcdir}/entering.texi \
-       ${srcdir}/basic.texi \
-       ${srcdir}/mini.texi \
-       ${srcdir}/m-x.texi \
-       ${srcdir}/help.texi \
-       ${srcdir}/mark.texi \
-       ${srcdir}/killing.texi \
-       ${srcdir}/regs.texi \
-       ${srcdir}/display.texi \
-       ${srcdir}/search.texi \
-       ${srcdir}/fixit.texi \
-       ${srcdir}/files.texi \
-       ${srcdir}/buffers.texi \
-       ${srcdir}/windows.texi \
-       ${srcdir}/frames.texi \
-       ${srcdir}/mule.texi \
-       ${srcdir}/major.texi \
-       ${srcdir}/indent.texi \
-       ${srcdir}/text.texi \
-       ${srcdir}/programs.texi \
-       ${srcdir}/building.texi \
-       ${srcdir}/maintaining.texi \
-       ${srcdir}/abbrevs.texi \
-       ${srcdir}/sending.texi \
-       ${srcdir}/rmail.texi \
-       ${srcdir}/dired.texi \
-       ${srcdir}/calendar.texi \
-       ${srcdir}/misc.texi \
-       ${srcdir}/custom.texi \
-       ${srcdir}/trouble.texi \
-       ${srcdir}/cmdargs.texi \
-       ${srcdir}/xresources.texi \
-       ${srcdir}/anti.texi \
-       ${srcdir}/macos.texi \
-       ${srcdir}/msdog.texi \
-       ${srcdir}/gnu.texi \
-       ${srcdir}/glossary.texi \
-       ${srcdir}/ack.texi \
-       ${srcdir}/kmacro.texi \
-       $(EMACS_XTRA)
-
-info: $(top_srcdir)/info $(INFO_TARGETS)
-
-$(top_srcdir)/info:
+
+info: $(infodir) $(INFO_TARGETS)
+
+$(infodir):
        mkdir $@
 
 dvi: $(DVI_TARGETS)
 
+
 # Note that all the Info targets build the Info files
 # in srcdir.  There is no provision for Info files
 # to exist in the build directory.
 # In a distribution of Emacs, the Info files should be up to date.
 
-# The following target uses an explicit -o switch to work around
-# the @setfilename directive in info.texi, which is required for
-# the Texinfo distribution.
-
-../info/info: ${INFOSOURCES}
-       cd $(srcdir); $(MAKEINFO) --no-split info.texi -o $@
-
-info.dvi: ${INFOSOURCES}
-       $(ENVADD) $(TEXI2DVI) ${srcdir}/info.texi
-
-../info/emacs: ${EMACSSOURCES}
-       cd $(srcdir); $(MAKEINFO) emacs.texi
+## "short" target names for convenience, to just rebuild one manual.
+ada-mode : $(infodir)/ada-mode
+$(infodir)/ada-mode: ada-mode.texi
+       cd $(srcdir); $(MAKEINFO) ada-mode.texi
+ada-mode.dvi: ada-mode.texi
+       $(ENVADD) $(TEXI2DVI) ${srcdir}/ada-mode.texi
 
-emacs.dvi: ${EMACSSOURCES}
-       $(ENVADD) $(TEXI2DVI) ${srcdir}/emacs.texi
+autotype : $(infodir)/autotype
+$(infodir)/autotype: autotype.texi
+       cd $(srcdir); $(MAKEINFO) autotype.texi
+autotype.dvi: autotype.texi
+       $(ENVADD) $(TEXI2DVI) ${srcdir}/autotype.texi
 
-# This target is here so you could easily get the list of the *.texi
-# files which belong to the Emacs manual (as opposed to the separate
-# manuals for CL, CC Mode, Ebrowse, etc.).  With this target, you can
-# say things like "grep foo `make emacsman`".
-emacsman:
-       @echo $(EMACSSOURCES)
+calc : $(infodir)/calc
+$(infodir)/calc: calc.texi
+       cd $(srcdir); $(MAKEINFO) calc.texi
+calc.dvi: calc.texi
+       $(ENVADD) $(TEXI2DVI) ${srcdir}/calc.texi
 
-../info/ccmode: cc-mode.texi
+ccmode : $(infodir)/ccmode
+$(infodir)/ccmode: cc-mode.texi
        cd $(srcdir); $(MAKEINFO) cc-mode.texi
 cc-mode.dvi: cc-mode.texi
        $(ENVADD) $(TEXI2DVI) ${srcdir}/cc-mode.texi
 
-../info/ada-mode: ada-mode.texi
-       cd $(srcdir); $(MAKEINFO) ada-mode.texi
-ada-mode.dvi: ada-mode.texi
-       $(ENVADD) $(TEXI2DVI) ${srcdir}/ada-mode.texi
-
-../info/pcl-cvs: pcl-cvs.texi
-       cd $(srcdir); $(MAKEINFO) pcl-cvs.texi
-pcl-cvs.dvi: pcl-cvs.texi
-       $(ENVADD) $(TEXI2DVI) ${srcdir}/pcl-cvs.texi
-
-../info/eshell: eshell.texi
-       cd $(srcdir); $(MAKEINFO) eshell.texi
-eshell.dvi: eshell.texi
-       $(ENVADD) $(TEXI2DVI) ${srcdir}/eshell.texi
-
-../info/cl: cl.texi
+cl : $(infodir)/cl
+$(infodir)/cl: cl.texi
        cd $(srcdir); $(MAKEINFO) cl.texi
 cl.dvi: cl.texi
        $(ENVADD) $(TEXI2DVI) ${srcdir}/cl.texi
 
-../info/dired-x: dired-x.texi
+dired-x : $(infodir)/dired-x
+$(infodir)/dired-x: dired-x.texi
        cd $(srcdir); $(MAKEINFO) dired-x.texi
 dired-x.dvi: dired-x.texi
        $(ENVADD) $(TEXI2DVI) ${srcdir}/dired-x.texi
 
-../info/ediff: ediff.texi
+ebrowse : $(infodir)/ebrowse
+$(infodir)/ebrowse: ebrowse.texi
+       cd $(srcdir); $(MAKEINFO) ebrowse.texi
+ebrowse.dvi: ebrowse.texi
+       $(ENVADD) $(TEXI2DVI) ${srcdir}/ebrowse.texi
+
+ediff : $(infodir)/ediff
+$(infodir)/ediff: ediff.texi
        cd $(srcdir); $(MAKEINFO) ediff.texi
 ediff.dvi: ediff.texi
        $(ENVADD) $(TEXI2DVI) ${srcdir}/ediff.texi
 
-emacs-xtra.dvi: emacs-xtra.texi $(EMACS_XTRA)
-       $(ENVADD) $(TEXI2DVI) ${srcdir}/emacs-xtra.texi
+emacs-mime : $(infodir)/emacs-mime
+$(infodir)/emacs-mime: emacs-mime.texi
+       cd $(srcdir); $(MAKEINFO) --enable-encoding emacs-mime.texi
+emacs-mime.dvi: emacs-mime.texi
+       $(ENVADD) $(TEXI2DVI) ${srcdir}/emacs-mime.texi
+
+erc : $(infodir)/erc
+$(infodir)/erc: erc.texi
+       cd $(srcdir); $(MAKEINFO) erc.texi
+erc.dvi: erc.texi
+       $(ENVADD) $(TEXI2DVI) ${srcdir}/erc.texi
+
+eshell : $(infodir)/eshell
+$(infodir)/eshell: eshell.texi
+       cd $(srcdir); $(MAKEINFO) eshell.texi
+eshell.dvi: eshell.texi
+       $(ENVADD) $(TEXI2DVI) ${srcdir}/eshell.texi
 
-../info/forms: forms.texi
+eudc : $(infodir)/eudc
+$(infodir)/eudc: eudc.texi
+       cd $(srcdir); $(MAKEINFO) eudc.texi
+eudc.dvi: eudc.texi
+       $(ENVADD) $(TEXI2DVI) ${srcdir}/eudc.texi
+
+efaq : $(infodir)/efaq
+$(infodir)/efaq: faq.texi
+       cd $(srcdir); $(MAKEINFO) faq.texi
+faq.dvi: faq.texi
+       $(ENVADD) $(TEXI2DVI) ${srcdir}/faq.texi
+
+flymake : $(infodir)/flymake
+$(infodir)/flymake: flymake.texi
+       cd $(srcdir); $(MAKEINFO) flymake.texi
+flymake.dvi: flymake.texi
+       $(ENVADD) $(TEXI2DVI) ${srcdir}/flymake.texi
+
+forms : $(infodir)/forms
+$(infodir)/forms: forms.texi
        cd $(srcdir); $(MAKEINFO) forms.texi
 forms.dvi: forms.texi
        $(ENVADD) $(TEXI2DVI) ${srcdir}/forms.texi
 
 # gnus/message/emacs-mime/sieve/pgg are part of Gnus:
-../info/gnus: gnus.texi gnus-faq.texi
+gnus : $(infodir)/gnus
+$(infodir)/gnus: gnus.texi gnus-faq.texi
        cd $(srcdir); $(MAKEINFO) gnus.texi
 gnus.dvi: gnus.texi gnus-faq.texi
        sed -e '/@iflatex/,/@end iflatex/d' ${srcdir}/gnus.texi > gnustmp.texi
@@ -207,162 +241,151 @@ gnus.dvi: gnus.texi gnus-faq.texi
        cp gnustmp.dvi $*.dvi
        rm gnustmp.*
 
-../info/message: message.texi
+# This is produced with --no-split to avoid making files whose
+# names clash on DOS 8+3 filesystems
+idlwave : $(infodir)/idlwave
+$(infodir)/idlwave: idlwave.texi
+       cd $(srcdir); $(MAKEINFO) --no-split idlwave.texi
+idlwave.dvi: idlwave.texi
+       $(ENVADD) $(TEXI2DVI) ${srcdir}/idlwave.texi
+
+# The following target uses an explicit -o switch to work around
+# the @setfilename directive in info.texi, which is required for
+# the Texinfo distribution.
+###info : $(infodir)/info   # circular!
+$(infodir)/info: info.texi
+       cd $(srcdir); $(MAKEINFO) --no-split info.texi -o $@
+info.dvi: info.texi
+       $(ENVADD) $(TEXI2DVI) ${srcdir}/info.texi
+
+message : $(infodir)/message
+$(infodir)/message: message.texi
        cd $(srcdir); $(MAKEINFO) message.texi
 message.dvi: message.texi
        $(ENVADD) $(TEXI2DVI) ${srcdir}/message.texi
 
-../info/sieve: sieve.texi
-       cd $(srcdir); $(MAKEINFO) sieve.texi
-sieve.dvi: sieve.texi
-       $(ENVADD) $(TEXI2DVI) ${srcdir}/sieve.texi
+mh-e : $(infodir)/mh-e
+$(infodir)/mh-e: mh-e.texi
+       cd $(srcdir); $(MAKEINFO) mh-e.texi
+mh-e.dvi: mh-e.texi
+       $(ENVADD) $(TEXI2DVI) ${srcdir}/mh-e.texi
 
-../info/emacs-mime: emacs-mime.texi
-       cd $(srcdir); $(MAKEINFO) --enable-encoding emacs-mime.texi
-emacs-mime.dvi: emacs-mime.texi
-       $(ENVADD) $(TEXI2DVI) ${srcdir}/emacs-mime.texi
+newsticker : $(infodir)/newsticker
+$(infodir)/newsticker: newsticker.texi
+       cd $(srcdir); $(MAKEINFO) newsticker.texi
+newsticker.dvi: newsticker.texi
+       $(ENVADD) $(TEXI2DVI) ${srcdir}/newsticker.texi
+
+org : $(infodir)/org
+$(infodir)/org: org.texi
+       cd $(srcdir); $(MAKEINFO) org.texi
+org.dvi: org.texi
+       $(ENVADD) $(TEXI2DVI) ${srcdir}/org.texi
+
+pcl-cvs : $(infodir)/pcl-cvs
+$(infodir)/pcl-cvs: pcl-cvs.texi
+       cd $(srcdir); $(MAKEINFO) pcl-cvs.texi
+pcl-cvs.dvi: pcl-cvs.texi
+       $(ENVADD) $(TEXI2DVI) ${srcdir}/pcl-cvs.texi
 
-../info/pgg: pgg.texi
+pgg : $(infodir)/pgg
+$(infodir)/pgg: pgg.texi
        cd $(srcdir); $(MAKEINFO) pgg.texi
 pgg.dvi: pgg.texi
        $(ENVADD) $(TEXI2DVI) ${srcdir}/pgg.texi
 
-../info/mh-e: mh-e.texi
-       cd $(srcdir); $(MAKEINFO) mh-e.texi
-mh-e.dvi: mh-e.texi
-       $(ENVADD) $(TEXI2DVI) ${srcdir}/mh-e.texi
+rcirc : $(infodir)/rcirc
+$(infodir)/rcirc: rcirc.texi
+       cd $(srcdir); $(MAKEINFO) rcirc.texi
+rcirc.dvi: rcirc.texi
+       $(ENVADD) $(TEXI2DVI) ${srcdir}/rcirc.texi
 
-../info/reftex: reftex.texi
+reftex : $(infodir)/reftex
+$(infodir)/reftex: reftex.texi
        cd $(srcdir); $(MAKEINFO) reftex.texi
 reftex.dvi: reftex.texi
        $(ENVADD) $(TEXI2DVI) ${srcdir}/reftex.texi
 
-../info/sc: sc.texi
+sc : $(infodir)/sc
+$(infodir)/sc: sc.texi
        cd $(srcdir); $(MAKEINFO) sc.texi
 sc.dvi: sc.texi
        $(ENVADD) $(TEXI2DVI) ${srcdir}/sc.texi
 
-../info/vip: vip.texi
-       cd $(srcdir); $(MAKEINFO) vip.texi
-vip.dvi: vip.texi
-       $(ENVADD) $(TEXI2DVI) ${srcdir}/vip.texi
-
-../info/viper: viper.texi
-       cd $(srcdir); $(MAKEINFO) viper.texi
-viper.dvi: viper.texi
-       $(ENVADD) $(TEXI2DVI) ${srcdir}/viper.texi
-
-../info/widget: widget.texi
-       cd $(srcdir); $(MAKEINFO) widget.texi
-widget.dvi: widget.texi
-       $(ENVADD) $(TEXI2DVI) ${srcdir}/widget.texi
-
-../info/efaq: faq.texi
-       cd $(srcdir); $(MAKEINFO) faq.texi
-faq.dvi: faq.texi
-       $(ENVADD) $(TEXI2DVI) ${srcdir}/faq.texi
-
-../etc/GNU: gnu1.texi gnu.texi
-       cd $(srcdir) && makeinfo --no-headers -o ../etc/GNU gnu1.texi
-
-../info/autotype: autotype.texi
-       cd $(srcdir); $(MAKEINFO) autotype.texi
-autotype.dvi: autotype.texi
-       $(ENVADD) $(TEXI2DVI) ${srcdir}/autotype.texi
-
-../info/calc: calc.texi
-       cd $(srcdir); $(MAKEINFO) calc.texi
-
-calc.dvi: calc.texi
-       $(ENVADD) $(TEXI2DVI) ${srcdir}/calc.texi
-
-# This is produced with --no-split to avoid making files whose
-# names clash on DOS 8+3 filesystems
-../info/idlwave: idlwave.texi
-       cd $(srcdir); $(MAKEINFO) --no-split idlwave.texi
-idlwave.dvi: idlwave.texi
-       $(ENVADD) $(TEXI2DVI) ${srcdir}/idlwave.texi
-
-../info/eudc: eudc.texi
-       cd $(srcdir); $(MAKEINFO) eudc.texi
-eudc.dvi: eudc.texi
-       $(ENVADD) $(TEXI2DVI) ${srcdir}/eudc.texi
-
-../info/ebrowse: ebrowse.texi
-       cd $(srcdir); $(MAKEINFO) ebrowse.texi
-ebrowse.dvi: ebrowse.texi
-       $(ENVADD) $(TEXI2DVI) ${srcdir}/ebrowse.texi
-
-../info/woman: woman.texi
-       cd $(srcdir); $(MAKEINFO) woman.texi
-woman.dvi: woman.texi
-       $(ENVADD) $(TEXI2DVI) ${srcdir}/woman.texi
+ses : $(infodir)/ses
+$(infodir)/ses: ses.texi
+       cd $(srcdir); $(MAKEINFO) ses.texi
+ses.dvi: ses.texi
+       $(ENVADD) $(TEXI2DVI) ${srcdir}/ses.texi
 
-../info/org: org.texi
-       cd $(srcdir); $(MAKEINFO) org.texi
-org.dvi: org.texi
-       $(ENVADD) $(TEXI2DVI) ${srcdir}/org.texi
+sieve : $(infodir)/sieve
+$(infodir)/sieve: sieve.texi
+       cd $(srcdir); $(MAKEINFO) sieve.texi
+sieve.dvi: sieve.texi
+       $(ENVADD) $(TEXI2DVI) ${srcdir}/sieve.texi
 
-../info/url: url.texi
-       cd $(srcdir); $(MAKEINFO) url.texi
-url.dvi: url.texi
-       $(ENVADD) $(TEXI2DVI) ${srcdir}/url.texi
+smtpmail : $(infodir)/smtpmail
+$(infodir)/smtpmail: smtpmail.texi
+       cd $(srcdir); $(MAKEINFO) smtpmail.texi
+smtpmail.dvi: smtpmail.texi
+       $(ENVADD) $(TEXI2DVI) ${srcdir}/smtpmail.texi
 
-../info/speedbar: speedbar.texi
+speedbar : $(infodir)/speedbar
+$(infodir)/speedbar: speedbar.texi
        cd $(srcdir); $(MAKEINFO) speedbar.texi
 speedbar.dvi: speedbar.texi
        $(ENVADD) $(TEXI2DVI) ${srcdir}/speedbar.texi
 
-../info/tramp: tramp.texi trampver.texi
+tramp : $(infodir)/tramp
+$(infodir)/tramp: tramp.texi trampver.texi
        cd $(srcdir); $(MAKEINFO) -D emacs tramp.texi
 tramp.dvi: tramp.texi trampver.texi
        $(ENVADD) $(TEXI2DVI) ${srcdir}/tramp.texi
 
-../info/ses: ses.texi
-       cd $(srcdir); $(MAKEINFO) ses.texi
-ses.dvi: ses.texi
-       $(ENVADD) $(TEXI2DVI) ${srcdir}/ses.texi
+url : $(infodir)/url
+$(infodir)/url: url.texi
+       cd $(srcdir); $(MAKEINFO) url.texi
+url.dvi: url.texi
+       $(ENVADD) $(TEXI2DVI) ${srcdir}/url.texi
 
-../info/smtpmail: smtpmail.texi
-       cd $(srcdir); $(MAKEINFO) smtpmail.texi
-smtpmail.dvi: smtpmail.texi
-       $(ENVADD) $(TEXI2DVI) ${srcdir}/smtpmail.texi
+vip : $(infodir)/vip
+$(infodir)/vip: vip.texi
+       cd $(srcdir); $(MAKEINFO) vip.texi
+vip.dvi: vip.texi
+       $(ENVADD) $(TEXI2DVI) ${srcdir}/vip.texi
 
-../info/flymake: flymake.texi
-       cd $(srcdir); $(MAKEINFO) flymake.texi
-flymake.dvi: flymake.texi
-       $(ENVADD) $(TEXI2DVI) ${srcdir}/flymake.texi
+viper : $(infodir)/viper
+$(infodir)/viper: viper.texi
+       cd $(srcdir); $(MAKEINFO) viper.texi
+viper.dvi: viper.texi
+       $(ENVADD) $(TEXI2DVI) ${srcdir}/viper.texi
 
-../info/newsticker: newsticker.texi
-       cd $(srcdir); $(MAKEINFO) newsticker.texi
-newsticker.dvi: newsticker.texi
-       $(ENVADD) $(TEXI2DVI) ${srcdir}/newsticker.texi
+widget : $(infodir)/widget
+$(infodir)/widget: widget.texi
+       cd $(srcdir); $(MAKEINFO) widget.texi
+widget.dvi: widget.texi
+       $(ENVADD) $(TEXI2DVI) ${srcdir}/widget.texi
 
-../info/rcirc: rcirc.texi
-       cd $(srcdir); $(MAKEINFO) rcirc.texi
-rcirc.dvi: rcirc.texi
-       $(ENVADD) $(TEXI2DVI) ${srcdir}/rcirc.texi
+woman : $(infodir)/woman
+$(infodir)/woman: woman.texi
+       cd $(srcdir); $(MAKEINFO) woman.texi
+woman.dvi: woman.texi
+       $(ENVADD) $(TEXI2DVI) ${srcdir}/woman.texi
 
-../info/erc: erc.texi
-       cd $(srcdir); $(MAKEINFO) erc.texi
-erc.dvi: erc.texi
-       $(ENVADD) $(TEXI2DVI) ${srcdir}/erc.texi
 
 mostlyclean:
-       rm -f *.log *.cp *.fn *.ky *.pg *.vr core *.tp *.core gnustmp.*
+       rm -f *.log *.cp *.fn *.ky *.op *.ops *.pg *.vr core *.tp \
+       *.tps *.core gnustmp.*
+       rm -f *.aux *.cps *.fns *.kys *.pgs *.vrs *.toc
 
 clean: mostlyclean
        rm -f *.dvi
 
 distclean: clean
+#      rm -f Makefile
 
 maintainer-clean: distclean
-       rm -f *.aux *.cps *.fns *.kys *.pgs *.vrs *.toc
        for file in $(INFO_TARGETS); do rm -f $${file}*; done
 
 
-# Formerly this directory had texindex.c and getopt.c in it
-# and this makefile built them to make texindex.
-# That caused trouble because this is run entirely in the source directory.
-# Since we expect to get texi2dvi from elsewhere,
-# it is ok to expect texindex from elsewhere also.
+### Makefile ends here
similarity index 99%
rename from man/ada-mode.texi
rename to doc/misc/ada-mode.texi
index 241149803e8df802253d3dcac582cc926f4f9a0b..8f78d86934387d915f48763964c78837d4ee80ce 100644 (file)
@@ -1,5 +1,5 @@
 \input texinfo  @c -*-texinfo-*-
-@setfilename ../info/ada-mode
+@setfilename ../../info/ada-mode
 @settitle Ada Mode
 
 @copying
similarity index 99%
rename from man/autotype.texi
rename to doc/misc/autotype.texi
index 7b51f3115ac613c84b065dddabd2d535fd98e35d..e173ed7d1f84e91e92ac08018c7faf656e38b087 100644 (file)
@@ -3,7 +3,7 @@
 @c Copyright (C) 1994, 1995, 2001, 2002, 2003, 2004,
 @c   2005, 2006, 2007  Free Software Foundation, Inc.
 @c Author: Daniel.Pfeiffer@Informatik.START.dbp.de, fax (+49 69) 7588-2389
-@setfilename ../info/autotype
+@setfilename ../../info/autotype
 @c @node Autotypist, Picture, Abbrevs, Top
 @c @chapter Features for Automatic Typing
 @settitle Features for Automatic Typing
similarity index 99%
rename from man/calc.texi
rename to doc/misc/calc.texi
index 194d36d8f5f623a5282ad4a9f603f5ec8249afd8..4445910e43c05822dfe01f46fc0d5a133173f30e 100644 (file)
@@ -1,7 +1,7 @@
 \input texinfo                  @c -*-texinfo-*-
 @comment %**start of header (This is for running Texinfo on a region.)
 @c smallbook
-@setfilename ../info/calc
+@setfilename ../../info/calc
 @c [title]
 @settitle GNU Emacs Calc 2.1 Manual
 @setchapternewpage odd
@@ -1204,10 +1204,11 @@ Carl Witty, whose eagle eyes discovered many typographical and factual
 errors in the Calc manual; Tim Kay, who drove the development of
 Embedded mode; Ove Ewerlid, who made many suggestions relating to the
 algebra commands and contributed some code for polynomial operations;
-Randal Schwartz, who suggested the @code{calc-eval} function; Robert
-J. Chassell, who suggested the Calc Tutorial and exercises; and Juha
+Randal Schwartz, who suggested the @code{calc-eval} function; Juha
 Sarlin, who first worked out how to split Calc into quickly-loading
-parts.  Bob Weiner helped immensely with the Lucid Emacs port.
+parts; Bob Weiner, who helped immensely with the Lucid Emacs port; and
+Robert J. Chassell, who suggested the Calc Tutorial and exercises as
+well as many other things.  
 
 @cindex Bibliography
 @cindex Knuth, Art of Computer Programming
@@ -11053,17 +11054,44 @@ Please note that there is no ``year 0''; the day before
 days 0 and @mathit{-1} respectively in Calc's internal numbering scheme.
 
 @cindex Julian day counting
-Another day counting system in common use is, confusingly, also
-called ``Julian.''  It was invented in 1583 by Joseph Justus
-Scaliger, who named it in honor of his father Julius Caesar
-Scaliger.  For obscure reasons he chose to start his day
-numbering on Jan 1, 4713 BC at noon, which in Calc's scheme
+Another day counting system in common use is, confusingly, also called
+``Julian.''  The Julian day number is the numbers of days since 
+12:00 noon (GMT) on Jan 1, 4713 BC, which in Calc's scheme (in GMT) 
 is @mathit{-1721423.5} (recall that Calc starts at midnight instead
-of noon).  Thus to convert a Calc date code obtained by
-unpacking a date form into a Julian day number, simply add
-1721423.5.  The Julian code for @samp{6:00am Jan 9, 1991}
-is 2448265.75.  The built-in @kbd{t J} command performs
-this conversion for you.
+of noon).  Thus to convert a Calc date code obtained by unpacking a
+date form into a Julian day number, simply add 1721423.5 after
+compensating for the time zone difference.  The built-in @kbd{t J}
+command performs this conversion for you.
+
+The Julian day number is based on the Julian cycle, which was invented 
+in 1583 by Joseph Justus Scaliger.  Scaliger named it the Julian cycle
+since it is involves the Julian calendar, but some have suggested that
+Scaliger named it in honor of his father, Julius Caesar Scaliger.  The
+Julian cycle is based it on three other cycles: the indiction cycle,
+the Metonic cycle, and the solar cycle.  The indiction cycle is a 15
+year cycle originally used by the Romans for tax purposes but later
+used to date medieval documents.  The Metonic cycle is a 19 year
+cycle; 19 years is close to being a common multiple of a solar year
+and a lunar month, and so every 19 years the phases of the moon will
+occur on the same days of the year.  The solar cycle is a 28 year
+cycle; the Julian calendar repeats itself every 28 years.  The
+smallest time period which contains multiples of all three cycles is
+the least common multiple of 15 years, 19 years and 28 years, which
+(since they're pairwise relatively prime) is 
+@texline @math{15\times 19\times 28 = 7980} years.
+@infoline 15*19*28 = 7980 years.
+This is the length of a Julian cycle.  Working backwards, the previous
+year in which all three cycles began was 4713 BC, and so Scalinger
+chose that year as the beginning of a Julian cycle.  Since at the time
+there were no historical records from before 4713 BC, using this year
+as a starting point had the advantage of avoiding negative year
+numbers.  In 1849, the astronomer John Herschel (son of William
+Herschel) suggested using the number of days since the beginning of
+the Julian cycle as an astronomical dating system; this idea was taken
+up by other astronomers.  (At the time, noon was the start of the
+astronomical day.  Herschel originally suggested counting the days
+since Jan 1, 4713 BC at noon Alexandria time; this was later amended to
+noon GMT.)  Julian day numbering is largely used in astronomy.
 
 @cindex Unix time format
 The Unix operating system measures time as an integer number of
@@ -16656,9 +16684,9 @@ The last two arguments default to zero if omitted.
 @cindex Julian day counts, conversions
 The @kbd{t J} (@code{calc-julian}) [@code{julian}] command converts
 a date form into a Julian day count, which is the number of days
-since noon on Jan 1, 4713 BC.  A pure date is converted to an integer
-Julian count representing noon of that day.  A date/time form is
-converted to an exact floating-point Julian count, adjusted to
+since noon (GMT) on Jan 1, 4713 BC.  A pure date is converted to an
+integer Julian count representing noon of that day.  A date/time form 
+is converted to an exact floating-point Julian count, adjusted to
 interpret the date form in the current time zone but the Julian
 day count in Greenwich Mean Time.  A numeric prefix argument allows
 you to specify the time zone; @pxref{Time Zones}.  Use a prefix of
@@ -18599,7 +18627,7 @@ Given a positive numeric prefix argument @expr{M}, it produces a random
 integer @expr{N} in the range 
 @texline @math{0 \le N < M}.
 @infoline @expr{0 <= N < M}.  
-Each of the @expr{M} values appears with equal probability.
+Each possible value @expr{N} appears with equal probability.
 
 With no numeric prefix argument, the @kbd{k r} command takes its argument
 from the stack instead.  Once again, if this is a positive integer @expr{M}
@@ -27494,8 +27522,8 @@ If the value on the stack does not contain any units, @kbd{u c} will
 prompt first for the old units which this value should be considered
 to have, then for the new units.  Assuming the old and new units you
 give are consistent with each other, the result also will not contain
-any units.  For example, @kbd{@w{u c} cm @key{RET} in @key{RET}} converts the number
-2 on the stack to 5.08.
+any units.  For example, @kbd{@w{u c} cm @key{RET} in @key{RET}}
+converts the number 2 on the stack to 5.08.
 
 @kindex u b
 @pindex calc-base-units
@@ -27619,6 +27647,29 @@ column of the Units Table.
 @section Predefined Units
 
 @noindent
+The definitions of many units have changed over the years.  For example,
+the meter was originally defined in 1791 as one ten-millionth of the
+distance from the equator to the north pole.  In order to be more
+precise, the definition was adjusted several times, and now a meter is
+defined as the distance that light will travel in a vacuum in
+1/299792458 of a second; consequently, the speed of light in a
+vacuum is exactly 299792458 m/s.  Many other units have been
+redefined in terms of fundamental physical processes; a second, for
+example, is currently defined as 9192631770 periods of a certain
+radiation related to the cesium-133 atom.  The only SI unit that is not
+based on a fundamental physical process (although there are efforts to
+change this) is the kilogram, which was originally defined as the mass
+of one liter of water, but is now defined as the mass of the
+International Prototype Kilogram (IPK), a cylinder of platinum-iridium
+kept at the Bureau International des Poids et Mesures in S@`evres,
+France.  (There are several copies of the IPK throughout the world.)
+The British imperial units, once defined in terms of physical objects,
+were redefined in 1963 in terms of SI units.  The US customary units,
+which were the same as British units until the British imperial system
+was created in 1824, were also defined in terms of the SI units in 1893.
+Because of these redefinitions, conversions between metric, British
+Imperial, and US customary units can often be done precisely.
+
 Since the exact definitions of many kinds of units have evolved over the
 years, and since certain countries sometimes have local differences in
 their definitions, it is a good idea to examine Calc's definition of a
similarity index 99%
rename from man/cc-mode.texi
rename to doc/misc/cc-mode.texi
index 423892d7d303c29cee9188efcbb6e422773c8498..eb69733b61c009e818127d781d75384106f5c920 100644 (file)
@@ -81,7 +81,7 @@ the second with them pointing to the XEmacs manuals.
 @comment No overfull hbox marks in the dvi file.
 @finalout
 
-@setfilename  ../info/ccmode
+@setfilename  ../../info/ccmode
 @settitle     CC Mode Manual
 @footnotestyle end
 
@@ -208,9 +208,9 @@ license to the document, as described in section 6 of the license.
 @vskip 0pt plus 1filll
 @insertcopying
 
-This manual was generated from $Revision$ of $RCSfile$, which can be
+This manual was generated from $Revision: 1.2 $ of $RCSfile: cc-mode.texi,v $, which can be
 downloaded from
-@url{http://cvs.savannah.gnu.org/viewcvs/emacs/emacs/man/cc-mode.texi}.
+@url{http://cvs.savannah.gnu.org/viewcvs/emacs/emacs/doc/misc/cc-mode.texi}.
 @end titlepage
 
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
similarity index 99%
rename from man/cl.texi
rename to doc/misc/cl.texi
index 676b9edc5ad4c3624cb414fc271b808b110b68af..c27021cb3253396dbc77f80ac5d5e805db11c817 100644 (file)
@@ -1,5 +1,5 @@
 \input texinfo    @c -*-texinfo-*-
-@setfilename ../info/cl
+@setfilename ../../info/cl
 @settitle Common Lisp Extensions
 
 @copying
similarity index 99%
rename from man/dired-x.texi
rename to doc/misc/dired-x.texi
index bf2d5288abc1fae79cdd43aaab203dc1e2db25ce..0206bd20d86acc42ea8e19d224440e3c81a8e916 100644 (file)
@@ -15,7 +15,7 @@
 
 @comment %**start of header (This is for running Texinfo on a region.)
 @c FOR GNU EMACS USE ../info/dired-x BELOW
-@setfilename ../info/dired-x
+@setfilename ../../info/dired-x
 @c dired-x.el REVISION NUMBER
 @settitle Dired Extra Version 2 User's Manual
 @iftex
similarity index 100%
rename from man/doclicense.texi
rename to doc/misc/doclicense.texi
diff --git a/doc/misc/ebrowse.texi b/doc/misc/ebrowse.texi
new file mode 100644 (file)
index 0000000..4fde4dc
--- /dev/null
@@ -0,0 +1,1462 @@
+\input texinfo   @c -*-texinfo-*-
+
+@comment %**start of header
+@setfilename ../../info/ebrowse
+@settitle A Class Browser for C++
+@setchapternewpage odd
+@syncodeindex fn cp
+@comment %**end of header
+
+@copying
+This file documents Ebrowse, a C++ class browser for GNU Emacs.
+
+Copyright @copyright{} 2000, 2001, 2002, 2003, 2004,
+2005, 2006, 2007  Free Software Foundation, Inc.
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with the Front-Cover texts being ``A GNU
+Manual,'' and with the Back-Cover Texts as in (a) below.  A copy of the
+license is included in the section entitled ``GNU Free Documentation
+License'' in the Emacs manual.
+
+(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
+this GNU Manual, like GNU software.  Copies published by the Free
+Software Foundation raise funds for GNU development.''
+
+This document is part of a collection distributed under the GNU Free
+Documentation License.  If you want to distribute this document
+separately from the collection, you can do so by adding a copy of the
+license to the document, as described in section 6 of the license.
+@end quotation
+@end copying
+
+@dircategory Emacs
+@direntry
+* Ebrowse: (ebrowse).   A C++ class browser for Emacs.
+@end direntry
+
+@titlepage
+@title Ebrowse User's Manual
+@sp 4
+@subtitle Ebrowse/Emacs
+@sp 5
+@author Gerd Moellmann
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+@node Top, Overview, (dir), (dir)
+
+@ifnottex
+You can browse C++ class hierarchies from within Emacs by using
+Ebrowse.
+@end ifnottex
+
+@menu
+* Overview::                   What is it and how does it work?
+* Generating browser files::   How to process C++ source files
+* Loading a Tree::             How to start browsing
+* Tree Buffers::               Traversing class hierarchies
+* Member Buffers::             Looking at member information
+* Tags-like Functions::                Finding members from source files
+* GNU Free Documentation License:: The license for this documentation.
+* Concept Index::              An entry for each concept defined
+@end menu
+
+
+
+
+@node Overview, Generating browser files, Top, Top
+@chapter Introduction
+
+When working in software projects using C++, I frequently missed
+software support for two things:
+
+@itemize @bullet
+@item
+When you get a new class library, or you have to work on source code you
+haven't written yourself (or written sufficiently long ago), you need a
+tool to let you navigate class hierarchies and investigate
+features of the software.  Without such a tool you often end up
+@command{grep}ing through dozens or even hundreds of files.
+
+@item
+Once you are productive, it would be nice to have a tool that knows your
+sources and can help you while you are editing source code.  Imagine to
+be able to jump to the definition of an identifier while you are
+editing, or something that can complete long identifier names because it
+knows what identifiers are defined in your program@dots{}.
+@end itemize
+
+The design of Ebrowse reflects these two needs.
+
+How does it work?
+
+@cindex parser for C++ sources
+A fast parser written in C is used to process C++ source files.
+The parser generates a data base containing information about classes,
+members, global functions, defines, types etc.@: found in the sources.
+
+The second part of Ebrowse is a Lisp program.  This program reads
+the data base generated by the parser.  It displays its contents in
+various forms and allows you to perform operations on it, or do
+something with the help of the knowledge contained in the data base.
+
+@cindex major modes, of Ebrowse buffers
+@dfn{Navigational} use of Ebrowse is centered around two
+types of buffers which define their own major modes:
+
+@cindex tree buffer
+@dfn{Tree buffers} are used to view class hierarchies in tree form.
+They allow you to quickly find classes, find or view class declarations,
+perform operations like query replace on sets of your source files, and
+finally tree buffers are used to produce the second buffer form---member
+buffers.  @xref{Tree Buffers}.
+
+@cindex member buffer
+Members are displayed in @dfn{member buffers}.  Ebrowse
+distinguishes between six different types of members; each type is
+displayed as a member list of its own:
+
+@itemize @bullet
+@item
+Instance member variables;
+
+@item
+Instance member functions;
+
+@item
+Static member variables;
+
+@item
+Static member functions;
+
+@item
+Friends/Defines.  The list of defines is contained in the friends
+list of the pseudo-class @samp{*Globals*};
+
+@item
+Types (@code{enum}s, and @code{typedef}s defined with class
+scope).@refill
+@end itemize
+
+You can switch member buffers from one list to another, or to another
+class.  You can include inherited members in the display, you can set
+filters that remove categories of members from the display, and most
+importantly you can find or view member declarations and definitions
+with a keystroke.  @xref{Member Buffers}.
+
+These two buffer types and the commands they provide support the
+navigational use of the browser.  The second form resembles Emacs' Tags
+package for C and other procedural languages.  Ebrowse's commands of
+this type are not confined to special buffers; they are most often used
+while you are editing your source code.
+
+To list just a subset of what you can use the Tags part of Ebrowse for:
+
+@itemize @bullet
+@item
+Jump to the definition or declaration of an identifier in your source
+code, with an electric position stack that lets you easily navigate
+back and forth.
+
+@item
+Complete identifiers in your source with a completion list containing
+identifiers from your source code only.
+
+@item
+Perform search and query replace operations over some or all of your
+source files.
+
+@item
+Show all identifiers matching a regular expression---and jump to one of
+them, if you like.
+@end itemize
+
+
+
+
+@node Generating browser files, Loading a Tree, Overview, Top
+@comment node-name,  next,  previous,  up
+@chapter Processing Source Files
+
+@cindex @command{ebrowse}, the program
+@cindex class data base creation
+Before you can start browsing a class hierarchy, you must run the parser
+@command{ebrowse} on your source files in order to generate a Lisp data
+base describing your program.
+
+@cindex command line for @command{ebrowse}
+The operation of @command{ebrowse} can be tailored with command line
+options.  Under normal circumstances it suffices to let the parser use
+its default settings.  If you want to do that, call it with a command
+line like:
+
+@example
+ebrowse *.h *.cc
+@end example
+
+@noindent
+or, if your shell doesn't allow all the file names to be specified on
+the command line,
+
+@example
+ebrowse --files=@var{file}
+@end example
+
+@noindent
+where @var{file} contains the names of the files to be parsed, one
+per line.
+
+@findex --help
+When invoked with option @samp{--help}, @command{ebrowse} prints a list of
+available command line options.@refill
+
+@menu
+* Input files::                Specifying which files to parse
+* Output file::                Changing the output file name
+* Structs and unions:: Omitting @code{struct}s and @code{union}s
+* Matching::           Setting regular expression lengths
+* Verbosity::           Getting feedback for lengthy operations
+@end menu
+
+
+
+
+@comment name,     next,        prev,                     up
+@node Input files, Output file, Generating browser files, Generating browser files
+@section Specifying Input Files
+
+@table @samp
+@cindex input files, for @command{ebrowse}
+@item file
+Each file name on the command line tells @command{ebrowse} to parse
+that file.
+
+@cindex response files
+@findex --files
+@item --files=@var{file}
+This command line switch specifies that @var{file} contains a list of
+file names to parse.  Each line in @var{file} must contain one file
+name.  More than one option of this kind is allowed.  You might, for
+instance, want to use one file for header files, and another for source
+files.
+
+@cindex standard input, specifying input files
+@item standard input
+When @command{ebrowse} finds no file names on the command line, and no
+@samp{--file} option is specified, it reads file names from standard
+input.  This is sometimes convenient when @command{ebrowse} is used as part
+of a command pipe.
+
+@findex --search-path
+@item --search-path=@var{paths}
+This option lets you specify search paths for your input files.
+@var{paths} is a list of directory names, separated from each other by a
+either a colon or a semicolon, depending on the operating system.
+@end table
+
+@cindex header files
+@cindex friend functions
+It is generally a good idea to specify input files so that header files
+are parsed before source files.  This facilitates the parser's work of
+properly identifying friend functions of a class.
+
+
+
+@comment name,     next,               prev,        up
+@node Output file, Structs and unions, Input files, Generating browser files
+@section Changing the Output File Name
+
+@table @samp
+@cindex output file name
+@findex --output-file
+@cindex @file{BROWSE} file
+@item --output-file=@var{file}
+This option instructs @command{ebrowse} to generate a Lisp data base with
+name @var{file}.  By default, the data base is named @file{BROWSE}, and
+is written in the directory in which @command{ebrowse} is invoked.
+
+If you regularly use data base names different from the default, you
+might want to add this to your init file:
+
+@lisp
+(add-to-list 'auto-mode-alist '(@var{NAME} . ebrowse-tree-mode))
+@end lisp
+
+@noindent
+where @var{NAME} is the Lisp data base name you are using.
+
+@findex --append
+@cindex appending output to class data base
+@item --append
+By default, each run of @command{ebrowse} erases the old contents of the
+output file when writing to it.  You can instruct @command{ebrowse} to
+append its output to an existing file produced by @command{ebrowse}
+with this command line option.
+@end table
+
+
+
+
+@comment name,            next,     prev,        up
+@node Structs and unions, Matching, Output file, Generating browser files
+@section Structs and Unions
+@cindex structs
+@cindex unions
+
+@table @samp
+@findex --no-structs-or-unions
+@item --no-structs-or-unions
+This switch suppresses all classes in the data base declared as
+@code{struct} or @code{union} in the output.
+
+This is mainly useful when you are converting an existing
+C program to C++, and do not want to see the old C structs in a class
+tree.
+@end table
+
+
+
+
+@comment name,  next,      prev,               up
+@node Matching, Verbosity, Structs and unions, Generating browser files
+@section Regular Expressions
+
+@cindex regular expressions, recording
+The parser @command{ebrowse} normally writes regular expressions to its
+output file that help the Lisp part of Ebrowse to find functions,
+variables etc.@: in their source files.
+
+You can instruct @command{ebrowse} to omit these regular expressions by
+calling it with the command line switch @samp{--no-regexps}.
+
+When you do this, the Lisp part of Ebrowse tries to guess, from member
+or class names, suitable regular expressions to locate that class or
+member in source files.  This works fine in most cases, but the
+automatic generation of regular expressions can be too weak if unusual
+coding styles are used.
+
+@table @samp
+@findex --no-regexps
+@item --no-regexps
+This option turns off regular expression recording.
+
+@findex --min-regexp-length
+@cindex minimum regexp length for recording
+@item --min-regexp-length=@var{n}
+The number @var{n} following this option specifies the minimum length of
+the regular expressions recorded to match class and member declarations
+and definitions.  The default value is set at compilation time of
+@command{ebrowse}.
+
+The smaller the minimum length, the higher the probability that
+Ebrowse will find a wrong match.  The larger the value, the
+larger the output file and therefore the memory consumption once the
+file is read from Emacs.
+
+@findex --max-regexp-length
+@cindex maximum regexp length for recording
+@item --max-regexp-length=@var{n}
+The number following this option specifies the maximum length of the
+regular expressions used to match class and member declarations and
+definitions.  The default value is set at compilation time of
+@command{ebrowse}.
+
+The larger the maximum length, the higher the probability that the
+browser will find a correct match, but the larger the value the larger
+the output file and therefore the memory consumption once the data is
+read.  As a second effect, the larger the regular expression, the higher
+the probability that it will no longer match after editing the file.
+@end table
+
+
+
+
+@node Verbosity, , Matching, Generating browser files
+@comment  node-name,  next,  previous,  up
+@section Verbose Mode
+@cindex verbose operation
+
+@table @samp
+@findex --verbose
+@item --verbose
+When this option is specified on the command line, @command{ebrowse} prints
+a period for each file parsed, and it displays a @samp{+} for each
+class written to the output file.
+
+@findex --very-verbose
+@item --very-verbose
+This option makes @command{ebrowse} print out the names of the files and
+the names of the classes seen.
+@end table
+
+
+
+
+@node Loading a Tree, Tree Buffers, Generating browser files, Top
+@comment  node-name,  next,  previous,  up
+@chapter Starting to Browse
+@cindex loading
+@cindex browsing
+
+You start browsing a class hierarchy parsed by @command{ebrowse} by just
+finding the @file{BROWSE} file with @kbd{C-x C-f}.
+
+An example of a tree buffer display is shown below.
+
+@example
+|  Collection
+|    IndexedCollection
+|      Array
+|        FixedArray
+|    Set
+|    Dictionary
+@end example
+
+@cindex mouse highlight in tree buffers
+When you run Emacs on a display which supports colors and the mouse, you
+will notice that certain areas in the tree buffer are highlighted
+when you move the mouse over them.  This highlight marks mouse-sensitive
+regions in the buffer.  Please notice the help strings in the echo area
+when the mouse moves over a sensitive region.
+
+@cindex context menu
+A click with @kbd{Mouse-3} on a mouse-sensitive region opens a context
+menu.  In addition to this, each buffer also has a buffer-specific menu
+that is opened with a click with @kbd{Mouse-3} somewhere in the buffer
+where no highlight is displayed.
+
+
+
+@comment ****************************************************************
+@comment ***
+@comment ***                 TREE BUFFERS
+@comment ***
+@comment ****************************************************************
+
+@node Tree Buffers, Member Buffers, Loading a Tree, Top
+@comment  node-name,  next,  previous,  up
+@chapter Tree Buffers
+@cindex tree buffer mode
+@cindex class trees
+
+Class trees are displayed in @dfn{tree buffers} which install their own
+major mode.  Most Emacs keys work in tree buffers in the usual way,
+e.g.@: you can move around in the buffer with the usual @kbd{C-f},
+@kbd{C-v} etc., or you can search with @kbd{C-s}.
+
+Tree-specific commands are bound to simple keystrokes, similar to
+@code{Gnus}.  You can take a look at the key bindings by entering
+@kbd{?} which calls @code{M-x describe-mode} in both tree and member
+buffers.
+
+@menu
+* Source Display::             Viewing and finding a class declaration
+* Member Display::             Showing members, switching to member buffers
+* Go to Class::                        Finding a class
+* Quitting::                   Discarding and burying the tree buffer
+* File Name Display::          Showing file names in the tree
+* Expanding and Collapsing::   Expanding and collapsing branches
+* Tree Indentation::           Changing the tree indentation
+* Killing Classes::            Removing class from the tree
+* Saving a Tree::              Saving a modified tree
+* Statistics::                 Displaying class tree statistics
+* Marking Classes::            Marking and unmarking classes
+@end menu
+
+
+
+@node Source Display, Member Display, Tree Buffers, Tree Buffers
+@comment  node-name,  next,  previous,  up
+@section Viewing and Finding Class Declarations
+@cindex viewing, class
+@cindex finding a class
+@cindex class declaration
+
+You can view or find a class declaration when the cursor is on a class
+name.
+
+@table @kbd
+@item SPC
+This command views the class declaration if the database
+contains informations about it.  If you don't parse the entire source
+you are working on, some classes will only be known to exist but the
+location of their declarations and definitions will not be known.@refill
+
+@item RET
+Works like @kbd{SPC}, except that it finds the class
+declaration rather than viewing it, so that it is ready for
+editing.@refill
+@end table
+
+The same functionality is available from the menu opened with
+@kbd{Mouse-3} on the class name.
+
+
+
+
+@node Member Display, Go to Class, Source Display, Tree Buffers
+@comment  node-name,  next,  previous,  up
+@section Displaying Members
+@cindex @samp{*Members*} buffer
+@cindex @samp{*Globals*}
+@cindex freezing a member buffer
+@cindex member lists, in tree buffers
+
+Ebrowse distinguishes six different kinds of members, each of
+which is displayed as a separate @dfn{member list}: instance variables,
+instance functions, static variables, static functions, friend
+functions, and types.
+
+Each of these lists can be displayed in a member buffer with a command
+starting with @kbd{L} when the cursor is on a class name.  By default,
+there is only one member buffer named @dfn{*Members*} that is reused
+each time you display a member list---this has proven to be more
+practical than to clutter up the buffer list with dozens of member
+buffers.
+
+If you want to display more than one member list at a time you can
+@dfn{freeze} its member buffer. Freezing a member buffer prevents it
+from being overwritten the next time you display a member list. You can
+toggle this buffer status at any time.
+
+Every member list display command in the tree buffer can be used with a
+prefix argument (@kbd{C-u}).  Without a prefix argument, the command will
+pop to a member buffer displaying the member list.  With prefix argument,
+the member buffer will additionally be @dfn{frozen}.
+
+@table @kbd
+@cindex instance member variables, list
+@item L v
+This command displays the list of instance member variables.
+
+@cindex static variables, list
+@item L V
+Display the list of static variables.
+
+@cindex friend functions, list
+@item L d
+Display the list of friend functions.  This list is used for defines if
+you are viewing the class @samp{*Globals*} which is a place holder for
+global symbols.
+
+@cindex member functions, list
+@item L f
+Display the list of member functions.
+
+@cindex static member functions, list
+@item L F
+Display the list of static member functions.
+
+@cindex types, list
+@item L t
+Display a list of types.
+@end table
+
+These lists are also available from the class' context menu invoked with
+@kbd{Mouse-3} on the class name.
+
+
+
+
+@node Go to Class, Quitting, Member Display, Tree Buffers
+@comment  node-name,  next,  previous,  up
+@section Finding a Class
+@cindex locate class
+@cindex expanding branches
+@cindex class location
+
+@table @kbd
+@cindex search for class
+@item /
+This command reads a class name from the minibuffer with completion and
+positions the cursor on the class in the class tree.
+
+If the branch of the class tree containing the class searched for is
+currently collapsed, the class itself and all its base classes are
+recursively made visible.  (See also @ref{Expanding and
+Collapsing}.)@refill
+
+This function is also available from the tree buffer's context menu.
+
+@item n
+Repeat the last search done with @kbd{/}.  Each tree buffer has its own
+local copy of the regular expression last searched in it.
+@end table
+
+
+
+
+@node Quitting, File Name Display, Go to Class, Tree Buffers
+@comment  node-name,  next,  previous,  up
+@section Burying a Tree Buffer
+@cindex burying tree buffer
+
+@table @kbd
+@item q
+Is a synonym for @kbd{M-x bury-buffer}.
+@end table
+
+
+
+
+@node File Name Display, Expanding and Collapsing, Quitting, Tree Buffers
+@comment  node-name,  next,  previous,  up
+@section Displaying File Names
+
+@table @kbd
+@cindex file names in tree buffers
+@item T f
+This command toggles the display of file names in a tree buffer.  If
+file name display is switched on, the names of the files containing the
+class declaration are shown to the right of the class names.  If the
+file is not known, the string @samp{unknown} is displayed.
+
+This command is also provided in the tree buffer's context menu.
+
+@item s
+Display file names for the current line, or for the number of lines
+given by a prefix argument.
+@end table
+
+Here is an example of a tree buffer with file names displayed.
+
+@example
+|  Collection          (unknown)
+|    IndexedCollection (indexedcltn.h)
+|      Array           (array.h)
+|        FixedArray    (fixedarray.h)
+|    Set               (set.h)
+|    Dictionary                (dict.h)
+@end example
+
+
+
+
+@node Expanding and Collapsing, Tree Indentation, File Name Display, Tree Buffers
+@comment  node-name,  next,  previous,  up
+@section Expanding and Collapsing a Tree
+@cindex expand tree branch
+@cindex collapse tree branch
+@cindex branches of class tree
+@cindex class tree, collapse or expand
+
+You can expand and collapse parts of a tree to reduce the complexity of
+large class hierarchies.  Expanding or collapsing branches of a tree has
+no impact on the functionality of other commands, like @kbd{/}.  (See
+also @ref{Go to Class}.)@refill
+
+Collapsed branches are indicated with an ellipsis following the class
+name like in the example below.
+
+@example
+|  Collection
+|    IndexedCollection...
+|    Set
+|    Dictionary
+@end example
+
+@table @kbd
+@item -
+This command collapses the branch of the tree starting at the class the
+cursor is on.
+
+@item +
+This command expands the branch of the tree starting at the class the
+cursor is on.  Both commands for collapsing and expanding branches are
+also available from the class' object menu.
+
+@item *
+This command expands all collapsed branches in the tree.
+@end table
+
+
+
+
+@node Tree Indentation, Killing Classes, Expanding and Collapsing, Tree Buffers
+@comment  node-name,  next,  previous,  up
+@section Changing the Tree Indentation
+@cindex tree indentation
+@cindex indentation of the tree
+
+@table @kbd
+@item T w
+This command reads a new indentation width from the minibuffer and
+redisplays the tree buffer with the new indentation  It is also
+available from the tree buffer's context menu.
+@end table
+
+
+
+
+@node Killing Classes, Saving a Tree, Tree Indentation, Tree Buffers
+@comment  node-name,  next,  previous,  up
+@section Removing Classes from the Tree
+@cindex killing classes
+@cindex class, remove from tree
+
+@table @kbd
+@item C-k
+This command removes the class the cursor is on and all its derived
+classes from the tree.  The user is asked for confirmation before the
+deletion is actually performed.
+@end table
+
+
+
+
+@node Saving a Tree, Statistics, Killing Classes, Tree Buffers
+@comment  node-name,  next,  previous,  up
+@comment node-name, next, previous, up
+@section Saving a Tree
+@cindex save tree to a file
+@cindex tree, save to a file
+@cindex class tree, save to a file
+
+@table @kbd
+@item C-x C-s
+This command writes a class tree to the file from which it was read.
+This is useful after classes have been deleted from a tree.
+
+@item  C-x C-w
+Writes the tree to a file whose name is read from the minibuffer.
+@end table
+
+
+
+
+@node     Statistics, Marking Classes, Saving a Tree, Tree Buffers
+@comment  node-name,  next,        previous, up
+@cindex statistics for a tree
+@cindex tree statistics
+@cindex class statistics
+
+@table @kbd
+@item x
+Display statistics for the tree, like number of classes in it, number of
+member functions, etc.  This command can also be found in the buffer's
+context menu.
+@end table
+
+
+
+
+@node     Marking Classes, , Statistics, Tree Buffers
+@comment  node-name,       next,       previous,      up
+@cindex marking classes
+@cindex operations on marked classes
+
+Classes can be marked for operations similar to the standard Emacs
+commands @kbd{M-x tags-search} and @kbd{M-x tags-query-replace} (see
+also @xref{Tags-like Functions}.)@refill
+
+@table @kbd
+@cindex toggle mark
+@item M t
+Toggle the mark of the line point is in or for as many lines as given by
+a prefix command.  This command can also be found in the class' context
+menu.
+
+@cindex unmark all
+@item M a
+Unmark all classes.  With prefix argument @kbd{C-u}, mark all classes in
+the tree. Since this command operates on the whole buffer, it can also be
+found in the buffer's object menu.
+@end table
+
+Marked classes are displayed with an @code{>} in column one of the tree
+display, like in the following example
+
+@example
+|> Collection
+|    IndexedCollection...
+|>   Set
+|    Dictionary
+@end example
+
+
+
+
+@c ****************************************************************
+@c ***
+@c ***                 MEMBER BUFFERS
+@c ***
+@c ****************************************************************
+
+@node Member Buffers, Tags-like Functions, Tree Buffers, Top
+@comment  node-name,       next,       previous,      up
+@chapter Member Buffers
+@cindex members
+@cindex member buffer mode
+
+@cindex class members, types
+@cindex types of class members
+@dfn{Member buffers} are used to operate on lists of members of a class.
+Ebrowse distinguishes six kinds of lists:
+
+@itemize @bullet
+@item
+Instance variables (normal member variables);
+@item
+Instance functions (normal member functions);
+@item
+Static variables;
+@item
+Static member functions;
+@item
+Friend functions;
+@item
+Types (@code{enum}s and @code{typedef}s defined with class scope.
+Nested classes will be shown in the class tree like normal classes.
+@end itemize
+
+Like tree buffers, member buffers install their own major mode.  Also
+like in tree buffers, menus are provided for certain areas in the
+buffer: members, classes, and the buffer itself.
+
+@menu
+* Switching Member Lists::     Choosing which members to display
+* Finding/Viewing::            Modifying source code
+* Inherited Members::          Display of Inherited Members
+* Searching Members::          Finding members in member buffer
+* Switching to Tree::          Going back to the tree buffer
+* Filters::                    Selective member display
+* Attributes::                 Display of @code{virtual} etc.
+* Long and Short Display::     Comprehensive and verbose display
+* Regexp Display::             Showing matching regular expressions
+* Switching Classes::          Displaying another class
+* Killing/Burying::            Getting rid of the member buffer
+* Column Width::               Display style
+* Redisplay::                  Redrawing the member list
+* Getting Help::               How to get help for key bindings
+@end menu
+
+
+
+
+@node Switching Member Lists, Finding/Viewing, Member Buffers, Member Buffers
+@comment  node-name,       next,       previous,      up
+@section Switching Member Lists
+@cindex member lists, in member buffers
+@cindex static members
+@cindex friends
+@cindex types
+@cindex defines
+
+@table @kbd
+@cindex next member list
+@item L n
+This command switches the member buffer display to the next member list.
+
+@cindex previous member list
+@item L p
+This command switches the member buffer display to the previous member
+list.
+
+@item L f
+Switch to the list of member functions.
+
+@cindex static
+@item L F
+Switch to the list of static member functions.
+
+@item L v
+Switch to the list of member variables.
+
+@item L V
+Switch to the list of static member variables.
+
+@item L d
+Switch to the list of friends or defines.
+
+@item L t
+Switch to the list of types.
+@end table
+
+Both commands cycle through the member list.
+
+Most of the commands are also available from the member buffer's
+context menu.
+
+
+
+
+@node Finding/Viewing, Inherited Members, Switching Member Lists, Member Buffers
+@comment  node-name,       next,       previous,      up
+@section Finding and Viewing Member Source
+@cindex finding members, in member buffers
+@cindex viewing members, in member buffers
+@cindex member definitions, in member buffers
+@cindex member declarations, in member buffers
+@cindex definition of a member, in member buffers
+@cindex declaration of a member, in member buffers
+
+@table @kbd
+@item RET
+This command finds the definition of the member the cursor is on.
+Finding involves roughly the same as the standard Emacs tags facility
+does---loading the file and searching for a regular expression matching
+the member.
+
+@item f
+This command finds the declaration of the member the cursor is on.
+
+@item SPC
+This is the same command as @kbd{RET}, but views the member definition
+instead of finding the member's source file.
+
+@item v
+This is the same command as @kbd{f}, but views the member's declaration
+instead of finding the file the declaration is in.
+@end table
+
+You can install a hook function to perform actions after a member or
+class declaration or definition has been found, or when it is not found.
+
+All the commands described above can also be found in the context menu
+displayed when clicking @kbd{Mouse-2} on a member name.
+
+
+
+
+@node Inherited Members, Searching Members, Finding/Viewing, Member Buffers
+@comment  node-name,       next,       previous,      up
+@section Display of Inherited Members
+@cindex superclasses, members
+@cindex base classes, members
+@cindex inherited members
+
+@table @kbd
+@item D b
+This command toggles the display of inherited members in the member
+buffer.  This is also in the buffer's context menu.
+@end table
+
+
+
+
+@node Searching Members, Switching to Tree, Inherited Members, Member Buffers
+@comment  node-name,       next,       previous,      up
+@section Searching Members
+@cindex searching members
+
+@table @kbd
+@item G v
+Position the cursor on a member whose name is read from the minibuffer;
+only members shown in the current member buffer appear in the completion
+list.
+
+@item G m
+Like the above command, but all members for the current class appear in
+the completion list.  If necessary, the current member list is switched
+to the one containing the member.
+
+With a prefix argument (@kbd{C-u}), all members in the class tree,
+i.e.@: all members the browser knows about appear in the completion
+list.  The member display will be switched to the class and member list
+containing the member.
+
+@item G n
+Repeat the last member search.
+@end table
+
+Look into the buffer's context menu for a convenient way to do this with
+a mouse.
+
+
+
+@node Switching to Tree, Filters, Searching Members, Member Buffers
+@comment  node-name,       next,       previous,      up
+@section Switching to Tree Buffer
+@cindex tree buffer, switch to
+@cindex buffer switching
+@cindex switching buffers
+
+@table @kbd
+@item @key{TAB}
+Pop up the tree buffer to which the member buffer belongs.
+
+@item t
+Do the same as @key{TAB} but also position the cursor on the class
+displayed in the member buffer.
+@end table
+
+
+
+
+@node Filters, Attributes, Switching to Tree, Member Buffers
+@comment  node-name,       next,       previous,      up
+@section Filters
+@cindex filters
+
+@table @kbd
+@cindex @code{public} members
+@item F a u
+This command toggles the display of @code{public} members.  The
+@samp{a} stands for `access'.
+
+@cindex @code{protected} members
+@item F a o
+This command toggles the display of @code{protected} members.
+
+@cindex @code{private} members
+@item F a i
+This command toggles the display of @code{private} members.
+
+@cindex @code{virtual} members
+@item F v
+This command toggles the display of @code{virtual} members.
+
+@cindex @code{inline} members
+@item F i
+This command toggles the display of @code{inline} members.
+
+@cindex @code{const} members
+@item F c
+This command toggles the display of @code{const} members.
+
+@cindex pure virtual members
+@item F p
+This command toggles the display of pure virtual members.
+
+@cindex remove filters
+@item F r
+This command removes all filters.
+@end table
+
+These commands are also found in the buffer's context menu.
+
+
+
+
+@node Attributes, Long and Short Display, Filters, Member Buffers
+@comment  node-name,       next,       previous,      up
+@section Displaying Member Attributes
+@cindex attributes
+@cindex member attribute display
+
+@table @kbd
+@item D a
+Toggle the display of member attributes (default is on).
+
+The nine member attributes Ebrowse knows about are displayed
+as a list a single-characters flags enclosed in angle brackets in front
+the of the member's name.  A @samp{-} at a given position means that
+the attribute is false.  The list of attributes from left to right is
+
+@table @samp
+@cindex @code{template} attribute
+@item T
+The member is a template.
+
+@cindex @code{extern "C"} attribute
+@item C
+The member is declared @code{extern "C"}.
+
+@cindex @code{virtual} attribute
+@item v
+Means the member is declared @code{virtual}.
+
+@cindex @code{inline}
+@item i
+The member is declared @code{inline}.
+
+@cindex @code{const} attribute
+@item c
+The member is @code{const}.
+
+@cindex pure virtual function attribute
+@item 0
+The member is a pure virtual function.
+
+@cindex @code{mutable} attribute
+@item m
+The member is declared @code{mutable}.
+
+@cindex @code{explicit} attribute
+@item e
+The member is declared @code{explicit}.
+
+@item t
+The member is a function with a throw list.
+@end table
+@end table
+
+This command is also in the buffer's context menu.
+
+
+
+@node Long and Short Display, Regexp Display, Attributes, Member Buffers
+@comment  node-name,       next,       previous,      up
+@section Long and Short Member Display
+@cindex display form
+@cindex long display
+@cindex short display
+
+@table @kbd
+@item D l
+This command toggles the member buffer between short and long display
+form.  The short display form displays member names, only:
+
+@example
+| isEmpty        contains       hasMember      create
+| storeSize      hash           isEqual        restoreGuts
+| saveGuts
+@end example
+
+The long display shows one member per line with member name and regular
+expressions matching the member (if known):
+
+@example
+| isEmpty               Bool isEmpty () const...
+| hash                  unsigned hash () const...
+| isEqual               int isEqual (...
+@end example
+
+Regular expressions will only be displayed when the Lisp database has
+not been produced with the @command{ebrowse} option @samp{--no-regexps}.
+@xref{Matching, --no-regexps, Regular Expressions}.
+@end table
+
+
+
+
+@node Regexp Display, Switching Classes, Long and Short Display, Member Buffers
+@comment  node-name,       next,       previous,      up
+@section Display of Regular Expressions
+@cindex regular expression display
+
+@table @kbd
+@item D r
+This command toggles the long display form from displaying the regular
+expressions matching the member declarations to those expressions
+matching member definitions.
+@end table
+
+Regular expressions will only be displayed when the Lisp database has
+not been produced with the @command{ebrowse} option @samp{--no-regexps},
+see @ref{Matching, --no-regexps, Regular Expressions}.
+
+
+
+
+@node Switching Classes, Killing/Burying, Regexp Display, Member Buffers
+@comment  node-name,       next,       previous,      up
+@section Displaying Another Class
+@cindex base class, display
+@cindex derived class, display
+@cindex superclass, display
+@cindex subclass, display
+@cindex class display
+
+@table @kbd
+@item C c
+This command lets you switch the member buffer to another class.  It
+reads the name of the new class from the minibuffer with completion.
+
+@item C b
+This is the same command as @kbd{C c} but restricts the classes shown in
+the completion list to immediate base classes, only.  If only one base
+class exists, this one is immediately shown in the minibuffer.
+
+@item C d
+Same as @kbd{C b}, but for derived classes.
+
+@item C p
+Switch to the previous class in the class hierarchy on the same level as
+the class currently displayed.
+
+@item C n
+Switch to the next sibling of the class in the class tree.
+@end table
+
+
+
+
+@node Killing/Burying, Column Width, Switching Classes, Member Buffers
+@comment  node-name,       next,       previous,      up
+@section Burying a Member Buffer
+@cindex burying member buffers
+
+@table @kbd
+@item q
+This command is a synonym for @kbd{M-x bury-buffer}.
+@end table
+
+
+
+
+@node Column Width, Redisplay, Killing/Burying, Member Buffers
+@comment  node-name,       next,       previous,      up
+@section Setting the Column Width
+@cindex column width
+@cindex member indentation
+@cindex indentation, member
+
+@table @kbd
+@item D w
+This command sets the column width depending on the display form used
+(long or short display).
+@end table
+
+
+
+
+@node Redisplay, Getting Help, Column Width, Member Buffers
+@comment  node-name,       next,       previous,      up
+@section Forced Redisplay
+@cindex redisplay of member buffers
+
+@table @kbd
+@item C-l
+This command forces a redisplay of the member buffer.  If the width
+of the window displaying the member buffer is changed this command
+redraws the member list with the appropriate column widths and number of
+columns.
+@end table
+
+
+
+
+@node Getting Help, , Redisplay, Member Buffers
+@comment  node-name,  next,  previous,  up
+@cindex help
+
+@table @kbd
+@item ?
+This key is bound to @code{describe-mode}.
+@end table
+
+
+
+
+@comment **************************************************************
+@comment ***               TAGS LIKE FUNCTIONS
+@comment **************************************************************
+
+@node Tags-like Functions, GNU Free Documentation License, Member Buffers, Top
+@comment  node-name,       next,       previous,      up
+@chapter Tags-like Functions
+
+Ebrowse provides tags functions similar to those of the standard
+Emacs Tags facility, but better suited to the needs of C++ programmers.
+
+@menu
+* Finding and Viewing::        Going to a member declaration/definition
+* Position Stack::     Moving to previous locations
+* Search & Replace::    Searching and replacing over class tree files
+* Members in Files::    Listing all members in a given file
+* Apropos::             Listing members matching a regular expression
+* Symbol Completion::   Completing names while editing
+* Member Buffer Display:: Quickly display a member buffer for some
+                        identifier
+@end menu
+
+
+
+@node Finding and Viewing, Position Stack, Tags-like Functions, Tags-like Functions
+@comment  node-name,       next,       previous,      up
+@section Finding and Viewing Members
+@cindex finding class member, in C++ source
+@cindex viewing class member, in C++ source
+@cindex tags
+@cindex member definition, finding, in C++ source
+@cindex member declaration, finding, in C++ source
+
+The functions in this section are similar to those described in
+@ref{Source Display}, and also in @ref{Finding/Viewing}, except that
+they work in a C++ source buffer, not in member and tree buffers created
+by Ebrowse.
+
+@table @kbd
+@item C-c C-m f
+Find the definition of the member around point.  If you invoke this
+function with a prefix argument, the declaration is searched.
+
+If more than one class contains a member with the given name you can
+select the class with completion.  If there is a scope declaration in
+front of the member name, this class name is used as initial input for
+the completion.
+
+@item C-c C-m F
+Find the declaration of the member around point.
+
+@item C-c C-m v
+View the definition of the member around point.
+
+@item C-c C-m V
+View the declaration of the member around point.
+
+@item C-c C-m 4 f
+Find a member's definition in another window.
+
+@item C-c C-m 4 F
+Find a member's declaration in another window.
+
+@item C-c C-m 4 v
+View a member's definition in another window.
+
+@item C-c C-m 4 V
+View a member's declaration in another window.
+
+@item C-c C-m 5 f
+Find a member's definition in another frame.
+
+@item C-c C-m 5 F
+Find a member's declaration in another frame.
+
+@item C-c C-m 5 v
+View a member's definition in another frame.
+
+@item C-c C-m 5 V
+View a member's declaration in another frame.
+@end table
+
+
+
+@node Position Stack, Search & Replace, Finding and Viewing, Tags-like Functions
+@comment  node-name,       next,       previous,      up
+@section The Position Stack
+@cindex position stack
+
+When jumping to a member declaration or definition with one of
+Ebrowse's commands, the position from where you performed the
+jump and the position where you jumped to are recorded in a
+@dfn{position stack}.  There are several ways in which you can quickly
+move to positions in the stack:@refill
+
+@table @kbd
+@cindex return to original position
+@item C-c C-m -
+This command sets point to the previous position in the position stack.
+Directly after you performed a jump, this will put you back to the
+position where you came from.
+
+The stack is not popped, i.e.@: you can always switch back and forth
+between positions in the stack.  To avoid letting the stack grow to
+infinite size there is a maximum number of positions defined.  When this
+number is reached, older positions are discarded when new positions are
+pushed on the stack.
+
+@item C-c C-m +
+This command moves forward in the position stack, setting point to
+the next position stored in the position stack.
+
+@item C-c C-m p
+Displays an electric buffer showing all positions saved in the stack.
+You can select a position by pressing @kbd{SPC} in a line.  You can
+view a position with @kbd{v}.
+@end table
+
+
+
+
+@node Search & Replace, Members in Files, Position Stack, Tags-like Functions
+@comment  node-name,       next,       previous,      up
+@section Searching and Replacing
+@cindex searching multiple C++ files
+@cindex replacing in multiple C++ files
+@cindex restart tags-operation
+
+Ebrowse allows you to perform operations on all or a subset of the files
+mentioned in a class tree.  When you invoke one of the following
+functions and more than one class tree is loaded, you must choose a
+class tree to use from an electric tree menu.  If the selected tree
+contains marked classes, the following commands operate on the files
+mentioned in the marked classes only.  Otherwise all files in the class
+tree are used.
+
+@table @kbd
+@item C-c C-m s
+This function performs a regular expression search in the chosen set of
+files.
+
+@item C-c C-m u
+This command performs a search for calls of a given member which is
+selected in the usual way with completion.
+
+@item C-c C-m %
+Perform a query replace over the set of files.
+
+@item C-c C-m ,
+All three operations above stop when finding a match.  You can restart
+the operation with this command.
+
+@item C-c C-m n
+This restarts the last tags operation with the next file in the list.
+@end table
+
+
+
+
+@node Members in Files, Apropos, Search & Replace, Tags-like Functions
+@comment  node-name,       next,       previous,      up
+@section Members in Files
+@cindex files
+@cindex members in file, listing
+@cindex list class members in a file
+@cindex file, members
+
+The command @kbd{C-c C-m l}, lists all members in a given file.  The file
+name is read from the minibuffer with completion.
+
+
+
+
+@node Apropos, Symbol Completion, Members in Files, Tags-like Functions
+@comment  node-name,       next,       previous,      up
+@section Member Apropos
+@cindex apropos on class members
+@cindex members, matching regexp
+
+The command @kbd{C-c C-m a} can be used to display all members matching a
+given regular expression.  This command can be very useful if you
+remember only part of a member name, and not its beginning.
+
+A special buffer is popped up containing all identifiers matching the
+regular expression, and what kind of symbol it is (e.g.@: a member
+function, or a type).  You can then switch to this buffer, and use the
+command @kbd{C-c C-m f}, for example, to jump to a specific member.
+
+
+
+
+@node Symbol Completion, Member Buffer Display, Apropos, Tags-like Functions
+@comment  node-name,       next,       previous,      up
+@section Symbol Completion
+@cindex completion
+@cindex symbol completion
+
+The command @kbd{C-c C-m @key{TAB}} completes the symbol in front of point.
+
+
+
+
+@node Member Buffer Display, , Symbol Completion, Tags-like Functions
+@section Quick Member Display
+@cindex member buffer, for member at point
+
+You can quickly display a member buffer containing the member the cursor
+in on with the command @kbd{C-c C-m m}.
+
+
+@node GNU Free Documentation License, Concept Index, Tags-like Functions, Top
+@appendix GNU Free Documentation License
+@include doclicense.texi
+
+
+@node Concept Index, , GNU Free Documentation License, Top
+@unnumbered Concept Index
+@printindex cp
+
+@contents
+@bye
+
+@ignore
+   arch-tag: 52fe78ac-a1c4-48e7-815e-0a31acfad4bf
+@end ignore
similarity index 99%
rename from man/ediff.texi
rename to doc/misc/ediff.texi
index 6bb2605e0c6165d98e9fdf08aaefc1ec02bb7616..0822289ba7749fe9d233d0c9629c5d20e2ab9cae 100644 (file)
@@ -7,7 +7,7 @@
 @comment Using ediff.info instead of ediff in setfilename breaks DOS.
 @comment @setfilename ediff
 @comment @setfilename ediff.info
-@setfilename ../info/ediff
+@setfilename ../../info/ediff
 
 @settitle Ediff User's Manual
 @synindex vr cp
diff --git a/doc/misc/emacs-mime.texi b/doc/misc/emacs-mime.texi
new file mode 100644 (file)
index 0000000..7490c9b
--- /dev/null
@@ -0,0 +1,1832 @@
+\input texinfo
+
+@setfilename ../../info/emacs-mime
+@settitle Emacs MIME Manual
+@synindex fn cp
+@synindex vr cp
+@synindex pg cp
+
+@copying
+This file documents the Emacs MIME interface functionality.
+
+Copyright @copyright{} 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+2006, 2007 Free Software Foundation, Inc.
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with the Front-Cover texts being ``A GNU
+Manual'', and with the Back-Cover Texts as in (a) below.  A copy of the
+license is included in the section entitled ``GNU Free Documentation
+License'' in the Emacs manual.
+
+(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
+this GNU Manual, like GNU software.  Copies published by the Free
+Software Foundation raise funds for GNU development.''
+
+This document is part of a collection distributed under the GNU Free
+Documentation License.  If you want to distribute this document
+separately from the collection, you can do so by adding a copy of the
+license to the document, as described in section 6 of the license.
+@end quotation
+@end copying
+
+@c Node ``Interface Functions'' uses Latin-1 characters
+@documentencoding ISO-8859-1
+
+@dircategory Emacs
+@direntry
+* Emacs MIME: (emacs-mime).   Emacs MIME de/composition library.
+@end direntry
+@iftex
+@finalout
+@end iftex
+@setchapternewpage odd
+
+@titlepage
+@title Emacs MIME Manual
+
+@author by Lars Magne Ingebrigtsen
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+@node Top
+@top Emacs MIME
+
+This manual documents the libraries used to compose and display
+@acronym{MIME} messages.
+
+This manual is directed at users who want to modify the behavior of
+the @acronym{MIME} encoding/decoding process or want a more detailed
+picture of how the Emacs @acronym{MIME} library works, and people who want
+to write functions and commands that manipulate @acronym{MIME} elements.
+
+@acronym{MIME} is short for @dfn{Multipurpose Internet Mail Extensions}.
+This standard is documented in a number of RFCs; mainly RFC2045 (Format
+of Internet Message Bodies), RFC2046 (Media Types), RFC2047 (Message
+Header Extensions for Non-@acronym{ASCII} Text), RFC2048 (Registration
+Procedures), RFC2049 (Conformance Criteria and Examples).  It is highly
+recommended that anyone who intends writing @acronym{MIME}-compliant software
+read at least RFC2045 and RFC2047.
+
+@menu
+* Decoding and Viewing::  A framework for decoding and viewing.
+* Composing::             @acronym{MML}; a language for describing @acronym{MIME} parts.
+* Interface Functions::   An abstraction over the basic functions.
+* Basic Functions::       Utility and basic parsing functions.
+* Standards::             A summary of RFCs and working documents used.
+* GNU Free Documentation License:: The license for this documentation.
+* Index::                 Function and variable index.
+@end menu
+
+
+@node Decoding and Viewing
+@chapter Decoding and Viewing
+
+This chapter deals with decoding and viewing @acronym{MIME} messages on a
+higher level.
+
+The main idea is to first analyze a @acronym{MIME} article, and then allow
+other programs to do things based on the list of @dfn{handles} that are
+returned as a result of this analysis.
+
+@menu
+* Dissection::             Analyzing a @acronym{MIME} message.
+* Non-MIME::               Analyzing a non-@acronym{MIME} message.
+* Handles::                Handle manipulations.
+* Display::                Displaying handles.
+* Display Customization::  Variables that affect display.
+* Files and Directories::  Saving and naming attachments.
+* New Viewers::            How to write your own viewers.
+@end menu
+
+
+@node Dissection
+@section Dissection
+
+The @code{mm-dissect-buffer} is the function responsible for dissecting
+a @acronym{MIME} article.  If given a multipart message, it will recursively
+descend the message, following the structure, and return a tree of
+@acronym{MIME} handles that describes the structure of the message.
+
+@node Non-MIME
+@section Non-MIME
+@vindex mm-uu-configure-list
+
+Gnus also understands some non-@acronym{MIME} attachments, such as
+postscript, uuencode, binhex, yenc, shar, forward, gnatsweb, pgp,
+diff.  Each of these features can be disabled by add an item into
+@code{mm-uu-configure-list}.  For example,
+
+@lisp
+(require 'mm-uu)
+(add-to-list 'mm-uu-configure-list '(pgp-signed . disabled))
+@end lisp
+
+@table @code
+@item postscript
+@findex postscript
+PostScript file.
+
+@item uu
+@findex uu
+Uuencoded file.
+
+@item binhex
+@findex binhex
+Binhex encoded file.
+
+@item yenc
+@findex yenc
+Yenc encoded file.
+
+@item shar
+@findex shar
+Shar archive file.
+
+@item forward
+@findex forward
+Non-@acronym{MIME} forwarded message.
+
+@item gnatsweb
+@findex gnatsweb
+Gnatsweb attachment.
+
+@item pgp-signed
+@findex pgp-signed
+@acronym{PGP} signed clear text.
+
+@item pgp-encrypted
+@findex pgp-encrypted
+@acronym{PGP} encrypted clear text.
+
+@item pgp-key
+@findex pgp-key
+@acronym{PGP} public keys.
+
+@item emacs-sources
+@findex emacs-sources
+@vindex mm-uu-emacs-sources-regexp
+Emacs source code.  This item works only in the groups matching
+@code{mm-uu-emacs-sources-regexp}.
+
+@item diff
+@vindex diff
+@vindex mm-uu-diff-groups-regexp
+Patches.  This is intended for groups where diffs of committed files
+are automatically sent to.  It only works in groups matching
+@code{mm-uu-diff-groups-regexp}.
+
+@end table
+
+@node Handles
+@section Handles
+
+A @acronym{MIME} handle is a list that fully describes a @acronym{MIME}
+component.
+
+The following macros can be used to access elements in a handle:
+
+@table @code
+@item mm-handle-buffer
+@findex mm-handle-buffer
+Return the buffer that holds the contents of the undecoded @acronym{MIME}
+part.
+
+@item mm-handle-type
+@findex mm-handle-type
+Return the parsed @code{Content-Type} of the part.
+
+@item mm-handle-encoding
+@findex mm-handle-encoding
+Return the @code{Content-Transfer-Encoding} of the part.
+
+@item mm-handle-undisplayer
+@findex mm-handle-undisplayer
+Return the object that can be used to remove the displayed part (if it
+has been displayed).
+
+@item mm-handle-set-undisplayer
+@findex mm-handle-set-undisplayer
+Set the undisplayer object.
+
+@item mm-handle-disposition
+@findex mm-handle-disposition
+Return the parsed @code{Content-Disposition} of the part.
+
+@item mm-get-content-id
+Returns the handle(s) referred to by @code{Content-ID}.
+
+@end table
+
+
+@node Display
+@section Display
+
+Functions for displaying, removing and saving.
+
+@table @code
+@item mm-display-part
+@findex mm-display-part
+Display the part.
+
+@item mm-remove-part
+@findex mm-remove-part
+Remove the part (if it has been displayed).
+
+@item mm-inlinable-p
+@findex mm-inlinable-p
+Say whether a @acronym{MIME} type can be displayed inline.
+
+@item mm-automatic-display-p
+@findex mm-automatic-display-p
+Say whether a @acronym{MIME} type should be displayed automatically.
+
+@item mm-destroy-part
+@findex mm-destroy-part
+Free all resources occupied by a part.
+
+@item mm-save-part
+@findex mm-save-part
+Offer to save the part in a file.
+
+@item mm-pipe-part
+@findex mm-pipe-part
+Offer to pipe the part to some process.
+
+@item mm-interactively-view-part
+@findex mm-interactively-view-part
+Prompt for a mailcap method to use to view the part.
+
+@end table
+
+
+@node Display Customization
+@section Display Customization
+
+@table @code
+
+@item mm-inline-media-tests
+@vindex mm-inline-media-tests
+This is an alist where the key is a @acronym{MIME} type, the second element
+is a function to display the part @dfn{inline} (i.e., inside Emacs), and
+the third element is a form to be @code{eval}ed to say whether the part
+can be displayed inline.
+
+This variable specifies whether a part @emph{can} be displayed inline,
+and, if so, how to do it.  It does not say whether parts are
+@emph{actually} displayed inline.
+
+@item mm-inlined-types
+@vindex mm-inlined-types
+This, on the other hand, says what types are to be displayed inline, if
+they satisfy the conditions set by the variable above.  It's a list of
+@acronym{MIME} media types.
+
+@item mm-automatic-display
+@vindex mm-automatic-display
+This is a list of types that are to be displayed ``automatically'', but
+only if the above variable allows it.  That is, only inlinable parts can
+be displayed automatically.
+
+@item mm-automatic-external-display
+@vindex mm-automatic-external-display
+This is a list of types that will be displayed automatically in an
+external viewer.
+
+@item mm-keep-viewer-alive-types
+@vindex mm-keep-viewer-alive-types
+This is a list of media types for which the external viewer will not
+be killed when selecting a different article.
+
+@item mm-attachment-override-types
+@vindex mm-attachment-override-types
+Some @acronym{MIME} agents create parts that have a content-disposition of
+@samp{attachment}.  This variable allows overriding that disposition and
+displaying the part inline.  (Note that the disposition is only
+overridden if we are able to, and want to, display the part inline.)
+
+@item mm-discouraged-alternatives
+@vindex mm-discouraged-alternatives
+List of @acronym{MIME} types that are discouraged when viewing
+@samp{multipart/alternative}.  Viewing agents are supposed to view the
+last possible part of a message, as that is supposed to be the richest.
+However, users may prefer other types instead, and this list says what
+types are most unwanted.  If, for instance, @samp{text/html} parts are
+very unwanted, and @samp{text/richtext} parts are somewhat unwanted,
+you could say something like:
+
+@lisp
+(setq mm-discouraged-alternatives
+      '("text/html" "text/richtext")
+      mm-automatic-display
+      (remove "text/html" mm-automatic-display))
+@end lisp
+
+Adding @code{"image/.*"} might also be useful.  Spammers use images as
+the preferred part of @samp{multipart/alternative} messages, so you might
+not notice there are other parts.  See also
+@code{gnus-buttonized-mime-types}, @ref{MIME Commands, ,MIME Commands,
+gnus, Gnus Manual}.  After adding @code{"multipart/alternative"} to
+@code{gnus-buttonized-mime-types} you can choose manually which
+alternative you'd like to view.  For example, you can set those
+variables like:
+
+@lisp
+(setq gnus-buttonized-mime-types
+      '("multipart/alternative" "multipart/signed")
+      mm-discouraged-alternatives
+      '("text/html" "image/.*"))
+@end lisp
+
+In this case, Gnus will display radio buttons for such a kind of spam
+message as follows:
+
+@example
+1.  (*) multipart/alternative  ( ) image/gif
+
+2.  (*) text/plain          ( ) text/html
+@end example
+
+@item mm-inline-large-images
+@vindex mm-inline-large-images
+When displaying inline images that are larger than the window, Emacs
+does not enable scrolling, which means that you cannot see the whole
+image.  To prevent this, the library tries to determine the image size
+before displaying it inline, and if it doesn't fit the window, the
+library will display it externally (e.g. with @samp{ImageMagick} or
+@samp{xv}).  Setting this variable to @code{t} disables this check and
+makes the library display all inline images as inline, regardless of
+their size.
+
+@item mm-inline-override-types
+@vindex mm-inline-override-types
+@code{mm-inlined-types} may include regular expressions, for example to
+specify that all @samp{text/.*} parts be displayed inline.  If a user
+prefers to have a type that matches such a regular expression be treated
+as an attachment, that can be accomplished by setting this variable to a
+list containing that type.  For example assuming @code{mm-inlined-types}
+includes @samp{text/.*}, then including @samp{text/html} in this
+variable will cause @samp{text/html} parts to be treated as attachments.
+
+@item mm-text-html-renderer
+@vindex mm-text-html-renderer
+This selects the function used to render @acronym{HTML}.  The predefined
+renderers are selected by the symbols @code{w3},
+@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}.  If @code{nil} use an
+external viewer.  You can also specify a function, which will be
+called with a @acronym{MIME} handle as the argument.
+
+@item mm-inline-text-html-with-images
+@vindex mm-inline-text-html-with-images
+Some @acronym{HTML} mails might have the trick of spammers using
+@samp{<img>} tags.  It is likely to be intended to verify whether you
+have read the mail.  You can prevent your personal informations from
+leaking by setting this option to @code{nil} (which is the default).
+It is currently ignored by Emacs/w3.  For emacs-w3m, you may use the
+command @kbd{t} on the image anchor to show an image even if it is
+@code{nil}.@footnote{The command @kbd{T} will load all images.  If you
+have set the option @code{w3m-key-binding} to @code{info}, use @kbd{i}
+or @kbd{I} instead.}
+
+@item mm-w3m-safe-url-regexp
+@vindex mm-w3m-safe-url-regexp
+A regular expression that matches safe URL names, i.e. URLs that are
+unlikely to leak personal information when rendering @acronym{HTML}
+email (the default value is @samp{\\`cid:}).  If @code{nil} consider
+all URLs safe.
+
+@item mm-inline-text-html-with-w3m-keymap
+@vindex mm-inline-text-html-with-w3m-keymap
+You can use emacs-w3m command keys in the inlined text/html part by
+setting this option to non-@code{nil}.  The default value is @code{t}.
+
+@item mm-external-terminal-program
+@vindex mm-external-terminal-program
+The program used to start an external terminal.
+
+@item mm-enable-external
+@vindex mm-enable-external
+Indicate whether external @acronym{MIME} handlers should be used.
+
+If @code{t}, all defined external @acronym{MIME} handlers are used.  If
+@code{nil}, files are saved to disk (@code{mailcap-save-binary-file}).
+If it is the symbol @code{ask}, you are prompted before the external
+@acronym{MIME} handler is invoked.
+
+When you launch an attachment through mailcap (@pxref{mailcap}) an
+attempt is made to use a safe viewer with the safest options---this isn't
+the case if you save it to disk and launch it in a different way
+(command line or double-clicking).  Anyhow, if you want to be sure not
+to launch any external programs, set this variable to @code{nil} or
+@code{ask}.
+
+@end table
+
+@node Files and Directories
+@section Files and Directories
+
+@table @code
+
+@item mm-default-directory
+@vindex mm-default-directory
+The default directory for saving attachments.  If @code{nil} use
+@code{default-directory}.
+
+@item mm-tmp-directory
+@vindex mm-tmp-directory
+Directory for storing temporary files.
+
+@item mm-file-name-rewrite-functions
+@vindex mm-file-name-rewrite-functions
+A list of functions used for rewriting file names of @acronym{MIME}
+parts.  Each function is applied successively to the file name.
+Ready-made functions include
+
+@table @code
+@item mm-file-name-delete-control
+@findex mm-file-name-delete-control
+Delete all control characters.
+
+@item mm-file-name-delete-gotchas
+@findex mm-file-name-delete-gotchas
+Delete characters that could have unintended consequences when used
+with flawed shell scripts, i.e. @samp{|}, @samp{>} and @samp{<}; and
+@samp{-}, @samp{.} as the first character.
+
+@item mm-file-name-delete-whitespace
+@findex mm-file-name-delete-whitespace
+Remove all whitespace.
+
+@item mm-file-name-trim-whitespace
+@findex mm-file-name-trim-whitespace
+Remove leading and trailing whitespace.
+
+@item mm-file-name-collapse-whitespace
+@findex mm-file-name-collapse-whitespace
+Collapse multiple whitespace characters.
+
+@item mm-file-name-replace-whitespace
+@findex mm-file-name-replace-whitespace
+@vindex mm-file-name-replace-whitespace
+Replace whitespace with underscores.  Set the variable
+@code{mm-file-name-replace-whitespace} to any other string if you do
+not like underscores.
+@end table
+
+The standard Emacs functions @code{capitalize}, @code{downcase},
+@code{upcase} and @code{upcase-initials} might also prove useful.
+
+@item mm-path-name-rewrite-functions
+@vindex mm-path-name-rewrite-functions
+List of functions used for rewriting the full file names of @acronym{MIME}
+parts.  This is used when viewing parts externally, and is meant for
+transforming the absolute name so that non-compliant programs can find
+the file where it's saved.
+
+@end table
+
+@node New Viewers
+@section New Viewers
+
+Here's an example viewer for displaying @code{text/enriched} inline:
+
+@lisp
+(defun mm-display-enriched-inline (handle)
+  (let (text)
+    (with-temp-buffer
+      (mm-insert-part handle)
+      (save-window-excursion
+        (enriched-decode (point-min) (point-max))
+        (setq text (buffer-string))))
+    (mm-insert-inline handle text)))
+@end lisp
+
+We see that the function takes a @acronym{MIME} handle as its parameter.  It
+then goes to a temporary buffer, inserts the text of the part, does some
+work on the text, stores the result, goes back to the buffer it was
+called from and inserts the result.
+
+The two important helper functions here are @code{mm-insert-part} and
+@code{mm-insert-inline}.  The first function inserts the text of the
+handle in the current buffer.  It handles charset and/or content
+transfer decoding.  The second function just inserts whatever text you
+tell it to insert, but it also sets things up so that the text can be
+``undisplayed'' in a convenient manner.
+
+
+@node Composing
+@chapter Composing
+@cindex Composing
+@cindex MIME Composing
+@cindex MML
+@cindex MIME Meta Language
+
+Creating a @acronym{MIME} message is boring and non-trivial.  Therefore,
+a library called @code{mml} has been defined that parses a language
+called @acronym{MML} (@acronym{MIME} Meta Language) and generates
+@acronym{MIME} messages.
+
+@findex mml-generate-mime
+The main interface function is @code{mml-generate-mime}.  It will
+examine the contents of the current (narrowed-to) buffer and return a
+string containing the @acronym{MIME} message.
+
+@menu
+* Simple MML Example::             An example @acronym{MML} document.
+* MML Definition::                 All valid @acronym{MML} elements.
+* Advanced MML Example::           Another example @acronym{MML} document.
+* Encoding Customization::         Variables that affect encoding.
+* Charset Translation::            How charsets are mapped from @sc{mule} to @acronym{MIME}.
+* Conversion::                     Going from @acronym{MIME} to @acronym{MML} and vice versa.
+* Flowed text::                    Soft and hard newlines.
+@end menu
+
+
+@node Simple MML Example
+@section Simple MML Example
+
+Here's a simple @samp{multipart/alternative}:
+
+@example
+<#multipart type=alternative>
+This is a plain text part.
+<#part type=text/enriched>
+<center>This is a centered enriched part</center>
+<#/multipart>
+@end example
+
+After running this through @code{mml-generate-mime}, we get this:
+
+@example
+Content-Type: multipart/alternative; boundary="=-=-="
+
+
+--=-=-=
+
+
+This is a plain text part.
+
+--=-=-=
+Content-Type: text/enriched
+
+
+<center>This is a centered enriched part</center>
+
+--=-=-=--
+@end example
+
+
+@node MML Definition
+@section MML Definition
+
+The @acronym{MML} language is very simple.  It looks a bit like an SGML
+application, but it's not.
+
+The main concept of @acronym{MML} is the @dfn{part}.  Each part can be of a
+different type or use a different charset.  The way to delineate a part
+is with a @samp{<#part ...>} tag.  Multipart parts can be introduced
+with the @samp{<#multipart ...>} tag.  Parts are ended by the
+@samp{<#/part>} or @samp{<#/multipart>} tags.  Parts started with the
+@samp{<#part ...>} tags are also closed by the next open tag.
+
+There's also the @samp{<#external ...>} tag.  These introduce
+@samp{external/message-body} parts.
+
+Each tag can contain zero or more parameters on the form
+@samp{parameter=value}.  The values may be enclosed in quotation marks,
+but that's not necessary unless the value contains white space.  So
+@samp{filename=/home/user/#hello$^yes} is perfectly valid.
+
+The following parameters have meaning in @acronym{MML}; parameters that have no
+meaning are ignored.  The @acronym{MML} parameter names are the same as the
+@acronym{MIME} parameter names; the things in the parentheses say which
+header it will be used in.
+
+@table @samp
+@item type
+The @acronym{MIME} type of the part (@code{Content-Type}).
+
+@item filename
+Use the contents of the file in the body of the part
+(@code{Content-Disposition}).
+
+@item charset
+The contents of the body of the part are to be encoded in the character
+set specified (@code{Content-Type}). @xref{Charset Translation}.
+
+@item name
+Might be used to suggest a file name if the part is to be saved
+to a file (@code{Content-Type}).
+
+@item disposition
+Valid values are @samp{inline} and @samp{attachment}
+(@code{Content-Disposition}).
+
+@item encoding
+Valid values are @samp{7bit}, @samp{8bit}, @samp{quoted-printable} and
+@samp{base64} (@code{Content-Transfer-Encoding}). @xref{Charset
+Translation}.
+
+@item description
+A description of the part (@code{Content-Description}).
+
+@item creation-date
+RFC822 date when the part was created (@code{Content-Disposition}).
+
+@item modification-date
+RFC822 date when the part was modified (@code{Content-Disposition}).
+
+@item read-date
+RFC822 date when the part was read (@code{Content-Disposition}).
+
+@item recipients
+Who to encrypt/sign the part to.  This field is used to override any
+auto-detection based on the To/CC headers.
+
+@item sender
+Identity used to sign the part.  This field is used to override the
+default key used.
+
+@item size
+The size (in octets) of the part (@code{Content-Disposition}).
+
+@item sign
+What technology to sign this @acronym{MML} part with (@code{smime}, @code{pgp}
+or @code{pgpmime})
+
+@item encrypt
+What technology to encrypt this @acronym{MML} part with (@code{smime},
+@code{pgp} or @code{pgpmime})
+
+@end table
+
+Parameters for @samp{text/plain}:
+
+@table @samp
+@item format
+Formatting parameter for the text, valid values include @samp{fixed}
+(the default) and @samp{flowed}.  Normally you do not specify this
+manually, since it requires the textual body to be formatted in a
+special way described in RFC 2646.  @xref{Flowed text}.
+@end table
+
+Parameters for @samp{application/octet-stream}:
+
+@table @samp
+@item type
+Type of the part; informal---meant for human readers
+(@code{Content-Type}).
+@end table
+
+Parameters for @samp{message/external-body}:
+
+@table @samp
+@item access-type
+A word indicating the supported access mechanism by which the file may
+be obtained.  Values include @samp{ftp}, @samp{anon-ftp}, @samp{tftp},
+@samp{localfile}, and @samp{mailserver}.  (@code{Content-Type}.)
+
+@item expiration
+The RFC822 date after which the file may no longer be fetched.
+(@code{Content-Type}.)
+
+@item size
+The size (in octets) of the file.  (@code{Content-Type}.)
+
+@item permission
+Valid values are @samp{read} and @samp{read-write}
+(@code{Content-Type}).
+
+@end table
+
+Parameters for @samp{sign=smime}:
+
+@table @samp
+
+@item keyfile
+File containing key and certificate for signer.
+
+@end table
+
+Parameters for @samp{encrypt=smime}:
+
+@table @samp
+
+@item certfile
+File containing certificate for recipient.
+
+@end table
+
+
+@node Advanced MML Example
+@section Advanced MML Example
+
+Here's a complex multipart message.  It's a @samp{multipart/mixed} that
+contains many parts, one of which is a @samp{multipart/alternative}.
+
+@example
+<#multipart type=mixed>
+<#part type=image/jpeg filename=~/rms.jpg disposition=inline>
+<#multipart type=alternative>
+This is a plain text part.
+<#part type=text/enriched name=enriched.txt>
+<center>This is a centered enriched part</center>
+<#/multipart>
+This is a new plain text part.
+<#part disposition=attachment>
+This plain text part is an attachment.
+<#/multipart>
+@end example
+
+And this is the resulting @acronym{MIME} message:
+
+@example
+Content-Type: multipart/mixed; boundary="=-=-="
+
+
+--=-=-=
+
+
+
+--=-=-=
+Content-Type: image/jpeg;
+ filename="~/rms.jpg"
+Content-Disposition: inline;
+ filename="~/rms.jpg"
+Content-Transfer-Encoding: base64
+
+/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRof
+Hh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCAAwADABAREA/8QAHwAA
+AQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQR
+BRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RF
+RkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ip
+qrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEB
+AAA/AO/rifFHjldNuGsrDa0qcSSHkA+gHrXKw+LtWLrMb+RgTyhbr+HSug07xNqV9fQtZrNI
+AyiaE/NuBPOOOP0rvRNE880KOC8TbXXGCv1FPqjrF4LDR7u5L7SkTFT/ALWOP1xXgTuXfc7E
+sx6nua6rwp4IvvEM8chCxWxOdzn7wz6V9AaB4S07w9p5itow0rDLSY5Pt9K43xO66P4xs71m
+2QXiGCbA4yOVJ9+1aYORkdK434lyNH4ahCnG66VT9Nj15JFbPdX0MS43M4VQf5/yr2vSpLnw
+5ZW8dlCZ8KFXjOPX0/mK6rSPEGt3Angu44fNEReHYNvIH3TzXDeKNO8RX+kSX2ouZkicTIOc
+L+g7E810ulFjpVtv3bwgB3HJyK5L4quY/C9sVxk3ij/xx6850u7t1mtp/wDlpEw3An3Jr3Dw
+34gsbWza4nBlhC5LDsaW6+IFgupQyCF3iHH7gA7c9R9ay7zx6t7aX9jHC4smhfBkGCvHGfrm
+tLQ7hbnRrV1GPkAP1x1/Hr+Ncr8Vzjwrbf8AX6v/AKA9eQRyYlQk8Yx9K6XTNbkgia2ciSIn
+7p5Ga9Atte0LTLKO6it4i7dVRFJDcZ4PvXN+JvEMF9bILVGXJLSZ4zkjivRPDaeX4b08HOTC
+pOffmua+KkbS+GLVUGT9tT/0B68eeIpIFYjB70+OOVXyoOM9+M1eaWeCLzHPyHGO/NVWvJJm
+jQ8KGH1NfQWhXSXmh2c8eArRLwO3HSv/2Q==
+
+--=-=-=
+Content-Type: multipart/alternative; boundary="==-=-="
+
+
+--==-=-=
+
+
+This is a plain text part.
+
+--==-=-=
+Content-Type: text/enriched;
+ name="enriched.txt"
+
+
+<center>This is a centered enriched part</center>
+
+--==-=-=--
+
+--=-=-=
+
+This is a new plain text part.
+
+--=-=-=
+Content-Disposition: attachment
+
+
+This plain text part is an attachment.
+
+--=-=-=--
+@end example
+
+@node Encoding Customization
+@section Encoding Customization
+
+@table @code
+
+@item mm-body-charset-encoding-alist
+@vindex mm-body-charset-encoding-alist
+Mapping from @acronym{MIME} charset to encoding to use.  This variable is
+usually used except, e.g., when other requirements force a specific
+encoding (digitally signed messages require 7bit encodings).  The
+default is
+
+@lisp
+((iso-2022-jp . 7bit)
+ (iso-2022-jp-2 . 7bit)
+ (utf-16 . base64)
+ (utf-16be . base64)
+ (utf-16le . base64))
+@end lisp
+
+As an example, if you do not want to have ISO-8859-1 characters
+quoted-printable encoded, you may add @code{(iso-8859-1 . 8bit)} to
+this variable.  You can override this setting on a per-message basis
+by using the @code{encoding} @acronym{MML} tag (@pxref{MML Definition}).
+
+@item mm-coding-system-priorities
+@vindex mm-coding-system-priorities
+Prioritize coding systems to use for outgoing messages.  The default
+is @code{nil}, which means to use the defaults in Emacs, but is
+@code{(iso-8859-1 iso-2022-jp iso-2022-jp-2 shift_jis utf-8)} when
+running Emacs in the Japanese language environment.  It is a list of
+coding system symbols (aliases of coding systems are also allowed, use
+@kbd{M-x describe-coding-system} to make sure you are specifying correct
+coding system names).  For example, if you have configured Emacs
+to prefer UTF-8, but wish that outgoing messages should be sent in
+ISO-8859-1 if possible, you can set this variable to
+@code{(iso-8859-1)}.  You can override this setting on a per-message
+basis by using the @code{charset} @acronym{MML} tag (@pxref{MML Definition}).
+
+@item mm-content-transfer-encoding-defaults
+@vindex mm-content-transfer-encoding-defaults
+Mapping from @acronym{MIME} types to encoding to use.  This variable is usually
+used except, e.g., when other requirements force a safer encoding
+(digitally signed messages require 7bit encoding).  Besides the normal
+@acronym{MIME} encodings, @code{qp-or-base64} may be used to indicate that for
+each case the most efficient of quoted-printable and base64 should be
+used.
+
+@code{qp-or-base64} has another effect.  It will fold long lines so that
+MIME parts may not be broken by MTA.  So do @code{quoted-printable} and
+@code{base64}.
+
+Note that it affects body encoding only when a part is a raw forwarded
+message (which will be made by @code{gnus-summary-mail-forward} with the
+arg 2 for example) or is neither the @samp{text/*} type nor the
+@samp{message/*} type.  Even though in those cases, you can override
+this setting on a per-message basis by using the @code{encoding}
+@acronym{MML} tag (@pxref{MML Definition}).
+
+@item mm-use-ultra-safe-encoding
+@vindex mm-use-ultra-safe-encoding
+When this is non-@code{nil}, it means that textual parts are encoded as
+quoted-printable if they contain lines longer than 76 characters or
+starting with "From " in the body.  Non-7bit encodings (8bit, binary)
+are generally disallowed.  This reduce the probability that a non-8bit
+clean MTA or MDA changes the message.  This should never be set
+directly, but bound by other functions when necessary (e.g., when
+encoding messages that are to be digitally signed).
+
+@end table
+
+@node Charset Translation
+@section Charset Translation
+@cindex charsets
+
+During translation from @acronym{MML} to @acronym{MIME}, for each
+@acronym{MIME} part which has been composed inside Emacs, an appropriate
+charset has to be chosen.
+
+@vindex mail-parse-charset
+If you are running a non-@sc{mule} Emacs, this process is simple: If the
+part contains any non-@acronym{ASCII} (8-bit) characters, the @acronym{MIME} charset
+given by @code{mail-parse-charset} (a symbol) is used.  (Never set this
+variable directly, though.  If you want to change the default charset,
+please consult the documentation of the package which you use to process
+@acronym{MIME} messages.
+@xref{Various Message Variables, , Various Message Variables, message,
+      Message Manual}, for example.)
+If there are only @acronym{ASCII} characters, the @acronym{MIME} charset US-ASCII is
+used, of course.
+
+@cindex MULE
+@cindex UTF-8
+@cindex Unicode
+@vindex mm-mime-mule-charset-alist
+Things are slightly more complicated when running Emacs with @sc{mule}
+support.  In this case, a list of the @sc{mule} charsets used in the
+part is obtained, and the @sc{mule} charsets are translated to
+@acronym{MIME} charsets by consulting the table provided by Emacs itself
+or the variable @code{mm-mime-mule-charset-alist} for XEmacs.
+If this results in a single @acronym{MIME} charset, this is used to encode
+the part.  But if the resulting list of @acronym{MIME} charsets contains more
+than one element, two things can happen: If it is possible to encode the
+part via UTF-8, this charset is used.  (For this, Emacs must support
+the @code{utf-8} coding system, and the part must consist entirely of
+characters which have Unicode counterparts.)  If UTF-8 is not available
+for some reason, the part is split into several ones, so that each one
+can be encoded with a single @acronym{MIME} charset.  The part can only be
+split at line boundaries, though---if more than one @acronym{MIME} charset is
+required to encode a single line, it is not possible to encode the part.
+
+When running Emacs with @sc{mule} support, the preferences for which
+coding system to use is inherited from Emacs itself.  This means that
+if Emacs is set up to prefer UTF-8, it will be used when encoding
+messages.  You can modify this by altering the
+@code{mm-coding-system-priorities} variable though (@pxref{Encoding
+Customization}).
+
+The charset to be used can be overridden by setting the @code{charset}
+@acronym{MML} tag (@pxref{MML Definition}) when composing the message.
+
+The encoding of characters (quoted-printable, 8bit etc) is orthogonal
+to the discussion here, and is controlled by the variables
+@code{mm-body-charset-encoding-alist} and
+@code{mm-content-transfer-encoding-defaults} (@pxref{Encoding
+Customization}).
+
+@node Conversion
+@section Conversion
+
+@findex mime-to-mml
+A (multipart) @acronym{MIME} message can be converted to @acronym{MML}
+with the @code{mime-to-mml} function.  It works on the message in the
+current buffer, and substitutes @acronym{MML} markup for @acronym{MIME}
+boundaries.  Non-textual parts do not have their contents in the buffer,
+but instead have the contents in separate buffers that are referred to
+from the @acronym{MML} tags.
+
+@findex mml-to-mime
+An @acronym{MML} message can be converted back to @acronym{MIME} by the
+@code{mml-to-mime} function.
+
+These functions are in certain senses ``lossy''---you will not get back
+an identical message if you run @code{mime-to-mml} and then
+@code{mml-to-mime}.  Not only will trivial things like the order of the
+headers differ, but the contents of the headers may also be different.
+For instance, the original message may use base64 encoding on text,
+while @code{mml-to-mime} may decide to use quoted-printable encoding, and
+so on.
+
+In essence, however, these two functions should be the inverse of each
+other.  The resulting contents of the message should remain equivalent,
+if not identical.
+
+
+@node Flowed text
+@section Flowed text
+@cindex format=flowed
+
+The Emacs @acronym{MIME} library will respect the @code{use-hard-newlines}
+variable (@pxref{Hard and Soft Newlines, ,Hard and Soft Newlines,
+emacs, Emacs Manual}) when encoding a message, and the
+``format=flowed'' Content-Type parameter when decoding a message.
+
+On encoding text, regardless of @code{use-hard-newlines}, lines
+terminated by soft newline characters are filled together and wrapped
+after the column decided by @code{fill-flowed-encode-column}.
+Quotation marks (matching @samp{^>* ?}) are respected.  The variable
+controls how the text will look in a client that does not support
+flowed text, the default is to wrap after 66 characters.  If hard
+newline characters are not present in the buffer, no flow encoding
+occurs.
+
+On decoding flowed text, lines with soft newline characters are filled
+together and wrapped after the column decided by
+@code{fill-flowed-display-column}.  The default is to wrap after
+@code{fill-column}.
+
+@table @code
+@item mm-fill-flowed
+@vindex mm-fill-flowed
+If non-@code{nil} a format=flowed article will be displayed flowed.
+@end table
+
+
+@node Interface Functions
+@chapter Interface Functions
+@cindex interface functions
+@cindex mail-parse
+
+The @code{mail-parse} library is an abstraction over the actual
+low-level libraries that are described in the next chapter.
+
+Standards change, and so programs have to change to fit in the new
+mold.  For instance, RFC2045 describes a syntax for the
+@code{Content-Type} header that only allows @acronym{ASCII} characters in the
+parameter list.  RFC2231 expands on RFC2045 syntax to provide a scheme
+for continuation headers and non-@acronym{ASCII} characters.
+
+The traditional way to deal with this is just to update the library
+functions to parse the new syntax.  However, this is sometimes the wrong
+thing to do.  In some instances it may be vital to be able to understand
+both the old syntax as well as the new syntax, and if there is only one
+library, one must choose between the old version of the library and the
+new version of the library.
+
+The Emacs @acronym{MIME} library takes a different tack.  It defines a
+series of low-level libraries (@file{rfc2047.el}, @file{rfc2231.el}
+and so on) that parses strictly according to the corresponding
+standard.  However, normal programs would not use the functions
+provided by these libraries directly, but instead use the functions
+provided by the @code{mail-parse} library.  The functions in this
+library are just aliases to the corresponding functions in the latest
+low-level libraries.  Using this scheme, programs get a consistent
+interface they can use, and library developers are free to create
+write code that handles new standards.
+
+The following functions are defined by this library:
+
+@table @code
+@item mail-header-parse-content-type
+@findex mail-header-parse-content-type
+Parse a @code{Content-Type} header and return a list on the following
+format:
+
+@lisp
+("type/subtype"
+ (attribute1 . value1)
+ (attribute2 . value2)
+ ...)
+@end lisp
+
+Here's an example:
+
+@example
+(mail-header-parse-content-type
+ "image/gif; name=\"b980912.gif\"")
+@result{} ("image/gif" (name . "b980912.gif"))
+@end example
+
+@item mail-header-parse-content-disposition
+@findex mail-header-parse-content-disposition
+Parse a @code{Content-Disposition} header and return a list on the same
+format as the function above.
+
+@item mail-content-type-get
+@findex mail-content-type-get
+Takes two parameters---a list on the format above, and an attribute.
+Returns the value of the attribute.
+
+@example
+(mail-content-type-get
+ '("image/gif" (name . "b980912.gif")) 'name)
+@result{} "b980912.gif"
+@end example
+
+@item mail-header-encode-parameter
+@findex mail-header-encode-parameter
+Takes a parameter string and returns an encoded version of the string.
+This is used for parameters in headers like @code{Content-Type} and
+@code{Content-Disposition}.
+
+@item mail-header-remove-comments
+@findex mail-header-remove-comments
+Return a comment-free version of a header.
+
+@example
+(mail-header-remove-comments
+ "Gnus/5.070027 (Pterodactyl Gnus v0.27) (Finnish Landrace)")
+@result{} "Gnus/5.070027  "
+@end example
+
+@item mail-header-remove-whitespace
+@findex mail-header-remove-whitespace
+Remove linear white space from a header.  Space inside quoted strings
+and comments is preserved.
+
+@example
+(mail-header-remove-whitespace
+ "image/gif; name=\"Name with spaces\"")
+@result{} "image/gif;name=\"Name with spaces\""
+@end example
+
+@item mail-header-get-comment
+@findex mail-header-get-comment
+Return the last comment in a header.
+
+@example
+(mail-header-get-comment
+ "Gnus/5.070027 (Pterodactyl Gnus v0.27) (Finnish Landrace)")
+@result{} "Finnish Landrace"
+@end example
+
+@item mail-header-parse-address
+@findex mail-header-parse-address
+Parse an address and return a list containing the mailbox and the
+plaintext name.
+
+@example
+(mail-header-parse-address
+ "Hrvoje Niksic <hniksic@@srce.hr>")
+@result{} ("hniksic@@srce.hr" . "Hrvoje Niksic")
+@end example
+
+@item mail-header-parse-addresses
+@findex mail-header-parse-addresses
+Parse a string with list of addresses and return a list of elements like
+the one described above.
+
+@example
+(mail-header-parse-addresses
+ "Hrvoje Niksic <hniksic@@srce.hr>, Steinar Bang <sb@@metis.no>")
+@result{} (("hniksic@@srce.hr" . "Hrvoje Niksic")
+     ("sb@@metis.no" . "Steinar Bang"))
+@end example
+
+@item mail-header-parse-date
+@findex mail-header-parse-date
+Parse a date string and return an Emacs time structure.
+
+@item mail-narrow-to-head
+@findex mail-narrow-to-head
+Narrow the buffer to the header section of the buffer.  Point is placed
+at the beginning of the narrowed buffer.
+
+@item mail-header-narrow-to-field
+@findex mail-header-narrow-to-field
+Narrow the buffer to the header under point.  Understands continuation
+headers.
+
+@item mail-header-fold-field
+@findex mail-header-fold-field
+Fold the header under point.
+
+@item mail-header-unfold-field
+@findex mail-header-unfold-field
+Unfold the header under point.
+
+@item mail-header-field-value
+@findex mail-header-field-value
+Return the value of the field under point.
+
+@item mail-encode-encoded-word-region
+@findex mail-encode-encoded-word-region
+Encode the non-@acronym{ASCII} words in the region.  For instance,
+@samp{Naïve} is encoded as @samp{=?iso-8859-1?q?Na=EFve?=}.
+
+@item mail-encode-encoded-word-buffer
+@findex mail-encode-encoded-word-buffer
+Encode the non-@acronym{ASCII} words in the current buffer.  This function is
+meant to be called narrowed to the headers of a message.
+
+@item mail-encode-encoded-word-string
+@findex mail-encode-encoded-word-string
+Encode the words that need encoding in a string, and return the result.
+
+@example
+(mail-encode-encoded-word-string
+ "This is naïve, baby")
+@result{} "This is =?iso-8859-1?q?na=EFve,?= baby"
+@end example
+
+@item mail-decode-encoded-word-region
+@findex mail-decode-encoded-word-region
+Decode the encoded words in the region.
+
+@item mail-decode-encoded-word-string
+@findex mail-decode-encoded-word-string
+Decode the encoded words in the string and return the result.
+
+@example
+(mail-decode-encoded-word-string
+ "This is =?iso-8859-1?q?na=EFve,?= baby")
+@result{} "This is naïve, baby"
+@end example
+
+@end table
+
+Currently, @code{mail-parse} is an abstraction over @code{ietf-drums},
+@code{rfc2047}, @code{rfc2045} and @code{rfc2231}.  These are documented
+in the subsequent sections.
+
+
+
+@node Basic Functions
+@chapter Basic Functions
+
+This chapter describes the basic, ground-level functions for parsing and
+handling.  Covered here is parsing @code{From} lines, removing comments
+from header lines, decoding encoded words, parsing date headers and so
+on.  High-level functionality is dealt with in the first chapter
+(@pxref{Decoding and Viewing}).
+
+@menu
+* rfc2045::      Encoding @code{Content-Type} headers.
+* rfc2231::      Parsing @code{Content-Type} headers.
+* ietf-drums::   Handling mail headers defined by RFC822bis.
+* rfc2047::      En/decoding encoded words in headers.
+* time-date::    Functions for parsing dates and manipulating time.
+* qp::           Quoted-Printable en/decoding.
+* base64::       Base64 en/decoding.
+* binhex::       Binhex decoding.
+* uudecode::     Uuencode decoding.
+* yenc::         Yenc decoding.
+* rfc1843::      Decoding HZ-encoded text.
+* mailcap::      How parts are displayed is specified by the @file{.mailcap} file
+@end menu
+
+
+@node rfc2045
+@section rfc2045
+
+RFC2045 is the ``main'' @acronym{MIME} document, and as such, one would
+imagine that there would be a lot to implement.  But there isn't, since
+most of the implementation details are delegated to the subsequent
+RFCs.
+
+So @file{rfc2045.el} has only a single function:
+
+@table @code
+@item rfc2045-encode-string
+@findex rfc2045-encode-string
+Takes a parameter and a value and returns a @samp{PARAM=VALUE} string.
+@var{value} will be quoted if there are non-safe characters in it.
+@end table
+
+
+@node rfc2231
+@section rfc2231
+
+RFC2231 defines a syntax for the @code{Content-Type} and
+@code{Content-Disposition} headers.  Its snappy name is @dfn{MIME
+Parameter Value and Encoded Word Extensions: Character Sets, Languages,
+and Continuations}.
+
+In short, these headers look something like this:
+
+@example
+Content-Type: application/x-stuff;
+ title*0*=us-ascii'en'This%20is%20even%20more%20;
+ title*1*=%2A%2A%2Afun%2A%2A%2A%20;
+ title*2="isn't it!"
+@end example
+
+They usually aren't this bad, though.
+
+The following functions are defined by this library:
+
+@table @code
+@item rfc2231-parse-string
+@findex rfc2231-parse-string
+Parse a @code{Content-Type} header and return a list describing its
+elements.
+
+@example
+(rfc2231-parse-string
+ "application/x-stuff;
+ title*0*=us-ascii'en'This%20is%20even%20more%20;
+ title*1*=%2A%2A%2Afun%2A%2A%2A%20;
+ title*2=\"isn't it!\"")
+@result{} ("application/x-stuff"
+    (title . "This is even more ***fun*** isn't it!"))
+@end example
+
+@item rfc2231-get-value
+@findex rfc2231-get-value
+Takes one of the lists on the format above and returns
+the value of the specified attribute.
+
+@item rfc2231-encode-string
+@findex rfc2231-encode-string
+Encode a parameter in headers likes @code{Content-Type} and
+@code{Content-Disposition}.
+
+@end table
+
+
+@node ietf-drums
+@section ietf-drums
+
+@dfn{drums} is an IETF working group that is working on the replacement
+for RFC822.
+
+The functions provided by this library include:
+
+@table @code
+@item ietf-drums-remove-comments
+@findex ietf-drums-remove-comments
+Remove the comments from the argument and return the results.
+
+@item ietf-drums-remove-whitespace
+@findex ietf-drums-remove-whitespace
+Remove linear white space from the string and return the results.
+Spaces inside quoted strings and comments are left untouched.
+
+@item ietf-drums-get-comment
+@findex ietf-drums-get-comment
+Return the last most comment from the string.
+
+@item ietf-drums-parse-address
+@findex ietf-drums-parse-address
+Parse an address string and return a list that contains the mailbox and
+the plain text name.
+
+@item ietf-drums-parse-addresses
+@findex ietf-drums-parse-addresses
+Parse a string that contains any number of comma-separated addresses and
+return a list that contains mailbox/plain text pairs.
+
+@item ietf-drums-parse-date
+@findex ietf-drums-parse-date
+Parse a date string and return an Emacs time structure.
+
+@item ietf-drums-narrow-to-header
+@findex ietf-drums-narrow-to-header
+Narrow the buffer to the header section of the current buffer.
+
+@end table
+
+
+@node rfc2047
+@section rfc2047
+
+RFC2047 (Message Header Extensions for Non-@acronym{ASCII} Text) specifies how
+non-@acronym{ASCII} text in headers are to be encoded.  This is actually rather
+complicated, so a number of variables are necessary to tweak what this
+library does.
+
+The following variables are tweakable:
+
+@table @code
+@item rfc2047-header-encoding-alist
+@vindex rfc2047-header-encoding-alist
+This is an alist of header / encoding-type pairs.  Its main purpose is
+to prevent encoding of certain headers.
+
+The keys can either be header regexps, or @code{t}.
+
+The values can be @code{nil}, in which case the header(s) in question
+won't be encoded, @code{mime}, which means that they will be encoded, or
+@code{address-mime}, which means the header(s) will be encoded carefully
+assuming they contain addresses.
+
+@item rfc2047-charset-encoding-alist
+@vindex rfc2047-charset-encoding-alist
+RFC2047 specifies two forms of encoding---@code{Q} (a
+Quoted-Printable-like encoding) and @code{B} (base64).  This alist
+specifies which charset should use which encoding.
+
+@item rfc2047-encode-function-alist
+@vindex rfc2047-encode-function-alist
+This is an alist of encoding / function pairs.  The encodings are
+@code{Q}, @code{B} and @code{nil}.
+
+@item rfc2047-encoded-word-regexp
+@vindex rfc2047-encoded-word-regexp
+When decoding words, this library looks for matches to this regexp.
+
+@item rfc2047-encode-encoded-words
+@vindex rfc2047-encode-encoded-words
+The boolean variable specifies whether encoded words
+(e.g. @samp{=?hello?=}) should be encoded again.
+
+@end table
+
+Those were the variables, and these are this functions:
+
+@table @code
+@item rfc2047-narrow-to-field
+@findex rfc2047-narrow-to-field
+Narrow the buffer to the header on the current line.
+
+@item rfc2047-encode-message-header
+@findex rfc2047-encode-message-header
+Should be called narrowed to the header of a message.  Encodes according
+to @code{rfc2047-header-encoding-alist}.
+
+@item rfc2047-encode-region
+@findex rfc2047-encode-region
+Encodes all encodable words in the region specified.
+
+@item rfc2047-encode-string
+@findex rfc2047-encode-string
+Encode a string and return the results.
+
+@item rfc2047-decode-region
+@findex rfc2047-decode-region
+Decode the encoded words in the region.
+
+@item rfc2047-decode-string
+@findex rfc2047-decode-string
+Decode a string and return the results.
+
+@item rfc2047-encode-parameter
+@findex rfc2047-encode-parameter
+Encode a parameter in the RFC2047-like style.  This is a replacement for
+the @code{rfc2231-encode-string} function.  @xref{rfc2231}.
+
+When attaching files as @acronym{MIME} parts, we should use the RFC2231
+encoding to specify the file names containing non-@acronym{ASCII}
+characters.  However, many mail softwares don't support it in practice
+and recipients won't be able to extract files with correct names.
+Instead, the RFC2047-like encoding is acceptable generally.  This
+function provides the very RFC2047-like encoding, resigning to such a
+regrettable trend.  To use it, put the following line in your
+@file{~/.gnus.el} file:
+
+@lisp
+(defalias 'mail-header-encode-parameter 'rfc2047-encode-parameter)
+@end lisp
+
+@end table
+
+
+@node time-date
+@section time-date
+
+While not really a part of the @acronym{MIME} library, it is convenient to
+document this library here.  It deals with parsing @code{Date} headers
+and manipulating time.  (Not by using tesseracts, though, I'm sorry to
+say.)
+
+These functions convert between five formats: A date string, an Emacs
+time structure, a decoded time list, a second number, and a day number.
+
+Here's a bunch of time/date/second/day examples:
+
+@example
+(parse-time-string "Sat Sep 12 12:21:54 1998 +0200")
+@result{} (54 21 12 12 9 1998 6 nil 7200)
+
+(date-to-time "Sat Sep 12 12:21:54 1998 +0200")
+@result{} (13818 19266)
+
+(time-to-seconds '(13818 19266))
+@result{} 905595714.0
+
+(seconds-to-time 905595714.0)
+@result{} (13818 19266 0)
+
+(time-to-days '(13818 19266))
+@result{} 729644
+
+(days-to-time 729644)
+@result{} (961933 65536)
+
+(time-since '(13818 19266))
+@result{} (0 430)
+
+(time-less-p '(13818 19266) '(13818 19145))
+@result{} nil
+
+(subtract-time '(13818 19266) '(13818 19145))
+@result{} (0 121)
+
+(days-between "Sat Sep 12 12:21:54 1998 +0200"
+              "Sat Sep 07 12:21:54 1998 +0200")
+@result{} 5
+
+(date-leap-year-p 2000)
+@result{} t
+
+(time-to-day-in-year '(13818 19266))
+@result{} 255
+
+(time-to-number-of-days
+ (time-since
+  (date-to-time "Mon, 01 Jan 2001 02:22:26 GMT")))
+@result{} 4.146122685185185
+@end example
+
+And finally, we have @code{safe-date-to-time}, which does the same as
+@code{date-to-time}, but returns a zero time if the date is
+syntactically malformed.
+
+The five data representations used are the following:
+
+@table @var
+@item date
+An RFC822 (or similar) date string.  For instance: @code{"Sat Sep 12
+12:21:54 1998 +0200"}.
+
+@item time
+An internal Emacs time.  For instance: @code{(13818 26466)}.
+
+@item seconds
+A floating point representation of the internal Emacs time.  For
+instance: @code{905595714.0}.
+
+@item days
+An integer number representing the number of days since 00000101.  For
+instance: @code{729644}.
+
+@item decoded time
+A list of decoded time.  For instance: @code{(54 21 12 12 9 1998 6 t
+7200)}.
+@end table
+
+All the examples above represent the same moment.
+
+These are the functions available:
+
+@table @code
+@item date-to-time
+Take a date and return a time.
+
+@item time-to-seconds
+Take a time and return seconds.
+
+@item seconds-to-time
+Take seconds and return a time.
+
+@item time-to-days
+Take a time and return days.
+
+@item days-to-time
+Take days and return a time.
+
+@item date-to-day
+Take a date and return days.
+
+@item time-to-number-of-days
+Take a time and return the number of days that represents.
+
+@item safe-date-to-time
+Take a date and return a time.  If the date is not syntactically valid,
+return a ``zero'' time.
+
+@item time-less-p
+Take two times and say whether the first time is less (i. e., earlier)
+than the second time.
+
+@item time-since
+Take a time and return a time saying how long it was since that time.
+
+@item subtract-time
+Take two times and subtract the second from the first.  I. e., return
+the time between the two times.
+
+@item days-between
+Take two days and return the number of days between those two days.
+
+@item date-leap-year-p
+Take a year number and say whether it's a leap year.
+
+@item time-to-day-in-year
+Take a time and return the day number within the year that the time is
+in.
+
+@end table
+
+
+@node qp
+@section qp
+
+This library deals with decoding and encoding Quoted-Printable text.
+
+Very briefly explained, qp encoding means translating all 8-bit
+characters (and lots of control characters) into things that look like
+@samp{=EF}; that is, an equal sign followed by the byte encoded as a hex
+string.
+
+The following functions are defined by the library:
+
+@table @code
+@item quoted-printable-decode-region
+@findex quoted-printable-decode-region
+QP-decode all the encoded text in the specified region.
+
+@item quoted-printable-decode-string
+@findex quoted-printable-decode-string
+Decode the QP-encoded text in a string and return the results.
+
+@item quoted-printable-encode-region
+@findex quoted-printable-encode-region
+QP-encode all the encodable characters in the specified region.  The third
+optional parameter @var{fold} specifies whether to fold long lines.
+(Long here means 72.)
+
+@item quoted-printable-encode-string
+@findex quoted-printable-encode-string
+QP-encode all the encodable characters in a string and return the
+results.
+
+@end table
+
+
+@node base64
+@section base64
+@cindex base64
+
+Base64 is an encoding that encodes three bytes into four characters,
+thereby increasing the size by about 33%.  The alphabet used for
+encoding is very resistant to mangling during transit.
+
+The following functions are defined by this library:
+
+@table @code
+@item base64-encode-region
+@findex base64-encode-region
+base64 encode the selected region.  Return the length of the encoded
+text.  Optional third argument @var{no-line-break} means do not break
+long lines into shorter lines.
+
+@item base64-encode-string
+@findex base64-encode-string
+base64 encode a string and return the result.
+
+@item base64-decode-region
+@findex base64-decode-region
+base64 decode the selected region.  Return the length of the decoded
+text.  If the region can't be decoded, return @code{nil} and don't
+modify the buffer.
+
+@item base64-decode-string
+@findex base64-decode-string
+base64 decode a string and return the result.  If the string can't be
+decoded, @code{nil} is returned.
+
+@end table
+
+
+@node binhex
+@section binhex
+@cindex binhex
+@cindex Apple
+@cindex Macintosh
+
+@code{binhex} is an encoding that originated in Macintosh environments.
+The following function is supplied to deal with these:
+
+@table @code
+@item binhex-decode-region
+@findex binhex-decode-region
+Decode the encoded text in the region.  If given a third parameter, only
+decode the @code{binhex} header and return the filename.
+
+@end table
+
+@node uudecode
+@section uudecode
+@cindex uuencode
+@cindex uudecode
+
+@code{uuencode} is probably still the most popular encoding of binaries
+used on Usenet, although @code{base64} rules the mail world.
+
+The following function is supplied by this package:
+
+@table @code
+@item uudecode-decode-region
+@findex uudecode-decode-region
+Decode the text in the region.
+@end table
+
+
+@node yenc
+@section yenc
+@cindex yenc
+
+@code{yenc} is used for encoding binaries on Usenet.  The following
+function is supplied by this package:
+
+@table @code
+@item yenc-decode-region
+@findex yenc-decode-region
+Decode the encoded text in the region.
+
+@end table
+
+
+@node rfc1843
+@section rfc1843
+@cindex rfc1843
+@cindex HZ
+@cindex Chinese
+
+RFC1843 deals with mixing Chinese and @acronym{ASCII} characters in messages.  In
+essence, RFC1843 switches between @acronym{ASCII} and Chinese by doing this:
+
+@example
+This sentence is in @acronym{ASCII}.
+The next sentence is in GB.~@{<:Ky2;S@{#,NpJ)l6HK!#~@}Bye.
+@end example
+
+Simple enough, and widely used in China.
+
+The following functions are available to handle this encoding:
+
+@table @code
+@item rfc1843-decode-region
+Decode HZ-encoded text in the region.
+
+@item rfc1843-decode-string
+Decode a HZ-encoded string and return the result.
+
+@end table
+
+
+@node mailcap
+@section mailcap
+
+The @file{~/.mailcap} file is parsed by most @acronym{MIME}-aware message
+handlers and describes how elements are supposed to be displayed.
+Here's an example file:
+
+@example
+image/*; gimp -8 %s
+audio/wav; wavplayer %s
+application/msword; catdoc %s ; copiousoutput ; nametemplate=%s.doc
+@end example
+
+This says that all image files should be displayed with @code{gimp},
+that WAVE audio files should be played by @code{wavplayer}, and that
+MS-WORD files should be inlined by @code{catdoc}.
+
+The @code{mailcap} library parses this file, and provides functions for
+matching types.
+
+@table @code
+@item mailcap-mime-data
+@vindex mailcap-mime-data
+This variable is an alist of alists containing backup viewing rules.
+
+@end table
+
+Interface functions:
+
+@table @code
+@item mailcap-parse-mailcaps
+@findex mailcap-parse-mailcaps
+Parse the @file{~/.mailcap} file.
+
+@item mailcap-mime-info
+Takes a @acronym{MIME} type as its argument and returns the matching viewer.
+
+@end table
+
+
+
+
+@node Standards
+@chapter Standards
+
+The Emacs @acronym{MIME} library implements handling of various elements
+according to a (somewhat) large number of RFCs, drafts and standards
+documents.  This chapter lists the relevant ones.  They can all be
+fetched from @uref{http://quimby.gnus.org/notes/}.
+
+@table @dfn
+@item RFC822
+@itemx STD11
+Standard for the Format of ARPA Internet Text Messages.
+
+@item RFC1036
+Standard for Interchange of USENET Messages
+
+@item RFC2045
+Format of Internet Message Bodies
+
+@item RFC2046
+Media Types
+
+@item RFC2047
+Message Header Extensions for Non-@acronym{ASCII} Text
+
+@item RFC2048
+Registration Procedures
+
+@item RFC2049
+Conformance Criteria and Examples
+
+@item RFC2231
+@acronym{MIME} Parameter Value and Encoded Word Extensions: Character Sets,
+Languages, and Continuations
+
+@item RFC1843
+HZ - A Data Format for Exchanging Files of Arbitrarily Mixed Chinese and
+@acronym{ASCII} characters
+
+@item draft-ietf-drums-msg-fmt-05.txt
+Draft for the successor of RFC822
+
+@item RFC2112
+The @acronym{MIME} Multipart/Related Content-type
+
+@item RFC1892
+The Multipart/Report Content Type for the Reporting of Mail System
+Administrative Messages
+
+@item RFC2183
+Communicating Presentation Information in Internet Messages: The
+Content-Disposition Header Field
+
+@item RFC2646
+Documentation of the text/plain format parameter for flowed text.
+
+@end table
+
+@node GNU Free Documentation License
+@chapter GNU Free Documentation License
+@include doclicense.texi
+
+@node Index
+@chapter Index
+@printindex cp
+
+@summarycontents
+@contents
+@bye
+
+\f
+@c Local Variables:
+@c mode: texinfo
+@c coding: iso-8859-1
+@c End:
+
+@ignore
+   arch-tag: c7ef2fd0-a91c-4e10-aa52-c1a2b11b1a8d
+@end ignore
similarity index 96%
rename from man/erc.texi
rename to doc/misc/erc.texi
index 3e52bb42c922e01e9eaa427a32524ecef22d356d..fa5790f152762929d623ead0325cf983440b0f41 100644 (file)
@@ -1,6 +1,6 @@
 \input texinfo
 @c %**start of header
-@setfilename ../info/erc
+@setfilename ../../info/erc
 @settitle ERC Manual
 @c %**end of header
 
@@ -68,6 +68,10 @@ and modified without restriction.
 * Advanced Usage::              Cool ways of using ERC.
 * Getting Help and Reporting Bugs::  
 * History::                     The history of ERC.
+* Copying::                     The GNU General Public License gives you
+                                  permission to redistribute ERC on
+                                  certain terms; it also explains that
+                                  there is no warranty.
 * GNU Free Documentation License:: The license for this documentation.
 * Concept Index::               Search for terms.
 
@@ -389,7 +393,7 @@ buffers in Emacs.  We call these ``query buffers''.
 
 @item highlighting
 
-Some occurences of words can be highlighted, which makes it easier to
+Some occurrences of words can be highlighted, which makes it easier to
 track different kinds of conversations.
 
 @item notification
@@ -900,7 +904,7 @@ stuff, to the current ERC buffer."
 @c previous chapter)
 
 This section has not yet been written.  For now, the easiest way to
-check out the available option for ERC is to do
+check out the available options for ERC is to do
 @kbd{M-x customize-group erc RET}.
 
 
@@ -916,7 +920,7 @@ or if you have bugs to report, there are several places you can go.
 @itemize @bullet
 
 @item
-@uref{http://www.emacswiki.org/cgi-bin/wiki/EmacsIRCClient} is the
+@uref{http://www.emacswiki.org/cgi-bin/wiki/ERC} is the
 emacswiki.org page for ERC.  Anyone may add tips, hints, or bug
 descriptions to it.
 
@@ -929,14 +933,11 @@ The mailing lists are also available on Gmane.
 accessing the mailing lists, adding content to them, and searching them.
 
 @enumerate
-@item gmane.emacs.erc.announce
-Announcements
+@item gmane.emacs.erc.announce: Announcements
 
-@item gmane.emacs.erc.discuss
-General discussion
+@item gmane.emacs.erc.discuss: General discussion
 
-@item gmane.emacs.erc.cvs
-Log messages for changes to the ERC source code
+@item gmane.emacs.erc.cvs: Log messages for changes to the ERC source code
 
 @end enumerate
 
@@ -948,7 +949,7 @@ questions.
 @end itemize
 
 
-@node History, GNU Free Documentation License, Getting Help and Reporting Bugs, Top
+@node History, Copying, Getting Help and Reporting Bugs, Top
 @comment  node-name,  next,  previous,  up
 @chapter History
 @cindex history, of ERC
@@ -1010,8 +1011,12 @@ our revision control system.  Our mailing list address changed as well.
 
 @end itemize
 
-@node GNU Free Documentation License, Concept Index, History, Top
-@appendix GNU Free Documentation License
+@node Copying, GNU Free Documentation License, History, Top
+@comment  node-name,  next,  previous,  up
+@include gpl.texi
+
+@node GNU Free Documentation License, Concept Index, Copying, Top
+@comment  node-name,  next,  previous,  up
 @include doclicense.texi
 
 @node Concept Index,  , GNU Free Documentation License, Top
diff --git a/doc/misc/eshell.texi b/doc/misc/eshell.texi
new file mode 100644 (file)
index 0000000..a6991bb
--- /dev/null
@@ -0,0 +1,948 @@
+\input texinfo  @c -*-texinfo-*-
+@c %**start of header
+@setfilename ../../info/eshell
+@settitle Eshell: The Emacs Shell
+@synindex vr fn
+@c %**end of header
+
+@copying
+This manual is for Eshell, the Emacs shell.
+
+Copyright @copyright{} 1999, 2000, 2001, 2002, 2003, 2004,
+2005, 2006, 2007 Free Software Foundation, Inc.
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with the Front-Cover texts being ``A GNU
+Manual'', and with the Back-Cover Texts as in (a) below.  A copy of the
+license is included in the section entitled ``GNU Free Documentation
+License'' in the Emacs manual.
+
+(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
+this GNU Manual, like GNU software.  Copies published by the Free
+Software Foundation raise funds for GNU development.''
+
+This document is part of a collection distributed under the GNU Free
+Documentation License.  If you want to distribute this document
+separately from the collection, you can do so by adding a copy of the
+license to the document, as described in section 6 of the license.
+@end quotation
+@end copying
+
+@dircategory Emacs
+@direntry
+* Eshell: (eshell).     A command shell implemented in Emacs Lisp.
+@end direntry
+
+@setchapternewpage on
+
+@titlepage
+@sp 4
+@c The title is printed in a large font.
+@center @titlefont{User's Guide}
+@sp
+@center @titlefont{to}
+@sp
+@center @titlefont{Eshell: The Emacs Shell}
+@ignore
+@sp 2
+@center release 2.4
+@c -release-
+@end ignore
+@sp 3
+@center John Wiegley
+@c -date-
+
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+@contents
+
+@c ================================================================
+@c                   The real text starts here
+@c ================================================================
+
+@ifnottex
+@node Top, What is Eshell?, (dir), (dir)
+@top Eshell
+
+This manual documents Eshell, a shell-like command interpretor
+implemented in Emacs Lisp.  It invokes no external processes except for
+those requested by the user.  It is intended to be a functional
+replacement for command shells such as @command{bash}, @command{zsh},
+@command{rc}, or @command{4dos}; since Emacs itself is capable of
+handling the sort of tasks accomplished by those tools.
+@c This manual is updated to release 2.4 of Eshell.
+@end ifnottex
+
+@menu
+* What is Eshell?::             A brief introduction to the Emacs Shell.
+* Command basics::              The basics of command usage.
+* Commands::
+* Arguments::
+* Input/Output::
+* Process control::
+* Extension modules::
+* Extras and Goodies::
+* Bugs and ideas::              Known problems, and future ideas.
+* GNU Free Documentation License:: The license for this documentation.
+* Concept Index::
+* Function and Variable Index::
+* Key Index::
+@end menu
+
+@node What is Eshell?
+@chapter What is Eshell?
+@cindex what is Eshell?
+@cindex Eshell, what it is
+
+Eshell is a @dfn{command shell} written in Emacs Lisp.  Everything it
+does, it uses Emacs' facilities to do.  This means that Eshell is as
+portable as Emacs itself.  It also means that cooperation with Lisp code
+is natural and seamless.
+
+What is a command shell?  To properly understand the role of a shell,
+it's necessary to visualize what a computer does for you.  Basically, a
+computer is a tool; in order to use that tool, you must tell it what to
+do---or give it ``commands.''  These commands take many forms, such as
+clicking with a mouse on certain parts of the screen.  But that is only
+one form of command input.
+
+By far the most versatile way to express what you want the computer to
+do is by using an abbreviated language called @dfn{script}.  In
+script, instead of telling the computer, ``list my files, please'',
+one writes a standard abbreviated command word---@samp{ls}.  Typing
+@samp{ls} in a command shell is a script way of telling the computer
+to list your files.@footnote{This is comparable to viewing the
+contents of a folder using a graphical display.}
+
+The real flexibility of this approach is apparent only when you realize
+that there are many, many different ways to list files.  Perhaps you
+want them sorted by name, sorted by date, in reverse order, or grouped
+by type.  Most graphical browsers have simple ways to express this.  But
+what about showing only a few files, or only files that meet a certain
+criteria?  In very complex and specific situations, the request becomes
+too difficult to express using a mouse or pointing device.  It is just
+these kinds of requests that are easily solved using a command shell.
+
+For example, what if you want to list every Word file on your hard
+drive, larger than 100 kilobytes in size, and which hasn't been looked
+at in over six months?  That is a good candidate list for deletion, when
+you go to clean up your hard drive.  But have you ever tried asking your
+computer for such a list?  There is no way to do it!  At least, not
+without using a command shell.
+
+The role of a command shell is to give you more control over what your
+computer does for you.  Not everyone needs this amount of control, and
+it does come at a cost: Learning the necessary script commands to
+express what you want done.  A complicated query, such as the example
+above, takes time to learn.  But if you find yourself using your
+computer frequently enough, it is more than worthwhile in the long run.
+Any tool you use often deserves the time spent learning to master it.
+@footnote{For the understandably curious, here is what that command
+looks like: But don't let it fool you; once you know what's going on,
+it's easier than it looks: @code{ls -lt **/*.doc(Lk+50aM+5)}.}
+
+@menu
+* Contributors to Eshell::      People who have helped out!
+@end menu
+
+@node Contributors to Eshell
+@section Contributors to Eshell
+@cindex contributors
+@cindex authors
+
+Contributions to Eshell are welcome.  I have limited time to work on
+this project, but I will gladly add any code you contribute to me to
+this package.
+
+The following persons have made contributions to Eshell.
+
+@itemize @bullet
+@item
+Eli Zaretskii made it possible for Eshell to run without requiring
+asynchronous subprocess support.  This is important for MS-DOS, which
+does not have such support.@refill
+
+@item
+Miles Bader contributed many fixes during the port to Emacs 21.@refill
+
+@item
+Stefan Monnier fixed the things which bothered him, which of course made
+things better for all.@refill
+
+@item
+Gerd Moellmann also helped to contribute bug fixes during the initial
+integration with Emacs 21.@refill
+
+@item
+Alex Schroeder contributed code for interactively querying the user
+before overwriting files.@refill
+
+@item
+Sudish Joseph helped with some XEmacs compatibility issues.@refill
+@end itemize
+
+Apart from these, a lot of people have sent suggestions, ideas,
+requests, bug reports and encouragement.  Thanks a lot!  Without you
+there would be no new releases of Eshell.
+
+@node Command basics
+@chapter Basic overview
+
+A command shell is a means of entering verbally-formed commands.  This
+is really all that it does, and every feature described in this manual
+is a means to that end.  Therefore, it's important to take firm hold on
+exactly what a command is, and how it fits in the overall picture of
+things.
+
+@menu
+* Commands verbs::              Commands always begin with a verb.
+* Command arguments::           Some verbs require arguments.
+@end menu
+
+@node Commands verbs
+@section Commands verbs
+
+Commands are expressed using @dfn{script}, a special shorthand language
+computers can understand with no trouble.  Script is an extremely simple
+language; oddly enough, this is what makes it look so complicated!
+Whereas normal languages use a variety of embellishments, the form of a
+script command is always:
+
+@example
+@var{verb} [@var{arguments}]
+@end example
+
+The verb expresses what you want your computer to do.  There are a fixed
+number of verbs, although this number is usually quite large.  On the
+author's computer, it reaches almost 1400 in number.  But of course,
+only a handful of these are really necessary.
+
+Sometimes, the verb is all that's written.  A verb is always a single
+word, usually related to the task it performs.  @command{reboot} is a
+good example.  Entering that on GNU/Linux will reboot the
+computer---assuming you have sufficient privileges.
+
+Other verbs require more information.  These are usually very capable
+verbs, and must be told specifically what to do.  The extra information
+is given in the form of @dfn{arguments}.  For example, the
+@command{echo} verb prints back whatever arguments you type.  It
+requires these arguments to know what to echo.  A proper use of
+@command{echo} looks like this:
+
+@example
+echo This is an example of using echo!
+@end example
+
+This script command causes the computer to echo back: ``This is an
+example of using echo!''
+
+Although command verbs are always simple words, like @command{reboot} or
+@command{echo}, arguments may have a wide variety of forms.  There are
+textual arguments, numerical arguments---even Lisp arguments.
+Distinguishing these different types of arguments requires special
+typing, for the computer to know exactly what you mean.
+
+@node Command arguments
+@section Command arguments
+
+Eshell recognizes several different kinds of command arguments:
+
+@enumerate
+@item Strings (also called textual arguments)
+@item Numbers (floating point or integer)
+@item Lisp lists
+@item Lisp symbols
+@item Emacs buffers
+@item Emacs process handles
+@end enumerate
+
+Most users need to worry only about the first two.  The third, Lisp lists,
+occur very frequently, but almost always behind the scenes.
+
+Strings are the most common type of argument, and consist of nearly any
+character.  Special characters---those used by Eshell
+specifically---must be preceded by a backslash (@samp{\}).  When in doubt, it
+is safe to add backslashes anywhere and everywhere.
+
+Here is a more complicated @command{echo} example:
+
+@example
+echo A\ Multi-word\ Argument\ With\ A\ \$\ dollar
+@end example
+
+Beyond this, things get a bit more complicated.  While not beyond the
+reach of someone wishing to learn, it is definitely beyond the scope of
+this manual to present it all in a simplistic manner.  Get comfortable
+with Eshell as a basic command invocation tool, and learn more about the
+commands on your system; then come back when it all sits more familiarly
+on your mind.  Have fun!
+
+@node Commands
+@chapter Commands
+
+@menu
+* Invocation::
+* Completion::
+* Aliases::
+* History::
+* Scripts::
+* Built-ins::
+@end menu
+
+Essentially, a command shell is all about invoking commands---and
+everything that entails.  So understanding how Eshell invokes commands
+is the key to comprehending how it all works.
+
+@node Invocation
+@section Invocation
+
+Unlike regular system shells, Eshell never invokes kernel functions
+directly, such as @code{exec(3)}.  Instead, it uses the Lisp functions
+available in the Emacs Lisp library.  It does this by transforming the
+command you specify into a callable Lisp form.@footnote{To see the Lisp
+form that will be invoked, type: @samp{eshell-parse-command "echo
+hello"}}
+
+This transformation, from the string of text typed at the command
+prompt, to the ultimate invocation of either a Lisp function or external
+command, follows these steps:
+
+@enumerate
+@item Parse the command string into separate arguments.
+@item
+@end enumerate
+
+@node Completion
+@section Completion
+
+@node Aliases
+@section Aliases
+
+@node History
+@section History
+
+Eshell knows a few built-in variables:
+
+@table @code
+
+@item $+
+@vindex $+
+This variable always contains the current working directory.
+
+@item $-
+@vindex $-
+This variable always contains the previous working directory (the
+current working directory from before the last @code{cd} command).
+
+@end table
+
+@node Scripts
+@section Scripts
+
+
+@node Built-ins
+@section Built-in commands
+
+Here is a list of built-in commands that Eshell knows about:
+
+@table @code
+
+@item cd
+@findex cd
+This command changes the current working directory.  Usually, it is
+invoked as @samp{cd foo} where @file{foo} is the new working
+directory.  But @code{cd} knows about a few special arguments:
+
+When it receives no argument at all, it changes to the home directory.
+
+Giving the command @samp{cd -} changes back to the previous working
+directory (this is the same as @samp{cd $-}).
+
+The command @samp{cd =} shows the directory stack.  Each line is
+numbered.
+
+With @samp{cd =foo}, Eshell searches the directory stack for a
+directory matching the regular expression @samp{foo} and changes to
+that directory.
+
+With @samp{cd -42}, you can access the directory stack by number.
+
+@end table
+
+
+@node Arguments
+@chapter Arguments
+
+@menu
+* The Parser::
+* Variables::
+* Substitution::
+* Globbing::
+* Predicates::
+@end menu
+
+@node The Parser
+@section The Parser
+
+@node Variables
+@section Variables
+
+@node Substitution
+@section Substitution
+
+@node Globbing
+@section Globbing
+
+@node Predicates
+@section Predicates
+
+
+@node Input/Output
+@chapter Input/Output
+
+@node Process control
+@chapter Process control
+
+
+@node Extension modules
+@chapter Extension modules
+
+@menu
+* Writing a module::
+* Module testing::
+* Directory handling::
+* Key rebinding::
+* Smart scrolling::
+* Terminal emulation::
+* Built-in UNIX commands::
+@end menu
+
+@node Writing a module
+@section Writing a module
+
+@node Module testing
+@section Module testing
+
+@node Directory handling
+@section Directory handling
+
+@node Key rebinding
+@section Key rebinding
+
+@node Smart scrolling
+@section Smart scrolling
+
+@node Terminal emulation
+@section Terminal emulation
+
+@node Built-in UNIX commands
+@section Built-in UNIX commands
+
+
+@node Extras and Goodies
+@chapter Extras and Goodies
+
+@node Bugs and ideas
+@chapter Bugs and ideas
+@cindex reporting bugs and ideas
+@cindex bugs, how to report them
+@cindex author, how to reach
+@cindex email to the author
+@cindex FAQ
+@cindex problems, list of common
+
+If you find a bug or misfeature, don't hesitate to let me know!  Send
+email to @email{johnw@@gnu.org}.  Feature requests should also be sent
+there.  I prefer discussing one thing at a time.  If you find several
+unrelated bugs, please report them separately.
+
+If you have ideas for improvements, or if you have written some
+extensions to this package, I would like to hear from you.  I hope you
+find this package useful!
+
+@menu
+* Known problems::
+@end menu
+
+@node Known problems
+@section Known problems
+@cindex known bugs
+@cindex bugs, known
+
+Below is complete list of known problems with Eshell version 2.4.2,
+which is the version included with Emacs 22.
+
+@table @asis
+@item Documentation incomplete
+
+@item Differentiate between aliases and functions
+
+Allow for a bash-compatible syntax, such as:
+
+@example
+alias arg=blah
+function arg () @{ blah $* @}
+@end example
+
+@item @samp{for i in 1 2 3 @{ grep -q a b && *echo has it @} | wc -l} outputs result after prompt
+
+In fact, piping to a process from a looping construct doesn't work in
+general.  If I change the call to @code{eshell-copy-handles} in
+@code{eshell-rewrite-for-command} to use @code{eshell-protect}, it seems
+to work, but the output occurs after the prompt is displayed.  The whole
+structured command thing is too complicated at present.
+
+@item Error with @command{bc} in @code{eshell-test}
+
+On some XEmacs system, the subprocess interaction test fails
+inexplicably, although @command{bc} works fine at the command prompt.
+
+@item Eshell does not delete @file{*Help*} buffers in XEmacs 21.1.8+
+
+In XEmacs 21.1.8, the @file{*Help*} buffer has been renamed such that
+multiple instances of the @file{*Help*} buffer can exist.
+
+@item Pcomplete sometimes gets stuck
+
+You press @key{TAB}, but no completions appear, even though the
+directory has matching files.  This behavior is rare.
+
+@item @samp{grep python $<rpm -qa>} doesn't work, but using @samp{*grep} does
+
+This happens because the @code{grep} Lisp function returns immediately,
+and then the asynchronous @command{grep} process expects to examine the
+temporary file, which has since been deleted.
+
+@item Problem with C-r repeating text
+
+If the text @emph{before point} reads "./run", and you type @kbd{C-r r u
+n}, it will repeat the line for every character typed.
+
+@item Backspace doesn't scroll back after continuing (in smart mode)
+
+Hitting space during a process invocation, such as @command{make}, will
+cause it to track the bottom of the output; but backspace no longer
+scrolls back.
+
+@item It's not possible to fully @code{unload-feature} Eshell
+
+@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 unreproducible
+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
+
+@item Piping to a Lisp function is not supported
+
+Make it so that the Lisp command on the right of the pipe is repeatedly
+called with the input strings as arguments.  This will require changing
+@code{eshell-do-pipeline} to handle non-process targets.
+
+@item Input redirection is not supported
+
+See the above entry.
+
+@item Problem running @command{less} without arguments on Windows
+
+The result in the Eshell buffer is:
+
+@example
+Spawning child process: invalid argument
+@end example
+
+Also a new @command{less} buffer was created with nothing in it@dots{}
+(presumably this holds the output of @command{less}).
+
+If @command{less.exe} is invoked from the Eshell command line, the
+expected output is written to the buffer.
+
+Note that this happens on NT-Emacs 20.6.1 on Windows 2000. The term.el
+package and the supplied shell both use the @command{cmdproxy} program
+for running shells.
+
+@item Implement @samp{-r}, @samp{-n} and @samp{-s} switches for @command{cp}
+
+@item Make @kbd{M-5 M-x eshell} switch to ``*eshell<5>*'', creating if need be
+
+@item @samp{mv @var{dir} @var{file}.tar} does not remove directories
+
+This is because the tar option --remove-files doesn't do so.  Should it
+be Eshell's job?
+
+@item Bind @code{standard-output} and @code{standard-error}
+
+This would be so that if a Lisp function calls @code{print}, everything
+will happen as it should (albeit slowly).
+
+@item When an extension module fails to load, @samp{cd /} gives a Lisp error
+
+@item If a globbing pattern returns one match, should it be a list?
+
+@item Make sure syntax table is correct in Eshell mode
+
+So that @kbd{M-DEL} acts in a predictable manner, etc.
+
+@item Allow all Eshell buffers to share the same history and list-dir
+
+@item There is a problem with script commands that output to @file{/dev/null}
+
+If a script file, somewhere in the middle, uses @samp{> /dev/null},
+output from all subsequent commands is swallowed.
+
+@item Split up parsing of text after @samp{$} in @file{esh-var.el}
+
+Make it similar to the way that @file{esh-arg.el} is structured.
+Then add parsing of @samp{$[?\n]}.
+
+@item After pressing @kbd{M-RET}, redisplay before running the next command
+
+@item Argument predicates and modifiers should work anywhere in a path
+
+@example
+/usr/local/src/editors/vim $ vi **/CVS(/)/Root(.)
+Invalid regexp: "Unmatched ( or \\("
+@end example
+
+With @command{zsh}, the glob above expands to all files named
+@file{Root} in directories named @file{CVS}.
+
+@item Typing @samp{echo $@{locate locate@}/bin<TAB>} results in a Lisp error
+
+Perhaps it should interpolate all permutations, and make that the
+globbing result, since otherwise hitting return here will result in
+``(list of filenames)/bin'', which is never valuable.  Thus, one could
+@command{cat} only C backup files by using @samp{ls $@{identity *.c@}~}.
+In that case, having an alias command name @command{glob} for
+@command{identity} would be useful.
+
+@item Once symbolic mode is supported for @command{umask}, implement @command{chmod} in Lisp
+
+@item Create @code{eshell-expand-file-name}
+
+This would use a data table to transform things such as @samp{~+},
+@samp{...}, etc.
+
+@item Abstract @file{em-smart.el} into @file{smart-scroll.el}
+
+It only really needs: to be hooked onto the output filter and the
+pre-command hook, and to have the input-end and input-start markers.
+And to know whether the last output group was ``successful.''
+
+@item Allow for fully persisting the state of Eshell
+
+This would include: variables, history, buffer, input, dir stack, etc.
+
+@item Implement D as an argument predicate
+
+It means that files beginning with a dot should be included in the
+glob match.
+
+@item A comma in a predicate list should mean OR
+
+At the moment, this is not supported.
+
+@item Error if a glob doesn't expand due to a predicate
+
+An error should be generated only if @code{eshell-error-if-no-glob} is
+non-@code{nil}.
+
+@item @samp{(+ RET SPC TAB} does not cause @code{indent-according-to-mode} to occur
+
+@item Create @code{eshell-auto-accumulate-list}
+
+This is a list of commands for which, if the user presses @kbd{RET}, the
+text is staged as the next Eshell command, rather than being sent to the
+current interactive process.
+
+@item Display file and line number if an error occurs in a script
+
+@item @command{wait} doesn't work with process ids at the moment
+
+@item Enable the direct-to-process input code in @file{em-term.el}
+
+@item Problem with repeating @samp{echo $@{find /tmp@}}
+
+With smart display active, if @kbd{RET} is held down, after a while it
+can't keep up anymore and starts outputting blank lines.  It only
+happens if an asynchronous process is involved@dots{}
+
+I think the problem is that @code{eshell-send-input} is resetting the
+input target location, so that if the asynchronous process is not done
+by the time the next @kbd{RET} is received, the input processor thinks
+that the input is meant for the process; which, when smart display is
+enabled, will be the text of the last command line!  That is a bug in
+itself.
+
+In holding down @kbd{RET} while an asynchronous process is running,
+there will be a point in between termination of the process, and the
+running of @code{eshell-post-command-hook}, which would cause
+@code{eshell-send-input} to call @code{eshell-copy-old-input}, and then
+process that text as a command to be run after the process.  Perhaps
+there should be a way of killing pending input between the death of the
+process, and the @code{post-command-hook}.
+
+@item Allow for a more aggressive smart display mode
+
+Perhaps toggled by a command, that makes each output block a smart
+display block.
+
+@item Create more meta variables
+
+@table @samp
+@item $!
+The reason for the failure of the last disk command, or the text of the
+last Lisp error.
+
+@item $=
+A special associate array, which can take references of the form
+@samp{$=[REGEXP]}.  It indexes into the directory ring.
+@end table
+
+@item Eshell scripts can't execute in the background
+
+@item Support zsh's ``Parameter Expansion'' syntax, i.e. @samp{$@{@var{name}:-@var{val}@}}
+
+@item Write an @command{info} alias that can take arguments
+
+So that the user can enter @samp{info chmod}, for example.
+
+@item Create a mode @code{eshell-browse}
+
+It would treat the Eshell buffer as a outline.  Collapsing the outline
+hides all of the output text.  Collapsing again would show only the
+first command run in each directory
+
+@item Allow other revisions of a file to be referenced using @samp{file@{rev@}}
+
+This would be expanded by @code{eshell-expand-file-name} (see above).
+
+@item Print ``You have new mail'' when the ``Mail'' icon is turned on
+
+@item Implement @kbd{M-|} for Eshell
+
+@item Implement input redirection
+
+If it's a Lisp function, input redirection implies @command{xargs} (in a
+way@dots{}).  If input redirection is added, also update the
+@code{file-name-quote-list}, and the delimiter list.
+
+@item Allow @samp{#<@var{word} @var{arg}>} as a generic syntax
+
+With the handling of @emph{word} specified by an
+@code{eshell-special-alist}.
+
+@item In @code{eshell-veal-using-options}, allow a @code{:complete} tag
+
+It would be used to provide completion rules for that command.  Then the
+macro will automagically define the completion function.
+
+@item For @code{eshell-command-on-region}, apply redirections to the result
+
+So that @samp{+ > 'blah} would cause the result of the @code{+} (using
+input from the current region) to be inserting into the symbol
+@code{blah}.
+
+If an external command is being invoked, the input is sent as standard
+input, as if a @samp{cat <region> |} had been invoked.
+
+If a Lisp command, or an alias, is invoked, then if the line has no
+newline characters, it is divided by whitespace and passed as arguments
+to the Lisp function.  Otherwise, it is divided at the newline
+characters.  Thus, invoking @code{+} on a series of numbers will add
+them; @code{min} would display the smallest figure, etc.
+
+@item Write @code{eshell-script-mode} as a minor mode
+
+It would provide syntax, abbrev, highlighting and indenting support like
+@code{emacs-lisp-mode} and @code{shell-mode}.
+
+@item In the history mechanism, finish the @command{bash}-style support
+
+This means @samp{!n}, @samp{!#}, @samp{!:%}, and @samp{!:1-} as separate
+from @samp{!:1*}.
+
+@item Support the -n command line option for @command{history}
+
+@item Implement @command{fc} in Lisp
+
+@item Specifying a frame as a redirection target should imply the currently active window's buffer
+
+@item Implement @samp{>@var{func-or-func-list}}
+
+This would allow for an ``output translators'', that take a function to
+modify output with, and a target.  Devise a syntax that works well with
+pipes, and can accommodate multiple functions (i.e., @samp{>'(upcase
+regexp-quote)} or @samp{>'upcase}).
+
+@item Allow Eshell to read/write to/from standard input and output
+
+This would be optional, rather than always using the Eshell buffer.
+This would allow it to be run from the command line (perhaps).
+
+@item Write a @command{help} command
+
+It would call subcommands with @option{--help}, or @option{-h} or
+@option{/?}, as appropriate.
+
+@item Implement @command{stty} in Lisp
+
+@item Support @command{rc}'s matching operator, e.g. @samp{~ (@var{list}) @var{regexp}}
+
+@item Implement @command{bg} and @command{fg} as editors of @code{eshell-process-list}
+
+Using @command{bg} on a process that is already in the background does
+nothing.  Specifying redirection targets replaces (or adds) to the list
+current being used.
+
+@item Have @command{jobs} print only the processes for the current shell
+
+@item How can Eshell learn if a background process has requested input?
+
+@item Support @samp{2>&1} and @samp{>&} and @samp{2>} and @samp{|&}
+
+The syntax table for parsing these should be customizable, such that the
+user could change it to use rc syntax: @samp{>[2=1]}.
+
+@item Allow @samp{$_[-1]}, which would indicate the last element of the array
+
+@item Make @samp{$x[*]} equal to listing out the full contents of @samp{x}
+
+Return them as a list, so that @samp{$_[*]} is all the arguments of the
+last command.
+
+@item Copy ANSI code handling from @file{term.el} into @file{em-term.el}
+
+Make it possible for the user to send char-by-char to the underlying
+process.  Ultimately, I should be able to move away from using term.el
+altogether, since everything but the ANSI code handling is already part
+of Eshell.  Then, things would work correctly on MS-Windows as well
+(which doesn't have @file{/bin/sh}, although @file{term.el} tries to use
+it).
+
+@item Make the shell spawning commands be visual
+
+That is, make (@command{su}, @command{bash}, @command{telnet},
+@command{rlogin}, @command{rsh}, etc.) be part of
+@code{eshell-visual-commands}.  The only exception is if the shell is
+being used to invoke a single command.  Then, the behavior should be
+based on what that command is.
+
+@item Create a smart viewing command named @command{open}
+
+This would search for some way to open its argument (similar to opening
+a file in the Windows Explorer).
+
+@item Alias @command{read} to be the same as @command{open}, only read-only
+
+@item Write a @command{tail} command which uses @code{view-file}
+
+It would move point to the end of the buffer, and then turns on
+auto-revert mode in that buffer at frequent intervals---and a
+@command{head} alias which assumes an upper limit of
+@code{eshell-maximum-line-length} characters per line.
+
+@item Make @command{dgrep} load @code{dired}, mark everything, then invoke @code{dired-do-search}
+
+@item Write mesh.c
+
+This would run Emacs with the appropriate arguments to invoke Eshell
+only.  That way, it could be listed as a login shell.
+
+@item Use an intangible @code{PS2} string for multi-line input prompts
+
+@item Auto-detect when a command is visual, by checking @code{TERMCAP} usage
+
+@item The first keypress after @kbd{M-x watson} triggers `eshell-send-input'
+
+@item Make @kbd{/} electric
+
+So that it automatically expands and corrects pathnames.  Or make
+pathname completion for Pcomplete auto-expand @samp{/u/i/std<TAB>} to
+@samp{/usr/include/std<TAB>}.
+
+@item Write the @command{pushd} stack to disk along with @code{last-dir-ring}
+
+@item Add options to @code{eshell/cat} which would allow it to sort and uniq
+
+@item Implement @command{wc} in Lisp
+
+Add support for counting sentences, paragraphs, pages, etc.
+
+@item Once piping is added, implement @command{sort} and @command{uniq} in Lisp
+
+@item Implement @command{touch} in Lisp
+
+@item Implement @command{comm} in Lisp
+
+@item Implement an @command{epatch} command in Lisp
+
+This would call @code{ediff-patch-file}, or @code{ediff-patch-buffer},
+depending on its argument.
+
+@item Have an option such that @samp{ls -l} generates a dired buffer
+
+@item Write a version of @command{xargs} based on command rewriting
+
+That is, @samp{find X | xargs Y} would be indicated using @samp{Y
+$@{find X@}}.  Maybe @code{eshell-do-pipelines} could be changed to
+perform this on-thy-fly rewriting.
+
+@item Write an alias for @command{less} that brings up a @code{view-mode} buffer
+
+Such that the user can press @key{SPC} and @key{DEL}, and then @key{q}
+to return to Eshell.  It would be equivalent to:
+@samp{X > #<buffer Y>; view-buffer #<buffer Y>}.
+
+@item Make @code{eshell-mode} as much a full citizen as @code{shell-mode}
+
+Everywhere in Emacs where @code{shell-mode} is specially noticed, add
+@code{eshell-mode} there.
+
+@item Permit the umask to be selectively set on a @command{cp} target
+
+@item Problem using @kbd{M-x eshell} after using @code{eshell-command}
+
+If the first thing that I do after entering Emacs is to run
+@code{eshell-command} and invoke @command{ls}, and then use @kbd{M-x
+eshell}, it doesn't display anything.
+
+@item @kbd{M-RET} during a long command (using smart display) doesn't work
+
+Since it keeps the cursor up where the command was invoked.
+
+@end table
+
+@node GNU Free Documentation License
+@appendix GNU Free Documentation License
+@include doclicense.texi
+
+@node Concept Index
+@unnumbered Concept Index
+
+@printindex cp
+
+@node Function and Variable Index
+@unnumbered Function and Variable Index
+
+@printindex fn
+
+@node Key Index
+@unnumbered Key Index
+
+@printindex ky
+@bye
+
+@ignore
+   arch-tag: 776409ba-cb15-42b9-b2b6-d2bdc7ebad01
+@end ignore
diff --git a/doc/misc/eudc.texi b/doc/misc/eudc.texi
new file mode 100644 (file)
index 0000000..1c51eac
--- /dev/null
@@ -0,0 +1,985 @@
+\input texinfo.tex
+@c %**start of header
+@setfilename ../../info/eudc
+@settitle Emacs Unified Directory Client (EUDC) Manual
+@afourpaper
+@c %**end of header
+
+@copying
+This file documents EUDC v1.30b.
+
+EUDC is the Emacs Unified Directory Client, a common interface to
+directory servers using various protocols such as LDAP or the CCSO white
+pages directory system (PH/QI)
+
+Copyright @copyright{} 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
+Free Software Foundation, Inc.
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with the Front-Cover texts being ``A GNU
+Manual'', and with the Back-Cover Texts as in (a) below.  A copy of the
+license is included in the section entitled ``GNU Free Documentation
+License'' in the Emacs manual.
+
+(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
+this GNU Manual, like GNU software.  Copies published by the Free
+Software Foundation raise funds for GNU development.''
+
+This document is part of a collection distributed under the GNU Free
+Documentation License.  If you want to distribute this document
+separately from the collection, you can do so by adding a copy of the
+license to the document, as described in section 6 of the license.
+@end quotation
+@end copying
+
+@dircategory Emacs
+@direntry
+* EUDC: (eudc).   An Emacs client for directory servers (LDAP, PH).
+@end direntry
+
+@footnotestyle end
+
+@titlepage
+@title{EUDC Manual}
+@subtitle{The Emacs Unified Directory Client}
+@author by Oscar Figueiredo
+@code{1.30b}
+
+@page
+@vskip 0pt plus 1fill
+@insertcopying
+@end titlepage
+
+@ifnottex
+@node     Top, Overview, (dir), (dir)
+@comment  node-name,  next,         previous, up
+
+
+This manual documents EUDC v1.30b, the Emacs Unified Directory Client.
+
+A common interface to directory servers using various protocols such as
+LDAP or the CCSO white pages directory system (PH/QI)
+
+@end ifnottex
+
+@menu
+* Overview::                    Summary of EUDC features
+* Installation::                How to install EUDC
+* Usage::                       The various usage possibilities explained
+* Credits::                     Who's done what
+* GNU Free Documentation License:: The license for this documentation.
+* Command and Function Index::
+* Variables Index::
+@end menu
+
+
+
+
+
+@node     Overview, Installation, Top, Top
+@comment  node-name,   next,  previous,  up
+@chapter Overview
+
+EUDC, the @dfn{Emacs Unified Directory Client}, provides a common user
+interface to access directory servers using different directory
+protocols.
+
+Currently supported back-ends are:
+
+@itemize @bullet
+@item
+LDAP, Lightweight Directory Access Protocol
+@item
+CCSO PH/QI
+@item
+BBDB, Big Brother's Insidious Database
+@end itemize
+
+The main features of the EUDC interface are:
+
+@itemize @bullet
+@item
+Queries using a customizable form
+@item
+Inline query expansion (for instance you can expand a name
+to an email address in a mail message buffer using a server as an
+address book)
+@item
+Multiple servers can be tried in turn until a match is found for an
+inline query
+@item
+Fast minibuffer queries for email addresses and phone numbers
+@item
+Interface to BBDB to let you insert server records into your own BBDB database
+(@pxref{Top,,BBDB,bbdb,BBDB Manual})
+@end itemize
+
+@menu
+* LDAP::                        What is LDAP ?
+* CCSO PH/QI::                  What is CCSO, PH, QI ?
+* BBDB::                        What is BBDB ?
+@end menu
+
+
+
+@node LDAP, CCSO PH/QI, Overview, Overview
+@comment  node-name,  next,  previous,  up
+@section LDAP
+
+LDAP, @dfn{the Lightweight Directory Access Protocol}, is a communication
+protocol for directory applications defined in RFC 1777.
+
+Quoted from RFC 1777:
+
+@quotation
+[LDAP] is designed to provide access to the X.500 Directory while not
+incurring the resource requirements of the Directory Access Protocol
+(DAP). This protocol is specifically targeted at simple management
+applications and browser applications that provide simple read/write
+interactive access to the X.500 Directory, and is intended to be a
+complement to the DAP itself.
+@end quotation
+
+LDAP servers usually store (but are not limited to) information about
+people such as their name, phone number, email address, office
+location, etc@enddots{} More information about LDAP can be found at
+@url{http://www.openldap.org/}
+
+EUDC requires external support to access LDAP directory servers
+(@pxref{LDAP Requirements})
+
+
+@node CCSO PH/QI, BBDB, LDAP, Overview
+@comment  node-name,  next,  previous,  up
+@section CCSO PH/QI
+
+The Central Computing Services Office (CCSO) of the University of
+Illinois at Urbana Champaign (UIUC) created and freely distributes a
+directory system that is currently in use in more than 300 organizations
+around the world.  The system records information about people such as
+their address, phone number, email, academic information or any other
+details it was configured to.
+
+The system consists of two parts: a database server traditionally called
+@samp{qi} and a command-line client called @samp{ph}.
+@url{ftp://uiarchive.cso.uiuc.edu/pub/packages/ph} is the main
+distribution site.  @url{http://www.uiuc.edu/cgi-bin/ph/lookup?Query=.}
+provides a listing of the active @samp{qi} servers.
+
+The original command-line @samp{ph} client that comes with the
+@samp{ph/qi} distribution provides additional features like the
+possibility to communicate with the server in login-mode which makes it
+possible to change records in the database.  This is not implemented in
+EUDC.
+
+
+@node BBDB,  , CCSO PH/QI, Overview
+@comment  node-name,  next,  previous,  up
+@section BBDB
+
+BBDB is the @dfn{Big Brother's Insidious Database}, a package for Emacs
+originally written by Jamie Zawinski which provides rolodex-like
+database functionality featuring tight integration with the Emacs mail
+and news readers.
+
+It is often used as an enhanced email address book.
+
+EUDC considers BBDB as a directory server back end just like LDAP or
+PH/QI servers, though BBDB has no client/server protocol and thus always
+resides locally on your machine.  The point in this is not to offer an
+alternate way to query your BBDB database (BBDB itself provides much
+more flexible ways to do that), but rather to offer an interface to your
+local directory that is consistent with the interface to external
+directories (LDAP, PH/QI).  This is particularly interesting when
+performing queries on multiple servers.
+
+EUDC also offers a means to insert results from directory queries into
+your own local BBDB (@pxref{Creating BBDB Records})
+
+@node Installation, Usage, Overview, Top
+@comment  node-name,  next,  previous,  up
+@chapter Installation
+
+Add the following to your @file{.emacs} init file:
+@lisp
+(require 'eudc)
+@end lisp
+This will install EUDC at startup.
+
+After installing EUDC you will find (the next time you launch Emacs) a
+new @code{Directory Search} submenu in the @samp{Tools} menu that will
+give you access to EUDC.
+
+You may also find it useful to add the following to your @file{.emacs}
+initialization file to add a shortcut for email address expansion in
+email composition buffers (@pxref{Inline Query Expansion})
+
+@lisp
+(eval-after-load
+ "message"
+ '(define-key message-mode-map [(control ?c) (tab)] 'eudc-expand-inline))
+(eval-after-load
+ "sendmail"
+ '(define-key mail-mode-map [(control ?c) (tab)] 'eudc-expand-inline))
+@end lisp
+
+@menu
+* LDAP Requirements::           EUDC needs external support for LDAP
+@end menu
+
+@node LDAP Requirements,  , Installation, Installation
+@comment  node-name,  next,  previous,  up
+@section LDAP Requirements
+
+LDAP support is added by means of @file{ldap.el} which is part of Emacs.
+@file{ldap.el} needs an external command line utility named
+@file{ldapsearch} which is available as part of LDAP toolkits:
+
+@itemize @bullet
+@item
+Open LDAP Libraries
+(@url{http://www.openldap.org/})
+@item
+University of Michigan's LDAP Client software
+(@url{http://www.umich.edu/~dirsvcs/ldap/})
+@end itemize
+
+
+@node Usage, Credits, Installation, Top
+@comment  node-name,  next,  previous,  up
+@chapter Usage
+
+This chapter describes the usage of EUDC.  Most functions and
+customization options are available through the @samp{Directory Search}
+submenu of the @samp{Tools} submenu.
+
+@menu
+* Querying Servers::            How queries are performed and handled
+* Query Form::                  How to use and customize the query form
+* Display of Query Results::    Controlling how query results are presented
+* Inline Query Expansion::      How to use and customize inline queries
+* The Server Hotlist::          How to use and manage the server hotlist
+* Multi-server Queries::        How to query multiple servers successively
+* Creating BBDB Records::       How to insert query results into your BBDB
+* Server/Protocol Locals::      Customizing on a per server/protocol basis
+@end menu
+
+
+@node Querying Servers, Query Form, Usage, Usage
+@comment  node-name,  next,  previous,  up
+@section Querying Servers
+
+EUDC's basic functionality is to let you query a directory server and
+return the results back to you.  There are several things you may want
+to customize in this process.
+
+
+@menu
+* Selecting a Server::          The first thing to do
+* Return Attributes::           Configuring what the server should return
+* Duplicate Attributes::        What to do when records have duplicate attributes
+@end menu
+
+@node Selecting a Server, Return Attributes, Querying Servers, Querying Servers
+@subsection Selecting a Server
+
+Before doing any query you will need to set the directory server.  You
+need to specify the name of the host machine running the server software
+and the protocol to use. If you do not set the server in any fashion,
+EUDC will ask you for one when you make your first query.
+
+You can set the server by selecting one from your hotlist of servers
+(@pxref{The Server Hotlist}) available in the @samp{Server} submenu or
+by selecting @samp{New Server} in that same menu.
+
+LDAP servers generally require some configuration before you can perform
+queries on them.  In particular, the @dfn{search base} must be
+configured.  If the server you select has no configured search base then
+EUDC will propose you to configure it at this point.  A customization
+buffer will be displayed where you can edit the search base and other
+parameters for the server.
+
+@defvar eudc-server
+The name or IP address of the remote directory server. A TCP port number
+may be specified by appending a colon and a number to the name of the
+server. You will not need this unless your server runs on a port other
+than the default (which depends on the protocol).
+If the directory server resides on your own computer (which is the case
+if you use the BBDB back end) then `localhost' is a reasonable value but
+it will be ignored anyway.
+@end defvar
+
+@defvar eudc-protocol
+The directory protocol to use to query the server.  Currently supported
+protocols in this version of EUDC are @code{ph}, @code{ldap} and @code{bbdb}.
+@end defvar
+
+@deffn Command eudc-set-server
+This command accessible from @samp{New Server} submenu lets you specify a
+new directory server and protocol.
+@end deffn
+
+@node Return Attributes, Duplicate Attributes, Selecting a Server, Querying Servers
+@subsection Return Attributes
+
+Directory servers may be configured to return a default set of
+attributes for each record matching a query if the query specifies none.
+The variable @code{eudc-default-return-attributes} controls the return
+attributes you want to see, if different from the server defaults.
+
+@defvar eudc-default-return-attributes
+A list of the default attributes to extract from directory entries.  If
+set to the symbol @code{all} then all available attributes are
+returned. A value of @code{nil}, the default, means to return the
+default attributes as configured in the server.
+@end defvar
+
+The server may return several matching records to a query. Some of the
+records may however not contain all the attributes you requested. You can
+discard those records.
+
+@defopt eudc-strict-return-matches
+If non-@code{nil}, entries that do not contain all the requested return
+attributes are ignored.  Default is @code{t}.
+@end defopt
+
+@node Duplicate Attributes,  , Return Attributes, Querying Servers
+@subsection Duplicate Attributes
+
+Directory standards may authorize different instances of the same
+attribute in a record. For instance the record of a person may contain
+several email fields containing different email addresses. When using
+a QI directory server this is difficult to distinguish from attributes
+having multi-line values such as the postal address that may contain a
+line for the street and another one for the zip code and city name. In
+both cases, EUDC will consider the attribute duplicated.
+
+EUDC has several methods to deal with duplicated attributes. The
+available methods are:
+
+@table @code
+@item list
+Makes a list with the different values of the duplicate attribute. The
+record is returned with only one instance of the attribute with a list
+of all the different values as a value. This is the default method that
+is used to handle duplicate fields for which no other method has been
+specified.
+@item first
+Discards all the duplicate values of the field keeping only the first
+one.
+@item concat
+Concatenates the different values using a newline as a separator. The
+record keeps only one instance of the field the value of which is a
+single multi-line string.
+@item duplicate
+Duplicates the whole record into as many instances as there are different
+values for the field. This is the default for the email field. Thus a
+record containing 3 different email addresses is duplicated into three
+different records each having a single email address. This is
+particularly useful in combination with @code{select} as the method to
+handle multiple matches in inline expansion queries (@pxref{Inline Query
+Expansion}) because you are presented with the 3 addresses in a
+selection buffer
+@end table
+
+Because a method may not be applicable to all fields, the variable
+@code{eudc-duplicate-attribute-handling-method} lets you specify either a
+default method for all fields or a method for each individual field.
+
+@defvar eudc-duplicate-attribute-handling-method
+A method to handle entries containing duplicate attributes.  This is
+either an alist of elements @code{(@var{attr} . @var{method})}, or a symbol
+@var{method}.  The alist form of the variable associates a method to an
+individual attribute name; the second form specifies a method applicable
+to all attribute names. Available methods are: @code{list},
+@code{first}, @code{concat}, and @code{duplicate} (see above).  The default is
+@code{list}.
+@end defvar
+
+
+
+@node Query Form, Display of Query Results, Querying Servers, Usage
+@comment  node-name,  next,  previous,  up
+@section Query Form
+
+The simplest way to query your directory server is to use the query
+form. You display the query form with the @samp{Query with Form} menu
+item or by invoking the command @kbd{M-x eudc-query-form}. The attribute
+names presented in this form are defined by the
+@code{eudc-query-form-attributes} variable (unless a non-@code{nil}
+argument is supplied to @code{eudc-query-form}).
+
+Since the different directory protocols to which EUDC interfaces may
+use different names for equivalent attributes, EUDC defines its own set
+of attribute names and a mapping between these names and their
+protocol-specific equivalent through the variable
+@code{eudc-protocol-attributes-translation-alist}.  Names currently
+defined by EUDC are @code{name}, @code{firstname}, @code{email} and
+@code{phone}.
+
+@defvar eudc-query-form-attributes
+@findex eudc-get-attribute-list
+A list of attributes presented in the query form.  Attribute names in
+this list should be either EUDC attribute names or valid attribute
+names.  You can get a list of valid attribute names for the current
+protocol with the @samp{List Valid Attribute Names} menu item or the
+@kbd{M-x eudc-get-attribute-list} command.  Defaults to @code{name},
+@code{email} and @code{phone}.
+@end defvar
+
+@deffn Command eudc-query-form get-fields-from-server
+Display a form to query the directory server.  If given a non-@code{nil}
+argument the function first queries the server for the existing fields
+and displays a corresponding form.  Not all protocols may support a
+non-@code{nil} argument here.
+@end deffn
+
+Since the names of the fields may not be explicit enough or adapted to
+be directly displayed as prompt strings in the form, the variable
+@code{eudc-user-attribute-names-alist} lets you define more explicit
+names for directory attribute names.  This variable is ignored if
+@code{eudc-use-raw-directory-names} is non-@code{nil}.
+
+@defvar eudc-user-attribute-names-alist
+This is an alist of user-defined names for the directory attributes used in
+query/response forms. Prompt strings for attributes that are not in this
+alist are derived by splitting the attribute name at underscores and
+capitalizing the individual words.
+@end defvar
+
+@defvar eudc-use-raw-directory-names
+If non-@code{nil}, use attributes names as defined in the directory.
+Otherwise, directory query/response forms display the user attribute
+names defined in @code{eudc-user-attribute-names-alist}.
+@end defvar
+
+@node Display of Query Results, Inline Query Expansion, Query Form, Usage
+@comment  node-name,  next,  previous,  up
+@section Display of Query Results
+
+Upon successful completion of a form query, EUDC will display a buffer
+containing the results of the query.
+
+The fields that are returned for each record
+are controlled by @code{eudc-default-return-attributes} (@pxref{Return
+Attributes}).
+
+The display of each individual field can be performed by an arbitrary
+function which allows specific processing for binary values, such as
+images or audio samples, as well as values with semantics, such as
+URLs.
+
+@defvar eudc-attribute-display-method-alist
+An alist specifying methods to display attribute values.  Each member of
+the list is of the form @code{(@var{name} . @var{func})} where
+@var{name} is a lowercased string naming a directory attribute
+(translated according to @code{eudc-user-attribute-names-alist} if
+@code{eudc-use-raw-directory-names} is non-@code{nil}) and @var{func} a
+function that will be passed the corresponding attribute values for
+display.
+@end defvar
+
+This variable has protocol-local definitions (see @pxref{Server/Protocol
+Locals}).  For instance, it is defined as follows for LDAP:
+
+@lisp
+(eudc-protocol-set 'eudc-attribute-display-method-alist
+                   '(("jpegphoto" . eudc-display-jpeg-inline)
+                     ("labeledurl" . eudc-display-url)
+                     ("audio" . eudc-display-sound)
+                     ("labeledurl" . eudc-display-url)
+                     ("url" . eudc-display-url))
+                   'ldap)
+@end lisp
+
+EUDC provides a set of built-in functions to display binary value types:
+
+@defun eudc-display-generic-binary data
+Display a button for unidentified binary @var{data}.
+@end defun
+
+@defun eudc-display-url url
+Display URL and make it clickable.
+@end defun
+
+@defun eudc-display-sound data
+Display a button to play the sound @var{data}.
+@end defun
+
+@defun eudc-display-jpeg-inline data
+Display the JPEG @var{data} inline at point if possible.
+@end defun
+
+@defun eudc-display-jpeg-as-button data
+Display a button for the JPEG @var{data}.
+@end defun
+
+Right-clicking on a binary value button pops up a contextual menu with
+options to process the value.  Among these are saving the attribute
+value to a file or sending it to an external viewer command.  External
+viewers should expect the value on their standard input and should
+display it or perform arbitrary processing on it.  Messages sent to
+standard output are discarded.  External viewers are listed in the
+variable @code{eudc-external-viewers} which you can customize.
+
+@defvar eudc-external-viewers
+This is a list of viewer program specifications.  Each specification is
+a list whose first element is a string naming the viewer for unique
+identification, the second element is the executable program which
+should be invoked and the following elements are arguments that should
+be passed to the program.
+@end defvar
+
+
+@node Inline Query Expansion, The Server Hotlist, Display of Query Results, Usage
+@comment  node-name,  next,  previous,  up
+@section Inline Query Expansion
+
+Inline query expansion is a powerful method to get completion from your
+directory server.  The most common usage is for expanding names to email
+addresses in mail message buffers.  The expansion is performed by the
+command @kbd{M-x eudc-expand-inline} which is available from the
+@samp{Expand Inline Query} menu item but can also be conveniently
+bound to a key shortcut (@pxref{Installation}).  The operation is
+controlled by the variables @code{eudc-inline-expansion-format},
+@code{eudc-inline-query-format},
+@code{eudc-expanding-overwrites-query} and
+@code{eudc-multiple-match-handling-method}.
+
+If the query fails for a server, other servers may be tried successively
+until one of them finds a match (@pxref{Multi-server Queries}).
+
+@deffn Command eudc-expand-inline replace-p
+Query the server and expand the query string before point.  The query
+string consists of the buffer substring from the point back to the
+preceding comma, colon or beginning of
+line.  @code{eudc-inline-query-format} controls how individual words
+are mapped onto directory attribute names.  After querying the server
+for the given string, the expansion specified by
+@code{eudc-inline-expansion-format} is inserted in the buffer at
+point. If @var{replace-p} is @code{t} then this expansion replaces the
+query string in the buffer.  If @code{eudc-expanding-overwrites-query}
+is non-@code{nil} then the meaning of @var{replace-p} is negated.
+@end deffn
+
+@defvar eudc-inline-query-format
+Format of an inline expansion query.
+This is actually a list of @var{format}s.  A @var{format} is a list of
+one or more EUDC attribute names.  A @var{format} applies if it contains
+as many attributes as individual words in the inline query string.  If
+several @var{format}s apply then they are tried in order until a match
+is found.  If @code{nil} all the words will be mapped onto the default
+server/protocol attribute name (generally @code{name}).
+
+For instance, use the following
+@lisp
+(setq eudc-inline-query-format '((name)
+                                 (firstname)
+                                 (firstname name)))
+@end lisp
+@noindent
+to indicate that single word expansion queries are to be considered as
+surnames and if no match is found then they should be tried as first
+names.  Inline queries consisting of two words are considered as
+consisting of a first name followed by a surname.  If the query consists
+of more than two words, then the first one is considered as the first
+name and the remaining words are all considered as surname constituents.
+
+@var{format}s are in fact not limited to EUDC attribute names, you can
+use server or protocol specific names in them.  It may be safer if you
+do so, to set the variable @code{eudc-inline-query-format} in a protocol
+or server local fashion (see @pxref{Server/Protocol Locals}).
+
+For instance you could use the following to match up to three words
+against the @code{cn} attribute of LDAP servers:
+@lisp
+(eudc-protocol-set 'eudc-inline-query-format
+                   '((cn)
+                     (cn cn)
+                     (cn cn cn))
+                   'ldap)
+@end lisp
+@end defvar
+
+@defvar eudc-inline-expansion-format
+This variable lets you control exactly what is inserted into the buffer
+upon an inline expansion request.  It is a list whose first element is a
+string passed to @code{format}.  Remaining elements are symbols
+corresponding to directory attribute names.  The corresponding attribute
+values are passed as additional arguments to @code{format}.  Default is
+@code{("%s" email)} but you may want to consider a value like @code{("%s
+<%s>" name email)}
+@end defvar
+
+@defvar eudc-multiple-match-handling-method
+This variable controls what to do when multiple entries match a query
+for an inline expansion.  Possible values are:
+@table @code
+@item first
+The first match is considered as being the only one, the others are
+discarded.
+@item select
+A selection buffer pops up where you can choose a particular match.  This
+is the default value of the variable.
+@item all
+The expansion uses all records successively
+@item abort
+An error is signaled.  The expansion aborts.
+@end table
+
+Default is @code{select}
+@end defvar
+
+
+
+@node The Server Hotlist, Multi-server Queries, Inline Query Expansion, Usage
+@comment  node-name,  next,  previous,  up
+@section The Server Hotlist
+
+EUDC lets you maintain a list of frequently used servers so that you
+can easily switch from one to another.  This hotlist appears in the
+@samp{Server} submenu.  You select a server in this list by clicking on
+its name.  You can add the current server to the list with the command
+@kbd{M-x eudc-bookmark-current-server}.  The list is contained in the variable
+@code{eudc-server-hotlist} which is stored in and retrieved from the file
+designated by @code{eudc-options-file}.  EUDC also provides a facility to
+edit the hotlist interactively (@pxref{The Hotlist Edit Buffer}).
+
+The hotlist is also used to make queries on multiple servers
+successively (@pxref{Multi-server Queries}).  The order in which the
+servers are tried is the order they appear in the hotlist, therefore it
+is important to sort the hotlist appropriately.
+
+@deffn Command eudc-bookmark-server server
+Add @var{server} to the hotlist of servers
+@end deffn
+
+@deffn Command eudc-bookmark-current-server
+Add the current server to the hotlist of servers
+@end deffn
+
+@defvar eudc-options-file
+The name of a file where EUDC stores its internal variables
+(the hotlist and the current server).  EUDC will try to load
+that file upon initialization so, if you choose a file name
+different from the defaults @file{~/.eudc-options}, be sure to set this
+variable to the appropriate value @emph{before} EUDC is itself
+loaded.
+@end defvar
+
+@menu
+* The Hotlist Edit Buffer::     An interactive hotlist editing facility
+@end menu
+
+@node The Hotlist Edit Buffer,  , The Server Hotlist, The Server Hotlist
+@comment  node-name,  next,  previous,  up
+@subsection The Hotlist Edit Buffer
+
+The hotlist edit buffer offers a means to manage a list of frequently
+used servers.  Commands are available in the context pop-up menu
+generally bound to the right mouse button.  Those commands also have
+equivalent key bindings.
+
+@deffn Command eudc-hotlist-add-server
+Bound to @kbd{a}.
+Add a new server to the hotlist on the line after point
+@end deffn
+
+@deffn Command eudc-hotlist-delete-server
+Bound to @kbd{d}.
+Delete the server on the line point is on
+@end deffn
+
+@deffn Command eudc-hotlist-select-server
+Bound to @kbd{s}.
+Select the server the point is on as the current directory server for
+the next queries
+@end deffn
+
+@deffn Command eudc-hotlist-transpose-servers
+Bound to @kbd{t}.
+Bubble up the server the point is on to the top of the list
+@end deffn
+
+@deffn Command eudc-hotlist-quit-edit
+Bound to @kbd{q}.
+Save the changes and quit the hotlist edit buffer.  Use @kbd{x} or
+@kbd{M-x kill-buffer} to exit without saving.
+@end deffn
+
+
+@node Multi-server Queries, Creating BBDB Records, The Server Hotlist, Usage
+@comment  node-name,  next,  previous,  up
+@section Multi-server Queries
+
+When using inline query expansion (@pxref{Inline Query Expansion}), EUDC
+can try to query successively a sequence of directory servers until one
+of them successfully finds a match for the query.
+
+@defvar eudc-inline-expansion-servers
+This variable controls which servers are tried and in which order when
+trying to perform an inline query.  Possible values are:
+@table @code
+@item current-server
+Only the current directory server is tried
+@item hotlist
+The servers in the hotlist are tried in order until one finds a match
+for the query or `eudc-max-servers-to-query' is reached
+@item server-then-hotlist
+The current server then the servers in the hotlist are tried in the
+order they appear in the hotlist until one of them finds a match or
+`eudc-max-servers-to-query' is reached.  This is the default.
+@end table
+@end defvar
+
+@defvar eudc-max-servers-to-query
+This variable indicates the maximum number of servers to query when
+performing a multi-server query.  The default, @code{nil}, indicates
+that all available servers should be tried.
+@end defvar
+
+
+
+@node Creating BBDB Records, Server/Protocol Locals, Multi-server Queries, Usage
+@comment  node-name,  next,  previous,  up
+@section Creating BBDB Records
+
+@findex eudc-insert-record-at-point-into-bbdb
+@findex eudc-try-bbdb-insert
+With EUDC, you can automatically create BBDB records
+(@pxref{Top,,BBDB,bbdb,BBDB Manual}) from records you get from a
+directory server.  You do this by moving point to the appropriate
+record in a query result display buffer and invoking the command
+@kbd{M-x eudc-insert-record-at-point-into-bbdb} with the
+keyboard binding @kbd{b}@footnote{This key binding does not actually
+call @code{eudc-insert-record-at-point-into-bbdb} but uses
+@code{eudc-try-bbdb-insert} instead.}, or with the menu.  EUDC
+cannot update an existing BBDB record and will signal an error if you
+try to insert a record matching an existing one.
+
+@findex eudc-batch-export-records-to-bbdb
+It is also possible to export to BBDB the whole batch of records
+contained in the directory query result with the command
+@kbd{M-x eudc-batch-export-records-to-bbdb}.
+
+Because directory systems may not enforce a strict record format, local
+server installations may use different attribute names and have
+different ways to organize the information.  Furthermore BBDB has its own
+record structure.  For these reasons converting a record from its
+external directory format to the BBDB format is a highly customizable
+process.
+
+@defvar eudc-bbdb-conversion-alist
+The value of this variable should be a symbol naming an alist defining a
+mapping between BBDB field names onto directory attribute names records.
+This is a protocol-local variable and is initialized upon protocol
+switch (@pxref{Server/Protocol Locals}).  The alist is made of cells of the
+form @code{(@var{bbdb-field} . @var{spec-or-list})}.
+@var{bbdb-field} is the name of a field
+that must be defined in your BBDB environment (standard field names are
+@code{name}, @code{company}, @code{net}, @code{phone}, @code{address}
+and @code{notes}).
+@var{spec-or-list} is either a single mapping specification or a list of
+mapping specifications.  Lists of mapping specifications are valid for
+the @code{phone} and @code{address} BBDB fields only. @var{spec}s are
+actually s-expressions which are evaluated as follows:
+
+@table @asis
+@item a string
+evaluates to itself
+@item a symbol
+evaluates to the symbol value.  Symbols corresponding to directory
+attribute names present in the record evaluate to the value of the field
+in the record
+@item a form
+is evaluated as a function.  The argument list may contain attribute
+names which evaluate to the corresponding values in the record.  The form
+evaluation should return something appropriate for the particular
+@var{bbdb-field} (see @code{bbdb-create-internal}).
+@code{eudc-bbdbify-phone} and @code{eudc-bbdbify-address} are provided as
+convenience functions to parse phones and addresses.
+@end table
+@end defvar
+
+The default value of the PH-specific value of that variable is
+@code{eudc-ph-bbdb-conversion-alist}:
+
+@lisp
+((name . name)
+ (net . email)
+ (address . (eudc-bbdbify-address address "Address"))
+ (phone . ((eudc-bbdbify-phone phone "Phone")
+           (eudc-bbdbify-phone office_phone "Office Phone"))))
+@end lisp
+
+This means that:
+
+@itemize @bullet
+@item
+the @code{name} field of the BBDB record gets its value
+from the @code{name} attribute of the directory record
+@item
+the @code{net} field of the BBDB record gets its value
+from the @code{email} attribute of the directory record
+@item
+the @code{address} field of the BBDB record is obtained by parsing the
+@code{address} attribute of the directory record with the function
+@code{eudc-bbdbify-address}
+@item
+two @code{phone} fields are created (when possible) in the BBDB record.
+The first one has @cite{Phone} for location and its value is obtained by
+parsing the @code{phone} attribute of the PH/QI record with the function
+@code{eudc-bbdbify-phone}.  The second one has @cite{Office Phone} for location
+its value is obtained by parsing the @code{office_phone} attribute of the
+PH/QI record with the function @code{eudc-bbdbify-phone}.
+@end itemize
+
+@defun eudc-bbdbify-phone phone location
+This is a convenience function provided for use in
+@code{eudc-bbdb-conversion-alist}.  It parses @var{phone} into a vector
+compatible with @code{bbdb-create-internal}.  @var{phone} is either a string
+supposedly containing a phone number or a list of such strings which are
+concatenated. @var{location} is used as the phone location for BBDB.
+@end defun
+
+@defun eudc-bbdbify-address addr location
+This is a convenience function provided for use in
+@code{eudc-bbdb-conversion-alist}.  It parses @var{addr} into a vector
+compatible with @code{bbdb-create-internal}.  @var{addr} should be an
+address string of no more than four lines or a list of lines.  The last
+line is searched for the zip code, city and state name.  @var{location}
+is used as the phone location for BBDB.
+@end defun
+
+Note that only a subset of the attributes you selected with
+@code{eudc-default-return-attributes} and that are actually displayed may
+actually be inserted as part of the newly created BBDB record.
+
+
+@node Server/Protocol Locals,  , Creating BBDB Records, Usage
+@comment  node-name,  next,  previous,  up
+@section Server/Protocol Locals
+
+EUDC can be customized independently for each server or directory
+protocol.  All variables can be given local bindings that are activated
+when a particular server and/or protocol becomes active.  This is much
+like buffer-local bindings but on a per server or per protocol basis.
+
+@menu
+* Manipulating local bindings::  Functions to set and query local bindings
+@end menu
+
+@node Manipulating local bindings,  , Server/Protocol Locals, Server/Protocol Locals
+@comment  node-name,  next,  previous,  up
+@subsection Manipulating local bindings
+
+EUDC offers functions that let you set and query variables on a per
+server or per protocol basis.
+
+The following predicates allow you to test the existence of
+server/protocol local bindings for a particular variable.
+
+@defun eudc-server-local-variable-p var
+Return non-@code{nil} if @var{var} has server-local bindings
+@end defun
+
+@defun eudc-protocol-local-variable-p var
+Return non-@code{nil} if @var{var} has protocol-local bindings
+@end defun
+
+The following functions allow you to set the value of a variable with
+various degrees of locality.
+
+@defun eudc-default-set var val
+Set the EUDC default value of @var{var} to @var{val}.
+The current binding of @var{var} (if local to the current server or
+protocol) is not changed.
+@end defun
+
+@defun eudc-protocol-set var val &optional protocol
+Set the binding of @var{var} local to @var{protocol} to @var{val}.  If
+omitted, @var{protocol} defaults to the current value of
+@code{eudc-protocol}.  The current binding of @var{var} is changed only
+if @var{protocol} is omitted.
+@end defun
+
+@defun eudc-server-set var val &optional server
+Set the binding of @var{var} local to @var{server} to @var{val}.  If
+omitted, @var{server} defaults to the current value of
+@code{eudc-server}.  The current binding of @var{var} is changed only if
+@var{server} is omitted.
+@end defun
+
+@defun eudc-set var val
+Set the most local (server, protocol or default) binding of @var{var} to
+@var{val}.  The current binding of @var{var} is also set to @var{val}.
+@end defun
+
+The following variables allow you to query the various bindings of a
+variable (local or non-local).
+
+@defun eudc-variable-default-value var
+Return the default binding of @var{var} (outside of a particular server
+or protocol local binding).
+Return @code{unbound} if @var{var} has no EUDC default value.
+@end defun
+
+@defun eudc-variable-protocol-value var &optional protocol
+Return the value of @var{var} local to @var{protocol}.  Return
+@code{unbound} if @var{var} has no value local to @var{protocol}.
+@var{protocol} defaults to @code{eudc-protocol}.
+@end defun
+
+@defun eudc-variable-server-value var [server]
+Return the value of @var{var} local to @var{server}.
+Return @code{unbound} if @var{var} has no value local to @var{server}.
+@var{server} defaults to @code{eudc-server}.
+@end defun
+
+Changing a protocol-local or server-local value of a variable has no
+effect on its current value.  The following command is used to
+synchronize the current values of variables with their local values
+given the current @code{eudc-server} and @code{eudc-protocol}:
+
+@defun eudc-update-local-variables
+Update all EUDC variables according to their local settings.
+@end defun
+
+
+
+@node Credits, GNU Free Documentation License, Usage, Top
+@comment  node-name,  next,  previous,  up
+@chapter Credits
+
+EUDC was written by Oscar Figueiredo based on @file{ph.el} by the
+same author.
+
+Thanks to Soren Dayton for his suggestions, his enthusiasm and his help
+in testing and proofreading the code and docs of @file{ph.el}.
+
+@node GNU Free Documentation License, Command and Function Index, Credits, Top
+@appendix GNU Free Documentation License
+@include doclicense.texi
+
+@node Command and Function Index, Variables Index, GNU Free Documentation License, Top
+@comment  node-name,  next,  previous,  up
+@unnumbered Command and Function Index
+
+@printindex fn
+
+@node Variables Index,  , Command and Function Index, Top
+@comment  node-name,  next,  previous,  up
+@unnumbered Variables Index
+
+@printindex vr
+
+@setchapternewpage odd
+@contents
+@bye
+
+@ignore
+   arch-tag: 1b79460b-4ea1-441d-ab45-05ddd16ef241
+@end ignore
similarity index 99%
rename from man/faq.texi
rename to doc/misc/faq.texi
index b7fe5dca4a2ca87c0a7bae37ef863cfd5be1ce97..fb64a22f13fbc62406448987ba844edb1aa60471 100644 (file)
@@ -1,6 +1,6 @@
 \input texinfo   @c -*- mode: texinfo; -*-
 @c %**start of header
-@setfilename ../info/efaq
+@setfilename ../../info/efaq
 @settitle GNU Emacs FAQ
 @c %**end of header
 
@@ -836,7 +836,7 @@ Make sure the first line of the Texinfo file looks like this:
 
 You may need to change @samp{texinfo} to the full pathname of the
 @file{texinfo.tex} file, which comes with Emacs as
-@file{man/texinfo.tex} (or copy or link it into the current directory).
+@file{doc/misc/texinfo.tex} (or copy or link it into the current directory).
 
 @item
 Type @kbd{texi2dvi @var{texinfo-source}}, where @var{texinfo-source} is
@@ -1013,7 +1013,8 @@ while.
 @item
 In the Emacs distribution.  Since Emacs 18.56, the FAQ at the time
 of release has been part of the Emacs distribution as either
-@file{etc/FAQ} or @file{man/faq.texi} (@pxref{File-name conventions}).
+@file{etc/FAQ}, @file{man/faq.texi}, or (from version 23 onwards)
+@file{doc/misc/faq.texi} (@pxref{File-name conventions}).
 
 @item
 Via anonymous ftp and e-mail from @file{rtfm.mit.edu} (and its mirror in
diff --git a/doc/misc/flymake.texi b/doc/misc/flymake.texi
new file mode 100644 (file)
index 0000000..491ee63
--- /dev/null
@@ -0,0 +1,762 @@
+\input texinfo   @c -*-texinfo-*-
+@comment %**start of header
+@setfilename ../../info/flymake
+@set VERSION 0.3
+@set UPDATED April 2004
+@settitle GNU Flymake @value{VERSION}
+@syncodeindex pg cp
+@comment %**end of header
+
+@copying
+This manual is for GNU Flymake (version @value{VERSION}, @value{UPDATED}),
+which is a universal on-the-fly syntax checker for GNU Emacs.
+
+Copyright @copyright{} 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with the Front-Cover texts being ``A GNU Manual,''
+and with the Back-Cover Texts as in (a) below.  A copy of the license
+is included in the section entitled ``GNU Free Documentation License''
+in the Emacs manual.
+
+(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
+this GNU Manual, like GNU software.  Copies published by the Free
+Software Foundation raise funds for GNU development.''
+
+This document is part of a collection distributed under the GNU Free
+Documentation License.  If you want to distribute this document
+separately from the collection, you can do so by adding a copy of the
+license to the document, as described in section 6 of the license.
+@end quotation
+@end copying
+
+@dircategory Emacs
+@direntry
+* Flymake: (flymake). A universal on-the-fly syntax checker.
+@end direntry
+
+@titlepage
+@title GNU Flymake
+@subtitle for version @value{VERSION}, @value{UPDATED}
+@author Pavel Kobiakov(@email{pk_at_work@@yahoo.com})
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+@contents
+
+@ifnottex
+@node Top
+@top GNU Flymake
+@end ifnottex
+
+@menu
+* Overview of Flymake::
+* Installing Flymake::
+* Using Flymake::
+* Configuring Flymake::
+* Flymake Implementation::
+* GNU Free Documentation License::
+* Index::
+@end menu
+
+@node Overview of Flymake
+@chapter Overview
+@cindex Overview of Flymake
+
+Flymake is a universal on-the-fly syntax checker implemented as an
+Emacs minor mode. Flymake runs the pre-configured syntax check tool
+(compiler for C++ files, @code{perl} for perl files, etc.) in the
+background, passing it a temporary copy of the current buffer, and
+parses the output for known error/warning message patterns. Flymake
+then highlights erroneous lines (i.e. lines for which at least one
+error or warning has been reported by the syntax check tool), and
+displays an overall buffer status in the mode line. Status information
+displayed by Flymake contains total number of errors and warnings
+reported for the buffer during the last syntax check.
+
+@code{flymake-goto-next-error} and @code{flymake-goto-prev-error}
+functions allow for easy navigation to the next/previous erroneous
+line, respectively.
+
+Calling @code{flymake-display-err-menu-for-current-line} will popup a
+menu containing error messages reported by the syntax check tool for
+the current line. Errors/warnings belonging to another file, such as a
+@code{.h} header file included by a @code{.c} file, are shown in the
+current buffer as belonging to the first line. Menu items for such
+messages also contain a filename and a line number. Selecting such a
+menu item will automatically open the file and jump to the line with
+error.
+
+Syntax check is done 'on-the-fly'. It is started whenever
+
+@itemize @bullet
+@item buffer is loaded
+@item a newline character is added to the buffer
+@item some changes were made to the buffer more than @code{0.5} seconds ago (the
+delay is configurable).
+@end itemize
+
+Flymake is a universal syntax checker in the sense that it's easily
+extended to support new syntax check tools and error message
+patterns. @xref{Configuring Flymake}.
+
+@node Installing Flymake
+@chapter Installing
+@cindex Installing Flymake
+
+
+Flymake is packaged in a single file, @code{flymake.el}.
+
+To install/update Flymake, place @code{flymake.el} to a directory
+somewhere on Emacs load path. You might also want to byte-compile
+@code{flymake.el} to improve performance.
+
+Also, place the following line in the @code{.emacs} file.
+
+@lisp
+(require 'flymake)
+@end lisp
+
+You might also map the most frequently used Flymake functions, such as
+@code{flymake-goto-next-error}, to some keyboard shortcuts:
+
+@lisp
+(global-set-key [f3] 'flymake-display-err-menu-for-current-line)
+(global-set-key [f4] 'flymake-goto-next-error)
+@end lisp
+
+@node Using Flymake
+@chapter Using Flymake
+@cindex Using Flymake
+
+@menu
+* Flymake mode::
+* Running the syntax check::
+* Navigating to error lines::
+* Viewing error messages::
+* Syntax check statuses::
+* Troubleshooting::
+@end menu
+
+@node Flymake mode
+@section Flymake mode
+@cindex flymake-mode
+
+Flymake is an Emacs minor mode. To use Flymake, you
+must first activate @code{flymake-mode} by using the
+@code{flymake-mode} function.
+
+Instead of manually activating @code{flymake-mode}, you can configure
+Flymake to automatically enable @code{flymake-mode} upon opening any
+file for which syntax check is possible. To do so, place the following
+line in @code{.emacs}:
+
+@lisp
+(add-hook 'find-file-hook 'flymake-find-file-hook)
+@end lisp
+
+@node Running the syntax check
+@section Running the syntax check
+@cindex Manually starting the syntax check
+
+When @code{flymake-mode} is active, syntax check is started
+automatically on any of the three conditions mentioned above. Syntax
+check can also be started manually by using the
+@code{flymake-start-syntax-check-for-current-buffer} function. This
+can be used, for example, when changes were made to some other buffer
+affecting the current buffer.
+
+@node Navigating to error lines
+@section Navigating to error lines
+@cindex Navigating to error lines
+
+After syntax check is completed, lines for which at least one error or
+warning has been reported are highlighted, and total number of errors
+and warning is shown in the mode line. Use the following functions to
+navigate the highlighted lines.
+
+@multitable @columnfractions 0.25 0.75
+
+@item @code{flymake-goto-next-error}
+@tab Moves point to the next erroneous line, if any.
+
+@item @code{flymake-goto-prev-error}
+@tab Moves point to the previous erroneous line.
+
+@end multitable
+
+These functions treat erroneous lines as a linked list. Therefore,
+@code{flymake-goto-next-error} will go to the first erroneous line
+when invoked in the end of the buffer.
+
+@node Viewing error messages
+@section Viewing error messages
+@cindex Viewing error messages
+
+To view error messages belonging to the current line, use the
+@code{flymake-display-err-menu-for-current-line} function. If there's
+at least one error or warning reported for the current line, this
+function will display a popup menu with error/warning texts.
+Selecting the menu item whose error belongs to another file brings
+forward that file with the help of the
+@code{flymake-goto-file-and-line} function.
+
+@node Syntax check statuses
+@section Syntax check statuses
+@cindex Syntax check statuses
+
+After syntax check is finished, its status is displayed in the mode line.
+The following statuses are defined.
+
+@multitable @columnfractions 0.25 0.75
+@item Flymake* or Flymake:E/W*
+@tab  Flymake is currently running. For the second case, E/W contains the
+      error and warning count for the previous run.
+
+@item Flymake
+@tab  Syntax check is not running. Usually this means syntax check was
+      successfully passed (no errors, no warnings). Other possibilities are:
+      syntax check was killed as a result of executing
+      @code{flymake-compile}, or syntax check cannot start as compilation
+      is currently in progress.
+
+@item Flymake:E/W
+@tab  Number of errors/warnings found by the syntax check process.
+
+@item Flymake:!
+@tab  Flymake was unable to find master file for the current buffer.
+@end multitable
+
+The following errors cause a warning message and switch flymake mode
+OFF for the buffer.
+
+@multitable @columnfractions 0.25 0.75
+@item CFGERR
+@tab  Syntax check process returned nonzero exit code, but no
+      errors/warnings were reported. This indicates a possible configuration
+      error (for example, no suitable error message patterns for the
+      syntax check tool).
+
+@item NOMASTER
+@tab  Flymake was unable to find master file for the current buffer.
+
+@item NOMK
+@tab  Flymake was unable to find a suitable buildfile for the current buffer.
+
+@item PROCERR
+@tab  Flymake was unable to launch a syntax check process.
+@end multitable
+
+
+@node Troubleshooting
+@section Troubleshooting
+@cindex Logging
+@cindex Troubleshooting
+
+Flymake uses a simple logging facility for indicating important points
+in the control flow. The logging facility sends logging messages to
+the @code{*Messages*} buffer. The information logged can be used for
+resolving various problems related to Flymake.
+
+Logging output is controlled by the @code{flymake-log-level}
+variable. @code{3} is the  most verbose level, and @code{-1} switches
+logging off.
+
+@node Configuring Flymake
+@chapter Configuring and Extending Flymake
+@cindex Configuring and Extending Flymake
+
+@menu
+* Customizable variables::
+* Adding support for a new syntax check tool::
+@end menu
+
+Flymake was designed to be easily extended for supporting new syntax
+check tools and error message patterns.
+
+@node Customizable variables
+@section Customizable variables
+@cindex Customizable variables
+
+This section summarizes variables used for Flymake
+configuration.
+
+@table @code
+@item flymake-log-level
+Controls logging output, see @ref{Troubleshooting}.
+
+@item flymake-allowed-file-name-masks
+A list of @code{(filename-regexp, init-function, cleanup-function
+getfname-function)} for configuring syntax check tools. @xref{Adding
+support for a new syntax check tool}.
+
+@item flymake-buildfile-dirs
+A list of directories (relative paths) for searching a
+buildfile. @xref{Locating the buildfile}.
+
+@item flymake-master-file-dirs
+A list of directories for searching a master file. @xref{Locating a
+master file}.
+
+@item flymake-get-project-include-dirs-function
+A function used for obtaining a list of project include dirs (C/C++
+specific). @xref{Getting the include directories}.
+
+@item flymake-master-file-count-limit
+@itemx flymake-check-file-limit
+Used when looking for a master file. @xref{Locating a master file}.
+
+@item flymake-err-line-patterns
+Patterns for error/warning messages in the form @code{(regexp file-idx
+line-idx col-idx err-text-idx)}. @xref{Parsing the output}.
+
+@item flymake-compilation-prevents-syntax-check
+A flag indicating whether compilation and syntax check of the same
+file cannot be run simultaneously.
+
+@item flymake-no-changes-timeout
+If any changes are made to the buffer, syntax check is automatically
+started after @code{flymake-no-changes-timeout} seconds.
+
+@item flymake-gui-warnings-enabled
+A boolean flag indicating whether Flymake will show message boxes for
+non-recoverable errors. If @code{flymake-gui-warnings-enabled} is
+@code{nil}, these errors will only be logged to the @code{*Messages*}
+buffer.
+
+@item flymake-start-syntax-check-on-newline
+A boolean flag indicating whether to start syntax check after a
+newline character is added to the buffer.
+
+@item flymake-errline
+A custom face for highlighting lines for which at least one error has
+been reported.
+
+@item flymake-warnline
+A custom face for highlighting lines for which at least one warning
+and no errors have been reported.
+
+@end table
+
+@node Adding support for a new syntax check tool
+@section Adding support for a new syntax check tool
+@cindex Adding support for a new syntax check tool
+
+@menu
+* Example -- Configuring a tool called directly::
+* Example -- Configuring a tool called via make::
+@end menu
+
+Syntax check tools are configured using the
+@code{flymake-allowed-file-name-masks} list. Each item of this list
+has the following format:
+
+@lisp
+(filename-regexp, init-function, cleanup-function, getfname-function)
+@end lisp
+
+@table @code
+@item filename-regexp
+This field is used as a key for locating init/cleanup/getfname
+functions for the buffer.  Items in
+@code{flymake-allowed-file-name-masks} are searched sequentially. The
+first item with @code{filename-regexp} matching buffer filename is
+selected. If no match is found, @code{flymake-mode} is switched off.
+
+@item init-function
+@code{init-function} is required to initialize the syntax check,
+usually by creating a temporary copy of the buffer contents. The
+function must return @code{(list cmd-name arg-list)}. If
+@code{init-function} returns null, syntax check is aborted, by
+@code{flymake-mode} is not switched off.
+
+@item cleanup-function
+@code{cleanup-function} is called after the syntax check process is
+complete and should take care of proper deinitialization, which is
+usually deleting a temporary copy created by the @code{init-function}.
+
+@item getfname-function
+This function is used for translating filenames reported by the syntax
+check tool into ``real'' filenames. Filenames reported by the tool
+will be different from the real ones, as actually the tool works with
+the temporary copy.  In most cases, the default implementation
+provided by Flymake, @code{flymake-get-real-file-name}, can be used as
+@code{getfname-function}.
+
+@end table
+
+To add support for a new syntax check tool, write corresponding
+@code{init-function}, and, optionally @code{cleanup-function} and
+@code{getfname-function}.  If the format of error messages reported by
+the new tool is not yet supported by Flymake, add a new entry to
+the @code{flymake-err-line-patterns} list.
+
+The following sections contain some examples of configuring Flymake
+support for various syntax check tools.
+
+@node Example -- Configuring a tool called directly
+@subsection Example -- Configuring a tool called directly
+@cindex Adding support for perl
+
+In this example, we will add support for @code{perl} as a syntax check
+tool. @code{perl} supports the @code{-c} option which does syntax
+checking.
+
+First, we write the @code{init-function}:
+
+@lisp
+(defun flymake-perl-init ()
+  (let* ((temp-file (flymake-init-create-temp-buffer-copy
+                     'flymake-create-temp-inplace))
+         (local-file  (concat (flymake-build-relative-filename
+                               (file-name-directory
+                                (buffer-file-name
+                                 (current-buffer)))
+                               (file-name-directory temp-file))
+                              (file-name-nondirectory temp-file))))
+    (list "perl" (list "-wc " local-file))))
+@end lisp
+
+@code{flymake-perl-init} creates a temporary copy of the buffer
+contents with the help of
+@code{flymake-init-create-temp-buffer-copy}, and builds an appropriate
+command line.
+
+Next, we add a new entry to the
+@code{flymake-allowed-file-name-masks}:
+
+@lisp
+(setq flymake-allowed-file-name-masks
+      (cons '(".+\\.pl$"
+              flymake-perl-init
+              flymake-simple-cleanup
+              flymake-get-real-file-name)
+            flymake-allowed-file-name-masks))
+@end lisp
+
+Note that we use standard @code{cleanup-function} and
+@code{getfname-function}.
+
+Finally, we add an entry to @code{flymake-err-line-patterns}:
+
+@lisp
+(setq flymake-err-line-patterns
+      (cons '("\\(.*\\) at \\([^ \n]+\\) line \\([0-9]+\\)[,.\n]"
+              2 3 nil 1)
+            flymake-err-line-patterns))
+@end lisp
+
+@node Example -- Configuring a tool called via make
+@subsection Example -- Configuring a tool called via make
+@cindex Adding support for C (gcc+make)
+
+In this example we will add support for C files syntax checked by
+@code{gcc} called via @code{make}.
+
+We're not required to write any new functions, as Flymake already has
+functions for @code{make}. We just add a new entry to the
+@code{flymake-allowed-file-name-masks}:
+
+@lisp
+(setq flymake-allowed-file-name-masks
+      (cons '(".+\\.c$"
+              flymake-simple-make-init
+              flymake-simple-cleanup
+              flymake-get-real-file-name)
+            flymake-allowed-file-name-masks))
+@end lisp
+
+@code{flymake-simple-make-init} builds the following @code{make}
+command line:
+
+@lisp
+(list "make"
+      (list "-s" "-C"
+            base-dir
+            (concat "CHK_SOURCES=" source)
+            "SYNTAX_CHECK_MODE=1"
+            "check-syntax"))
+@end lisp
+
+@code{base-dir} is a directory containing @code{Makefile}, see @ref{Locating the buildfile}.
+
+Thus, @code{Makefile} must contain the @code{check-syntax} target. In
+our case this target might look like this:
+
+@verbatim
+check-syntax:
+       gcc -o nul -S ${CHK_SOURCES}
+@end verbatim
+
+The format of error messages reported by @code{gcc} is already
+supported by Flymake, so we don't have to add a new entry to
+@code{flymake-err-line-patterns}.
+
+@node Flymake Implementation
+@chapter Flymake Implementation
+@cindex Implementation details
+
+@menu
+* Determining whether syntax check is possible::
+* Making a temporary copy::
+* Locating a master file::
+* Getting the include directories::
+* Locating the buildfile::
+* Starting the syntax check process::
+* Parsing the output::
+* Highlighting erroneous lines::
+* Interaction with other modes::
+@end menu
+
+Syntax check is started by calling @code{flymake-start-syntax-check-for-current-buffer}.
+Flymake first determines whether it is able to do syntax
+check. It then saves a copy of the buffer in a temporary file in the
+buffer's directory (or in the system temp directory -- for java
+files), creates a syntax check command and launches a process with
+this command. The output is parsed using a list of error message patterns,
+and error information (file name, line number, type and text) is
+saved. After the process has finished, Flymake highlights erroneous
+lines in the buffer using the accumulated error information.
+
+@node Determining whether syntax check is possible
+@section Determining whether syntax check is possible
+@cindex Syntax check models
+@cindex Master file
+
+Syntax check is considered possible if there's an entry in
+@code{flymake-allowed-file-name-masks} matching buffer's filename and
+its @code{init-function} returns non-@code{nil} value.
+
+Two syntax check modes are distinguished:
+
+@enumerate
+
+@item
+Buffer can be syntax checked in a standalone fashion, that is, the
+file (its temporary copy, in fact) can be passed over to the compiler to
+do the syntax check. Examples are C/C++ (.c, .cpp) and Java (.java)
+sources.
+
+@item
+Buffer can be syntax checked, but additional file, called master file,
+is required to perform this operation. A master file is a file that
+includes the current file, so that running a syntax check tool on it
+will also check syntax in the current file. Examples are C/C++ (.h,
+.hpp) headers.
+
+@end enumerate
+
+These modes are handled inside init/cleanup/getfname functions, see
+@ref{Adding support for a new syntax check tool}.
+
+Flymake contains implementations of all functionality required to
+support different syntax check modes described above (making
+temporary copies, finding master files, etc.), as well as some
+tool-specific (routines for @code{make}, @code{Ant}, etc.) code.
+
+
+@node Making a temporary copy
+@section Making a temporary copy
+@cindex Temporary copy of the buffer
+@cindex Master file
+
+After the possibility of the syntax check has been determined, a
+temporary copy of the current buffer is made so that the most recent
+unsaved changes could be seen by the syntax check tool. Making a copy
+is quite straightforward in a standalone case (mode @code{1}), as it's
+just saving buffer contents to a temporary file.
+
+Things get trickier, however, when master file is involved, as it
+requires to
+
+@itemize @bullet
+@item locate a master file
+@item patch it to include the current file using its new (temporary)
+name.
+@end itemize
+
+Locating a master file is discussed in the following section.
+
+Patching just changes all appropriate lines of the master file so that they
+use the new (temporary) name of the current file. For example, suppose current
+file name is @code{file.h}, the master file is @code{file.cpp}, and
+it includes current file via @code{#include "file.h"}. Current file's copy
+is saved to file @code{file_flymake.h}, so the include line must be
+changed to @code{#include "file_flymake.h"}. Finally, patched master file
+is saved to @code{file_flymake_master.cpp}, and the last one is passed to
+the syntax check tool.
+
+@node Locating a master file
+@section Locating a master file
+@cindex Master file
+
+Master file is located in two steps.
+
+First, a list of possible master files is built. A simple name
+matching is used to find the files. For a C++ header @code{file.h},
+Flymake searches for all @code{.cpp} files in the directories whose relative paths are
+stored in a customizable variable @code{flymake-master-file-dirs}, which
+usually contains something like @code{("." "./src")}. No more than
+@code{flymake-master-file-count-limit} entries is added to the master file
+list. The list is then sorted to move files with names @code{file.cpp} to
+the top.
+
+Next, each master file in a list is checked to contain the appropriate
+include directives. No more than @code{flymake-check-file-limit} of each
+file are parsed.
+
+For @code{file.h}, the include directives to look for are
+@code{#include "file.h"}, @code{#include "../file.h"}, etc. Each
+include is checked against a list of include directories
+(see @ref{Getting the include directories}) to be sure it points to the
+correct @code{file.h}.
+
+First matching master file found stops the search. The master file is then
+patched and saved to disk. In case no master file is found, syntax check is
+aborted, and corresponding status (!) is reported in the mode line.
+
+@node Getting the include directories
+@section Getting the include directories
+@cindex Include directories (C/C++ specific)
+
+Two sets of include directories are distinguished: system include directories
+and project include directories. The former is just the contents of the
+@code{INCLUDE} environment variable. The latter is not so easy to obtain,
+and the way it can be obtained can vary greatly for different projects.
+Therefore, a customizable variable
+@code{flymake-get-project-include-dirs-function} is used to provide the
+way to implement the desired behavior.
+
+The default implementation, @code{flymake-get-project-include-dirs-imp},
+uses a @code{make} call. This requires a correct base directory, that is, a
+directory containing a correct @code{Makefile}, to be determined.
+
+As obtaining the project include directories might be a costly operation, its
+return value is cached in the hash table. The cache is cleared in the beginning
+of every syntax check attempt.
+
+@node Locating the buildfile
+@section Locating the buildfile
+@cindex Locating the buildfile
+@cindex buildfile, locating
+@cindex Makefile, locating
+
+Flymake can be configured to use different tools for performing syntax
+checks. For example, it can use direct compiler call to syntax check a perl
+script or a call to @code{make} for a more complicated case of a
+@code{C/C++} source. The general idea is that simple files, like perl
+scripts and html pages, can be checked by directly invoking a
+corresponding tool. Files that are usually more complex and generally
+used as part of larger projects, might require non-trivial options to
+be passed to the syntax check tool, like include directories for
+C++. The latter files are syntax checked using some build tool, like
+@code{make} or @code{Ant}.
+
+All @code{make} configuration data is usually stored in a file called
+@code{Makefile}. To allow for future extensions, flymake uses a notion of
+buildfile to reference the 'project configuration' file.
+
+Special function, @code{flymake-find-buildfile} is provided for locating buildfiles.
+Searching for a buildfile is done in a manner similar to that of searching
+for possible master files. A customizable variable
+@code{flymake-buildfile-dirs} holds a list of relative paths to the
+buildfile. They are checked sequentially until a buildfile is found. In case
+there's no build file, syntax check is aborted.
+
+Buildfile values are also cached.
+
+@node Starting the syntax check process
+@section Starting the syntax check process
+@cindex Syntax check process
+
+The command line (command name and the list of arguments) for launching a process is returned by the
+initialization function. Flymake then just calls @code{start-process}
+to start an asynchronous process and configures process filter and
+sentinel which is used for processing the output of the syntax check
+tool.
+
+@node Parsing the output
+@section Parsing the output
+@cindex Parsing the output
+
+The output generated by the syntax check tool is parsed in the process
+filter/sentinel using the error message patterns stored in the
+@code{flymake-err-line-patterns} variable. This variable contains a
+list of items of the form @code{(regexp file-idx line-idx
+err-text-idx)}, used to determine whether a particular line is an
+error message and extract file name, line number and error text,
+respectively. Error type (error/warning) is also guessed by matching
+error text with the '@code{^[wW]arning}' pattern. Anything that was not
+classified as a warning is considered an error. Type is then used to
+sort error menu items, which shows error messages first.
+
+Flymake is also able to interpret error message patterns missing err-text-idx
+information. This is done by merely taking the rest of the matched line
+(@code{(substring line (match-end 0))}) as error text. This trick allows
+to make use of a huge collection of error message line patterns from
+@code{compile.el}. All these error patterns are appended to
+the end of @code{flymake-err-line-patterns}.
+
+The error information obtained is saved in a buffer local
+variable. The buffer for which the process output belongs is
+determined from the process-id@w{}->@w{}buffer mapping updated
+after every process launch/exit.
+
+@node Highlighting erroneous lines
+@section Highlighting erroneous lines
+@cindex Erroneous lines, faces
+
+Highlighting is implemented with overlays and happens in the process
+sentinel, after calling the cleanup function. Two customizable faces
+are used: @code{flymake-errline} and
+@code{flymake-warnline}.  Errors belonging outside the current
+buffer are considered to belong to line 1 of the current buffer.
+
+@node Interaction with other modes
+@section Interaction with other modes
+@cindex Interaction with other modes
+@cindex Interaction with compile mode
+
+The only mode flymake currently knows about is @code{compile}.
+
+Flymake can be configured to not start syntax check if it thinks the
+compilation is in progress. The check is made by the
+@code{flymake-compilation-is-running}, which tests the
+@code{compilation-in-progress} variable. The reason why this might be
+useful is saving CPU time in case both syntax check and compilation
+are very CPU intensive. The original reason for adding this feature,
+though, was working around a locking problem with MS Visual C++ compiler.
+
+Flymake also provides an alternative command for starting compilation,
+@code{flymake-compile}:
+
+@lisp
+(defun flymake-compile ()
+  "Kill all flymake syntax checks then start compilation."
+  (interactive)
+  (flymake-stop-all-syntax-checks)
+  (call-interactively 'compile))
+@end lisp
+
+It just kills all the active syntax check processes before calling
+@code{compile}.
+
+@node GNU Free Documentation License
+@appendix GNU Free Documentation License
+@include doclicense.texi
+
+@node Index
+@unnumbered Index
+
+@printindex cp
+
+@bye
+
+@ignore
+   arch-tag: 9f0db077-5598-49ab-90b9-8df9248a63ec
+@end ignore
diff --git a/doc/misc/forms.texi b/doc/misc/forms.texi
new file mode 100644 (file)
index 0000000..c2afc9a
--- /dev/null
@@ -0,0 +1,985 @@
+\input texinfo                 @c -*-texinfo-*-
+@c documentation for forms-mode
+@c Written by Johan Vromans, and edited by Richard Stallman
+
+@comment %**start of header (This is for running Texinfo on a region.)
+@setfilename ../../info/forms
+@settitle Forms Mode User's Manual
+@syncodeindex vr cp
+@syncodeindex fn cp
+@syncodeindex ky cp
+@iftex
+@finalout
+@setchapternewpage odd
+@end iftex
+@c      @smallbook
+@comment %**end of header (This is for running Texinfo on a region.)
+
+@copying
+This file documents Forms mode, a form-editing major mode for GNU Emacs.
+
+Copyright @copyright{} 1989, 1997, 2001, 2002, 2003, 2004,
+2005, 2006, 2007 Free Software Foundation, Inc.
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with the Front-Cover texts being ``A GNU
+Manual,'' and with the Back-Cover Texts as in (a) below.  A copy of the
+license is included in the section entitled ``GNU Free Documentation
+License'' in the Emacs manual.
+
+(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
+this GNU Manual, like GNU software.  Copies published by the Free
+Software Foundation raise funds for GNU development.''
+
+This document is part of a collection distributed under the GNU Free
+Documentation License.  If you want to distribute this document
+separately from the collection, you can do so by adding a copy of the
+license to the document, as described in section 6 of the license.
+@end quotation
+@end copying
+
+@dircategory Emacs
+@direntry
+* Forms: (forms).      Emacs package for editing data bases
+                         by filling in forms.
+@end direntry
+
+@titlepage
+@sp 6
+@center @titlefont{Forms Mode User's Manual}
+@sp 4
+@center Forms-Mode version 2
+@sp 1
+@center for GNU Emacs 22.1
+@sp 1
+@center April 2007
+@sp 5
+@center Johan Vromans
+@center @i{jvromans@@squirrel.nl}
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+@ifnottex
+@node Top
+@top Forms Mode
+
+Forms mode is an Emacs major mode for working with simple textual data
+bases in a forms-oriented manner.  In Forms mode, the information in
+these files is presented in an Emacs window in a user-defined format,
+one record at a time.  The user can view records or modify their
+contents.
+
+Forms mode is not a simple major mode, but requires two files to do its
+job: a control file and a data file.  The data file holds the
+actual data to be presented.  The control file describes
+how to present it.
+
+@menu
+* Forms Example::               An example: editing the password data base.
+* Entering and Exiting Forms Mode::
+                                How to visit a file in Forms mode.
+* Forms Commands::              Special commands to use while in Forms mode.
+* Data File Format::            How to format the data file.
+* Control File Format::         How to control forms mode.
+* Format Description::          How to define the forms layout.
+* Modifying Forms Contents::    How to modify.
+* Miscellaneous::               Forms mode messages and other remarks.
+* Error Messages::              List of error messages forms mode can produce.
+* Long Example::                A more complex control file example.
+* GNU Free Documentation License:: The license for this documentation.
+* Credits::                     Thanks everyone.
+* Index::                       Index to this manual.
+@end menu
+@end ifnottex
+
+@node Forms Example
+@chapter Forms Example
+
+Let's illustrate Forms mode with an example.  Suppose you are looking at
+the @file{/etc/passwd} file, and the screen looks like this:
+
+@example
+====== /etc/passwd ======
+
+User : root   Uid: 0   Gid: 1
+
+Name : Super User
+
+Home : /
+
+Shell: /bin/sh
+@end example
+
+As you can see, the familiar fields from the entry for the super user
+are all there, but instead of being colon-separated on one single line,
+they make up a forms.
+
+The contents of the forms consist of the contents of the fields of the
+record (e.g. @samp{root}, @samp{0}, @samp{1}, @samp{Super User})
+interspersed with normal text (e.g @samp{User : }, @samp{Uid: }).
+
+If you modify the contents of the fields, Forms mode will analyze your
+changes and update the file appropriately.  You cannot modify the
+interspersed explanatory text (unless you go to some trouble about it),
+because that is marked read-only (@pxref{Text Properties,,, elisp, The
+Emacs Lisp Reference Manual}).
+
+The Forms mode control file specifies the relationship between the
+format of @file{/etc/passwd} and what appears on the screen in Forms
+mode.  @xref{Control File Format}.
+
+@node Entering and Exiting Forms Mode
+@chapter Entering and Exiting Forms Mode
+
+@table @kbd
+@findex forms-find-file
+@item M-x forms-find-file @key{RET} @var{control-file} @key{RET}
+Visit a database using Forms mode.  Specify the name of the
+@strong{control file}, not the data file!
+
+@findex forms-find-file-other-window
+@item M-x forms-find-file-other-window @key{RET} @var{control-file} @key{RET}
+Similar, but displays the file in another window.
+@end table
+
+The command @code{forms-find-file} evaluates the file
+@var{control-file}, and also visits it in Forms mode.  What you see in
+its buffer is not the contents of this file, but rather a single record
+of the corresponding data file that is visited in its own buffer.  So
+there are two buffers involved in Forms mode: the @dfn{forms buffer}
+that is initially used to visit the control file and that shows the
+records being browsed, and the @dfn{data buffer} that holds the data
+file being visited.  The latter buffer is normally not visible.
+
+Initially, the first record is displayed in the forms buffer.
+The mode line displays the major mode name @samp{Forms}, followed by the
+minor mode @samp{View} if the data base is read-only.  The number of the
+current record (@var{n}) and the total number of records in the
+file(@var{t}) are shown in the mode line as @samp{@var{n}/@var{t}}.  For
+example:
+
+@example
+--%%-Emacs: passwd-demo          (Forms View 1/54)----All-------
+@end example
+
+If the buffer is not read-only, you may change the buffer to modify the
+fields in the record.  When you move to a different record, the contents
+of the buffer are parsed using the specifications in
+@code{forms-format-list}, and the data file is updated.  If the record
+has fields that aren't included in the display, they are not changed.
+
+@vindex forms-mode-hooks
+Entering Forms mode runs the normal hook @code{forms-mode-hooks} to
+perform user-defined customization.
+
+To save any modified data, you can use @kbd{C-x C-s}
+(@code{forms-save-buffer}).  This does not save the forms buffer (which would
+be rather useless), but instead saves the buffer visiting the data file.
+
+To terminate Forms mode, you can use @kbd{C-x C-s} (@code{forms-save-buffer})
+and then kill the forms buffer.  However, the data buffer will still
+remain.  If this is not desired, you have to kill this buffer too.
+
+@node Forms Commands
+@chapter Forms Commands
+
+The commands of Forms mode belong to the @kbd{C-c} prefix, with one
+exception: @key{TAB}, which moves to the next field.  Forms mode uses
+different key maps for normal mode and read-only mode.  In read-only
+Forms mode, you can access most of the commands without the @kbd{C-c}
+prefix, but you must type ordinary letters instead of control
+characters; for example, type @kbd{n} instead of @kbd{C-c C-n}.
+
+If your Emacs has been built with X-toolkit support, Forms mode will
+provide its own menu with a number of Forms mode commands.
+
+@table @kbd
+@findex forms-next-record
+@kindex C-c C-n
+@item C-c C-n
+Show the next record (@code{forms-next-record}).  With a numeric
+argument @var{n}, show the @var{n}th next record.
+
+@findex forms-prev-record
+@kindex C-c C-p
+@item C-c C-p
+Show the previous record (@code{forms-prev-record}).  With a numeric
+argument @var{n}, show the @var{n}th previous record.
+
+@findex forms-jump-record
+@kindex C-c C-l
+@item C-c C-l
+Jump to a record by number (@code{forms-jump-record}).   Specify
+the record number with a numeric argument.
+
+@findex forms-first-record
+@kindex C-c <
+@item C-c <
+Jump to the first record (@code{forms-first-record}).
+
+@findex forms-last-record
+@kindex C-c >
+@item C-c >
+Jump to the last record (@code{forms-last-record}).  This command also
+recalculates the number of records in the data file.
+
+@findex forms-next-field
+@kindex TAB
+@item @key{TAB}
+@kindex C-c TAB
+@itemx C-c @key{TAB}
+Jump to the next field in the current record (@code{forms-next-field}).
+With a numeric argument @var{n}, jump forward @var{n} fields.  If this command
+would move past the last field, it wraps around to the first field.
+
+@findex forms-toggle-read-only
+@kindex C-c C-q
+@item C-c C-q
+Toggles read-only mode (@code{forms-toggle-read-only}).  In read-only
+Forms mode, you cannot edit the fields; most Forms mode commands can be
+accessed without the prefix @kbd{C-c} if you use the normal letter
+instead (for example, type @kbd{n} instead of @kbd{C-c C-n}).  In edit
+mode, you can edit the fields and thus change the contents of the data
+base; you must begin Forms mode commands with @code{C-c}.  Switching
+to edit mode is allowed only if you have write access to the data file.
+
+@findex forms-insert-record
+@kindex C-c C-o
+@item C-c C-o
+Create a new record and insert it before the current record
+(@code{forms-insert-record}).  It starts out with empty (or default)
+contents for its fields; you can then edit the fields.  With a numeric
+argument, the new record is created @emph{after} the current one.
+See also @code{forms-modified-record-filter} in @ref{Modifying Forms
+Contents}.
+
+@findex forms-delete-record
+@kindex C-c C-k
+@item C-c C-k
+Delete the current record (@code{forms-delete-record}).  You are
+prompted for confirmation before the record is deleted unless a numeric
+argument has been provided.
+
+@findex forms-search-forward
+@kindex C-c C-s @var{regexp} @key{RET}
+@item C-c C-s @var{regexp} @key{RET}
+Search forward for @var{regexp} in all records following this one
+(@code{forms-search-forward}).  If found, this record is shown.
+If you give an empty argument, the previous regexp is used again.
+
+@findex forms-search-backward
+@kindex C-c C-r @var{regexp} @key{RET}
+@item C-c C-r @var{regexp} @key{RET}
+Search backward for @var{regexp} in all records following this one
+(@code{forms-search-backward}).  If found, this record is shown.
+If you give an empty argument, the previous regexp is used again.
+
+@ignore
+@findex forms-exit
+@kindex C-c C-x
+@item C-c C-x
+Terminate Forms mode processing (@code{forms-exit}).  The data file is
+saved if it has been modified.
+
+@findex forms-exit-no-save
+@item M-x forms-exit-no-save
+Terminates forms mode processing without saving modified data first.
+@end ignore
+
+@findex forms-prev-field
+@item M-x forms-prev-field
+Similar to @code{forms-next-field} but moves backwards.
+
+@findex forms-save-buffer
+@item M-x forms-save-buffer
+@kindex C-x C-s
+@itemx C-x C-s
+Forms mode replacement for @code{save-buffer}. When executed in the
+forms buffer it will save the contents of the (modified) data buffer
+instead. In Forms mode this function will be bound to @kbd{C-x C-s}.
+
+@findex forms-print
+@item M-x forms-print
+This command can be used to make a formatted print
+of the contents of the data file.
+
+@end table
+
+In addition the command @kbd{M-x revert-buffer} is useful in Forms mode
+just as in other modes.
+
+@ignore
+@vindex forms-forms-scroll
+@findex scroll-up
+@findex scroll-down
+If the variable @code{forms-forms-scrolls} is set to a value other
+than @code{nil} (which it is, by default), the Emacs functions
+@code{scroll-up} and @code{scroll-down} will perform a
+@code{forms-next-record} and @code{forms-prev-record} when in forms
+mode.  So you can use your favorite page commands to page through the
+data file.
+
+@vindex forms-forms-jump
+@findex beginning-of-buffer
+@findex end-of-buffer
+Likewise, if the variable @code{forms-forms-jump} is not @code{nil}
+(which it is, by default), Emacs functions @code{beginning-of-buffer}
+and @code{end-of-buffer} will perform @code{forms-first-record} and
+@code{forms-last-record} when in forms mode.
+@end ignore
+
+The following function key definitions are set up in Forms mode
+(whether read-only or not):
+
+@table @kbd
+@kindex next
+@item next
+forms-next-record
+
+@kindex prior
+@item prior
+forms-prev-record
+
+@kindex begin
+@item begin
+forms-first-record
+
+@kindex end
+@item end
+forms-last-record
+
+@kindex S-Tab
+@findex forms-prev-field
+@item S-Tab
+forms-prev-field
+@end table
+
+@node Data File Format
+@chapter Data File Format
+
+@cindex record
+@cindex field
+@vindex forms-field-sep
+Files for use with Forms mode are very simple---each @dfn{record}
+(usually one line) forms the contents of one form.  Each record consists
+of a number of @dfn{fields}, which are separated by the value of the
+string @code{forms-field-sep}, which is @code{"\t"} (a Tab) by default.
+
+@vindex forms-read-file-filter
+@vindex forms-write-file-filter
+If the format of the data file is not suitable enough you can define the
+filter functions @code{forms-read-file-filter} and
+@code{forms-write-file-filter}. @code{forms-read-file-filter} is called
+when the data file is read from disk into the data buffer. It operates
+on the data buffer, ignoring read-only protections. When the data file
+is saved to disk @code{forms-write-file-filter} is called to cancel the
+effects of @code{forms-read-file-filter}. After being saved,
+@code{forms-read-file-filter} is called again to prepare the data buffer
+for further processing.
+
+@cindex pseudo-newline
+@vindex forms-multi-line
+Fields may contain text which shows up in the forms in multiple lines.
+These lines are separated in the field using a ``pseudo-newline''
+character which is defined by the value of the string
+@code{forms-multi-line}.  Its default value is @code{"\^k"} (a Control-K
+character).  If it is
+set to @code{nil}, multiple line fields are prohibited.
+
+If the data file does not exist, it is automatically created.
+
+@node Control File Format
+@chapter Control File Format
+
+@cindex control file
+The Forms mode @dfn{control file} serves two purposes.  First, it names
+the data file to use, and defines its format and properties.  Second,
+the Emacs buffer it occupies is used by Forms mode to display the forms.
+
+The contents of the control file are evaluated as a Lisp program.  It
+should set the following Lisp variables to suitable values:
+
+@table @code
+@vindex forms-file
+@item forms-file
+This variable specifies the name of the data file.  Example:
+
+@example
+(setq forms-file "my/data-file")
+@end example
+
+If the control file doesn't set @code{forms-file}, Forms mode
+reports an error.
+
+@vindex forms-format-list
+@item forms-format-list
+This variable describes the way the fields of the record are formatted on
+the screen.  For details, see @ref{Format Description}.
+
+@vindex forms-number-of-fields
+@item forms-number-of-fields
+This variable holds the number of fields in each record of the data
+file.  Example:
+
+@example
+(setq forms-number-of-fields 10)
+@end example
+@end table
+
+If the control file does not set @code{forms-format-list} a default
+format is used.  In this situation, Forms mode will deduce the number of
+fields from the data file providing this file exists and
+@code{forms-number-of-records} has not been set in the control file.
+
+The control file can optionally set the following additional Forms mode
+variables.  Most of them have default values that are good for most
+applications.
+
+@table @code
+@vindex forms-field-sep
+@item forms-field-sep
+This variable may be used to designate the string which separates the
+fields in the records of the data file.  If not set, it defaults to the
+string @code{"\t"} (a Tab character).  Example:
+
+@example
+(setq forms-field-sep "\t")
+@end example
+
+@vindex forms-read-only
+@item forms-read-only
+If the value is non-@code{nil}, the data file is treated read-only.  (Forms
+mode also treats the data file as read-only if you don't have access to
+write it.)  Example:
+
+@example
+(set forms-read-only t)
+@end example
+
+@vindex forms-multi-line
+@item forms-multi-line
+This variable specifies the @dfn{pseudo newline} separator that allows
+multi-line fields.  This separator goes between the ``lines'' within a
+field---thus, the field doesn't really contain multiple lines, but it
+appears that way when displayed in Forms mode.  If the value is
+@code{nil}, multi-line text fields are prohibited.  The pseudo newline
+must not be a character contained in @code{forms-field-sep}.
+
+The default value is @code{"\^k"}, the character Control-K.  Example:
+
+@example
+(setq forms-multi-line "\^k")
+@end example
+
+@ignore
+@vindex forms-forms-scroll
+@item forms-forms-scroll
+@xref{Forms Mode Commands}, for details.
+
+@vindex forms-forms-jump
+@item forms-forms-jump
+@xref{Forms Mode Commands}, for details.
+@end ignore
+
+@findex forms-read-file-filter
+@item forms-read-file-filter
+This variable holds the name of a function to be called after the data
+file has been read in. This can be used to transform the contents of the
+data file into a format more suitable for forms processing.
+If it is @code{nil}, no function is called.  For example, to maintain a
+gzipped database:
+
+@example
+(defun gzip-read-file-filter ()
+  (shell-command-on-region (point-min) (point-max)
+                           "gzip -d" t t))
+(setq forms-read-file-filter 'gzip-read-file-filter)
+@end example
+
+@findex forms-write-file-filter
+@item forms-write-file-filter
+This variable holds the name of a function to be called before writing
+out the contents of the data file.
+This can be used to undo the effects of @code{forms-read-file-filter}.
+If it is @code{nil}, no function is called.  Example:
+
+@example
+(defun gzip-write-file-filter ()
+  (make-variable-buffer-local 'require-final-newline)
+  (setq require-final-newline nil)
+  (shell-command-on-region (point-min) (point-max)
+                           "gzip" t t))
+(setq forms-write-file-filter 'gzip-write-file-filter)
+@end example
+
+@findex forms-new-record-filter
+@item forms-new-record-filter
+This variable holds a function to be called whenever a new record is created
+to supply default values for fields.  If it is @code{nil}, no function is
+called.
+@xref{Modifying Forms Contents}, for details.
+
+@findex forms-modified-record-filter
+@item  forms-modified-record-filter
+This variable holds a function to be called whenever a record is
+modified, just before updating the Forms data file.  If it is
+@code{nil}, no function is called.
+@xref{Modifying Forms Contents}, for details.
+
+@findex forms-insert-after
+@item forms-insert-after
+If this variable is not @code{nil}, new records are created @emph{after} the
+current record. Also, upon visiting a file, the initial position will be
+at the last record instead of the first one.
+
+@findex forms-check-number-of-fields
+@item forms-check-number-of-fields
+Normally each record is checked to contain the correct number of fields.
+Under certain circumstances, this can be undesirable.
+If this variable is set to @code{nil}, these checks will be bypassed.
+@end table
+
+@node Format Description
+@chapter The Format Description
+
+@vindex forms-format-list
+  The variable @code{forms-format-list} specifies the format of the data
+in the data file, and how to convert the data for display in Forms mode.
+Its value must be a list of Forms mode @dfn{formatting elements}, each
+of which can be a string, a number, a Lisp list, or a Lisp symbol that
+evaluates to one of those.  The formatting elements are processed in the
+order they appear in the list.
+
+@table @var
+@item string
+A string formatting element is inserted in the forms ``as is,'' as text
+that the user cannot alter.
+
+@item number
+A number element selects a field of the record.  The contents of this
+field are inserted in the display at this point.  Field numbers count
+starting from 1 (one).
+
+@item list
+A formatting element that is a list specifies a function call.  This
+function is called every time a record is displayed, and its result,
+which must be a string, is inserted in the display text.  The function
+should do nothing but returning a string.
+
+@vindex forms-fields
+The function you call can access the fields of the record as a list in
+the variable
+@code{forms-fields}.
+
+@item symbol
+A symbol used as a formatting element should evaluate to a string, number,
+or list; the value is interpreted as a formatting element, as described
+above.
+@end table
+
+If a record does not contain the number of fields as specified in
+@code{forms-number-of-fields}, a warning message will be printed.  Excess
+fields are ignored, missing fields are set to empty.
+
+The control file which displays @file{/etc/passwd} file as demonstrated
+in the beginning of this manual might look as follows:
+
+@example
+;; @r{This demo visits @file{/etc/passwd}.}
+
+(setq forms-file "/etc/passwd")
+(setq forms-number-of-fields 7)
+(setq forms-read-only t)                 ; @r{to make sure}
+(setq forms-field-sep ":")
+;; @r{Don't allow multi-line fields.}
+(setq forms-multi-line nil)
+
+(setq forms-format-list
+      (list
+       "====== /etc/passwd ======\n\n"
+       "User : "    1
+       "   Uid: "   3
+       "   Gid: "   4
+       "\n\n"
+       "Name : "    5
+       "\n\n"
+       "Home : "    6
+       "\n\n"
+       "Shell: "    7
+       "\n"))
+@end example
+
+When you construct the value of  @code{forms-format-list}, you should
+usually either quote the whole value, like this,
+
+@example
+(setq forms-format-list
+     '(
+       "====== " forms-file " ======\n\n"
+       "User : "    1
+       (make-string 20 ?-)
+       @dots{}
+      ))
+@end example
+
+@noindent
+or quote the elements which are lists, like this:
+
+@example
+(setq forms-format-list
+      (list
+       "====== " forms-file " ======\n\n"
+       "User : "    1
+       '(make-string 20 ?-)
+       @dots{}
+      ))
+@end example
+
+Forms mode validates the contents of @code{forms-format-list} when you
+visit a database.  If there are errors, processing is aborted with an
+error message which includes a descriptive text.  @xref{Error Messages},
+for a detailed list of error messages.
+
+If no @code{forms-format-list} is specified, Forms mode will supply a
+default format list.  This list contains the name of the file being
+visited, and a simple label for each field indicating the field number.
+
+@node Modifying Forms Contents
+@chapter Modifying The Forms Contents
+
+If @code{forms-read-only} is @code{nil}, the user can modify the fields
+and records of the database.
+
+All normal editing commands are available for editing the contents of the
+displayed record.  You cannot delete or modify the fixed, explanatory
+text that comes from string formatting elements, but you can modify the
+actual field contents.
+
+@ignore
+@c This is for the Emacs 18 version only.
+If the contents of the forms cannot be recognized properly, this is
+signaled using a descriptive text.  @xref{Error Messages}, for more info.
+The cursor will indicate the last part of the forms which was
+successfully parsed.  It's important to avoid entering field contents
+that would cause confusion with the field-separating fixed text.
+@end ignore
+
+If the variable @code{forms-modified-record-filter} is non-@code{nil},
+it is called as a function before the new data is written to the data
+file.  The function receives one argument, a vector that contains the
+contents of the fields of the record.
+
+The function can refer to fields with @code{aref} and modify them with
+@code{aset}.  The first field has number 1 (one); thus, element 0 of the
+vector is not used.  The function should return the same vector it was
+passed; the (possibly modified) contents of the vector determine what is
+actually written in the file.  Here is an example:
+
+@example
+(defun my-modified-record-filter (record)
+  ;; @r{Modify second field.}
+  (aset record 2 (current-time-string))
+  ;; @r{Return the field vector.}
+  record)
+
+(setq forms-modified-record-filter 'my-modified-record-filter)
+@end example
+
+If the variable @code{forms-new-record-filter} is non-@code{nil}, its
+value is a function to be called to fill in default values for the
+fields of a new record.  The function is passed a vector of empty
+strings, one for each field; it should return the same vector, with
+the desired field values stored in it.  Fields are numbered starting
+from 1 (one).  Example:
+
+@example
+(defun my-new-record-filter (fields)
+  (aset fields 5 (login-name))
+  (aset fields 1 (current-time-string))
+  fields)
+
+(setq forms-new-record-filter 'my-new-record-filter)
+@end example
+
+@node Miscellaneous
+@chapter Miscellaneous
+
+@vindex forms-version
+The global variable @code{forms-version} holds the version information
+of the Forms mode software.
+
+@findex forms-enumerate
+It is very convenient to use symbolic names for the fields in a record.
+The function @code{forms-enumerate} provides an elegant means to define
+a series of variables whose values are consecutive integers.  The
+function returns the highest number used, so it can be used to set
+@code{forms-number-of-fields} also.  For example:
+
+@example
+(setq forms-number-of-fields
+      (forms-enumerate
+       '(field1 field2 field3 @dots{})))
+@end example
+
+This sets @code{field1} to 1, @code{field2} to 2, and so on.
+
+Care has been taken to keep the Forms mode variables buffer-local, so it
+is possible to visit multiple files in Forms mode simultaneously, even
+if they have different properties.
+
+@findex forms-mode
+If you have visited the control file in normal fashion with
+@code{find-file} or a like command, you can switch to Forms mode with
+the command @code{M-x forms-mode}.  If you put @samp{-*- forms -*-} in
+the first line of the control file, then visiting it enables Forms mode
+automatically.  But this makes it hard to edit the control file itself,
+so you'd better think twice before using this.
+
+The default format for the data file, using @code{"\t"} to separate
+fields and @code{"\^k"} to separate lines within a field, matches the
+file format of some popular database programs, e.g. FileMaker.  So
+@code{forms-mode} can decrease the need to use proprietary software.
+
+@node Error Messages
+@chapter Error Messages
+
+This section describes all error messages which can be generated by
+forms mode.  Error messages that result from parsing the control file
+all start with the text @samp{Forms control file error}.  Messages
+generated while analyzing the definition of @code{forms-format-list}
+start with @samp{Forms format error}.
+
+@table @code
+@item Forms control file error: `forms-file' has not been set
+The variable @code{forms-file} was not set by the control file.
+
+@item Forms control file error: `forms-number-of-fields' has not been set
+The variable @code{forms-number-of-fields} was not set by the control
+file.
+
+@item Forms control file error: `forms-number-of-fields' must be a number > 0
+The variable @code{forms-number-of-fields} did not contain a positive
+number.
+
+@item Forms control file error: `forms-field-sep' is not a string
+@itemx Forms control file error: `forms-multi-line' must be nil or a one-character string
+The variable @code{forms-multi-line} was set to something other than
+@code{nil} or a single-character string.
+
+@item Forms control file error: `forms-multi-line' is equal to 'forms-field-sep'
+The variable @code{forms-multi-line} may not be equal to
+@code{forms-field-sep} for this would make it impossible to distinguish
+fields and the lines in the fields.
+
+@item Forms control file error: `forms-new-record-filter' is not a function
+@itemx Forms control file error: `forms-modified-record-filter' is not a function
+The variable has been set to something else than a function.
+
+@item Forms control file error: `forms-format-list' is not a list
+The variable @code{forms-format-list} was not set to a Lisp list
+by the control file.
+
+@item Forms format error: field number @var{xx} out of range 1..@var{nn}
+A field number was supplied in @code{forms-format-list} with a value of
+@var{xx}, which was not greater than zero and smaller than or equal to
+the number of fields in the forms, @var{nn}.
+
+@item Forms format error: @var{fun} is not a function
+The first element of a list which is an element of
+@code{forms-format-list} was not a valid Lisp function.
+
+@item Forms format error: invalid element @var{xx}
+A list element was supplied in @code{forms-format-list} which was not a
+string, number or list.
+
+@ignore
+@c This applies to Emacs 18 only.
+@c Error messages generated while a modified form is being analyzed.
+
+@item Parse error: not looking at `...'
+When re-parsing the contents of a forms, the text shown could not
+be found.
+
+@item Parse error: cannot find `...'
+When re-parsing the contents of a forms, the text shown, which
+separates two fields, could not be found.
+
+@item Parse error: cannot parse adjacent fields @var{xx} and @var{yy}
+Fields @var{xx} and @var{yy} were not separated by text, so could not be
+parsed again.
+@end ignore
+
+@item Warning: this record has @var{xx} fields instead of @var{yy}
+The number of fields in this record in the data file did not match
+@code{forms-number-of-fields}.  Missing fields will be made empty.
+
+@item Multi-line fields in this record - update refused!
+The current record contains newline characters, hence can not be written
+back to the data file, for it would corrupt it.  Probably you inserted a
+newline in a field, while @code{forms-multi-line} was @code{nil}.
+
+@item Field separator occurs in record - update refused!
+The current record contains the field separator string inside one of the
+fields. It can not be written back to the data file, for it would
+corrupt it. Probably you inserted the field separator string in a field.
+
+@item Record number @var{xx} out of range 1..@var{yy}
+A jump was made to non-existing record @var{xx}.  @var{yy} denotes the
+number of records in the file.
+
+@item Stuck at record @var{xx}
+An internal error prevented a specific record from being retrieved.
+
+@item No write access to @code{"}@var{file}@code{"}
+An attempt was made to enable edit mode on a file that has been write
+protected.
+
+@item Search failed: @var{regexp}
+The @var{regexp} could not be found in the data file. Forward searching
+is done from the current location until the end of the file, then
+retrying from the beginning of the file until the current location.
+Backward searching is done from the current location until the beginning
+of the file, then retrying from the end of the file until the current
+location.
+
+@item Wrapped
+A search completed successfully after wrapping around.
+
+@item Warning: number of records changed to @var{nn}
+Forms mode's idea of the number of records has been adjusted to the
+number of records actually present in the data file.
+
+@item Problem saving buffers?
+An error occurred while saving the data file buffer. Most likely, Emacs
+did ask to confirm deleting the buffer because it had been modified, and
+you said `no'.
+@end table
+
+@node Long Example
+@chapter Long Example
+
+The following example exploits most of the features of Forms mode.
+This example is included in the distribution as file @file{forms-d2.el}.
+
+@example
+;; demo2 -- demo forms-mode     -*- emacs-lisp -*-
+
+;; @r{This sample forms exploit most of the features of forms mode.}
+
+;; @r{Set the name of the data file.}
+(setq forms-file "forms-d2.dat")
+
+;; @r{Use @code{forms-enumerate} to set field names and number thereof.}
+(setq forms-number-of-fields
+      (forms-enumerate
+       '(arch-newsgroup                 ; 1
+         arch-volume                    ; 2
+         arch-issue                     ; and ...
+         arch-article                   ; ... so
+         arch-shortname                 ; ... ... on
+         arch-parts
+         arch-from
+         arch-longname
+         arch-keywords
+         arch-date
+         arch-remarks)))
+
+;; @r{The following functions are used by this form for layout purposes.}
+;;
+(defun arch-tocol (target &optional fill)
+  "Produces a string to skip to column TARGET.
+Prepends newline if needed.
+The optional FILL should be a character, used to fill to the column."
+  (if (null fill)
+      (setq fill ? ))
+  (if (< target (current-column))
+      (concat "\n" (make-string target fill))
+    (make-string (- target (current-column)) fill)))
+;;
+(defun arch-rj (target field &optional fill)
+  "Produces a string to skip to column TARGET\
+ minus the width of field FIELD.
+Prepends newline if needed.
+The optional FILL should be a character,
+used to fill to the column."
+  (arch-tocol (- target (length (nth field forms-fields))) fill))
+
+;; @r{Record filters.}
+;;
+(defun new-record-filter (the-record)
+  "Form a new record with some defaults."
+  (aset the-record arch-from (user-full-name))
+  (aset the-record arch-date (current-time-string))
+  the-record)                           ; return it
+(setq forms-new-record-filter 'new-record-filter)
+
+;; @r{The format list.}
+(setq forms-format-list
+     (list
+       "====== Public Domain Software Archive ======\n\n"
+       arch-shortname
+       " - "                    arch-longname
+       "\n\n"
+       "Article: "              arch-newsgroup
+       "/"                      arch-article
+       " "
+       '(arch-tocol 40)
+       "Issue: "                arch-issue
+       " "
+       '(arch-rj 73 10)
+       "Date: "                 arch-date
+       "\n\n"
+       "Submitted by: "         arch-from
+       "\n"
+       '(arch-tocol 79 ?-)
+       "\n"
+       "Keywords: "             arch-keywords
+       "\n\n"
+       "Parts: "                arch-parts
+       "\n\n====== Remarks ======\n\n"
+       arch-remarks
+     ))
+
+;; @r{That's all, folks!}
+@end example
+
+@node Credits
+@chapter Credits
+
+Bug fixes and other useful suggestions were supplied by
+Harald Hanche-Olsen (@code{hanche@@imf.unit.no}),
+@code{cwitty@@portia.stanford.edu},
+Jonathan I. Kamens,
+Per Cederqvist  (@code{ceder@@signum.se}),
+Michael Lipka (@code{lipka@@lip.hanse.de}),
+Andy Piper (@code{ajp@@eng.cam.ac.uk}),
+Frederic Pierresteguy  (@code{F.Pierresteguy@@frcl.bull.fr}),
+Ignatios Souvatzis
+and Richard Stallman (@code{rms@@gnu.org}).
+
+This documentation was slightly inspired by the documentation of ``rolo
+mode'' by Paul Davis at Schlumberger Cambridge Research
+(@code{davis%scrsu1%sdr.slb.com@@relay.cs.net}).
+
+None of this would have been possible without GNU Emacs of the Free
+Software Foundation.  Thanks, Richard!
+
+@node GNU Free Documentation License
+@appendix GNU Free Documentation License
+@include doclicense.texi
+
+@node Index
+@unnumbered Index
+@printindex cp
+
+@contents
+@bye
+
+@ignore
+   arch-tag: 2ac9810b-aa49-4ea6-8030-d7f1ecd467ed
+@end ignore
similarity index 100%
rename from man/gnus-faq.texi
rename to doc/misc/gnus-faq.texi
diff --git a/doc/misc/gnus.texi b/doc/misc/gnus.texi
new file mode 100644 (file)
index 0000000..4093b06
--- /dev/null
@@ -0,0 +1,29544 @@
+\input texinfo
+
+@setfilename ../../info/gnus
+@settitle Gnus Manual
+@syncodeindex fn cp
+@syncodeindex vr cp
+@syncodeindex pg cp
+
+@copying
+Copyright @copyright{} 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with the Front-Cover texts being ``A GNU
+Manual'', and with the Back-Cover Texts as in (a) below.  A copy of the
+license is included in the section entitled ``GNU Free Documentation
+License'' in the Emacs manual.
+
+(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
+this GNU Manual, like GNU software.  Copies published by the Free
+Software Foundation raise funds for GNU development.''
+
+This document is part of a collection distributed under the GNU Free
+Documentation License.  If you want to distribute this document
+separately from the collection, you can do so by adding a copy of the
+license to the document, as described in section 6 of the license.
+@end quotation
+@end copying
+
+@iftex
+@iflatex
+\documentclass[twoside,a4paper,openright,11pt]{book}
+\usepackage[latin1]{inputenc}
+\usepackage{pagestyle}
+\usepackage{epsfig}
+\usepackage{pixidx}
+\input{gnusconfig.tex}
+
+\ifx\pdfoutput\undefined
+\else
+\usepackage[pdftex,bookmarks,colorlinks=true]{hyperref}
+\usepackage{thumbpdf}
+\pdfcompresslevel=9
+\fi
+
+\makeindex
+\begin{document}
+
+% Adjust ../Makefile.in if you change the following line:
+\newcommand{\gnusversionname}{Gnus v5.11}
+\newcommand{\gnuschaptername}{}
+\newcommand{\gnussectionname}{}
+
+\newcommand{\gnusbackslash}{/}
+
+\newcommand{\gnusref}[1]{``#1'' on page \pageref{#1}}
+\ifx\pdfoutput\undefined
+\newcommand{\gnusuref}[1]{\gnustt{#1}}
+\else
+\newcommand{\gnusuref}[1]{\href{#1}{\gnustt{#1}}}
+\fi
+\newcommand{\gnusxref}[1]{See ``#1'' on page \pageref{#1}}
+\newcommand{\gnuspxref}[1]{see ``#1'' on page \pageref{#1}}
+
+\newcommand{\gnuskindex}[1]{\index{#1}}
+\newcommand{\gnusindex}[1]{\index{#1}}
+
+\newcommand{\gnustt}[1]{{\gnusselectttfont{}#1}}
+\newcommand{\gnuscode}[1]{\gnustt{#1}}
+\newcommand{\gnusasis}[1]{\gnustt{#1}}
+\newcommand{\gnusurl}[1]{\gnustt{#1}}
+\newcommand{\gnuscommand}[1]{\gnustt{#1}}
+\newcommand{\gnusenv}[1]{\gnustt{#1}}
+\newcommand{\gnussamp}[1]{``{\fontencoding{OT1}\gnusselectttfont{}#1}''}
+\newcommand{\gnuslisp}[1]{\gnustt{#1}}
+\newcommand{\gnuskbd}[1]{`\gnustt{#1}'}
+\newcommand{\gnuskey}[1]{`\gnustt{#1}'}
+\newcommand{\gnusfile}[1]{`\gnustt{#1}'}
+\newcommand{\gnusdfn}[1]{\textit{#1}}
+\newcommand{\gnusi}[1]{\textit{#1}}
+\newcommand{\gnusr}[1]{\textrm{#1}}
+\newcommand{\gnusstrong}[1]{\textbf{#1}}
+\newcommand{\gnusemph}[1]{\textit{#1}}
+\newcommand{\gnusvar}[1]{{\fontsize{10pt}{10}\selectfont\textsl{\textsf{#1}}}}
+\newcommand{\gnussc}[1]{\textsc{#1}}
+\newcommand{\gnustitle}[1]{{\huge\textbf{#1}}}
+\newcommand{\gnusversion}[1]{{\small\textit{#1}}}
+\newcommand{\gnusauthor}[1]{{\large\textbf{#1}}}
+\newcommand{\gnusresult}[1]{\gnustt{=> #1}}
+\newcommand{\gnusacronym}[1]{\textsc{#1}}
+\newcommand{\gnusemail}[1]{\textit{#1}}
+
+\newcommand{\gnusbullet}{{${\bullet}$}}
+\newcommand{\gnusdollar}{\$}
+\newcommand{\gnusampersand}{\&}
+\newcommand{\gnuspercent}{\%}
+\newcommand{\gnushash}{\#}
+\newcommand{\gnushat}{\symbol{"5E}}
+\newcommand{\gnusunderline}{\symbol{"5F}}
+\newcommand{\gnusnot}{$\neg$}
+\newcommand{\gnustilde}{\symbol{"7E}}
+\newcommand{\gnusless}{{$<$}}
+\newcommand{\gnusgreater}{{$>$}}
+\newcommand{\gnusbraceleft}{{$>$}}
+\newcommand{\gnusbraceright}{{$>$}}
+
+\newcommand{\gnushead}{\raisebox{-1cm}{\epsfig{figure=ps/gnus-head,height=1cm}}}
+\newcommand{\gnusinteresting}{
+\marginpar[\mbox{}\hfill\gnushead]{\gnushead}
+}
+
+\newcommand{\gnuscleardoublepage}{\ifodd\count0\mbox{}\clearpage\thispagestyle{empty}\mbox{}\clearpage\else\clearpage\fi}
+
+\newcommand{\gnuspagechapter}[1]{
+{\mbox{}}
+}
+
+\newdimen{\gnusdimen}
+\gnusdimen 0pt
+
+\newcommand{\gnuschapter}[2]{
+\gnuscleardoublepage
+\ifdim \gnusdimen = 0pt\setcounter{page}{1}\pagestyle{gnus}\pagenumbering{arabic} \gnusdimen 1pt\fi
+\chapter{#2}
+\renewcommand{\gnussectionname}{}
+\renewcommand{\gnuschaptername}{#2}
+\thispagestyle{empty}
+\hspace*{-2cm}
+\begin{picture}(500,500)(0,0)
+\put(480,350){\makebox(0,0)[tr]{#1}}
+\put(40,300){\makebox(500,50)[bl]{{\Huge\bf{#2}}}}
+\end{picture}
+\clearpage
+}
+
+\newcommand{\gnusfigure}[3]{
+\begin{figure}
+\mbox{}\ifodd\count0\hspace*{-0.8cm}\else\hspace*{-3cm}\fi\begin{picture}(440,#2)
+#3
+\end{picture}
+\caption{#1}
+\end{figure}
+}
+
+\newcommand{\gnusicon}[1]{
+\marginpar[\mbox{}\hfill\raisebox{-1.5cm}{\epsfig{figure=ps/#1-up,height=1.5cm}}]{\raisebox{-1cm}{\epsfig{figure=ps/#1-up,height=1cm}}}
+}
+
+\newcommand{\gnuspicon}[1]{
+\margindex{\epsfig{figure=#1,width=2cm}}
+}
+
+\newcommand{\gnusxface}[2]{
+\margindex{\epsfig{figure=#1,width=1cm}\epsfig{figure=#2,width=1cm}}
+}
+
+\newcommand{\gnussmiley}[2]{
+\margindex{\makebox[2cm]{\hfill\epsfig{figure=#1,width=0.5cm}\hfill\epsfig{figure=#2,width=0.5cm}\hfill}}
+}
+
+\newcommand{\gnusitemx}[1]{\mbox{}\vspace*{-\itemsep}\vspace*{-\parsep}\item#1}
+
+\newcommand{\gnussection}[1]{
+\renewcommand{\gnussectionname}{#1}
+\section{#1}
+}
+
+\newenvironment{codelist}%
+{\begin{list}{}{
+}
+}{\end{list}}
+
+\newenvironment{asislist}%
+{\begin{list}{}{
+}
+}{\end{list}}
+
+\newenvironment{kbdlist}%
+{\begin{list}{}{
+\labelwidth=0cm
+}
+}{\end{list}}
+
+\newenvironment{dfnlist}%
+{\begin{list}{}{
+}
+}{\end{list}}
+
+\newenvironment{stronglist}%
+{\begin{list}{}{
+}
+}{\end{list}}
+
+\newenvironment{samplist}%
+{\begin{list}{}{
+}
+}{\end{list}}
+
+\newenvironment{varlist}%
+{\begin{list}{}{
+}
+}{\end{list}}
+
+\newenvironment{emphlist}%
+{\begin{list}{}{
+}
+}{\end{list}}
+
+\newlength\gnusheadtextwidth
+\setlength{\gnusheadtextwidth}{\headtextwidth}
+\addtolength{\gnusheadtextwidth}{1cm}
+
+\newpagestyle{gnuspreamble}%
+{
+{
+\ifodd\count0
+{
+\hspace*{-0.23cm}\underline{\makebox[\gnusheadtextwidth]{\mbox{}}\textbf{\hfill\roman{page}}}
+}
+\else
+{
+\hspace*{-3.25cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\roman{page}\hfill\mbox{}}}
+}
+}
+\fi
+}
+}
+{
+\ifodd\count0
+\mbox{} \hfill
+\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo,height=1cm}}
+\else
+\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo,height=1cm}}
+\hfill \mbox{}
+\fi
+}
+
+\newpagestyle{gnusindex}%
+{
+{
+\ifodd\count0
+{
+\hspace*{-0.23cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\gnuschaptername\hfill\arabic{page}}}}
+}
+\else
+{
+\hspace*{-3.25cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{page}\hfill\gnuschaptername}}}
+}
+\fi
+}
+}
+{
+\ifodd\count0
+\mbox{} \hfill
+\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo,height=1cm}}
+\else
+\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo,height=1cm}}
+\hfill \mbox{}
+\fi
+}
+
+\newpagestyle{gnus}%
+{
+{
+\ifodd\count0
+{
+\makebox[12cm]{\hspace*{3.1cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{chapter}.\arabic{section}} \textbf{\gnussectionname\hfill\arabic{page}}}}}
+}
+\else
+{
+\makebox[12cm]{\hspace*{-2.95cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{page}\hfill\gnuschaptername}}}}
+}
+\fi
+}
+}
+{
+\ifodd\count0
+\mbox{} \hfill
+\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo,height=1cm}}
+\else
+\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo,height=1cm}}
+\hfill \mbox{}
+\fi
+}
+
+\pagenumbering{roman}
+\pagestyle{gnuspreamble}
+
+@end iflatex
+@end iftex
+
+@iftex
+@iflatex
+
+\begin{titlepage}
+{
+
+%\addtolength{\oddsidemargin}{-5cm}
+%\addtolength{\evensidemargin}{-5cm}
+\parindent=0cm
+\addtolength{\textheight}{2cm}
+
+\gnustitle{\gnustitlename}\hfill\gnusversion{\gnusversionname}\\
+\rule{15cm}{1mm}\\
+\vfill
+\hspace*{0cm}\epsfig{figure=ps/gnus-big-logo,height=15cm}
+\vfill
+\rule{15cm}{1mm}\\
+\gnusauthor{by Lars Magne Ingebrigtsen}
+\newpage
+}
+
+\mbox{}
+\vfill
+
+\thispagestyle{empty}
+
+@c @insertcopying
+\newpage
+\end{titlepage}
+@end iflatex
+@end iftex
+
+@ifnottex
+@insertcopying
+@end ifnottex
+
+@dircategory Emacs
+@direntry
+* Gnus: (gnus).         The newsreader Gnus.
+@end direntry
+@iftex
+@finalout
+@end iftex
+@setchapternewpage odd
+
+
+
+@titlepage
+@title Gnus Manual
+
+@author by Lars Magne Ingebrigtsen
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+
+@node Top
+@top The Gnus Newsreader
+
+@ifinfo
+
+You can read news (and mail) from within Emacs by using Gnus.  The news
+can be gotten by any nefarious means you can think of---@acronym{NNTP}, local
+spool or your mbox file.  All at the same time, if you want to push your
+luck.
+
+@c Adjust ../Makefile.in if you change the following line:
+This manual corresponds to Gnus v5.11.
+
+@end ifinfo
+
+@iftex
+
+@iflatex
+\tableofcontents
+\gnuscleardoublepage
+@end iflatex
+
+Gnus is the advanced, self-documenting, customizable, extensible
+unreal-time newsreader for GNU Emacs.
+
+Oops.  That sounds oddly familiar, so let's start over again to avoid
+being accused of plagiarism:
+
+Gnus is a message-reading laboratory.  It will let you look at just
+about anything as if it were a newsgroup.  You can read mail with it,
+you can browse directories with it, you can @code{ftp} with it---you
+can even read news with it!
+
+Gnus tries to empower people who read news the same way Emacs empowers
+people who edit text.  Gnus sets no limits to what the user should be
+allowed to do.  Users are encouraged to extend Gnus to make it behave
+like they want it to behave.  A program should not control people;
+people should be empowered to do what they want by using (or abusing)
+the program.
+
+@end iftex
+
+@menu
+* Starting Up::              Finding news can be a pain.
+* Group Buffer::             Selecting, subscribing and killing groups.
+* Summary Buffer::           Reading, saving and posting articles.
+* Article Buffer::           Displaying and handling articles.
+* Composing Messages::       Information on sending mail and news.
+* Select Methods::           Gnus reads all messages from various select methods.
+* Scoring::                  Assigning values to articles.
+* Various::                  General purpose settings.
+* The End::                  Farewell and goodbye.
+* Appendices::               Terminology, Emacs intro, @acronym{FAQ}, History, Internals.
+* GNU Free Documentation License:: The license for this documentation.
+* Index::                    Variable, function and concept index.
+* Key Index::                Key Index.
+
+Other related manuals
+
+* Message:(message).         Composing messages.
+* Emacs-MIME:(emacs-mime).   Composing messages; @acronym{MIME}-specific parts.
+* Sieve:(sieve).             Managing Sieve scripts in Emacs.
+* PGG:(pgg).                 @acronym{PGP/MIME} with Gnus.
+
+@detailmenu
+ --- The Detailed Node Listing ---
+
+Starting Gnus
+
+* Finding the News::            Choosing a method for getting news.
+* The First Time::              What does Gnus do the first time you start it?
+* The Server is Down::          How can I read my mail then?
+* Slave Gnusae::                You can have more than one Gnus active at a time.
+* Fetching a Group::            Starting Gnus just to read a group.
+* New Groups::                  What is Gnus supposed to do with new groups?
+* Changing Servers::            You may want to move from one server to another.
+* Startup Files::               Those pesky startup files---@file{.newsrc}.
+* Auto Save::                   Recovering from a crash.
+* The Active File::             Reading the active file over a slow line Takes Time.
+* Startup Variables::           Other variables you might change.
+
+New Groups
+
+* Checking New Groups::         Determining what groups are new.
+* Subscription Methods::        What Gnus should do with new groups.
+* Filtering New Groups::        Making Gnus ignore certain new groups.
+
+Group Buffer
+
+* Group Buffer Format::         Information listed and how you can change it.
+* Group Maneuvering::           Commands for moving in the group buffer.
+* Selecting a Group::           Actually reading news.
+* Subscription Commands::       Unsubscribing, killing, subscribing.
+* Group Data::                  Changing the info for a group.
+* Group Levels::                Levels? What are those, then?
+* Group Score::                 A mechanism for finding out what groups you like.
+* Marking Groups::              You can mark groups for later processing.
+* Foreign Groups::              Creating and editing groups.
+* Group Parameters::            Each group may have different parameters set.
+* Listing Groups::              Gnus can list various subsets of the groups.
+* Sorting Groups::              Re-arrange the group order.
+* Group Maintenance::           Maintaining a tidy @file{.newsrc} file.
+* Browse Foreign Server::       You can browse a server.  See what it has to offer.
+* Exiting Gnus::                Stop reading news and get some work done.
+* Group Topics::                A folding group mode divided into topics.
+* Misc Group Stuff::            Other stuff that you can to do.
+
+Group Buffer Format
+
+* Group Line Specification::    Deciding how the group buffer is to look.
+* Group Mode Line Specification::  The group buffer mode line.
+* Group Highlighting::          Having nice colors in the group buffer.
+
+Group Topics
+
+* Topic Commands::              Interactive E-Z commands.
+* Topic Variables::             How to customize the topics the Lisp Way.
+* Topic Sorting::               Sorting each topic individually.
+* Topic Topology::              A map of the world.
+* Topic Parameters::            Parameters that apply to all groups in a topic.
+
+Misc Group Stuff
+
+* Scanning New Messages::       Asking Gnus to see whether new messages have arrived.
+* Group Information::           Information and help on groups and Gnus.
+* Group Timestamp::             Making Gnus keep track of when you last read a group.
+* File Commands::               Reading and writing the Gnus files.
+* Sieve Commands::              Managing Sieve scripts.
+
+Summary Buffer
+
+* Summary Buffer Format::       Deciding how the summary buffer is to look.
+* Summary Maneuvering::         Moving around the summary buffer.
+* Choosing Articles::           Reading articles.
+* Paging the Article::          Scrolling the current article.
+* Reply Followup and Post::     Posting articles.
+* Delayed Articles::            Send articles at a later time.
+* Marking Articles::            Marking articles as read, expirable, etc.
+* Limiting::                    You can limit the summary buffer.
+* Threading::                   How threads are made.
+* Sorting the Summary Buffer::  How articles and threads are sorted.
+* Asynchronous Fetching::       Gnus might be able to pre-fetch articles.
+* Article Caching::             You may store articles in a cache.
+* Persistent Articles::         Making articles expiry-resistant.
+* Article Backlog::             Having already read articles hang around.
+* Saving Articles::             Ways of customizing article saving.
+* Decoding Articles::           Gnus can treat series of (uu)encoded articles.
+* Article Treatment::           The article buffer can be mangled at will.
+* MIME Commands::               Doing MIMEy things with the articles.
+* Charsets::                    Character set issues.
+* Article Commands::            Doing various things with the article buffer.
+* Summary Sorting::             Sorting the summary buffer in various ways.
+* Finding the Parent::          No child support? Get the parent.
+* Alternative Approaches::      Reading using non-default summaries.
+* Tree Display::                A more visual display of threads.
+* Mail Group Commands::         Some commands can only be used in mail groups.
+* Various Summary Stuff::       What didn't fit anywhere else.
+* Exiting the Summary Buffer::  Returning to the Group buffer,
+                                or reselecting the current group.
+* Crosspost Handling::          How crossposted articles are dealt with.
+* Duplicate Suppression::       An alternative when crosspost handling fails.
+* Security::                    Decrypt and Verify.
+* Mailing List::                Mailing list minor mode.
+
+Summary Buffer Format
+
+* Summary Buffer Lines::        You can specify how summary lines should look.
+* To From Newsgroups::          How to not display your own name.
+* Summary Buffer Mode Line::    You can say how the mode line should look.
+* Summary Highlighting::        Making the summary buffer all pretty and nice.
+
+Choosing Articles
+
+* Choosing Commands::           Commands for choosing articles.
+* Choosing Variables::          Variables that influence these commands.
+
+Reply, Followup and Post
+
+* Summary Mail Commands::       Sending mail.
+* Summary Post Commands::       Sending news.
+* Summary Message Commands::    Other Message-related commands.
+* Canceling and Superseding::
+
+Marking Articles
+
+* Unread Articles::             Marks for unread articles.
+* Read Articles::               Marks for read articles.
+* Other Marks::                 Marks that do not affect readedness.
+* Setting Marks::               How to set and remove marks.
+* Generic Marking Commands::    How to customize the marking.
+* Setting Process Marks::       How to mark articles for later processing.
+
+Threading
+
+* Customizing Threading::       Variables you can change to affect the threading.
+* Thread Commands::             Thread based commands in the summary buffer.
+
+Customizing Threading
+
+* Loose Threads::               How Gnus gathers loose threads into bigger threads.
+* Filling In Threads::          Making the threads displayed look fuller.
+* More Threading::              Even more variables for fiddling with threads.
+* Low-Level Threading::         You thought it was over@dots{} but you were wrong!
+
+Decoding Articles
+
+* Uuencoded Articles::          Uudecode articles.
+* Shell Archives::              Unshar articles.
+* PostScript Files::            Split PostScript.
+* Other Files::                 Plain save and binhex.
+* Decoding Variables::          Variables for a happy decoding.
+* Viewing Files::               You want to look at the result of the decoding?
+
+Decoding Variables
+
+* Rule Variables::              Variables that say how a file is to be viewed.
+* Other Decode Variables::      Other decode variables.
+* Uuencoding and Posting::      Variables for customizing uuencoding.
+
+Article Treatment
+
+* Article Highlighting::        You want to make the article look like fruit salad.
+* Article Fontisizing::         Making emphasized text look nice.
+* Article Hiding::              You also want to make certain info go away.
+* Article Washing::             Lots of way-neat functions to make life better.
+* Article Header::              Doing various header transformations.
+* Article Buttons::             Click on URLs, Message-IDs, addresses and the like.
+* Article Button Levels::       Controlling appearance of buttons.
+* Article Date::                Grumble, UT!
+* Article Display::             Display various stuff---X-Face, Picons, Smileys
+* Article Signature::           What is a signature?
+* Article Miscellanea::         Various other stuff.
+
+Alternative Approaches
+
+* Pick and Read::               First mark articles and then read them.
+* Binary Groups::               Auto-decode all articles.
+
+Various Summary Stuff
+
+* Summary Group Information::   Information oriented commands.
+* Searching for Articles::      Multiple article commands.
+* Summary Generation Commands::
+* Really Various Summary Commands::  Those pesky non-conformant commands.
+
+Article Buffer
+
+* Hiding Headers::              Deciding what headers should be displayed.
+* Using MIME::                  Pushing articles through @acronym{MIME} before reading them.
+* Customizing Articles::        Tailoring the look of the articles.
+* Article Keymap::              Keystrokes available in the article buffer.
+* Misc Article::                Other stuff.
+
+Composing Messages
+
+* Mail::                        Mailing and replying.
+* Posting Server::              What server should you post and mail via?
+* POP before SMTP::             You cannot send a mail unless you read a mail.
+* Mail and Post::               Mailing and posting at the same time.
+* Archived Messages::           Where Gnus stores the messages you've sent.
+* Posting Styles::              An easier way to specify who you are.
+* Drafts::                      Postponing messages and rejected messages.
+* Rejected Articles::           What happens if the server doesn't like your article?
+* Signing and encrypting::      How to compose secure messages.
+
+Select Methods
+
+* Server Buffer::               Making and editing virtual servers.
+* Getting News::                Reading USENET news with Gnus.
+* Getting Mail::                Reading your personal mail with Gnus.
+* Browsing the Web::            Getting messages from a plethora of Web sources.
+* IMAP::                        Using Gnus as a @acronym{IMAP} client.
+* Other Sources::               Reading directories, files, SOUP packets.
+* Combined Groups::             Combining groups into one group.
+* Email Based Diary::           Using mails to manage diary events in Gnus.
+* Gnus Unplugged::              Reading news and mail offline.
+
+Server Buffer
+
+* Server Buffer Format::        You can customize the look of this buffer.
+* Server Commands::             Commands to manipulate servers.
+* Example Methods::             Examples server specifications.
+* Creating a Virtual Server::   An example session.
+* Server Variables::            Which variables to set.
+* Servers and Methods::         You can use server names as select methods.
+* Unavailable Servers::         Some servers you try to contact may be down.
+
+Getting News
+
+* NNTP::                        Reading news from an @acronym{NNTP} server.
+* News Spool::                  Reading news from the local spool.
+
+@acronym{NNTP}
+
+* Direct Functions::            Connecting directly to the server.
+* Indirect Functions::          Connecting indirectly to the server.
+* Common Variables::            Understood by several connection functions.
+
+Getting Mail
+
+* Mail in a Newsreader::        Important introductory notes.
+* Getting Started Reading Mail::  A simple cookbook example.
+* Splitting Mail::              How to create mail groups.
+* Mail Sources::                How to tell Gnus where to get mail from.
+* Mail Back End Variables::     Variables for customizing mail handling.
+* Fancy Mail Splitting::        Gnus can do hairy splitting of incoming mail.
+* Group Mail Splitting::        Use group customize to drive mail splitting.
+* Incorporating Old Mail::      What about the old mail you have?
+* Expiring Mail::               Getting rid of unwanted mail.
+* Washing Mail::                Removing cruft from the mail you get.
+* Duplicates::                  Dealing with duplicated mail.
+* Not Reading Mail::            Using mail back ends for reading other files.
+* Choosing a Mail Back End::    Gnus can read a variety of mail formats.
+
+Mail Sources
+
+* Mail Source Specifiers::      How to specify what a mail source is.
+* Mail Source Customization::   Some variables that influence things.
+* Fetching Mail::               Using the mail source specifiers.
+
+Choosing a Mail Back End
+
+* Unix Mail Box::               Using the (quite) standard Un*x mbox.
+* Rmail Babyl::                 Emacs programs use the Rmail Babyl format.
+* Mail Spool::                  Store your mail in a private spool?
+* MH Spool::                    An mhspool-like back end.
+* Maildir::                     Another one-file-per-message format.
+* Mail Folders::                Having one file for each group.
+* Comparing Mail Back Ends::    An in-depth looks at pros and cons.
+
+Browsing the Web
+
+* Archiving Mail::
+* Web Searches::                Creating groups from articles that match a string.
+* Slashdot::                    Reading the Slashdot comments.
+* Ultimate::                    The Ultimate Bulletin Board systems.
+* Web Archive::                 Reading mailing list archived on web.
+* RSS::                         Reading RDF site summary.
+* Customizing W3::              Doing stuff to Emacs/W3 from Gnus.
+
+@acronym{IMAP}
+
+* Splitting in IMAP::           Splitting mail with nnimap.
+* Expiring in IMAP::            Expiring mail with nnimap.
+* Editing IMAP ACLs::           Limiting/enabling other users access to a mailbox.
+* Expunging mailboxes::         Equivalent of a ``compress mailbox'' button.
+* A note on namespaces::        How to (not) use @acronym{IMAP} namespace in Gnus.
+* Debugging IMAP::              What to do when things don't work.
+
+Other Sources
+
+* Directory Groups::            You can read a directory as if it was a newsgroup.
+* Anything Groups::             Dired?  Who needs dired?
+* Document Groups::             Single files can be the basis of a group.
+* SOUP::                        Reading @sc{soup} packets ``offline''.
+* Mail-To-News Gateways::       Posting articles via mail-to-news gateways.
+
+Document Groups
+
+* Document Server Internals::   How to add your own document types.
+
+SOUP
+
+* SOUP Commands::               Commands for creating and sending @sc{soup} packets
+* SOUP Groups::                 A back end for reading @sc{soup} packets.
+* SOUP Replies::                How to enable @code{nnsoup} to take over mail and news.
+
+Combined Groups
+
+* Virtual Groups::              Combining articles from many groups.
+* Kibozed Groups::              Looking through parts of the newsfeed for articles.
+
+Email Based Diary
+
+* The NNDiary Back End::        Basic setup and usage.
+* The Gnus Diary Library::      Utility toolkit on top of nndiary.
+* Sending or Not Sending::      A final note on sending diary messages.
+
+The NNDiary Back End
+
+* Diary Messages::              What makes a message valid for nndiary.
+* Running NNDiary::             NNDiary has two modes of operation.
+* Customizing NNDiary::         Bells and whistles.
+
+The Gnus Diary Library
+
+* Diary Summary Line Format::           A nicer summary buffer line format.
+* Diary Articles Sorting::              A nicer way to sort messages.
+* Diary Headers Generation::            Not doing it manually.
+* Diary Group Parameters::              Not handling them manually.
+
+Gnus Unplugged
+
+* Agent Basics::                How it all is supposed to work.
+* Agent Categories::            How to tell the Gnus Agent what to download.
+* Agent Commands::              New commands for all the buffers.
+* Agent Visuals::               Ways that the agent may effect your summary buffer.
+* Agent as Cache::              The Agent is a big cache too.
+* Agent Expiry::                How to make old articles go away.
+* Agent Regeneration::          How to recover from lost connections and other accidents.
+* Agent and IMAP::              How to use the Agent with @acronym{IMAP}.
+* Outgoing Messages::           What happens when you post/mail something?
+* Agent Variables::             Customizing is fun.
+* Example Setup::               An example @file{~/.gnus.el} file for offline people.
+* Batching Agents::             How to fetch news from a @code{cron} job.
+* Agent Caveats::               What you think it'll do and what it does.
+
+Agent Categories
+
+* Category Syntax::             What a category looks like.
+* Category Buffer::             A buffer for maintaining categories.
+* Category Variables::          Customize'r'Us.
+
+Agent Commands
+
+* Group Agent Commands::        Configure groups and fetch their contents.
+* Summary Agent Commands::      Manually select then fetch specific articles.
+* Server Agent Commands::       Select the servers that are supported by the agent.
+
+Scoring
+
+* Summary Score Commands::      Adding score entries for the current group.
+* Group Score Commands::        General score commands.
+* Score Variables::             Customize your scoring.  (My, what terminology).
+* Score File Format::           What a score file may contain.
+* Score File Editing::          You can edit score files by hand as well.
+* Adaptive Scoring::            Big Sister Gnus knows what you read.
+* Home Score File::             How to say where new score entries are to go.
+* Followups To Yourself::       Having Gnus notice when people answer you.
+* Scoring On Other Headers::    Scoring on non-standard headers.
+* Scoring Tips::                How to score effectively.
+* Reverse Scoring::             That problem child of old is not problem.
+* Global Score Files::          Earth-spanning, ear-splitting score files.
+* Kill Files::                  They are still here, but they can be ignored.
+* Converting Kill Files::       Translating kill files to score files.
+* GroupLens::                   Getting predictions on what you like to read.
+* Advanced Scoring::            Using logical expressions to build score rules.
+* Score Decays::                It can be useful to let scores wither away.
+
+GroupLens
+
+* Using GroupLens::             How to make Gnus use GroupLens.
+* Rating Articles::             Letting GroupLens know how you rate articles.
+* Displaying Predictions::      Displaying predictions given by GroupLens.
+* GroupLens Variables::         Customizing GroupLens.
+
+Advanced Scoring
+
+* Advanced Scoring Syntax::     A definition.
+* Advanced Scoring Examples::   What they look like.
+* Advanced Scoring Tips::       Getting the most out of it.
+
+Various
+
+* Process/Prefix::              A convention used by many treatment commands.
+* Interactive::                 Making Gnus ask you many questions.
+* Symbolic Prefixes::           How to supply some Gnus functions with options.
+* Formatting Variables::        You can specify what buffers should look like.
+* Window Layout::               Configuring the Gnus buffer windows.
+* Faces and Fonts::             How to change how faces look.
+* Compilation::                 How to speed Gnus up.
+* Mode Lines::                  Displaying information in the mode lines.
+* Highlighting and Menus::      Making buffers look all nice and cozy.
+* Buttons::                     Get tendinitis in ten easy steps!
+* Daemons::                     Gnus can do things behind your back.
+* NoCeM::                       How to avoid spam and other fatty foods.
+* Undo::                        Some actions can be undone.
+* Predicate Specifiers::        Specifying predicates.
+* Moderation::                  What to do if you're a moderator.
+* Image Enhancements::          Modern versions of Emacs/XEmacs can display images.
+* Fuzzy Matching::              What's the big fuzz?
+* Thwarting Email Spam::        Simple ways to avoid unsolicited commercial email.
+* Spam Package::                A package for filtering and processing spam.
+* Other modes::                 Interaction with other modes.
+* Various Various::             Things that are really various.
+
+Formatting Variables
+
+* Formatting Basics::           A formatting variable is basically a format string.
+* Mode Line Formatting::        Some rules about mode line formatting variables.
+* Advanced Formatting::         Modifying output in various ways.
+* User-Defined Specs::          Having Gnus call your own functions.
+* Formatting Fonts::            Making the formatting look colorful and nice.
+* Positioning Point::           Moving point to a position after an operation.
+* Tabulation::                  Tabulating your output.
+* Wide Characters::             Dealing with wide characters.
+
+Image Enhancements
+
+* X-Face::                      Display a funky, teensy black-and-white image.
+* Face::                        Display a funkier, teensier colored image.
+* Smileys::                     Show all those happy faces the way they were
+                                  meant to be shown.
+* Picons::                      How to display pictures of what you're reading.
+* XVarious::                    Other XEmacsy Gnusey variables.
+
+Thwarting Email Spam
+
+* The problem of spam::         Some background, and some solutions
+* Anti-Spam Basics::            Simple steps to reduce the amount of spam.
+* SpamAssassin::                How to use external anti-spam tools.
+* Hashcash::                    Reduce spam by burning CPU time.
+
+Spam Package
+
+* Spam Package Introduction::
+* Filtering Incoming Mail::
+* Detecting Spam in Groups::
+* Spam and Ham Processors::
+* Spam Package Configuration Examples::
+* Spam Back Ends::
+* Extending the Spam package::
+* Spam Statistics Package::
+
+Spam Statistics Package
+
+* Creating a spam-stat dictionary::
+* Splitting mail using spam-stat::
+* Low-level interface to the spam-stat dictionary::
+
+Appendices
+
+* XEmacs::                      Requirements for installing under XEmacs.
+* History::                     How Gnus got where it is today.
+* On Writing Manuals::          Why this is not a beginner's guide.
+* Terminology::                 We use really difficult, like, words here.
+* Customization::               Tailoring Gnus to your needs.
+* Troubleshooting::             What you might try if things do not work.
+* Gnus Reference Guide::        Rilly, rilly technical stuff.
+* Emacs for Heathens::          A short introduction to Emacsian terms.
+* Frequently Asked Questions::  The Gnus FAQ
+
+History
+
+* Gnus Versions::               What Gnus versions have been released.
+* Other Gnus Versions::         Other Gnus versions that also 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.
+
+New Features
+
+* ding Gnus::                   New things in Gnus 5.0/5.1, the first new Gnus.
+* September Gnus::              The Thing Formally Known As Gnus 5.2/5.3.
+* Red Gnus::                    Third time best---Gnus 5.4/5.5.
+* Quassia Gnus::                Two times two is four, or Gnus 5.6/5.7.
+* Pterodactyl Gnus::            Pentad also starts with P, AKA Gnus 5.8/5.9.
+* Oort Gnus::                   It's big.  It's far out.  Gnus 5.10/5.11.
+
+Customization
+
+* Slow/Expensive Connection::   You run a local Emacs and get the news elsewhere.
+* Slow Terminal Connection::    You run a remote Emacs.
+* Little Disk Space::           You feel that having large setup files is icky.
+* Slow Machine::                You feel like buying a faster machine.
+
+Gnus Reference Guide
+
+* Gnus Utility Functions::      Common functions and variable to use.
+* Back End Interface::          How Gnus communicates with the servers.
+* Score File Syntax::           A BNF definition of the score file standard.
+* Headers::                     How Gnus stores headers internally.
+* Ranges::                      A handy format for storing mucho numbers.
+* Group Info::                  The group info format.
+* Extended Interactive::        Symbolic prefixes and stuff.
+* Emacs/XEmacs Code::           Gnus can be run under all modern Emacsen.
+* Various File Formats::        Formats of files that Gnus use.
+
+Back End Interface
+
+* Required Back End Functions::  Functions that must be implemented.
+* Optional Back End Functions::  Functions that need not be implemented.
+* Error Messaging::             How to get messages and report errors.
+* Writing New Back Ends::       Extending old back ends.
+* Hooking New Back Ends Into Gnus::  What has to be done on the Gnus end.
+* Mail-like Back Ends::         Some tips on mail back ends.
+
+Various File Formats
+
+* Active File Format::          Information on articles and groups available.
+* Newsgroups File Format::      Group descriptions.
+
+Emacs for Heathens
+
+* Keystrokes::                  Entering text and executing commands.
+* Emacs Lisp::                  The built-in Emacs programming language.
+
+@end detailmenu
+@end menu
+
+@node Starting Up
+@chapter Starting Gnus
+@cindex starting up
+
+If you haven't used Emacs much before using Gnus, read @ref{Emacs for
+Heathens} first.
+
+@kindex M-x gnus
+@findex gnus
+If your system administrator has set things up properly, starting Gnus
+and reading news is extremely easy---you just type @kbd{M-x gnus} in
+your Emacs.  If not, you should customize the variable
+@code{gnus-select-method} as described in @ref{Finding the News}.  For a
+minimal setup for posting should also customize the variables
+@code{user-full-name} and @code{user-mail-address}.
+
+@findex gnus-other-frame
+@kindex M-x gnus-other-frame
+If you want to start Gnus in a different frame, you can use the command
+@kbd{M-x gnus-other-frame} instead.
+
+If things do not go smoothly at startup, you have to twiddle some
+variables in your @file{~/.gnus.el} file.  This file is similar to
+@file{~/.emacs}, but is read when Gnus starts.
+
+If you puzzle at any terms used in this manual, please refer to the
+terminology section (@pxref{Terminology}).
+
+@menu
+* Finding the News::      Choosing a method for getting news.
+* The First Time::        What does Gnus do the first time you start it?
+* The Server is Down::    How can I read my mail then?
+* Slave Gnusae::          You can have more than one Gnus active at a time.
+* New Groups::            What is Gnus supposed to do with new groups?
+* Changing Servers::      You may want to move from one server to another.
+* Startup Files::         Those pesky startup files---@file{.newsrc}.
+* Auto Save::             Recovering from a crash.
+* The Active File::       Reading the active file over a slow line Takes Time.
+* Startup Variables::     Other variables you might change.
+@end menu
+
+
+@node Finding the News
+@section Finding the News
+@cindex finding news
+
+@vindex gnus-select-method
+@c @head
+The @code{gnus-select-method} variable says where Gnus should look for
+news.  This variable should be a list where the first element says
+@dfn{how} and the second element says @dfn{where}.  This method is your
+native method.  All groups not fetched with this method are
+foreign groups.
+
+For instance, if the @samp{news.somewhere.edu} @acronym{NNTP} server is where
+you want to get your daily dosage of news from, you'd say:
+
+@lisp
+(setq gnus-select-method '(nntp "news.somewhere.edu"))
+@end lisp
+
+If you want to read directly from the local spool, say:
+
+@lisp
+(setq gnus-select-method '(nnspool ""))
+@end lisp
+
+If you can use a local spool, you probably should, as it will almost
+certainly be much faster.  But do not use the local spool if your
+server is running Leafnode (which is a simple, standalone private news
+server); in this case, use @code{(nntp "localhost")}.
+
+@vindex gnus-nntpserver-file
+@cindex NNTPSERVER
+@cindex @acronym{NNTP} server
+If this variable is not set, Gnus will take a look at the
+@env{NNTPSERVER} environment variable.  If that variable isn't set,
+Gnus will see whether @code{gnus-nntpserver-file}
+(@file{/etc/nntpserver} by default) has any opinions on the matter.
+If that fails as well, Gnus will try to use the machine running Emacs
+as an @acronym{NNTP} server.  That's a long shot, though.
+
+@vindex gnus-nntp-server
+If @code{gnus-nntp-server} is set, this variable will override
+@code{gnus-select-method}.  You should therefore set
+@code{gnus-nntp-server} to @code{nil}, which is what it is by default.
+
+@vindex gnus-secondary-servers
+@vindex gnus-nntp-server
+You can also make Gnus prompt you interactively for the name of an
+@acronym{NNTP} server.  If you give a non-numerical prefix to @code{gnus}
+(i.e., @kbd{C-u M-x gnus}), Gnus will let you choose between the servers
+in the @code{gnus-secondary-servers} list (if any).  You can also just
+type in the name of any server you feel like visiting.  (Note that this
+will set @code{gnus-nntp-server}, which means that if you then @kbd{M-x
+gnus} later in the same Emacs session, Gnus will contact the same
+server.)
+
+@findex gnus-group-browse-foreign-server
+@kindex B (Group)
+However, if you use one @acronym{NNTP} server regularly and are just
+interested in a couple of groups from a different server, you would be
+better served by using the @kbd{B} command in the group buffer.  It will
+let you have a look at what groups are available, and you can subscribe
+to any of the groups you want to.  This also makes @file{.newsrc}
+maintenance much tidier.  @xref{Foreign Groups}.
+
+@vindex gnus-secondary-select-methods
+@c @head
+A slightly different approach to foreign groups is to set the
+@code{gnus-secondary-select-methods} variable.  The select methods
+listed in this variable are in many ways just as native as the
+@code{gnus-select-method} server.  They will also be queried for active
+files during startup (if that's required), and new newsgroups that
+appear on these servers will be subscribed (or not) just as native
+groups are.
+
+For instance, if you use the @code{nnmbox} back end to read your mail,
+you would typically set this variable to
+
+@lisp
+(setq gnus-secondary-select-methods '((nnmbox "")))
+@end lisp
+
+
+@node The First Time
+@section The First Time
+@cindex first time usage
+
+If no startup files exist (@pxref{Startup Files}), Gnus will try to
+determine what groups should be subscribed by default.
+
+@vindex gnus-default-subscribed-newsgroups
+If the variable @code{gnus-default-subscribed-newsgroups} is set, Gnus
+will subscribe you to just those groups in that list, leaving the rest
+killed.  Your system administrator should have set this variable to
+something useful.
+
+Since she hasn't, Gnus will just subscribe you to a few arbitrarily
+picked groups (i.e., @samp{*.newusers}).  (@dfn{Arbitrary} is defined
+here as @dfn{whatever Lars thinks you should read}.)
+
+You'll also be subscribed to the Gnus documentation group, which should
+help you with most common problems.
+
+If @code{gnus-default-subscribed-newsgroups} is @code{t}, Gnus will just
+use the normal functions for handling new groups, and not do anything
+special.
+
+
+@node The Server is Down
+@section The Server is Down
+@cindex server errors
+
+If the default server is down, Gnus will understandably have some
+problems starting.  However, if you have some mail groups in addition to
+the news groups, you may want to start Gnus anyway.
+
+Gnus, being the trusting sort of program, will ask whether to proceed
+without a native select method if that server can't be contacted.  This
+will happen whether the server doesn't actually exist (i.e., you have
+given the wrong address) or the server has just momentarily taken ill
+for some reason or other.  If you decide to continue and have no foreign
+groups, you'll find it difficult to actually do anything in the group
+buffer.  But, hey, that's your problem.  Blllrph!
+
+@findex gnus-no-server
+@kindex M-x gnus-no-server
+@c @head
+If you know that the server is definitely down, or you just want to read
+your mail without bothering with the server at all, you can use the
+@code{gnus-no-server} command to start Gnus.  That might come in handy
+if you're in a hurry as well.  This command will not attempt to contact
+your primary server---instead, it will just activate all groups on level
+1 and 2.  (You should preferably keep no native groups on those two
+levels.) Also @pxref{Group Levels}.
+
+
+@node Slave Gnusae
+@section Slave Gnusae
+@cindex slave
+
+You might want to run more than one Emacs with more than one Gnus at the
+same time.  If you are using different @file{.newsrc} files (e.g., if you
+are using the two different Gnusae to read from two different servers),
+that is no problem whatsoever.  You just do it.
+
+The problem appears when you want to run two Gnusae that use the same
+@file{.newsrc} file.
+
+To work around that problem some, we here at the Think-Tank at the Gnus
+Towers have come up with a new concept: @dfn{Masters} and
+@dfn{slaves}.  (We have applied for a patent on this concept, and have
+taken out a copyright on those words.  If you wish to use those words in
+conjunction with each other, you have to send $1 per usage instance to
+me.  Usage of the patent (@dfn{Master/Slave Relationships In Computer
+Applications}) will be much more expensive, of course.)
+
+@findex gnus-slave
+Anyway, you start one Gnus up the normal way with @kbd{M-x gnus} (or
+however you do it).  Each subsequent slave Gnusae should be started with
+@kbd{M-x gnus-slave}.  These slaves won't save normal @file{.newsrc}
+files, but instead save @dfn{slave files} that contain information only
+on what groups have been read in the slave session.  When a master Gnus
+starts, it will read (and delete) these slave files, incorporating all
+information from them.  (The slave files will be read in the sequence
+they were created, so the latest changes will have precedence.)
+
+Information from the slave files has, of course, precedence over the
+information in the normal (i.e., master) @file{.newsrc} file.
+
+If the @file{.newsrc*} files have not been saved in the master when the
+slave starts, you may be prompted as to whether to read an auto-save
+file.  If you answer ``yes'', the unsaved changes to the master will be
+incorporated into the slave.  If you answer ``no'', the slave may see some
+messages as unread that have been read in the master.
+
+
+
+@node New Groups
+@section New Groups
+@cindex new groups
+@cindex subscription
+
+@vindex gnus-check-new-newsgroups
+If you are satisfied that you really never want to see any new groups,
+you can set @code{gnus-check-new-newsgroups} to @code{nil}.  This will
+also save you some time at startup.  Even if this variable is
+@code{nil}, you can always subscribe to the new groups just by pressing
+@kbd{U} in the group buffer (@pxref{Group Maintenance}).  This variable
+is @code{ask-server} by default.  If you set this variable to
+@code{always}, then Gnus will query the back ends for new groups even
+when you do the @kbd{g} command (@pxref{Scanning New Messages}).
+
+@menu
+* Checking New Groups::         Determining what groups are new.
+* Subscription Methods::        What Gnus should do with new groups.
+* Filtering New Groups::        Making Gnus ignore certain new groups.
+@end menu
+
+
+@node Checking New Groups
+@subsection Checking New Groups
+
+Gnus normally determines whether a group is new or not by comparing the
+list of groups from the active file(s) with the lists of subscribed and
+dead groups.  This isn't a particularly fast method.  If
+@code{gnus-check-new-newsgroups} is @code{ask-server}, Gnus will ask the
+server for new groups since the last time.  This is both faster and
+cheaper.  This also means that you can get rid of the list of killed
+groups altogether, so you may set @code{gnus-save-killed-list} to
+@code{nil}, which will save time both at startup, at exit, and all over.
+Saves disk space, too.  Why isn't this the default, then?
+Unfortunately, not all servers support this command.
+
+I bet I know what you're thinking now: How do I find out whether my
+server supports @code{ask-server}?  No?  Good, because I don't have a
+fail-safe answer.  I would suggest just setting this variable to
+@code{ask-server} and see whether any new groups appear within the next
+few days.  If any do, then it works.  If none do, then it doesn't
+work.  I could write a function to make Gnus guess whether the server
+supports @code{ask-server}, but it would just be a guess.  So I won't.
+You could @code{telnet} to the server and say @code{HELP} and see
+whether it lists @samp{NEWGROUPS} among the commands it understands.  If
+it does, then it might work.  (But there are servers that lists
+@samp{NEWGROUPS} without supporting the function properly.)
+
+This variable can also be a list of select methods.  If so, Gnus will
+issue an @code{ask-server} command to each of the select methods, and
+subscribe them (or not) using the normal methods.  This might be handy
+if you are monitoring a few servers for new groups.  A side effect is
+that startup will take much longer, so you can meditate while waiting.
+Use the mantra ``dingnusdingnusdingnus'' to achieve permanent bliss.
+
+
+@node Subscription Methods
+@subsection Subscription Methods
+
+@vindex gnus-subscribe-newsgroup-method
+What Gnus does when it encounters a new group is determined by the
+@code{gnus-subscribe-newsgroup-method} variable.
+
+This variable should contain a function.  This function will be called
+with the name of the new group as the only parameter.
+
+Some handy pre-fab functions are:
+
+@table @code
+
+@item gnus-subscribe-zombies
+@vindex gnus-subscribe-zombies
+Make all new groups zombies.  This is the default.  You can browse the
+zombies later (with @kbd{A z}) and either kill them all off properly
+(with @kbd{S z}), or subscribe to them (with @kbd{u}).
+
+@item gnus-subscribe-randomly
+@vindex gnus-subscribe-randomly
+Subscribe all new groups in arbitrary order.  This really means that all
+new groups will be added at ``the top'' of the group buffer.
+
+@item gnus-subscribe-alphabetically
+@vindex gnus-subscribe-alphabetically
+Subscribe all new groups in alphabetical order.
+
+@item gnus-subscribe-hierarchically
+@vindex gnus-subscribe-hierarchically
+Subscribe all new groups hierarchically.  The difference between this
+function and @code{gnus-subscribe-alphabetically} is slight.
+@code{gnus-subscribe-alphabetically} will subscribe new groups in a strictly
+alphabetical fashion, while this function will enter groups into its
+hierarchy.  So if you want to have the @samp{rec} hierarchy before the
+@samp{comp} hierarchy, this function will not mess that configuration
+up.  Or something like that.
+
+@item gnus-subscribe-interactively
+@vindex gnus-subscribe-interactively
+Subscribe new groups interactively.  This means that Gnus will ask
+you about @strong{all} new groups.  The groups you choose to subscribe
+to will be subscribed hierarchically.
+
+@item gnus-subscribe-killed
+@vindex gnus-subscribe-killed
+Kill all new groups.
+
+@item gnus-subscribe-topics
+@vindex gnus-subscribe-topics
+Put the groups into the topic that has a matching @code{subscribe} topic
+parameter (@pxref{Topic Parameters}).  For instance, a @code{subscribe}
+topic parameter that looks like
+
+@example
+"nnslashdot"
+@end example
+
+will mean that all groups that match that regex will be subscribed under
+that topic.
+
+If no topics match the groups, the groups will be subscribed in the
+top-level topic.
+
+@end table
+
+@vindex gnus-subscribe-hierarchical-interactive
+A closely related variable is
+@code{gnus-subscribe-hierarchical-interactive}.  (That's quite a
+mouthful.)  If this variable is non-@code{nil}, Gnus will ask you in a
+hierarchical fashion whether to subscribe to new groups or not.  Gnus
+will ask you for each sub-hierarchy whether you want to descend the
+hierarchy or not.
+
+One common mistake is to set the variable a few paragraphs above
+(@code{gnus-subscribe-newsgroup-method}) to
+@code{gnus-subscribe-hierarchical-interactive}.  This is an error.  This
+will not work.  This is ga-ga.  So don't do it.
+
+
+@node Filtering New Groups
+@subsection Filtering New Groups
+
+A nice and portable way to control which new newsgroups should be
+subscribed (or ignored) is to put an @dfn{options} line at the start of
+the @file{.newsrc} file.  Here's an example:
+
+@example
+options -n !alt.all !rec.all sci.all
+@end example
+
+@vindex gnus-subscribe-options-newsgroup-method
+This line obviously belongs to a serious-minded intellectual scientific
+person (or she may just be plain old boring), because it says that all
+groups that have names beginning with @samp{alt} and @samp{rec} should
+be ignored, and all groups with names beginning with @samp{sci} should
+be subscribed.  Gnus will not use the normal subscription method for
+subscribing these groups.
+@code{gnus-subscribe-options-newsgroup-method} is used instead.  This
+variable defaults to @code{gnus-subscribe-alphabetically}.
+
+@vindex gnus-options-not-subscribe
+@vindex gnus-options-subscribe
+If you don't want to mess with your @file{.newsrc} file, you can just
+set the two variables @code{gnus-options-subscribe} and
+@code{gnus-options-not-subscribe}.  These two variables do exactly the
+same as the @file{.newsrc} @samp{options -n} trick.  Both are regexps,
+and if the new group matches the former, it will be unconditionally
+subscribed, and if it matches the latter, it will be ignored.
+
+@vindex gnus-auto-subscribed-groups
+Yet another variable that meddles here is
+@code{gnus-auto-subscribed-groups}.  It works exactly like
+@code{gnus-options-subscribe}, and is therefore really superfluous,
+but I thought it would be nice to have two of these.  This variable is
+more meant for setting some ground rules, while the other variable is
+used more for user fiddling.  By default this variable makes all new
+groups that come from mail back ends (@code{nnml}, @code{nnbabyl},
+@code{nnfolder}, @code{nnmbox}, @code{nnmh}, and @code{nnmaildir})
+subscribed.  If you don't like that, just set this variable to
+@code{nil}.
+
+New groups that match this regexp are subscribed using
+@code{gnus-subscribe-options-newsgroup-method}.
+
+
+@node Changing Servers
+@section Changing Servers
+@cindex changing servers
+
+Sometimes it is necessary to move from one @acronym{NNTP} server to another.
+This happens very rarely, but perhaps you change jobs, or one server is
+very flaky and you want to use another.
+
+Changing the server is pretty easy, right?  You just change
+@code{gnus-select-method} to point to the new server?
+
+@emph{Wrong!}
+
+Article numbers are not (in any way) kept synchronized between different
+@acronym{NNTP} servers, and the only way Gnus keeps track of what articles
+you have read is by keeping track of article numbers.  So when you
+change @code{gnus-select-method}, your @file{.newsrc} file becomes
+worthless.
+
+Gnus provides a few functions to attempt to translate a @file{.newsrc}
+file from one server to another.  They all have one thing in
+common---they take a looong time to run.  You don't want to use these
+functions more than absolutely necessary.
+
+@kindex M-x gnus-change-server
+@findex gnus-change-server
+If you have access to both servers, Gnus can request the headers for all
+the articles you have read and compare @code{Message-ID}s and map the
+article numbers of the read articles and article marks.  The @kbd{M-x
+gnus-change-server} command will do this for all your native groups.  It
+will prompt for the method you want to move to.
+
+@kindex M-x gnus-group-move-group-to-server
+@findex gnus-group-move-group-to-server
+You can also move individual groups with the @kbd{M-x
+gnus-group-move-group-to-server} command.  This is useful if you want to
+move a (foreign) group from one server to another.
+
+@kindex M-x gnus-group-clear-data-on-native-groups
+@findex gnus-group-clear-data-on-native-groups
+If you don't have access to both the old and new server, all your marks
+and read ranges have become worthless.  You can use the @kbd{M-x
+gnus-group-clear-data-on-native-groups} command to clear out all data
+that you have on your native groups.  Use with caution.
+
+@kindex M-x gnus-group-clear-data
+@findex gnus-group-clear-data
+Clear the data from the current group only---nix out marks and the
+list of read articles (@code{gnus-group-clear-data}).
+
+After changing servers, you @strong{must} move the cache hierarchy away,
+since the cached articles will have wrong article numbers, which will
+affect which articles Gnus thinks are read.
+@code{gnus-group-clear-data-on-native-groups} will ask you if you want
+to have it done automatically; for @code{gnus-group-clear-data}, you
+can use @kbd{M-x gnus-cache-move-cache} (but beware, it will move the
+cache for all groups).
+
+
+@node Startup Files
+@section Startup Files
+@cindex startup files
+@cindex .newsrc
+@cindex .newsrc.el
+@cindex .newsrc.eld
+
+Most common Unix news readers use a shared startup file called
+@file{.newsrc}.  This file contains all the information about what
+groups are subscribed, and which articles in these groups have been
+read.
+
+Things got a bit more complicated with @sc{gnus}.  In addition to
+keeping the @file{.newsrc} file updated, it also used a file called
+@file{.newsrc.el} for storing all the information that didn't fit into
+the @file{.newsrc} file.  (Actually, it also duplicated everything in
+the @file{.newsrc} file.)  @sc{gnus} would read whichever one of these
+files was the most recently saved, which enabled people to swap between
+@sc{gnus} and other newsreaders.
+
+That was kinda silly, so Gnus went one better: In addition to the
+@file{.newsrc} and @file{.newsrc.el} files, Gnus also has a file called
+@file{.newsrc.eld}.  It will read whichever of these files that are most
+recent, but it will never write a @file{.newsrc.el} file.  You should
+never delete the @file{.newsrc.eld} file---it contains much information
+not stored in the @file{.newsrc} file.
+
+@vindex gnus-save-newsrc-file
+@vindex gnus-read-newsrc-file
+You can turn off writing the @file{.newsrc} file by setting
+@code{gnus-save-newsrc-file} to @code{nil}, which means you can delete
+the file and save some space, as well as exiting from Gnus faster.
+However, this will make it impossible to use other newsreaders than
+Gnus.  But hey, who would want to, right?  Similarly, setting
+@code{gnus-read-newsrc-file} to @code{nil} makes Gnus ignore the
+@file{.newsrc} file and any @file{.newsrc-SERVER} files, which can be
+convenient if you use a different news reader occasionally, and you
+want to read a different subset of the available groups with that
+news reader.
+
+@vindex gnus-save-killed-list
+If @code{gnus-save-killed-list} (default @code{t}) is @code{nil}, Gnus
+will not save the list of killed groups to the startup file.  This will
+save both time (when starting and quitting) and space (on disk).  It
+will also mean that Gnus has no record of what groups are new or old,
+so the automatic new groups subscription methods become meaningless.
+You should always set @code{gnus-check-new-newsgroups} to @code{nil} or
+@code{ask-server} if you set this variable to @code{nil} (@pxref{New
+Groups}).  This variable can also be a regular expression.  If that's
+the case, remove all groups that do not match this regexp before
+saving.  This can be useful in certain obscure situations that involve
+several servers where not all servers support @code{ask-server}.
+
+@vindex gnus-startup-file
+@vindex gnus-backup-startup-file
+@vindex version-control
+The @code{gnus-startup-file} variable says where the startup files are.
+The default value is @file{~/.newsrc}, with the Gnus (El Dingo) startup
+file being whatever that one is, with a @samp{.eld} appended.
+If you want version control for this file, set
+@code{gnus-backup-startup-file}.  It respects the same values as the
+@code{version-control} variable.
+
+@vindex gnus-save-newsrc-hook
+@vindex gnus-save-quick-newsrc-hook
+@vindex gnus-save-standard-newsrc-hook
+@code{gnus-save-newsrc-hook} is called before saving any of the newsrc
+files, while @code{gnus-save-quick-newsrc-hook} is called just before
+saving the @file{.newsrc.eld} file, and
+@code{gnus-save-standard-newsrc-hook} is called just before saving the
+@file{.newsrc} file.  The latter two are commonly used to turn version
+control on or off.  Version control is on by default when saving the
+startup files.  If you want to turn backup creation off, say something like:
+
+@lisp
+(defun turn-off-backup ()
+  (set (make-local-variable 'backup-inhibited) t))
+
+(add-hook 'gnus-save-quick-newsrc-hook 'turn-off-backup)
+(add-hook 'gnus-save-standard-newsrc-hook 'turn-off-backup)
+@end lisp
+
+@vindex gnus-init-file
+@vindex gnus-site-init-file
+When Gnus starts, it will read the @code{gnus-site-init-file}
+(@file{.../site-lisp/gnus-init} by default) and @code{gnus-init-file}
+(@file{~/.gnus} by default) files.  These are normal Emacs Lisp files
+and can be used to avoid cluttering your @file{~/.emacs} and
+@file{site-init} files with Gnus stuff.  Gnus will also check for files
+with the same names as these, but with @file{.elc} and @file{.el}
+suffixes.  In other words, if you have set @code{gnus-init-file} to
+@file{~/.gnus}, it will look for @file{~/.gnus.elc}, @file{~/.gnus.el},
+and finally @file{~/.gnus} (in this order).  If Emacs was invoked with
+the @option{-q} or @option{--no-init-file} options (@pxref{Initial
+Options, ,Initial Options, emacs, The Emacs Manual}), Gnus doesn't read
+@code{gnus-init-file}.
+
+
+@node Auto Save
+@section Auto Save
+@cindex dribble file
+@cindex auto-save
+
+Whenever you do something that changes the Gnus data (reading articles,
+catching up, killing/subscribing groups), the change is added to a
+special @dfn{dribble buffer}.  This buffer is auto-saved the normal
+Emacs way.  If your Emacs should crash before you have saved the
+@file{.newsrc} files, all changes you have made can be recovered from
+this file.
+
+If Gnus detects this file at startup, it will ask the user whether to
+read it.  The auto save file is deleted whenever the real startup file is
+saved.
+
+@vindex gnus-use-dribble-file
+If @code{gnus-use-dribble-file} is @code{nil}, Gnus won't create and
+maintain a dribble buffer.  The default is @code{t}.
+
+@vindex gnus-dribble-directory
+Gnus will put the dribble file(s) in @code{gnus-dribble-directory}.  If
+this variable is @code{nil}, which it is by default, Gnus will dribble
+into the directory where the @file{.newsrc} file is located.  (This is
+normally the user's home directory.)  The dribble file will get the same
+file permissions as the @file{.newsrc} file.
+
+@vindex gnus-always-read-dribble-file
+If @code{gnus-always-read-dribble-file} is non-@code{nil}, Gnus will
+read the dribble file on startup without querying the user.
+
+
+@node The Active File
+@section The Active File
+@cindex active file
+@cindex ignored groups
+
+When Gnus starts, or indeed whenever it tries to determine whether new
+articles have arrived, it reads the active file.  This is a very large
+file that lists all the active groups and articles on the server.
+
+@vindex gnus-ignored-newsgroups
+Before examining the active file, Gnus deletes all lines that match the
+regexp @code{gnus-ignored-newsgroups}.  This is done primarily to reject
+any groups with bogus names, but you can use this variable to make Gnus
+ignore hierarchies you aren't ever interested in.  However, this is not
+recommended.  In fact, it's highly discouraged.  Instead, @pxref{New
+Groups} for an overview of other variables that can be used instead.
+
+@c This variable is
+@c @code{nil} by default, and will slow down active file handling somewhat
+@c if you set it to anything else.
+
+@vindex gnus-read-active-file
+@c @head
+The active file can be rather Huge, so if you have a slow network, you
+can set @code{gnus-read-active-file} to @code{nil} to prevent Gnus from
+reading the active file.  This variable is @code{some} by default.
+
+Gnus will try to make do by getting information just on the groups that
+you actually subscribe to.
+
+Note that if you subscribe to lots and lots of groups, setting this
+variable to @code{nil} will probably make Gnus slower, not faster.  At
+present, having this variable @code{nil} will slow Gnus down
+considerably, unless you read news over a 2400 baud modem.
+
+This variable can also have the value @code{some}.  Gnus will then
+attempt to read active info only on the subscribed groups.  On some
+servers this is quite fast (on sparkling, brand new INN servers that
+support the @code{LIST ACTIVE group} command), on others this isn't fast
+at all.  In any case, @code{some} should be faster than @code{nil}, and
+is certainly faster than @code{t} over slow lines.
+
+Some news servers (old versions of Leafnode and old versions of INN, for
+instance) do not support the @code{LIST ACTIVE group}.  For these
+servers, @code{nil} is probably the most efficient value for this
+variable.
+
+If this variable is @code{nil}, Gnus will ask for group info in total
+lock-step, which isn't very fast.  If it is @code{some} and you use an
+@acronym{NNTP} server, Gnus will pump out commands as fast as it can, and
+read all the replies in one swoop.  This will normally result in better
+performance, but if the server does not support the aforementioned
+@code{LIST ACTIVE group} command, this isn't very nice to the server.
+
+If you think that starting up Gnus takes too long, try all the three
+different values for this variable and see what works best for you.
+
+In any case, if you use @code{some} or @code{nil}, you should definitely
+kill all groups that you aren't interested in to speed things up.
+
+Note that this variable also affects active file retrieval from
+secondary select methods.
+
+
+@node Startup Variables
+@section Startup Variables
+
+@table @code
+
+@item gnus-load-hook
+@vindex gnus-load-hook
+A hook run while Gnus is being loaded.  Note that this hook will
+normally be run just once in each Emacs session, no matter how many
+times you start Gnus.
+
+@item gnus-before-startup-hook
+@vindex gnus-before-startup-hook
+A hook run after starting up Gnus successfully.
+
+@item gnus-startup-hook
+@vindex gnus-startup-hook
+A hook run as the very last thing after starting up Gnus
+
+@item gnus-started-hook
+@vindex gnus-started-hook
+A hook that is run as the very last thing after starting up Gnus
+successfully.
+
+@item gnus-setup-news-hook
+@vindex gnus-setup-news-hook
+A hook that is run after reading the @file{.newsrc} file(s), but before
+generating the group buffer.
+
+@item gnus-check-bogus-newsgroups
+@vindex gnus-check-bogus-newsgroups
+If non-@code{nil}, Gnus will check for and delete all bogus groups at
+startup.  A @dfn{bogus group} is a group that you have in your
+@file{.newsrc} file, but doesn't exist on the news server.  Checking for
+bogus groups can take quite a while, so to save time and resources it's
+best to leave this option off, and do the checking for bogus groups once
+in a while from the group buffer instead (@pxref{Group Maintenance}).
+
+@item gnus-inhibit-startup-message
+@vindex gnus-inhibit-startup-message
+If non-@code{nil}, the startup message won't be displayed.  That way,
+your boss might not notice as easily that you are reading news instead
+of doing your job.  Note that this variable is used before
+@file{~/.gnus.el} is loaded, so it should be set in @file{.emacs} instead.
+
+@item gnus-no-groups-message
+@vindex gnus-no-groups-message
+Message displayed by Gnus when no groups are available.
+
+@item gnus-play-startup-jingle
+@vindex gnus-play-startup-jingle
+If non-@code{nil}, play the Gnus jingle at startup.
+
+@item gnus-startup-jingle
+@vindex gnus-startup-jingle
+Jingle to be played if the above variable is non-@code{nil}.  The
+default is @samp{Tuxedomoon.Jingle4.au}.
+
+@end table
+
+
+@node Group Buffer
+@chapter Group Buffer
+@cindex group buffer
+
+@c Alex Schroeder suggests to rearrange this as follows:
+@c
+@c <kensanata> ok, just save it for reference.  I'll go to bed in a minute.
+@c   1. Selecting a Group, 2. (new) Finding a Group, 3. Group Levels,
+@c   4. Subscription Commands, 5. Group Maneuvering, 6. Group Data,
+@c   7. Group Score, 8. Group Buffer Format
+@c <kensanata> Group Levels should have more information on levels 5 to 9.  I
+@c   suggest to split the 4th paragraph ("Gnus considers groups...") as follows:
+@c <kensanata> First, "Gnus considers groups... (default 9)."
+@c <kensanata> New, a table summarizing what levels 1 to 9 mean.
+@c <kensanata> Third, "Gnus treats subscribed ... reasons of efficiency"
+@c <kensanata> Then expand the next paragraph or add some more to it.
+@c    This short one sentence explains levels 1 and 2, therefore I understand
+@c    that I should keep important news at 3 and boring news at 4.
+@c    Say so!  Then go on to explain why I should bother with levels 6 to 9.
+@c    Maybe keep those that you don't want to read temporarily at 6,
+@c    those that you never want to read at 8, those that offend your
+@c    human rights at 9...
+
+
+The @dfn{group buffer} lists all (or parts) of the available groups.  It
+is the first buffer shown when Gnus starts, and will never be killed as
+long as Gnus is active.
+
+@iftex
+@iflatex
+\gnusfigure{The Group Buffer}{320}{
+\put(75,50){\epsfig{figure=ps/group,height=9cm}}
+\put(120,37){\makebox(0,0)[t]{Buffer name}}
+\put(120,38){\vector(1,2){10}}
+\put(40,60){\makebox(0,0)[r]{Mode line}}
+\put(40,58){\vector(1,0){30}}
+\put(200,28){\makebox(0,0)[t]{Native select method}}
+\put(200,26){\vector(-1,2){15}}
+}
+@end iflatex
+@end iftex
+
+@menu
+* Group Buffer Format::         Information listed and how you can change it.
+* Group Maneuvering::           Commands for moving in the group buffer.
+* Selecting a Group::           Actually reading news.
+* Subscription Commands::       Unsubscribing, killing, subscribing.
+* Group Data::                  Changing the info for a group.
+* Group Levels::                Levels? What are those, then?
+* Group Score::                 A mechanism for finding out what groups you like.
+* Marking Groups::              You can mark groups for later processing.
+* Foreign Groups::              Creating and editing groups.
+* Group Parameters::            Each group may have different parameters set.
+* Listing Groups::              Gnus can list various subsets of the groups.
+* Sorting Groups::              Re-arrange the group order.
+* Group Maintenance::           Maintaining a tidy @file{.newsrc} file.
+* Browse Foreign Server::       You can browse a server.  See what it has to offer.
+* Exiting Gnus::                Stop reading news and get some work done.
+* Group Topics::                A folding group mode divided into topics.
+* Misc Group Stuff::            Other stuff that you can to do.
+@end menu
+
+
+@node Group Buffer Format
+@section Group Buffer Format
+
+@menu
+* Group Line Specification::    Deciding how the group buffer is to look.
+* Group Mode Line Specification::  The group buffer mode line.
+* Group Highlighting::          Having nice colors in the group buffer.
+@end menu
+
+You can customize the Group Mode tool bar, see @kbd{M-x
+customize-apropos RET gnus-group-tool-bar}.  This feature is only
+available in Emacs.
+
+The tool bar icons are now (de)activated correctly depending on the
+cursor position.  Therefore, moving around in the Group Buffer is
+slower.  You can disable this via the variable
+@code{gnus-group-update-tool-bar}.  Its default value depends on your
+Emacs version.
+
+@node Group Line Specification
+@subsection Group Line Specification
+@cindex group buffer format
+
+The default format of the group buffer is nice and dull, but you can
+make it as exciting and ugly as you feel like.
+
+Here's a couple of example group lines:
+
+@example
+     25: news.announce.newusers
+ *    0: alt.fan.andrea-dworkin
+@end example
+
+Quite simple, huh?
+
+You can see that there are 25 unread articles in
+@samp{news.announce.newusers}.  There are no unread articles, but some
+ticked articles, in @samp{alt.fan.andrea-dworkin} (see that little
+asterisk at the beginning of the line?).
+
+@vindex gnus-group-line-format
+You can change that format to whatever you want by fiddling with the
+@code{gnus-group-line-format} variable.  This variable works along the
+lines of a @code{format} specification, which is pretty much the same as
+a @code{printf} specifications, for those of you who use (feh!) C.
+@xref{Formatting Variables}.
+
+@samp{%M%S%5y:%B%(%g%)\n} is the value that produced those lines above.
+
+There should always be a colon on the line; the cursor always moves to
+the colon after performing an operation.  @xref{Positioning
+Point}.  Nothing else is required---not even the group name.  All
+displayed text is just window dressing, and is never examined by Gnus.
+Gnus stores all real information it needs using text properties.
+
+(Note that if you make a really strange, wonderful, spreadsheet-like
+layout, everybody will believe you are hard at work with the accounting
+instead of wasting time reading news.)
+
+Here's a list of all available format characters:
+
+@table @samp
+
+@item M
+An asterisk if the group only has marked articles.
+
+@item S
+Whether the group is subscribed.
+
+@item L
+Level of subscribedness.
+
+@item N
+Number of unread articles.
+
+@item I
+Number of dormant articles.
+
+@item T
+Number of ticked articles.
+
+@item R
+Number of read articles.
+
+@item U
+Number of unseen articles.
+
+@item t
+Estimated total number of articles.  (This is really @var{max-number}
+minus @var{min-number} plus 1.)
+
+Gnus uses this estimation because the @acronym{NNTP} protocol provides
+efficient access to @var{max-number} and @var{min-number} but getting
+the true unread message count is not possible efficiently.  For
+hysterical raisins, even the mail back ends, where the true number of
+unread messages might be available efficiently, use the same limited
+interface.  To remove this restriction from Gnus means that the back
+end interface has to be changed, which is not an easy job.  If you
+want to work on this, please contact the Gnus mailing list.
+
+@item y
+Number of unread, unticked, non-dormant articles.
+
+@item i
+Number of ticked and dormant articles.
+
+@item g
+Full group name.
+
+@item G
+Group name.
+
+@item C
+Group comment (@pxref{Group Parameters}) or group name if there is no
+comment element in the group parameters.
+
+@item D
+Newsgroup description.  You need to read the group descriptions
+before these will appear, and to do that, you either have to set
+@code{gnus-read-active-file} or use the group buffer @kbd{M-d}
+command.
+
+@item o
+@samp{m} if moderated.
+
+@item O
+@samp{(m)} if moderated.
+
+@item s
+Select method.
+
+@item B
+If the summary buffer for the group is open or not.
+
+@item n
+Select from where.
+
+@item z
+A string that looks like @samp{<%s:%n>} if a foreign select method is
+used.
+
+@item P
+Indentation based on the level of the topic (@pxref{Group Topics}).
+
+@item c
+@vindex gnus-group-uncollapsed-levels
+Short (collapsed) group name.  The @code{gnus-group-uncollapsed-levels}
+variable says how many levels to leave at the end of the group name.
+The default is 1---this will mean that group names like
+@samp{gnu.emacs.gnus} will be shortened to @samp{g.e.gnus}.
+
+@item m
+@vindex gnus-new-mail-mark
+@cindex %
+@samp{%} (@code{gnus-new-mail-mark}) if there has arrived new mail to
+the group lately.
+
+@item p
+@samp{#} (@code{gnus-process-mark}) if the group is process marked.
+
+@item d
+A string that says when you last read the group (@pxref{Group
+Timestamp}).
+
+@item u
+User defined specifier.  The next character in the format string should
+be a letter.  Gnus will call the function
+@code{gnus-user-format-function-}@samp{X}, where @samp{X} is the letter
+following @samp{%u}.  The function will be passed a single dummy
+parameter as argument.  The function should return a string, which will
+be inserted into the buffer just like information from any other
+specifier.
+@end table
+
+@cindex *
+All the ``number-of'' specs will be filled with an asterisk (@samp{*})
+if no info is available---for instance, if it is a non-activated foreign
+group, or a bogus native group.
+
+
+@node Group Mode Line Specification
+@subsection Group Mode Line Specification
+@cindex group mode line
+
+@vindex gnus-group-mode-line-format
+The mode line can be changed by setting
+@code{gnus-group-mode-line-format} (@pxref{Mode Line Formatting}).  It
+doesn't understand that many format specifiers:
+
+@table @samp
+@item S
+The native news server.
+@item M
+The native select method.
+@end table
+
+
+@node Group Highlighting
+@subsection Group Highlighting
+@cindex highlighting
+@cindex group highlighting
+
+@vindex gnus-group-highlight
+Highlighting in the group buffer is controlled by the
+@code{gnus-group-highlight} variable.  This is an alist with elements
+that look like @code{(@var{form} . @var{face})}.  If @var{form} evaluates to
+something non-@code{nil}, the @var{face} will be used on the line.
+
+Here's an example value for this variable that might look nice if the
+background is dark:
+
+@lisp
+(cond (window-system
+       (setq custom-background-mode 'light)
+       (defface my-group-face-1
+         '((t (:foreground "Red" :bold t))) "First group face")
+       (defface my-group-face-2
+         '((t (:foreground "DarkSeaGreen4" :bold t)))
+         "Second group face")
+       (defface my-group-face-3
+         '((t (:foreground "Green4" :bold t))) "Third group face")
+       (defface my-group-face-4
+         '((t (:foreground "SteelBlue" :bold t))) "Fourth group face")
+       (defface my-group-face-5
+         '((t (:foreground "Blue" :bold t))) "Fifth group face")))
+
+(setq gnus-group-highlight
+      '(((> unread 200) . my-group-face-1)
+        ((and (< level 3) (zerop unread)) . my-group-face-2)
+        ((< level 3) . my-group-face-3)
+        ((zerop unread) . my-group-face-4)
+        (t . my-group-face-5)))
+@end lisp
+
+Also @pxref{Faces and Fonts}.
+
+Variables that are dynamically bound when the forms are evaluated
+include:
+
+@table @code
+@item group
+The group name.
+@item unread
+The number of unread articles in the group.
+@item method
+The select method.
+@item mailp
+Whether the group is a mail group.
+@item level
+The level of the group.
+@item score
+The score of the group.
+@item ticked
+The number of ticked articles in the group.
+@item total
+The total number of articles in the group.  Or rather,
+@var{max-number} minus @var{min-number} plus one.
+@item topic
+When using the topic minor mode, this variable is bound to the current
+topic being inserted.
+@end table
+
+When the forms are @code{eval}ed, point is at the beginning of the line
+of the group in question, so you can use many of the normal Gnus
+functions for snarfing info on the group.
+
+@vindex gnus-group-update-hook
+@findex gnus-group-highlight-line
+@code{gnus-group-update-hook} is called when a group line is changed.
+It will not be called when @code{gnus-visual} is @code{nil}.  This hook
+calls @code{gnus-group-highlight-line} by default.
+
+
+@node Group Maneuvering
+@section Group Maneuvering
+@cindex group movement
+
+All movement commands understand the numeric prefix and will behave as
+expected, hopefully.
+
+@table @kbd
+
+@item n
+@kindex n (Group)
+@findex gnus-group-next-unread-group
+Go to the next group that has unread articles
+(@code{gnus-group-next-unread-group}).
+
+@item p
+@itemx DEL
+@kindex DEL (Group)
+@kindex p (Group)
+@findex gnus-group-prev-unread-group
+Go to the previous group that has unread articles
+(@code{gnus-group-prev-unread-group}).
+
+@item N
+@kindex N (Group)
+@findex gnus-group-next-group
+Go to the next group (@code{gnus-group-next-group}).
+
+@item P
+@kindex P (Group)
+@findex gnus-group-prev-group
+Go to the previous group (@code{gnus-group-prev-group}).
+
+@item M-n
+@kindex M-n (Group)
+@findex gnus-group-next-unread-group-same-level
+Go to the next unread group on the same (or lower) level
+(@code{gnus-group-next-unread-group-same-level}).
+
+@item M-p
+@kindex M-p (Group)
+@findex gnus-group-prev-unread-group-same-level
+Go to the previous unread group on the same (or lower) level
+(@code{gnus-group-prev-unread-group-same-level}).
+@end table
+
+Three commands for jumping to groups:
+
+@table @kbd
+
+@item j
+@kindex j (Group)
+@findex gnus-group-jump-to-group
+Jump to a group (and make it visible if it isn't already)
+(@code{gnus-group-jump-to-group}).  Killed groups can be jumped to, just
+like living groups.
+
+@item ,
+@kindex , (Group)
+@findex gnus-group-best-unread-group
+Jump to the unread group with the lowest level
+(@code{gnus-group-best-unread-group}).
+
+@item .
+@kindex . (Group)
+@findex gnus-group-first-unread-group
+Jump to the first group with unread articles
+(@code{gnus-group-first-unread-group}).
+@end table
+
+@vindex gnus-group-goto-unread
+If @code{gnus-group-goto-unread} is @code{nil}, all the movement
+commands will move to the next group, not the next unread group.  Even
+the commands that say they move to the next unread group.  The default
+is @code{t}.
+
+
+@node Selecting a Group
+@section Selecting a Group
+@cindex group selection
+
+@table @kbd
+
+@item SPACE
+@kindex SPACE (Group)
+@findex gnus-group-read-group
+Select the current group, switch to the summary buffer and display the
+first unread article (@code{gnus-group-read-group}).  If there are no
+unread articles in the group, or if you give a non-numerical prefix to
+this command, Gnus will offer to fetch all the old articles in this
+group from the server.  If you give a numerical prefix @var{n}, @var{n}
+determines the number of articles Gnus will fetch.  If @var{n} is
+positive, Gnus fetches the @var{n} newest articles, if @var{n} is
+negative, Gnus fetches the @code{abs(@var{n})} oldest articles.
+
+Thus, @kbd{SPC} enters the group normally, @kbd{C-u SPC} offers old
+articles, @kbd{C-u 4 2 SPC} fetches the 42 newest articles, and @kbd{C-u
+- 4 2 SPC} fetches the 42 oldest ones.
+
+When you are in the group (in the Summary buffer), you can type
+@kbd{M-g} to fetch new articles, or @kbd{C-u M-g} to also show the old
+ones.
+
+@item RET
+@kindex RET (Group)
+@findex gnus-group-select-group
+Select the current group and switch to the summary buffer
+(@code{gnus-group-select-group}).  Takes the same arguments as
+@code{gnus-group-read-group}---the only difference is that this command
+does not display the first unread article automatically upon group
+entry.
+
+@item M-RET
+@kindex M-RET (Group)
+@findex gnus-group-quick-select-group
+This does the same as the command above, but tries to do it with the
+minimum amount of fuzz (@code{gnus-group-quick-select-group}).  No
+scoring/killing will be performed, there will be no highlights and no
+expunging.  This might be useful if you're in a real hurry and have to
+enter some humongous group.  If you give a 0 prefix to this command
+(i.e., @kbd{0 M-RET}), Gnus won't even generate the summary buffer,
+which is useful if you want to toggle threading before generating the
+summary buffer (@pxref{Summary Generation Commands}).
+
+@item M-SPACE
+@kindex M-SPACE (Group)
+@findex gnus-group-visible-select-group
+This is yet one more command that does the same as the @kbd{RET}
+command, but this one does it without expunging and hiding dormants
+(@code{gnus-group-visible-select-group}).
+
+@item C-M-RET
+@kindex C-M-RET (Group)
+@findex gnus-group-select-group-ephemerally
+Finally, this command selects the current group ephemerally without
+doing any processing of its contents
+(@code{gnus-group-select-group-ephemerally}).  Even threading has been
+turned off.  Everything you do in the group after selecting it in this
+manner will have no permanent effects.
+
+@end table
+
+@vindex gnus-large-newsgroup
+The @code{gnus-large-newsgroup} variable says what Gnus should
+consider to be a big group.  If it is @code{nil}, no groups are
+considered big.  The default value is 200.  If the group has more
+(unread and/or ticked) articles than this, Gnus will query the user
+before entering the group.  The user can then specify how many
+articles should be fetched from the server.  If the user specifies a
+negative number (@var{-n}), the @var{n} oldest articles will be
+fetched.  If it is positive, the @var{n} articles that have arrived
+most recently will be fetched.
+
+@vindex gnus-large-ephemeral-newsgroup
+@code{gnus-large-ephemeral-newsgroup} is the same as
+@code{gnus-large-newsgroup}, but is only used for ephemeral
+newsgroups.
+
+@vindex gnus-newsgroup-maximum-articles
+In groups in some news servers, there might be a big gap between a few
+very old articles that will never be expired and the recent ones.  In
+such a case, the server will return the data like @code{(1 . 30000000)}
+for the @code{LIST ACTIVE group} command, for example.  Even if there
+are actually only the articles 1-10 and 29999900-30000000, Gnus doesn't
+know it at first and prepares for getting 30000000 articles.  However,
+it will consume hundreds megabytes of memories and might make Emacs get
+stuck as the case may be.  If you use such news servers, set the
+variable @code{gnus-newsgroup-maximum-articles} to a positive number.
+The value means that Gnus ignores articles other than this number of the
+latest ones in every group.  For instance, the value 10000 makes Gnus
+get only the articles 29990001-30000000 (if the latest article number is
+30000000 in a group).  Note that setting this variable to a number might
+prevent you from reading very old articles.  The default value of the
+variable @code{gnus-newsgroup-maximum-articles} is @code{nil}, which
+means Gnus never ignores old articles.
+
+@vindex gnus-select-group-hook
+@vindex gnus-auto-select-first
+@vindex gnus-auto-select-subject
+If @code{gnus-auto-select-first} is non-@code{nil}, select an article
+automatically when entering a group with the @kbd{SPACE} command.
+Which article this is is controlled by the
+@code{gnus-auto-select-subject} variable.  Valid values for this
+variable are:
+
+@table @code
+
+@item unread
+Place point on the subject line of the first unread article.
+
+@item first
+Place point on the subject line of the first article.
+
+@item unseen
+Place point on the subject line of the first unseen article.
+
+@item unseen-or-unread
+Place point on the subject line of the first unseen article, and if
+there is no such article, place point on the subject line of the first
+unread article.
+
+@item best
+Place point on the subject line of the highest-scored unread article.
+
+@end table
+
+This variable can also be a function.  In that case, that function
+will be called to place point on a subject line.
+
+If you want to prevent automatic selection in some group (say, in a
+binary group with Huge articles) you can set the
+@code{gnus-auto-select-first} variable to @code{nil} in
+@code{gnus-select-group-hook}, which is called when a group is
+selected.
+
+
+@node Subscription Commands
+@section Subscription Commands
+@cindex subscription
+
+@table @kbd
+
+@item S t
+@itemx u
+@kindex S t (Group)
+@kindex u (Group)
+@findex gnus-group-unsubscribe-current-group
+@c @icon{gnus-group-unsubscribe}
+Toggle subscription to the current group
+(@code{gnus-group-unsubscribe-current-group}).
+
+@item S s
+@itemx U
+@kindex S s (Group)
+@kindex U (Group)
+@findex gnus-group-unsubscribe-group
+Prompt for a group to subscribe, and then subscribe it.  If it was
+subscribed already, unsubscribe it instead
+(@code{gnus-group-unsubscribe-group}).
+
+@item S k
+@itemx C-k
+@kindex S k (Group)
+@kindex C-k (Group)
+@findex gnus-group-kill-group
+@c @icon{gnus-group-kill-group}
+Kill the current group (@code{gnus-group-kill-group}).
+
+@item S y
+@itemx C-y
+@kindex S y (Group)
+@kindex C-y (Group)
+@findex gnus-group-yank-group
+Yank the last killed group (@code{gnus-group-yank-group}).
+
+@item C-x C-t
+@kindex C-x C-t (Group)
+@findex gnus-group-transpose-groups
+Transpose two groups (@code{gnus-group-transpose-groups}).  This isn't
+really a subscription command, but you can use it instead of a
+kill-and-yank sequence sometimes.
+
+@item S w
+@itemx C-w
+@kindex S w (Group)
+@kindex C-w (Group)
+@findex gnus-group-kill-region
+Kill all groups in the region (@code{gnus-group-kill-region}).
+
+@item S z
+@kindex S z (Group)
+@findex gnus-group-kill-all-zombies
+Kill all zombie groups (@code{gnus-group-kill-all-zombies}).
+
+@item S C-k
+@kindex S C-k (Group)
+@findex gnus-group-kill-level
+Kill all groups on a certain level (@code{gnus-group-kill-level}).
+These groups can't be yanked back after killing, so this command should
+be used with some caution.  The only time where this command comes in
+really handy is when you have a @file{.newsrc} with lots of unsubscribed
+groups that you want to get rid off.  @kbd{S C-k} on level 7 will
+kill off all unsubscribed groups that do not have message numbers in the
+@file{.newsrc} file.
+
+@end table
+
+Also @pxref{Group Levels}.
+
+
+@node Group Data
+@section Group Data
+
+@table @kbd
+
+@item c
+@kindex c (Group)
+@findex gnus-group-catchup-current
+@vindex gnus-group-catchup-group-hook
+@c @icon{gnus-group-catchup-current}
+Mark all unticked articles in this group as read
+(@code{gnus-group-catchup-current}).
+@code{gnus-group-catchup-group-hook} is called when catching up a group from
+the group buffer.
+
+@item C
+@kindex C (Group)
+@findex gnus-group-catchup-current-all
+Mark all articles in this group, even the ticked ones, as read
+(@code{gnus-group-catchup-current-all}).
+
+@item M-c
+@kindex M-c (Group)
+@findex gnus-group-clear-data
+Clear the data from the current group---nix out marks and the list of
+read articles (@code{gnus-group-clear-data}).
+
+@item M-x gnus-group-clear-data-on-native-groups
+@kindex M-x gnus-group-clear-data-on-native-groups
+@findex gnus-group-clear-data-on-native-groups
+If you have switched from one @acronym{NNTP} server to another, all your marks
+and read ranges have become worthless.  You can use this command to
+clear out all data that you have on your native groups.  Use with
+caution.
+
+@end table
+
+
+@node Group Levels
+@section Group Levels
+@cindex group level
+@cindex level
+
+All groups have a level of @dfn{subscribedness}.  For instance, if a
+group is on level 2, it is more subscribed than a group on level 5.  You
+can ask Gnus to just list groups on a given level or lower
+(@pxref{Listing Groups}), or to just check for new articles in groups on
+a given level or lower (@pxref{Scanning New Messages}).
+
+Remember:  The higher the level of the group, the less important it is.
+
+@table @kbd
+
+@item S l
+@kindex S l (Group)
+@findex gnus-group-set-current-level
+Set the level of the current group.  If a numeric prefix is given, the
+next @var{n} groups will have their levels set.  The user will be
+prompted for a level.
+@end table
+
+@vindex gnus-level-killed
+@vindex gnus-level-zombie
+@vindex gnus-level-unsubscribed
+@vindex gnus-level-subscribed
+Gnus considers groups from levels 1 to
+@code{gnus-level-subscribed} (inclusive) (default 5) to be subscribed,
+@code{gnus-level-subscribed} (exclusive) and
+@code{gnus-level-unsubscribed} (inclusive) (default 7) to be
+unsubscribed, @code{gnus-level-zombie} to be zombies (walking dead)
+(default 8) and @code{gnus-level-killed} to be killed (completely dead)
+(default 9).  Gnus treats subscribed and unsubscribed groups exactly the
+same, but zombie and killed groups have no information on what articles
+you have read, etc, stored.  This distinction between dead and living
+groups isn't done because it is nice or clever, it is done purely for
+reasons of efficiency.
+
+It is recommended that you keep all your mail groups (if any) on quite
+low levels (e.g. 1 or 2).
+
+Maybe the following description of the default behavior of Gnus helps to
+understand what these levels are all about.  By default, Gnus shows you
+subscribed nonempty groups, but by hitting @kbd{L} you can have it show
+empty subscribed groups and unsubscribed groups, too.  Type @kbd{l} to
+go back to showing nonempty subscribed groups again.  Thus, unsubscribed
+groups are hidden, in a way.
+
+Zombie and killed groups are similar to unsubscribed groups in that they
+are hidden by default.  But they are different from subscribed and
+unsubscribed groups in that Gnus doesn't ask the news server for
+information (number of messages, number of unread messages) on zombie
+and killed groups.  Normally, you use @kbd{C-k} to kill the groups you
+aren't interested in.  If most groups are killed, Gnus is faster.
+
+Why does Gnus distinguish between zombie and killed groups?  Well, when
+a new group arrives on the server, Gnus by default makes it a zombie
+group.  This means that you are normally not bothered with new groups,
+but you can type @kbd{A z} to get a list of all new groups.  Subscribe
+the ones you like and kill the ones you don't want.  (@kbd{A k} shows a
+list of killed groups.)
+
+If you want to play with the level variables, you should show some care.
+Set them once, and don't touch them ever again.  Better yet, don't touch
+them at all unless you know exactly what you're doing.
+
+@vindex gnus-level-default-unsubscribed
+@vindex gnus-level-default-subscribed
+Two closely related variables are @code{gnus-level-default-subscribed}
+(default 3) and @code{gnus-level-default-unsubscribed} (default 6),
+which are the levels that new groups will be put on if they are
+(un)subscribed.  These two variables should, of course, be inside the
+relevant valid ranges.
+
+@vindex gnus-keep-same-level
+If @code{gnus-keep-same-level} is non-@code{nil}, some movement commands
+will only move to groups of the same level (or lower).  In
+particular, going from the last article in one group to the next group
+will go to the next group of the same level (or lower).  This might be
+handy if you want to read the most important groups before you read the
+rest.
+
+If this variable is @code{best}, Gnus will make the next newsgroup the
+one with the best level.
+
+@vindex gnus-group-default-list-level
+All groups with a level less than or equal to
+@code{gnus-group-default-list-level} will be listed in the group buffer
+by default.
+
+@vindex gnus-group-list-inactive-groups
+If @code{gnus-group-list-inactive-groups} is non-@code{nil}, non-active
+groups will be listed along with the unread groups.  This variable is
+@code{t} by default.  If it is @code{nil}, inactive groups won't be
+listed.
+
+@vindex gnus-group-use-permanent-levels
+If @code{gnus-group-use-permanent-levels} is non-@code{nil}, once you
+give a level prefix to @kbd{g} or @kbd{l}, all subsequent commands will
+use this level as the ``work'' level.
+
+@vindex gnus-activate-level
+Gnus will normally just activate (i. e., query the server about) groups
+on level @code{gnus-activate-level} or less.  If you don't want to
+activate unsubscribed groups, for instance, you might set this variable
+to 5.  The default is 6.
+
+
+@node Group Score
+@section Group Score
+@cindex group score
+@cindex group rank
+@cindex rank
+
+You would normally keep important groups on high levels, but that scheme
+is somewhat restrictive.  Don't you wish you could have Gnus sort the
+group buffer according to how often you read groups, perhaps?  Within
+reason?
+
+This is what @dfn{group score} is for.  You can have Gnus assign a score
+to each group through the mechanism described below.  You can then sort
+the group buffer based on this score.  Alternatively, you can sort on
+score and then level.  (Taken together, the level and the score is
+called the @dfn{rank} of the group.  A group that is on level 4 and has
+a score of 1 has a higher rank than a group on level 5 that has a score
+of 300.  (The level is the most significant part and the score is the
+least significant part.))
+
+@findex gnus-summary-bubble-group
+If you want groups you read often to get higher scores than groups you
+read seldom you can add the @code{gnus-summary-bubble-group} function to
+the @code{gnus-summary-exit-hook} hook.  This will result (after
+sorting) in a bubbling sort of action.  If you want to see that in
+action after each summary exit, you can add
+@code{gnus-group-sort-groups-by-rank} or
+@code{gnus-group-sort-groups-by-score} to the same hook, but that will
+slow things down somewhat.
+
+
+@node Marking Groups
+@section Marking Groups
+@cindex marking groups
+
+If you want to perform some command on several groups, and they appear
+subsequently in the group buffer, you would normally just give a
+numerical prefix to the command.  Most group commands will then do your
+bidding on those groups.
+
+However, if the groups are not in sequential order, you can still
+perform a command on several groups.  You simply mark the groups first
+with the process mark and then execute the command.
+
+@table @kbd
+
+@item #
+@kindex # (Group)
+@itemx M m
+@kindex M m (Group)
+@findex gnus-group-mark-group
+Set the mark on the current group (@code{gnus-group-mark-group}).
+
+@item M-#
+@kindex M-# (Group)
+@itemx M u
+@kindex M u (Group)
+@findex gnus-group-unmark-group
+Remove the mark from the current group
+(@code{gnus-group-unmark-group}).
+
+@item M U
+@kindex M U (Group)
+@findex gnus-group-unmark-all-groups
+Remove the mark from all groups (@code{gnus-group-unmark-all-groups}).
+
+@item M w
+@kindex M w (Group)
+@findex gnus-group-mark-region
+Mark all groups between point and mark (@code{gnus-group-mark-region}).
+
+@item M b
+@kindex M b (Group)
+@findex gnus-group-mark-buffer
+Mark all groups in the buffer (@code{gnus-group-mark-buffer}).
+
+@item M r
+@kindex M r (Group)
+@findex gnus-group-mark-regexp
+Mark all groups that match some regular expression
+(@code{gnus-group-mark-regexp}).
+@end table
+
+Also @pxref{Process/Prefix}.
+
+@findex gnus-group-universal-argument
+If you want to execute some command on all groups that have been marked
+with the process mark, you can use the @kbd{M-&}
+(@code{gnus-group-universal-argument}) command.  It will prompt you for
+the command to be executed.
+
+
+@node Foreign Groups
+@section Foreign Groups
+@cindex foreign groups
+
+Below are some group mode commands for making and editing general foreign
+groups, as well as commands to ease the creation of a few
+special-purpose groups.  All these commands insert the newly created
+groups under point---@code{gnus-subscribe-newsgroup-method} is not
+consulted.
+
+Changes from the group editing commands are stored in
+@file{~/.newsrc.eld} (@code{gnus-startup-file}).  An alternative is the
+variable @code{gnus-parameters}, @xref{Group Parameters}.
+
+@table @kbd
+
+@item G m
+@kindex G m (Group)
+@findex gnus-group-make-group
+@cindex making groups
+Make a new group (@code{gnus-group-make-group}).  Gnus will prompt you
+for a name, a method and possibly an @dfn{address}.  For an easier way
+to subscribe to @acronym{NNTP} groups (@pxref{Browse Foreign Server}).
+
+@item G M
+@kindex G M (Group)
+@findex gnus-group-read-ephemeral-group
+Make an ephemeral group (@code{gnus-group-read-ephemeral-group}).  Gnus
+will prompt you for a name, a method and an @dfn{address}.
+
+@item G r
+@kindex G r (Group)
+@findex gnus-group-rename-group
+@cindex renaming groups
+Rename the current group to something else
+(@code{gnus-group-rename-group}).  This is valid only on some
+groups---mail groups mostly.  This command might very well be quite slow
+on some back ends.
+
+@item G c
+@kindex G c (Group)
+@cindex customizing
+@findex gnus-group-customize
+Customize the group parameters (@code{gnus-group-customize}).
+
+@item G e
+@kindex G e (Group)
+@findex gnus-group-edit-group-method
+@cindex renaming groups
+Enter a buffer where you can edit the select method of the current
+group (@code{gnus-group-edit-group-method}).
+
+@item G p
+@kindex G p (Group)
+@findex gnus-group-edit-group-parameters
+Enter a buffer where you can edit the group parameters
+(@code{gnus-group-edit-group-parameters}).
+
+@item G E
+@kindex G E (Group)
+@findex gnus-group-edit-group
+Enter a buffer where you can edit the group info
+(@code{gnus-group-edit-group}).
+
+@item G d
+@kindex G d (Group)
+@findex gnus-group-make-directory-group
+@cindex nndir
+Make a directory group (@pxref{Directory Groups}).  You will be prompted
+for a directory name (@code{gnus-group-make-directory-group}).
+
+@item G h
+@kindex G h (Group)
+@cindex help group
+@findex gnus-group-make-help-group
+Make the Gnus help group (@code{gnus-group-make-help-group}).
+
+@item G a
+@kindex G a (Group)
+@cindex (ding) archive
+@cindex archive group
+@findex gnus-group-make-archive-group
+@vindex gnus-group-archive-directory
+@vindex gnus-group-recent-archive-directory
+Make a Gnus archive group (@code{gnus-group-make-archive-group}).  By
+default a group pointing to the most recent articles will be created
+(@code{gnus-group-recent-archive-directory}), but given a prefix, a full
+group will be created from @code{gnus-group-archive-directory}.
+
+@item G k
+@kindex G k (Group)
+@findex gnus-group-make-kiboze-group
+@cindex nnkiboze
+Make a kiboze group.  You will be prompted for a name, for a regexp to
+match groups to be ``included'' in the kiboze group, and a series of
+strings to match on headers (@code{gnus-group-make-kiboze-group}).
+@xref{Kibozed Groups}.
+
+@item G D
+@kindex G D (Group)
+@findex gnus-group-enter-directory
+@cindex nneething
+Read an arbitrary directory as if it were a newsgroup with the
+@code{nneething} back end (@code{gnus-group-enter-directory}).
+@xref{Anything Groups}.
+
+@item G f
+@kindex G f (Group)
+@findex gnus-group-make-doc-group
+@cindex ClariNet Briefs
+@cindex nndoc
+Make a group based on some file or other
+(@code{gnus-group-make-doc-group}).  If you give a prefix to this
+command, you will be prompted for a file name and a file type.
+Currently supported types are @code{mbox}, @code{babyl},
+@code{digest}, @code{news}, @code{rnews}, @code{mmdf}, @code{forward},
+@code{rfc934}, @code{rfc822-forward}, @code{mime-parts},
+@code{standard-digest}, @code{slack-digest}, @code{clari-briefs},
+@code{nsmail}, @code{outlook}, @code{oe-dbx}, and @code{mailman}.  If
+you run this command without a prefix, Gnus will guess at the file
+type.  @xref{Document Groups}.
+
+@item G u
+@kindex G u (Group)
+@vindex gnus-useful-groups
+@findex gnus-group-make-useful-group
+Create one of the groups mentioned in @code{gnus-useful-groups}
+(@code{gnus-group-make-useful-group}).
+
+@item G w
+@kindex G w (Group)
+@findex gnus-group-make-web-group
+@cindex Google
+@cindex nnweb
+@cindex gmane
+Make an ephemeral group based on a web search
+(@code{gnus-group-make-web-group}).  If you give a prefix to this
+command, make a solid group instead.  You will be prompted for the
+search engine type and the search string.  Valid search engine types
+include @code{google}, @code{dejanews}, and @code{gmane}.
+@xref{Web Searches}.
+
+If you use the @code{google} search engine, you can limit the search
+to a particular group by using a match string like
+@samp{shaving group:alt.sysadmin.recovery}.
+
+@item G R
+@kindex G R (Group)
+@findex gnus-group-make-rss-group
+Make a group based on an @acronym{RSS} feed
+(@code{gnus-group-make-rss-group}).  You will be prompted for an URL.
+@xref{RSS}.
+
+@item G DEL
+@kindex G DEL (Group)
+@findex gnus-group-delete-group
+This function will delete the current group
+(@code{gnus-group-delete-group}).  If given a prefix, this function will
+actually delete all the articles in the group, and forcibly remove the
+group itself from the face of the Earth.  Use a prefix only if you are
+absolutely sure of what you are doing.  This command can't be used on
+read-only groups (like @code{nntp} groups), though.
+
+@item G V
+@kindex G V (Group)
+@findex gnus-group-make-empty-virtual
+Make a new, fresh, empty @code{nnvirtual} group
+(@code{gnus-group-make-empty-virtual}).  @xref{Virtual Groups}.
+
+@item G v
+@kindex G v (Group)
+@findex gnus-group-add-to-virtual
+Add the current group to an @code{nnvirtual} group
+(@code{gnus-group-add-to-virtual}).  Uses the process/prefix convention.
+@end table
+
+@xref{Select Methods}, for more information on the various select
+methods.
+
+@vindex gnus-activate-foreign-newsgroups
+If @code{gnus-activate-foreign-newsgroups} is a positive number,
+Gnus will check all foreign groups with this level or lower at startup.
+This might take quite a while, especially if you subscribe to lots of
+groups from different @acronym{NNTP} servers.  Also @pxref{Group Levels};
+@code{gnus-activate-level} also affects activation of foreign
+newsgroups.
+
+
+@node Group Parameters
+@section Group Parameters
+@cindex group parameters
+
+The group parameters store information local to a particular group.
+Here's an example group parameter list:
+
+@example
+((to-address . "ding@@gnus.org")
+ (auto-expire . t))
+@end example
+
+We see that each element consists of a ``dotted pair''---the thing before
+the dot is the key, while the thing after the dot is the value.  All the
+parameters have this form @emph{except} local variable specs, which are
+not dotted pairs, but proper lists.
+
+Some parameters have correspondent customizable variables, each of which
+is an alist of regexps and values.
+
+The following group parameters can be used:
+
+@table @code
+@item to-address
+@cindex to-address
+Address used by when doing followups and new posts.
+
+@example
+(to-address . "some@@where.com")
+@end example
+
+This is primarily useful in mail groups that represent closed mailing
+lists---mailing lists where it's expected that everybody that writes to
+the mailing list is subscribed to it.  Since using this parameter
+ensures that the mail only goes to the mailing list itself, it means
+that members won't receive two copies of your followups.
+
+Using @code{to-address} will actually work whether the group is foreign
+or not.  Let's say there's a group on the server that is called
+@samp{fa.4ad-l}.  This is a real newsgroup, but the server has gotten
+the articles from a mail-to-news gateway.  Posting directly to this
+group is therefore impossible---you have to send mail to the mailing
+list address instead.
+
+See also @code{gnus-parameter-to-address-alist}.
+
+@item to-list
+@cindex to-list
+Address used when doing @kbd{a} in that group.
+
+@example
+(to-list . "some@@where.com")
+@end example
+
+It is totally ignored
+when doing a followup---except that if it is present in a news group,
+you'll get mail group semantics when doing @kbd{f}.
+
+If you do an @kbd{a} command in a mail group and you have neither a
+@code{to-list} group parameter nor a @code{to-address} group parameter,
+then a @code{to-list} group parameter will be added automatically upon
+sending the message if @code{gnus-add-to-list} is set to @code{t}.
+@vindex gnus-add-to-list
+
+@findex gnus-mailing-list-mode
+@cindex mail list groups
+If this variable is set, @code{gnus-mailing-list-mode} is turned on when
+entering summary buffer.
+
+See also @code{gnus-parameter-to-list-alist}.
+
+@anchor{subscribed}
+@item subscribed
+@cindex subscribed
+@cindex Mail-Followup-To
+@findex gnus-find-subscribed-addresses
+If this parameter is set to @code{t}, Gnus will consider the
+to-address and to-list parameters for this group as addresses of
+mailing lists you are subscribed to.  Giving Gnus this information is
+(only) a first step in getting it to generate correct Mail-Followup-To
+headers for your posts to these lists.  The second step is to put the
+following in your @file{.gnus.el}
+
+@lisp
+(setq message-subscribed-address-functions
+      '(gnus-find-subscribed-addresses))
+@end lisp
+
+@xref{Mailing Lists, ,Mailing Lists, message, The Message Manual}, for
+a complete treatment of available MFT support.
+
+@item visible
+@cindex visible
+If the group parameter list has the element @code{(visible . t)},
+that group will always be visible in the Group buffer, regardless
+of whether it has any unread articles.
+
+This parameter cannot be set via @code{gnus-parameters}. See
+@code{gnus-permanently-visible-groups} as an alternative.
+
+@item broken-reply-to
+@cindex broken-reply-to
+Elements like @code{(broken-reply-to . t)} signals that @code{Reply-To}
+headers in this group are to be ignored, and for the header to be hidden
+if @code{reply-to} is part of @code{gnus-boring-article-headers}.  This
+can be useful if you're reading a mailing list group where the listserv
+has inserted @code{Reply-To} headers that point back to the listserv
+itself.  That is broken behavior.  So there!
+
+@item to-group
+@cindex to-group
+Elements like @code{(to-group . "some.group.name")} means that all
+posts in that group will be sent to @code{some.group.name}.
+
+@item newsgroup
+@cindex newsgroup
+If you have @code{(newsgroup . t)} in the group parameter list, Gnus
+will treat all responses as if they were responses to news articles.
+This can be useful if you have a mail group that's really a mirror of a
+news group.
+
+@item gcc-self
+@cindex gcc-self
+If @code{(gcc-self . t)} is present in the group parameter list, newly
+composed messages will be @code{Gcc}'d to the current group.  If
+@code{(gcc-self . none)} is present, no @code{Gcc:} header will be
+generated, if @code{(gcc-self . "string")} is present, this string will
+be inserted literally as a @code{gcc} header.  This parameter takes
+precedence over any default @code{Gcc} rules as described later
+(@pxref{Archived Messages}).
+
+@strong{Caveat}: Adding @code{(gcc-self . t)} to the parameter list of
+@code{nntp} groups (or the like) isn't valid.  An @code{nntp} server
+doesn't accept articles.
+
+@item auto-expire
+@cindex auto-expire
+@cindex expiring mail
+If the group parameter has an element that looks like @code{(auto-expire
+. t)}, all articles read will be marked as expirable.  For an
+alternative approach, @pxref{Expiring Mail}.
+
+See also @code{gnus-auto-expirable-newsgroups}.
+
+@item total-expire
+@cindex total-expire
+@cindex expiring mail
+If the group parameter has an element that looks like
+@code{(total-expire . t)}, all read articles will be put through the
+expiry process, even if they are not marked as expirable.  Use with
+caution.  Unread, ticked and dormant articles are not eligible for
+expiry.
+
+See also @code{gnus-total-expirable-newsgroups}.
+
+@item expiry-wait
+@cindex expiry-wait
+@vindex nnmail-expiry-wait-function
+If the group parameter has an element that looks like
+@code{(expiry-wait . 10)}, this value will override any
+@code{nnmail-expiry-wait} and @code{nnmail-expiry-wait-function}
+(@pxref{Expiring Mail}) when expiring expirable messages.  The value
+can either be a number of days (not necessarily an integer) or the
+symbols @code{never} or @code{immediate}.
+
+@item expiry-target
+@cindex expiry-target
+Where expired messages end up.  This parameter overrides
+@code{nnmail-expiry-target}.
+
+@item score-file
+@cindex score file group parameter
+Elements that look like @code{(score-file . "file")} will make
+@file{file} into the current score file for the group in question.  All
+interactive score entries will be put into this file.
+
+@item adapt-file
+@cindex adapt file group parameter
+Elements that look like @code{(adapt-file . "file")} will make
+@file{file} into the current adaptive file for the group in question.
+All adaptive score entries will be put into this file.
+
+@item admin-address
+@cindex admin-address
+When unsubscribing from a mailing list you should never send the
+unsubscription notice to the mailing list itself.  Instead, you'd send
+messages to the administrative address.  This parameter allows you to
+put the admin address somewhere convenient.
+
+@item display
+@cindex display
+Elements that look like @code{(display . MODE)} say which articles to
+display on entering the group.  Valid values are:
+
+@table @code
+@item all
+Display all articles, both read and unread.
+
+@item an integer
+Display the last @var{integer} articles in the group.  This is the same as
+entering the group with @kbd{C-u @var{integer}}.
+
+@item default
+Display the default visible articles, which normally includes unread and
+ticked articles.
+
+@item an array
+Display articles that satisfy a predicate.
+
+Here are some examples:
+
+@table @code
+@item [unread]
+Display only unread articles.
+
+@item [not expire]
+Display everything except expirable articles.
+
+@item [and (not reply) (not expire)]
+Display everything except expirable and articles you've already
+responded to.
+@end table
+
+The available operators are @code{not}, @code{and} and @code{or}.
+Predicates include @code{tick}, @code{unsend}, @code{undownload},
+@code{unread}, @code{dormant}, @code{expire}, @code{reply},
+@code{killed}, @code{bookmark}, @code{score}, @code{save},
+@code{cache}, @code{forward}, @code{unseen} and @code{recent}.
+
+@end table
+
+The @code{display} parameter works by limiting the summary buffer to
+the subset specified.  You can pop the limit by using the @kbd{/ w}
+command (@pxref{Limiting}).
+
+@item comment
+@cindex comment
+Elements that look like @code{(comment . "This is a comment")} are
+arbitrary comments on the group.  You can display comments in the
+group line (@pxref{Group Line Specification}).
+
+@item charset
+@cindex charset
+Elements that look like @code{(charset . iso-8859-1)} will make
+@code{iso-8859-1} the default charset; that is, the charset that will be
+used for all articles that do not specify a charset.
+
+See also @code{gnus-group-charset-alist}.
+
+@item ignored-charsets
+@cindex ignored-charset
+Elements that look like @code{(ignored-charsets x-unknown iso-8859-1)}
+will make @code{iso-8859-1} and @code{x-unknown} ignored; that is, the
+default charset will be used for decoding articles.
+
+See also @code{gnus-group-ignored-charsets-alist}.
+
+@item posting-style
+@cindex posting-style
+You can store additional posting style information for this group
+here (@pxref{Posting Styles}).  The format is that of an entry in the
+@code{gnus-posting-styles} alist, except that there's no regexp matching
+the group name (of course).  Style elements in this group parameter will
+take precedence over the ones found in @code{gnus-posting-styles}.
+
+For instance, if you want a funky name and signature in this group only,
+instead of hacking @code{gnus-posting-styles}, you could put something
+like this in the group parameters:
+
+@example
+(posting-style
+  (name "Funky Name")
+  ("X-My-Header" "Funky Value")
+  (signature "Funky Signature"))
+@end example
+
+@item post-method
+@cindex post-method
+If it is set, the value is used as the method for posting message
+instead of @code{gnus-post-method}.
+
+@item banner
+@cindex banner
+An item like @code{(banner . @var{regexp})} causes any part of an article
+that matches the regular expression @var{regexp} to be stripped.  Instead of
+@var{regexp}, you can also use the symbol @code{signature} which strips the
+last signature or any of the elements of the alist
+@code{gnus-article-banner-alist}.
+
+@item sieve
+@cindex sieve
+This parameter contains a Sieve test that should match incoming mail
+that should be placed in this group.  From this group parameter, a
+Sieve @samp{IF} control structure is generated, having the test as the
+condition and @samp{fileinto "group.name";} as the body.
+
+For example, if the @samp{INBOX.list.sieve} group has the @code{(sieve
+address "sender" "sieve-admin@@extundo.com")} group parameter, when
+translating the group parameter into a Sieve script (@pxref{Sieve
+Commands}) the following Sieve code is generated:
+
+@example
+if address \"sender\" \"sieve-admin@@extundo.com\" @{
+        fileinto \"INBOX.list.sieve\";
+@}
+@end example
+
+The Sieve language is described in RFC 3028.  @xref{Top, Emacs Sieve,
+Top, sieve, Emacs Sieve}.
+
+@item (agent parameters)
+If the agent has been enabled, you can set any of the its parameters
+to control the behavior of the agent in individual groups. See Agent
+Parameters in @ref{Category Syntax}.  Most users will choose to set
+agent parameters in either an agent category or group topic to
+minimize the configuration effort.
+
+@item (@var{variable} @var{form})
+You can use the group parameters to set variables local to the group you
+are entering.  If you want to turn threading off in @samp{news.answers},
+you could put @code{(gnus-show-threads nil)} in the group parameters of
+that group.  @code{gnus-show-threads} will be made into a local variable
+in the summary buffer you enter, and the form @code{nil} will be
+@code{eval}ed there.
+
+Note that this feature sets the variable locally to the summary buffer.
+But some variables are evaluated in the article buffer, or in the
+message buffer (of a reply or followup or otherwise newly created
+message).  As a workaround, it might help to add the variable in
+question to @code{gnus-newsgroup-variables}.  @xref{Various Summary
+Stuff}.  So if you want to set @code{message-from-style} via the group
+parameters, then you may need the following statement elsewhere in your
+@file{~/.gnus} file:
+
+@lisp
+(add-to-list 'gnus-newsgroup-variables 'message-from-style)
+@end lisp
+
+@vindex gnus-list-identifiers
+A use for this feature is to remove a mailing list identifier tag in
+the subject fields of articles.  E.g. if the news group
+
+@example
+nntp+news.gnus.org:gmane.text.docbook.apps
+@end example
+
+has the tag @samp{DOC-BOOK-APPS:} in the subject of all articles, this
+tag can be removed from the article subjects in the summary buffer for
+the group by putting @code{(gnus-list-identifiers "DOCBOOK-APPS:")}
+into the group parameters for the group.
+
+This can also be used as a group-specific hook function.  If you want to
+hear a beep when you enter a group, you could put something like
+@code{(dummy-variable (ding))} in the parameters of that group.
+@code{dummy-variable} will be set to the (meaningless) result of the
+@code{(ding)} form.
+
+Alternatively, since the VARIABLE becomes local to the group, this
+pattern can be used to temporarily change a hook.  For example, if the
+following is added to a group parameter
+
+@lisp
+(gnus-summary-prepared-hook
+  '(lambda nil (local-set-key "d" (local-key-binding "n"))))
+@end lisp
+
+when the group is entered, the 'd' key will not mark the article as
+expired.
+
+@end table
+
+Use the @kbd{G p} or the @kbd{G c} command to edit group parameters of a
+group.  (@kbd{G p} presents you with a Lisp-based interface, @kbd{G c}
+presents you with a Customize-like interface.  The latter helps avoid
+silly Lisp errors.)  You might also be interested in reading about topic
+parameters (@pxref{Topic Parameters}).
+
+@vindex gnus-parameters
+Group parameters can be set via the @code{gnus-parameters} variable too.
+But some variables, such as @code{visible}, have no effect (For this
+case see @code{gnus-permanently-visible-groups} as an alternative.).
+For example:
+
+@lisp
+(setq gnus-parameters
+      '(("mail\\..*"
+         (gnus-show-threads nil)
+         (gnus-use-scoring nil)
+         (gnus-summary-line-format
+          "%U%R%z%I%(%[%d:%ub%-23,23f%]%) %s\n")
+         (gcc-self . t)
+         (display . all))
+
+        ("^nnimap:\\(foo.bar\\)$"
+         (to-group . "\\1"))
+
+        ("mail\\.me"
+         (gnus-use-scoring  t))
+
+        ("list\\..*"
+         (total-expire . t)
+         (broken-reply-to . t))))
+@end lisp
+
+String value of parameters will be subjected to regexp substitution, as
+the @code{to-group} example shows.
+
+@vindex gnus-parameters-case-fold-search
+By default, whether comparing the group name and one of those regexps
+specified in @code{gnus-parameters} is done in a case-sensitive manner
+or a case-insensitive manner depends on the value of
+@code{case-fold-search} at the time when the comparison is done.  The
+value of @code{case-fold-search} is typically @code{t}; it means, for
+example, the element @code{("INBOX\\.FOO" (total-expire . t))} might be
+applied to both the @samp{INBOX.FOO} group and the @samp{INBOX.foo}
+group.  If you want to make those regexps always case-sensitive, set the
+value of the @code{gnus-parameters-case-fold-search} variable to
+@code{nil}.  Otherwise, set it to @code{t} if you want to compare them
+always in a case-insensitive manner.
+
+
+@node Listing Groups
+@section Listing Groups
+@cindex group listing
+
+These commands all list various slices of the groups available.
+
+@table @kbd
+
+@item l
+@itemx A s
+@kindex A s (Group)
+@kindex l (Group)
+@findex gnus-group-list-groups
+List all groups that have unread articles
+(@code{gnus-group-list-groups}).  If the numeric prefix is used, this
+command will list only groups of level ARG and lower.  By default, it
+only lists groups of level five (i.e.,
+@code{gnus-group-default-list-level}) or lower (i.e., just subscribed
+groups).
+
+@item L
+@itemx A u
+@kindex A u (Group)
+@kindex L (Group)
+@findex gnus-group-list-all-groups
+List all groups, whether they have unread articles or not
+(@code{gnus-group-list-all-groups}).  If the numeric prefix is used,
+this command will list only groups of level ARG and lower.  By default,
+it lists groups of level seven or lower (i.e., just subscribed and
+unsubscribed groups).
+
+@item A l
+@kindex A l (Group)
+@findex gnus-group-list-level
+List all unread groups on a specific level
+(@code{gnus-group-list-level}).  If given a prefix, also list the groups
+with no unread articles.
+
+@item A k
+@kindex A k (Group)
+@findex gnus-group-list-killed
+List all killed groups (@code{gnus-group-list-killed}).  If given a
+prefix argument, really list all groups that are available, but aren't
+currently (un)subscribed.  This could entail reading the active file
+from the server.
+
+@item A z
+@kindex A z (Group)
+@findex gnus-group-list-zombies
+List all zombie groups (@code{gnus-group-list-zombies}).
+
+@item A m
+@kindex A m (Group)
+@findex gnus-group-list-matching
+List all unread, subscribed groups with names that match a regexp
+(@code{gnus-group-list-matching}).
+
+@item A M
+@kindex A M (Group)
+@findex gnus-group-list-all-matching
+List groups that match a regexp (@code{gnus-group-list-all-matching}).
+
+@item A A
+@kindex A A (Group)
+@findex gnus-group-list-active
+List absolutely all groups in the active file(s) of the
+server(s) you are connected to (@code{gnus-group-list-active}).  This
+might very well take quite a while.  It might actually be a better idea
+to do a @kbd{A M} to list all matching, and just give @samp{.} as the
+thing to match on.  Also note that this command may list groups that
+don't exist (yet)---these will be listed as if they were killed groups.
+Take the output with some grains of salt.
+
+@item A a
+@kindex A a (Group)
+@findex gnus-group-apropos
+List all groups that have names that match a regexp
+(@code{gnus-group-apropos}).
+
+@item A d
+@kindex A d (Group)
+@findex gnus-group-description-apropos
+List all groups that have names or descriptions that match a regexp
+(@code{gnus-group-description-apropos}).
+
+@item A c
+@kindex A c (Group)
+@findex gnus-group-list-cached
+List all groups with cached articles (@code{gnus-group-list-cached}).
+
+@item A ?
+@kindex A ? (Group)
+@findex gnus-group-list-dormant
+List all groups with dormant articles (@code{gnus-group-list-dormant}).
+
+@item A /
+@kindex A / (Group)
+@findex gnus-group-list-limit
+List groups limited within the current selection
+(@code{gnus-group-list-limit}).
+
+@item A f
+@kindex A f (Group)
+@findex gnus-group-list-flush
+Flush groups from the current selection (@code{gnus-group-list-flush}).
+
+@item A p
+@kindex A p (Group)
+@findex gnus-group-list-plus
+List groups plus the current selection (@code{gnus-group-list-plus}).
+
+@end table
+
+@vindex gnus-permanently-visible-groups
+@cindex visible group parameter
+Groups that match the @code{gnus-permanently-visible-groups} regexp will
+always be shown, whether they have unread articles or not.  You can also
+add the @code{visible} element to the group parameters in question to
+get the same effect.
+
+@vindex gnus-list-groups-with-ticked-articles
+Groups that have just ticked articles in it are normally listed in the
+group buffer.  If @code{gnus-list-groups-with-ticked-articles} is
+@code{nil}, these groups will be treated just like totally empty
+groups.  It is @code{t} by default.
+
+
+@node Sorting Groups
+@section Sorting Groups
+@cindex sorting groups
+
+@kindex C-c C-s (Group)
+@findex gnus-group-sort-groups
+@vindex gnus-group-sort-function
+The @kbd{C-c C-s} (@code{gnus-group-sort-groups}) command sorts the
+group buffer according to the function(s) given by the
+@code{gnus-group-sort-function} variable.  Available sorting functions
+include:
+
+@table @code
+
+@item gnus-group-sort-by-alphabet
+@findex gnus-group-sort-by-alphabet
+Sort the group names alphabetically.  This is the default.
+
+@item gnus-group-sort-by-real-name
+@findex gnus-group-sort-by-real-name
+Sort the group alphabetically on the real (unprefixed) group names.
+
+@item gnus-group-sort-by-level
+@findex gnus-group-sort-by-level
+Sort by group level.
+
+@item gnus-group-sort-by-score
+@findex gnus-group-sort-by-score
+Sort by group score.  @xref{Group Score}.
+
+@item gnus-group-sort-by-rank
+@findex gnus-group-sort-by-rank
+Sort by group score and then the group level.  The level and the score
+are, when taken together, the group's @dfn{rank}.  @xref{Group Score}.
+
+@item gnus-group-sort-by-unread
+@findex gnus-group-sort-by-unread
+Sort by number of unread articles.
+
+@item gnus-group-sort-by-method
+@findex gnus-group-sort-by-method
+Sort alphabetically on the select method.
+
+@item gnus-group-sort-by-server
+@findex gnus-group-sort-by-server
+Sort alphabetically on the Gnus server name.
+
+
+@end table
+
+@code{gnus-group-sort-function} can also be a list of sorting
+functions.  In that case, the most significant sort key function must be
+the last one.
+
+
+There are also a number of commands for sorting directly according to
+some sorting criteria:
+
+@table @kbd
+@item G S a
+@kindex G S a (Group)
+@findex gnus-group-sort-groups-by-alphabet
+Sort the group buffer alphabetically by group name
+(@code{gnus-group-sort-groups-by-alphabet}).
+
+@item G S u
+@kindex G S u (Group)
+@findex gnus-group-sort-groups-by-unread
+Sort the group buffer by the number of unread articles
+(@code{gnus-group-sort-groups-by-unread}).
+
+@item G S l
+@kindex G S l (Group)
+@findex gnus-group-sort-groups-by-level
+Sort the group buffer by group level
+(@code{gnus-group-sort-groups-by-level}).
+
+@item G S v
+@kindex G S v (Group)
+@findex gnus-group-sort-groups-by-score
+Sort the group buffer by group score
+(@code{gnus-group-sort-groups-by-score}).  @xref{Group Score}.
+
+@item G S r
+@kindex G S r (Group)
+@findex gnus-group-sort-groups-by-rank
+Sort the group buffer by group rank
+(@code{gnus-group-sort-groups-by-rank}).  @xref{Group Score}.
+
+@item G S m
+@kindex G S m (Group)
+@findex gnus-group-sort-groups-by-method
+Sort the group buffer alphabetically by back end name@*
+(@code{gnus-group-sort-groups-by-method}).
+
+@item G S n
+@kindex G S n (Group)
+@findex gnus-group-sort-groups-by-real-name
+Sort the group buffer alphabetically by real (unprefixed) group name
+(@code{gnus-group-sort-groups-by-real-name}).
+
+@end table
+
+All the commands below obey the process/prefix convention
+(@pxref{Process/Prefix}).
+
+When given a symbolic prefix (@pxref{Symbolic Prefixes}), all these
+commands will sort in reverse order.
+
+You can also sort a subset of the groups:
+
+@table @kbd
+@item G P a
+@kindex G P a (Group)
+@findex gnus-group-sort-selected-groups-by-alphabet
+Sort the groups alphabetically by group name
+(@code{gnus-group-sort-selected-groups-by-alphabet}).
+
+@item G P u
+@kindex G P u (Group)
+@findex gnus-group-sort-selected-groups-by-unread
+Sort the groups by the number of unread articles
+(@code{gnus-group-sort-selected-groups-by-unread}).
+
+@item G P l
+@kindex G P l (Group)
+@findex gnus-group-sort-selected-groups-by-level
+Sort the groups by group level
+(@code{gnus-group-sort-selected-groups-by-level}).
+
+@item G P v
+@kindex G P v (Group)
+@findex gnus-group-sort-selected-groups-by-score
+Sort the groups by group score
+(@code{gnus-group-sort-selected-groups-by-score}).  @xref{Group Score}.
+
+@item G P r
+@kindex G P r (Group)
+@findex gnus-group-sort-selected-groups-by-rank
+Sort the groups by group rank
+(@code{gnus-group-sort-selected-groups-by-rank}).  @xref{Group Score}.
+
+@item G P m
+@kindex G P m (Group)
+@findex gnus-group-sort-selected-groups-by-method
+Sort the groups alphabetically by back end name@*
+(@code{gnus-group-sort-selected-groups-by-method}).
+
+@item G P n
+@kindex G P n (Group)
+@findex gnus-group-sort-selected-groups-by-real-name
+Sort the groups alphabetically by real (unprefixed) group name
+(@code{gnus-group-sort-selected-groups-by-real-name}).
+
+@item G P s
+@kindex G P s (Group)
+@findex gnus-group-sort-selected-groups
+Sort the groups according to @code{gnus-group-sort-function}.
+
+@end table
+
+And finally, note that you can use @kbd{C-k} and @kbd{C-y} to manually
+move groups around.
+
+
+@node Group Maintenance
+@section Group Maintenance
+@cindex bogus groups
+
+@table @kbd
+@item b
+@kindex b (Group)
+@findex gnus-group-check-bogus-groups
+Find bogus groups and delete them
+(@code{gnus-group-check-bogus-groups}).
+
+@item F
+@kindex F (Group)
+@findex gnus-group-find-new-groups
+Find new groups and process them (@code{gnus-group-find-new-groups}).
+With 1 @kbd{C-u}, use the @code{ask-server} method to query the server
+for new groups.  With 2 @kbd{C-u}'s, use most complete method possible
+to query the server for new groups, and subscribe the new groups as
+zombies.
+
+@item C-c C-x
+@kindex C-c C-x (Group)
+@findex gnus-group-expire-articles
+@cindex expiring mail
+Run all expirable articles in the current group through the expiry
+process (if any) (@code{gnus-group-expire-articles}).  That is, delete
+all expirable articles in the group that have been around for a while.
+(@pxref{Expiring Mail}).
+
+@item C-c C-M-x
+@kindex C-c C-M-x (Group)
+@findex gnus-group-expire-all-groups
+@cindex expiring mail
+Run all expirable articles in all groups through the expiry process
+(@code{gnus-group-expire-all-groups}).
+
+@end table
+
+
+@node Browse Foreign Server
+@section Browse Foreign Server
+@cindex foreign servers
+@cindex browsing servers
+
+@table @kbd
+@item B
+@kindex B (Group)
+@findex gnus-group-browse-foreign-server
+You will be queried for a select method and a server name.  Gnus will
+then attempt to contact this server and let you browse the groups there
+(@code{gnus-group-browse-foreign-server}).
+@end table
+
+@findex gnus-browse-mode
+A new buffer with a list of available groups will appear.  This buffer
+will use the @code{gnus-browse-mode}.  This buffer looks a bit (well,
+a lot) like a normal group buffer.
+
+Here's a list of keystrokes available in the browse mode:
+
+@table @kbd
+@item n
+@kindex n (Browse)
+@findex gnus-group-next-group
+Go to the next group (@code{gnus-group-next-group}).
+
+@item p
+@kindex p (Browse)
+@findex gnus-group-prev-group
+Go to the previous group (@code{gnus-group-prev-group}).
+
+@item SPACE
+@kindex SPACE (Browse)
+@findex gnus-browse-read-group
+Enter the current group and display the first article
+(@code{gnus-browse-read-group}).
+
+@item RET
+@kindex RET (Browse)
+@findex gnus-browse-select-group
+Enter the current group (@code{gnus-browse-select-group}).
+
+@item u
+@kindex u (Browse)
+@findex gnus-browse-unsubscribe-current-group
+Unsubscribe to the current group, or, as will be the case here,
+subscribe to it (@code{gnus-browse-unsubscribe-current-group}).
+
+@item l
+@itemx q
+@kindex q (Browse)
+@kindex l (Browse)
+@findex gnus-browse-exit
+Exit browse mode (@code{gnus-browse-exit}).
+
+@item d
+@kindex d (Browse)
+@findex gnus-browse-describe-group
+Describe the current group (@code{gnus-browse-describe-group}).
+
+@item ?
+@kindex ? (Browse)
+@findex gnus-browse-describe-briefly
+Describe browse mode briefly (well, there's not much to describe, is
+there) (@code{gnus-browse-describe-briefly}).
+@end table
+
+
+@node Exiting Gnus
+@section Exiting Gnus
+@cindex exiting Gnus
+
+Yes, Gnus is ex(c)iting.
+
+@table @kbd
+@item z
+@kindex z (Group)
+@findex gnus-group-suspend
+Suspend Gnus (@code{gnus-group-suspend}).  This doesn't really exit Gnus,
+but it kills all buffers except the Group buffer.  I'm not sure why this
+is a gain, but then who am I to judge?
+
+@item q
+@kindex q (Group)
+@findex gnus-group-exit
+@c @icon{gnus-group-exit}
+Quit Gnus (@code{gnus-group-exit}).
+
+@item Q
+@kindex Q (Group)
+@findex gnus-group-quit
+Quit Gnus without saving the @file{.newsrc} files (@code{gnus-group-quit}).
+The dribble file will be saved, though (@pxref{Auto Save}).
+@end table
+
+@vindex gnus-exit-gnus-hook
+@vindex gnus-suspend-gnus-hook
+@vindex gnus-after-exiting-gnus-hook
+@code{gnus-suspend-gnus-hook} is called when you suspend Gnus and
+@code{gnus-exit-gnus-hook} is called when you quit Gnus, while
+@code{gnus-after-exiting-gnus-hook} is called as the final item when
+exiting Gnus.
+
+Note:
+
+@quotation
+Miss Lisa Cannifax, while sitting in English class, felt her feet go
+numbly heavy and herself fall into a hazy trance as the boy sitting
+behind her drew repeated lines with his pencil across the back of her
+plastic chair.
+@end quotation
+
+
+@node Group Topics
+@section Group Topics
+@cindex topics
+
+If you read lots and lots of groups, it might be convenient to group
+them hierarchically according to topics.  You put your Emacs groups over
+here, your sex groups over there, and the rest (what, two groups or so?)
+you put in some misc section that you never bother with anyway.  You can
+even group the Emacs sex groups as a sub-topic to either the Emacs
+groups or the sex groups---or both!  Go wild!
+
+@iftex
+@iflatex
+\gnusfigure{Group Topics}{400}{
+\put(75,50){\epsfig{figure=ps/group-topic,height=9cm}}
+}
+@end iflatex
+@end iftex
+
+Here's an example:
+
+@example
+Gnus
+  Emacs -- I wuw it!
+     3: comp.emacs
+     2: alt.religion.emacs
+    Naughty Emacs
+     452: alt.sex.emacs
+       0: comp.talk.emacs.recovery
+  Misc
+     8: comp.binaries.fractals
+    13: comp.sources.unix
+@end example
+
+@findex gnus-topic-mode
+@kindex t (Group)
+To get this @emph{fab} functionality you simply turn on (ooh!) the
+@code{gnus-topic} minor mode---type @kbd{t} in the group buffer.  (This
+is a toggling command.)
+
+Go ahead, just try it.  I'll still be here when you get back.  La de
+dum@dots{} Nice tune, that@dots{} la la la@dots{} What, you're back?
+Yes, and now press @kbd{l}.  There.  All your groups are now listed
+under @samp{misc}.  Doesn't that make you feel all warm and fuzzy?
+Hot and bothered?
+
+If you want this permanently enabled, you should add that minor mode to
+the hook for the group mode.  Put the following line in your
+@file{~/.gnus.el} file:
+
+@lisp
+(add-hook 'gnus-group-mode-hook 'gnus-topic-mode)
+@end lisp
+
+@menu
+* Topic Commands::              Interactive E-Z commands.
+* Topic Variables::             How to customize the topics the Lisp Way.
+* Topic Sorting::               Sorting each topic individually.
+* Topic Topology::              A map of the world.
+* Topic Parameters::            Parameters that apply to all groups in a topic.
+@end menu
+
+
+@node Topic Commands
+@subsection Topic Commands
+@cindex topic commands
+
+When the topic minor mode is turned on, a new @kbd{T} submap will be
+available.  In addition, a few of the standard keys change their
+definitions slightly.
+
+In general, the following kinds of operations are possible on topics.
+First of all, you want to create topics.  Secondly, you want to put
+groups in topics and to move them around until you have an order you
+like.  The third kind of operation is to show/hide parts of the whole
+shebang.  You might want to hide a topic including its subtopics and
+groups, to get a better overview of the other groups.
+
+Here is a list of the basic keys that you might need to set up topics
+the way you like.
+
+@table @kbd
+
+@item T n
+@kindex T n (Topic)
+@findex gnus-topic-create-topic
+Prompt for a new topic name and create it
+(@code{gnus-topic-create-topic}).
+
+@item T TAB
+@itemx TAB
+@kindex T TAB (Topic)
+@kindex TAB (Topic)
+@findex gnus-topic-indent
+``Indent'' the current topic so that it becomes a sub-topic of the
+previous topic (@code{gnus-topic-indent}).  If given a prefix,
+``un-indent'' the topic instead.
+
+@item M-TAB
+@kindex M-TAB (Topic)
+@findex gnus-topic-unindent
+``Un-indent'' the current topic so that it becomes a sub-topic of the
+parent of its current parent (@code{gnus-topic-unindent}).
+
+@end table
+
+The following two keys can be used to move groups and topics around.
+They work like the well-known cut and paste.  @kbd{C-k} is like cut and
+@kbd{C-y} is like paste.  Of course, this being Emacs, we use the terms
+kill and yank rather than cut and paste.
+
+@table @kbd
+
+@item C-k
+@kindex C-k (Topic)
+@findex gnus-topic-kill-group
+Kill a group or topic (@code{gnus-topic-kill-group}).  All groups in the
+topic will be removed along with the topic.
+
+@item C-y
+@kindex C-y (Topic)
+@findex gnus-topic-yank-group
+Yank the previously killed group or topic
+(@code{gnus-topic-yank-group}).  Note that all topics will be yanked
+before all groups.
+
+So, to move a topic to the beginning of the list of topics, just hit
+@kbd{C-k} on it.  This is like the ``cut'' part of cut and paste.  Then,
+move the cursor to the beginning of the buffer (just below the ``Gnus''
+topic) and hit @kbd{C-y}.  This is like the ``paste'' part of cut and
+paste.  Like I said -- E-Z.
+
+You can use @kbd{C-k} and @kbd{C-y} on groups as well as on topics.  So
+you can move topics around as well as groups.
+
+@end table
+
+After setting up the topics the way you like them, you might wish to
+hide a topic, or to show it again.  That's why we have the following
+key.
+
+@table @kbd
+
+@item RET
+@kindex RET (Topic)
+@findex gnus-topic-select-group
+@itemx SPACE
+Either select a group or fold a topic (@code{gnus-topic-select-group}).
+When you perform this command on a group, you'll enter the group, as
+usual.  When done on a topic line, the topic will be folded (if it was
+visible) or unfolded (if it was folded already).  So it's basically a
+toggling command on topics.  In addition, if you give a numerical
+prefix, group on that level (and lower) will be displayed.
+
+@end table
+
+Now for a list of other commands, in no particular order.
+
+@table @kbd
+
+@item T m
+@kindex T m (Topic)
+@findex gnus-topic-move-group
+Move the current group to some other topic
+(@code{gnus-topic-move-group}).  This command uses the process/prefix
+convention (@pxref{Process/Prefix}).
+
+@item T j
+@kindex T j (Topic)
+@findex gnus-topic-jump-to-topic
+Go to a topic (@code{gnus-topic-jump-to-topic}).
+
+@item T c
+@kindex T c (Topic)
+@findex gnus-topic-copy-group
+Copy the current group to some other topic
+(@code{gnus-topic-copy-group}).  This command uses the process/prefix
+convention (@pxref{Process/Prefix}).
+
+@item T h
+@kindex T h (Topic)
+@findex gnus-topic-hide-topic
+Hide the current topic (@code{gnus-topic-hide-topic}).  If given
+a prefix, hide the topic permanently.
+
+@item T s
+@kindex T s (Topic)
+@findex gnus-topic-show-topic
+Show the current topic (@code{gnus-topic-show-topic}).  If given
+a prefix, show the topic permanently.
+
+@item T D
+@kindex T D (Topic)
+@findex gnus-topic-remove-group
+Remove a group from the current topic (@code{gnus-topic-remove-group}).
+This command is mainly useful if you have the same group in several
+topics and wish to remove it from one of the topics.  You may also
+remove a group from all topics, but in that case, Gnus will add it to
+the root topic the next time you start Gnus.  In fact, all new groups
+(which, naturally, don't belong to any topic) will show up in the root
+topic.
+
+This command uses the process/prefix convention
+(@pxref{Process/Prefix}).
+
+@item T M
+@kindex T M (Topic)
+@findex gnus-topic-move-matching
+Move all groups that match some regular expression to a topic
+(@code{gnus-topic-move-matching}).
+
+@item T C
+@kindex T C (Topic)
+@findex gnus-topic-copy-matching
+Copy all groups that match some regular expression to a topic
+(@code{gnus-topic-copy-matching}).
+
+@item T H
+@kindex T H (Topic)
+@findex gnus-topic-toggle-display-empty-topics
+Toggle hiding empty topics
+(@code{gnus-topic-toggle-display-empty-topics}).
+
+@item T #
+@kindex T # (Topic)
+@findex gnus-topic-mark-topic
+Mark all groups in the current topic with the process mark
+(@code{gnus-topic-mark-topic}).  This command works recursively on
+sub-topics unless given a prefix.
+
+@item T M-#
+@kindex T M-# (Topic)
+@findex gnus-topic-unmark-topic
+Remove the process mark from all groups in the current topic
+(@code{gnus-topic-unmark-topic}).  This command works recursively on
+sub-topics unless given a prefix.
+
+@item C-c C-x
+@kindex C-c C-x (Topic)
+@findex gnus-topic-expire-articles
+@cindex expiring mail
+Run all expirable articles in the current group or topic through the
+expiry process (if any)
+(@code{gnus-topic-expire-articles}).  (@pxref{Expiring Mail}).
+
+@item T r
+@kindex T r (Topic)
+@findex gnus-topic-rename
+Rename a topic (@code{gnus-topic-rename}).
+
+@item T DEL
+@kindex T DEL (Topic)
+@findex gnus-topic-delete
+Delete an empty topic (@code{gnus-topic-delete}).
+
+@item A T
+@kindex A T (Topic)
+@findex gnus-topic-list-active
+List all groups that Gnus knows about in a topics-ified way
+(@code{gnus-topic-list-active}).
+
+@item T M-n
+@kindex T M-n (Topic)
+@findex gnus-topic-goto-next-topic
+Go to the next topic (@code{gnus-topic-goto-next-topic}).
+
+@item T M-p
+@kindex T M-p (Topic)
+@findex gnus-topic-goto-previous-topic
+Go to the next topic (@code{gnus-topic-goto-previous-topic}).
+
+@item G p
+@kindex G p (Topic)
+@findex gnus-topic-edit-parameters
+@cindex group parameters
+@cindex topic parameters
+@cindex parameters
+Edit the topic parameters (@code{gnus-topic-edit-parameters}).
+@xref{Topic Parameters}.
+
+@end table
+
+
+@node Topic Variables
+@subsection Topic Variables
+@cindex topic variables
+
+The previous section told you how to tell Gnus which topics to display.
+This section explains how to tell Gnus what to display about each topic.
+
+@vindex gnus-topic-line-format
+The topic lines themselves are created according to the
+@code{gnus-topic-line-format} variable (@pxref{Formatting Variables}).
+Valid elements are:
+
+@table @samp
+@item i
+Indentation.
+@item n
+Topic name.
+@item v
+Visibility.
+@item l
+Level.
+@item g
+Number of groups in the topic.
+@item a
+Number of unread articles in the topic.
+@item A
+Number of unread articles in the topic and all its subtopics.
+@end table
+
+@vindex gnus-topic-indent-level
+Each sub-topic (and the groups in the sub-topics) will be indented with
+@code{gnus-topic-indent-level} times the topic level number of spaces.
+The default is 2.
+
+@vindex gnus-topic-mode-hook
+@code{gnus-topic-mode-hook} is called in topic minor mode buffers.
+
+@vindex gnus-topic-display-empty-topics
+The @code{gnus-topic-display-empty-topics} says whether to display even
+topics that have no unread articles in them.  The default is @code{t}.
+
+
+@node Topic Sorting
+@subsection Topic Sorting
+@cindex topic sorting
+
+You can sort the groups in each topic individually with the following
+commands:
+
+
+@table @kbd
+@item T S a
+@kindex T S a (Topic)
+@findex gnus-topic-sort-groups-by-alphabet
+Sort the current topic alphabetically by group name
+(@code{gnus-topic-sort-groups-by-alphabet}).
+
+@item T S u
+@kindex T S u (Topic)
+@findex gnus-topic-sort-groups-by-unread
+Sort the current topic by the number of unread articles
+(@code{gnus-topic-sort-groups-by-unread}).
+
+@item T S l
+@kindex T S l (Topic)
+@findex gnus-topic-sort-groups-by-level
+Sort the current topic by group level
+(@code{gnus-topic-sort-groups-by-level}).
+
+@item T S v
+@kindex T S v (Topic)
+@findex gnus-topic-sort-groups-by-score
+Sort the current topic by group score
+(@code{gnus-topic-sort-groups-by-score}).  @xref{Group Score}.
+
+@item T S r
+@kindex T S r (Topic)
+@findex gnus-topic-sort-groups-by-rank
+Sort the current topic by group rank
+(@code{gnus-topic-sort-groups-by-rank}).  @xref{Group Score}.
+
+@item T S m
+@kindex T S m (Topic)
+@findex gnus-topic-sort-groups-by-method
+Sort the current topic alphabetically by back end name
+(@code{gnus-topic-sort-groups-by-method}).
+
+@item T S e
+@kindex T S e (Topic)
+@findex gnus-topic-sort-groups-by-server
+Sort the current topic alphabetically by server name
+(@code{gnus-topic-sort-groups-by-server}).
+
+@item T S s
+@kindex T S s (Topic)
+@findex gnus-topic-sort-groups
+Sort the current topic according to the function(s) given by the
+@code{gnus-group-sort-function} variable
+(@code{gnus-topic-sort-groups}).
+
+@end table
+
+When given a prefix argument, all these commands will sort in reverse
+order.  @xref{Sorting Groups}, for more information about group
+sorting.
+
+
+@node Topic Topology
+@subsection Topic Topology
+@cindex topic topology
+@cindex topology
+
+So, let's have a look at an example group buffer:
+
+@example
+@group
+Gnus
+  Emacs -- I wuw it!
+     3: comp.emacs
+     2: alt.religion.emacs
+    Naughty Emacs
+     452: alt.sex.emacs
+       0: comp.talk.emacs.recovery
+  Misc
+     8: comp.binaries.fractals
+    13: comp.sources.unix
+@end group
+@end example
+
+So, here we have one top-level topic (@samp{Gnus}), two topics under
+that, and one sub-topic under one of the sub-topics.  (There is always
+just one (1) top-level topic).  This topology can be expressed as
+follows:
+
+@lisp
+(("Gnus" visible)
+ (("Emacs -- I wuw it!" visible)
+  (("Naughty Emacs" visible)))
+ (("Misc" visible)))
+@end lisp
+
+@vindex gnus-topic-topology
+This is in fact how the variable @code{gnus-topic-topology} would look
+for the display above.  That variable is saved in the @file{.newsrc.eld}
+file, and shouldn't be messed with manually---unless you really want
+to.  Since this variable is read from the @file{.newsrc.eld} file,
+setting it in any other startup files will have no effect.
+
+This topology shows what topics are sub-topics of what topics (right),
+and which topics are visible.  Two settings are currently
+allowed---@code{visible} and @code{invisible}.
+
+
+@node Topic Parameters
+@subsection Topic Parameters
+@cindex topic parameters
+
+All groups in a topic will inherit group parameters from the parent
+(and ancestor) topic parameters.  All valid group parameters are valid
+topic parameters (@pxref{Group Parameters}).  When the agent is
+enabled, all agent parameters (See Agent Parameters in @ref{Category
+Syntax}) are also valid topic parameters.
+
+In addition, the following parameters are only valid as topic
+parameters:
+
+@table @code
+@item subscribe
+When subscribing new groups by topic (@pxref{Subscription Methods}), the
+@code{subscribe} topic parameter says what groups go in what topic.  Its
+value should be a regexp to match the groups that should go in that
+topic.
+
+@item subscribe-level
+When subscribing new groups by topic (see the @code{subscribe} parameter),
+the group will be subscribed with the level specified in the
+@code{subscribe-level} instead of @code{gnus-level-default-subscribed}.
+
+@end table
+
+Group parameters (of course) override topic parameters, and topic
+parameters in sub-topics override topic parameters in super-topics.  You
+know.  Normal inheritance rules.  (@dfn{Rules} is here a noun, not a
+verb, although you may feel free to disagree with me here.)
+
+@example
+@group
+Gnus
+  Emacs
+     3: comp.emacs
+     2: alt.religion.emacs
+   452: alt.sex.emacs
+    Relief
+     452: alt.sex.emacs
+       0: comp.talk.emacs.recovery
+  Misc
+     8: comp.binaries.fractals
+    13: comp.sources.unix
+   452: alt.sex.emacs
+@end group
+@end example
+
+The @samp{Emacs} topic has the topic parameter @code{(score-file
+. "emacs.SCORE")}; the @samp{Relief} topic has the topic parameter
+@code{(score-file . "relief.SCORE")}; and the @samp{Misc} topic has the
+topic parameter @code{(score-file . "emacs.SCORE")}.  In addition,
+@* @samp{alt.religion.emacs} has the group parameter @code{(score-file
+. "religion.SCORE")}.
+
+Now, when you enter @samp{alt.sex.emacs} in the @samp{Relief} topic, you
+will get the @file{relief.SCORE} home score file.  If you enter the same
+group in the @samp{Emacs} topic, you'll get the @file{emacs.SCORE} home
+score file.  If you enter the group @samp{alt.religion.emacs}, you'll
+get the @file{religion.SCORE} home score file.
+
+This seems rather simple and self-evident, doesn't it?  Well, yes.  But
+there are some problems, especially with the @code{total-expiry}
+parameter.  Say you have a mail group in two topics; one with
+@code{total-expiry} and one without.  What happens when you do @kbd{M-x
+gnus-expire-all-expirable-groups}?  Gnus has no way of telling which one
+of these topics you mean to expire articles from, so anything may
+happen.  In fact, I hereby declare that it is @dfn{undefined} what
+happens.  You just have to be careful if you do stuff like that.
+
+
+@node Misc Group Stuff
+@section Misc Group Stuff
+
+@menu
+* Scanning New Messages::       Asking Gnus to see whether new messages have arrived.
+* Group Information::           Information and help on groups and Gnus.
+* Group Timestamp::             Making Gnus keep track of when you last read a group.
+* File Commands::               Reading and writing the Gnus files.
+* Sieve Commands::              Managing Sieve scripts.
+@end menu
+
+@table @kbd
+
+@item v
+@kindex v (Group)
+@cindex keys, reserved for users (Group)
+The key @kbd{v} is reserved for users.  You can bind it to some
+command or better use it as a prefix key.  For example:
+
+@lisp
+(define-key gnus-group-mode-map (kbd "v j d")
+  (lambda ()
+    (interactive)
+    (gnus-group-jump-to-group "nndraft:drafts")))
+@end lisp
+
+On keys reserved for users in Emacs and on keybindings in general
+@xref{Keymaps, Keymaps, , emacs, The Emacs Editor}.
+
+@item ^
+@kindex ^ (Group)
+@findex gnus-group-enter-server-mode
+Enter the server buffer (@code{gnus-group-enter-server-mode}).
+@xref{Server Buffer}.
+
+@item a
+@kindex a (Group)
+@findex gnus-group-post-news
+Start composing a message (a news by default)
+(@code{gnus-group-post-news}).  If given a prefix, post to the group
+under the point.  If the prefix is 1, prompt for a group to post to.
+Contrary to what the name of this function suggests, the prepared
+article might be a mail instead of a news, if a mail group is specified
+with the prefix argument.  @xref{Composing Messages}.
+
+@item m
+@kindex m (Group)
+@findex gnus-group-mail
+Mail a message somewhere (@code{gnus-group-mail}).  If given a prefix,
+use the posting style of the group under the point.  If the prefix is 1,
+prompt for a group name to find the posting style.
+@xref{Composing Messages}.
+
+@item i
+@kindex i (Group)
+@findex gnus-group-news
+Start composing a news (@code{gnus-group-news}).  If given a prefix,
+post to the group under the point.  If the prefix is 1, prompt
+for group to post to.  @xref{Composing Messages}.
+
+This function actually prepares a news even when using mail groups.
+This is useful for ``posting'' messages to mail groups without actually
+sending them over the network: they're just saved directly to the group
+in question.  The corresponding back end must have a request-post method
+for this to work though.
+
+@end table
+
+Variables for the group buffer:
+
+@table @code
+
+@item gnus-group-mode-hook
+@vindex gnus-group-mode-hook
+is called after the group buffer has been
+created.
+
+@item gnus-group-prepare-hook
+@vindex gnus-group-prepare-hook
+is called after the group buffer is
+generated.  It may be used to modify the buffer in some strange,
+unnatural way.
+
+@item gnus-group-prepared-hook
+@vindex gnus-group-prepare-hook
+is called as the very last thing after the group buffer has been
+generated.  It may be used to move point around, for instance.
+
+@item gnus-permanently-visible-groups
+@vindex gnus-permanently-visible-groups
+Groups matching this regexp will always be listed in the group buffer,
+whether they are empty or not.
+
+@item gnus-group-name-charset-method-alist
+@vindex gnus-group-name-charset-method-alist
+An alist of method and the charset for group names.  It is used to show
+non-@acronym{ASCII} group names.
+
+For example:
+@lisp
+(setq gnus-group-name-charset-method-alist
+    '(((nntp "news.com.cn") . cn-gb-2312)))
+@end lisp
+
+@item gnus-group-name-charset-group-alist
+@cindex UTF-8 group names
+@vindex gnus-group-name-charset-group-alist
+An alist of regexp of group name and the charset for group names.  It
+is used to show non-@acronym{ASCII} group names.  @code{((".*"
+utf-8))} is the default value if UTF-8 is supported, otherwise the
+default is @code{nil}.
+
+For example:
+@lisp
+(setq gnus-group-name-charset-group-alist
+    '(("\\.com\\.cn:" . cn-gb-2312)))
+@end lisp
+
+@end table
+
+@node Scanning New Messages
+@subsection Scanning New Messages
+@cindex new messages
+@cindex scanning new news
+
+@table @kbd
+
+@item g
+@kindex g (Group)
+@findex gnus-group-get-new-news
+@c @icon{gnus-group-get-new-news}
+Check the server(s) for new articles.  If the numerical prefix is used,
+this command will check only groups of level @var{arg} and lower
+(@code{gnus-group-get-new-news}).  If given a non-numerical prefix, this
+command will force a total re-reading of the active file(s) from the
+back end(s).
+
+@item M-g
+@kindex M-g (Group)
+@findex gnus-group-get-new-news-this-group
+@vindex gnus-goto-next-group-when-activating
+@c @icon{gnus-group-get-new-news-this-group}
+Check whether new articles have arrived in the current group
+(@code{gnus-group-get-new-news-this-group}).
+@code{gnus-goto-next-group-when-activating} says whether this command is
+to move point to the next group or not.  It is @code{t} by default.
+
+@findex gnus-activate-all-groups
+@cindex activating groups
+@item C-c M-g
+@kindex C-c M-g (Group)
+Activate absolutely all groups (@code{gnus-activate-all-groups}).
+
+@item R
+@kindex R (Group)
+@cindex restarting
+@findex gnus-group-restart
+Restart Gnus (@code{gnus-group-restart}).  This saves the @file{.newsrc}
+file(s), closes the connection to all servers, clears up all run-time
+Gnus variables, and then starts Gnus all over again.
+
+@end table
+
+@vindex gnus-get-new-news-hook
+@code{gnus-get-new-news-hook} is run just before checking for new news.
+
+@vindex gnus-after-getting-new-news-hook
+@code{gnus-after-getting-new-news-hook} is run after checking for new
+news.
+
+
+@node Group Information
+@subsection Group Information
+@cindex group information
+@cindex information on groups
+
+@table @kbd
+
+
+@item H f
+@kindex H f (Group)
+@findex gnus-group-fetch-faq
+@vindex gnus-group-faq-directory
+@cindex FAQ
+@cindex ange-ftp
+Try to fetch the @acronym{FAQ} for the current group
+(@code{gnus-group-fetch-faq}).  Gnus will try to get the @acronym{FAQ}
+from @code{gnus-group-faq-directory}, which is usually a directory on
+a remote machine.  This variable can also be a list of directories.
+In that case, giving a prefix to this command will allow you to choose
+between the various sites.  @code{ange-ftp} (or @code{efs}) will be
+used for fetching the file.
+
+If fetching from the first site is unsuccessful, Gnus will attempt to go
+through @code{gnus-group-faq-directory} and try to open them one by one.
+
+@item H c
+@kindex H c (Group)
+@findex gnus-group-fetch-charter
+@vindex gnus-group-charter-alist
+@cindex charter
+Try to open the charter for the current group in a web browser
+(@code{gnus-group-fetch-charter}).  Query for a group if given a
+prefix argument.
+
+Gnus will use @code{gnus-group-charter-alist} to find the location of
+the charter.  If no location is known, Gnus will fetch the control
+messages for the group, which in some cases includes the charter.
+
+@item H C
+@kindex H C (Group)
+@findex gnus-group-fetch-control
+@vindex gnus-group-fetch-control-use-browse-url
+@cindex control message
+Fetch the control messages for the group from the archive at
+@code{ftp.isc.org} (@code{gnus-group-fetch-control}).  Query for a
+group if given a prefix argument.
+
+If @code{gnus-group-fetch-control-use-browse-url} is non-@code{nil},
+Gnus will open the control messages in a browser using
+@code{browse-url}.  Otherwise they are fetched using @code{ange-ftp}
+and displayed in an ephemeral group.
+
+Note that the control messages are compressed.  To use this command
+you need to turn on @code{auto-compression-mode} (@pxref{Compressed
+Files, ,Compressed Files, emacs, The Emacs Manual}).
+
+@item H d
+@itemx C-c C-d
+@c @icon{gnus-group-describe-group}
+@kindex H d (Group)
+@kindex C-c C-d (Group)
+@cindex describing groups
+@cindex group description
+@findex gnus-group-describe-group
+Describe the current group (@code{gnus-group-describe-group}).  If given
+a prefix, force Gnus to re-read the description from the server.
+
+@item M-d
+@kindex M-d (Group)
+@findex gnus-group-describe-all-groups
+Describe all groups (@code{gnus-group-describe-all-groups}).  If given a
+prefix, force Gnus to re-read the description file from the server.
+
+@item H v
+@itemx V
+@kindex V (Group)
+@kindex H v (Group)
+@cindex version
+@findex gnus-version
+Display current Gnus version numbers (@code{gnus-version}).
+
+@item ?
+@kindex ? (Group)
+@findex gnus-group-describe-briefly
+Give a very short help message (@code{gnus-group-describe-briefly}).
+
+@item C-c C-i
+@kindex C-c C-i (Group)
+@cindex info
+@cindex manual
+@findex gnus-info-find-node
+Go to the Gnus info node (@code{gnus-info-find-node}).
+@end table
+
+
+@node Group Timestamp
+@subsection Group Timestamp
+@cindex timestamps
+@cindex group timestamps
+
+It can be convenient to let Gnus keep track of when you last read a
+group.  To set the ball rolling, you should add
+@code{gnus-group-set-timestamp} to @code{gnus-select-group-hook}:
+
+@lisp
+(add-hook 'gnus-select-group-hook 'gnus-group-set-timestamp)
+@end lisp
+
+After doing this, each time you enter a group, it'll be recorded.
+
+This information can be displayed in various ways---the easiest is to
+use the @samp{%d} spec in the group line format:
+
+@lisp
+(setq gnus-group-line-format
+      "%M\%S\%p\%P\%5y: %(%-40,40g%) %d\n")
+@end lisp
+
+This will result in lines looking like:
+
+@example
+*        0: mail.ding                                19961002T012943
+         0: custom                                   19961002T012713
+@end example
+
+As you can see, the date is displayed in compact ISO 8601 format.  This
+may be a bit too much, so to just display the date, you could say
+something like:
+
+@lisp
+(setq gnus-group-line-format
+      "%M\%S\%p\%P\%5y: %(%-40,40g%) %6,6~(cut 2)d\n")
+@end lisp
+
+If you would like greater control of the time format, you can use a
+user-defined format spec.  Something like the following should do the
+trick:
+
+@lisp
+(setq gnus-group-line-format
+      "%M\%S\%p\%P\%5y: %(%-40,40g%) %ud\n")
+(defun gnus-user-format-function-d (headers)
+  (let ((time (gnus-group-timestamp gnus-tmp-group)))
+    (if time
+        (format-time-string "%b %d  %H:%M" time)
+      "")))
+@end lisp
+
+
+@node File Commands
+@subsection File Commands
+@cindex file commands
+
+@table @kbd
+
+@item r
+@kindex r (Group)
+@findex gnus-group-read-init-file
+@vindex gnus-init-file
+@cindex reading init file
+Re-read the init file (@code{gnus-init-file}, which defaults to
+@file{~/.gnus.el}) (@code{gnus-group-read-init-file}).
+
+@item s
+@kindex s (Group)
+@findex gnus-group-save-newsrc
+@cindex saving .newsrc
+Save the @file{.newsrc.eld} file (and @file{.newsrc} if wanted)
+(@code{gnus-group-save-newsrc}).  If given a prefix, force saving the
+file(s) whether Gnus thinks it is necessary or not.
+
+@c @item Z
+@c @kindex Z (Group)
+@c @findex gnus-group-clear-dribble
+@c Clear the dribble buffer (@code{gnus-group-clear-dribble}).
+
+@end table
+
+
+@node Sieve Commands
+@subsection Sieve Commands
+@cindex group sieve commands
+
+Sieve is a server-side mail filtering language.  In Gnus you can use
+the @code{sieve} group parameter (@pxref{Group Parameters}) to specify
+sieve rules that should apply to each group.  Gnus provides two
+commands to translate all these group parameters into a proper Sieve
+script that can be transfered to the server somehow.
+
+@vindex gnus-sieve-file
+@vindex gnus-sieve-region-start
+@vindex gnus-sieve-region-end
+The generated Sieve script is placed in @code{gnus-sieve-file} (by
+default @file{~/.sieve}).  The Sieve code that Gnus generate is placed
+between two delimiters, @code{gnus-sieve-region-start} and
+@code{gnus-sieve-region-end}, so you may write additional Sieve code
+outside these delimiters that will not be removed the next time you
+regenerate the Sieve script.
+
+@vindex gnus-sieve-crosspost
+The variable @code{gnus-sieve-crosspost} controls how the Sieve script
+is generated.  If it is non-@code{nil} (the default) articles is
+placed in all groups that have matching rules, otherwise the article
+is only placed in the group with the first matching rule.  For
+example, the group parameter @samp{(sieve address "sender"
+"owner-ding@@hpc.uh.edu")} will generate the following piece of Sieve
+code if @code{gnus-sieve-crosspost} is @code{nil}.  (When
+@code{gnus-sieve-crosspost} is non-@code{nil}, it looks the same
+except that the line containing the call to @code{stop} is removed.)
+
+@example
+if address "sender" "owner-ding@@hpc.uh.edu" @{
+        fileinto "INBOX.ding";
+        stop;
+@}
+@end example
+
+@xref{Top, Emacs Sieve, Top, sieve, Emacs Sieve}.
+
+@table @kbd
+
+@item D g
+@kindex D g (Group)
+@findex gnus-sieve-generate
+@vindex gnus-sieve-file
+@cindex generating sieve script
+Regenerate a Sieve script from the @code{sieve} group parameters and
+put you into the @code{gnus-sieve-file} without saving it.
+
+@item D u
+@kindex D u (Group)
+@findex gnus-sieve-update
+@vindex gnus-sieve-file
+@cindex updating sieve script
+Regenerates the Gnus managed part of @code{gnus-sieve-file} using the
+@code{sieve} group parameters, save the file and upload it to the
+server using the @code{sieveshell} program.
+
+@end table
+
+
+@node Summary Buffer
+@chapter Summary Buffer
+@cindex summary buffer
+
+A line for each article is displayed in the summary buffer.  You can
+move around, read articles, post articles and reply to articles.
+
+The most common way to a summary buffer is to select a group from the
+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 RET gnus-summary-tool-bar}.  This feature is only
+available in Emacs.
+
+@kindex v (Summary)
+@cindex keys, reserved for users (Summary)
+The key @kbd{v} is reserved for users.  You can bind it to some
+command or better use it as a prefix key.  For example:
+@lisp
+(define-key gnus-summary-mode-map (kbd "v -") "LrS") ;; lower subthread
+@end lisp
+
+@menu
+* Summary Buffer Format::       Deciding how the summary buffer is to look.
+* Summary Maneuvering::         Moving around the summary buffer.
+* Choosing Articles::           Reading articles.
+* Paging the Article::          Scrolling the current article.
+* Reply Followup and Post::     Posting articles.
+* Delayed Articles::            Send articles at a later time.
+* Marking Articles::            Marking articles as read, expirable, etc.
+* Limiting::                    You can limit the summary buffer.
+* Threading::                   How threads are made.
+* Sorting the Summary Buffer::  How articles and threads are sorted.
+* Asynchronous Fetching::       Gnus might be able to pre-fetch articles.
+* Article Caching::             You may store articles in a cache.
+* Persistent Articles::         Making articles expiry-resistant.
+* Article Backlog::             Having already read articles hang around.
+* Saving Articles::             Ways of customizing article saving.
+* Decoding Articles::           Gnus can treat series of (uu)encoded articles.
+* Article Treatment::           The article buffer can be mangled at will.
+* MIME Commands::               Doing MIMEy things with the articles.
+* Charsets::                    Character set issues.
+* Article Commands::            Doing various things with the article buffer.
+* Summary Sorting::             Sorting the summary buffer in various ways.
+* Finding the Parent::          No child support? Get the parent.
+* Alternative Approaches::      Reading using non-default summaries.
+* Tree Display::                A more visual display of threads.
+* Mail Group Commands::         Some commands can only be used in mail groups.
+* Various Summary Stuff::       What didn't fit anywhere else.
+* Exiting the Summary Buffer::  Returning to the Group buffer,
+                                or reselecting the current group.
+* Crosspost Handling::          How crossposted articles are dealt with.
+* Duplicate Suppression::       An alternative when crosspost handling fails.
+* Security::                    Decrypt and Verify.
+* Mailing List::                Mailing list minor mode.
+@end menu
+
+
+@node Summary Buffer Format
+@section Summary Buffer Format
+@cindex summary buffer format
+
+@iftex
+@iflatex
+\gnusfigure{The Summary Buffer}{180}{
+\put(0,0){\epsfig{figure=ps/summary,width=7.5cm}}
+\put(445,0){\makebox(0,0)[br]{\epsfig{figure=ps/summary-article,width=7.5cm}}}
+}
+@end iflatex
+@end iftex
+
+@menu
+* Summary Buffer Lines::        You can specify how summary lines should look.
+* To From Newsgroups::          How to not display your own name.
+* Summary Buffer Mode Line::    You can say how the mode line should look.
+* Summary Highlighting::        Making the summary buffer all pretty and nice.
+@end menu
+
+@findex mail-extract-address-components
+@findex gnus-extract-address-components
+@vindex gnus-extract-address-components
+Gnus will use the value of the @code{gnus-extract-address-components}
+variable as a function for getting the name and address parts of a
+@code{From} header.  Two pre-defined functions exist:
+@code{gnus-extract-address-components}, which is the default, quite
+fast, and too simplistic solution; and
+@code{mail-extract-address-components}, which works very nicely, but is
+slower.  The default function will return the wrong answer in 5% of the
+cases.  If this is unacceptable to you, use the other function instead:
+
+@lisp
+(setq gnus-extract-address-components
+      'mail-extract-address-components)
+@end lisp
+
+@vindex gnus-summary-same-subject
+@code{gnus-summary-same-subject} is a string indicating that the current
+article has the same subject as the previous.  This string will be used
+with those specs that require it.  The default is @code{""}.
+
+
+@node Summary Buffer Lines
+@subsection Summary Buffer Lines
+
+@vindex gnus-summary-line-format
+You can change the format of the lines in the summary buffer by changing
+the @code{gnus-summary-line-format} variable.  It works along the same
+lines as a normal @code{format} string, with some extensions
+(@pxref{Formatting Variables}).
+
+There should always be a colon or a point position marker on the line;
+the cursor always moves to the point position marker or the colon after
+performing an operation.  (Of course, Gnus wouldn't be Gnus if it wasn't
+possible to change this.  Just write a new function
+@code{gnus-goto-colon} which does whatever you like with the cursor.)
+@xref{Positioning Point}.
+
+The default string is @samp{%U%R%z%I%(%[%4L: %-23,23f%]%) %s\n}.
+
+The following format specification characters and extended format
+specification(s) are understood:
+
+@table @samp
+@item N
+Article number.
+@item S
+Subject string.  List identifiers stripped,
+@code{gnus-list-identifiers}.  @xref{Article Hiding}.
+@item s
+Subject if the article is the root of the thread or the previous article
+had a different subject, @code{gnus-summary-same-subject} otherwise.
+(@code{gnus-summary-same-subject} defaults to @code{""}.)
+@item F
+Full @code{From} header.
+@item n
+The name (from the @code{From} header).
+@item f
+The name, @code{To} header or the @code{Newsgroups} header (@pxref{To
+From Newsgroups}).
+@item a
+The name (from the @code{From} header).  This differs from the @code{n}
+spec in that it uses the function designated by the
+@code{gnus-extract-address-components} variable, which is slower, but
+may be more thorough.
+@item A
+The address (from the @code{From} header).  This works the same way as
+the @code{a} spec.
+@item L
+Number of lines in the article.
+@item c
+Number of characters in the article.  This specifier is not supported
+in some methods (like nnfolder).
+@item k
+Pretty-printed version of the number of characters in the article;
+for example, @samp{1.2k} or @samp{0.4M}.
+@item I
+Indentation based on thread level (@pxref{Customizing Threading}).
+@item B
+A complex trn-style thread tree, showing response-connecting trace
+lines.  A thread could be drawn like this:
+
+@example
+>
++->
+| +->
+| | \->
+| |   \->
+| \->
++->
+\->
+@end example
+
+You can customize the appearance with the following options.  Note
+that it is possible to make the thread display look really neat by
+replacing the default @acronym{ASCII} characters with graphic
+line-drawing glyphs.
+@table @code
+@item gnus-sum-thread-tree-root
+@vindex gnus-sum-thread-tree-root
+Used for the root of a thread.  If @code{nil}, use subject
+instead.  The default is @samp{> }.
+
+@item gnus-sum-thread-tree-false-root
+@vindex gnus-sum-thread-tree-false-root
+Used for the false root of a thread (@pxref{Loose Threads}).  If
+@code{nil}, use subject instead.  The default is @samp{> }.
+
+@item gnus-sum-thread-tree-single-indent
+@vindex gnus-sum-thread-tree-single-indent
+Used for a thread with just one message.  If @code{nil}, use subject
+instead.  The default is @samp{}.
+
+@item gnus-sum-thread-tree-vertical
+@vindex gnus-sum-thread-tree-vertical
+Used for drawing a vertical line.  The default is @samp{| }.
+
+@item gnus-sum-thread-tree-indent
+@vindex gnus-sum-thread-tree-indent
+Used for indenting.  The default is @samp{  }.
+
+@item gnus-sum-thread-tree-leaf-with-other
+@vindex gnus-sum-thread-tree-leaf-with-other
+Used for a leaf with brothers.  The default is @samp{+-> }.
+
+@item gnus-sum-thread-tree-single-leaf
+@vindex gnus-sum-thread-tree-single-leaf
+Used for a leaf without brothers.  The default is @samp{\-> }
+
+@end table
+
+@item T
+Nothing if the article is a root and lots of spaces if it isn't (it
+pushes everything after it off the screen).
+@item [
+Opening bracket, which is normally @samp{[}, but can also be @samp{<}
+for adopted articles (@pxref{Customizing Threading}).
+@item ]
+Closing bracket, which is normally @samp{]}, but can also be @samp{>}
+for adopted articles.
+@item >
+One space for each thread level.
+@item <
+Twenty minus thread level spaces.
+@item U
+Unread.  @xref{Read Articles}.
+
+@item R
+This misleadingly named specifier is the @dfn{secondary mark}.  This
+mark will say whether the article has been replied to, has been cached,
+or has been saved.  @xref{Other Marks}.
+
+@item i
+Score as a number (@pxref{Scoring}).
+@item z
+@vindex gnus-summary-zcore-fuzz
+Zcore, @samp{+} if above the default level and @samp{-} if below the
+default level.  If the difference between
+@code{gnus-summary-default-score} and the score is less than
+@code{gnus-summary-zcore-fuzz}, this spec will not be used.
+@item V
+Total thread score.
+@item x
+@code{Xref}.
+@item D
+@code{Date}.
+@item d
+The @code{Date} in @code{DD-MMM} format.
+@item o
+The @code{Date} in @var{YYYYMMDD}@code{T}@var{HHMMSS} format.
+@item M
+@code{Message-ID}.
+@item r
+@code{References}.
+@item t
+Number of articles in the current sub-thread.  Using this spec will slow
+down summary buffer generation somewhat.
+@item e
+An @samp{=} (@code{gnus-not-empty-thread-mark}) will be displayed if the
+article has any children.
+@item P
+The line number.
+@item O
+Download mark.
+@item *
+Desired cursor position (instead of after first colon).
+@item &user-date;
+Age sensitive date format.  Various date format is defined in
+@code{gnus-user-date-format-alist}.
+@item u
+User defined specifier.  The next character in the format string should
+be a letter.  Gnus will call the function
+@code{gnus-user-format-function-@var{x}}, where @var{x} is the letter
+following @samp{%u}.  The function will be passed the current header as
+argument.  The function should return a string, which will be inserted
+into the summary just like information from any other summary specifier.
+@end table
+
+Text between @samp{%(} and @samp{%)} will be highlighted with
+@code{gnus-mouse-face} when the mouse point is placed inside the area.
+There can only be one such area.
+
+The @samp{%U} (status), @samp{%R} (replied) and @samp{%z} (zcore) specs
+have to be handled with care.  For reasons of efficiency, Gnus will
+compute what column these characters will end up in, and ``hard-code''
+that.  This means that it is invalid to have these specs after a
+variable-length spec.  Well, you might not be arrested, but your summary
+buffer will look strange, which is bad enough.
+
+The smart choice is to have these specs as far to the left as possible.
+(Isn't that the case with everything, though?  But I digress.)
+
+This restriction may disappear in later versions of Gnus.
+
+
+@node To From Newsgroups
+@subsection To From Newsgroups
+@cindex To
+@cindex Newsgroups
+
+In some groups (particularly in archive groups), the @code{From} header
+isn't very interesting, since all the articles there are written by
+you.  To display the information in the @code{To} or @code{Newsgroups}
+headers instead, you need to decide three things: What information to
+gather; where to display it; and when to display it.
+
+@enumerate
+@item
+@vindex gnus-extra-headers
+The reading of extra header information is controlled by the
+@code{gnus-extra-headers}.  This is a list of header symbols.  For
+instance:
+
+@lisp
+(setq gnus-extra-headers
+      '(To Newsgroups X-Newsreader))
+@end lisp
+
+This will result in Gnus trying to obtain these three headers, and
+storing it in header structures for later easy retrieval.
+
+@item
+@findex gnus-extra-header
+The value of these extra headers can be accessed via the
+@code{gnus-extra-header} function.  Here's a format line spec that will
+access the @code{X-Newsreader} header:
+
+@example
+"%~(form (gnus-extra-header 'X-Newsreader))@@"
+@end example
+
+@item
+@vindex gnus-ignored-from-addresses
+The @code{gnus-ignored-from-addresses} variable says when the @samp{%f}
+summary line spec returns the @code{To}, @code{Newsreader} or
+@code{From} header.  If this regexp matches the contents of the
+@code{From} header, the value of the @code{To} or @code{Newsreader}
+headers are used instead.
+
+@end enumerate
+
+@vindex nnmail-extra-headers
+A related variable is @code{nnmail-extra-headers}, which controls when
+to include extra headers when generating overview (@acronym{NOV}) files.
+If you have old overview files, you should regenerate them after
+changing this variable, by entering the server buffer using @kbd{^},
+and then @kbd{g} on the appropriate mail server (e.g. nnml) to cause
+regeneration.
+
+@vindex gnus-summary-line-format
+You also have to instruct Gnus to display the data by changing the
+@code{%n} spec to the @code{%f} spec in the
+@code{gnus-summary-line-format} variable.
+
+In summary, you'd typically put something like the following in
+@file{~/.gnus.el}:
+
+@lisp
+(setq gnus-extra-headers
+      '(To Newsgroups))
+(setq nnmail-extra-headers gnus-extra-headers)
+(setq gnus-summary-line-format
+      "%U%R%z%I%(%[%4L: %-23,23f%]%) %s\n")
+(setq gnus-ignored-from-addresses
+      "Your Name Here")
+@end lisp
+
+(The values listed above are the default values in Gnus.  Alter them
+to fit your needs.)
+
+A note for news server administrators, or for users who wish to try to
+convince their news server administrator to provide some additional
+support:
+
+The above is mostly useful for mail groups, where you have control over
+the @acronym{NOV} files that are created.  However, if you can persuade your
+nntp admin to add (in the usual implementation, notably INN):
+
+@example
+Newsgroups:full
+@end example
+
+to the end of her @file{overview.fmt} file, then you can use that just
+as you would the extra headers from the mail groups.
+
+
+@node Summary Buffer Mode Line
+@subsection Summary Buffer Mode Line
+
+@vindex gnus-summary-mode-line-format
+You can also change the format of the summary mode bar (@pxref{Mode Line
+Formatting}).  Set @code{gnus-summary-mode-line-format} to whatever you
+like.  The default is @samp{Gnus: %%b [%A] %Z}.
+
+Here are the elements you can play with:
+
+@table @samp
+@item G
+Group name.
+@item p
+Unprefixed group name.
+@item A
+Current article number.
+@item z
+Current article score.
+@item V
+Gnus version.
+@item U
+Number of unread articles in this group.
+@item e
+Number of unread articles in this group that aren't displayed in the
+summary buffer.
+@item Z
+A string with the number of unread and unselected articles represented
+either as @samp{<%U(+%e) more>} if there are both unread and unselected
+articles, and just as @samp{<%U more>} if there are just unread articles
+and no unselected ones.
+@item g
+Shortish group name.  For instance, @samp{rec.arts.anime} will be
+shortened to @samp{r.a.anime}.
+@item S
+Subject of the current article.
+@item u
+User-defined spec (@pxref{User-Defined Specs}).
+@item s
+Name of the current score file (@pxref{Scoring}).
+@item d
+Number of dormant articles (@pxref{Unread Articles}).
+@item t
+Number of ticked articles (@pxref{Unread Articles}).
+@item r
+Number of articles that have been marked as read in this session.
+@item E
+Number of articles expunged by the score files.
+@end table
+
+
+@node Summary Highlighting
+@subsection Summary Highlighting
+
+@table @code
+
+@item gnus-visual-mark-article-hook
+@vindex gnus-visual-mark-article-hook
+This hook is run after selecting an article.  It is meant to be used for
+highlighting the article in some way.  It is not run if
+@code{gnus-visual} is @code{nil}.
+
+@item gnus-summary-update-hook
+@vindex gnus-summary-update-hook
+This hook is called when a summary line is changed.  It is not run if
+@code{gnus-visual} is @code{nil}.
+
+@item gnus-summary-selected-face
+@vindex gnus-summary-selected-face
+This is the face (or @dfn{font} as some people call it) used to
+highlight the current article in the summary buffer.
+
+@item gnus-summary-highlight
+@vindex gnus-summary-highlight
+Summary lines are highlighted according to this variable, which is a
+list where the elements are of the format @code{(@var{form}
+. @var{face})}.  If you would, for instance, like ticked articles to be
+italic and high-scored articles to be bold, you could set this variable
+to something like
+@lisp
+(((eq mark gnus-ticked-mark) . italic)
+ ((> score default) . bold))
+@end lisp
+As you may have guessed, if @var{form} returns a non-@code{nil} value,
+@var{face} will be applied to the line.
+@end table
+
+
+@node Summary Maneuvering
+@section Summary Maneuvering
+@cindex summary movement
+
+All the straight movement commands understand the numeric prefix and
+behave pretty much as you'd expect.
+
+None of these commands select articles.
+
+@table @kbd
+@item G M-n
+@itemx M-n
+@kindex M-n (Summary)
+@kindex G M-n (Summary)
+@findex gnus-summary-next-unread-subject
+Go to the next summary line of an unread article
+(@code{gnus-summary-next-unread-subject}).
+
+@item G M-p
+@itemx M-p
+@kindex M-p (Summary)
+@kindex G M-p (Summary)
+@findex gnus-summary-prev-unread-subject
+Go to the previous summary line of an unread article
+(@code{gnus-summary-prev-unread-subject}).
+
+@item G g
+@kindex G g (Summary)
+@findex gnus-summary-goto-subject
+Ask for an article number and then go to the summary line of that article
+without displaying the article (@code{gnus-summary-goto-subject}).
+@end table
+
+If Gnus asks you to press a key to confirm going to the next group, you
+can use the @kbd{C-n} and @kbd{C-p} keys to move around the group
+buffer, searching for the next group to read without actually returning
+to the group buffer.
+
+Variables related to summary movement:
+
+@table @code
+
+@vindex gnus-auto-select-next
+@item gnus-auto-select-next
+If you issue one of the movement commands (like @kbd{n}) and there are
+no more unread articles after the current one, Gnus will offer to go to
+the next group.  If this variable is @code{t} and the next group is
+empty, Gnus will exit summary mode and return to the group buffer.  If
+this variable is neither @code{t} nor @code{nil}, Gnus will select the
+next group with unread articles.  As a special case, if this variable
+is @code{quietly}, Gnus will select the next group without asking for
+confirmation.  If this variable is @code{almost-quietly}, the same
+will happen only if you are located on the last article in the group.
+Finally, if this variable is @code{slightly-quietly}, the @kbd{Z n}
+command will go to the next group without confirmation.  Also
+@pxref{Group Levels}.
+
+@item gnus-auto-select-same
+@vindex gnus-auto-select-same
+If non-@code{nil}, all the movement commands will try to go to the next
+article with the same subject as the current.  (@dfn{Same} here might
+mean @dfn{roughly equal}.  See @code{gnus-summary-gather-subject-limit}
+for details (@pxref{Customizing Threading}).)  If there are no more
+articles with the same subject, go to the first unread article.
+
+This variable is not particularly useful if you use a threaded display.
+
+@item gnus-summary-check-current
+@vindex gnus-summary-check-current
+If non-@code{nil}, all the ``unread'' movement commands will not proceed
+to the next (or previous) article if the current article is unread.
+Instead, they will choose the current article.
+
+@item gnus-auto-center-summary
+@vindex gnus-auto-center-summary
+If non-@code{nil}, Gnus will keep the point in the summary buffer
+centered at all times.  This makes things quite tidy, but if you have a
+slow network connection, or simply do not like this un-Emacsism, you can
+set this variable to @code{nil} to get the normal Emacs scrolling
+action.  This will also inhibit horizontal re-centering of the summary
+buffer, which might make it more inconvenient to read extremely long
+threads.
+
+This variable can also be a number.  In that case, center the window at
+the given number of lines from the top.
+
+@end table
+
+
+@node Choosing Articles
+@section Choosing Articles
+@cindex selecting articles
+
+@menu
+* Choosing Commands::           Commands for choosing articles.
+* Choosing Variables::          Variables that influence these commands.
+@end menu
+
+
+@node Choosing Commands
+@subsection Choosing Commands
+
+None of the following movement commands understand the numeric prefix,
+and they all select and display an article.
+
+If you want to fetch new articles or redisplay the group, see
+@ref{Exiting the Summary Buffer}.
+
+@table @kbd
+@item SPACE
+@kindex SPACE (Summary)
+@findex gnus-summary-next-page
+Select the current article, or, if that one's read already, the next
+unread article (@code{gnus-summary-next-page}).
+
+If you have an article window open already and you press @kbd{SPACE}
+again, the article will be scrolled.  This lets you conveniently
+@kbd{SPACE} through an entire newsgroup.  @xref{Paging the Article}.
+
+@item G n
+@itemx n
+@kindex n (Summary)
+@kindex G n (Summary)
+@findex gnus-summary-next-unread-article
+@c @icon{gnus-summary-next-unread}
+Go to next unread article (@code{gnus-summary-next-unread-article}).
+
+@item G p
+@itemx p
+@kindex p (Summary)
+@findex gnus-summary-prev-unread-article
+@c @icon{gnus-summary-prev-unread}
+Go to previous unread article (@code{gnus-summary-prev-unread-article}).
+
+@item G N
+@itemx N
+@kindex N (Summary)
+@kindex G N (Summary)
+@findex gnus-summary-next-article
+Go to the next article (@code{gnus-summary-next-article}).
+
+@item G P
+@itemx P
+@kindex P (Summary)
+@kindex G P (Summary)
+@findex gnus-summary-prev-article
+Go to the previous article (@code{gnus-summary-prev-article}).
+
+@item G C-n
+@kindex G C-n (Summary)
+@findex gnus-summary-next-same-subject
+Go to the next article with the same subject
+(@code{gnus-summary-next-same-subject}).
+
+@item G C-p
+@kindex G C-p (Summary)
+@findex gnus-summary-prev-same-subject
+Go to the previous article with the same subject
+(@code{gnus-summary-prev-same-subject}).
+
+@item G f
+@itemx .
+@kindex G f  (Summary)
+@kindex .  (Summary)
+@findex gnus-summary-first-unread-article
+Go to the first unread article
+(@code{gnus-summary-first-unread-article}).
+
+@item G b
+@itemx ,
+@kindex G b (Summary)
+@kindex , (Summary)
+@findex gnus-summary-best-unread-article
+Go to the unread article with the highest score
+(@code{gnus-summary-best-unread-article}).  If given a prefix argument,
+go to the first unread article that has a score over the default score.
+
+@item G l
+@itemx l
+@kindex l (Summary)
+@kindex G l (Summary)
+@findex gnus-summary-goto-last-article
+Go to the previous article read (@code{gnus-summary-goto-last-article}).
+
+@item G o
+@kindex G o (Summary)
+@findex gnus-summary-pop-article
+@cindex history
+@cindex article history
+Pop an article off the summary history and go to this article
+(@code{gnus-summary-pop-article}).  This command differs from the
+command above in that you can pop as many previous articles off the
+history as you like, while @kbd{l} toggles the two last read articles.
+For a somewhat related issue (if you use these commands a lot),
+@pxref{Article Backlog}.
+
+@item G j
+@itemx j
+@kindex j (Summary)
+@kindex G j (Summary)
+@findex gnus-summary-goto-article
+Ask for an article number or @code{Message-ID}, and then go to that
+article (@code{gnus-summary-goto-article}).
+
+@end table
+
+
+@node Choosing Variables
+@subsection Choosing Variables
+
+Some variables relevant for moving and selecting articles:
+
+@table @code
+@item gnus-auto-extend-newsgroup
+@vindex gnus-auto-extend-newsgroup
+All the movement commands will try to go to the previous (or next)
+article, even if that article isn't displayed in the Summary buffer if
+this variable is non-@code{nil}.  Gnus will then fetch the article from
+the server and display it in the article buffer.
+
+@item gnus-select-article-hook
+@vindex gnus-select-article-hook
+This hook is called whenever an article is selected.  The default is
+@code{nil}.  If you would like each article to be saved in the Agent as
+you read it, putting @code{gnus-agent-fetch-selected-article} on this
+hook will do so.
+
+@item gnus-mark-article-hook
+@vindex gnus-mark-article-hook
+@findex gnus-summary-mark-unread-as-read
+@findex gnus-summary-mark-read-and-unread-as-read
+@findex gnus-unread-mark
+This hook is called whenever an article is selected.  It is intended to
+be used for marking articles as read.  The default value is
+@code{gnus-summary-mark-read-and-unread-as-read}, and will change the
+mark of almost any article you read to @code{gnus-read-mark}.  The only
+articles not affected by this function are ticked, dormant, and
+expirable articles.  If you'd instead like to just have unread articles
+marked as read, you can use @code{gnus-summary-mark-unread-as-read}
+instead.  It will leave marks like @code{gnus-low-score-mark},
+@code{gnus-del-mark} (and so on) alone.
+
+@end table
+
+
+@node Paging the Article
+@section Scrolling the Article
+@cindex article scrolling
+
+@table @kbd
+
+@item SPACE
+@kindex SPACE (Summary)
+@findex gnus-summary-next-page
+Pressing @kbd{SPACE} will scroll the current article forward one page,
+or, if you have come to the end of the current article, will choose the
+next article (@code{gnus-summary-next-page}).
+
+@vindex gnus-article-boring-faces
+@vindex gnus-article-skip-boring
+If @code{gnus-article-skip-boring} is non-@code{nil} and the rest of
+the article consists only of citations and signature, then it will be
+skipped; the next article will be shown instead.  You can customize
+what is considered uninteresting with
+@code{gnus-article-boring-faces}.  You can manually view the article's
+pages, no matter how boring, using @kbd{C-M-v}.
+
+@item DEL
+@kindex DEL (Summary)
+@findex gnus-summary-prev-page
+Scroll the current article back one page (@code{gnus-summary-prev-page}).
+
+@item RET
+@kindex RET (Summary)
+@findex gnus-summary-scroll-up
+Scroll the current article one line forward
+(@code{gnus-summary-scroll-up}).
+
+@item M-RET
+@kindex M-RET (Summary)
+@findex gnus-summary-scroll-down
+Scroll the current article one line backward
+(@code{gnus-summary-scroll-down}).
+
+@item A g
+@itemx g
+@kindex A g (Summary)
+@kindex g (Summary)
+@findex gnus-summary-show-article
+@vindex gnus-summary-show-article-charset-alist
+(Re)fetch the current article (@code{gnus-summary-show-article}).  If
+given a prefix, fetch the current article, but don't run any of the
+article treatment functions.  This will give you a ``raw'' article, just
+the way it came from the server.
+
+If given a numerical prefix, you can do semi-manual charset stuff.
+@kbd{C-u 0 g cn-gb-2312 RET} will decode the message as if it were
+encoded in the @code{cn-gb-2312} charset.  If you have
+
+@lisp
+(setq gnus-summary-show-article-charset-alist
+      '((1 . cn-gb-2312)
+        (2 . big5)))
+@end lisp
+
+then you can say @kbd{C-u 1 g} to get the same effect.
+
+@item A <
+@itemx <
+@kindex < (Summary)
+@kindex A < (Summary)
+@findex gnus-summary-beginning-of-article
+Scroll to the beginning of the article
+(@code{gnus-summary-beginning-of-article}).
+
+@item A >
+@itemx >
+@kindex > (Summary)
+@kindex A > (Summary)
+@findex gnus-summary-end-of-article
+Scroll to the end of the article (@code{gnus-summary-end-of-article}).
+
+@item A s
+@itemx s
+@kindex A s (Summary)
+@kindex s (Summary)
+@findex gnus-summary-isearch-article
+Perform an isearch in the article buffer
+(@code{gnus-summary-isearch-article}).
+
+@item h
+@kindex h (Summary)
+@findex gnus-summary-select-article-buffer
+Select the article buffer (@code{gnus-summary-select-article-buffer}).
+
+@end table
+
+
+@node Reply Followup and Post
+@section Reply, Followup and Post
+
+@menu
+* Summary Mail Commands::       Sending mail.
+* Summary Post Commands::       Sending news.
+* Summary Message Commands::    Other Message-related commands.
+* Canceling and Superseding::
+@end menu
+
+
+@node Summary Mail Commands
+@subsection Summary Mail Commands
+@cindex mail
+@cindex composing mail
+
+Commands for composing a mail message:
+
+@table @kbd
+
+@item S r
+@itemx r
+@kindex S r (Summary)
+@kindex r (Summary)
+@findex gnus-summary-reply
+@c @icon{gnus-summary-mail-reply}
+@c @icon{gnus-summary-reply}
+Mail a reply to the author of the current article
+(@code{gnus-summary-reply}).
+
+@item S R
+@itemx R
+@kindex R (Summary)
+@kindex S R (Summary)
+@findex gnus-summary-reply-with-original
+@c @icon{gnus-summary-reply-with-original}
+Mail a reply to the author of the current article and include the
+original message (@code{gnus-summary-reply-with-original}).  This
+command uses the process/prefix convention.
+
+@item S w
+@kindex S w (Summary)
+@findex gnus-summary-wide-reply
+Mail a wide reply to the author of the current article
+(@code{gnus-summary-wide-reply}).  A @dfn{wide reply} is a reply that
+goes out to all people listed in the @code{To}, @code{From} (or
+@code{Reply-to}) and @code{Cc} headers.  If @code{Mail-Followup-To} is
+present, that's used instead.
+
+@item S W
+@kindex S W (Summary)
+@findex gnus-summary-wide-reply-with-original
+Mail a wide reply to the current article and include the original
+message (@code{gnus-summary-wide-reply-with-original}).  This command uses
+the process/prefix convention.
+
+@item S v
+@kindex S v (Summary)
+@findex gnus-summary-very-wide-reply
+Mail a very wide reply to the author of the current article
+(@code{gnus-summary-wide-reply}).  A @dfn{very wide reply} is a reply
+that goes out to all people listed in the @code{To}, @code{From} (or
+@code{Reply-to}) and @code{Cc} headers in all the process/prefixed
+articles.  This command uses the process/prefix convention.
+
+@item S V
+@kindex S V (Summary)
+@findex gnus-summary-very-wide-reply-with-original
+Mail a very wide reply to the author of the current article and include the
+original message (@code{gnus-summary-very-wide-reply-with-original}).  This
+command uses the process/prefix convention.
+
+@item S B r
+@kindex S B r (Summary)
+@findex gnus-summary-reply-broken-reply-to
+Mail a reply to the author of the current article but ignore the
+@code{Reply-To} field (@code{gnus-summary-reply-broken-reply-to}).
+If you need this because a mailing list incorrectly sets a
+@code{Reply-To} header pointing to the list, you probably want to set
+the @code{broken-reply-to} group parameter instead, so things will work
+correctly.  @xref{Group Parameters}.
+
+@item S B R
+@kindex S B R (Summary)
+@findex gnus-summary-reply-broken-reply-to-with-original
+Mail a reply to the author of the current article and include the
+original message but ignore the @code{Reply-To} field
+(@code{gnus-summary-reply-broken-reply-to-with-original}).
+
+@item S o m
+@itemx C-c C-f
+@kindex S o m (Summary)
+@kindex C-c C-f (Summary)
+@findex gnus-summary-mail-forward
+@c @icon{gnus-summary-mail-forward}
+Forward the current article to some other person
+(@code{gnus-summary-mail-forward}).  If no prefix is given, the message
+is forwarded according to the value of (@code{message-forward-as-mime})
+and (@code{message-forward-show-mml}); if the prefix is 1, decode the
+message and forward directly inline; if the prefix is 2, forward message
+as an rfc822 @acronym{MIME} section; if the prefix is 3, decode message and
+forward as an rfc822 @acronym{MIME} section; if the prefix is 4, forward message
+directly inline; otherwise, the message is forwarded as no prefix given
+but use the flipped value of (@code{message-forward-as-mime}).  By
+default, the message is decoded and forwarded as an rfc822 @acronym{MIME}
+section.
+
+@item S m
+@itemx m
+@kindex m (Summary)
+@kindex S m (Summary)
+@findex gnus-summary-mail-other-window
+@c @icon{gnus-summary-mail-originate}
+Prepare a mail (@code{gnus-summary-mail-other-window}).  By default, use
+the posting style of the current group.  If given a prefix, disable that.
+If the prefix is 1, prompt for a group name to find the posting style.
+
+@item S i
+@itemx i
+@kindex i (Summary)
+@kindex S i (Summary)
+@findex gnus-summary-news-other-window
+Prepare a news (@code{gnus-summary-news-other-window}).  By default,
+post to the current group.  If given a prefix, disable that.  If the
+prefix is 1, prompt for a group to post to.
+
+This function actually prepares a news even when using mail groups.
+This is useful for ``posting'' messages to mail groups without actually
+sending them over the network: they're just saved directly to the group
+in question.  The corresponding back end must have a request-post method
+for this to work though.
+
+@item S D b
+@kindex S D b (Summary)
+@findex gnus-summary-resend-bounced-mail
+@cindex bouncing mail
+If you have sent a mail, but the mail was bounced back to you for some
+reason (wrong address, transient failure), you can use this command to
+resend that bounced mail (@code{gnus-summary-resend-bounced-mail}).  You
+will be popped into a mail buffer where you can edit the headers before
+sending the mail off again.  If you give a prefix to this command, and
+the bounced mail is a reply to some other mail, Gnus will try to fetch
+that mail and display it for easy perusal of its headers.  This might
+very well fail, though.
+
+@item S D r
+@kindex S D r (Summary)
+@findex gnus-summary-resend-message
+Not to be confused with the previous command,
+@code{gnus-summary-resend-message} will prompt you for an address to
+send the current message off to, and then send it to that place.  The
+headers of the message won't be altered---but lots of headers that say
+@code{Resent-To}, @code{Resent-From} and so on will be added.  This
+means that you actually send a mail to someone that has a @code{To}
+header that (probably) points to yourself.  This will confuse people.
+So, natcherly you'll only do that if you're really eVIl.
+
+This command is mainly used if you have several accounts and want to
+ship a mail to a different account of yours.  (If you're both
+@code{root} and @code{postmaster} and get a mail for @code{postmaster}
+to the @code{root} account, you may want to resend it to
+@code{postmaster}.  Ordnung muss sein!
+
+This command understands the process/prefix convention
+(@pxref{Process/Prefix}).
+
+@item S D e
+@kindex S D e (Summary)
+@findex gnus-summary-resend-message-edit
+
+Like the previous command, but will allow you to edit the message as
+if it were a new message before resending.
+
+@item S O m
+@kindex S O m (Summary)
+@findex gnus-uu-digest-mail-forward
+Digest the current series (@pxref{Decoding Articles}) and forward the
+result using mail (@code{gnus-uu-digest-mail-forward}).  This command
+uses the process/prefix convention (@pxref{Process/Prefix}).
+
+@item S M-c
+@kindex S M-c (Summary)
+@findex gnus-summary-mail-crosspost-complaint
+@cindex crossposting
+@cindex excessive crossposting
+Send a complaint about excessive crossposting to the author of the
+current article (@code{gnus-summary-mail-crosspost-complaint}).
+
+@findex gnus-crosspost-complaint
+This command is provided as a way to fight back against the current
+crossposting pandemic that's sweeping Usenet.  It will compose a reply
+using the @code{gnus-crosspost-complaint} variable as a preamble.  This
+command understands the process/prefix convention
+(@pxref{Process/Prefix}) and will prompt you before sending each mail.
+
+@end table
+
+Also @xref{Header Commands, ,Header Commands, message, The Message
+Manual}, for more information.
+
+
+@node Summary Post Commands
+@subsection Summary Post Commands
+@cindex post
+@cindex composing news
+
+Commands for posting a news article:
+
+@table @kbd
+@item S p
+@itemx a
+@kindex a (Summary)
+@kindex S p (Summary)
+@findex gnus-summary-post-news
+@c @icon{gnus-summary-post-news}
+Prepare for posting an article (@code{gnus-summary-post-news}).  By
+default, post to the current group.  If given a prefix, disable that.
+If the prefix is 1, prompt for another group instead.
+
+@item S f
+@itemx f
+@kindex f (Summary)
+@kindex S f (Summary)
+@findex gnus-summary-followup
+@c @icon{gnus-summary-followup}
+Post a followup to the current article (@code{gnus-summary-followup}).
+
+@item S F
+@itemx F
+@kindex S F (Summary)
+@kindex F (Summary)
+@c @icon{gnus-summary-followup-with-original}
+@findex gnus-summary-followup-with-original
+Post a followup to the current article and include the original message
+(@code{gnus-summary-followup-with-original}).  This command uses the
+process/prefix convention.
+
+@item S n
+@kindex S n (Summary)
+@findex gnus-summary-followup-to-mail
+Post a followup to the current article via news, even if you got the
+message through mail (@code{gnus-summary-followup-to-mail}).
+
+@item S N
+@kindex S N (Summary)
+@findex gnus-summary-followup-to-mail-with-original
+Post a followup to the current article via news, even if you got the
+message through mail and include the original message
+(@code{gnus-summary-followup-to-mail-with-original}).  This command uses
+the process/prefix convention.
+
+@item S o p
+@kindex S o p (Summary)
+@findex gnus-summary-post-forward
+Forward the current article to a newsgroup
+(@code{gnus-summary-post-forward}).
+ If no prefix is given, the message is forwarded according to the value
+of (@code{message-forward-as-mime}) and
+(@code{message-forward-show-mml}); if the prefix is 1, decode the
+message and forward directly inline; if the prefix is 2, forward message
+as an rfc822 @acronym{MIME} section; if the prefix is 3, decode message and
+forward as an rfc822 @acronym{MIME} section; if the prefix is 4, forward message
+directly inline; otherwise, the message is forwarded as no prefix given
+but use the flipped value of (@code{message-forward-as-mime}).  By
+default, the message is decoded and forwarded as an rfc822 @acronym{MIME} section.
+
+@item S O p
+@kindex S O p (Summary)
+@findex gnus-uu-digest-post-forward
+@cindex digests
+@cindex making digests
+Digest the current series and forward the result to a newsgroup
+(@code{gnus-uu-digest-post-forward}).  This command uses the
+process/prefix convention.
+
+@item S u
+@kindex S u (Summary)
+@findex gnus-uu-post-news
+@c @icon{gnus-uu-post-news}
+Uuencode a file, split it into parts, and post it as a series
+(@code{gnus-uu-post-news}).  (@pxref{Uuencoding and Posting}).
+@end table
+
+Also @xref{Header Commands, ,Header Commands, message, The Message
+Manual}, for more information.
+
+
+@node Summary Message Commands
+@subsection Summary Message Commands
+
+@table @kbd
+@item S y
+@kindex S y (Summary)
+@findex gnus-summary-yank-message
+Yank the current article into an already existing Message composition
+buffer (@code{gnus-summary-yank-message}).  This command prompts for
+what message buffer you want to yank into, and understands the
+process/prefix convention (@pxref{Process/Prefix}).
+
+@end table
+
+
+@node Canceling and Superseding
+@subsection Canceling Articles
+@cindex canceling articles
+@cindex superseding articles
+
+Have you ever written something, and then decided that you really,
+really, really wish you hadn't posted that?
+
+Well, you can't cancel mail, but you can cancel posts.
+
+@findex gnus-summary-cancel-article
+@kindex C (Summary)
+@c @icon{gnus-summary-cancel-article}
+Find the article you wish to cancel (you can only cancel your own
+articles, so don't try any funny stuff).  Then press @kbd{C} or @kbd{S
+c} (@code{gnus-summary-cancel-article}).  Your article will be
+canceled---machines all over the world will be deleting your article.
+This command uses the process/prefix convention (@pxref{Process/Prefix}).
+
+Be aware, however, that not all sites honor cancels, so your article may
+live on here and there, while most sites will delete the article in
+question.
+
+Gnus will use the ``current'' select method when canceling.  If you
+want to use the standard posting method, use the @samp{a} symbolic
+prefix (@pxref{Symbolic Prefixes}).
+
+Gnus ensures that only you can cancel your own messages using a
+@code{Cancel-Lock} header (@pxref{Canceling News, Canceling News, ,
+message, Message Manual}).
+
+If you discover that you have made some mistakes and want to do some
+corrections, you can post a @dfn{superseding} article that will replace
+your original article.
+
+@findex gnus-summary-supersede-article
+@kindex S (Summary)
+Go to the original article and press @kbd{S s}
+(@code{gnus-summary-supersede-article}).  You will be put in a buffer
+where you can edit the article all you want before sending it off the
+usual way.
+
+The same goes for superseding as for canceling, only more so: Some
+sites do not honor superseding.  On those sites, it will appear that you
+have posted almost the same article twice.
+
+If you have just posted the article, and change your mind right away,
+there is a trick you can use to cancel/supersede the article without
+waiting for the article to appear on your site first.  You simply return
+to the post buffer (which is called @code{*sent ...*}).  There you will
+find the article you just posted, with all the headers intact.  Change
+the @code{Message-ID} header to a @code{Cancel} or @code{Supersedes}
+header by substituting one of those words for the word
+@code{Message-ID}.  Then just press @kbd{C-c C-c} to send the article as
+you would do normally.  The previous article will be
+canceled/superseded.
+
+Just remember, kids: There is no 'c' in 'supersede'.
+
+@node Delayed Articles
+@section Delayed Articles
+@cindex delayed sending
+@cindex send delayed
+
+Sometimes, you might wish to delay the sending of a message.  For
+example, you might wish to arrange for a message to turn up just in time
+to remind your about the birthday of your Significant Other.  For this,
+there is the @code{gnus-delay} package.  Setup is simple:
+
+@lisp
+(gnus-delay-initialize)
+@end lisp
+
+@findex gnus-delay-article
+Normally, to send a message you use the @kbd{C-c C-c} command from
+Message mode.  To delay a message, use @kbd{C-c C-j}
+(@code{gnus-delay-article}) instead.  This will ask you for how long the
+message should be delayed.  Possible answers are:
+
+@itemize @bullet
+@item
+A time span.  Consists of an integer and a letter.  For example,
+@code{42d} means to delay for 42 days.  Available letters are @code{m}
+(minutes), @code{h} (hours), @code{d} (days), @code{w} (weeks), @code{M}
+(months) and @code{Y} (years).
+
+@item
+A specific date.  Looks like @code{YYYY-MM-DD}.  The message will be
+delayed until that day, at a specific time (eight o'clock by default).
+See also @code{gnus-delay-default-hour}.
+
+@item
+A specific time of day.  Given in @code{hh:mm} format, 24h, no am/pm
+stuff.  The deadline will be at that time today, except if that time has
+already passed, then it's at the given time tomorrow.  So if it's ten
+o'clock in the morning and you specify @code{11:15}, then the deadline
+is one hour and fifteen minutes hence.  But if you specify @code{9:20},
+that means a time tomorrow.
+@end itemize
+
+The action of the @code{gnus-delay-article} command is influenced by a
+couple of variables:
+
+@table @code
+@item gnus-delay-default-hour
+@vindex gnus-delay-default-hour
+When you specify a specific date, the message will be due on that hour
+on the given date.  Possible values are integers 0 through 23.
+
+@item gnus-delay-default-delay
+@vindex gnus-delay-default-delay
+This is a string and gives the default delay.  It can be of any of the
+formats described above.
+
+@item gnus-delay-group
+@vindex gnus-delay-group
+Delayed articles will be kept in this group on the drafts server until
+they are due.  You probably don't need to change this.  The default
+value is @code{"delayed"}.
+
+@item gnus-delay-header
+@vindex gnus-delay-header
+The deadline for each article will be stored in a header.  This variable
+is a string and gives the header name.  You probably don't need to
+change this.  The default value is @code{"X-Gnus-Delayed"}.
+@end table
+
+The way delaying works is like this: when you use the
+@code{gnus-delay-article} command, you give a certain delay.  Gnus
+calculates the deadline of the message and stores it in the
+@code{X-Gnus-Delayed} header and puts the message in the
+@code{nndraft:delayed} group.
+
+@findex gnus-delay-send-queue
+And whenever you get new news, Gnus looks through the group for articles
+which are due and sends them.  It uses the @code{gnus-delay-send-queue}
+function for this.  By default, this function is added to the hook
+@code{gnus-get-new-news-hook}.  But of course, you can change this.
+Maybe you want to use the demon to send drafts?  Just tell the demon to
+execute the @code{gnus-delay-send-queue} function.
+
+@table @code
+@item gnus-delay-initialize
+@findex gnus-delay-initialize
+By default, this function installs @code{gnus-delay-send-queue} in
+@code{gnus-get-new-news-hook}.  But it accepts the optional second
+argument @code{no-check}.  If it is non-@code{nil},
+@code{gnus-get-new-news-hook} is not changed.  The optional first
+argument is ignored.
+
+For example, @code{(gnus-delay-initialize nil t)} means to do nothing.
+Presumably, you want to use the demon for sending due delayed articles.
+Just don't forget to set that up :-)
+@end table
+
+
+@node Marking Articles
+@section Marking Articles
+@cindex article marking
+@cindex article ticking
+@cindex marks
+
+There are several marks you can set on an article.
+
+You have marks that decide the @dfn{readedness} (whoo, neato-keano
+neologism ohoy!) of the article.  Alphabetic marks generally mean
+@dfn{read}, while non-alphabetic characters generally mean @dfn{unread}.
+
+In addition, you also have marks that do not affect readedness.
+
+@ifinfo
+There's a plethora of commands for manipulating these marks.
+@end ifinfo
+
+@menu
+* Unread Articles::             Marks for unread articles.
+* Read Articles::               Marks for read articles.
+* Other Marks::                 Marks that do not affect readedness.
+* Setting Marks::               How to set and remove marks.
+* Generic Marking Commands::    How to customize the marking.
+* Setting Process Marks::       How to mark articles for later processing.
+@end menu
+
+
+@node Unread Articles
+@subsection Unread Articles
+
+The following marks mark articles as (kinda) unread, in one form or
+other.
+
+@table @samp
+@item !
+@vindex gnus-ticked-mark
+Marked as ticked (@code{gnus-ticked-mark}).
+
+@dfn{Ticked articles} are articles that will remain visible always.  If
+you see an article that you find interesting, or you want to put off
+reading it, or replying to it, until sometime later, you'd typically
+tick it.  However, articles can be expired (from news servers by the
+news server software, Gnus itself never expires ticked messages), so if
+you want to keep an article forever, you'll have to make it persistent
+(@pxref{Persistent Articles}).
+
+@item ?
+@vindex gnus-dormant-mark
+Marked as dormant (@code{gnus-dormant-mark}).
+
+@dfn{Dormant articles} will only appear in the summary buffer if there
+are followups to it.  If you want to see them even if they don't have
+followups, you can use the @kbd{/ D} command (@pxref{Limiting}).
+Otherwise (except for the visibility issue), they are just like ticked
+messages.
+
+@item SPACE
+@vindex gnus-unread-mark
+Marked as unread (@code{gnus-unread-mark}).
+
+@dfn{Unread articles} are articles that haven't been read at all yet.
+@end table
+
+
+@node Read Articles
+@subsection Read Articles
+@cindex expirable mark
+
+All the following marks mark articles as read.
+
+@table @samp
+
+@item r
+@vindex gnus-del-mark
+These are articles that the user has marked as read with the @kbd{d}
+command manually, more or less (@code{gnus-del-mark}).
+
+@item R
+@vindex gnus-read-mark
+Articles that have actually been read (@code{gnus-read-mark}).
+
+@item O
+@vindex gnus-ancient-mark
+Articles that were marked as read in previous sessions and are now
+@dfn{old} (@code{gnus-ancient-mark}).
+
+@item K
+@vindex gnus-killed-mark
+Marked as killed (@code{gnus-killed-mark}).
+
+@item X
+@vindex gnus-kill-file-mark
+Marked as killed by kill files (@code{gnus-kill-file-mark}).
+
+@item Y
+@vindex gnus-low-score-mark
+Marked as read by having too low a score (@code{gnus-low-score-mark}).
+
+@item C
+@vindex gnus-catchup-mark
+Marked as read by a catchup (@code{gnus-catchup-mark}).
+
+@item G
+@vindex gnus-canceled-mark
+Canceled article (@code{gnus-canceled-mark})
+
+@item F
+@vindex gnus-souped-mark
+@sc{soup}ed article (@code{gnus-souped-mark}).  @xref{SOUP}.
+
+@item Q
+@vindex gnus-sparse-mark
+Sparsely reffed article (@code{gnus-sparse-mark}).  @xref{Customizing
+Threading}.
+
+@item M
+@vindex gnus-duplicate-mark
+Article marked as read by duplicate suppression
+(@code{gnus-duplicate-mark}).  @xref{Duplicate Suppression}.
+
+@end table
+
+All these marks just mean that the article is marked as read, really.
+They are interpreted differently when doing adaptive scoring, though.
+
+One more special mark, though:
+
+@table @samp
+@item E
+@vindex gnus-expirable-mark
+Marked as expirable (@code{gnus-expirable-mark}).
+
+Marking articles as @dfn{expirable} (or have them marked as such
+automatically) doesn't make much sense in normal groups---a user doesn't
+control expiring of news articles, but in mail groups, for instance,
+articles marked as @dfn{expirable} can be deleted by Gnus at
+any time.
+@end table
+
+
+@node Other Marks
+@subsection Other Marks
+@cindex process mark
+@cindex bookmarks
+
+There are some marks that have nothing to do with whether the article is
+read or not.
+
+@itemize @bullet
+
+@item
+You can set a bookmark in the current article.  Say you are reading a
+long thesis on cats' urinary tracts, and have to go home for dinner
+before you've finished reading the thesis.  You can then set a bookmark
+in the article, and Gnus will jump to this bookmark the next time it
+encounters the article.  @xref{Setting Marks}.
+
+@item
+@vindex gnus-replied-mark
+All articles that you have replied to or made a followup to (i.e., have
+answered) will be marked with an @samp{A} in the second column
+(@code{gnus-replied-mark}).
+
+@item
+@vindex gnus-forwarded-mark
+All articles that you have forwarded will be marked with an @samp{F} in
+the second column (@code{gnus-forwarded-mark}).
+
+@item
+@vindex gnus-cached-mark
+Articles stored in the article cache will be marked with an @samp{*} in
+the second column (@code{gnus-cached-mark}).  @xref{Article Caching}.
+
+@item
+@vindex gnus-saved-mark
+Articles ``saved'' (in some manner or other; not necessarily
+religiously) are marked with an @samp{S} in the second column
+(@code{gnus-saved-mark}).
+
+@item
+@vindex gnus-recent-mark
+Articles that according to the server haven't been shown to the user
+before are marked with a @samp{N} in the second column
+(@code{gnus-recent-mark}).  Note that not all servers support this
+mark, in which case it simply never appears.  Compare with
+@code{gnus-unseen-mark}.
+
+@item
+@vindex gnus-unseen-mark
+Articles that haven't been seen before in Gnus by the user are marked
+with a @samp{.} in the second column (@code{gnus-unseen-mark}).
+Compare with @code{gnus-recent-mark}.
+
+@item
+@vindex gnus-downloaded-mark
+When using the Gnus agent (@pxref{Agent Basics}), articles may be
+downloaded for unplugged (offline) viewing.  If you are using the
+@samp{%O} spec, these articles get the @samp{+} mark in that spec.
+(The variable @code{gnus-downloaded-mark} controls which character to
+use.)
+
+@item
+@vindex gnus-undownloaded-mark
+When using the Gnus agent (@pxref{Agent Basics}), some articles might
+not have been downloaded.  Such articles cannot be viewed while you
+are unplugged (offline).  If you are using the @samp{%O} spec, these
+articles get the @samp{-} mark in that spec.  (The variable
+@code{gnus-undownloaded-mark} controls which character to use.)
+
+@item
+@vindex gnus-downloadable-mark
+The Gnus agent (@pxref{Agent Basics}) downloads some articles
+automatically, but it is also possible to explicitly mark articles for
+download, even if they would not be downloaded automatically.  Such
+explicitly-marked articles get the @samp{%} mark in the first column.
+(The variable @code{gnus-downloadable-mark} controls which character to
+use.)
+
+@item
+@vindex gnus-not-empty-thread-mark
+@vindex gnus-empty-thread-mark
+If the @samp{%e} spec is used, the presence of threads or not will be
+marked with @code{gnus-not-empty-thread-mark} and
+@code{gnus-empty-thread-mark} in the third column, respectively.
+
+@item
+@vindex gnus-process-mark
+Finally we have the @dfn{process mark} (@code{gnus-process-mark}).  A
+variety of commands react to the presence of the process mark.  For
+instance, @kbd{X u} (@code{gnus-uu-decode-uu}) will uudecode and view
+all articles that have been marked with the process mark.  Articles
+marked with the process mark have a @samp{#} in the second column.
+
+@end itemize
+
+You might have noticed that most of these ``non-readedness'' marks
+appear in the second column by default.  So if you have a cached, saved,
+replied article that you have process-marked, what will that look like?
+
+Nothing much.  The precedence rules go as follows: process -> cache ->
+replied -> saved.  So if the article is in the cache and is replied,
+you'll only see the cache mark and not the replied mark.
+
+
+@node Setting Marks
+@subsection Setting Marks
+@cindex setting marks
+
+All the marking commands understand the numeric prefix.
+
+@table @kbd
+@item M c
+@itemx M-u
+@kindex M c (Summary)
+@kindex M-u (Summary)
+@findex gnus-summary-clear-mark-forward
+@cindex mark as unread
+Clear all readedness-marks from the current article
+(@code{gnus-summary-clear-mark-forward}).  In other words, mark the
+article as unread.
+
+@item M t
+@itemx !
+@kindex ! (Summary)
+@kindex M t (Summary)
+@findex gnus-summary-tick-article-forward
+Tick the current article (@code{gnus-summary-tick-article-forward}).
+@xref{Article Caching}.
+
+@item M ?
+@itemx ?
+@kindex ? (Summary)
+@kindex M ? (Summary)
+@findex gnus-summary-mark-as-dormant
+Mark the current article as dormant
+(@code{gnus-summary-mark-as-dormant}).  @xref{Article Caching}.
+
+@item M d
+@itemx d
+@kindex M d (Summary)
+@kindex d (Summary)
+@findex gnus-summary-mark-as-read-forward
+Mark the current article as read
+(@code{gnus-summary-mark-as-read-forward}).
+
+@item D
+@kindex D (Summary)
+@findex gnus-summary-mark-as-read-backward
+Mark the current article as read and move point to the previous line
+(@code{gnus-summary-mark-as-read-backward}).
+
+@item M k
+@itemx k
+@kindex k (Summary)
+@kindex M k (Summary)
+@findex gnus-summary-kill-same-subject-and-select
+Mark all articles that have the same subject as the current one as read,
+and then select the next unread article
+(@code{gnus-summary-kill-same-subject-and-select}).
+
+@item M K
+@itemx C-k
+@kindex M K (Summary)
+@kindex C-k (Summary)
+@findex gnus-summary-kill-same-subject
+Mark all articles that have the same subject as the current one as read
+(@code{gnus-summary-kill-same-subject}).
+
+@item M C
+@kindex M C (Summary)
+@findex gnus-summary-catchup
+@c @icon{gnus-summary-catchup}
+Mark all unread articles as read (@code{gnus-summary-catchup}).
+
+@item M C-c
+@kindex M C-c (Summary)
+@findex gnus-summary-catchup-all
+Mark all articles in the group as read---even the ticked and dormant
+articles (@code{gnus-summary-catchup-all}).
+
+@item M H
+@kindex M H (Summary)
+@findex gnus-summary-catchup-to-here
+Catchup the current group to point (before the point)
+(@code{gnus-summary-catchup-to-here}).
+
+@item M h
+@kindex M h (Summary)
+@findex gnus-summary-catchup-from-here
+Catchup the current group from point (after the point)
+(@code{gnus-summary-catchup-from-here}).
+
+@item C-w
+@kindex C-w (Summary)
+@findex gnus-summary-mark-region-as-read
+Mark all articles between point and mark as read
+(@code{gnus-summary-mark-region-as-read}).
+
+@item M V k
+@kindex M V k (Summary)
+@findex gnus-summary-kill-below
+Kill all articles with scores below the default score (or below the
+numeric prefix) (@code{gnus-summary-kill-below}).
+
+@item M e
+@itemx E
+@kindex M e (Summary)
+@kindex E (Summary)
+@findex gnus-summary-mark-as-expirable
+Mark the current article as expirable
+(@code{gnus-summary-mark-as-expirable}).
+
+@item M b
+@kindex M b (Summary)
+@findex gnus-summary-set-bookmark
+Set a bookmark in the current article
+(@code{gnus-summary-set-bookmark}).
+
+@item M B
+@kindex M B (Summary)
+@findex gnus-summary-remove-bookmark
+Remove the bookmark from the current article
+(@code{gnus-summary-remove-bookmark}).
+
+@item M V c
+@kindex M V c (Summary)
+@findex gnus-summary-clear-above
+Clear all marks from articles with scores over the default score (or
+over the numeric prefix) (@code{gnus-summary-clear-above}).
+
+@item M V u
+@kindex M V u (Summary)
+@findex gnus-summary-tick-above
+Tick all articles with scores over the default score (or over the
+numeric prefix) (@code{gnus-summary-tick-above}).
+
+@item M V m
+@kindex M V m (Summary)
+@findex gnus-summary-mark-above
+Prompt for a mark, and mark all articles with scores over the default
+score (or over the numeric prefix) with this mark
+(@code{gnus-summary-clear-above}).
+@end table
+
+@vindex gnus-summary-goto-unread
+The @code{gnus-summary-goto-unread} variable controls what action should
+be taken after setting a mark.  If non-@code{nil}, point will move to
+the next/previous unread article.  If @code{nil}, point will just move
+one line up or down.  As a special case, if this variable is
+@code{never}, all the marking commands as well as other commands (like
+@kbd{SPACE}) will move to the next article, whether it is unread or not.
+The default is @code{t}.
+
+
+@node Generic Marking Commands
+@subsection Generic Marking Commands
+
+Some people would like the command that ticks an article (@kbd{!}) go to
+the next article.  Others would like it to go to the next unread
+article.  Yet others would like it to stay on the current article.  And
+even though I haven't heard of anybody wanting it to go to the
+previous (unread) article, I'm sure there are people that want that as
+well.
+
+Multiply these five behaviors with five different marking commands, and
+you get a potentially complex set of variable to control what each
+command should do.
+
+To sidestep that mess, Gnus provides commands that do all these
+different things.  They can be found on the @kbd{M M} map in the summary
+buffer.  Type @kbd{M M C-h} to see them all---there are too many of them
+to list in this manual.
+
+While you can use these commands directly, most users would prefer
+altering the summary mode keymap.  For instance, if you would like the
+@kbd{!} command to go to the next article instead of the next unread
+article, you could say something like:
+
+@lisp
+@group
+(add-hook 'gnus-summary-mode-hook 'my-alter-summary-map)
+(defun my-alter-summary-map ()
+  (local-set-key "!" 'gnus-summary-put-mark-as-ticked-next))
+@end group
+@end lisp
+
+@noindent
+or
+
+@lisp
+(defun my-alter-summary-map ()
+  (local-set-key "!" "MM!n"))
+@end lisp
+
+
+@node Setting Process Marks
+@subsection Setting Process Marks
+@cindex setting process marks
+
+Process marks are displayed as @code{#} in the summary buffer, and are
+used for marking articles in such a way that other commands will
+process these articles.  For instance, if you process mark four
+articles and then use the @kbd{*} command, Gnus will enter these four
+articles into the cache.  For more information,
+@pxref{Process/Prefix}.
+
+@table @kbd
+
+@item M P p
+@itemx #
+@kindex # (Summary)
+@kindex M P p (Summary)
+@findex gnus-summary-mark-as-processable
+Mark the current article with the process mark
+(@code{gnus-summary-mark-as-processable}).
+@findex gnus-summary-unmark-as-processable
+
+@item M P u
+@itemx M-#
+@kindex M P u (Summary)
+@kindex M-# (Summary)
+Remove the process mark, if any, from the current article
+(@code{gnus-summary-unmark-as-processable}).
+
+@item M P U
+@kindex M P U (Summary)
+@findex gnus-summary-unmark-all-processable
+Remove the process mark from all articles
+(@code{gnus-summary-unmark-all-processable}).
+
+@item M P i
+@kindex M P i (Summary)
+@findex gnus-uu-invert-processable
+Invert the list of process marked articles
+(@code{gnus-uu-invert-processable}).
+
+@item M P R
+@kindex M P R (Summary)
+@findex gnus-uu-mark-by-regexp
+Mark articles that have a @code{Subject} header that matches a regular
+expression (@code{gnus-uu-mark-by-regexp}).
+
+@item M P G
+@kindex M P G (Summary)
+@findex gnus-uu-unmark-by-regexp
+Unmark articles that have a @code{Subject} header that matches a regular
+expression (@code{gnus-uu-unmark-by-regexp}).
+
+@item M P r
+@kindex M P r (Summary)
+@findex gnus-uu-mark-region
+Mark articles in region (@code{gnus-uu-mark-region}).
+
+@item M P g
+@kindex M P g (Summary)
+@findex gnus-uu-unmark-region
+Unmark articles in region (@code{gnus-uu-unmark-region}).
+
+@item M P t
+@kindex M P t (Summary)
+@findex gnus-uu-mark-thread
+Mark all articles in the current (sub)thread
+(@code{gnus-uu-mark-thread}).
+
+@item M P T
+@kindex M P T (Summary)
+@findex gnus-uu-unmark-thread
+Unmark all articles in the current (sub)thread
+(@code{gnus-uu-unmark-thread}).
+
+@item M P v
+@kindex M P v (Summary)
+@findex gnus-uu-mark-over
+Mark all articles that have a score above the prefix argument
+(@code{gnus-uu-mark-over}).
+
+@item M P s
+@kindex M P s (Summary)
+@findex gnus-uu-mark-series
+Mark all articles in the current series (@code{gnus-uu-mark-series}).
+
+@item M P S
+@kindex M P S (Summary)
+@findex gnus-uu-mark-sparse
+Mark all series that have already had some articles marked
+(@code{gnus-uu-mark-sparse}).
+
+@item M P a
+@kindex M P a (Summary)
+@findex gnus-uu-mark-all
+Mark all articles in series order (@code{gnus-uu-mark-all}).
+
+@item M P b
+@kindex M P b (Summary)
+@findex gnus-uu-mark-buffer
+Mark all articles in the buffer in the order they appear
+(@code{gnus-uu-mark-buffer}).
+
+@item M P k
+@kindex M P k (Summary)
+@findex gnus-summary-kill-process-mark
+Push the current process mark set onto the stack and unmark all articles
+(@code{gnus-summary-kill-process-mark}).
+
+@item M P y
+@kindex M P y (Summary)
+@findex gnus-summary-yank-process-mark
+Pop the previous process mark set from the stack and restore it
+(@code{gnus-summary-yank-process-mark}).
+
+@item M P w
+@kindex M P w (Summary)
+@findex gnus-summary-save-process-mark
+Push the current process mark set onto the stack
+(@code{gnus-summary-save-process-mark}).
+
+@end table
+
+Also see the @kbd{&} command in @ref{Searching for Articles}, for how to
+set process marks based on article body contents.
+
+
+@node Limiting
+@section Limiting
+@cindex limiting
+
+It can be convenient to limit the summary buffer to just show some
+subset of the articles currently in the group.  The effect most limit
+commands have is to remove a few (or many) articles from the summary
+buffer.
+
+All limiting commands work on subsets of the articles already fetched
+from the servers.  None of these commands query the server for
+additional articles.
+
+@table @kbd
+
+@item / /
+@itemx / s
+@kindex / / (Summary)
+@findex gnus-summary-limit-to-subject
+Limit the summary buffer to articles that match some subject
+(@code{gnus-summary-limit-to-subject}).  If given a prefix, exclude
+matching articles.
+
+@item / a
+@kindex / a (Summary)
+@findex gnus-summary-limit-to-author
+Limit the summary buffer to articles that match some author
+(@code{gnus-summary-limit-to-author}).  If given a prefix, exclude
+matching articles.
+
+@item / x
+@kindex / x (Summary)
+@findex gnus-summary-limit-to-extra
+Limit the summary buffer to articles that match one of the ``extra''
+headers (@pxref{To From Newsgroups})
+(@code{gnus-summary-limit-to-extra}).  If given a prefix, exclude
+matching articles.
+
+@item / u
+@itemx x
+@kindex / u (Summary)
+@kindex x (Summary)
+@findex gnus-summary-limit-to-unread
+Limit the summary buffer to articles not marked as read
+(@code{gnus-summary-limit-to-unread}).  If given a prefix, limit the
+buffer to articles strictly unread.  This means that ticked and
+dormant articles will also be excluded.
+
+@item / m
+@kindex / m (Summary)
+@findex gnus-summary-limit-to-marks
+Ask for a mark and then limit to all articles that have been marked
+with that mark (@code{gnus-summary-limit-to-marks}).
+
+@item / t
+@kindex / t (Summary)
+@findex gnus-summary-limit-to-age
+Ask for a number and then limit the summary buffer to articles older than (or equal to) that number of days
+(@code{gnus-summary-limit-to-age}).  If given a prefix, limit to
+articles younger than that number of days.
+
+@item / n
+@kindex / n (Summary)
+@findex gnus-summary-limit-to-articles
+With prefix @samp{n}, limit the summary buffer to the next @samp{n}
+articles.  If not given a prefix, use the process marked articles
+instead.  (@code{gnus-summary-limit-to-articles}).
+
+@item / w
+@kindex / w (Summary)
+@findex gnus-summary-pop-limit
+Pop the previous limit off the stack and restore it
+(@code{gnus-summary-pop-limit}).  If given a prefix, pop all limits off
+the stack.
+
+@item / .
+@kindex / . (Summary)
+@findex gnus-summary-limit-to-unseen
+Limit the summary buffer to the unseen articles
+(@code{gnus-summary-limit-to-unseen}).
+
+@item / v
+@kindex / v (Summary)
+@findex gnus-summary-limit-to-score
+Limit the summary buffer to articles that have a score at or above some
+score (@code{gnus-summary-limit-to-score}).
+
+@item / p
+@kindex / p (Summary)
+@findex gnus-summary-limit-to-display-predicate
+Limit the summary buffer to articles that satisfy the @code{display}
+group parameter predicate
+(@code{gnus-summary-limit-to-display-predicate}).  @xref{Group
+Parameters}, for more on this predicate.
+
+@item / E
+@itemx M S
+@kindex M S (Summary)
+@kindex / E (Summary)
+@findex gnus-summary-limit-include-expunged
+Include all expunged articles in the limit
+(@code{gnus-summary-limit-include-expunged}).
+
+@item / D
+@kindex / D (Summary)
+@findex gnus-summary-limit-include-dormant
+Include all dormant articles in the limit
+(@code{gnus-summary-limit-include-dormant}).
+
+@item / *
+@kindex / * (Summary)
+@findex gnus-summary-limit-include-cached
+Include all cached articles in the limit
+(@code{gnus-summary-limit-include-cached}).
+
+@item / d
+@kindex / d (Summary)
+@findex gnus-summary-limit-exclude-dormant
+Exclude all dormant articles from the limit
+(@code{gnus-summary-limit-exclude-dormant}).
+
+@item / M
+@kindex / M (Summary)
+@findex gnus-summary-limit-exclude-marks
+Exclude all marked articles (@code{gnus-summary-limit-exclude-marks}).
+
+@item / T
+@kindex / T (Summary)
+@findex gnus-summary-limit-include-thread
+Include all the articles in the current thread in the limit.
+
+@item / c
+@kindex / c (Summary)
+@findex gnus-summary-limit-exclude-childless-dormant
+Exclude all dormant articles that have no children from the limit@*
+(@code{gnus-summary-limit-exclude-childless-dormant}).
+
+@item / C
+@kindex / C (Summary)
+@findex gnus-summary-limit-mark-excluded-as-read
+Mark all excluded unread articles as read
+(@code{gnus-summary-limit-mark-excluded-as-read}).  If given a prefix,
+also mark excluded ticked and dormant articles as read.
+
+@item / N
+@kindex / N (Summary)
+@findex gnus-summary-insert-new-articles
+Insert all new articles in the summary buffer.  It scans for new emails
+if @var{back-end}@code{-get-new-mail} is non-@code{nil}.
+
+@item / o
+@kindex / o (Summary)
+@findex gnus-summary-insert-old-articles
+Insert all old articles in the summary buffer.  If given a numbered
+prefix, fetch this number of articles.
+
+@end table
+
+
+@node Threading
+@section Threading
+@cindex threading
+@cindex article threading
+
+Gnus threads articles by default.  @dfn{To thread} is to put responses
+to articles directly after the articles they respond to---in a
+hierarchical fashion.
+
+Threading is done by looking at the @code{References} headers of the
+articles.  In a perfect world, this would be enough to build pretty
+trees, but unfortunately, the @code{References} header is often broken
+or simply missing.  Weird news propagation exacerbates the problem,
+so one has to employ other heuristics to get pleasing results.  A
+plethora of approaches exists, as detailed in horrible detail in
+@ref{Customizing Threading}.
+
+First, a quick overview of the concepts:
+
+@table @dfn
+@item root
+The top-most article in a thread; the first article in the thread.
+
+@item thread
+A tree-like article structure.
+
+@item sub-thread
+A small(er) section of this tree-like structure.
+
+@item loose threads
+Threads often lose their roots due to article expiry, or due to the root
+already having been read in a previous session, and not displayed in the
+summary buffer.  We then typically have many sub-threads that really
+belong to one thread, but are without connecting roots.  These are
+called loose threads.
+
+@item thread gathering
+An attempt to gather loose threads into bigger threads.
+
+@item sparse threads
+A thread where the missing articles have been ``guessed'' at, and are
+displayed as empty lines in the summary buffer.
+
+@end table
+
+
+@menu
+* Customizing Threading::       Variables you can change to affect the threading.
+* Thread Commands::             Thread based commands in the summary buffer.
+@end menu
+
+
+@node Customizing Threading
+@subsection Customizing Threading
+@cindex customizing threading
+
+@menu
+* Loose Threads::               How Gnus gathers loose threads into bigger threads.
+* Filling In Threads::          Making the threads displayed look fuller.
+* More Threading::              Even more variables for fiddling with threads.
+* Low-Level Threading::         You thought it was over@dots{} but you were wrong!
+@end menu
+
+
+@node Loose Threads
+@subsubsection Loose Threads
+@cindex <
+@cindex >
+@cindex loose threads
+
+@table @code
+@item gnus-summary-make-false-root
+@vindex gnus-summary-make-false-root
+If non-@code{nil}, Gnus will gather all loose subtrees into one big tree
+and create a dummy root at the top.  (Wait a minute.  Root at the top?
+Yup.)  Loose subtrees occur when the real root has expired, or you've
+read or killed the root in a previous session.
+
+When there is no real root of a thread, Gnus will have to fudge
+something.  This variable says what fudging method Gnus should use.
+There are four possible values:
+
+@iftex
+@iflatex
+\gnusfigure{The Summary Buffer}{390}{
+\put(0,0){\epsfig{figure=ps/summary-adopt,width=7.5cm}}
+\put(445,0){\makebox(0,0)[br]{\epsfig{figure=ps/summary-empty,width=7.5cm}}}
+\put(0,400){\makebox(0,0)[tl]{\epsfig{figure=ps/summary-none,width=7.5cm}}}
+\put(445,400){\makebox(0,0)[tr]{\epsfig{figure=ps/summary-dummy,width=7.5cm}}}
+}
+@end iflatex
+@end iftex
+
+@cindex adopting articles
+
+@table @code
+
+@item adopt
+Gnus will make the first of the orphaned articles the parent.  This
+parent will adopt all the other articles.  The adopted articles will be
+marked as such by pointy brackets (@samp{<>}) instead of the standard
+square brackets (@samp{[]}).  This is the default method.
+
+@item dummy
+@vindex gnus-summary-dummy-line-format
+@vindex gnus-summary-make-false-root-always
+Gnus will create a dummy summary line that will pretend to be the
+parent.  This dummy line does not correspond to any real article, so
+selecting it will just select the first real article after the dummy
+article.  @code{gnus-summary-dummy-line-format} is used to specify the
+format of the dummy roots.  It accepts only one format spec:  @samp{S},
+which is the subject of the article.  @xref{Formatting Variables}.
+If you want all threads to have a dummy root, even the non-gathered
+ones, set @code{gnus-summary-make-false-root-always} to @code{t}.
+
+@item empty
+Gnus won't actually make any article the parent, but simply leave the
+subject field of all orphans except the first empty.  (Actually, it will
+use @code{gnus-summary-same-subject} as the subject (@pxref{Summary
+Buffer Format}).)
+
+@item none
+Don't make any article parent at all.  Just gather the threads and
+display them after one another.
+
+@item nil
+Don't gather loose threads.
+@end table
+
+@item gnus-summary-gather-subject-limit
+@vindex gnus-summary-gather-subject-limit
+Loose threads are gathered by comparing subjects of articles.  If this
+variable is @code{nil}, Gnus requires an exact match between the
+subjects of the loose threads before gathering them into one big
+super-thread.  This might be too strict a requirement, what with the
+presence of stupid newsreaders that chop off long subject lines.  If
+you think so, set this variable to, say, 20 to require that only the
+first 20 characters of the subjects have to match.  If you set this
+variable to a really low number, you'll find that Gnus will gather
+everything in sight into one thread, which isn't very helpful.
+
+@cindex fuzzy article gathering
+If you set this variable to the special value @code{fuzzy}, Gnus will
+use a fuzzy string comparison algorithm on the subjects (@pxref{Fuzzy
+Matching}).
+
+@item gnus-simplify-subject-fuzzy-regexp
+@vindex gnus-simplify-subject-fuzzy-regexp
+This can either be a regular expression or list of regular expressions
+that match strings that will be removed from subjects if fuzzy subject
+simplification is used.
+
+@item gnus-simplify-ignored-prefixes
+@vindex gnus-simplify-ignored-prefixes
+If you set @code{gnus-summary-gather-subject-limit} to something as low
+as 10, you might consider setting this variable to something sensible:
+
+@c Written by Michael Ernst <mernst@cs.rice.edu>
+@lisp
+(setq gnus-simplify-ignored-prefixes
+      (concat
+       "\\`\\[?\\("
+       (mapconcat
+        'identity
+        '("looking"
+          "wanted" "followup" "summary\\( of\\)?"
+          "help" "query" "problem" "question"
+          "answer" "reference" "announce"
+          "How can I" "How to" "Comparison of"
+          ;; ...
+          )
+        "\\|")
+       "\\)\\s *\\("
+       (mapconcat 'identity
+                  '("for" "for reference" "with" "about")
+                  "\\|")
+       "\\)?\\]?:?[ \t]*"))
+@end lisp
+
+All words that match this regexp will be removed before comparing two
+subjects.
+
+@item gnus-simplify-subject-functions
+@vindex gnus-simplify-subject-functions
+If non-@code{nil}, this variable overrides
+@code{gnus-summary-gather-subject-limit}.  This variable should be a
+list of functions to apply to the @code{Subject} string iteratively to
+arrive at the simplified version of the string.
+
+Useful functions to put in this list include:
+
+@table @code
+@item gnus-simplify-subject-re
+@findex gnus-simplify-subject-re
+Strip the leading @samp{Re:}.
+
+@item gnus-simplify-subject-fuzzy
+@findex gnus-simplify-subject-fuzzy
+Simplify fuzzily.
+
+@item gnus-simplify-whitespace
+@findex gnus-simplify-whitespace
+Remove excessive whitespace.
+
+@item gnus-simplify-all-whitespace
+@findex gnus-simplify-all-whitespace
+Remove all whitespace.
+@end table
+
+You may also write your own functions, of course.
+
+
+@item gnus-summary-gather-exclude-subject
+@vindex gnus-summary-gather-exclude-subject
+Since loose thread gathering is done on subjects only, that might lead
+to many false hits, especially with certain common subjects like
+@samp{} and @samp{(none)}.  To make the situation slightly better,
+you can use the regexp @code{gnus-summary-gather-exclude-subject} to say
+what subjects should be excluded from the gathering process.@*
+The default is @samp{^ *$\\|^(none)$}.
+
+@item gnus-summary-thread-gathering-function
+@vindex gnus-summary-thread-gathering-function
+Gnus gathers threads by looking at @code{Subject} headers.  This means
+that totally unrelated articles may end up in the same ``thread'', which
+is confusing.  An alternate approach is to look at all the
+@code{Message-ID}s in all the @code{References} headers to find matches.
+This will ensure that no gathered threads ever include unrelated
+articles, but it also means that people who have posted with broken
+newsreaders won't be gathered properly.  The choice is yours---plague or
+cholera:
+
+@table @code
+@item gnus-gather-threads-by-subject
+@findex gnus-gather-threads-by-subject
+This function is the default gathering function and looks at
+@code{Subject}s exclusively.
+
+@item gnus-gather-threads-by-references
+@findex gnus-gather-threads-by-references
+This function looks at @code{References} headers exclusively.
+@end table
+
+If you want to test gathering by @code{References}, you could say
+something like:
+
+@lisp
+(setq gnus-summary-thread-gathering-function
+      'gnus-gather-threads-by-references)
+@end lisp
+
+@end table
+
+
+@node Filling In Threads
+@subsubsection Filling In Threads
+
+@table @code
+@item gnus-fetch-old-headers
+@vindex gnus-fetch-old-headers
+If non-@code{nil}, Gnus will attempt to build old threads by fetching
+more old headers---headers to articles marked as read.  If you would
+like to display as few summary lines as possible, but still connect as
+many loose threads as possible, you should set this variable to
+@code{some} or a number.  If you set it to a number, no more than that
+number of extra old headers will be fetched.  In either case, fetching
+old headers only works if the back end you are using carries overview
+files---this would normally be @code{nntp}, @code{nnspool},
+@code{nnml}, and @code{nnmaildir}.  Also remember that if the root of
+the thread has been expired by the server, there's not much Gnus can
+do about that.
+
+This variable can also be set to @code{invisible}.  This won't have any
+visible effects, but is useful if you use the @kbd{A T} command a lot
+(@pxref{Finding the Parent}).
+
+@item gnus-fetch-old-ephemeral-headers
+@vindex gnus-fetch-old-ephemeral-headers
+Same as @code{gnus-fetch-old-headers}, but only used for ephemeral
+newsgroups.
+
+@item gnus-build-sparse-threads
+@vindex gnus-build-sparse-threads
+Fetching old headers can be slow.  A low-rent similar effect can be
+gotten by setting this variable to @code{some}.  Gnus will then look at
+the complete @code{References} headers of all articles and try to string
+together articles that belong in the same thread.  This will leave
+@dfn{gaps} in the threading display where Gnus guesses that an article
+is missing from the thread.  (These gaps appear like normal summary
+lines.  If you select a gap, Gnus will try to fetch the article in
+question.)  If this variable is @code{t}, Gnus will display all these
+``gaps'' without regard for whether they are useful for completing the
+thread or not.  Finally, if this variable is @code{more}, Gnus won't cut
+off sparse leaf nodes that don't lead anywhere.  This variable is
+@code{nil} by default.
+
+@item gnus-read-all-available-headers
+@vindex gnus-read-all-available-headers
+This is a rather obscure variable that few will find useful.  It's
+intended for those non-news newsgroups where the back end has to fetch
+quite a lot to present the summary buffer, and where it's impossible to
+go back to parents of articles.  This is mostly the case in the
+web-based groups, like the @code{nnultimate} groups.
+
+If you don't use those, then it's safe to leave this as the default
+@code{nil}.  If you want to use this variable, it should be a regexp
+that matches the group name, or @code{t} for all groups.
+
+@end table
+
+
+@node More Threading
+@subsubsection More Threading
+
+@table @code
+@item gnus-show-threads
+@vindex gnus-show-threads
+If this variable is @code{nil}, no threading will be done, and all of
+the rest of the variables here will have no effect.  Turning threading
+off will speed group selection up a bit, but it is sure to make reading
+slower and more awkward.
+
+@item gnus-thread-hide-subtree
+@vindex gnus-thread-hide-subtree
+If non-@code{nil}, all threads will be hidden when the summary buffer is
+generated.
+
+This can also be a predicate specifier (@pxref{Predicate Specifiers}).
+Available predicates are @code{gnus-article-unread-p} and
+@code{gnus-article-unseen-p}.
+
+Here's an example:
+
+@lisp
+(setq gnus-thread-hide-subtree
+      '(or gnus-article-unread-p
+           gnus-article-unseen-p))
+@end lisp
+
+(It's a pretty nonsensical example, since all unseen articles are also
+unread, but you get my drift.)
+
+
+@item gnus-thread-expunge-below
+@vindex gnus-thread-expunge-below
+All threads that have a total score (as defined by
+@code{gnus-thread-score-function}) less than this number will be
+expunged.  This variable is @code{nil} by default, which means that no
+threads are expunged.
+
+@item gnus-thread-hide-killed
+@vindex gnus-thread-hide-killed
+if you kill a thread and this variable is non-@code{nil}, the subtree
+will be hidden.
+
+@item gnus-thread-ignore-subject
+@vindex gnus-thread-ignore-subject
+Sometimes somebody changes the subject in the middle of a thread.  If
+this variable is non-@code{nil}, which is the default, the subject
+change is ignored.  If it is @code{nil}, a change in the subject will
+result in a new thread.
+
+@item gnus-thread-indent-level
+@vindex gnus-thread-indent-level
+This is a number that says how much each sub-thread should be indented.
+The default is 4.
+
+@item gnus-sort-gathered-threads-function
+@vindex gnus-sort-gathered-threads-function
+Sometimes, particularly with mailing lists, the order in which mails
+arrive locally is not necessarily the same as the order in which they
+arrived on the mailing list.  Consequently, when sorting sub-threads
+using the default @code{gnus-thread-sort-by-number}, responses can end
+up appearing before the article to which they are responding to.
+Setting this variable to an alternate value
+(e.g. @code{gnus-thread-sort-by-date}), in a group's parameters or in an
+appropriate hook (e.g. @code{gnus-summary-generate-hook}) can produce a
+more logical sub-thread ordering in such instances.
+
+@end table
+
+
+@node Low-Level Threading
+@subsubsection Low-Level Threading
+
+@table @code
+
+@item gnus-parse-headers-hook
+@vindex gnus-parse-headers-hook
+Hook run before parsing any headers.
+
+@item gnus-alter-header-function
+@vindex gnus-alter-header-function
+If non-@code{nil}, this function will be called to allow alteration of
+article header structures.  The function is called with one parameter,
+the article header vector, which it may alter in any way.  For instance,
+if you have a mail-to-news gateway which alters the @code{Message-ID}s
+in systematic ways (by adding prefixes and such), you can use this
+variable to un-scramble the @code{Message-ID}s so that they are more
+meaningful.  Here's one example:
+
+@lisp
+(setq gnus-alter-header-function 'my-alter-message-id)
+
+(defun my-alter-message-id (header)
+  (let ((id (mail-header-id header)))
+    (when (string-match
+           "\\(<[^<>@@]*\\)\\.?cygnus\\..*@@\\([^<>@@]*>\\)" id)
+      (mail-header-set-id
+       (concat (match-string 1 id) "@@" (match-string 2 id))
+       header))))
+@end lisp
+
+@end table
+
+
+@node Thread Commands
+@subsection Thread Commands
+@cindex thread commands
+
+@table @kbd
+
+@item T k
+@itemx C-M-k
+@kindex T k (Summary)
+@kindex C-M-k (Summary)
+@findex gnus-summary-kill-thread
+Mark all articles in the current (sub-)thread as read
+(@code{gnus-summary-kill-thread}).  If the prefix argument is positive,
+remove all marks instead.  If the prefix argument is negative, tick
+articles instead.
+
+@item T l
+@itemx C-M-l
+@kindex T l (Summary)
+@kindex C-M-l (Summary)
+@findex gnus-summary-lower-thread
+Lower the score of the current (sub-)thread
+(@code{gnus-summary-lower-thread}).
+
+@item T i
+@kindex T i (Summary)
+@findex gnus-summary-raise-thread
+Increase the score of the current (sub-)thread
+(@code{gnus-summary-raise-thread}).
+
+@item T #
+@kindex T # (Summary)
+@findex gnus-uu-mark-thread
+Set the process mark on the current (sub-)thread
+(@code{gnus-uu-mark-thread}).
+
+@item T M-#
+@kindex T M-# (Summary)
+@findex gnus-uu-unmark-thread
+Remove the process mark from the current (sub-)thread
+(@code{gnus-uu-unmark-thread}).
+
+@item T T
+@kindex T T (Summary)
+@findex gnus-summary-toggle-threads
+Toggle threading (@code{gnus-summary-toggle-threads}).
+
+@item T s
+@kindex T s (Summary)
+@findex gnus-summary-show-thread
+Expose the (sub-)thread hidden under the current article, if any@*
+(@code{gnus-summary-show-thread}).
+
+@item T h
+@kindex T h (Summary)
+@findex gnus-summary-hide-thread
+Hide the current (sub-)thread (@code{gnus-summary-hide-thread}).
+
+@item T S
+@kindex T S (Summary)
+@findex gnus-summary-show-all-threads
+Expose all hidden threads (@code{gnus-summary-show-all-threads}).
+
+@item T H
+@kindex T H (Summary)
+@findex gnus-summary-hide-all-threads
+Hide all threads (@code{gnus-summary-hide-all-threads}).
+
+@item T t
+@kindex T t (Summary)
+@findex gnus-summary-rethread-current
+Re-thread the current article's thread
+(@code{gnus-summary-rethread-current}).  This works even when the
+summary buffer is otherwise unthreaded.
+
+@item T ^
+@kindex T ^ (Summary)
+@findex gnus-summary-reparent-thread
+Make the current article the child of the marked (or previous) article
+(@code{gnus-summary-reparent-thread}).
+
+@end table
+
+The following commands are thread movement commands.  They all
+understand the numeric prefix.
+
+@table @kbd
+
+@item T n
+@kindex T n (Summary)
+@itemx C-M-f
+@kindex C-M-n (Summary)
+@itemx M-down
+@kindex M-down (Summary)
+@findex gnus-summary-next-thread
+Go to the next thread (@code{gnus-summary-next-thread}).
+
+@item T p
+@kindex T p (Summary)
+@itemx C-M-b
+@kindex C-M-p (Summary)
+@itemx M-up
+@kindex M-up (Summary)
+@findex gnus-summary-prev-thread
+Go to the previous thread (@code{gnus-summary-prev-thread}).
+
+@item T d
+@kindex T d (Summary)
+@findex gnus-summary-down-thread
+Descend the thread (@code{gnus-summary-down-thread}).
+
+@item T u
+@kindex T u (Summary)
+@findex gnus-summary-up-thread
+Ascend the thread (@code{gnus-summary-up-thread}).
+
+@item T o
+@kindex T o (Summary)
+@findex gnus-summary-top-thread
+Go to the top of the thread (@code{gnus-summary-top-thread}).
+@end table
+
+@vindex gnus-thread-operation-ignore-subject
+If you ignore subject while threading, you'll naturally end up with
+threads that have several different subjects in them.  If you then issue
+a command like @kbd{T k} (@code{gnus-summary-kill-thread}) you might not
+wish to kill the entire thread, but just those parts of the thread that
+have the same subject as the current article.  If you like this idea,
+you can fiddle with @code{gnus-thread-operation-ignore-subject}.  If it
+is non-@code{nil} (which it is by default), subjects will be ignored
+when doing thread commands.  If this variable is @code{nil}, articles in
+the same thread with different subjects will not be included in the
+operation in question.  If this variable is @code{fuzzy}, only articles
+that have subjects fuzzily equal will be included (@pxref{Fuzzy
+Matching}).
+
+
+@node Sorting the Summary Buffer
+@section Sorting the Summary Buffer
+
+@findex gnus-thread-sort-by-total-score
+@findex gnus-thread-sort-by-date
+@findex gnus-thread-sort-by-score
+@findex gnus-thread-sort-by-subject
+@findex gnus-thread-sort-by-author
+@findex gnus-thread-sort-by-number
+@findex gnus-thread-sort-by-random
+@vindex gnus-thread-sort-functions
+@findex gnus-thread-sort-by-most-recent-number
+@findex gnus-thread-sort-by-most-recent-date
+If you are using a threaded summary display, you can sort the threads by
+setting @code{gnus-thread-sort-functions}, which can be either a single
+function, a list of functions, or a list containing functions and
+@code{(not some-function)} elements.
+
+By default, sorting is done on article numbers.  Ready-made sorting
+predicate functions include @code{gnus-thread-sort-by-number},
+@code{gnus-thread-sort-by-author}, @code{gnus-thread-sort-by-subject},
+@code{gnus-thread-sort-by-date}, @code{gnus-thread-sort-by-score},
+@code{gnus-thread-sort-by-most-recent-number},
+@code{gnus-thread-sort-by-most-recent-date},
+@code{gnus-thread-sort-by-random} and
+@code{gnus-thread-sort-by-total-score}.
+
+Each function takes two threads and returns non-@code{nil} if the first
+thread should be sorted before the other.  Note that sorting really is
+normally done by looking only at the roots of each thread.
+
+If you use more than one function, the primary sort key should be the
+last function in the list.  You should probably always include
+@code{gnus-thread-sort-by-number} in the list of sorting
+functions---preferably first.  This will ensure that threads that are
+equal with respect to the other sort criteria will be displayed in
+ascending article order.
+
+If you would like to sort by reverse score, then by subject, and finally
+by number, you could do something like:
+
+@lisp
+(setq gnus-thread-sort-functions
+      '(gnus-thread-sort-by-number
+        gnus-thread-sort-by-subject
+        (not gnus-thread-sort-by-total-score)))
+@end lisp
+
+The threads that have highest score will be displayed first in the
+summary buffer.  When threads have the same score, they will be sorted
+alphabetically.  The threads that have the same score and the same
+subject will be sorted by number, which is (normally) the sequence in
+which the articles arrived.
+
+If you want to sort by score and then reverse arrival order, you could
+say something like:
+
+@lisp
+(setq gnus-thread-sort-functions
+      '((lambda (t1 t2)
+          (not (gnus-thread-sort-by-number t1 t2)))
+        gnus-thread-sort-by-score))
+@end lisp
+
+@vindex gnus-thread-score-function
+The function in the @code{gnus-thread-score-function} variable (default
+@code{+}) is used for calculating the total score of a thread.  Useful
+functions might be @code{max}, @code{min}, or squared means, or whatever
+tickles your fancy.
+
+@findex gnus-article-sort-functions
+@findex gnus-article-sort-by-date
+@findex gnus-article-sort-by-score
+@findex gnus-article-sort-by-subject
+@findex gnus-article-sort-by-author
+@findex gnus-article-sort-by-random
+@findex gnus-article-sort-by-number
+If you are using an unthreaded display for some strange reason or
+other, you have to fiddle with the @code{gnus-article-sort-functions}
+variable.  It is very similar to the
+@code{gnus-thread-sort-functions}, except that it uses slightly
+different functions for article comparison.  Available sorting
+predicate functions are @code{gnus-article-sort-by-number},
+@code{gnus-article-sort-by-author},
+@code{gnus-article-sort-by-subject}, @code{gnus-article-sort-by-date},
+@code{gnus-article-sort-by-random}, and
+@code{gnus-article-sort-by-score}.
+
+If you want to sort an unthreaded summary display by subject, you could
+say something like:
+
+@lisp
+(setq gnus-article-sort-functions
+      '(gnus-article-sort-by-number
+        gnus-article-sort-by-subject))
+@end lisp
+
+
+
+@node Asynchronous Fetching
+@section Asynchronous Article Fetching
+@cindex asynchronous article fetching
+@cindex article pre-fetch
+@cindex pre-fetch
+
+If you read your news from an @acronym{NNTP} server that's far away, the
+network latencies may make reading articles a chore.  You have to wait
+for a while after pressing @kbd{n} to go to the next article before the
+article appears.  Why can't Gnus just go ahead and fetch the article
+while you are reading the previous one?  Why not, indeed.
+
+First, some caveats.  There are some pitfalls to using asynchronous
+article fetching, especially the way Gnus does it.
+
+Let's say you are reading article 1, which is short, and article 2 is
+quite long, and you are not interested in reading that.  Gnus does not
+know this, so it goes ahead and fetches article 2.  You decide to read
+article 3, but since Gnus is in the process of fetching article 2, the
+connection is blocked.
+
+To avoid these situations, Gnus will open two (count 'em two)
+connections to the server.  Some people may think this isn't a very nice
+thing to do, but I don't see any real alternatives.  Setting up that
+extra connection takes some time, so Gnus startup will be slower.
+
+Gnus will fetch more articles than you will read.  This will mean that
+the link between your machine and the @acronym{NNTP} server will become more
+loaded than if you didn't use article pre-fetch.  The server itself will
+also become more loaded---both with the extra article requests, and the
+extra connection.
+
+Ok, so now you know that you shouldn't really use this thing@dots{} unless
+you really want to.
+
+@vindex gnus-asynchronous
+Here's how:  Set @code{gnus-asynchronous} to @code{t}.  The rest should
+happen automatically.
+
+@vindex gnus-use-article-prefetch
+You can control how many articles are to be pre-fetched by setting
+@code{gnus-use-article-prefetch}.  This is 30 by default, which means
+that when you read an article in the group, the back end will pre-fetch
+the next 30 articles.  If this variable is @code{t}, the back end will
+pre-fetch all the articles it can without bound.  If it is
+@code{nil}, no pre-fetching will be done.
+
+@vindex gnus-async-prefetch-article-p
+@findex gnus-async-unread-p
+There are probably some articles that you don't want to pre-fetch---read
+articles, for instance.  The @code{gnus-async-prefetch-article-p}
+variable controls whether an article is to be pre-fetched.  This
+function should return non-@code{nil} when the article in question is
+to be pre-fetched.  The default is @code{gnus-async-unread-p}, which
+returns @code{nil} on read articles.  The function is called with an
+article data structure as the only parameter.
+
+If, for instance, you wish to pre-fetch only unread articles shorter
+than 100 lines, you could say something like:
+
+@lisp
+(defun my-async-short-unread-p (data)
+  "Return non-nil for short, unread articles."
+  (and (gnus-data-unread-p data)
+       (< (mail-header-lines (gnus-data-header data))
+          100)))
+
+(setq gnus-async-prefetch-article-p 'my-async-short-unread-p)
+@end lisp
+
+These functions will be called many, many times, so they should
+preferably be short and sweet to avoid slowing down Gnus too much.
+It's probably a good idea to byte-compile things like this.
+
+@vindex gnus-prefetched-article-deletion-strategy
+Articles have to be removed from the asynch buffer sooner or later.  The
+@code{gnus-prefetched-article-deletion-strategy} says when to remove
+articles.  This is a list that may contain the following elements:
+
+@table @code
+@item read
+Remove articles when they are read.
+
+@item exit
+Remove articles when exiting the group.
+@end table
+
+The default value is @code{(read exit)}.
+
+@c @vindex gnus-use-header-prefetch
+@c If @code{gnus-use-header-prefetch} is non-@code{nil}, prefetch articles
+@c from the next group.
+
+
+@node Article Caching
+@section Article Caching
+@cindex article caching
+@cindex caching
+
+If you have an @emph{extremely} slow @acronym{NNTP} connection, you may
+consider turning article caching on.  Each article will then be stored
+locally under your home directory.  As you may surmise, this could
+potentially use @emph{huge} amounts of disk space, as well as eat up all
+your inodes so fast it will make your head swim.  In vodka.
+
+Used carefully, though, it could be just an easier way to save articles.
+
+@vindex gnus-use-long-file-name
+@vindex gnus-cache-directory
+@vindex gnus-use-cache
+To turn caching on, set @code{gnus-use-cache} to @code{t}.  By default,
+all articles ticked or marked as dormant will then be copied
+over to your local cache (@code{gnus-cache-directory}).  Whether this
+cache is flat or hierarchical is controlled by the
+@code{gnus-use-long-file-name} variable, as usual.
+
+When re-selecting a ticked or dormant article, it will be fetched from the
+cache instead of from the server.  As articles in your cache will never
+expire, this might serve as a method of saving articles while still
+keeping them where they belong.  Just mark all articles you want to save
+as dormant, and don't worry.
+
+When an article is marked as read, is it removed from the cache.
+
+@vindex gnus-cache-remove-articles
+@vindex gnus-cache-enter-articles
+The entering/removal of articles from the cache is controlled by the
+@code{gnus-cache-enter-articles} and @code{gnus-cache-remove-articles}
+variables.  Both are lists of symbols.  The first is @code{(ticked
+dormant)} by default, meaning that ticked and dormant articles will be
+put in the cache.  The latter is @code{(read)} by default, meaning that
+articles marked as read are removed from the cache.  Possibly
+symbols in these two lists are @code{ticked}, @code{dormant},
+@code{unread} and @code{read}.
+
+@findex gnus-jog-cache
+So where does the massive article-fetching and storing come into the
+picture?  The @code{gnus-jog-cache} command will go through all
+subscribed newsgroups, request all unread articles, score them, and
+store them in the cache.  You should only ever, ever ever ever, use this
+command if 1) your connection to the @acronym{NNTP} server is really, really,
+really slow and 2) you have a really, really, really huge disk.
+Seriously.  One way to cut down on the number of articles downloaded is
+to score unwanted articles down and have them marked as read.  They will
+not then be downloaded by this command.
+
+@vindex gnus-uncacheable-groups
+@vindex gnus-cacheable-groups
+It is likely that you do not want caching on all groups.  For instance,
+if your @code{nnml} mail is located under your home directory, it makes no
+sense to cache it somewhere else under your home directory.  Unless you
+feel that it's neat to use twice as much space.
+
+To limit the caching, you could set @code{gnus-cacheable-groups} to a
+regexp of groups to cache, @samp{^nntp} for instance, or set the
+@code{gnus-uncacheable-groups} regexp to @samp{^nnml}, for instance.
+Both variables are @code{nil} by default.  If a group matches both
+variables, the group is not cached.
+
+@findex gnus-cache-generate-nov-databases
+@findex gnus-cache-generate-active
+@vindex gnus-cache-active-file
+The cache stores information on what articles it contains in its active
+file (@code{gnus-cache-active-file}).  If this file (or any other parts
+of the cache) becomes all messed up for some reason or other, Gnus
+offers two functions that will try to set things right.  @kbd{M-x
+gnus-cache-generate-nov-databases} will (re)build all the @acronym{NOV}
+files, and @kbd{gnus-cache-generate-active} will (re)generate the active
+file.
+
+@findex gnus-cache-move-cache
+@code{gnus-cache-move-cache} will move your whole
+@code{gnus-cache-directory} to some other location.  You get asked to
+where, isn't that cool?
+
+@node Persistent Articles
+@section Persistent Articles
+@cindex persistent articles
+
+Closely related to article caching, we have @dfn{persistent articles}.
+In fact, it's just a different way of looking at caching, and much more
+useful in my opinion.
+
+Say you're reading a newsgroup, and you happen on to some valuable gem
+that you want to keep and treasure forever.  You'd normally just save it
+(using one of the many saving commands) in some file.  The problem with
+that is that it's just, well, yucky.  Ideally you'd prefer just having
+the article remain in the group where you found it forever; untouched by
+the expiry going on at the news server.
+
+This is what a @dfn{persistent article} is---an article that just won't
+be deleted.  It's implemented using the normal cache functions, but
+you use two explicit commands for managing persistent articles:
+
+@table @kbd
+
+@item *
+@kindex * (Summary)
+@findex gnus-cache-enter-article
+Make the current article persistent (@code{gnus-cache-enter-article}).
+
+@item M-*
+@kindex M-* (Summary)
+@findex gnus-cache-remove-article
+Remove the current article from the persistent articles
+(@code{gnus-cache-remove-article}).  This will normally delete the
+article.
+@end table
+
+Both these commands understand the process/prefix convention.
+
+To avoid having all ticked articles (and stuff) entered into the cache,
+you should set @code{gnus-use-cache} to @code{passive} if you're just
+interested in persistent articles:
+
+@lisp
+(setq gnus-use-cache 'passive)
+@end lisp
+
+
+@node Article Backlog
+@section Article Backlog
+@cindex backlog
+@cindex article backlog
+
+If you have a slow connection, but the idea of using caching seems
+unappealing to you (and it is, really), you can help the situation some
+by switching on the @dfn{backlog}.  This is where Gnus will buffer
+already read articles so that it doesn't have to re-fetch articles
+you've already read.  This only helps if you are in the habit of
+re-selecting articles you've recently read, of course.  If you never do
+that, turning the backlog on will slow Gnus down a little bit, and
+increase memory usage some.
+
+@vindex gnus-keep-backlog
+If you set @code{gnus-keep-backlog} to a number @var{n}, Gnus will store
+at most @var{n} old articles in a buffer for later re-fetching.  If this
+variable is non-@code{nil} and is not a number, Gnus will store
+@emph{all} read articles, which means that your Emacs will grow without
+bound before exploding and taking your machine down with you.  I put
+that in there just to keep y'all on your toes.
+
+The default value is 20.
+
+
+@node Saving Articles
+@section Saving Articles
+@cindex saving articles
+
+Gnus can save articles in a number of ways.  Below is the documentation
+for saving articles in a fairly straight-forward fashion (i.e., little
+processing of the article is done before it is saved).  For a different
+approach (uudecoding, unsharing) you should use @code{gnus-uu}
+(@pxref{Decoding Articles}).
+
+For the commands listed here, the target is a file.  If you want to
+save to a group, see the @kbd{B c} (@code{gnus-summary-copy-article})
+command (@pxref{Mail Group Commands}).
+
+@vindex gnus-save-all-headers
+If @code{gnus-save-all-headers} is non-@code{nil}, Gnus will not delete
+unwanted headers before saving the article.
+
+@vindex gnus-saved-headers
+If the preceding variable is @code{nil}, all headers that match the
+@code{gnus-saved-headers} regexp will be kept, while the rest will be
+deleted before saving.
+
+@table @kbd
+
+@item O o
+@itemx o
+@kindex O o (Summary)
+@kindex o (Summary)
+@findex gnus-summary-save-article
+@c @icon{gnus-summary-save-article}
+Save the current article using the default article saver
+(@code{gnus-summary-save-article}).
+
+@item O m
+@kindex O m (Summary)
+@findex gnus-summary-save-article-mail
+Save the current article in a Unix mail box (mbox) file
+(@code{gnus-summary-save-article-mail}).
+
+@item O r
+@kindex O r (Summary)
+@findex gnus-summary-save-article-rmail
+Save the current article in Rmail format
+(@code{gnus-summary-save-article-rmail}).
+
+@item O f
+@kindex O f (Summary)
+@findex gnus-summary-save-article-file
+@c @icon{gnus-summary-save-article-file}
+Save the current article in plain file format
+(@code{gnus-summary-save-article-file}).
+
+@item O F
+@kindex O F (Summary)
+@findex gnus-summary-write-article-file
+Write the current article in plain file format, overwriting any previous
+file contents (@code{gnus-summary-write-article-file}).
+
+@item O b
+@kindex O b (Summary)
+@findex gnus-summary-save-article-body-file
+Save the current article body in plain file format
+(@code{gnus-summary-save-article-body-file}).
+
+@item O h
+@kindex O h (Summary)
+@findex gnus-summary-save-article-folder
+Save the current article in mh folder format
+(@code{gnus-summary-save-article-folder}).
+
+@item O v
+@kindex O v (Summary)
+@findex gnus-summary-save-article-vm
+Save the current article in a VM folder
+(@code{gnus-summary-save-article-vm}).
+
+@item O p
+@itemx |
+@kindex O p (Summary)
+@kindex | (Summary)
+@findex gnus-summary-pipe-output
+Save the current article in a pipe.  Uhm, like, what I mean is---Pipe
+the current article to a process (@code{gnus-summary-pipe-output}).
+If given a symbolic prefix (@pxref{Symbolic Prefixes}), include the
+complete headers in the piped output.
+
+@item O P
+@kindex O P (Summary)
+@findex gnus-summary-muttprint
+@vindex gnus-summary-muttprint-program
+Save the current article into muttprint.  That is, print it using the
+external program @uref{http://muttprint.sourceforge.net/,
+Muttprint}.  The program name and options to use is controlled by the
+variable @code{gnus-summary-muttprint-program}.
+(@code{gnus-summary-muttprint}).
+
+@end table
+
+@vindex gnus-prompt-before-saving
+All these commands use the process/prefix convention
+(@pxref{Process/Prefix}).  If you save bunches of articles using these
+functions, you might get tired of being prompted for files to save each
+and every article in.  The prompting action is controlled by
+the @code{gnus-prompt-before-saving} variable, which is @code{always} by
+default, giving you that excessive prompting action you know and
+loathe.  If you set this variable to @code{t} instead, you'll be prompted
+just once for each series of articles you save.  If you like to really
+have Gnus do all your thinking for you, you can even set this variable
+to @code{nil}, which means that you will never be prompted for files to
+save articles in.  Gnus will simply save all the articles in the default
+files.
+
+
+@vindex gnus-default-article-saver
+You can customize the @code{gnus-default-article-saver} variable to make
+Gnus do what you want it to.  You can use any of the eight ready-made
+functions below, or you can create your own.
+
+@table @code
+
+@item gnus-summary-save-in-rmail
+@findex gnus-summary-save-in-rmail
+@vindex gnus-rmail-save-name
+@findex gnus-plain-save-name
+This is the default format, @dfn{Babyl}.  Uses the function in the
+@code{gnus-rmail-save-name} variable to get a file name to save the
+article in.  The default is @code{gnus-plain-save-name}.
+
+@item gnus-summary-save-in-mail
+@findex gnus-summary-save-in-mail
+@vindex gnus-mail-save-name
+Save in a Unix mail (mbox) file.  Uses the function in the
+@code{gnus-mail-save-name} variable to get a file name to save the
+article in.  The default is @code{gnus-plain-save-name}.
+
+@item gnus-summary-save-in-file
+@findex gnus-summary-save-in-file
+@vindex gnus-file-save-name
+@findex gnus-numeric-save-name
+Append the article straight to an ordinary file.  Uses the function in
+the @code{gnus-file-save-name} variable to get a file name to save the
+article in.  The default is @code{gnus-numeric-save-name}.
+
+@item gnus-summary-write-to-file
+@findex gnus-summary-write-to-file
+Write the article straight to an ordinary file.  The file is
+overwritten if it exists.  Uses the function in the
+@code{gnus-file-save-name} variable to get a file name to save the
+article in.  The default is @code{gnus-numeric-save-name}.
+
+@item gnus-summary-save-body-in-file
+@findex gnus-summary-save-body-in-file
+Append the article body to an ordinary file.  Uses the function in the
+@code{gnus-file-save-name} variable to get a file name to save the
+article in.  The default is @code{gnus-numeric-save-name}.
+
+@item gnus-summary-write-body-to-file
+@findex gnus-summary-write-body-to-file
+Write the article body straight to an ordinary file.  The file is
+overwritten if it exists.  Uses the function in the
+@code{gnus-file-save-name} variable to get a file name to save the
+article in.  The default is @code{gnus-numeric-save-name}.
+
+@item gnus-summary-save-in-folder
+@findex gnus-summary-save-in-folder
+@findex gnus-folder-save-name
+@findex gnus-Folder-save-name
+@vindex gnus-folder-save-name
+@cindex rcvstore
+@cindex MH folders
+Save the article to an MH folder using @code{rcvstore} from the MH
+library.  Uses the function in the @code{gnus-folder-save-name} variable
+to get a file name to save the article in.  The default is
+@code{gnus-folder-save-name}, but you can also use
+@code{gnus-Folder-save-name}, which creates capitalized names.
+
+@item gnus-summary-save-in-vm
+@findex gnus-summary-save-in-vm
+Save the article in a VM folder.  You have to have the VM mail
+reader to use this setting.
+@end table
+
+The symbol of each function may have the following properties:
+
+@table @code
+@item :decode
+The value non-@code{nil} means save decoded articles.  This is
+meaningful only with @code{gnus-summary-save-in-file},
+@code{gnus-summary-save-body-in-file},
+@code{gnus-summary-write-to-file}, and
+@code{gnus-summary-write-body-to-file}.
+
+@item :function
+The value specifies an alternative function which appends, not
+overwrites, articles to a file.  This implies that when saving many
+articles at a time, @code{gnus-prompt-before-saving} is bound to
+@code{t} and all articles are saved in a single file.  This is
+meaningful only with @code{gnus-summary-write-to-file} and
+@code{gnus-summary-write-body-to-file}.
+
+@item :headers
+The value specifies the symbol of a variable of which the value
+specifies headers to be saved.  If it is omitted,
+@code{gnus-save-all-headers} and @code{gnus-saved-headers} control what
+headers should be saved.
+@end table
+
+@vindex gnus-article-save-directory
+All of these functions, except for the last one, will save the article
+in the @code{gnus-article-save-directory}, which is initialized from the
+@env{SAVEDIR} environment variable.  This is @file{~/News/} by
+default.
+
+As you can see above, the functions use different functions to find a
+suitable name of a file to save the article in.  Below is a list of
+available functions that generate names:
+
+@table @code
+
+@item gnus-Numeric-save-name
+@findex gnus-Numeric-save-name
+File names like @file{~/News/Alt.andrea-dworkin/45}.
+
+@item gnus-numeric-save-name
+@findex gnus-numeric-save-name
+File names like @file{~/News/alt.andrea-dworkin/45}.
+
+@item gnus-Plain-save-name
+@findex gnus-Plain-save-name
+File names like @file{~/News/Alt.andrea-dworkin}.
+
+@item gnus-plain-save-name
+@findex gnus-plain-save-name
+File names like @file{~/News/alt.andrea-dworkin}.
+
+@item gnus-sender-save-name
+@findex gnus-sender-save-name
+File names like @file{~/News/larsi}.
+@end table
+
+@vindex gnus-split-methods
+You can have Gnus suggest where to save articles by plonking a regexp into
+the @code{gnus-split-methods} alist.  For instance, if you would like to
+save articles related to Gnus in the file @file{gnus-stuff}, and articles
+related to VM in @file{vm-stuff}, you could set this variable to something
+like:
+
+@lisp
+(("^Subject:.*gnus\\|^Newsgroups:.*gnus" "gnus-stuff")
+ ("^Subject:.*vm\\|^Xref:.*vm" "vm-stuff")
+ (my-choosing-function "../other-dir/my-stuff")
+ ((equal gnus-newsgroup-name "mail.misc") "mail-stuff"))
+@end lisp
+
+We see that this is a list where each element is a list that has two
+elements---the @dfn{match} and the @dfn{file}.  The match can either be
+a string (in which case it is used as a regexp to match on the article
+head); it can be a symbol (which will be called as a function with the
+group name as a parameter); or it can be a list (which will be
+@code{eval}ed).  If any of these actions have a non-@code{nil} result,
+the @dfn{file} will be used as a default prompt.  In addition, the
+result of the operation itself will be used if the function or form
+called returns a string or a list of strings.
+
+You basically end up with a list of file names that might be used when
+saving the current article.  (All ``matches'' will be used.)  You will
+then be prompted for what you really want to use as a name, with file
+name completion over the results from applying this variable.
+
+This variable is @code{((gnus-article-archive-name))} by default, which
+means that Gnus will look at the articles it saves for an
+@code{Archive-name} line and use that as a suggestion for the file
+name.
+
+Here's an example function to clean up file names somewhat.  If you have
+lots of mail groups called things like
+@samp{nnml:mail.whatever}, you may want to chop off the beginning of
+these group names before creating the file name to save to.  The
+following will do just that:
+
+@lisp
+(defun my-save-name (group)
+  (when (string-match "^nnml:mail." group)
+    (substring group (match-end 0))))
+
+(setq gnus-split-methods
+      '((gnus-article-archive-name)
+        (my-save-name)))
+@end lisp
+
+
+@vindex gnus-use-long-file-name
+Finally, you have the @code{gnus-use-long-file-name} variable.  If it is
+@code{nil}, all the preceding functions will replace all periods
+(@samp{.}) in the group names with slashes (@samp{/})---which means that
+the functions will generate hierarchies of directories instead of having
+all the files in the top level directory
+(@file{~/News/alt/andrea-dworkin} instead of
+@file{~/News/alt.andrea-dworkin}.)  This variable is @code{t} by default
+on most systems.  However, for historical reasons, this is @code{nil} on
+Xenix and usg-unix-v machines by default.
+
+This function also affects kill and score file names.  If this variable
+is a list, and the list contains the element @code{not-score}, long file
+names will not be used for score files, if it contains the element
+@code{not-save}, long file names will not be used for saving, and if it
+contains the element @code{not-kill}, long file names will not be used
+for kill files.
+
+If you'd like to save articles in a hierarchy that looks something like
+a spool, you could
+
+@lisp
+(setq gnus-use-long-file-name '(not-save)) ; @r{to get a hierarchy}
+(setq gnus-default-article-saver
+      'gnus-summary-save-in-file)          ; @r{no encoding}
+@end lisp
+
+Then just save with @kbd{o}.  You'd then read this hierarchy with
+ephemeral @code{nneething} groups---@kbd{G D} in the group buffer, and
+the top level directory as the argument (@file{~/News/}).  Then just walk
+around to the groups/directories with @code{nneething}.
+
+
+@node Decoding Articles
+@section Decoding Articles
+@cindex decoding articles
+
+Sometime users post articles (or series of articles) that have been
+encoded in some way or other.  Gnus can decode them for you.
+
+@menu
+* Uuencoded Articles::          Uudecode articles.
+* Shell Archives::              Unshar articles.
+* PostScript Files::            Split PostScript.
+* Other Files::                 Plain save and binhex.
+* Decoding Variables::          Variables for a happy decoding.
+* Viewing Files::               You want to look at the result of the decoding?
+@end menu
+
+@cindex series
+@cindex article series
+All these functions use the process/prefix convention
+(@pxref{Process/Prefix}) for finding out what articles to work on, with
+the extension that a ``single article'' means ``a single series''.  Gnus
+can find out by itself what articles belong to a series, decode all the
+articles and unpack/view/save the resulting file(s).
+
+Gnus guesses what articles are in the series according to the following
+simplish rule: The subjects must be (nearly) identical, except for the
+last two numbers of the line.  (Spaces are largely ignored, however.)
+
+For example: If you choose a subject called @samp{cat.gif (2/3)}, Gnus
+will find all the articles that match the regexp @samp{^cat.gif
+([0-9]+/[0-9]+).*$}.
+
+Subjects that are non-standard, like @samp{cat.gif (2/3) Part 6 of a
+series}, will not be properly recognized by any of the automatic viewing
+commands, and you have to mark the articles manually with @kbd{#}.
+
+
+@node Uuencoded Articles
+@subsection Uuencoded Articles
+@cindex uudecode
+@cindex uuencoded articles
+
+@table @kbd
+
+@item X u
+@kindex X u (Summary)
+@findex gnus-uu-decode-uu
+@c @icon{gnus-uu-decode-uu}
+Uudecodes the current series (@code{gnus-uu-decode-uu}).
+
+@item X U
+@kindex X U (Summary)
+@findex gnus-uu-decode-uu-and-save
+Uudecodes and saves the current series
+(@code{gnus-uu-decode-uu-and-save}).
+
+@item X v u
+@kindex X v u (Summary)
+@findex gnus-uu-decode-uu-view
+Uudecodes and views the current series (@code{gnus-uu-decode-uu-view}).
+
+@item X v U
+@kindex X v U (Summary)
+@findex gnus-uu-decode-uu-and-save-view
+Uudecodes, views and saves the current series
+(@code{gnus-uu-decode-uu-and-save-view}).
+
+@end table
+
+Remember that these all react to the presence of articles marked with
+the process mark.  If, for instance, you'd like to decode and save an
+entire newsgroup, you'd typically do @kbd{M P a}
+(@code{gnus-uu-mark-all}) and then @kbd{X U}
+(@code{gnus-uu-decode-uu-and-save}).
+
+All this is very much different from how @code{gnus-uu} worked with
+@sc{gnus 4.1}, where you had explicit keystrokes for everything under
+the sun.  This version of @code{gnus-uu} generally assumes that you mark
+articles in some way (@pxref{Setting Process Marks}) and then press
+@kbd{X u}.
+
+@vindex gnus-uu-notify-files
+Note: When trying to decode articles that have names matching
+@code{gnus-uu-notify-files}, which is hard-coded to
+@samp{[Cc][Ii][Nn][Dd][Yy][0-9]+.\\(gif\\|jpg\\)}, @code{gnus-uu} will
+automatically post an article on @samp{comp.unix.wizards} saying that
+you have just viewed the file in question.  This feature can't be turned
+off.
+
+
+@node Shell Archives
+@subsection Shell Archives
+@cindex unshar
+@cindex shell archives
+@cindex shared articles
+
+Shell archives (``shar files'') used to be a popular way to distribute
+sources, but it isn't used all that much today.  In any case, we have
+some commands to deal with these:
+
+@table @kbd
+
+@item X s
+@kindex X s (Summary)
+@findex gnus-uu-decode-unshar
+Unshars the current series (@code{gnus-uu-decode-unshar}).
+
+@item X S
+@kindex X S (Summary)
+@findex gnus-uu-decode-unshar-and-save
+Unshars and saves the current series (@code{gnus-uu-decode-unshar-and-save}).
+
+@item X v s
+@kindex X v s (Summary)
+@findex gnus-uu-decode-unshar-view
+Unshars and views the current series (@code{gnus-uu-decode-unshar-view}).
+
+@item X v S
+@kindex X v S (Summary)
+@findex gnus-uu-decode-unshar-and-save-view
+Unshars, views and saves the current series
+(@code{gnus-uu-decode-unshar-and-save-view}).
+@end table
+
+
+@node PostScript Files
+@subsection PostScript Files
+@cindex PostScript
+
+@table @kbd
+
+@item X p
+@kindex X p (Summary)
+@findex gnus-uu-decode-postscript
+Unpack the current PostScript series (@code{gnus-uu-decode-postscript}).
+
+@item X P
+@kindex X P (Summary)
+@findex gnus-uu-decode-postscript-and-save
+Unpack and save the current PostScript series
+(@code{gnus-uu-decode-postscript-and-save}).
+
+@item X v p
+@kindex X v p (Summary)
+@findex gnus-uu-decode-postscript-view
+View the current PostScript series
+(@code{gnus-uu-decode-postscript-view}).
+
+@item X v P
+@kindex X v P (Summary)
+@findex gnus-uu-decode-postscript-and-save-view
+View and save the current PostScript series
+(@code{gnus-uu-decode-postscript-and-save-view}).
+@end table
+
+
+@node Other Files
+@subsection Other Files
+
+@table @kbd
+@item X o
+@kindex X o (Summary)
+@findex gnus-uu-decode-save
+Save the current series
+(@code{gnus-uu-decode-save}).
+
+@item X b
+@kindex X b (Summary)
+@findex gnus-uu-decode-binhex
+Unbinhex the current series (@code{gnus-uu-decode-binhex}).  This
+doesn't really work yet.
+@end table
+
+
+@node Decoding Variables
+@subsection Decoding Variables
+
+Adjective, not verb.
+
+@menu
+* Rule Variables::              Variables that say how a file is to be viewed.
+* Other Decode Variables::      Other decode variables.
+* Uuencoding and Posting::      Variables for customizing uuencoding.
+@end menu
+
+
+@node Rule Variables
+@subsubsection Rule Variables
+@cindex rule variables
+
+Gnus uses @dfn{rule variables} to decide how to view a file.  All these
+variables are of the form
+
+@lisp
+      (list '(regexp1 command2)
+            '(regexp2 command2)
+            ...)
+@end lisp
+
+@table @code
+
+@item gnus-uu-user-view-rules
+@vindex gnus-uu-user-view-rules
+@cindex sox
+This variable is consulted first when viewing files.  If you wish to use,
+for instance, @code{sox} to convert an @file{.au} sound file, you could
+say something like:
+@lisp
+(setq gnus-uu-user-view-rules
+      (list '("\\\\.au$" "sox %s -t .aiff > /dev/audio")))
+@end lisp
+
+@item gnus-uu-user-view-rules-end
+@vindex gnus-uu-user-view-rules-end
+This variable is consulted if Gnus couldn't make any matches from the
+user and default view rules.
+
+@item gnus-uu-user-archive-rules
+@vindex gnus-uu-user-archive-rules
+This variable can be used to say what commands should be used to unpack
+archives.
+@end table
+
+
+@node Other Decode Variables
+@subsubsection Other Decode Variables
+
+@table @code
+@vindex gnus-uu-grabbed-file-functions
+
+@item gnus-uu-grabbed-file-functions
+All functions in this list will be called right after each file has been
+successfully decoded---so that you can move or view files right away,
+and don't have to wait for all files to be decoded before you can do
+anything.  Ready-made functions you can put in this list are:
+
+@table @code
+
+@item gnus-uu-grab-view
+@findex gnus-uu-grab-view
+View the file.
+
+@item gnus-uu-grab-move
+@findex gnus-uu-grab-move
+Move the file (if you're using a saving function.)
+@end table
+
+@item gnus-uu-be-dangerous
+@vindex gnus-uu-be-dangerous
+Specifies what to do if unusual situations arise during decoding.  If
+@code{nil}, be as conservative as possible.  If @code{t}, ignore things
+that didn't work, and overwrite existing files.  Otherwise, ask each
+time.
+
+@item gnus-uu-ignore-files-by-name
+@vindex gnus-uu-ignore-files-by-name
+Files with name matching this regular expression won't be viewed.
+
+@item gnus-uu-ignore-files-by-type
+@vindex gnus-uu-ignore-files-by-type
+Files with a @acronym{MIME} type matching this variable won't be viewed.
+Note that Gnus tries to guess what type the file is based on the name.
+@code{gnus-uu} is not a @acronym{MIME} package (yet), so this is slightly
+kludgey.
+
+@item gnus-uu-tmp-dir
+@vindex gnus-uu-tmp-dir
+Where @code{gnus-uu} does its work.
+
+@item gnus-uu-do-not-unpack-archives
+@vindex gnus-uu-do-not-unpack-archives
+Non-@code{nil} means that @code{gnus-uu} won't peek inside archives
+looking for files to display.
+
+@item gnus-uu-view-and-save
+@vindex gnus-uu-view-and-save
+Non-@code{nil} means that the user will always be asked to save a file
+after viewing it.
+
+@item gnus-uu-ignore-default-view-rules
+@vindex gnus-uu-ignore-default-view-rules
+Non-@code{nil} means that @code{gnus-uu} will ignore the default viewing
+rules.
+
+@item gnus-uu-ignore-default-archive-rules
+@vindex gnus-uu-ignore-default-archive-rules
+Non-@code{nil} means that @code{gnus-uu} will ignore the default archive
+unpacking commands.
+
+@item gnus-uu-kill-carriage-return
+@vindex gnus-uu-kill-carriage-return
+Non-@code{nil} means that @code{gnus-uu} will strip all carriage returns
+from articles.
+
+@item gnus-uu-unmark-articles-not-decoded
+@vindex gnus-uu-unmark-articles-not-decoded
+Non-@code{nil} means that @code{gnus-uu} will mark unsuccessfully
+decoded articles as unread.
+
+@item gnus-uu-correct-stripped-uucode
+@vindex gnus-uu-correct-stripped-uucode
+Non-@code{nil} means that @code{gnus-uu} will @emph{try} to fix
+uuencoded files that have had trailing spaces deleted.
+
+@item gnus-uu-pre-uudecode-hook
+@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
+decoding, will save in digests.  If this variable is @code{nil},
+@code{gnus-uu} will just save everything in a file without any
+embellishments.  The digesting almost conforms to RFC 1153---no easy way
+to specify any meaningful volume and issue numbers were found, so I
+simply dropped them.
+
+@end table
+
+
+@node Uuencoding and Posting
+@subsubsection Uuencoding and Posting
+
+@table @code
+
+@item gnus-uu-post-include-before-composing
+@vindex gnus-uu-post-include-before-composing
+Non-@code{nil} means that @code{gnus-uu} will ask for a file to encode
+before you compose the article.  If this variable is @code{t}, you can
+either include an encoded file with @kbd{C-c C-i} or have one included
+for you when you post the article.
+
+@item gnus-uu-post-length
+@vindex gnus-uu-post-length
+Maximum length of an article.  The encoded file will be split into how
+many articles it takes to post the entire file.
+
+@item gnus-uu-post-threaded
+@vindex gnus-uu-post-threaded
+Non-@code{nil} means that @code{gnus-uu} will post the encoded file in a
+thread.  This may not be smart, as no other decoder I have seen is able
+to follow threads when collecting uuencoded articles.  (Well, I have
+seen one package that does that---@code{gnus-uu}, but somehow, I don't
+think that counts@dots{}) Default is @code{nil}.
+
+@item gnus-uu-post-separate-description
+@vindex gnus-uu-post-separate-description
+Non-@code{nil} means that the description will be posted in a separate
+article.  The first article will typically be numbered (0/x).  If this
+variable is @code{nil}, the description the user enters will be included
+at the beginning of the first article, which will be numbered (1/x).
+Default is @code{t}.
+
+@end table
+
+
+@node Viewing Files
+@subsection Viewing Files
+@cindex viewing files
+@cindex pseudo-articles
+
+After decoding, if the file is some sort of archive, Gnus will attempt
+to unpack the archive and see if any of the files in the archive can be
+viewed.  For instance, if you have a gzipped tar file @file{pics.tar.gz}
+containing the files @file{pic1.jpg} and @file{pic2.gif}, Gnus will
+uncompress and de-tar the main file, and then view the two pictures.
+This unpacking process is recursive, so if the archive contains archives
+of archives, it'll all be unpacked.
+
+Finally, Gnus will normally insert a @dfn{pseudo-article} for each
+extracted file into the summary buffer.  If you go to these
+``articles'', you will be prompted for a command to run (usually Gnus
+will make a suggestion), and then the command will be run.
+
+@vindex gnus-view-pseudo-asynchronously
+If @code{gnus-view-pseudo-asynchronously} is @code{nil}, Emacs will wait
+until the viewing is done before proceeding.
+
+@vindex gnus-view-pseudos
+If @code{gnus-view-pseudos} is @code{automatic}, Gnus will not insert
+the pseudo-articles into the summary buffer, but view them
+immediately.  If this variable is @code{not-confirm}, the user won't even
+be asked for a confirmation before viewing is done.
+
+@vindex gnus-view-pseudos-separately
+If @code{gnus-view-pseudos-separately} is non-@code{nil}, one
+pseudo-article will be created for each file to be viewed.  If
+@code{nil}, all files that use the same viewing command will be given as
+a list of parameters to that command.
+
+@vindex gnus-insert-pseudo-articles
+If @code{gnus-insert-pseudo-articles} is non-@code{nil}, insert
+pseudo-articles when decoding.  It is @code{t} by default.
+
+So; there you are, reading your @emph{pseudo-articles} in your
+@emph{virtual newsgroup} from the @emph{virtual server}; and you think:
+Why isn't anything real anymore? How did we get here?
+
+
+@node Article Treatment
+@section Article Treatment
+
+Reading through this huge manual, you may have quite forgotten that the
+object of newsreaders is to actually, like, read what people have
+written.  Reading articles.  Unfortunately, people are quite bad at
+writing, so there are tons of functions and variables to make reading
+these articles easier.
+
+@menu
+* Article Highlighting::        You want to make the article look like fruit salad.
+* Article Fontisizing::         Making emphasized text look nice.
+* Article Hiding::              You also want to make certain info go away.
+* Article Washing::             Lots of way-neat functions to make life better.
+* Article Header::              Doing various header transformations.
+* Article Buttons::             Click on URLs, Message-IDs, addresses and the like.
+* Article Button Levels::       Controlling appearance of buttons.
+* Article Date::                Grumble, UT!
+* Article Display::             Display various stuff---X-Face, Picons, Smileys
+* Article Signature::           What is a signature?
+* Article Miscellanea::         Various other stuff.
+@end menu
+
+
+@node Article Highlighting
+@subsection Article Highlighting
+@cindex highlighting
+
+Not only do you want your article buffer to look like fruit salad, but
+you want it to look like technicolor fruit salad.
+
+@table @kbd
+
+@item W H a
+@kindex W H a (Summary)
+@findex gnus-article-highlight
+@findex gnus-article-maybe-highlight
+Do much highlighting of the current article
+(@code{gnus-article-highlight}).  This function highlights header, cited
+text, the signature, and adds buttons to the body and the head.
+
+@item W H h
+@kindex W H h (Summary)
+@findex gnus-article-highlight-headers
+@vindex gnus-header-face-alist
+Highlight the headers (@code{gnus-article-highlight-headers}).  The
+highlighting will be done according to the @code{gnus-header-face-alist}
+variable, which is a list where each element has the form
+@code{(@var{regexp} @var{name} @var{content})}.
+@var{regexp} is a regular expression for matching the
+header, @var{name} is the face used for highlighting the header name
+(@pxref{Faces and Fonts}) and @var{content} is the face for highlighting
+the header value.  The first match made will be used.  Note that
+@var{regexp} shouldn't have @samp{^} prepended---Gnus will add one.
+
+@item W H c
+@kindex W H c (Summary)
+@findex gnus-article-highlight-citation
+Highlight cited text (@code{gnus-article-highlight-citation}).
+
+Some variables to customize the citation highlights:
+
+@table @code
+@vindex gnus-cite-parse-max-size
+
+@item gnus-cite-parse-max-size
+If the article size in bytes is bigger than this variable (which is
+25000 by default), no citation highlighting will be performed.
+
+@item gnus-cite-max-prefix
+@vindex gnus-cite-max-prefix
+Maximum possible length for a citation prefix (default 20).
+
+@item gnus-cite-face-list
+@vindex gnus-cite-face-list
+List of faces used for highlighting citations (@pxref{Faces and Fonts}).
+When there are citations from multiple articles in the same message,
+Gnus will try to give each citation from each article its own face.
+This should make it easier to see who wrote what.
+
+@item gnus-supercite-regexp
+@vindex gnus-supercite-regexp
+Regexp matching normal Supercite attribution lines.
+
+@item gnus-supercite-secondary-regexp
+@vindex gnus-supercite-secondary-regexp
+Regexp matching mangled Supercite attribution lines.
+
+@item gnus-cite-minimum-match-count
+@vindex gnus-cite-minimum-match-count
+Minimum number of identical prefixes we have to see before we believe
+that it's a citation.
+
+@item gnus-cite-attribution-prefix
+@vindex gnus-cite-attribution-prefix
+Regexp matching the beginning of an attribution line.
+
+@item gnus-cite-attribution-suffix
+@vindex gnus-cite-attribution-suffix
+Regexp matching the end of an attribution line.
+
+@item gnus-cite-attribution-face
+@vindex gnus-cite-attribution-face
+Face used for attribution lines.  It is merged with the face for the
+cited text belonging to the attribution.
+
+@item gnus-cite-ignore-quoted-from
+@vindex gnus-cite-ignore-quoted-from
+If non-@code{nil}, no citation highlighting will be performed on lines
+beginning with @samp{>From }.  Those lines may have been quoted by MTAs
+in order not to mix up with the envelope From line.  The default value
+is @code{t}.
+
+@end table
+
+
+@item W H s
+@kindex W H s (Summary)
+@vindex gnus-signature-separator
+@vindex gnus-signature-face
+@findex gnus-article-highlight-signature
+Highlight the signature (@code{gnus-article-highlight-signature}).
+Everything after @code{gnus-signature-separator} (@pxref{Article
+Signature}) in an article will be considered a signature and will be
+highlighted with @code{gnus-signature-face}, which is @code{italic} by
+default.
+
+@end table
+
+@xref{Customizing Articles}, for how to highlight articles automatically.
+
+
+@node Article Fontisizing
+@subsection Article Fontisizing
+@cindex emphasis
+@cindex article emphasis
+
+@findex gnus-article-emphasize
+@kindex W e (Summary)
+People commonly add emphasis to words in news articles by writing things
+like @samp{_this_} or @samp{*this*} or @samp{/this/}.  Gnus can make
+this look nicer by running the article through the @kbd{W e}
+(@code{gnus-article-emphasize}) command.
+
+@vindex gnus-emphasis-alist
+How the emphasis is computed is controlled by the
+@code{gnus-emphasis-alist} variable.  This is an alist where the first
+element is a regular expression to be matched.  The second is a number
+that says what regular expression grouping is used to find the entire
+emphasized word.  The third is a number that says what regexp grouping
+should be displayed and highlighted.  (The text between these two
+groupings will be hidden.)  The fourth is the face used for
+highlighting.
+
+@lisp
+(setq gnus-emphasis-alist
+      '(("_\\(\\w+\\)_" 0 1 gnus-emphasis-underline)
+        ("\\*\\(\\w+\\)\\*" 0 1 gnus-emphasis-bold)))
+@end lisp
+
+@cindex slash
+@cindex asterisk
+@cindex underline
+@cindex /
+@cindex *
+
+@vindex gnus-emphasis-underline
+@vindex gnus-emphasis-bold
+@vindex gnus-emphasis-italic
+@vindex gnus-emphasis-underline-bold
+@vindex gnus-emphasis-underline-italic
+@vindex gnus-emphasis-bold-italic
+@vindex gnus-emphasis-underline-bold-italic
+By default, there are seven rules, and they use the following faces:
+@code{gnus-emphasis-bold}, @code{gnus-emphasis-italic},
+@code{gnus-emphasis-underline}, @code{gnus-emphasis-bold-italic},
+@code{gnus-emphasis-underline-italic},
+@code{gnus-emphasis-underline-bold}, and
+@code{gnus-emphasis-underline-bold-italic}.
+
+If you want to change these faces, you can either use @kbd{M-x
+customize}, or you can use @code{copy-face}.  For instance, if you want
+to make @code{gnus-emphasis-italic} use a red face instead, you could
+say something like:
+
+@lisp
+(copy-face 'red 'gnus-emphasis-italic)
+@end lisp
+
+@vindex gnus-group-highlight-words-alist
+
+If you want to highlight arbitrary words, you can use the
+@code{gnus-group-highlight-words-alist} variable, which uses the same
+syntax as @code{gnus-emphasis-alist}.  The @code{highlight-words} group
+parameter (@pxref{Group Parameters}) can also be used.
+
+@xref{Customizing Articles}, for how to fontize articles automatically.
+
+
+@node Article Hiding
+@subsection Article Hiding
+@cindex article hiding
+
+Or rather, hiding certain things in each article.  There usually is much
+too much cruft in most articles.
+
+@table @kbd
+
+@item W W a
+@kindex W W a (Summary)
+@findex gnus-article-hide
+Do quite a lot of hiding on the article buffer
+(@kbd{gnus-article-hide}).  In particular, this function will hide
+headers, @acronym{PGP}, cited text and the signature.
+
+@item W W h
+@kindex W W h (Summary)
+@findex gnus-article-hide-headers
+Hide headers (@code{gnus-article-hide-headers}).  @xref{Hiding
+Headers}.
+
+@item W W b
+@kindex W W b (Summary)
+@findex gnus-article-hide-boring-headers
+Hide headers that aren't particularly interesting
+(@code{gnus-article-hide-boring-headers}).  @xref{Hiding Headers}.
+
+@item W W s
+@kindex W W s (Summary)
+@findex gnus-article-hide-signature
+Hide signature (@code{gnus-article-hide-signature}).  @xref{Article
+Signature}.
+
+@item W W l
+@kindex W W l (Summary)
+@findex gnus-article-hide-list-identifiers
+@vindex gnus-list-identifiers
+Strip list identifiers specified in @code{gnus-list-identifiers}.  These
+are strings some mailing list servers add to the beginning of all
+@code{Subject} headers---for example, @samp{[zebra 4711]}.  Any leading
+@samp{Re: } is skipped before stripping.  @code{gnus-list-identifiers}
+may not contain @code{\\(..\\)}.
+
+@table @code
+
+@item gnus-list-identifiers
+@vindex gnus-list-identifiers
+A regular expression that matches list identifiers to be removed from
+subject.  This can also be a list of regular expressions.
+
+@end table
+
+@item W W P
+@kindex W W P (Summary)
+@findex gnus-article-hide-pem
+Hide @acronym{PEM} (privacy enhanced messages) cruft
+(@code{gnus-article-hide-pem}).
+
+@item W W B
+@kindex W W B (Summary)
+@findex gnus-article-strip-banner
+@vindex gnus-article-banner-alist
+@vindex gnus-article-address-banner-alist
+@cindex banner
+@cindex OneList
+@cindex stripping advertisements
+@cindex advertisements
+Strip the banner specified by the @code{banner} group parameter
+(@code{gnus-article-strip-banner}).  This is mainly used to hide those
+annoying banners and/or signatures that some mailing lists and moderated
+groups adds to all the messages.  The way to use this function is to add
+the @code{banner} group parameter (@pxref{Group Parameters}) to the
+group you want banners stripped from.  The parameter either be a string,
+which will be interpreted as a regular expression matching text to be
+removed, or the symbol @code{signature}, meaning that the (last)
+signature should be removed, or other symbol, meaning that the
+corresponding regular expression in @code{gnus-article-banner-alist} is
+used.
+
+Regardless of a group, you can hide things like advertisements only when
+the sender of an article has a certain mail address specified in
+@code{gnus-article-address-banner-alist}.
+
+@table @code
+
+@item gnus-article-address-banner-alist
+@vindex gnus-article-address-banner-alist
+Alist of mail addresses and banners.  Each element has the form
+@code{(@var{address} . @var{banner})}, where @var{address} is a regexp
+matching a mail address in the From header, @var{banner} is one of a
+symbol @code{signature}, an item in @code{gnus-article-banner-alist},
+a regexp and @code{nil}.  If @var{address} matches author's mail
+address, it will remove things like advertisements.  For example, if a
+sender has the mail address @samp{hail@@yoo-hoo.co.jp} and there is a
+banner something like @samp{Do You Yoo-hoo!?} in all articles he
+sends, you can use the following element to remove them:
+
+@lisp
+("@@yoo-hoo\\.co\\.jp\\'" .
+ "\n_+\nDo You Yoo-hoo!\\?\n.*\n.*\n")
+@end lisp
+
+@end table
+
+@item W W c
+@kindex W W c (Summary)
+@findex gnus-article-hide-citation
+Hide citation (@code{gnus-article-hide-citation}).  Some variables for
+customizing the hiding:
+
+@table @code
+
+@item gnus-cited-opened-text-button-line-format
+@itemx gnus-cited-closed-text-button-line-format
+@vindex gnus-cited-closed-text-button-line-format
+@vindex gnus-cited-opened-text-button-line-format
+Gnus adds buttons to show where the cited text has been hidden, and to
+allow toggle hiding the text.  The format of the variable is specified
+by these format-like variable (@pxref{Formatting Variables}).  These
+specs are valid:
+
+@table @samp
+@item b
+Starting point of the hidden text.
+@item e
+Ending point of the hidden text.
+@item l
+Number of characters in the hidden region.
+@item n
+Number of lines of hidden text.
+@end table
+
+@item gnus-cited-lines-visible
+@vindex gnus-cited-lines-visible
+The number of lines at the beginning of the cited text to leave
+shown.  This can also be a cons cell with the number of lines at the top
+and bottom of the text, respectively, to remain visible.
+
+@end table
+
+@item W W C-c
+@kindex W W C-c (Summary)
+@findex gnus-article-hide-citation-maybe
+
+Hide citation (@code{gnus-article-hide-citation-maybe}) depending on the
+following two variables:
+
+@table @code
+@item gnus-cite-hide-percentage
+@vindex gnus-cite-hide-percentage
+If the cited text is of a bigger percentage than this variable (default
+50), hide the cited text.
+
+@item gnus-cite-hide-absolute
+@vindex gnus-cite-hide-absolute
+The cited text must have at least this length (default 10) before it
+is hidden.
+@end table
+
+@item W W C
+@kindex W W C (Summary)
+@findex gnus-article-hide-citation-in-followups
+Hide cited text in articles that aren't roots
+(@code{gnus-article-hide-citation-in-followups}).  This isn't very
+useful as an interactive command, but might be a handy function to stick
+have happen automatically (@pxref{Customizing Articles}).
+
+@end table
+
+All these ``hiding'' commands are toggles, but if you give a negative
+prefix to these commands, they will show what they have previously
+hidden.  If you give a positive prefix, they will always hide.
+
+Also @pxref{Article Highlighting} for further variables for
+citation customization.
+
+@xref{Customizing Articles}, for how to hide article elements
+automatically.
+
+
+@node Article Washing
+@subsection Article Washing
+@cindex washing
+@cindex article washing
+
+We call this ``article washing'' for a really good reason.  Namely, the
+@kbd{A} key was taken, so we had to use the @kbd{W} key instead.
+
+@dfn{Washing} is defined by us as ``changing something from something to
+something else'', but normally results in something looking better.
+Cleaner, perhaps.
+
+@xref{Customizing Articles}, if you want to change how Gnus displays
+articles by default.
+
+@table @kbd
+
+@item C-u g
+This is not really washing, it's sort of the opposite of washing.  If
+you type this, you see the article exactly as it exists on disk or on
+the server.
+
+@item g
+Force redisplaying of the current article
+(@code{gnus-summary-show-article}).  This is also not really washing.
+If you type this, you see the article without any previously applied
+interactive Washing functions but with all default treatments
+(@pxref{Customizing Articles}).
+
+@item W l
+@kindex W l (Summary)
+@findex gnus-summary-stop-page-breaking
+Remove page breaks from the current article
+(@code{gnus-summary-stop-page-breaking}).  @xref{Misc Article}, for page
+delimiters.
+
+@item W r
+@kindex W r (Summary)
+@findex gnus-summary-caesar-message
+@c @icon{gnus-summary-caesar-message}
+Do a Caesar rotate (rot13) on the article buffer
+(@code{gnus-summary-caesar-message}).
+Unreadable articles that tell you to read them with Caesar rotate or rot13.
+(Typically offensive jokes and such.)
+
+It's commonly called ``rot13'' because each letter is rotated 13
+positions in the alphabet, e. g. @samp{B} (letter #2) -> @samp{O} (letter
+#15).  It is sometimes referred to as ``Caesar rotate'' because Caesar
+is rumored to have employed this form of, uh, somewhat weak encryption.
+
+@item W m
+@kindex W m (Summary)
+@findex gnus-summary-morse-message
+Morse decode the article buffer (@code{gnus-summary-morse-message}).
+
+@item W t
+@item t
+@kindex W t (Summary)
+@kindex t (Summary)
+@findex gnus-summary-toggle-header
+Toggle whether to display all headers in the article buffer
+(@code{gnus-summary-toggle-header}).
+
+@item W v
+@kindex W v (Summary)
+@findex gnus-summary-verbose-headers
+Toggle whether to display all headers in the article buffer permanently
+(@code{gnus-summary-verbose-headers}).
+
+@item W o
+@kindex W o (Summary)
+@findex gnus-article-treat-overstrike
+Treat overstrike (@code{gnus-article-treat-overstrike}).
+
+@item W d
+@kindex W d (Summary)
+@findex gnus-article-treat-dumbquotes
+@vindex gnus-article-dumbquotes-map
+@cindex Smartquotes
+@cindex M****s*** sm*rtq**t*s
+@cindex Latin 1
+Treat M****s*** sm*rtq**t*s according to
+@code{gnus-article-dumbquotes-map}
+(@code{gnus-article-treat-dumbquotes}).  Note that this function guesses
+whether a character is a sm*rtq**t* or not, so it should only be used
+interactively.
+
+Sm*rtq**t*s are M****s***'s unilateral extension to the character map in
+an attempt to provide more quoting characters.  If you see something
+like @code{\222} or @code{\264} where you're expecting some kind of
+apostrophe or quotation mark, then try this wash.
+
+@item W Y f
+@kindex W Y f (Summary)
+@findex gnus-article-outlook-deuglify-article
+@cindex Outlook Express
+Full deuglify of broken Outlook (Express) articles: Treat dumbquotes,
+unwrap lines, repair attribution and rearrange citation.
+(@code{gnus-article-outlook-deuglify-article}).
+
+@item W Y u
+@kindex W Y u (Summary)
+@findex gnus-article-outlook-unwrap-lines
+@vindex gnus-outlook-deuglify-unwrap-min
+@vindex gnus-outlook-deuglify-unwrap-max
+Unwrap lines that appear to be wrapped citation lines.  You can control
+what lines will be unwrapped by frobbing
+@code{gnus-outlook-deuglify-unwrap-min} and
+@code{gnus-outlook-deuglify-unwrap-max}, indicating the minimum and
+maximum length of an unwrapped citation line.
+(@code{gnus-article-outlook-unwrap-lines}).
+
+@item W Y a
+@kindex W Y a (Summary)
+@findex gnus-article-outlook-repair-attribution
+Repair a broken attribution line.@*
+(@code{gnus-article-outlook-repair-attribution}).
+
+@item W Y c
+@kindex W Y c (Summary)
+@findex gnus-article-outlook-rearrange-citation
+Repair broken citations by rearranging the text.
+(@code{gnus-article-outlook-rearrange-citation}).
+
+@item W w
+@kindex W w (Summary)
+@findex gnus-article-fill-cited-article
+Do word wrap (@code{gnus-article-fill-cited-article}).
+
+You can give the command a numerical prefix to specify the width to use
+when filling.
+
+@item W Q
+@kindex W Q (Summary)
+@findex gnus-article-fill-long-lines
+Fill long lines (@code{gnus-article-fill-long-lines}).
+
+@item W C
+@kindex W C (Summary)
+@findex gnus-article-capitalize-sentences
+Capitalize the first word in each sentence
+(@code{gnus-article-capitalize-sentences}).
+
+@item W c
+@kindex W c (Summary)
+@findex gnus-article-remove-cr
+Translate CRLF pairs (i. e., @samp{^M}s on the end of the lines) into LF
+(this takes care of DOS line endings), and then translate any remaining
+CRs into LF (this takes care of Mac line endings)
+(@code{gnus-article-remove-cr}).
+
+@item W q
+@kindex W q (Summary)
+@findex gnus-article-de-quoted-unreadable
+Treat quoted-printable (@code{gnus-article-de-quoted-unreadable}).
+Quoted-Printable is one common @acronym{MIME} encoding employed when
+sending non-@acronym{ASCII} (i.e., 8-bit) articles.  It typically
+makes strings like @samp{déjà vu} look like @samp{d=E9j=E0 vu}, which
+doesn't look very readable to me.  Note that this is usually done
+automatically by Gnus if the message in question has a
+@code{Content-Transfer-Encoding} header that says that this encoding
+has been done.  If a prefix is given, a charset will be asked for.
+
+@item W 6
+@kindex W 6 (Summary)
+@findex gnus-article-de-base64-unreadable
+Treat base64 (@code{gnus-article-de-base64-unreadable}).  Base64 is
+one common @acronym{MIME} encoding employed when sending
+non-@acronym{ASCII} (i.e., 8-bit) articles.  Note that this is
+usually done automatically by Gnus if the message in question has a
+@code{Content-Transfer-Encoding} header that says that this encoding
+has been done.  If a prefix is given, a charset will be asked for.
+
+@item W Z
+@kindex W Z (Summary)
+@findex gnus-article-decode-HZ
+Treat HZ or HZP (@code{gnus-article-decode-HZ}).  HZ (or HZP) is one
+common encoding employed when sending Chinese articles.  It typically
+makes strings look like @samp{~@{<:Ky2;S@{#,NpJ)l6HK!#~@}}.
+
+@item W u
+@kindex W u (Summary)
+@findex gnus-article-unsplit-urls
+Remove newlines from within URLs.  Some mailers insert newlines into
+outgoing email messages to keep lines short.  This reformatting can
+split long URLs onto multiple lines.  Repair those URLs by removing
+the newlines (@code{gnus-article-unsplit-urls}).
+
+@item W h
+@kindex W h (Summary)
+@findex gnus-article-wash-html
+Treat @acronym{HTML} (@code{gnus-article-wash-html}).  Note that this is
+usually done automatically by Gnus if the message in question has a
+@code{Content-Type} header that says that the message is @acronym{HTML}.
+
+If a prefix is given, a charset will be asked for.  If it is a number,
+the charset defined in @code{gnus-summary-show-article-charset-alist}
+(@pxref{Paging the Article}) will be used.
+
+@vindex gnus-article-wash-function
+The default is to use the function specified by
+@code{mm-text-html-renderer} (@pxref{Display Customization, ,Display
+Customization, emacs-mime, The Emacs MIME Manual}) to convert the
+@acronym{HTML}, but this is controlled by the
+@code{gnus-article-wash-function} variable.  Pre-defined functions you
+can use include:
+
+@table @code
+@item w3
+Use Emacs/W3.
+
+@item w3m
+Use @uref{http://emacs-w3m.namazu.org/, emacs-w3m}.
+
+@item w3m-standalone
+Use @uref{http://w3m.sourceforge.net/, w3m}.
+
+@item links
+Use @uref{http://links.sf.net/, Links}.
+
+@item lynx
+Use @uref{http://lynx.isc.org/, Lynx}.
+
+@item html2text
+Use html2text---a simple @acronym{HTML} converter included with Gnus.
+
+@end table
+
+@item W b
+@kindex W b (Summary)
+@findex gnus-article-add-buttons
+Add clickable buttons to the article (@code{gnus-article-add-buttons}).
+@xref{Article Buttons}.
+
+@item W B
+@kindex W B (Summary)
+@findex gnus-article-add-buttons-to-head
+Add clickable buttons to the article headers
+(@code{gnus-article-add-buttons-to-head}).
+
+@item W p
+@kindex W p (Summary)
+@findex gnus-article-verify-x-pgp-sig
+Verify a signed control message
+(@code{gnus-article-verify-x-pgp-sig}).  Control messages such as
+@code{newgroup} and @code{checkgroups} are usually signed by the
+hierarchy maintainer.  You need to add the @acronym{PGP} public key of
+the maintainer to your keyring to verify the
+message.@footnote{@acronym{PGP} keys for many hierarchies are
+available at @uref{ftp://ftp.isc.org/pub/pgpcontrol/README.html}}
+
+@item W s
+@kindex W s (Summary)
+@findex gnus-summary-force-verify-and-decrypt
+Verify a signed (@acronym{PGP}, @acronym{PGP/MIME} or
+@acronym{S/MIME}) message
+(@code{gnus-summary-force-verify-and-decrypt}). @xref{Security}.
+
+@item W a
+@kindex W a (Summary)
+@findex gnus-article-strip-headers-in-body
+Strip headers like the @code{X-No-Archive} header from the beginning of
+article bodies (@code{gnus-article-strip-headers-in-body}).
+
+@item W E l
+@kindex W E l (Summary)
+@findex gnus-article-strip-leading-blank-lines
+Remove all blank lines from the beginning of the article
+(@code{gnus-article-strip-leading-blank-lines}).
+
+@item W E m
+@kindex W E m (Summary)
+@findex gnus-article-strip-multiple-blank-lines
+Replace all blank lines with empty lines and then all multiple empty
+lines with a single empty line.
+(@code{gnus-article-strip-multiple-blank-lines}).
+
+@item W E t
+@kindex W E t (Summary)
+@findex gnus-article-remove-trailing-blank-lines
+Remove all blank lines at the end of the article
+(@code{gnus-article-remove-trailing-blank-lines}).
+
+@item W E a
+@kindex W E a (Summary)
+@findex gnus-article-strip-blank-lines
+Do all the three commands above
+(@code{gnus-article-strip-blank-lines}).
+
+@item W E A
+@kindex W E A (Summary)
+@findex gnus-article-strip-all-blank-lines
+Remove all blank lines
+(@code{gnus-article-strip-all-blank-lines}).
+
+@item W E s
+@kindex W E s (Summary)
+@findex gnus-article-strip-leading-space
+Remove all white space from the beginning of all lines of the article
+body (@code{gnus-article-strip-leading-space}).
+
+@item W E e
+@kindex W E e (Summary)
+@findex gnus-article-strip-trailing-space
+Remove all white space from the end of all lines of the article
+body (@code{gnus-article-strip-trailing-space}).
+
+@end table
+
+@xref{Customizing Articles}, for how to wash articles automatically.
+
+
+@node Article Header
+@subsection Article Header
+
+These commands perform various transformations of article header.
+
+@table @kbd
+
+@item W G u
+@kindex W G u (Summary)
+@findex gnus-article-treat-unfold-headers
+Unfold folded header lines (@code{gnus-article-treat-unfold-headers}).
+
+@item W G n
+@kindex W G n (Summary)
+@findex gnus-article-treat-fold-newsgroups
+Fold the @code{Newsgroups} and @code{Followup-To} headers
+(@code{gnus-article-treat-fold-newsgroups}).
+
+@item W G f
+@kindex W G f (Summary)
+@findex gnus-article-treat-fold-headers
+Fold all the message headers
+(@code{gnus-article-treat-fold-headers}).
+
+@item W E w
+@kindex W E w (Summary)
+@findex gnus-article-remove-leading-whitespace
+Remove excessive whitespace from all headers
+(@code{gnus-article-remove-leading-whitespace}).
+
+@end table
+
+
+@node Article Buttons
+@subsection Article Buttons
+@cindex buttons
+
+People often include references to other stuff in articles, and it would
+be nice if Gnus could just fetch whatever it is that people talk about
+with the minimum of fuzz when you hit @kbd{RET} or use the middle mouse
+button on these references.
+
+@vindex gnus-button-man-handler
+Gnus adds @dfn{buttons} to certain standard references by default:
+Well-formed URLs, mail addresses, Message-IDs, Info links, man pages and
+Emacs or Gnus related references.  This is controlled by two variables,
+one that handles article bodies and one that handles article heads:
+
+@table @code
+
+@item gnus-button-alist
+@vindex gnus-button-alist
+This is an alist where each entry has this form:
+
+@lisp
+(@var{regexp} @var{button-par} @var{use-p} @var{function} @var{data-par})
+@end lisp
+
+@table @var
+
+@item regexp
+All text that match this regular expression (case insensitive) will be
+considered an external reference.  Here's a typical regexp that matches
+embedded URLs: @samp{<URL:\\([^\n\r>]*\\)>}.  This can also be a
+variable containing a regexp, useful variables to use include
+@code{gnus-button-url-regexp} and @code{gnus-button-mid-or-mail-regexp}.
+
+@item button-par
+Gnus has to know which parts of the matches is to be highlighted.  This
+is a number that says what sub-expression of the regexp is to be
+highlighted.  If you want it all highlighted, you use 0 here.
+
+@item use-p
+This form will be @code{eval}ed, and if the result is non-@code{nil},
+this is considered a match.  This is useful if you want extra sifting to
+avoid false matches.  Often variables named
+@code{gnus-button-@var{*}-level} are used here, @xref{Article Button
+Levels}, but any other form may be used too.
+
+@c @code{use-p} is @code{eval}ed only if @code{regexp} matches.
+
+@item function
+This function will be called when you click on this button.
+
+@item data-par
+As with @var{button-par}, this is a sub-expression number, but this one
+says which part of the match is to be sent as data to @var{function}.
+
+@end table
+
+So the full entry for buttonizing URLs is then
+
+@lisp
+("<URL:\\([^\n\r>]*\\)>" 0 t gnus-button-url 1)
+@end lisp
+
+@item gnus-header-button-alist
+@vindex gnus-header-button-alist
+This is just like the other alist, except that it is applied to the
+article head only, and that each entry has an additional element that is
+used to say what headers to apply the buttonize coding to:
+
+@lisp
+(@var{header} @var{regexp} @var{button-par} @var{use-p} @var{function} @var{data-par})
+@end lisp
+
+@var{header} is a regular expression.
+@end table
+
+@subsubsection Related variables and functions
+
+@table @code
+@item gnus-button-@var{*}-level
+@xref{Article Button Levels}.
+
+@c Stuff related to gnus-button-browse-level
+
+@item gnus-button-url-regexp
+@vindex gnus-button-url-regexp
+A regular expression that matches embedded URLs.  It is used in the
+default values of the variables above.
+
+@c Stuff related to gnus-button-man-level
+
+@item gnus-button-man-handler
+@vindex gnus-button-man-handler
+The function to use for displaying man pages.  It must take at least one
+argument with a string naming the man page.
+
+@c Stuff related to gnus-button-message-level
+
+@item gnus-button-mid-or-mail-regexp
+@vindex gnus-button-mid-or-mail-regexp
+Regular expression that matches a message ID or a mail address.
+
+@item gnus-button-prefer-mid-or-mail
+@vindex gnus-button-prefer-mid-or-mail
+This variable determines what to do when the button on a string as
+@samp{foo123@@bar.invalid} is pushed.  Strings like this can be either a
+message ID or a mail address.  If it is one of the symbols @code{mid} or
+@code{mail}, Gnus will always assume that the string is a message ID or
+a mail address, respectively.  If this variable is set to the symbol
+@code{ask}, always query the user what to do.  If it is a function, this
+function will be called with the string as its only argument.  The
+function must return @code{mid}, @code{mail}, @code{invalid} or
+@code{ask}.  The default value is the function
+@code{gnus-button-mid-or-mail-heuristic}.
+
+@item gnus-button-mid-or-mail-heuristic
+@findex gnus-button-mid-or-mail-heuristic
+Function that guesses whether its argument is a message ID or a mail
+address.  Returns @code{mid} if it's a message IDs, @code{mail} if
+it's a mail address, @code{ask} if unsure and @code{invalid} if the
+string is invalid.
+
+@item gnus-button-mid-or-mail-heuristic-alist
+@vindex gnus-button-mid-or-mail-heuristic-alist
+An alist of @code{(RATE . REGEXP)} pairs used by the function
+@code{gnus-button-mid-or-mail-heuristic}.
+
+@c Stuff related to gnus-button-tex-level
+
+@item gnus-button-ctan-handler
+@findex gnus-button-ctan-handler
+The function to use for displaying CTAN links.  It must take one
+argument, the string naming the URL.
+
+@item gnus-ctan-url
+@vindex gnus-ctan-url
+Top directory of a CTAN (Comprehensive TeX Archive Network) archive used
+by @code{gnus-button-ctan-handler}.
+
+@c Misc stuff
+
+@item gnus-article-button-face
+@vindex gnus-article-button-face
+Face used on buttons.
+
+@item gnus-article-mouse-face
+@vindex gnus-article-mouse-face
+Face used when the mouse cursor is over a button.
+
+@end table
+
+@xref{Customizing Articles}, for how to buttonize articles automatically.
+
+
+@node Article Button Levels
+@subsection Article button levels
+@cindex button levels
+The higher the value of the variables @code{gnus-button-@var{*}-level},
+the more buttons will appear.  If the level is zero, no corresponding
+buttons are displayed.  With the default value (which is 5) you should
+already see quite a lot of buttons.  With higher levels, you will see
+more buttons, but you may also get more false positives.  To avoid them,
+you can set the variables @code{gnus-button-@var{*}-level} local to
+specific groups (@pxref{Group Parameters}).  Here's an example for the
+variable @code{gnus-parameters}:
+
+@lisp
+;; @r{increase @code{gnus-button-*-level} in some groups:}
+(setq gnus-parameters
+      '(("\\<\\(emacs\\|gnus\\)\\>" (gnus-button-emacs-level 10))
+        ("\\<unix\\>"               (gnus-button-man-level 10))
+        ("\\<tex\\>"                (gnus-button-tex-level 10))))
+@end lisp
+
+@table @code
+
+@item gnus-button-browse-level
+@vindex gnus-button-browse-level
+Controls the display of references to message IDs, mail addresses and
+news URLs.  Related variables and functions include
+@code{gnus-button-url-regexp}, @code{browse-url}, and
+@code{browse-url-browser-function}.
+
+@item gnus-button-emacs-level
+@vindex gnus-button-emacs-level
+Controls the display of Emacs or Gnus references.  Related functions are
+@code{gnus-button-handle-custom},
+@code{gnus-button-handle-describe-function},
+@code{gnus-button-handle-describe-variable},
+@code{gnus-button-handle-symbol},
+@code{gnus-button-handle-describe-key},
+@code{gnus-button-handle-apropos},
+@code{gnus-button-handle-apropos-command},
+@code{gnus-button-handle-apropos-variable},
+@code{gnus-button-handle-apropos-documentation}, and
+@code{gnus-button-handle-library}.
+
+@item gnus-button-man-level
+@vindex gnus-button-man-level
+Controls the display of references to (Unix) man pages.
+See @code{gnus-button-man-handler}.
+
+@item gnus-button-message-level
+@vindex gnus-button-message-level
+Controls the display of message IDs, mail addresses and news URLs.
+Related variables and functions include
+@code{gnus-button-mid-or-mail-regexp},
+@code{gnus-button-prefer-mid-or-mail},
+@code{gnus-button-mid-or-mail-heuristic}, and
+@code{gnus-button-mid-or-mail-heuristic-alist}.
+
+@item gnus-button-tex-level
+@vindex gnus-button-tex-level
+Controls the display of references to @TeX{} or LaTeX stuff, e.g. for CTAN
+URLs.  See the variables @code{gnus-ctan-url},
+@code{gnus-button-ctan-handler},
+@code{gnus-button-ctan-directory-regexp}, and
+@code{gnus-button-handle-ctan-bogus-regexp}.
+
+@end table
+
+
+@node Article Date
+@subsection Article Date
+
+The date is most likely generated in some obscure timezone you've never
+heard of, so it's quite nice to be able to find out what the time was
+when the article was sent.
+
+@table @kbd
+
+@item W T u
+@kindex W T u (Summary)
+@findex gnus-article-date-ut
+Display the date in UT (aka. GMT, aka ZULU)
+(@code{gnus-article-date-ut}).
+
+@item W T i
+@kindex W T i (Summary)
+@findex gnus-article-date-iso8601
+@cindex ISO 8601
+Display the date in international format, aka. ISO 8601
+(@code{gnus-article-date-iso8601}).
+
+@item W T l
+@kindex W T l (Summary)
+@findex gnus-article-date-local
+Display the date in the local timezone (@code{gnus-article-date-local}).
+
+@item W T p
+@kindex W T p (Summary)
+@findex gnus-article-date-english
+Display the date in a format that's easily pronounceable in English
+(@code{gnus-article-date-english}).
+
+@item W T s
+@kindex W T s (Summary)
+@vindex gnus-article-time-format
+@findex gnus-article-date-user
+@findex format-time-string
+Display the date using a user-defined format
+(@code{gnus-article-date-user}).  The format is specified by the
+@code{gnus-article-time-format} variable, and is a string that's passed
+to @code{format-time-string}.  See the documentation of that variable
+for a list of possible format specs.
+
+@item W T e
+@kindex W T e (Summary)
+@findex gnus-article-date-lapsed
+@findex gnus-start-date-timer
+@findex gnus-stop-date-timer
+Say how much time has elapsed between the article was posted and now
+(@code{gnus-article-date-lapsed}).  It looks something like:
+
+@example
+X-Sent: 6 weeks, 4 days, 1 hour, 3 minutes, 8 seconds ago
+@end example
+
+@vindex gnus-article-date-lapsed-new-header
+The value of @code{gnus-article-date-lapsed-new-header} determines
+whether this header will just be added below the old Date one, or will
+replace it.
+
+An advantage of using Gnus to read mail is that it converts simple bugs
+into wonderful absurdities.
+
+If you want to have this line updated continually, you can put
+
+@lisp
+(gnus-start-date-timer)
+@end lisp
+
+in your @file{~/.gnus.el} file, or you can run it off of some hook.  If
+you want to stop the timer, you can use the @code{gnus-stop-date-timer}
+command.
+
+@item W T o
+@kindex W T o (Summary)
+@findex gnus-article-date-original
+Display the original date (@code{gnus-article-date-original}).  This can
+be useful if you normally use some other conversion function and are
+worried that it might be doing something totally wrong.  Say, claiming
+that the article was posted in 1854.  Although something like that is
+@emph{totally} impossible.  Don't you trust me? *titter*
+
+@end table
+
+@xref{Customizing Articles}, for how to display the date in your
+preferred format automatically.
+
+
+@node Article Display
+@subsection Article Display
+@cindex picons
+@cindex x-face
+@cindex smileys
+
+These commands add various frivolous display gimmicks to the article
+buffer in Emacs versions that support them.
+
+@code{X-Face} headers are small black-and-white images supplied by the
+message headers (@pxref{X-Face}).
+
+@code{Face} headers are small colored images supplied by the message
+headers (@pxref{Face}).
+
+Smileys are those little @samp{:-)} symbols that people like to litter
+their messages with (@pxref{Smileys}).
+
+Picons, on the other hand, reside on your own system, and Gnus will
+try to match the headers to what you have (@pxref{Picons}).
+
+All these functions are toggles---if the elements already exist,
+they'll be removed.
+
+@table @kbd
+@item W D x
+@kindex W D x (Summary)
+@findex gnus-article-display-x-face
+Display an @code{X-Face} in the @code{From} header.
+(@code{gnus-article-display-x-face}).
+
+@item W D d
+@kindex W D d (Summary)
+@findex gnus-article-display-face
+Display a @code{Face} in the @code{From} header.
+(@code{gnus-article-display-face}).
+
+@item W D s
+@kindex W D s (Summary)
+@findex gnus-treat-smiley
+Display smileys (@code{gnus-treat-smiley}).
+
+@item W D f
+@kindex W D f (Summary)
+@findex gnus-treat-from-picon
+Piconify the @code{From} header (@code{gnus-treat-from-picon}).
+
+@item W D m
+@kindex W D m (Summary)
+@findex gnus-treat-mail-picon
+Piconify all mail headers (i. e., @code{Cc}, @code{To})
+(@code{gnus-treat-mail-picon}).
+
+@item W D n
+@kindex W D n (Summary)
+@findex gnus-treat-newsgroups-picon
+Piconify all news headers (i. e., @code{Newsgroups} and
+@code{Followup-To}) (@code{gnus-treat-newsgroups-picon}).
+
+@item W D D
+@kindex W D D (Summary)
+@findex gnus-article-remove-images
+Remove all images from the article buffer
+(@code{gnus-article-remove-images}).
+
+@end table
+
+
+
+@node Article Signature
+@subsection Article Signature
+@cindex signatures
+@cindex article signature
+
+@vindex gnus-signature-separator
+Each article is divided into two parts---the head and the body.  The
+body can be divided into a signature part and a text part.  The variable
+that says what is to be considered a signature is
+@code{gnus-signature-separator}.  This is normally the standard
+@samp{^-- $} as mandated by son-of-RFC 1036.  However, many people use
+non-standard signature separators, so this variable can also be a list
+of regular expressions to be tested, one by one.  (Searches are done
+from the end of the body towards the beginning.)  One likely value is:
+
+@lisp
+(setq gnus-signature-separator
+      '("^-- $"         ; @r{The standard}
+        "^-- *$"        ; @r{A common mangling}
+        "^-------*$"    ; @r{Many people just use a looong}
+                        ; @r{line of dashes.  Shame!}
+        "^ *--------*$" ; @r{Double-shame!}
+        "^________*$"   ; @r{Underscores are also popular}
+        "^========*$")) ; @r{Pervert!}
+@end lisp
+
+The more permissive you are, the more likely it is that you'll get false
+positives.
+
+@vindex gnus-signature-limit
+@code{gnus-signature-limit} provides a limit to what is considered a
+signature when displaying articles.
+
+@enumerate
+@item
+If it is an integer, no signature may be longer (in characters) than
+that integer.
+@item
+If it is a floating point number, no signature may be longer (in lines)
+than that number.
+@item
+If it is a function, the function will be called without any parameters,
+and if it returns @code{nil}, there is no signature in the buffer.
+@item
+If it is a string, it will be used as a regexp.  If it matches, the text
+in question is not a signature.
+@end enumerate
+
+This variable can also be a list where the elements may be of the types
+listed above.  Here's an example:
+
+@lisp
+(setq gnus-signature-limit
+      '(200.0 "^---*Forwarded article"))
+@end lisp
+
+This means that if there are more than 200 lines after the signature
+separator, or the text after the signature separator is matched by
+the regular expression @samp{^---*Forwarded article}, then it isn't a
+signature after all.
+
+
+@node Article Miscellanea
+@subsection Article Miscellanea
+
+@table @kbd
+@item A t
+@kindex A t (Summary)
+@findex gnus-article-babel
+Translate the article from one language to another
+(@code{gnus-article-babel}).
+
+@end table
+
+
+@node MIME Commands
+@section MIME Commands
+@cindex MIME decoding
+@cindex attachments
+@cindex viewing attachments
+
+The following commands all understand the numerical prefix.  For
+instance, @kbd{3 b} means ``view the third @acronym{MIME} part''.
+
+@table @kbd
+@item b
+@itemx K v
+@kindex b (Summary)
+@kindex K v (Summary)
+View the @acronym{MIME} part.
+
+@item K o
+@kindex K o (Summary)
+Save the @acronym{MIME} part.
+
+@item K c
+@kindex K c (Summary)
+Copy the @acronym{MIME} part.
+
+@item K e
+@kindex K e (Summary)
+View the @acronym{MIME} part externally.
+
+@item K i
+@kindex K i (Summary)
+View the @acronym{MIME} part internally.
+
+@item K |
+@kindex K | (Summary)
+Pipe the @acronym{MIME} part to an external command.
+@end table
+
+The rest of these @acronym{MIME} commands do not use the numerical prefix in
+the same manner:
+
+@table @kbd
+@item K b
+@kindex K b (Summary)
+Make all the @acronym{MIME} parts have buttons in front of them.  This is
+mostly useful if you wish to save (or perform other actions) on inlined
+parts.
+
+@item K m
+@kindex K m (Summary)
+@findex gnus-summary-repair-multipart
+Some multipart messages are transmitted with missing or faulty headers.
+This command will attempt to ``repair'' these messages so that they can
+be viewed in a more pleasant manner
+(@code{gnus-summary-repair-multipart}).
+
+@item X m
+@kindex X m (Summary)
+@findex gnus-summary-save-parts
+Save all parts matching a @acronym{MIME} type to a directory
+(@code{gnus-summary-save-parts}).  Understands the process/prefix
+convention (@pxref{Process/Prefix}).
+
+@item M-t
+@kindex M-t (Summary)
+@findex gnus-summary-toggle-display-buttonized
+Toggle the buttonized display of the article buffer
+(@code{gnus-summary-toggle-display-buttonized}).
+
+@item W M w
+@kindex W M w (Summary)
+@findex gnus-article-decode-mime-words
+Decode RFC 2047-encoded words in the article headers
+(@code{gnus-article-decode-mime-words}).
+
+@item W M c
+@kindex W M c (Summary)
+@findex gnus-article-decode-charset
+Decode encoded article bodies as well as charsets
+(@code{gnus-article-decode-charset}).
+
+This command looks in the @code{Content-Type} header to determine the
+charset.  If there is no such header in the article, you can give it a
+prefix, which will prompt for the charset to decode as.  In regional
+groups where people post using some common encoding (but do not
+include @acronym{MIME} headers), you can set the @code{charset} group/topic
+parameter to the required charset (@pxref{Group Parameters}).
+
+@item W M v
+@kindex W M v (Summary)
+@findex gnus-mime-view-all-parts
+View all the @acronym{MIME} parts in the current article
+(@code{gnus-mime-view-all-parts}).
+
+@end table
+
+Relevant variables:
+
+@table @code
+@item gnus-ignored-mime-types
+@vindex gnus-ignored-mime-types
+This is a list of regexps.  @acronym{MIME} types that match a regexp from
+this list will be completely ignored by Gnus.  The default value is
+@code{nil}.
+
+To have all Vcards be ignored, you'd say something like this:
+
+@lisp
+(setq gnus-ignored-mime-types
+      '("text/x-vcard"))
+@end lisp
+
+@item gnus-article-loose-mime
+@vindex gnus-article-loose-mime
+If non-@code{nil}, Gnus won't require the @samp{MIME-Version} header
+before interpreting the message as a @acronym{MIME} message.  This helps
+when reading messages from certain broken mail user agents.  The
+default is @code{nil}.
+
+@item gnus-article-emulate-mime
+@vindex gnus-article-emulate-mime
+@cindex uuencode
+@cindex yEnc
+There are other, non-@acronym{MIME} encoding methods used.  The most common
+is @samp{uuencode}, but yEncode is also getting to be popular.  If
+this variable is non-@code{nil}, Gnus will look in message bodies to
+see if it finds these encodings, and if so, it'll run them through the
+Gnus @acronym{MIME} machinery.  The default is @code{t}.  Only
+single-part yEnc encoded attachments can be decoded.  There's no support
+for encoding in Gnus.
+
+@item gnus-unbuttonized-mime-types
+@vindex gnus-unbuttonized-mime-types
+This is a list of regexps.  @acronym{MIME} types that match a regexp from
+this list won't have @acronym{MIME} buttons inserted unless they aren't
+displayed or this variable is overridden by
+@code{gnus-buttonized-mime-types}.  The default value is
+@code{(".*/.*")}.  This variable is only used when
+@code{gnus-inhibit-mime-unbuttonizing} is @code{nil}.
+
+@item gnus-buttonized-mime-types
+@vindex gnus-buttonized-mime-types
+This is a list of regexps.  @acronym{MIME} types that match a regexp from
+this list will have @acronym{MIME} buttons inserted unless they aren't
+displayed.  This variable overrides
+@code{gnus-unbuttonized-mime-types}.  The default value is @code{nil}.
+This variable is only used when @code{gnus-inhibit-mime-unbuttonizing}
+is @code{nil}.
+
+To see e.g. security buttons but no other buttons, you could set this
+variable to @code{("multipart/signed")} and leave
+@code{gnus-unbuttonized-mime-types} at the default value.
+
+You could also add @code{"multipart/alternative"} to this list to
+display radio buttons that allow you to choose one of two media types
+those mails include.  See also @code{mm-discouraged-alternatives}
+(@pxref{Display Customization, ,Display Customization, emacs-mime, The
+Emacs MIME Manual}).
+
+@item gnus-inhibit-mime-unbuttonizing
+@vindex gnus-inhibit-mime-unbuttonizing
+If this is non-@code{nil}, then all @acronym{MIME} parts get buttons.  The
+default value is @code{nil}.
+
+@item gnus-article-mime-part-function
+@vindex gnus-article-mime-part-function
+For each @acronym{MIME} part, this function will be called with the @acronym{MIME}
+handle as the parameter.  The function is meant to be used to allow
+users to gather information from the article (e. g., add Vcard info to
+the bbdb database) or to do actions based on parts (e. g., automatically
+save all jpegs into some directory).
+
+Here's an example function the does the latter:
+
+@lisp
+(defun my-save-all-jpeg-parts (handle)
+  (when (equal (car (mm-handle-type handle)) "image/jpeg")
+    (with-temp-buffer
+      (insert (mm-get-part handle))
+      (write-region (point-min) (point-max)
+                    (read-file-name "Save jpeg to: ")))))
+(setq gnus-article-mime-part-function
+      'my-save-all-jpeg-parts)
+@end lisp
+
+@vindex gnus-mime-multipart-functions
+@item gnus-mime-multipart-functions
+Alist of @acronym{MIME} multipart types and functions to handle them.
+
+@vindex gnus-mime-display-multipart-alternative-as-mixed
+@item gnus-mime-display-multipart-alternative-as-mixed
+Display "multipart/alternative" parts as "multipart/mixed".
+
+@vindex gnus-mime-display-multipart-related-as-mixed
+@item gnus-mime-display-multipart-related-as-mixed
+Display "multipart/related" parts as "multipart/mixed".
+
+If displaying "text/html" is discouraged, see
+@code{mm-discouraged-alternatives}, images or other material inside a
+"multipart/related" part might be overlooked when this variable is
+@code{nil}.  @ref{Display Customization, Display Customization, ,
+emacs-mime, Emacs-Mime Manual}.
+
+@vindex gnus-mime-display-multipart-as-mixed
+@item gnus-mime-display-multipart-as-mixed
+Display "multipart" parts as "multipart/mixed".  If @code{t}, it
+overrides @code{nil} values of
+@code{gnus-mime-display-multipart-alternative-as-mixed} and
+@code{gnus-mime-display-multipart-related-as-mixed}.
+
+@vindex mm-file-name-rewrite-functions
+@item mm-file-name-rewrite-functions
+List of functions used for rewriting file names of @acronym{MIME} parts.
+Each function takes a file name as input and returns a file name.
+
+Ready-made functions include@*
+@code{mm-file-name-delete-whitespace},
+@code{mm-file-name-trim-whitespace},
+@code{mm-file-name-collapse-whitespace}, and
+@code{mm-file-name-replace-whitespace}.  The later uses the value of
+the variable @code{mm-file-name-replace-whitespace} to replace each
+whitespace character in a file name with that string; default value
+is @code{"_"} (a single underscore).
+@findex mm-file-name-delete-whitespace
+@findex mm-file-name-trim-whitespace
+@findex mm-file-name-collapse-whitespace
+@findex mm-file-name-replace-whitespace
+@vindex mm-file-name-replace-whitespace
+
+The standard functions @code{capitalize}, @code{downcase},
+@code{upcase}, and @code{upcase-initials} may be useful, too.
+
+Everybody knows that whitespace characters in file names are evil,
+except those who don't know.  If you receive lots of attachments from
+such unenlightened users, you can make live easier by adding
+
+@lisp
+(setq mm-file-name-rewrite-functions
+      '(mm-file-name-trim-whitespace
+        mm-file-name-collapse-whitespace
+        mm-file-name-replace-whitespace))
+@end lisp
+
+@noindent
+to your @file{~/.gnus.el} file.
+
+@end table
+
+
+@node Charsets
+@section Charsets
+@cindex charsets
+
+People use different charsets, and we have @acronym{MIME} to let us know what
+charsets they use.  Or rather, we wish we had.  Many people use
+newsreaders and mailers that do not understand or use @acronym{MIME}, and
+just send out messages without saying what character sets they use.  To
+help a bit with this, some local news hierarchies have policies that say
+what character set is the default.  For instance, the @samp{fj}
+hierarchy uses @code{iso-2022-jp}.
+
+@vindex gnus-group-charset-alist
+This knowledge is encoded in the @code{gnus-group-charset-alist}
+variable, which is an alist of regexps (use the first item to match full
+group names) and default charsets to be used when reading these groups.
+
+@vindex gnus-newsgroup-ignored-charsets
+In addition, some people do use soi-disant @acronym{MIME}-aware agents that
+aren't.  These blithely mark messages as being in @code{iso-8859-1}
+even if they really are in @code{koi-8}.  To help here, the
+@code{gnus-newsgroup-ignored-charsets} variable can be used.  The
+charsets that are listed here will be ignored.  The variable can be
+set on a group-by-group basis using the group parameters (@pxref{Group
+Parameters}).  The default value is @code{(unknown-8bit x-unknown)},
+which includes values some agents insist on having in there.
+
+@vindex gnus-group-posting-charset-alist
+When posting, @code{gnus-group-posting-charset-alist} is used to
+determine which charsets should not be encoded using the @acronym{MIME}
+encodings.  For instance, some hierarchies discourage using
+quoted-printable header encoding.
+
+This variable is an alist of regexps and permitted unencoded charsets
+for posting.  Each element of the alist has the form @code{(}@var{test
+header body-list}@code{)}, where:
+
+@table @var
+@item test
+is either a regular expression matching the newsgroup header or a
+variable to query,
+@item header
+is the charset which may be left unencoded in the header (@code{nil}
+means encode all charsets),
+@item body-list
+is a list of charsets which may be encoded using 8bit content-transfer
+encoding in the body, or one of the special values @code{nil} (always
+encode using quoted-printable) or @code{t} (always use 8bit).
+@end table
+
+@cindex Russian
+@cindex koi8-r
+@cindex koi8-u
+@cindex iso-8859-5
+@cindex coding system aliases
+@cindex preferred charset
+
+@xref{Encoding Customization, , Encoding Customization, emacs-mime,
+The Emacs MIME Manual}, for additional variables that control which
+MIME charsets are used when sending messages.
+
+Other charset tricks that may be useful, although not Gnus-specific:
+
+If there are several @acronym{MIME} charsets that encode the same Emacs
+charset, you can choose what charset to use by saying the following:
+
+@lisp
+(put-charset-property 'cyrillic-iso8859-5
+                      'preferred-coding-system 'koi8-r)
+@end lisp
+
+This means that Russian will be encoded using @code{koi8-r} instead of
+the default @code{iso-8859-5} @acronym{MIME} charset.
+
+If you want to read messages in @code{koi8-u}, you can cheat and say
+
+@lisp
+(define-coding-system-alias 'koi8-u 'koi8-r)
+@end lisp
+
+This will almost do the right thing.
+
+And finally, to read charsets like @code{windows-1251}, you can say
+something like
+
+@lisp
+(codepage-setup 1251)
+(define-coding-system-alias 'windows-1251 'cp1251)
+@end lisp
+
+
+@node Article Commands
+@section Article Commands
+
+@table @kbd
+
+@item A P
+@cindex PostScript
+@cindex printing
+@kindex A P (Summary)
+@vindex gnus-ps-print-hook
+@findex gnus-summary-print-article
+Generate and print a PostScript image of the article buffer
+(@code{gnus-summary-print-article}).  @code{gnus-ps-print-hook} will
+be run just before printing the buffer.  An alternative way to print
+article is to use Muttprint (@pxref{Saving Articles}).
+
+@end table
+
+
+@node Summary Sorting
+@section Summary Sorting
+@cindex summary sorting
+
+You can have the summary buffer sorted in various ways, even though I
+can't really see why you'd want that.
+
+@table @kbd
+
+@item C-c C-s C-n
+@kindex C-c C-s C-n (Summary)
+@findex gnus-summary-sort-by-number
+Sort by article number (@code{gnus-summary-sort-by-number}).
+
+@item C-c C-s C-a
+@kindex C-c C-s C-a (Summary)
+@findex gnus-summary-sort-by-author
+Sort by author (@code{gnus-summary-sort-by-author}).
+
+@item C-c C-s C-s
+@kindex C-c C-s C-s (Summary)
+@findex gnus-summary-sort-by-subject
+Sort by subject (@code{gnus-summary-sort-by-subject}).
+
+@item C-c C-s C-d
+@kindex C-c C-s C-d (Summary)
+@findex gnus-summary-sort-by-date
+Sort by date (@code{gnus-summary-sort-by-date}).
+
+@item C-c C-s C-l
+@kindex C-c C-s C-l (Summary)
+@findex gnus-summary-sort-by-lines
+Sort by lines (@code{gnus-summary-sort-by-lines}).
+
+@item C-c C-s C-c
+@kindex C-c C-s C-c (Summary)
+@findex gnus-summary-sort-by-chars
+Sort by article length (@code{gnus-summary-sort-by-chars}).
+
+@item C-c C-s C-i
+@kindex C-c C-s C-i (Summary)
+@findex gnus-summary-sort-by-score
+Sort by score (@code{gnus-summary-sort-by-score}).
+
+@item C-c C-s C-r
+@kindex C-c C-s C-r (Summary)
+@findex gnus-summary-sort-by-random
+Randomize (@code{gnus-summary-sort-by-random}).
+
+@item C-c C-s C-o
+@kindex C-c C-s C-o (Summary)
+@findex gnus-summary-sort-by-original
+Sort using the default sorting method
+(@code{gnus-summary-sort-by-original}).
+@end table
+
+These functions will work both when you use threading and when you don't
+use threading.  In the latter case, all summary lines will be sorted,
+line by line.  In the former case, sorting will be done on a
+root-by-root basis, which might not be what you were looking for.  To
+toggle whether to use threading, type @kbd{T T} (@pxref{Thread
+Commands}).
+
+
+@node Finding the Parent
+@section Finding the Parent
+@cindex parent articles
+@cindex referring articles
+
+@table @kbd
+@item ^
+@kindex ^ (Summary)
+@findex gnus-summary-refer-parent-article
+If you'd like to read the parent of the current article, and it is not
+displayed in the summary buffer, you might still be able to.  That is,
+if the current group is fetched by @acronym{NNTP}, the parent hasn't expired
+and the @code{References} in the current article are not mangled, you
+can just press @kbd{^} or @kbd{A r}
+(@code{gnus-summary-refer-parent-article}).  If everything goes well,
+you'll get the parent.  If the parent is already displayed in the
+summary buffer, point will just move to this article.
+
+If given a positive numerical prefix, fetch that many articles back into
+the ancestry.  If given a negative numerical prefix, fetch just that
+ancestor.  So if you say @kbd{3 ^}, Gnus will fetch the parent, the
+grandparent and the grandgrandparent of the current article.  If you say
+@kbd{-3 ^}, Gnus will only fetch the grandgrandparent of the current
+article.
+
+@item A R (Summary)
+@findex gnus-summary-refer-references
+@kindex A R (Summary)
+Fetch all articles mentioned in the @code{References} header of the
+article (@code{gnus-summary-refer-references}).
+
+@item A T (Summary)
+@findex gnus-summary-refer-thread
+@kindex A T (Summary)
+Display the full thread where the current article appears
+(@code{gnus-summary-refer-thread}).  This command has to fetch all the
+headers in the current group to work, so it usually takes a while.  If
+you do it often, you may consider setting @code{gnus-fetch-old-headers}
+to @code{invisible} (@pxref{Filling In Threads}).  This won't have any
+visible effects normally, but it'll make this command work a whole lot
+faster.  Of course, it'll make group entry somewhat slow.
+
+@vindex gnus-refer-thread-limit
+The @code{gnus-refer-thread-limit} variable says how many old (i. e.,
+articles before the first displayed in the current group) headers to
+fetch when doing this command.  The default is 200.  If @code{t}, all
+the available headers will be fetched.  This variable can be overridden
+by giving the @kbd{A T} command a numerical prefix.
+
+@item M-^ (Summary)
+@findex gnus-summary-refer-article
+@kindex M-^ (Summary)
+@cindex Message-ID
+@cindex fetching by Message-ID
+You can also ask Gnus for an arbitrary article, no matter what group it
+belongs to.  @kbd{M-^} (@code{gnus-summary-refer-article}) will ask you
+for a @code{Message-ID}, which is one of those long, hard-to-read
+thingies that look something like @samp{<38o6up$6f2@@hymir.ifi.uio.no>}.
+You have to get it all exactly right.  No fuzzy searches, I'm afraid.
+
+Gnus looks for the @code{Message-ID} in the headers that have already
+been fetched, but also tries all the select methods specified by
+@code{gnus-refer-article-method} if it is not found.
+@end table
+
+@vindex gnus-refer-article-method
+If the group you are reading is located on a back end that does not
+support fetching by @code{Message-ID} very well (like @code{nnspool}),
+you can set @code{gnus-refer-article-method} to an @acronym{NNTP} method.  It
+would, perhaps, be best if the @acronym{NNTP} server you consult is the one
+updating the spool you are reading from, but that's not really
+necessary.
+
+It can also be a list of select methods, as well as the special symbol
+@code{current}, which means to use the current select method.  If it
+is a list, Gnus will try all the methods in the list until it finds a
+match.
+
+Here's an example setting that will first try the current method, and
+then ask Google if that fails:
+
+@lisp
+(setq gnus-refer-article-method
+      '(current
+        (nnweb "google" (nnweb-type google))))
+@end lisp
+
+Most of the mail back ends support fetching by @code{Message-ID}, but
+do not do a particularly excellent job at it.  That is, @code{nnmbox},
+@code{nnbabyl}, @code{nnmaildir}, @code{nnml}, are able to locate
+articles from any groups, while @code{nnfolder}, and @code{nnimap} are
+only able to locate articles that have been posted to the current
+group.  (Anything else would be too time consuming.)  @code{nnmh} does
+not support this at all.
+
+
+@node Alternative Approaches
+@section Alternative Approaches
+
+Different people like to read news using different methods.  This being
+Gnus, we offer a small selection of minor modes for the summary buffers.
+
+@menu
+* Pick and Read::               First mark articles and then read them.
+* Binary Groups::               Auto-decode all articles.
+@end menu
+
+
+@node Pick and Read
+@subsection Pick and Read
+@cindex pick and read
+
+Some newsreaders (like @code{nn} and, uhm, @code{Netnews} on VM/CMS) use
+a two-phased reading interface.  The user first marks in a summary
+buffer the articles she wants to read.  Then she starts reading the
+articles with just an article buffer displayed.
+
+@findex gnus-pick-mode
+@kindex M-x gnus-pick-mode
+Gnus provides a summary buffer minor mode that allows
+this---@code{gnus-pick-mode}.  This basically means that a few process
+mark commands become one-keystroke commands to allow easy marking, and
+it provides one additional command for switching to the summary buffer.
+
+Here are the available keystrokes when using pick mode:
+
+@table @kbd
+@item .
+@kindex . (Pick)
+@findex gnus-pick-article-or-thread
+Pick the article or thread on the current line
+(@code{gnus-pick-article-or-thread}).  If the variable
+@code{gnus-thread-hide-subtree} is true, then this key selects the
+entire thread when used at the first article of the thread.  Otherwise,
+it selects just the article.  If given a numerical prefix, go to that
+thread or article and pick it.  (The line number is normally displayed
+at the beginning of the summary pick lines.)
+
+@item SPACE
+@kindex SPACE (Pick)
+@findex gnus-pick-next-page
+Scroll the summary buffer up one page (@code{gnus-pick-next-page}).  If
+at the end of the buffer, start reading the picked articles.
+
+@item u
+@kindex u (Pick)
+@findex gnus-pick-unmark-article-or-thread.
+Unpick the thread or article
+(@code{gnus-pick-unmark-article-or-thread}).  If the variable
+@code{gnus-thread-hide-subtree} is true, then this key unpicks the
+thread if used at the first article of the thread.  Otherwise it unpicks
+just the article.  You can give this key a numerical prefix to unpick
+the thread or article at that line.
+
+@item RET
+@kindex RET (Pick)
+@findex gnus-pick-start-reading
+@vindex gnus-pick-display-summary
+Start reading the picked articles (@code{gnus-pick-start-reading}).  If
+given a prefix, mark all unpicked articles as read first.  If
+@code{gnus-pick-display-summary} is non-@code{nil}, the summary buffer
+will still be visible when you are reading.
+
+@end table
+
+All the normal summary mode commands are still available in the
+pick-mode, with the exception of @kbd{u}.  However @kbd{!} is available
+which is mapped to the same function
+@code{gnus-summary-tick-article-forward}.
+
+If this sounds like a good idea to you, you could say:
+
+@lisp
+(add-hook 'gnus-summary-mode-hook 'gnus-pick-mode)
+@end lisp
+
+@vindex gnus-pick-mode-hook
+@code{gnus-pick-mode-hook} is run in pick minor mode buffers.
+
+@vindex gnus-mark-unpicked-articles-as-read
+If @code{gnus-mark-unpicked-articles-as-read} is non-@code{nil}, mark
+all unpicked articles as read.  The default is @code{nil}.
+
+@vindex gnus-summary-pick-line-format
+The summary line format in pick mode is slightly different from the
+standard format.  At the beginning of each line the line number is
+displayed.  The pick mode line format is controlled by the
+@code{gnus-summary-pick-line-format} variable (@pxref{Formatting
+Variables}).  It accepts the same format specs that
+@code{gnus-summary-line-format} does (@pxref{Summary Buffer Lines}).
+
+
+@node Binary Groups
+@subsection Binary Groups
+@cindex binary groups
+
+@findex gnus-binary-mode
+@kindex M-x gnus-binary-mode
+If you spend much time in binary groups, you may grow tired of hitting
+@kbd{X u}, @kbd{n}, @kbd{RET} all the time.  @kbd{M-x gnus-binary-mode}
+is a minor mode for summary buffers that makes all ordinary Gnus article
+selection functions uudecode series of articles and display the result
+instead of just displaying the articles the normal way.
+
+@kindex g (Binary)
+@findex gnus-binary-show-article
+The only way, in fact, to see the actual articles is the @kbd{g}
+command, when you have turned on this mode
+(@code{gnus-binary-show-article}).
+
+@vindex gnus-binary-mode-hook
+@code{gnus-binary-mode-hook} is called in binary minor mode buffers.
+
+
+@node Tree Display
+@section Tree Display
+@cindex trees
+
+@vindex gnus-use-trees
+If you don't like the normal Gnus summary display, you might try setting
+@code{gnus-use-trees} to @code{t}.  This will create (by default) an
+additional @dfn{tree buffer}.  You can execute all summary mode commands
+in the tree buffer.
+
+There are a few variables to customize the tree display, of course:
+
+@table @code
+@item gnus-tree-mode-hook
+@vindex gnus-tree-mode-hook
+A hook called in all tree mode buffers.
+
+@item gnus-tree-mode-line-format
+@vindex gnus-tree-mode-line-format
+A format string for the mode bar in the tree mode buffers (@pxref{Mode
+Line Formatting}).  The default is @samp{Gnus: %%b %S %Z}.  For a list
+of valid specs, @pxref{Summary Buffer Mode Line}.
+
+@item gnus-selected-tree-face
+@vindex gnus-selected-tree-face
+Face used for highlighting the selected article in the tree buffer.  The
+default is @code{modeline}.
+
+@item gnus-tree-line-format
+@vindex gnus-tree-line-format
+A format string for the tree nodes.  The name is a bit of a misnomer,
+though---it doesn't define a line, but just the node.  The default value
+is @samp{%(%[%3,3n%]%)}, which displays the first three characters of
+the name of the poster.  It is vital that all nodes are of the same
+length, so you @emph{must} use @samp{%4,4n}-like specifiers.
+
+Valid specs are:
+
+@table @samp
+@item n
+The name of the poster.
+@item f
+The @code{From} header.
+@item N
+The number of the article.
+@item [
+The opening bracket.
+@item ]
+The closing bracket.
+@item s
+The subject.
+@end table
+
+@xref{Formatting Variables}.
+
+Variables related to the display are:
+
+@table @code
+@item gnus-tree-brackets
+@vindex gnus-tree-brackets
+This is used for differentiating between ``real'' articles and
+``sparse'' articles.  The format is
+@example
+((@var{real-open} . @var{real-close})
+ (@var{sparse-open} . @var{sparse-close})
+ (@var{dummy-open} . @var{dummy-close}))
+@end example
+and the default is @code{((?[ . ?]) (?( . ?)) (?@{ . ?@}) (?< . ?>))}.
+
+@item gnus-tree-parent-child-edges
+@vindex gnus-tree-parent-child-edges
+This is a list that contains the characters used for connecting parent
+nodes to their children.  The default is @code{(?- ?\\ ?|)}.
+
+@end table
+
+@item gnus-tree-minimize-window
+@vindex gnus-tree-minimize-window
+If this variable is non-@code{nil}, Gnus will try to keep the tree
+buffer as small as possible to allow more room for the other Gnus
+windows.  If this variable is a number, the tree buffer will never be
+higher than that number.  The default is @code{t}.  Note that if you
+have several windows displayed side-by-side in a frame and the tree
+buffer is one of these, minimizing the tree window will also resize all
+other windows displayed next to it.
+
+You may also wish to add the following hook to keep the window minimized
+at all times:
+
+@lisp
+(add-hook 'gnus-configure-windows-hook
+          'gnus-tree-perhaps-minimize)
+@end lisp
+
+@item gnus-generate-tree-function
+@vindex gnus-generate-tree-function
+@findex gnus-generate-horizontal-tree
+@findex gnus-generate-vertical-tree
+The function that actually generates the thread tree.  Two predefined
+functions are available: @code{gnus-generate-horizontal-tree} and
+@code{gnus-generate-vertical-tree} (which is the default).
+
+@end table
+
+Here's an example from a horizontal tree buffer:
+
+@example
+@{***@}-(***)-[odd]-[Gun]
+     |      \[Jan]
+     |      \[odd]-[Eri]
+     |      \(***)-[Eri]
+     |            \[odd]-[Paa]
+     \[Bjo]
+     \[Gun]
+     \[Gun]-[Jor]
+@end example
+
+Here's the same thread displayed in a vertical tree buffer:
+
+@example
+@group
+@{***@}
+  |--------------------------\-----\-----\
+(***)                         [Bjo] [Gun] [Gun]
+  |--\-----\-----\                          |
+[odd] [Jan] [odd] (***)                   [Jor]
+  |           |     |--\
+[Gun]       [Eri] [Eri] [odd]
+                          |
+                        [Paa]
+@end group
+@end example
+
+If you're using horizontal trees, it might be nice to display the trees
+side-by-side with the summary buffer.  You could add something like the
+following to your @file{~/.gnus.el} file:
+
+@lisp
+(setq gnus-use-trees t
+      gnus-generate-tree-function 'gnus-generate-horizontal-tree
+      gnus-tree-minimize-window nil)
+(gnus-add-configuration
+ '(article
+   (vertical 1.0
+             (horizontal 0.25
+                         (summary 0.75 point)
+                         (tree 1.0))
+             (article 1.0))))
+@end lisp
+
+@xref{Window Layout}.
+
+
+@node Mail Group Commands
+@section Mail Group Commands
+@cindex mail group commands
+
+Some commands only make sense in mail groups.  If these commands are
+invalid in the current group, they will raise a hell and let you know.
+
+All these commands (except the expiry and edit commands) use the
+process/prefix convention (@pxref{Process/Prefix}).
+
+@table @kbd
+
+@item B e
+@kindex B e (Summary)
+@findex gnus-summary-expire-articles
+@cindex expiring mail
+Run all expirable articles in the current group through the expiry
+process (@code{gnus-summary-expire-articles}).  That is, delete all
+expirable articles in the group that have been around for a while.
+(@pxref{Expiring Mail}).
+
+@item B C-M-e
+@kindex B C-M-e (Summary)
+@findex gnus-summary-expire-articles-now
+@cindex expiring mail
+Delete all the expirable articles in the group
+(@code{gnus-summary-expire-articles-now}).  This means that @strong{all}
+articles eligible for expiry in the current group will
+disappear forever into that big @file{/dev/null} in the sky.
+
+@item B DEL
+@kindex B DEL (Summary)
+@findex gnus-summary-delete-article
+@c @icon{gnus-summary-mail-delete}
+Delete the mail article.  This is ``delete'' as in ``delete it from your
+disk forever and ever, never to return again.'' Use with caution.
+(@code{gnus-summary-delete-article}).
+
+@item B m
+@kindex B m (Summary)
+@cindex move mail
+@findex gnus-summary-move-article
+@vindex gnus-preserve-marks
+Move the article from one mail group to another
+(@code{gnus-summary-move-article}).  Marks will be preserved if
+@code{gnus-preserve-marks} is non-@code{nil} (which is the default).
+
+@item B c
+@kindex B c (Summary)
+@cindex copy mail
+@findex gnus-summary-copy-article
+@c @icon{gnus-summary-mail-copy}
+Copy the article from one group (mail group or not) to a mail group
+(@code{gnus-summary-copy-article}).  Marks will be preserved if
+@code{gnus-preserve-marks} is non-@code{nil} (which is the default).
+
+@item B B
+@kindex B B (Summary)
+@cindex crosspost mail
+@findex gnus-summary-crosspost-article
+Crosspost the current article to some other group
+(@code{gnus-summary-crosspost-article}).  This will create a new copy of
+the article in the other group, and the Xref headers of the article will
+be properly updated.
+
+@item B i
+@kindex B i (Summary)
+@findex gnus-summary-import-article
+Import an arbitrary file into the current mail newsgroup
+(@code{gnus-summary-import-article}).  You will be prompted for a file
+name, a @code{From} header and a @code{Subject} header.
+
+@item B I
+@kindex B I (Summary)
+@findex gnus-summary-create-article
+Create an empty article in the current mail newsgroups
+(@code{gnus-summary-create-article}).  You will be prompted for a
+@code{From} header and a @code{Subject} header.
+
+@item B r
+@kindex B r (Summary)
+@findex gnus-summary-respool-article
+@vindex gnus-summary-respool-default-method
+Respool the mail article (@code{gnus-summary-respool-article}).
+@code{gnus-summary-respool-default-method} will be used as the default
+select method when respooling.  This variable is @code{nil} by default,
+which means that the current group select method will be used instead.
+Marks will be preserved if @code{gnus-preserve-marks} is non-@code{nil}
+(which is the default).
+
+@item B w
+@itemx e
+@kindex B w (Summary)
+@kindex e (Summary)
+@findex gnus-summary-edit-article
+@kindex C-c C-c (Article)
+@findex gnus-summary-edit-article-done
+Edit the current article (@code{gnus-summary-edit-article}).  To finish
+editing and make the changes permanent, type @kbd{C-c C-c}
+(@code{gnus-summary-edit-article-done}).  If you give a prefix to the
+@kbd{C-c C-c} command, Gnus won't re-highlight the article.
+
+@item B q
+@kindex B q (Summary)
+@findex gnus-summary-respool-query
+If you want to re-spool an article, you might be curious as to what group
+the article will end up in before you do the re-spooling.  This command
+will tell you (@code{gnus-summary-respool-query}).
+
+@item B t
+@kindex B t (Summary)
+@findex gnus-summary-respool-trace
+Similarly, this command will display all fancy splitting patterns used
+when respooling, if any (@code{gnus-summary-respool-trace}).
+
+@item B p
+@kindex B p (Summary)
+@findex gnus-summary-article-posted-p
+Some people have a tendency to send you ``courtesy'' copies when they
+follow up to articles you have posted.  These usually have a
+@code{Newsgroups} header in them, but not always.  This command
+(@code{gnus-summary-article-posted-p}) will try to fetch the current
+article from your news server (or rather, from
+@code{gnus-refer-article-method} or @code{gnus-select-method}) and will
+report back whether it found the article or not.  Even if it says that
+it didn't find the article, it may have been posted anyway---mail
+propagation is much faster than news propagation, and the news copy may
+just not have arrived yet.
+
+@item K E
+@kindex K E (Summary)
+@findex gnus-article-encrypt-body
+@vindex gnus-article-encrypt-protocol
+Encrypt the body of an article (@code{gnus-article-encrypt-body}).
+The body is encrypted with the encryption protocol specified by the
+variable @code{gnus-article-encrypt-protocol}.
+
+@end table
+
+@vindex gnus-move-split-methods
+@cindex moving articles
+If you move (or copy) articles regularly, you might wish to have Gnus
+suggest where to put the articles.  @code{gnus-move-split-methods} is a
+variable that uses the same syntax as @code{gnus-split-methods}
+(@pxref{Saving Articles}).  You may customize that variable to create
+suggestions you find reasonable.  (Note that
+@code{gnus-move-split-methods} uses group names where
+@code{gnus-split-methods} uses file names.)
+
+@lisp
+(setq gnus-move-split-methods
+      '(("^From:.*Lars Magne" "nnml:junk")
+        ("^Subject:.*gnus" "nnfolder:important")
+        (".*" "nnml:misc")))
+@end lisp
+
+
+@node Various Summary Stuff
+@section Various Summary Stuff
+
+@menu
+* Summary Group Information::   Information oriented commands.
+* Searching for Articles::      Multiple article commands.
+* Summary Generation Commands::
+* Really Various Summary Commands::  Those pesky non-conformant commands.
+@end menu
+
+@table @code
+@vindex gnus-summary-display-while-building
+@item gnus-summary-display-while-building
+If non-@code{nil}, show and update the summary buffer as it's being
+built.  If @code{t}, update the buffer after every line is inserted.
+If the value is an integer, @var{n}, update the display every @var{n}
+lines.  The default is @code{nil}.
+
+@vindex gnus-summary-display-arrow
+@item gnus-summary-display-arrow
+If non-@code{nil}, display an arrow in the fringe to indicate the
+current article.
+
+@vindex gnus-summary-mode-hook
+@item gnus-summary-mode-hook
+This hook is called when creating a summary mode buffer.
+
+@vindex gnus-summary-generate-hook
+@item gnus-summary-generate-hook
+This is called as the last thing before doing the threading and the
+generation of the summary buffer.  It's quite convenient for customizing
+the threading variables based on what data the newsgroup has.  This hook
+is called from the summary buffer after most summary buffer variables
+have been set.
+
+@vindex gnus-summary-prepare-hook
+@item gnus-summary-prepare-hook
+It is called after the summary buffer has been generated.  You might use
+it to, for instance, highlight lines or modify the look of the buffer in
+some other ungodly manner.  I don't care.
+
+@vindex gnus-summary-prepared-hook
+@item gnus-summary-prepared-hook
+A hook called as the very last thing after the summary buffer has been
+generated.
+
+@vindex gnus-summary-ignore-duplicates
+@item gnus-summary-ignore-duplicates
+When Gnus discovers two articles that have the same @code{Message-ID},
+it has to do something drastic.  No articles are allowed to have the
+same @code{Message-ID}, but this may happen when reading mail from some
+sources.  Gnus allows you to customize what happens with this variable.
+If it is @code{nil} (which is the default), Gnus will rename the
+@code{Message-ID} (for display purposes only) and display the article as
+any other article.  If this variable is @code{t}, it won't display the
+article---it'll be as if it never existed.
+
+@vindex gnus-alter-articles-to-read-function
+@item gnus-alter-articles-to-read-function
+This function, which takes two parameters (the group name and the list
+of articles to be selected), is called to allow the user to alter the
+list of articles to be selected.
+
+For instance, the following function adds the list of cached articles to
+the list in one particular group:
+
+@lisp
+(defun my-add-cached-articles (group articles)
+  (if (string= group "some.group")
+      (append gnus-newsgroup-cached articles)
+    articles))
+@end lisp
+
+@vindex gnus-newsgroup-variables
+@item gnus-newsgroup-variables
+A list of newsgroup (summary buffer) local variables, or cons of
+variables and their default expressions to be evalled (when the default
+values are not @code{nil}), that should be made global while the summary
+buffer is active.
+
+Note: The default expressions will be evaluated (using function
+@code{eval}) before assignment to the local variable rather than just
+assigned to it.  If the default expression is the symbol @code{global},
+that symbol will not be evaluated but the global value of the local
+variable will be used instead.
+
+These variables can be used to set variables in the group parameters
+while still allowing them to affect operations done in other
+buffers.  For example:
+
+@lisp
+(setq gnus-newsgroup-variables
+      '(message-use-followup-to
+        (gnus-visible-headers .
+ "^From:\\|^Newsgroups:\\|^Subject:\\|^Date:\\|^To:")))
+@end lisp
+
+Also @pxref{Group Parameters}.
+@end table
+
+
+@node Summary Group Information
+@subsection Summary Group Information
+
+@table @kbd
+
+@item H f
+@kindex H f (Summary)
+@findex gnus-summary-fetch-faq
+@vindex gnus-group-faq-directory
+Try to fetch the @acronym{FAQ} (list of frequently asked questions)
+for the current group (@code{gnus-summary-fetch-faq}).  Gnus will try
+to get the @acronym{FAQ} from @code{gnus-group-faq-directory}, which
+is usually a directory on a remote machine.  This variable can also be
+a list of directories.  In that case, giving a prefix to this command
+will allow you to choose between the various sites.  @code{ange-ftp}
+or @code{efs} will probably be used for fetching the file.
+
+@item H d
+@kindex H d (Summary)
+@findex gnus-summary-describe-group
+Give a brief description of the current group
+(@code{gnus-summary-describe-group}).  If given a prefix, force
+rereading the description from the server.
+
+@item H h
+@kindex H h (Summary)
+@findex gnus-summary-describe-briefly
+Give an extremely brief description of the most important summary
+keystrokes (@code{gnus-summary-describe-briefly}).
+
+@item H i
+@kindex H i (Summary)
+@findex gnus-info-find-node
+Go to the Gnus info node (@code{gnus-info-find-node}).
+@end table
+
+
+@node Searching for Articles
+@subsection Searching for Articles
+
+@table @kbd
+
+@item M-s
+@kindex M-s (Summary)
+@findex gnus-summary-search-article-forward
+Search through all subsequent (raw) articles for a regexp
+(@code{gnus-summary-search-article-forward}).
+
+@item M-r
+@kindex M-r (Summary)
+@findex gnus-summary-search-article-backward
+Search through all previous (raw) articles for a regexp
+(@code{gnus-summary-search-article-backward}).
+
+@item &
+@kindex & (Summary)
+@findex gnus-summary-execute-command
+This command will prompt you for a header, a regular expression to match
+on this field, and a command to be executed if the match is made
+(@code{gnus-summary-execute-command}).  If the header is an empty
+string, the match is done on the entire article.  If given a prefix,
+search backward instead.
+
+For instance, @kbd{& RET some.*string RET #} will put the process mark on
+all articles that have heads or bodies that match @samp{some.*string}.
+
+@item M-&
+@kindex M-& (Summary)
+@findex gnus-summary-universal-argument
+Perform any operation on all articles that have been marked with
+the process mark (@code{gnus-summary-universal-argument}).
+@end table
+
+@node Summary Generation Commands
+@subsection Summary Generation Commands
+
+@table @kbd
+
+@item Y g
+@kindex Y g (Summary)
+@findex gnus-summary-prepare
+Regenerate the current summary buffer (@code{gnus-summary-prepare}).
+
+@item Y c
+@kindex Y c (Summary)
+@findex gnus-summary-insert-cached-articles
+Pull all cached articles (for the current group) into the summary buffer
+(@code{gnus-summary-insert-cached-articles}).
+
+@item Y d
+@kindex Y d (Summary)
+@findex gnus-summary-insert-dormant-articles
+Pull all dormant articles (for the current group) into the summary buffer
+(@code{gnus-summary-insert-dormant-articles}).
+
+@end table
+
+
+@node Really Various Summary Commands
+@subsection Really Various Summary Commands
+
+@table @kbd
+
+@item A D
+@itemx C-d
+@kindex C-d (Summary)
+@kindex A D (Summary)
+@findex gnus-summary-enter-digest-group
+If the current article is a collection of other articles (for instance,
+a digest), you might use this command to enter a group based on the that
+article (@code{gnus-summary-enter-digest-group}).  Gnus will try to
+guess what article type is currently displayed unless you give a prefix
+to this command, which forces a ``digest'' interpretation.  Basically,
+whenever you see a message that is a collection of other messages of
+some format, you @kbd{C-d} and read these messages in a more convenient
+fashion.
+
+@item C-M-d
+@kindex C-M-d (Summary)
+@findex gnus-summary-read-document
+This command is very similar to the one above, but lets you gather
+several documents into one biiig group
+(@code{gnus-summary-read-document}).  It does this by opening several
+@code{nndoc} groups for each document, and then opening an
+@code{nnvirtual} group on top of these @code{nndoc} groups.  This
+command understands the process/prefix convention
+(@pxref{Process/Prefix}).
+
+@item C-t
+@kindex C-t (Summary)
+@findex gnus-summary-toggle-truncation
+Toggle truncation of summary lines
+(@code{gnus-summary-toggle-truncation}).  This will probably confuse the
+line centering function in the summary buffer, so it's not a good idea
+to have truncation switched off while reading articles.
+
+@item =
+@kindex = (Summary)
+@findex gnus-summary-expand-window
+Expand the summary buffer window (@code{gnus-summary-expand-window}).
+If given a prefix, force an @code{article} window configuration.
+
+@item C-M-e
+@kindex C-M-e (Summary)
+@findex gnus-summary-edit-parameters
+Edit the group parameters (@pxref{Group Parameters}) of the current
+group (@code{gnus-summary-edit-parameters}).
+
+@item C-M-a
+@kindex C-M-a (Summary)
+@findex gnus-summary-customize-parameters
+Customize the group parameters (@pxref{Group Parameters}) of the current
+group (@code{gnus-summary-customize-parameters}).
+
+@end table
+
+
+@node Exiting the Summary Buffer
+@section Exiting the Summary Buffer
+@cindex summary exit
+@cindex exiting groups
+
+Exiting from the summary buffer will normally update all info on the
+group and return you to the group buffer.
+
+@table @kbd
+
+@item Z Z
+@itemx Z Q
+@itemx q
+@kindex Z Z (Summary)
+@kindex Z Q (Summary)
+@kindex q (Summary)
+@findex gnus-summary-exit
+@vindex gnus-summary-exit-hook
+@vindex gnus-summary-prepare-exit-hook
+@vindex gnus-group-no-more-groups-hook
+@c @icon{gnus-summary-exit}
+Exit the current group and update all information on the group
+(@code{gnus-summary-exit}).  @code{gnus-summary-prepare-exit-hook} is
+called before doing much of the exiting, which calls
+@code{gnus-summary-expire-articles} by default.
+@code{gnus-summary-exit-hook} is called after finishing the exit
+process.  @code{gnus-group-no-more-groups-hook} is run when returning to
+group mode having no more (unread) groups.
+
+@item Z E
+@itemx Q
+@kindex Z E (Summary)
+@kindex Q (Summary)
+@findex gnus-summary-exit-no-update
+Exit the current group without updating any information on the group
+(@code{gnus-summary-exit-no-update}).
+
+@item Z c
+@itemx c
+@kindex Z c (Summary)
+@kindex c (Summary)
+@findex gnus-summary-catchup-and-exit
+@c @icon{gnus-summary-catchup-and-exit}
+Mark all unticked articles in the group as read and then exit
+(@code{gnus-summary-catchup-and-exit}).
+
+@item Z C
+@kindex Z C (Summary)
+@findex gnus-summary-catchup-all-and-exit
+Mark all articles, even the ticked ones, as read and then exit
+(@code{gnus-summary-catchup-all-and-exit}).
+
+@item Z n
+@kindex Z n (Summary)
+@findex gnus-summary-catchup-and-goto-next-group
+Mark all articles as read and go to the next group
+(@code{gnus-summary-catchup-and-goto-next-group}).
+
+@item Z R
+@itemx C-x C-s
+@kindex Z R (Summary)
+@kindex C-x C-s (Summary)
+@findex gnus-summary-reselect-current-group
+Exit this group, and then enter it again
+(@code{gnus-summary-reselect-current-group}).  If given a prefix, select
+all articles, both read and unread.
+
+@item Z G
+@itemx M-g
+@kindex Z G (Summary)
+@kindex M-g (Summary)
+@findex gnus-summary-rescan-group
+@c @icon{gnus-summary-mail-get}
+Exit the group, check for new articles in the group, and select the
+group (@code{gnus-summary-rescan-group}).  If given a prefix, select all
+articles, both read and unread.
+
+@item Z N
+@kindex Z N (Summary)
+@findex gnus-summary-next-group
+Exit the group and go to the next group
+(@code{gnus-summary-next-group}).
+
+@item Z P
+@kindex Z P (Summary)
+@findex gnus-summary-prev-group
+Exit the group and go to the previous group
+(@code{gnus-summary-prev-group}).
+
+@item Z s
+@kindex Z s (Summary)
+@findex gnus-summary-save-newsrc
+Save the current number of read/marked articles in the dribble buffer
+and then save the dribble buffer (@code{gnus-summary-save-newsrc}).  If
+given a prefix, also save the @file{.newsrc} file(s).  Using this
+command will make exit without updating (the @kbd{Q} command) worthless.
+@end table
+
+@vindex gnus-exit-group-hook
+@code{gnus-exit-group-hook} is called when you exit the current group
+with an ``updating'' exit.  For instance @kbd{Q}
+(@code{gnus-summary-exit-no-update}) does not call this hook.
+
+@findex gnus-summary-wake-up-the-dead
+@findex gnus-dead-summary-mode
+@vindex gnus-kill-summary-on-exit
+If you're in the habit of exiting groups, and then changing your mind
+about it, you might set @code{gnus-kill-summary-on-exit} to @code{nil}.
+If you do that, Gnus won't kill the summary buffer when you exit it.
+(Quelle surprise!)  Instead it will change the name of the buffer to
+something like @samp{*Dead Summary ... *} and install a minor mode
+called @code{gnus-dead-summary-mode}.  Now, if you switch back to this
+buffer, you'll find that all keys are mapped to a function called
+@code{gnus-summary-wake-up-the-dead}.  So tapping any keys in a dead
+summary buffer will result in a live, normal summary buffer.
+
+There will never be more than one dead summary buffer at any one time.
+
+@vindex gnus-use-cross-reference
+The data on the current group will be updated (which articles you have
+read, which articles you have replied to, etc.) when you exit the
+summary buffer.  If the @code{gnus-use-cross-reference} variable is
+@code{t} (which is the default), articles that are cross-referenced to
+this group and are marked as read, will also be marked as read in the
+other subscribed groups they were cross-posted to.  If this variable is
+neither @code{nil} nor @code{t}, the article will be marked as read in
+both subscribed and unsubscribed groups (@pxref{Crosspost Handling}).
+
+
+@node Crosspost Handling
+@section Crosspost Handling
+
+@cindex velveeta
+@cindex spamming
+Marking cross-posted articles as read ensures that you'll never have to
+read the same article more than once.  Unless, of course, somebody has
+posted it to several groups separately.  Posting the same article to
+several groups (not cross-posting) is called @dfn{spamming}, and you are
+by law required to send nasty-grams to anyone who perpetrates such a
+heinous crime.  You may want to try NoCeM handling to filter out spam
+(@pxref{NoCeM}).
+
+Remember: Cross-posting is kinda ok, but posting the same article
+separately to several groups is not.  Massive cross-posting (aka.
+@dfn{velveeta}) is to be avoided at all costs, and you can even use the
+@code{gnus-summary-mail-crosspost-complaint} command to complain about
+excessive crossposting (@pxref{Summary Mail Commands}).
+
+@cindex cross-posting
+@cindex Xref
+@cindex @acronym{NOV}
+One thing that may cause Gnus to not do the cross-posting thing
+correctly is if you use an @acronym{NNTP} server that supports @sc{xover}
+(which is very nice, because it speeds things up considerably) which
+does not include the @code{Xref} header in its @acronym{NOV} lines.  This is
+Evil, but all too common, alas, alack.  Gnus tries to Do The Right Thing
+even with @sc{xover} by registering the @code{Xref} lines of all
+articles you actually read, but if you kill the articles, or just mark
+them as read without reading them, Gnus will not get a chance to snoop
+the @code{Xref} lines out of these articles, and will be unable to use
+the cross reference mechanism.
+
+@cindex LIST overview.fmt
+@cindex overview.fmt
+To check whether your @acronym{NNTP} server includes the @code{Xref} header
+in its overview files, try @samp{telnet your.nntp.server nntp},
+@samp{MODE READER} on @code{inn} servers, and then say @samp{LIST
+overview.fmt}.  This may not work, but if it does, and the last line you
+get does not read @samp{Xref:full}, then you should shout and whine at
+your news admin until she includes the @code{Xref} header in the
+overview files.
+
+If you want Gnus to get the @code{Xref}s right all the time, you have to
+set @code{nntp-nov-is-evil} to @code{t}, which slows things down
+considerably.  Also @pxref{Slow/Expensive Connection}.
+
+C'est la vie.
+
+For an alternative approach, @pxref{Duplicate Suppression}.
+
+
+@node Duplicate Suppression
+@section Duplicate Suppression
+
+By default, Gnus tries to make sure that you don't have to read the same
+article more than once by utilizing the crossposting mechanism
+(@pxref{Crosspost Handling}).  However, that simple and efficient
+approach may not work satisfactory for some users for various
+reasons.
+
+@enumerate
+@item
+The @acronym{NNTP} server may fail to generate the @code{Xref} header.  This
+is evil and not very common.
+
+@item
+The @acronym{NNTP} server may fail to include the @code{Xref} header in the
+@file{.overview} data bases.  This is evil and all too common, alas.
+
+@item
+You may be reading the same group (or several related groups) from
+different @acronym{NNTP} servers.
+
+@item
+You may be getting mail that duplicates articles posted to groups.
+@end enumerate
+
+I'm sure there are other situations where @code{Xref} handling fails as
+well, but these four are the most common situations.
+
+If, and only if, @code{Xref} handling fails for you, then you may
+consider switching on @dfn{duplicate suppression}.  If you do so, Gnus
+will remember the @code{Message-ID}s of all articles you have read or
+otherwise marked as read, and then, as if by magic, mark them as read
+all subsequent times you see them---in @emph{all} groups.  Using this
+mechanism is quite likely to be somewhat inefficient, but not overly
+so.  It's certainly preferable to reading the same articles more than
+once.
+
+Duplicate suppression is not a very subtle instrument.  It's more like a
+sledge hammer than anything else.  It works in a very simple
+fashion---if you have marked an article as read, it adds this Message-ID
+to a cache.  The next time it sees this Message-ID, it will mark the
+article as read with the @samp{M} mark.  It doesn't care what group it
+saw the article in.
+
+@table @code
+@item gnus-suppress-duplicates
+@vindex gnus-suppress-duplicates
+If non-@code{nil}, suppress duplicates.
+
+@item gnus-save-duplicate-list
+@vindex gnus-save-duplicate-list
+If non-@code{nil}, save the list of duplicates to a file.  This will
+make startup and shutdown take longer, so the default is @code{nil}.
+However, this means that only duplicate articles read in a single Gnus
+session are suppressed.
+
+@item gnus-duplicate-list-length
+@vindex gnus-duplicate-list-length
+This variable says how many @code{Message-ID}s to keep in the duplicate
+suppression list.  The default is 10000.
+
+@item gnus-duplicate-file
+@vindex gnus-duplicate-file
+The name of the file to store the duplicate suppression list in.  The
+default is @file{~/News/suppression}.
+@end table
+
+If you have a tendency to stop and start Gnus often, setting
+@code{gnus-save-duplicate-list} to @code{t} is probably a good idea.  If
+you leave Gnus running for weeks on end, you may have it @code{nil}.  On
+the other hand, saving the list makes startup and shutdown much slower,
+so that means that if you stop and start Gnus often, you should set
+@code{gnus-save-duplicate-list} to @code{nil}.  Uhm.  I'll leave this up
+to you to figure out, I think.
+
+@node Security
+@section Security
+
+Gnus is able to verify signed messages or decrypt encrypted messages.
+The formats that are supported are @acronym{PGP}, @acronym{PGP/MIME}
+and @acronym{S/MIME}, however you need some external programs to get
+things to work:
+
+@enumerate
+@item
+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 Gnus is called PGG (@pxref{Top, ,PGG, pgg, PGG
+Manual}), but Mailcrypt and gpg.el are also supported.
+
+@item
+To handle @acronym{S/MIME} message, you need to install OpenSSL.  OpenSSL 0.9.6
+or newer is recommended.
+
+@end enumerate
+
+The variables that control security functionality on reading messages
+include:
+
+@table @code
+@item mm-verify-option
+@vindex mm-verify-option
+Option of verifying signed parts.  @code{never}, not verify;
+@code{always}, always verify; @code{known}, only verify known
+protocols.  Otherwise, ask user.
+
+@item mm-decrypt-option
+@vindex mm-decrypt-option
+Option of decrypting encrypted parts.  @code{never}, no decryption;
+@code{always}, always decrypt; @code{known}, only decrypt known
+protocols.  Otherwise, ask user.
+
+@item mml1991-use
+@vindex mml1991-use
+Symbol indicating elisp interface to OpenPGP implementation for
+@acronym{PGP} messages.  The default is @code{pgg}, but
+@code{mailcrypt} and @code{gpg} are also supported although
+deprecated.
+
+@item mml2015-use
+@vindex mml2015-use
+Symbol indicating elisp interface to OpenPGP implementation for
+@acronym{PGP/MIME} messages.  The default is @code{pgg}, but
+@code{mailcrypt} and @code{gpg} are also supported although
+deprecated.
+
+@end table
+
+By default the buttons that display security information are not
+shown, because they clutter reading the actual e-mail.  You can type
+@kbd{K b} manually to display the information.  Use the
+@code{gnus-buttonized-mime-types} and
+@code{gnus-unbuttonized-mime-types} variables to control this
+permanently.  @ref{MIME Commands} for further details, and hints on
+how to customize these variables to always display security
+information.
+
+@cindex snarfing keys
+@cindex importing PGP keys
+@cindex PGP key ring import
+Snarfing OpenPGP keys (i.e., importing keys from articles into your
+key ring) is not supported explicitly through a menu item or command,
+rather Gnus do detect and label keys as @samp{application/pgp-keys},
+allowing you to specify whatever action you think is appropriate
+through the usual @acronym{MIME} infrastructure.  You can use a
+@file{~/.mailcap} entry (@pxref{mailcap, , mailcap, emacs-mime, The
+Emacs MIME Manual}) such as the following to import keys using GNU
+Privacy Guard when you click on the @acronym{MIME} button
+(@pxref{Using MIME}).
+
+@example
+application/pgp-keys; gpg --import --interactive --verbose; needsterminal
+@end example
+@noindent
+This happens to also be the default action defined in
+@code{mailcap-mime-data}.
+
+More information on how to set things for sending outgoing signed and
+encrypted messages up can be found in the message manual
+(@pxref{Security, ,Security, message, Message Manual}).
+
+@node Mailing List
+@section Mailing List
+@cindex mailing list
+@cindex RFC 2396
+
+@kindex A M (summary)
+@findex gnus-mailing-list-insinuate
+Gnus understands some mailing list fields of RFC 2369.  To enable it,
+add a @code{to-list} group parameter (@pxref{Group Parameters}),
+possibly using @kbd{A M} (@code{gnus-mailing-list-insinuate}) in the
+summary buffer.
+
+That enables the following commands to the summary buffer:
+
+@table @kbd
+
+@item C-c C-n h
+@kindex C-c C-n h (Summary)
+@findex gnus-mailing-list-help
+Send a message to fetch mailing list help, if List-Help field exists.
+
+@item C-c C-n s
+@kindex C-c C-n s (Summary)
+@findex gnus-mailing-list-subscribe
+Send a message to subscribe the mailing list, if List-Subscribe field exists.
+
+@item C-c C-n u
+@kindex C-c C-n u (Summary)
+@findex gnus-mailing-list-unsubscribe
+Send a message to unsubscribe the mailing list, if List-Unsubscribe
+field exists.
+
+@item C-c C-n p
+@kindex C-c C-n p (Summary)
+@findex gnus-mailing-list-post
+Post to the mailing list, if List-Post field exists.
+
+@item C-c C-n o
+@kindex C-c C-n o (Summary)
+@findex gnus-mailing-list-owner
+Send a message to the mailing list owner, if List-Owner field exists.
+
+@item C-c C-n a
+@kindex C-c C-n a (Summary)
+@findex gnus-mailing-list-owner
+Browse the mailing list archive, if List-Archive field exists.
+
+@end table
+
+
+@node Article Buffer
+@chapter Article Buffer
+@cindex article buffer
+
+The articles are displayed in the article buffer, of which there is only
+one.  All the summary buffers share the same article buffer unless you
+tell Gnus otherwise.
+
+@menu
+* Hiding Headers::              Deciding what headers should be displayed.
+* Using MIME::                  Pushing articles through @acronym{MIME} before reading them.
+* Customizing Articles::        Tailoring the look of the articles.
+* Article Keymap::              Keystrokes available in the article buffer.
+* Misc Article::                Other stuff.
+@end menu
+
+
+@node Hiding Headers
+@section Hiding Headers
+@cindex hiding headers
+@cindex deleting headers
+
+The top section of each article is the @dfn{head}.  (The rest is the
+@dfn{body}, but you may have guessed that already.)
+
+@vindex gnus-show-all-headers
+There is a lot of useful information in the head: the name of the person
+who wrote the article, the date it was written and the subject of the
+article.  That's well and nice, but there's also lots of information
+most people do not want to see---what systems the article has passed
+through before reaching you, the @code{Message-ID}, the
+@code{References}, etc. ad nauseam---and you'll probably want to get rid
+of some of those lines.  If you want to keep all those lines in the
+article buffer, you can set @code{gnus-show-all-headers} to @code{t}.
+
+Gnus provides you with two variables for sifting headers:
+
+@table @code
+
+@item gnus-visible-headers
+@vindex gnus-visible-headers
+If this variable is non-@code{nil}, it should be a regular expression
+that says what headers you wish to keep in the article buffer.  All
+headers that do not match this variable will be hidden.
+
+For instance, if you only want to see the name of the person who wrote
+the article and the subject, you'd say:
+
+@lisp
+(setq gnus-visible-headers "^From:\\|^Subject:")
+@end lisp
+
+This variable can also be a list of regexps to match headers to
+remain visible.
+
+@item gnus-ignored-headers
+@vindex gnus-ignored-headers
+This variable is the reverse of @code{gnus-visible-headers}.  If this
+variable is set (and @code{gnus-visible-headers} is @code{nil}), it
+should be a regular expression that matches all lines that you want to
+hide.  All lines that do not match this variable will remain visible.
+
+For instance, if you just want to get rid of the @code{References} line
+and the @code{Xref} line, you might say:
+
+@lisp
+(setq gnus-ignored-headers "^References:\\|^Xref:")
+@end lisp
+
+This variable can also be a list of regexps to match headers to
+be removed.
+
+Note that if @code{gnus-visible-headers} is non-@code{nil}, this
+variable will have no effect.
+
+@end table
+
+@vindex gnus-sorted-header-list
+Gnus can also sort the headers for you.  (It does this by default.)  You
+can control the sorting by setting the @code{gnus-sorted-header-list}
+variable.  It is a list of regular expressions that says in what order
+the headers are to be displayed.
+
+For instance, if you want the name of the author of the article first,
+and then the subject, you might say something like:
+
+@lisp
+(setq gnus-sorted-header-list '("^From:" "^Subject:"))
+@end lisp
+
+Any headers that are to remain visible, but are not listed in this
+variable, will be displayed in random order after all the headers listed in this variable.
+
+@findex gnus-article-hide-boring-headers
+@vindex gnus-boring-article-headers
+You can hide further boring headers by setting
+@code{gnus-treat-hide-boring-headers} to @code{head}.  What this function
+does depends on the @code{gnus-boring-article-headers} variable.  It's a
+list, but this list doesn't actually contain header names.  Instead it
+lists various @dfn{boring conditions} that Gnus can check and remove
+from sight.
+
+These conditions are:
+@table @code
+@item empty
+Remove all empty headers.
+@item followup-to
+Remove the @code{Followup-To} header if it is identical to the
+@code{Newsgroups} header.
+@item reply-to
+Remove the @code{Reply-To} header if it lists the same addresses as
+the @code{From} header, or if the @code{broken-reply-to} group
+parameter is set.
+@item newsgroups
+Remove the @code{Newsgroups} header if it only contains the current group
+name.
+@item to-address
+Remove the @code{To} header if it only contains the address identical to
+the current group's @code{to-address} parameter.
+@item to-list
+Remove the @code{To} header if it only contains the address identical to
+the current group's @code{to-list} parameter.
+@item cc-list
+Remove the @code{Cc} header if it only contains the address identical to
+the current group's @code{to-list} parameter.
+@item date
+Remove the @code{Date} header if the article is less than three days
+old.
+@item long-to
+Remove the @code{To} and/or @code{Cc} header if it is very long.
+@item many-to
+Remove all @code{To} and/or @code{Cc} headers if there are more than one.
+@end table
+
+To include these three elements, you could say something like:
+
+@lisp
+(setq gnus-boring-article-headers
+      '(empty followup-to reply-to))
+@end lisp
+
+This is also the default value for this variable.
+
+
+@node Using MIME
+@section Using MIME
+@cindex @acronym{MIME}
+
+Mime is a standard for waving your hands through the air, aimlessly,
+while people stand around yawning.
+
+@acronym{MIME}, however, is a standard for encoding your articles, aimlessly,
+while all newsreaders die of fear.
+
+@acronym{MIME} may specify what character set the article uses, the encoding
+of the characters, and it also makes it possible to embed pictures and
+other naughty stuff in innocent-looking articles.
+
+@vindex gnus-display-mime-function
+@findex gnus-display-mime
+Gnus pushes @acronym{MIME} articles through @code{gnus-display-mime-function}
+to display the @acronym{MIME} parts.  This is @code{gnus-display-mime} by
+default, which creates a bundle of clickable buttons that can be used to
+display, save and manipulate the @acronym{MIME} objects.
+
+The following commands are available when you have placed point over a
+@acronym{MIME} button:
+
+@table @kbd
+@findex gnus-article-press-button
+@item RET (Article)
+@kindex RET (Article)
+@itemx BUTTON-2 (Article)
+Toggle displaying of the @acronym{MIME} object
+(@code{gnus-article-press-button}).  If built-in viewers can not display
+the object, Gnus resorts to external viewers in the @file{mailcap}
+files.  If a viewer has the @samp{copiousoutput} specification, the
+object is displayed inline.
+
+@findex gnus-mime-view-part
+@item M-RET (Article)
+@kindex M-RET (Article)
+@itemx v (Article)
+Prompt for a method, and then view the @acronym{MIME} object using this
+method (@code{gnus-mime-view-part}).
+
+@findex gnus-mime-view-part-as-type
+@item t (Article)
+@kindex t (Article)
+View the @acronym{MIME} object as if it were a different @acronym{MIME} media type
+(@code{gnus-mime-view-part-as-type}).
+
+@findex gnus-mime-view-part-as-charset
+@item C (Article)
+@kindex C (Article)
+Prompt for a charset, and then view the @acronym{MIME} object using this
+charset (@code{gnus-mime-view-part-as-charset}).
+
+@findex gnus-mime-save-part
+@item o (Article)
+@kindex o (Article)
+Prompt for a file name, and then save the @acronym{MIME} object
+(@code{gnus-mime-save-part}).
+
+@findex gnus-mime-save-part-and-strip
+@item C-o (Article)
+@kindex C-o (Article)
+Prompt for a file name, then save the @acronym{MIME} object and strip it from
+the article.  Then proceed to article editing, where a reasonable
+suggestion is being made on how the altered article should look
+like.  The stripped @acronym{MIME} object will be referred via the
+message/external-body @acronym{MIME} type.
+(@code{gnus-mime-save-part-and-strip}).
+
+@findex gnus-mime-delete-part
+@item d (Article)
+@kindex d (Article)
+Delete the @acronym{MIME} object from the article and replace it with some
+information about the removed @acronym{MIME} object
+(@code{gnus-mime-delete-part}).
+
+@findex gnus-mime-copy-part
+@item c (Article)
+@kindex c (Article)
+Copy the @acronym{MIME} object to a fresh buffer and display this buffer
+(@code{gnus-mime-copy-part}).  Compressed files like @file{.gz} and
+@file{.bz2} are automatically decompressed if
+@code{auto-compression-mode} is enabled (@pxref{Compressed Files,,
+Accessing Compressed Files, emacs, The Emacs Editor}).
+
+@findex gnus-mime-print-part
+@item p (Article)
+@kindex p (Article)
+Print the @acronym{MIME} object (@code{gnus-mime-print-part}).  This
+command respects the @samp{print=} specifications in the
+@file{.mailcap} file.
+
+@findex gnus-mime-inline-part
+@item i (Article)
+@kindex i (Article)
+Insert the contents of the @acronym{MIME} object into the buffer
+(@code{gnus-mime-inline-part}) as text/plain.  If given a prefix, insert
+the raw contents without decoding.  If given a numerical prefix, you can
+do semi-manual charset stuff (see
+@code{gnus-summary-show-article-charset-alist} in @ref{Paging the
+Article}).
+
+@findex gnus-mime-view-part-internally
+@item E (Article)
+@kindex E (Article)
+View the @acronym{MIME} object with an internal viewer.  If no internal
+viewer is available, use an external viewer
+(@code{gnus-mime-view-part-internally}).
+
+@findex gnus-mime-view-part-externally
+@item e (Article)
+@kindex e (Article)
+View the @acronym{MIME} object with an external viewer.
+(@code{gnus-mime-view-part-externally}).
+
+@findex gnus-mime-pipe-part
+@item | (Article)
+@kindex | (Article)
+Output the @acronym{MIME} object to a process (@code{gnus-mime-pipe-part}).
+
+@findex gnus-mime-action-on-part
+@item . (Article)
+@kindex . (Article)
+Interactively run an action on the @acronym{MIME} object
+(@code{gnus-mime-action-on-part}).
+
+@end table
+
+Gnus will display some @acronym{MIME} objects automatically.  The way Gnus
+determines which parts to do this with is described in the Emacs
+@acronym{MIME} manual.
+
+It might be best to just use the toggling functions from the article
+buffer to avoid getting nasty surprises.  (For instance, you enter the
+group @samp{alt.sing-a-long} and, before you know it, @acronym{MIME} has
+decoded the sound file in the article and some horrible sing-a-long song
+comes screaming out your speakers, and you can't find the volume button,
+because there isn't one, and people are starting to look at you, and you
+try to stop the program, but you can't, and you can't find the program
+to control the volume, and everybody else in the room suddenly decides
+to look at you disdainfully, and you'll feel rather stupid.)
+
+Any similarity to real events and people is purely coincidental.  Ahem.
+
+Also @pxref{MIME Commands}.
+
+
+@node Customizing Articles
+@section Customizing Articles
+@cindex article customization
+
+A slew of functions for customizing how the articles are to look like
+exist.  You can call these functions interactively
+(@pxref{Article Washing}), or you can have them
+called automatically when you select the articles.
+
+To have them called automatically, you should set the corresponding
+``treatment'' variable.  For instance, to have headers hidden, you'd set
+@code{gnus-treat-hide-headers}.  Below is a list of variables that can
+be set, but first we discuss the values these variables can have.
+
+Note: Some values, while valid, make little sense.  Check the list below
+for sensible values.
+
+@enumerate
+@item
+@code{nil}: Don't do this treatment.
+
+@item
+@code{t}: Do this treatment on all body parts.
+
+@item
+@code{head}: Do the treatment on the headers.
+
+@item
+@code{last}: Do this treatment on the last part.
+
+@item
+An integer: Do this treatment on all body parts that have a length less
+than this number.
+
+@item
+A list of strings: Do this treatment on all body parts that are in
+articles that are read in groups that have names that match one of the
+regexps in the list.
+
+@item
+A list where the first element is not a string:
+
+The list is evaluated recursively.  The first element of the list is a
+predicate.  The following predicates are recognized: @code{or},
+@code{and}, @code{not} and @code{typep}.  Here's an example:
+
+@lisp
+(or last
+    (typep "text/x-vcard"))
+@end lisp
+
+@end enumerate
+
+You may have noticed that the word @dfn{part} is used here.  This refers
+to the fact that some messages are @acronym{MIME} multipart articles that may
+be divided into several parts.  Articles that are not multiparts are
+considered to contain just a single part.
+
+@vindex gnus-article-treat-types
+Are the treatments applied to all sorts of multipart parts?  Yes, if you
+want to, but by default, only @samp{text/plain} parts are given the
+treatment.  This is controlled by the @code{gnus-article-treat-types}
+variable, which is a list of regular expressions that are matched to the
+type of the part.  This variable is ignored if the value of the
+controlling variable is a predicate list, as described above.
+
+@ifinfo
+@c Avoid sort of redundant entries in the same section for the printed
+@c manual, but add them in info to allow `i gnus-treat-foo-bar RET' or
+@c `i foo-bar'.
+@vindex gnus-treat-buttonize
+@vindex gnus-treat-buttonize-head
+@vindex gnus-treat-capitalize-sentences
+@vindex gnus-treat-overstrike
+@vindex gnus-treat-strip-cr
+@vindex gnus-treat-strip-headers-in-body
+@vindex gnus-treat-strip-leading-blank-lines
+@vindex gnus-treat-strip-multiple-blank-lines
+@vindex gnus-treat-strip-pem
+@vindex gnus-treat-strip-trailing-blank-lines
+@vindex gnus-treat-unsplit-urls
+@vindex gnus-treat-wash-html
+@vindex gnus-treat-date-english
+@vindex gnus-treat-date-iso8601
+@vindex gnus-treat-date-lapsed
+@vindex gnus-treat-date-local
+@vindex gnus-treat-date-original
+@vindex gnus-treat-date-user-defined
+@vindex gnus-treat-date-ut
+@vindex gnus-treat-from-picon
+@vindex gnus-treat-mail-picon
+@vindex gnus-treat-newsgroups-picon
+@vindex gnus-treat-display-smileys
+@vindex gnus-treat-body-boundary
+@vindex gnus-treat-display-x-face
+@vindex gnus-treat-display-face
+@vindex gnus-treat-emphasize
+@vindex gnus-treat-fill-article
+@vindex gnus-treat-fill-long-lines
+@vindex gnus-treat-hide-boring-headers
+@vindex gnus-treat-hide-citation
+@vindex gnus-treat-hide-citation-maybe
+@vindex gnus-treat-hide-headers
+@vindex gnus-treat-hide-signature
+@vindex gnus-treat-strip-banner
+@vindex gnus-treat-strip-list-identifiers
+@vindex gnus-treat-highlight-citation
+@vindex gnus-treat-highlight-headers
+@vindex gnus-treat-highlight-signature
+@vindex gnus-treat-play-sounds
+@vindex gnus-treat-translate
+@vindex gnus-treat-x-pgp-sig
+@vindex gnus-treat-unfold-headers
+@vindex gnus-treat-fold-headers
+@vindex gnus-treat-fold-newsgroups
+@vindex gnus-treat-leading-whitespace
+@end ifinfo
+
+The following treatment options are available.  The easiest way to
+customize this is to examine the @code{gnus-article-treat} customization
+group.  Values in parenthesis are suggested sensible values.  Others are
+possible but those listed are probably sufficient for most people.
+
+@table @code
+@item gnus-treat-buttonize (t, integer)
+@item gnus-treat-buttonize-head (head)
+
+@xref{Article Buttons}.
+
+@item gnus-treat-capitalize-sentences (t, integer)
+@item gnus-treat-overstrike (t, integer)
+@item gnus-treat-strip-cr (t, integer)
+@item gnus-treat-strip-headers-in-body (t, integer)
+@item gnus-treat-strip-leading-blank-lines (t, integer)
+@item gnus-treat-strip-multiple-blank-lines (t, integer)
+@item gnus-treat-strip-pem (t, last, integer)
+@item gnus-treat-strip-trailing-blank-lines (t, last, integer)
+@item gnus-treat-unsplit-urls (t, integer)
+@item gnus-treat-wash-html (t, integer)
+
+@xref{Article Washing}.
+
+@item gnus-treat-date-english (head)
+@item gnus-treat-date-iso8601 (head)
+@item gnus-treat-date-lapsed (head)
+@item gnus-treat-date-local (head)
+@item gnus-treat-date-original (head)
+@item gnus-treat-date-user-defined (head)
+@item gnus-treat-date-ut (head)
+
+@xref{Article Date}.
+
+@item gnus-treat-from-picon (head)
+@item gnus-treat-mail-picon (head)
+@item gnus-treat-newsgroups-picon (head)
+
+@xref{Picons}.
+
+@item gnus-treat-display-smileys (t, integer)
+
+@item gnus-treat-body-boundary (head)
+
+@vindex gnus-body-boundary-delimiter
+Adds a delimiter between header and body, the string used as delimiter
+is controlled by @code{gnus-body-boundary-delimiter}.
+
+@xref{Smileys}.
+
+@vindex gnus-treat-display-x-face
+@item gnus-treat-display-x-face (head)
+
+@xref{X-Face}.
+
+@vindex gnus-treat-display-face
+@item gnus-treat-display-face (head)
+
+@xref{Face}.
+
+@vindex gnus-treat-emphasize
+@item gnus-treat-emphasize (t, head, integer)
+@vindex gnus-treat-fill-article
+@item gnus-treat-fill-article (t, integer)
+@vindex gnus-treat-fill-long-lines
+@item gnus-treat-fill-long-lines (t, integer)
+@vindex gnus-treat-hide-boring-headers
+@item gnus-treat-hide-boring-headers (head)
+@vindex gnus-treat-hide-citation
+@item gnus-treat-hide-citation (t, integer)
+@vindex gnus-treat-hide-citation-maybe
+@item gnus-treat-hide-citation-maybe (t, integer)
+@vindex gnus-treat-hide-headers
+@item gnus-treat-hide-headers (head)
+@vindex gnus-treat-hide-signature
+@item gnus-treat-hide-signature (t, last)
+@vindex gnus-treat-strip-banner
+@item gnus-treat-strip-banner (t, last)
+@vindex gnus-treat-strip-list-identifiers
+@item gnus-treat-strip-list-identifiers (head)
+
+@xref{Article Hiding}.
+
+@vindex gnus-treat-highlight-citation
+@item gnus-treat-highlight-citation (t, integer)
+@vindex gnus-treat-highlight-headers
+@item gnus-treat-highlight-headers (head)
+@vindex gnus-treat-highlight-signature
+@item gnus-treat-highlight-signature (t, last, integer)
+
+@xref{Article Highlighting}.
+
+@vindex gnus-treat-play-sounds
+@item gnus-treat-play-sounds
+@vindex gnus-treat-translate
+@item gnus-treat-translate
+@vindex gnus-treat-x-pgp-sig
+@item gnus-treat-x-pgp-sig (head)
+
+@vindex gnus-treat-unfold-headers
+@item gnus-treat-unfold-headers (head)
+@vindex gnus-treat-fold-headers
+@item gnus-treat-fold-headers (head)
+@vindex gnus-treat-fold-newsgroups
+@item gnus-treat-fold-newsgroups (head)
+@vindex gnus-treat-leading-whitespace
+@item gnus-treat-leading-whitespace (head)
+
+@xref{Article Header}.
+
+
+@end table
+
+@vindex gnus-part-display-hook
+You can, of course, write your own functions to be called from
+@code{gnus-part-display-hook}.  The functions are called narrowed to the
+part, and you can do anything you like, pretty much.  There is no
+information that you have to keep in the buffer---you can change
+everything.
+
+
+@node Article Keymap
+@section Article Keymap
+
+Most of the keystrokes in the summary buffer can also be used in the
+article buffer.  They should behave as if you typed them in the summary
+buffer, which means that you don't actually have to have a summary
+buffer displayed while reading.  You can do it all from the article
+buffer.
+
+@kindex v (Article)
+@cindex keys, reserved for users (Article)
+The key @kbd{v} is reserved for users.  You can bind it to some
+command or better use it as a prefix key.
+
+A few additional keystrokes are available:
+
+@table @kbd
+
+@item SPACE
+@kindex SPACE (Article)
+@findex gnus-article-next-page
+Scroll forwards one page (@code{gnus-article-next-page}).
+This is exactly the same as @kbd{h SPACE h}.
+
+@item DEL
+@kindex DEL (Article)
+@findex gnus-article-prev-page
+Scroll backwards one page (@code{gnus-article-prev-page}).
+This is exactly the same as @kbd{h DEL h}.
+
+@item C-c ^
+@kindex C-c ^ (Article)
+@findex gnus-article-refer-article
+If point is in the neighborhood of a @code{Message-ID} and you press
+@kbd{C-c ^}, Gnus will try to get that article from the server
+(@code{gnus-article-refer-article}).
+
+@item C-c C-m
+@kindex C-c C-m (Article)
+@findex gnus-article-mail
+Send a reply to the address near point (@code{gnus-article-mail}).  If
+given a prefix, include the mail.
+
+@item s
+@kindex s (Article)
+@findex gnus-article-show-summary
+Reconfigure the buffers so that the summary buffer becomes visible
+(@code{gnus-article-show-summary}).
+
+@item ?
+@kindex ? (Article)
+@findex gnus-article-describe-briefly
+Give a very brief description of the available keystrokes
+(@code{gnus-article-describe-briefly}).
+
+@item TAB
+@kindex TAB (Article)
+@findex gnus-article-next-button
+Go to the next button, if any (@code{gnus-article-next-button}).  This
+only makes sense if you have buttonizing turned on.
+
+@item M-TAB
+@kindex M-TAB (Article)
+@findex gnus-article-prev-button
+Go to the previous button, if any (@code{gnus-article-prev-button}).
+
+@item R
+@kindex R (Article)
+@findex gnus-article-reply-with-original
+Send a reply to the current article and yank the current article
+(@code{gnus-article-reply-with-original}).  If given a prefix, make a
+wide reply.  If the region is active, only yank the text in the
+region.
+
+@item F
+@kindex F (Article)
+@findex gnus-article-followup-with-original
+Send a followup to the current article and yank the current article
+(@code{gnus-article-followup-with-original}).  If given a prefix, make
+a wide reply.  If the region is active, only yank the text in the
+region.
+
+
+@end table
+
+
+@node Misc Article
+@section Misc Article
+
+@table @code
+
+@item gnus-single-article-buffer
+@vindex gnus-single-article-buffer
+@cindex article buffers, several
+If non-@code{nil}, use the same article buffer for all the groups.
+(This is the default.)  If @code{nil}, each group will have its own
+article buffer.
+
+@vindex gnus-article-decode-hook
+@item gnus-article-decode-hook
+@cindex @acronym{MIME}
+Hook used to decode @acronym{MIME} articles.  The default value is
+@code{(article-decode-charset article-decode-encoded-words)}
+
+@vindex gnus-article-prepare-hook
+@item gnus-article-prepare-hook
+This hook is called right after the article has been inserted into the
+article buffer.  It is mainly intended for functions that do something
+depending on the contents; it should probably not be used for changing
+the contents of the article buffer.
+
+@item gnus-article-mode-hook
+@vindex gnus-article-mode-hook
+Hook called in article mode buffers.
+
+@item gnus-article-mode-syntax-table
+@vindex gnus-article-mode-syntax-table
+Syntax table used in article buffers.  It is initialized from
+@code{text-mode-syntax-table}.
+
+@vindex gnus-article-over-scroll
+@item gnus-article-over-scroll
+If non-@code{nil}, allow scrolling the article buffer even when there
+no more new text to scroll in.  The default is @code{nil}.
+
+@vindex gnus-article-mode-line-format
+@item gnus-article-mode-line-format
+This variable is a format string along the same lines as
+@code{gnus-summary-mode-line-format} (@pxref{Summary Buffer Mode
+Line}).  It accepts the same format specifications as that variable,
+with two extensions:
+
+@table @samp
+
+@item w
+The @dfn{wash status} of the article.  This is a short string with one
+character for each possible article wash operation that may have been
+performed.  The characters and their meaning:
+
+@table @samp
+
+@item c
+Displayed when cited text may be hidden in the article buffer.
+
+@item h
+Displayed when headers are hidden in the article buffer.
+
+@item p
+Displayed when article is digitally signed or encrypted, and Gnus has
+hidden the security headers.  (N.B. does not tell anything about
+security status, i.e. good or bad signature.)
+
+@item s
+Displayed when the signature has been hidden in the Article buffer.
+
+@item o
+Displayed when Gnus has treated overstrike characters in the article buffer.
+
+@item e
+Displayed when Gnus has treated emphasised strings in the article buffer.
+
+@end table
+
+@item m
+The number of @acronym{MIME} parts in the article.
+
+@end table
+
+@vindex gnus-break-pages
+
+@item gnus-break-pages
+Controls whether @dfn{page breaking} is to take place.  If this variable
+is non-@code{nil}, the articles will be divided into pages whenever a
+page delimiter appears in the article.  If this variable is @code{nil},
+paging will not be done.
+
+@item gnus-page-delimiter
+@vindex gnus-page-delimiter
+This is the delimiter mentioned above.  By default, it is @samp{^L}
+(formfeed).
+
+@cindex IDNA
+@cindex internationalized domain names
+@vindex gnus-use-idna
+@item gnus-use-idna
+This variable controls whether Gnus performs IDNA decoding of
+internationalized domain names inside @samp{From}, @samp{To} and
+@samp{Cc} headers.  This requires
+@uref{http://www.gnu.org/software/libidn/, GNU Libidn}, and this
+variable is only enabled if you have installed it.
+
+@end table
+
+
+@node Composing Messages
+@chapter Composing Messages
+@cindex composing messages
+@cindex messages
+@cindex mail
+@cindex sending mail
+@cindex reply
+@cindex followup
+@cindex post
+@cindex using gpg
+@cindex using s/mime
+@cindex using smime
+
+@kindex C-c C-c (Post)
+All commands for posting and mailing will put you in a message buffer
+where you can edit the article all you like, before you send the
+article by pressing @kbd{C-c C-c}.  @xref{Top, , Overview, message,
+Message Manual}.  Where the message will be posted/mailed to depends
+on your setup (@pxref{Posting Server}).
+
+@menu
+* Mail::                        Mailing and replying.
+* Posting Server::              What server should you post and mail via?
+* POP before SMTP::             You cannot send a mail unless you read a mail.
+* Mail and Post::               Mailing and posting at the same time.
+* Archived Messages::           Where Gnus stores the messages you've sent.
+* Posting Styles::              An easier way to specify who you are.
+* Drafts::                      Postponing messages and rejected messages.
+* Rejected Articles::           What happens if the server doesn't like your article?
+* Signing and encrypting::      How to compose secure messages.
+@end menu
+
+Also @pxref{Canceling and Superseding} for information on how to
+remove articles you shouldn't have posted.
+
+
+@node Mail
+@section Mail
+
+Variables for customizing outgoing mail:
+
+@table @code
+@item gnus-uu-digest-headers
+@vindex gnus-uu-digest-headers
+List of regexps to match headers included in digested messages.  The
+headers will be included in the sequence they are matched.  If
+@code{nil} include all headers.
+
+@item gnus-add-to-list
+@vindex gnus-add-to-list
+If non-@code{nil}, add a @code{to-list} group parameter to mail groups
+that have none when you do a @kbd{a}.
+
+@item gnus-confirm-mail-reply-to-news
+@vindex gnus-confirm-mail-reply-to-news
+If non-@code{nil}, Gnus will ask you for a confirmation when you are
+about to reply to news articles by mail.  If it is @code{nil}, nothing
+interferes in what you want to do.  This can also be a function
+receiving the group name as the only parameter which should return
+non-@code{nil} if a confirmation is needed, or a regular expression
+matching group names, where confirmation should be asked for.
+
+If you find yourself never wanting to reply to mail, but occasionally
+press @kbd{R} anyway, this variable might be for you.
+
+@item gnus-confirm-treat-mail-like-news
+@vindex gnus-confirm-treat-mail-like-news
+If non-@code{nil}, Gnus also requests confirmation according to
+@code{gnus-confirm-mail-reply-to-news} when replying to mail.  This is
+useful for treating mailing lists like newsgroups.
+
+@end table
+
+
+@node Posting Server
+@section Posting Server
+
+When you press those magical @kbd{C-c C-c} keys to ship off your latest
+(extremely intelligent, of course) article, where does it go?
+
+Thank you for asking.  I hate you.
+
+It can be quite complicated.
+
+@vindex gnus-post-method
+When posting news, Message usually invokes @code{message-send-news}
+(@pxref{News Variables, , News Variables, message, Message Manual}).
+Normally, Gnus will post using the same select method as you're
+reading from (which might be convenient if you're reading lots of
+groups from different private servers).  However.  If the server
+you're reading from doesn't allow posting, just reading, you probably
+want to use some other server to post your (extremely intelligent and
+fabulously interesting) articles.  You can then set the
+@code{gnus-post-method} to some other method:
+
+@lisp
+(setq gnus-post-method '(nnspool ""))
+@end lisp
+
+Now, if you've done this, and then this server rejects your article, or
+this server is down, what do you do then?  To override this variable you
+can use a non-zero prefix to the @kbd{C-c C-c} command to force using
+the ``current'' server, to get back the default behavior, for posting.
+
+If you give a zero prefix (i.e., @kbd{C-u 0 C-c C-c}) to that command,
+Gnus will prompt you for what method to use for posting.
+
+You can also set @code{gnus-post-method} to a list of select methods.
+If that's the case, Gnus will always prompt you for what method to use
+for posting.
+
+Finally, if you want to always post using the native select method,
+you can set this variable to @code{native}.
+
+When sending mail, Message invokes @code{message-send-mail-function}.
+The default function, @code{message-send-mail-with-sendmail}, pipes
+your article to the @code{sendmail} binary for further queuing and
+sending.  When your local system is not configured for sending mail
+using @code{sendmail}, and you have access to a remote @acronym{SMTP}
+server, you can set @code{message-send-mail-function} to
+@code{smtpmail-send-it} and make sure to setup the @code{smtpmail}
+package correctly.  An example:
+
+@lisp
+(setq message-send-mail-function 'smtpmail-send-it
+      smtpmail-default-smtp-server "YOUR SMTP HOST")
+@end lisp
+
+To the thing similar to this, there is
+@code{message-smtpmail-send-it}.  It is useful if your @acronym{ISP}
+requires the @acronym{POP}-before-@acronym{SMTP} authentication.
+@xref{POP before SMTP}.
+
+Other possible choices for @code{message-send-mail-function} includes
+@code{message-send-mail-with-mh}, @code{message-send-mail-with-qmail},
+and @code{feedmail-send-it}.
+
+@node POP before SMTP
+@section POP before SMTP
+@cindex pop before smtp
+@findex message-smtpmail-send-it
+@findex mail-source-touch-pop
+
+Does your @acronym{ISP} require the @acronym{POP}-before-@acronym{SMTP}
+authentication?  It is whether you need to connect to the @acronym{POP}
+mail server within a certain time before sending mails.  If so, there is
+a convenient way.  To do that, put the following lines in your
+@file{~/.gnus.el} file:
+
+@lisp
+(setq message-send-mail-function 'message-smtpmail-send-it)
+(add-hook 'message-send-mail-hook 'mail-source-touch-pop)
+@end lisp
+
+@noindent
+It means to let Gnus connect to the @acronym{POP} mail server in advance
+whenever you send a mail.  The @code{mail-source-touch-pop} function
+does only a @acronym{POP} authentication according to the value of
+@code{mail-sources} without fetching mails, just before sending a mail.
+Note that you have to use @code{message-smtpmail-send-it} which runs
+@code{message-send-mail-hook} rather than @code{smtpmail-send-it} and
+set the value of @code{mail-sources} for a @acronym{POP} connection
+correctly.  @xref{Mail Sources}.
+
+If you have two or more @acronym{POP} mail servers set in
+@code{mail-sources}, you may want to specify one of them to
+@code{mail-source-primary-source} as the @acronym{POP} mail server to be
+used for the @acronym{POP}-before-@acronym{SMTP} authentication.  If it
+is your primary @acronym{POP} mail server (i.e., you are fetching mails
+mainly from that server), you can set it permanently as follows:
+
+@lisp
+(setq mail-source-primary-source
+      '(pop :server "pop3.mail.server"
+            :password "secret"))
+@end lisp
+
+@noindent
+Otherwise, bind it dynamically only when performing the
+@acronym{POP}-before-@acronym{SMTP} authentication as follows:
+
+@lisp
+(add-hook 'message-send-mail-hook
+          (lambda ()
+            (let ((mail-source-primary-source
+                   '(pop :server "pop3.mail.server"
+                         :password "secret")))
+              (mail-source-touch-pop))))
+@end lisp
+
+@node Mail and Post
+@section Mail and Post
+
+Here's a list of variables relevant to both mailing and
+posting:
+
+@table @code
+@item gnus-mailing-list-groups
+@findex gnus-mailing-list-groups
+@cindex mailing lists
+
+If your news server offers groups that are really mailing lists
+gatewayed to the @acronym{NNTP} server, you can read those groups without
+problems, but you can't post/followup to them without some difficulty.
+One solution is to add a @code{to-address} to the group parameters
+(@pxref{Group Parameters}).  An easier thing to do is set the
+@code{gnus-mailing-list-groups} to a regexp that matches the groups that
+really are mailing lists.  Then, at least, followups to the mailing
+lists will work most of the time.  Posting to these groups (@kbd{a}) is
+still a pain, though.
+
+@item gnus-user-agent
+@vindex gnus-user-agent
+@cindex User-Agent
+
+This variable controls which information should be exposed in the
+User-Agent header.  It can be a list of symbols or a string.  Valid
+symbols are @code{gnus} (show Gnus version) and @code{emacs} (show Emacs
+version).  In addition to the Emacs version, you can add @code{codename}
+(show (S)XEmacs codename) or either @code{config} (show system
+configuration) or @code{type} (show system type).  If you set it to a
+string, be sure to use a valid format, see RFC 2616.
+
+@end table
+
+You may want to do spell-checking on messages that you send out.  Or, if
+you don't want to spell-check by hand, you could add automatic
+spell-checking via the @code{ispell} package:
+
+@cindex ispell
+@findex ispell-message
+@lisp
+(add-hook 'message-send-hook 'ispell-message)
+@end lisp
+
+If you want to change the @code{ispell} dictionary based on what group
+you're in, you could say something like the following:
+
+@lisp
+(add-hook 'gnus-select-group-hook
+          (lambda ()
+            (cond
+             ((string-match
+               "^de\\." (gnus-group-real-name gnus-newsgroup-name))
+              (ispell-change-dictionary "deutsch"))
+             (t
+              (ispell-change-dictionary "english")))))
+@end lisp
+
+Modify to suit your needs.
+
+
+@node Archived Messages
+@section Archived Messages
+@cindex archived messages
+@cindex sent messages
+
+Gnus provides a few different methods for storing the mail and news you
+send.  The default method is to use the @dfn{archive virtual server} to
+store the messages.  If you want to disable this completely, the
+@code{gnus-message-archive-group} variable should be @code{nil}, which
+is the default.
+
+For archiving interesting messages in a group you read, see the
+@kbd{B c} (@code{gnus-summary-copy-article}) command (@pxref{Mail
+Group Commands}).
+
+@vindex gnus-message-archive-method
+@code{gnus-message-archive-method} says what virtual server Gnus is to
+use to store sent messages.  The default is:
+
+@lisp
+(nnfolder "archive"
+          (nnfolder-directory   "~/Mail/archive")
+          (nnfolder-active-file "~/Mail/archive/active")
+          (nnfolder-get-new-mail nil)
+          (nnfolder-inhibit-expiry t))
+@end lisp
+
+You can, however, use any mail select method (@code{nnml},
+@code{nnmbox}, etc.).  @code{nnfolder} is a quite likable select method
+for doing this sort of thing, though.  If you don't like the default
+directory chosen, you could say something like:
+
+@lisp
+(setq gnus-message-archive-method
+      '(nnfolder "archive"
+                 (nnfolder-inhibit-expiry t)
+                 (nnfolder-active-file "~/News/sent-mail/active")
+                 (nnfolder-directory "~/News/sent-mail/")))
+@end lisp
+
+@vindex gnus-message-archive-group
+@cindex Gcc
+Gnus will insert @code{Gcc} headers in all outgoing messages that point
+to one or more group(s) on that server.  Which group to use is
+determined by the @code{gnus-message-archive-group} variable.
+
+This variable can be used to do the following:
+
+@table @asis
+@item a string
+Messages will be saved in that group.
+
+Note that you can include a select method in the group name, then the
+message will not be stored in the select method given by
+@code{gnus-message-archive-method}, but in the select method specified
+by the group name, instead.  Suppose @code{gnus-message-archive-method}
+has the default value shown above.  Then setting
+@code{gnus-message-archive-group} to @code{"foo"} means that outgoing
+messages are stored in @samp{nnfolder+archive:foo}, but if you use the
+value @code{"nnml:foo"}, then outgoing messages will be stored in
+@samp{nnml:foo}.
+
+@item a list of strings
+Messages will be saved in all those groups.
+
+@item an alist of regexps, functions and forms
+When a key ``matches'', the result is used.
+
+@item @code{nil}
+No message archiving will take place.  This is the default.
+@end table
+
+Let's illustrate:
+
+Just saving to a single group called @samp{MisK}:
+@lisp
+(setq gnus-message-archive-group "MisK")
+@end lisp
+
+Saving to two groups, @samp{MisK} and @samp{safe}:
+@lisp
+(setq gnus-message-archive-group '("MisK" "safe"))
+@end lisp
+
+Save to different groups based on what group you are in:
+@lisp
+(setq gnus-message-archive-group
+      '(("^alt" "sent-to-alt")
+        ("mail" "sent-to-mail")
+        (".*" "sent-to-misc")))
+@end lisp
+
+More complex stuff:
+@lisp
+(setq gnus-message-archive-group
+      '((if (message-news-p)
+            "misc-news"
+          "misc-mail")))
+@end lisp
+
+How about storing all news messages in one file, but storing all mail
+messages in one file per month:
+
+@lisp
+(setq gnus-message-archive-group
+      '((if (message-news-p)
+            "misc-news"
+          (concat "mail." (format-time-string "%Y-%m")))))
+@end lisp
+
+@c (XEmacs 19.13 doesn't have @code{format-time-string}, so you'll have to
+@c use a different value for @code{gnus-message-archive-group} there.)
+
+Now, when you send a message off, it will be stored in the appropriate
+group.  (If you want to disable storing for just one particular message,
+you can just remove the @code{Gcc} header that has been inserted.)  The
+archive group will appear in the group buffer the next time you start
+Gnus, or the next time you press @kbd{F} in the group buffer.  You can
+enter it and read the articles in it just like you'd read any other
+group.  If the group gets really big and annoying, you can simply rename
+if (using @kbd{G r} in the group buffer) to something
+nice---@samp{misc-mail-september-1995}, or whatever.  New messages will
+continue to be stored in the old (now empty) group.
+
+That's the default method of archiving sent messages.  Gnus offers a
+different way for the people who don't like the default method.  In that
+case you should set @code{gnus-message-archive-group} to @code{nil};
+this will disable archiving.
+
+@table @code
+@item gnus-outgoing-message-group
+@vindex gnus-outgoing-message-group
+All outgoing messages will be put in this group.  If you want to store
+all your outgoing mail and articles in the group @samp{nnml:archive},
+you set this variable to that value.  This variable can also be a list of
+group names.
+
+If you want to have greater control over what group to put each
+message in, you can set this variable to a function that checks the
+current newsgroup name and then returns a suitable group name (or list
+of names).
+
+This variable can be used instead of @code{gnus-message-archive-group},
+but the latter is the preferred method.
+
+@item gnus-gcc-mark-as-read
+@vindex gnus-gcc-mark-as-read
+If non-@code{nil}, automatically mark @code{Gcc} articles as read.
+
+@item gnus-gcc-externalize-attachments
+@vindex gnus-gcc-externalize-attachments
+If @code{nil}, attach files as normal parts in Gcc copies; if a regexp
+and matches the Gcc group name, attach files as external parts; if it is
+@code{all}, attach local files as external parts; if it is other
+non-@code{nil}, the behavior is the same as @code{all}, but it may be
+changed in the future.
+
+@end table
+
+
+@node Posting Styles
+@section Posting Styles
+@cindex posting styles
+@cindex styles
+
+All them variables, they make my head swim.
+
+So what if you want a different @code{Organization} and signature based
+on what groups you post to?  And you post both from your home machine
+and your work machine, and you want different @code{From} lines, and so
+on?
+
+@vindex gnus-posting-styles
+One way to do stuff like that is to write clever hooks that change the
+variables you need to have changed.  That's a bit boring, so somebody
+came up with the bright idea of letting the user specify these things in
+a handy alist.  Here's an example of a @code{gnus-posting-styles}
+variable:
+
+@lisp
+((".*"
+  (signature "Peace and happiness")
+  (organization "What me?"))
+ ("^comp"
+  (signature "Death to everybody"))
+ ("comp.emacs.i-love-it"
+  (organization "Emacs is it")))
+@end lisp
+
+As you might surmise from this example, this alist consists of several
+@dfn{styles}.  Each style will be applicable if the first element
+``matches'', in some form or other.  The entire alist will be iterated
+over, from the beginning towards the end, and each match will be
+applied, which means that attributes in later styles that match override
+the same attributes in earlier matching styles.  So
+@samp{comp.programming.literate} will have the @samp{Death to everybody}
+signature and the @samp{What me?} @code{Organization} header.
+
+The first element in each style is called the @code{match}.  If it's a
+string, then Gnus will try to regexp match it against the group name.
+If it is the form @code{(header @var{match} @var{regexp})}, then Gnus
+will look in the original article for a header whose name is
+@var{match} and compare that @var{regexp}.  @var{match} and
+@var{regexp} are strings.  (The original article is the one you are
+replying or following up to.  If you are not composing a reply or a
+followup, then there is nothing to match against.)  If the
+@code{match} is a function symbol, that function will be called with
+no arguments.  If it's a variable symbol, then the variable will be
+referenced.  If it's a list, then that list will be @code{eval}ed.  In
+any case, if this returns a non-@code{nil} value, then the style is
+said to @dfn{match}.
+
+Each style may contain an arbitrary amount of @dfn{attributes}.  Each
+attribute consists of a @code{(@var{name} @var{value})} pair.  In
+addition, you can also use the @code{(@var{name} :file @var{value})}
+form or the @code{(@var{name} :value @var{value})} form.  Where
+@code{:file} signifies @var{value} represents a file name and its
+contents should be used as the attribute value, @code{:value} signifies
+@var{value} does not represent a file name explicitly.  The attribute
+name can be one of:
+
+@itemize @bullet
+@item @code{signature}
+@item @code{signature-file}
+@item @code{x-face-file}
+@item @code{address}, overriding @code{user-mail-address}
+@item @code{name}, overriding @code{(user-full-name)}
+@item @code{body}
+@end itemize
+
+The attribute name can also be a string or a symbol.  In that case,
+this will be used as a header name, and the value will be inserted in
+the headers of the article; if the value is @code{nil}, the header
+name will be removed.  If the attribute name is @code{eval}, the form
+is evaluated, and the result is thrown away.
+
+The attribute value can be a string (used verbatim), a function with
+zero arguments (the return value will be used), a variable (its value
+will be used) or a list (it will be @code{eval}ed and the return value
+will be used).  The functions and sexps are called/@code{eval}ed in the
+message buffer that is being set up.  The headers of the current article
+are available through the @code{message-reply-headers} variable, which
+is a vector of the following headers: number subject from date id
+references chars lines xref extra.
+
+@vindex message-reply-headers
+
+If you wish to check whether the message you are about to compose is
+meant to be a news article or a mail message, you can check the values
+of the @code{message-news-p} and @code{message-mail-p} functions.
+
+@findex message-mail-p
+@findex message-news-p
+
+So here's a new example:
+
+@lisp
+(setq gnus-posting-styles
+      '((".*"
+         (signature-file "~/.signature")
+         (name "User Name")
+         (x-face-file "~/.xface")
+         (x-url (getenv "WWW_HOME"))
+         (organization "People's Front Against MWM"))
+        ("^rec.humor"
+         (signature my-funny-signature-randomizer))
+        ((equal (system-name) "gnarly")  ;; @r{A form}
+         (signature my-quote-randomizer))
+        (message-news-p        ;; @r{A function symbol}
+         (signature my-news-signature))
+        (window-system         ;; @r{A value symbol}
+         ("X-Window-System" (format "%s" window-system)))
+        ;; @r{If I'm replying to Larsi, set the Organization header.}
+        ((header "from" "larsi.*org")
+         (Organization "Somewhere, Inc."))
+        ((posting-from-work-p) ;; @r{A user defined function}
+         (signature-file "~/.work-signature")
+         (address "user@@bar.foo")
+         (body "You are fired.\n\nSincerely, your boss.")
+         (organization "Important Work, Inc"))
+        ("nnml:.*"
+         (From (save-excursion
+                 (set-buffer gnus-article-buffer)
+                 (message-fetch-field "to"))))
+        ("^nn.+:"
+         (signature-file "~/.mail-signature"))))
+@end lisp
+
+The @samp{nnml:.*} rule means that you use the @code{To} address as the
+@code{From} address in all your outgoing replies, which might be handy
+if you fill many roles.
+You may also use @code{message-alternative-emails} instead.
+@xref{Message Headers, ,Message Headers, message, Message Manual}.
+
+@node Drafts
+@section Drafts
+@cindex drafts
+
+If you are writing a message (mail or news) and suddenly remember that
+you have a steak in the oven (or some pesto in the food processor, you
+craaazy vegetarians), you'll probably wish there was a method to save
+the message you are writing so that you can continue editing it some
+other day, and send it when you feel its finished.
+
+Well, don't worry about it.  Whenever you start composing a message of
+some sort using the Gnus mail and post commands, the buffer you get will
+automatically associate to an article in a special @dfn{draft} group.
+If you save the buffer the normal way (@kbd{C-x C-s}, for instance), the
+article will be saved there.  (Auto-save files also go to the draft
+group.)
+
+@cindex nndraft
+@vindex nndraft-directory
+The draft group is a special group (which is implemented as an
+@code{nndraft} group, if you absolutely have to know) called
+@samp{nndraft:drafts}.  The variable @code{nndraft-directory} says where
+@code{nndraft} is to store its files.  What makes this group special is
+that you can't tick any articles in it or mark any articles as
+read---all articles in the group are permanently unread.
+
+If the group doesn't exist, it will be created and you'll be subscribed
+to it.  The only way to make it disappear from the Group buffer is to
+unsubscribe it.  The special properties of the draft group comes from
+a group property (@pxref{Group Parameters}), and if lost the group
+behaves like any other group.  This means the commands below will not
+be available.  To restore the special properties of the group, the
+simplest way is to kill the group, using @kbd{C-k}, and restart
+Gnus.  The group is automatically created again with the
+correct parameters.  The content of the group is not lost.
+
+@c @findex gnus-dissociate-buffer-from-draft
+@c @kindex C-c M-d (Mail)
+@c @kindex C-c M-d (Post)
+@c @findex gnus-associate-buffer-with-draft
+@c @kindex C-c C-d (Mail)
+@c @kindex C-c C-d (Post)
+@c If you're writing some super-secret message that you later want to
+@c encode with PGP before sending, you may wish to turn the auto-saving
+@c (and association with the draft group) off.  You never know who might be
+@c interested in reading all your extremely valuable and terribly horrible
+@c and interesting secrets.  The @kbd{C-c M-d}
+@c (@code{gnus-dissociate-buffer-from-draft}) command does that for you.
+@c If you change your mind and want to turn the auto-saving back on again,
+@c @kbd{C-c C-d} (@code{gnus-associate-buffer-with-draft} does that.
+@c
+@c @vindex gnus-use-draft
+@c To leave association with the draft group off by default, set
+@c @code{gnus-use-draft} to @code{nil}.  It is @code{t} by default.
+
+@findex gnus-draft-edit-message
+@kindex D e (Draft)
+When you want to continue editing the article, you simply enter the
+draft group and push @kbd{D e} (@code{gnus-draft-edit-message}) to do
+that.  You will be placed in a buffer where you left off.
+
+Rejected articles will also be put in this draft group (@pxref{Rejected
+Articles}).
+
+@findex gnus-draft-send-all-messages
+@kindex D s (Draft)
+@findex gnus-draft-send-message
+@kindex D S (Draft)
+If you have lots of rejected messages you want to post (or mail) without
+doing further editing, you can use the @kbd{D s} command
+(@code{gnus-draft-send-message}).  This command understands the
+process/prefix convention (@pxref{Process/Prefix}).  The @kbd{D S}
+command (@code{gnus-draft-send-all-messages}) will ship off all messages
+in the buffer.
+
+@findex gnus-draft-toggle-sending
+@kindex D t (Draft)
+If you have some messages that you wish not to send, you can use the
+@kbd{D t} (@code{gnus-draft-toggle-sending}) command to mark the message
+as unsendable.  This is a toggling command.
+
+
+@node Rejected Articles
+@section Rejected Articles
+@cindex rejected articles
+
+Sometimes a news server will reject an article.  Perhaps the server
+doesn't like your face.  Perhaps it just feels miserable.  Perhaps
+@emph{there be demons}.  Perhaps you have included too much cited text.
+Perhaps the disk is full.  Perhaps the server is down.
+
+These situations are, of course, totally beyond the control of Gnus.
+(Gnus, of course, loves the way you look, always feels great, has angels
+fluttering around inside of it, doesn't care about how much cited text
+you include, never runs full and never goes down.)  So Gnus saves these
+articles until some later time when the server feels better.
+
+The rejected articles will automatically be put in a special draft group
+(@pxref{Drafts}).  When the server comes back up again, you'd then
+typically enter that group and send all the articles off.
+
+@node Signing and encrypting
+@section Signing and encrypting
+@cindex using gpg
+@cindex using s/mime
+@cindex using smime
+
+Gnus can digitally sign and encrypt your messages, using vanilla
+@acronym{PGP} format or @acronym{PGP/MIME} or @acronym{S/MIME}.  For
+decoding such messages, see the @code{mm-verify-option} and
+@code{mm-decrypt-option} options (@pxref{Security}).
+
+@vindex gnus-message-replysign
+@vindex gnus-message-replyencrypt
+@vindex gnus-message-replysignencrypted
+Often, you would like to sign replies to people who send you signed
+messages.  Even more often, you might want to encrypt messages which
+are in reply to encrypted messages.  Gnus offers
+@code{gnus-message-replysign} to enable the former, and
+@code{gnus-message-replyencrypt} for the latter.  In addition, setting
+@code{gnus-message-replysignencrypted} (on by default) will sign
+automatically encrypted messages.
+
+Instructing @acronym{MML} to perform security operations on a
+@acronym{MIME} part is done using the @kbd{C-c C-m s} key map for
+signing and the @kbd{C-c C-m c} key map for encryption, as follows.
+
+@table @kbd
+
+@item C-c C-m s s
+@kindex C-c C-m s s (Message)
+@findex mml-secure-message-sign-smime
+
+Digitally sign current message using @acronym{S/MIME}.
+
+@item C-c C-m s o
+@kindex C-c C-m s o (Message)
+@findex mml-secure-message-sign-pgp
+
+Digitally sign current message using @acronym{PGP}.
+
+@item C-c C-m s p
+@kindex C-c C-m s p (Message)
+@findex mml-secure-message-sign-pgp
+
+Digitally sign current message using @acronym{PGP/MIME}.
+
+@item C-c C-m c s
+@kindex C-c C-m c s (Message)
+@findex mml-secure-message-encrypt-smime
+
+Digitally encrypt current message using @acronym{S/MIME}.
+
+@item C-c C-m c o
+@kindex C-c C-m c o (Message)
+@findex mml-secure-message-encrypt-pgp
+
+Digitally encrypt current message using @acronym{PGP}.
+
+@item C-c C-m c p
+@kindex C-c C-m c p (Message)
+@findex mml-secure-message-encrypt-pgpmime
+
+Digitally encrypt current message using @acronym{PGP/MIME}.
+
+@item C-c C-m C-n
+@kindex C-c C-m C-n (Message)
+@findex mml-unsecure-message
+Remove security related @acronym{MML} tags from message.
+
+@end table
+
+@xref{Security, ,Security, message, Message Manual}, for more information.
+
+@node Select Methods
+@chapter Select Methods
+@cindex foreign groups
+@cindex select methods
+
+A @dfn{foreign group} is a group not read by the usual (or
+default) means.  It could be, for instance, a group from a different
+@acronym{NNTP} server, it could be a virtual group, or it could be your own
+personal mail group.
+
+A foreign group (or any group, really) is specified by a @dfn{name} and
+a @dfn{select method}.  To take the latter first, a select method is a
+list where the first element says what back end to use (e.g. @code{nntp},
+@code{nnspool}, @code{nnml}) and the second element is the @dfn{server
+name}.  There may be additional elements in the select method, where the
+value may have special meaning for the back end in question.
+
+One could say that a select method defines a @dfn{virtual server}---so
+we do just that (@pxref{Server Buffer}).
+
+The @dfn{name} of the group is the name the back end will recognize the
+group as.
+
+For instance, the group @samp{soc.motss} on the @acronym{NNTP} server
+@samp{some.where.edu} will have the name @samp{soc.motss} and select
+method @code{(nntp "some.where.edu")}.  Gnus will call this group
+@samp{nntp+some.where.edu:soc.motss}, even though the @code{nntp}
+back end just knows this group as @samp{soc.motss}.
+
+The different methods all have their peculiarities, of course.
+
+@menu
+* Server Buffer::               Making and editing virtual servers.
+* Getting News::                Reading USENET news with Gnus.
+* Getting Mail::                Reading your personal mail with Gnus.
+* Browsing the Web::            Getting messages from a plethora of Web sources.
+* IMAP::                        Using Gnus as a @acronym{IMAP} client.
+* Other Sources::               Reading directories, files, SOUP packets.
+* Combined Groups::             Combining groups into one group.
+* Email Based Diary::           Using mails to manage diary events in Gnus.
+* Gnus Unplugged::              Reading news and mail offline.
+@end menu
+
+
+@node Server Buffer
+@section Server Buffer
+
+Traditionally, a @dfn{server} is a machine or a piece of software that
+one connects to, and then requests information from.  Gnus does not
+connect directly to any real servers, but does all transactions through
+one back end or other.  But that's just putting one layer more between
+the actual media and Gnus, so we might just as well say that each
+back end represents a virtual server.
+
+For instance, the @code{nntp} back end may be used to connect to several
+different actual @acronym{NNTP} servers, or, perhaps, to many different ports
+on the same actual @acronym{NNTP} server.  You tell Gnus which back end to
+use, and what parameters to set by specifying a @dfn{select method}.
+
+These select method specifications can sometimes become quite
+complicated---say, for instance, that you want to read from the
+@acronym{NNTP} server @samp{news.funet.fi} on port number 13, which
+hangs if queried for @acronym{NOV} headers and has a buggy select.  Ahem.
+Anyway, if you had to specify that for each group that used this
+server, that would be too much work, so Gnus offers a way of naming
+select methods, which is what you do in the server buffer.
+
+To enter the server buffer, use the @kbd{^}
+(@code{gnus-group-enter-server-mode}) command in the group buffer.
+
+@menu
+* Server Buffer Format::        You can customize the look of this buffer.
+* Server Commands::             Commands to manipulate servers.
+* Example Methods::             Examples server specifications.
+* Creating a Virtual Server::   An example session.
+* Server Variables::            Which variables to set.
+* Servers and Methods::         You can use server names as select methods.
+* Unavailable Servers::         Some servers you try to contact may be down.
+@end menu
+
+@vindex gnus-server-mode-hook
+@code{gnus-server-mode-hook} is run when creating the server buffer.
+
+
+@node Server Buffer Format
+@subsection Server Buffer Format
+@cindex server buffer format
+
+@vindex gnus-server-line-format
+You can change the look of the server buffer lines by changing the
+@code{gnus-server-line-format} variable.  This is a @code{format}-like
+variable, with some simple extensions:
+
+@table @samp
+
+@item h
+How the news is fetched---the back end name.
+
+@item n
+The name of this server.
+
+@item w
+Where the news is to be fetched from---the address.
+
+@item s
+The opened/closed/denied status of the server.
+
+@item a
+Whether this server is agentized.
+@end table
+
+@vindex gnus-server-mode-line-format
+The mode line can also be customized by using the
+@code{gnus-server-mode-line-format} variable (@pxref{Mode Line
+Formatting}).  The following specs are understood:
+
+@table @samp
+@item S
+Server name.
+
+@item M
+Server method.
+@end table
+
+Also @pxref{Formatting Variables}.
+
+
+@node Server Commands
+@subsection Server Commands
+@cindex server commands
+
+@table @kbd
+
+@item v
+@kindex v (Server)
+@cindex keys, reserved for users (Server)
+The key @kbd{v} is reserved for users.  You can bind it to some
+command or better use it as a prefix key.
+
+@item a
+@kindex a (Server)
+@findex gnus-server-add-server
+Add a new server (@code{gnus-server-add-server}).
+
+@item e
+@kindex e (Server)
+@findex gnus-server-edit-server
+Edit a server (@code{gnus-server-edit-server}).
+
+@item SPACE
+@kindex SPACE (Server)
+@findex gnus-server-read-server
+Browse the current server (@code{gnus-server-read-server}).
+
+@item q
+@kindex q (Server)
+@findex gnus-server-exit
+Return to the group buffer (@code{gnus-server-exit}).
+
+@item k
+@kindex k (Server)
+@findex gnus-server-kill-server
+Kill the current server (@code{gnus-server-kill-server}).
+
+@item y
+@kindex y (Server)
+@findex gnus-server-yank-server
+Yank the previously killed server (@code{gnus-server-yank-server}).
+
+@item c
+@kindex c (Server)
+@findex gnus-server-copy-server
+Copy the current server (@code{gnus-server-copy-server}).
+
+@item l
+@kindex l (Server)
+@findex gnus-server-list-servers
+List all servers (@code{gnus-server-list-servers}).
+
+@item s
+@kindex s (Server)
+@findex gnus-server-scan-server
+Request that the server scan its sources for new articles
+(@code{gnus-server-scan-server}).  This is mainly sensible with mail
+servers.
+
+@item g
+@kindex g (Server)
+@findex gnus-server-regenerate-server
+Request that the server regenerate all its data structures
+(@code{gnus-server-regenerate-server}).  This can be useful if you have
+a mail back end that has gotten out of sync.
+
+@end table
+
+
+@node Example Methods
+@subsection Example Methods
+
+Most select methods are pretty simple and self-explanatory:
+
+@lisp
+(nntp "news.funet.fi")
+@end lisp
+
+Reading directly from the spool is even simpler:
+
+@lisp
+(nnspool "")
+@end lisp
+
+As you can see, the first element in a select method is the name of the
+back end, and the second is the @dfn{address}, or @dfn{name}, if you
+will.
+
+After these two elements, there may be an arbitrary number of
+@code{(@var{variable} @var{form})} pairs.
+
+To go back to the first example---imagine that you want to read from
+port 15 on that machine.  This is what the select method should
+look like then:
+
+@lisp
+(nntp "news.funet.fi" (nntp-port-number 15))
+@end lisp
+
+You should read the documentation to each back end to find out what
+variables are relevant, but here's an @code{nnmh} example:
+
+@code{nnmh} is a mail back end that reads a spool-like structure.  Say
+you have two structures that you wish to access: One is your private
+mail spool, and the other is a public one.  Here's the possible spec for
+your private mail:
+
+@lisp
+(nnmh "private" (nnmh-directory "~/private/mail/"))
+@end lisp
+
+(This server is then called @samp{private}, but you may have guessed
+that.)
+
+Here's the method for a public spool:
+
+@lisp
+(nnmh "public"
+      (nnmh-directory "/usr/information/spool/")
+      (nnmh-get-new-mail nil))
+@end lisp
+
+@cindex proxy
+@cindex firewall
+
+If you are behind a firewall and only have access to the @acronym{NNTP}
+server from the firewall machine, you can instruct Gnus to @code{rlogin}
+on the firewall machine and telnet from there to the @acronym{NNTP} server.
+Doing this can be rather fiddly, but your virtual server definition
+should probably look something like this:
+
+@lisp
+(nntp "firewall"
+      (nntp-open-connection-function nntp-open-via-rlogin-and-telnet)
+      (nntp-via-address "the.firewall.machine")
+      (nntp-address "the.real.nntp.host")
+      (nntp-end-of-line "\n"))
+@end lisp
+
+If you want to use the wonderful @code{ssh} program to provide a
+compressed connection over the modem line, you could add the following
+configuration to the example above:
+
+@lisp
+      (nntp-via-rlogin-command "ssh")
+@end lisp
+
+See also @code{nntp-via-rlogin-command-switches}.
+
+If you're behind a firewall, but have direct access to the outside world
+through a wrapper command like "runsocks", you could open a socksified
+telnet connection to the news server as follows:
+
+@lisp
+(nntp "outside"
+      (nntp-pre-command "runsocks")
+      (nntp-open-connection-function nntp-open-via-telnet)
+      (nntp-address "the.news.server")
+      (nntp-end-of-line "\n"))
+@end lisp
+
+This means that you have to have set up @code{ssh-agent} correctly to
+provide automatic authorization, of course.  And to get a compressed
+connection, you have to have the @samp{Compression} option in the
+@code{ssh} @file{config} file.
+
+
+@node Creating a Virtual Server
+@subsection Creating a Virtual Server
+
+If you're saving lots of articles in the cache by using persistent
+articles, you may want to create a virtual server to read the cache.
+
+First you need to add a new server.  The @kbd{a} command does that.  It
+would probably be best to use @code{nnml} to read the cache.  You
+could also use @code{nnspool} or @code{nnmh}, though.
+
+Type @kbd{a nnml RET cache RET}.
+
+You should now have a brand new @code{nnml} virtual server called
+@samp{cache}.  You now need to edit it to have the right definitions.
+Type @kbd{e} to edit the server.  You'll be entered into a buffer that
+will contain the following:
+
+@lisp
+(nnml "cache")
+@end lisp
+
+Change that to:
+
+@lisp
+(nnml "cache"
+         (nnml-directory "~/News/cache/")
+         (nnml-active-file "~/News/cache/active"))
+@end lisp
+
+Type @kbd{C-c C-c} to return to the server buffer.  If you now press
+@kbd{RET} over this virtual server, you should be entered into a browse
+buffer, and you should be able to enter any of the groups displayed.
+
+
+@node Server Variables
+@subsection Server Variables
+@cindex server variables
+@cindex server parameters
+
+One sticky point when defining variables (both on back ends and in Emacs
+in general) is that some variables are typically initialized from other
+variables when the definition of the variables is being loaded.  If you
+change the ``base'' variable after the variables have been loaded, you
+won't change the ``derived'' variables.
+
+This typically affects directory and file variables.  For instance,
+@code{nnml-directory} is @file{~/Mail/} by default, and all @code{nnml}
+directory variables are initialized from that variable, so
+@code{nnml-active-file} will be @file{~/Mail/active}.  If you define a
+new virtual @code{nnml} server, it will @emph{not} suffice to set just
+@code{nnml-directory}---you have to explicitly set all the file
+variables to be what you want them to be.  For a complete list of
+variables for each back end, see each back end's section later in this
+manual, but here's an example @code{nnml} definition:
+
+@lisp
+(nnml "public"
+      (nnml-directory "~/my-mail/")
+      (nnml-active-file "~/my-mail/active")
+      (nnml-newsgroups-file "~/my-mail/newsgroups"))
+@end lisp
+
+Server variables are often called @dfn{server parameters}.
+
+@node Servers and Methods
+@subsection Servers and Methods
+
+Wherever you would normally use a select method
+(e.g. @code{gnus-secondary-select-method}, in the group select method,
+when browsing a foreign server) you can use a virtual server name
+instead.  This could potentially save lots of typing.  And it's nice all
+over.
+
+
+@node Unavailable Servers
+@subsection Unavailable Servers
+
+If a server seems to be unreachable, Gnus will mark that server as
+@code{denied}.  That means that any subsequent attempt to make contact
+with that server will just be ignored.  ``It can't be opened,'' Gnus
+will tell you, without making the least effort to see whether that is
+actually the case or not.
+
+That might seem quite naughty, but it does make sense most of the time.
+Let's say you have 10 groups subscribed to on server
+@samp{nephelococcygia.com}.  This server is located somewhere quite far
+away from you and the machine is quite slow, so it takes 1 minute just
+to find out that it refuses connection to you today.  If Gnus were to
+attempt to do that 10 times, you'd be quite annoyed, so Gnus won't
+attempt to do that.  Once it has gotten a single ``connection refused'',
+it will regard that server as ``down''.
+
+So, what happens if the machine was only feeling unwell temporarily?
+How do you test to see whether the machine has come up again?
+
+You jump to the server buffer (@pxref{Server Buffer}) and poke it
+with the following commands:
+
+@table @kbd
+
+@item O
+@kindex O (Server)
+@findex gnus-server-open-server
+Try to establish connection to the server on the current line
+(@code{gnus-server-open-server}).
+
+@item C
+@kindex C (Server)
+@findex gnus-server-close-server
+Close the connection (if any) to the server
+(@code{gnus-server-close-server}).
+
+@item D
+@kindex D (Server)
+@findex gnus-server-deny-server
+Mark the current server as unreachable
+(@code{gnus-server-deny-server}).
+
+@item M-o
+@kindex M-o (Server)
+@findex gnus-server-open-all-servers
+Open the connections to all servers in the buffer
+(@code{gnus-server-open-all-servers}).
+
+@item M-c
+@kindex M-c (Server)
+@findex gnus-server-close-all-servers
+Close the connections to all servers in the buffer
+(@code{gnus-server-close-all-servers}).
+
+@item R
+@kindex R (Server)
+@findex gnus-server-remove-denials
+Remove all marks to whether Gnus was denied connection from any servers
+(@code{gnus-server-remove-denials}).
+
+@item L
+@kindex L (Server)
+@findex gnus-server-offline-server
+Set server status to offline (@code{gnus-server-offline-server}).
+
+@end table
+
+
+@node Getting News
+@section Getting News
+@cindex reading news
+@cindex news back ends
+
+A newsreader is normally used for reading news.  Gnus currently provides
+only two methods of getting news---it can read from an @acronym{NNTP} server,
+or it can read from a local spool.
+
+@menu
+* NNTP::                        Reading news from an @acronym{NNTP} server.
+* News Spool::                  Reading news from the local spool.
+@end menu
+
+
+@node NNTP
+@subsection NNTP
+@cindex nntp
+
+Subscribing to a foreign group from an @acronym{NNTP} server is rather easy.
+You just specify @code{nntp} as method and the address of the @acronym{NNTP}
+server as the, uhm, address.
+
+If the @acronym{NNTP} server is located at a non-standard port, setting the
+third element of the select method to this port number should allow you
+to connect to the right port.  You'll have to edit the group info for
+that (@pxref{Foreign Groups}).
+
+The name of the foreign group can be the same as a native group.  In
+fact, you can subscribe to the same group from as many different servers
+you feel like.  There will be no name collisions.
+
+The following variables can be used to create a virtual @code{nntp}
+server:
+
+@table @code
+
+@item nntp-server-opened-hook
+@vindex nntp-server-opened-hook
+@cindex @sc{mode reader}
+@cindex authinfo
+@cindex authentication
+@cindex nntp authentication
+@findex nntp-send-authinfo
+@findex nntp-send-mode-reader
+is run after a connection has been made.  It can be used to send
+commands to the @acronym{NNTP} server after it has been contacted.  By
+default it sends the command @code{MODE READER} to the server with the
+@code{nntp-send-mode-reader} function.  This function should always be
+present in this hook.
+
+@item nntp-authinfo-function
+@vindex nntp-authinfo-function
+@findex nntp-send-authinfo
+@vindex nntp-authinfo-file
+This function will be used to send @samp{AUTHINFO} to the @acronym{NNTP}
+server.  The default function is @code{nntp-send-authinfo}, which looks
+through your @file{~/.authinfo} (or whatever you've set the
+@code{nntp-authinfo-file} variable to) for applicable entries.  If none
+are found, it will prompt you for a login name and a password.  The
+format of the @file{~/.authinfo} file is (almost) the same as the
+@code{ftp} @file{~/.netrc} file, which is defined in the @code{ftp}
+manual page, but here are the salient facts:
+
+@enumerate
+@item
+The file contains one or more line, each of which define one server.
+
+@item
+Each line may contain an arbitrary number of token/value pairs.
+
+The valid tokens include @samp{machine}, @samp{login}, @samp{password},
+@samp{default}.  In addition Gnus introduces two new tokens, not present
+in the original @file{.netrc}/@code{ftp} syntax, namely @samp{port} and
+@samp{force}.  (This is the only way the @file{.authinfo} file format
+deviates from the @file{.netrc} file format.)  @samp{port} is used to
+indicate what port on the server the credentials apply to and
+@samp{force} is explained below.
+
+@end enumerate
+
+Here's an example file:
+
+@example
+machine news.uio.no login larsi password geheimnis
+machine nntp.ifi.uio.no login larsi force yes
+@end example
+
+The token/value pairs may appear in any order; @samp{machine} doesn't
+have to be first, for instance.
+
+In this example, both login name and password have been supplied for the
+former server, while the latter has only the login name listed, and the
+user will be prompted for the password.  The latter also has the
+@samp{force} tag, which means that the authinfo will be sent to the
+@var{nntp} server upon connection; the default (i.e., when there is not
+@samp{force} tag) is to not send authinfo to the @var{nntp} server
+until the @var{nntp} server asks for it.
+
+You can also add @samp{default} lines that will apply to all servers
+that don't have matching @samp{machine} lines.
+
+@example
+default force yes
+@end example
+
+This will force sending @samp{AUTHINFO} commands to all servers not
+previously mentioned.
+
+Remember to not leave the @file{~/.authinfo} file world-readable.
+
+@item nntp-server-action-alist
+@vindex nntp-server-action-alist
+This is a list of regexps to match on server types and actions to be
+taken when matches are made.  For instance, if you want Gnus to beep
+every time you connect to innd, you could say something like:
+
+@lisp
+(setq nntp-server-action-alist
+      '(("innd" (ding))))
+@end lisp
+
+You probably don't want to do that, though.
+
+The default value is
+
+@lisp
+'(("nntpd 1\\.5\\.11t"
+   (remove-hook 'nntp-server-opened-hook
+                'nntp-send-mode-reader)))
+@end lisp
+
+This ensures that Gnus doesn't send the @code{MODE READER} command to
+nntpd 1.5.11t, since that command chokes that server, I've been told.
+
+@item nntp-maximum-request
+@vindex nntp-maximum-request
+If the @acronym{NNTP} server doesn't support @acronym{NOV} headers, this back end
+will collect headers by sending a series of @code{head} commands.  To
+speed things up, the back end sends lots of these commands without
+waiting for reply, and then reads all the replies.  This is controlled
+by the @code{nntp-maximum-request} variable, and is 400 by default.  If
+your network is buggy, you should set this to 1.
+
+@item nntp-connection-timeout
+@vindex nntp-connection-timeout
+If you have lots of foreign @code{nntp} groups that you connect to
+regularly, you're sure to have problems with @acronym{NNTP} servers not
+responding properly, or being too loaded to reply within reasonable
+time.  This is can lead to awkward problems, which can be helped
+somewhat by setting @code{nntp-connection-timeout}.  This is an integer
+that says how many seconds the @code{nntp} back end should wait for a
+connection before giving up.  If it is @code{nil}, which is the default,
+no timeouts are done.
+
+@item nntp-nov-is-evil
+@vindex nntp-nov-is-evil
+If the @acronym{NNTP} server does not support @acronym{NOV}, you could set this
+variable to @code{t}, but @code{nntp} usually checks automatically whether @acronym{NOV}
+can be used.
+
+@item nntp-xover-commands
+@vindex nntp-xover-commands
+@cindex @acronym{NOV}
+@cindex XOVER
+List of strings used as commands to fetch @acronym{NOV} lines from a
+server.  The default value of this variable is @code{("XOVER"
+"XOVERVIEW")}.
+
+@item nntp-nov-gap
+@vindex nntp-nov-gap
+@code{nntp} normally sends just one big request for @acronym{NOV} lines to
+the server.  The server responds with one huge list of lines.  However,
+if you have read articles 2-5000 in the group, and only want to read
+article 1 and 5001, that means that @code{nntp} will fetch 4999 @acronym{NOV}
+lines that you will not need.  This variable says how
+big a gap between two consecutive articles is allowed to be before the
+@code{XOVER} request is split into several request.  Note that if your
+network is fast, setting this variable to a really small number means
+that fetching will probably be slower.  If this variable is @code{nil},
+@code{nntp} will never split requests.  The default is 5.
+
+@item nntp-xref-number-is-evil
+@vindex nntp-xref-number-is-evil
+When Gnus refers to an article having the @code{Message-ID} that a user
+specifies or having the @code{Message-ID} of the parent article of the
+current one (@pxref{Finding the Parent}), Gnus sends a @code{HEAD}
+command to the @acronym{NNTP} server to know where it is, and the server
+returns the data containing the pairs of a group and an article number
+in the @code{Xref} header.  Gnus normally uses the article number to
+refer to the article if the data shows that that article is in the
+current group, while it uses the @code{Message-ID} otherwise.  However,
+some news servers, e.g., ones running Diablo, run multiple engines
+having the same articles but article numbers are not kept synchronized
+between them.  In that case, the article number that appears in the
+@code{Xref} header varies by which engine is chosen, so you cannot refer
+to the parent article that is in the current group, for instance.  If
+you connect to such a server, set this variable to a non-@code{nil}
+value, and Gnus never uses article numbers.  For example:
+
+@lisp
+(setq gnus-select-method
+      '(nntp "newszilla"
+             (nntp-address "newszilla.example.com")
+             (nntp-xref-number-is-evil t)
+             @dots{}))
+@end lisp
+
+The default value of this server variable is @code{nil}.
+
+@item nntp-prepare-server-hook
+@vindex nntp-prepare-server-hook
+A hook run before attempting to connect to an @acronym{NNTP} server.
+
+@item nntp-record-commands
+@vindex nntp-record-commands
+If non-@code{nil}, @code{nntp} will log all commands it sends to the
+@acronym{NNTP} server (along with a timestamp) in the @samp{*nntp-log*}
+buffer.  This is useful if you are debugging a Gnus/@acronym{NNTP} connection
+that doesn't seem to work.
+
+@item nntp-open-connection-function
+@vindex nntp-open-connection-function
+It is possible to customize how the connection to the nntp server will
+be opened.  If you specify an @code{nntp-open-connection-function}
+parameter, Gnus will use that function to establish the connection.
+Six pre-made functions are supplied.  These functions can be grouped in
+two categories: direct connection functions (four pre-made), and
+indirect ones (two pre-made).
+
+@item nntp-never-echoes-commands
+@vindex nntp-never-echoes-commands
+Non-@code{nil} means the nntp server never echoes commands.  It is
+reported that some nntps server doesn't echo commands.  So, you may want
+to set this to non-@code{nil} in the method for such a server setting
+@code{nntp-open-connection-function} to @code{nntp-open-ssl-stream} for
+example.  The default value is @code{nil}.  Note that the
+@code{nntp-open-connection-functions-never-echo-commands} variable
+overrides the @code{nil} value of this variable.
+
+@item nntp-open-connection-functions-never-echo-commands
+@vindex nntp-open-connection-functions-never-echo-commands
+List of functions that never echo commands.  Add or set a function which
+you set to @code{nntp-open-connection-function} to this list if it does
+not echo commands.  Note that a non-@code{nil} value of the
+@code{nntp-never-echoes-commands} variable overrides this variable.  The
+default value is @code{(nntp-open-network-stream)}.
+
+@item nntp-prepare-post-hook
+@vindex nntp-prepare-post-hook
+A hook run just before posting an article.  If there is no
+@code{Message-ID} header in the article and the news server provides the
+recommended ID, it will be added to the article before running this
+hook.  It is useful to make @code{Cancel-Lock} headers even if you
+inhibit Gnus to add a @code{Message-ID} header, you could say:
+
+@lisp
+(add-hook 'nntp-prepare-post-hook 'canlock-insert-header)
+@end lisp
+
+Note that not all servers support the recommended ID.  This works for
+INN versions 2.3.0 and later, for instance.
+
+@end table
+
+@menu
+* Direct Functions::            Connecting directly to the server.
+* Indirect Functions::          Connecting indirectly to the server.
+* Common Variables::            Understood by several connection functions.
+@end menu
+
+
+@node Direct Functions
+@subsubsection Direct Functions
+@cindex direct connection functions
+
+These functions are called direct because they open a direct connection
+between your machine and the @acronym{NNTP} server.  The behavior of these
+functions is also affected by commonly understood variables
+(@pxref{Common Variables}).
+
+@table @code
+@findex nntp-open-network-stream
+@item nntp-open-network-stream
+This is the default, and simply connects to some port or other on the
+remote system.
+
+@findex nntp-open-tls-stream
+@item nntp-open-tls-stream
+Opens a connection to a server over a @dfn{secure} channel.  To use
+this you must have @uref{http://www.gnu.org/software/gnutls/, GNUTLS}
+installed.  You then define a server as follows:
+
+@lisp
+;; @r{"nntps" is port 563 and is predefined in our @file{/etc/services}}
+;; @r{however, @samp{gnutls-cli -p} doesn't like named ports.}
+;;
+(nntp "snews.bar.com"
+      (nntp-open-connection-function nntp-open-tls-stream)
+      (nntp-port-number )
+      (nntp-address "snews.bar.com"))
+@end lisp
+
+@findex nntp-open-ssl-stream
+@item nntp-open-ssl-stream
+Opens a connection to a server over a @dfn{secure} channel.  To use
+this you must have @uref{http://www.openssl.org, OpenSSL} or
+@uref{ftp://ftp.psy.uq.oz.au/pub/Crypto/SSL, SSLeay} installed.  You
+then define a server as follows:
+
+@lisp
+;; @r{"snews" is port 563 and is predefined in our @file{/etc/services}}
+;; @r{however, @samp{openssl s_client -port} doesn't like named ports.}
+;;
+(nntp "snews.bar.com"
+      (nntp-open-connection-function nntp-open-ssl-stream)
+      (nntp-port-number 563)
+      (nntp-address "snews.bar.com"))
+@end lisp
+
+@findex nntp-open-telnet-stream
+@item nntp-open-telnet-stream
+Opens a connection to an @acronym{NNTP} server by simply @samp{telnet}'ing
+it.  You might wonder why this function exists, since we have the
+default @code{nntp-open-network-stream} which would do the job.  (One
+of) the reason(s) is that if you are behind a firewall but have direct
+connections to the outside world thanks to a command wrapper like
+@code{runsocks}, you can use it like this:
+
+@lisp
+(nntp "socksified"
+      (nntp-pre-command "runsocks")
+      (nntp-open-connection-function nntp-open-telnet-stream)
+      (nntp-address "the.news.server"))
+@end lisp
+
+With the default method, you would need to wrap your whole Emacs
+session, which is not a good idea.
+@end table
+
+
+@node Indirect Functions
+@subsubsection Indirect Functions
+@cindex indirect connection functions
+
+These functions are called indirect because they connect to an
+intermediate host before actually connecting to the @acronym{NNTP} server.
+All of these functions and related variables are also said to belong to
+the ``via'' family of connection: they're all prefixed with ``via'' to make
+things cleaner.  The behavior of these functions is also affected by
+commonly understood variables (@pxref{Common Variables}).
+
+@table @code
+@item nntp-open-via-rlogin-and-telnet
+@findex nntp-open-via-rlogin-and-telnet
+Does an @samp{rlogin} on a remote system, and then does a @samp{telnet}
+to the real @acronym{NNTP} server from there.  This is useful for instance if
+you need to connect to a firewall machine first.
+
+@code{nntp-open-via-rlogin-and-telnet}-specific variables:
+
+@table @code
+@item nntp-via-rlogin-command
+@vindex nntp-via-rlogin-command
+Command used to log in on the intermediate host.  The default is
+@samp{rsh}, but @samp{ssh} is a popular alternative.
+
+@item nntp-via-rlogin-command-switches
+@vindex nntp-via-rlogin-command-switches
+List of strings to be used as the switches to
+@code{nntp-via-rlogin-command}.  The default is @code{nil}.  If you use
+@samp{ssh} for @code{nntp-via-rlogin-command}, you may set this to
+@samp{("-C")} in order to compress all data connections, otherwise set
+this to @samp{("-t" "-e" "none")} or @samp{("-C" "-t" "-e" "none")} if
+the telnet command requires a pseudo-tty allocation on an intermediate
+host.
+@end table
+
+@item nntp-open-via-telnet-and-telnet
+@findex nntp-open-via-telnet-and-telnet
+Does essentially the same, but uses @samp{telnet} instead of
+@samp{rlogin} to connect to the intermediate host.
+
+@code{nntp-open-via-telnet-and-telnet}-specific variables:
+
+@table @code
+@item nntp-via-telnet-command
+@vindex nntp-via-telnet-command
+Command used to @code{telnet} the intermediate host.  The default is
+@samp{telnet}.
+
+@item nntp-via-telnet-switches
+@vindex nntp-via-telnet-switches
+List of strings to be used as the switches to the
+@code{nntp-via-telnet-command} command.  The default is @samp{("-8")}.
+
+@item nntp-via-user-password
+@vindex nntp-via-user-password
+Password to use when logging in on the intermediate host.
+
+@item nntp-via-envuser
+@vindex nntp-via-envuser
+If non-@code{nil}, the intermediate @code{telnet} session (client and
+server both) will support the @code{ENVIRON} option and not prompt for
+login name.  This works for Solaris @code{telnet}, for instance.
+
+@item nntp-via-shell-prompt
+@vindex nntp-via-shell-prompt
+Regexp matching the shell prompt on the intermediate host.  The default
+is @samp{bash\\|\$ *\r?$\\|> *\r?}.
+
+@end table
+
+@end table
+
+
+Here are some additional variables that are understood by all the above
+functions:
+
+@table @code
+
+@item nntp-via-user-name
+@vindex nntp-via-user-name
+User name to use when connecting to the intermediate host.
+
+@item nntp-via-address
+@vindex nntp-via-address
+Address of the intermediate host to connect to.
+
+@end table
+
+
+@node Common Variables
+@subsubsection Common Variables
+
+The following variables affect the behavior of all, or several of the
+pre-made connection functions.  When not specified, all functions are
+affected (the values of the following variables will be used as the
+default if each virtual @code{nntp} server doesn't specify those server
+variables individually).
+
+@table @code
+
+@item nntp-pre-command
+@vindex nntp-pre-command
+A command wrapper to use when connecting through a non native
+connection function (all except @code{nntp-open-network-stream},
+@code{nntp-open-tls-stream}, and @code{nntp-open-ssl-stream}).  This is
+where you would put a @samp{SOCKS} wrapper for instance.
+
+@item nntp-address
+@vindex nntp-address
+The address of the @acronym{NNTP} server.
+
+@item nntp-port-number
+@vindex nntp-port-number
+Port number to connect to the @acronym{NNTP} server.  The default is
+@samp{nntp}.  If you use @acronym{NNTP} over
+@acronym{TLS}/@acronym{SSL}, you may want to use integer ports rather
+than named ports (i.e, use @samp{563} instead of @samp{snews} or
+@samp{nntps}), because external @acronym{TLS}/@acronym{SSL} tools may
+not work with named ports.
+
+@item nntp-end-of-line
+@vindex nntp-end-of-line
+String to use as end-of-line marker when talking to the @acronym{NNTP}
+server.  This is @samp{\r\n} by default, but should be @samp{\n} when
+using a non native connection function.
+
+@item nntp-telnet-command
+@vindex nntp-telnet-command
+Command to use when connecting to the @acronym{NNTP} server through
+@samp{telnet}.  This is @emph{not} for an intermediate host.  This is
+just for the real @acronym{NNTP} server.  The default is
+@samp{telnet}.
+
+@item nntp-telnet-switches
+@vindex nntp-telnet-switches
+A list of switches to pass to @code{nntp-telnet-command}.  The default
+is @samp{("-8")}.
+
+@end table
+
+
+@node News Spool
+@subsection News Spool
+@cindex nnspool
+@cindex news spool
+
+Subscribing to a foreign group from the local spool is extremely easy,
+and might be useful, for instance, to speed up reading groups that
+contain very big articles---@samp{alt.binaries.pictures.furniture}, for
+instance.
+
+Anyway, you just specify @code{nnspool} as the method and @code{""} (or
+anything else) as the address.
+
+If you have access to a local spool, you should probably use that as the
+native select method (@pxref{Finding the News}).  It is normally faster
+than using an @code{nntp} select method, but might not be.  It depends.
+You just have to try to find out what's best at your site.
+
+@table @code
+
+@item nnspool-inews-program
+@vindex nnspool-inews-program
+Program used to post an article.
+
+@item nnspool-inews-switches
+@vindex nnspool-inews-switches
+Parameters given to the inews program when posting an article.
+
+@item nnspool-spool-directory
+@vindex nnspool-spool-directory
+Where @code{nnspool} looks for the articles.  This is normally
+@file{/usr/spool/news/}.
+
+@item nnspool-nov-directory
+@vindex nnspool-nov-directory
+Where @code{nnspool} will look for @acronym{NOV} files.  This is normally@*
+@file{/usr/spool/news/over.view/}.
+
+@item nnspool-lib-dir
+@vindex nnspool-lib-dir
+Where the news lib dir is (@file{/usr/lib/news/} by default).
+
+@item nnspool-active-file
+@vindex nnspool-active-file
+The name of the active file.
+
+@item nnspool-newsgroups-file
+@vindex nnspool-newsgroups-file
+The name of the group descriptions file.
+
+@item nnspool-history-file
+@vindex nnspool-history-file
+The name of the news history file.
+
+@item nnspool-active-times-file
+@vindex nnspool-active-times-file
+The name of the active date file.
+
+@item nnspool-nov-is-evil
+@vindex nnspool-nov-is-evil
+If non-@code{nil}, @code{nnspool} won't try to use any @acronym{NOV} files
+that it finds.
+
+@item nnspool-sift-nov-with-sed
+@vindex nnspool-sift-nov-with-sed
+@cindex sed
+If non-@code{nil}, which is the default, use @code{sed} to get the
+relevant portion from the overview file.  If @code{nil},
+@code{nnspool} will load the entire file into a buffer and process it
+there.
+
+@end table
+
+
+@node Getting Mail
+@section Getting Mail
+@cindex reading mail
+@cindex mail
+
+Reading mail with a newsreader---isn't that just plain WeIrD? But of
+course.
+
+@menu
+* Mail in a Newsreader::        Important introductory notes.
+* Getting Started Reading Mail::  A simple cookbook example.
+* Splitting Mail::              How to create mail groups.
+* Mail Sources::                How to tell Gnus where to get mail from.
+* Mail Back End Variables::     Variables for customizing mail handling.
+* Fancy Mail Splitting::        Gnus can do hairy splitting of incoming mail.
+* Group Mail Splitting::        Use group customize to drive mail splitting.
+* Incorporating Old Mail::      What about the old mail you have?
+* Expiring Mail::               Getting rid of unwanted mail.
+* Washing Mail::                Removing cruft from the mail you get.
+* Duplicates::                  Dealing with duplicated mail.
+* Not Reading Mail::            Using mail back ends for reading other files.
+* Choosing a Mail Back End::    Gnus can read a variety of mail formats.
+@end menu
+
+
+@node Mail in a Newsreader
+@subsection Mail in a Newsreader
+
+If you are used to traditional mail readers, but have decided to switch
+to reading mail with Gnus, you may find yourself experiencing something
+of a culture shock.
+
+Gnus does not behave like traditional mail readers.  If you want to make
+it behave that way, you can, but it's an uphill battle.
+
+Gnus, by default, handles all its groups using the same approach.  This
+approach is very newsreaderly---you enter a group, see the new/unread
+messages, and when you read the messages, they get marked as read, and
+you don't see them any more.  (Unless you explicitly ask for them.)
+
+In particular, you do not do anything explicitly to delete messages.
+
+Does this mean that all the messages that have been marked as read are
+deleted?  How awful!
+
+But, no, it means that old messages are @dfn{expired} according to some
+scheme or other.  For news messages, the expire process is controlled by
+the news administrator; for mail, the expire process is controlled by
+you.  The expire process for mail is covered in depth in @ref{Expiring
+Mail}.
+
+What many Gnus users find, after using it a while for both news and
+mail, is that the transport mechanism has very little to do with how
+they want to treat a message.
+
+Many people subscribe to several mailing lists.  These are transported
+via @acronym{SMTP}, and are therefore mail.  But we might go for weeks without
+answering, or even reading these messages very carefully.  We may not
+need to save them because if we should need to read one again, they are
+archived somewhere else.
+
+Some people have local news groups which have only a handful of readers.
+These are transported via @acronym{NNTP}, and are therefore news.  But we may need
+to read and answer a large fraction of the messages very carefully in
+order to do our work.  And there may not be an archive, so we may need
+to save the interesting messages the same way we would personal mail.
+
+The important distinction turns out to be not the transport mechanism,
+but other factors such as how interested we are in the subject matter,
+or how easy it is to retrieve the message if we need to read it again.
+
+Gnus provides many options for sorting mail into ``groups'' which behave
+like newsgroups, and for treating each group (whether mail or news)
+differently.
+
+Some users never get comfortable using the Gnus (ahem) paradigm and wish
+that Gnus should grow up and be a male, er, mail reader.  It is possible
+to whip Gnus into a more mailreaderly being, but, as said before, it's
+not easy.  People who prefer proper mail readers should try @sc{vm}
+instead, which is an excellent, and proper, mail reader.
+
+I don't mean to scare anybody off, but I want to make it clear that you
+may be required to learn a new way of thinking about messages.  After
+you've been subjected to The Gnus Way, you will come to love it.  I can
+guarantee it.  (At least the guy who sold me the Emacs Subliminal
+Brain-Washing Functions that I've put into Gnus did guarantee it.  You
+Will Be Assimilated.  You Love Gnus.  You Love The Gnus Mail Way.
+You Do.)
+
+
+@node Getting Started Reading Mail
+@subsection Getting Started Reading Mail
+
+It's quite easy to use Gnus to read your new mail.  You just plonk the
+mail back end of your choice into @code{gnus-secondary-select-methods},
+and things will happen automatically.
+
+For instance, if you want to use @code{nnml} (which is a ``one file per
+mail'' back end), you could put the following in your @file{~/.gnus.el} file:
+
+@lisp
+(setq gnus-secondary-select-methods '((nnml "")))
+@end lisp
+
+Now, the next time you start Gnus, this back end will be queried for new
+articles, and it will move all the messages in your spool file to its
+directory, which is @file{~/Mail/} by default.  The new group that will
+be created (@samp{mail.misc}) will be subscribed, and you can read it
+like any other group.
+
+You will probably want to split the mail into several groups, though:
+
+@lisp
+(setq nnmail-split-methods
+      '(("junk" "^From:.*Lars Ingebrigtsen")
+        ("crazy" "^Subject:.*die\\|^Organization:.*flabby")
+        ("other" "")))
+@end lisp
+
+This will result in three new @code{nnml} mail groups being created:
+@samp{nnml:junk}, @samp{nnml:crazy}, and @samp{nnml:other}.  All the
+mail that doesn't fit into the first two groups will be placed in the
+last group.
+
+This should be sufficient for reading mail with Gnus.  You might want to
+give the other sections in this part of the manual a perusal, though.
+Especially @pxref{Choosing a Mail Back End} and @pxref{Expiring Mail}.
+
+
+@node Splitting Mail
+@subsection Splitting Mail
+@cindex splitting mail
+@cindex mail splitting
+@cindex mail filtering (splitting)
+
+@vindex nnmail-split-methods
+The @code{nnmail-split-methods} variable says how the incoming mail is
+to be split into groups.
+
+@lisp
+(setq nnmail-split-methods
+  '(("mail.junk" "^From:.*Lars Ingebrigtsen")
+    ("mail.crazy" "^Subject:.*die\\|^Organization:.*flabby")
+    ("mail.other" "")))
+@end lisp
+
+This variable is a list of lists, where the first element of each of
+these lists is the name of the mail group (they do not have to be called
+something beginning with @samp{mail}, by the way), and the second
+element is a regular expression used on the header of each mail to
+determine if it belongs in this mail group.  The first string may
+contain @samp{\\1} forms, like the ones used by @code{replace-match} to
+insert sub-expressions from the matched text.  For instance:
+
+@lisp
+("list.\\1" "From:.* \\(.*\\)-list@@majordomo.com")
+@end lisp
+
+@noindent
+In that case, @code{nnmail-split-lowercase-expanded} controls whether
+the inserted text should be made lowercase.  @xref{Fancy Mail Splitting}.
+
+The second element can also be a function.  In that case, it will be
+called narrowed to the headers with the first element of the rule as the
+argument.  It should return a non-@code{nil} value if it thinks that the
+mail belongs in that group.
+
+@cindex @samp{bogus} group
+The last of these groups should always be a general one, and the regular
+expression should @emph{always} be @samp{""} so that it matches any mails
+that haven't been matched by any of the other regexps.  (These rules are
+processed from the beginning of the alist toward the end.  The first rule
+to make a match will ``win'', unless you have crossposting enabled.  In
+that case, all matching rules will ``win''.)  If no rule matched, the mail
+will end up in the @samp{bogus} group.  When new groups are created by
+splitting mail, you may want to run @code{gnus-group-find-new-groups} to
+see the new groups.  This also applies to the @samp{bogus} group.
+
+If you like to tinker with this yourself, you can set this variable to a
+function of your choice.  This function will be called without any
+arguments in a buffer narrowed to the headers of an incoming mail
+message.  The function should return a list of group names that it
+thinks should carry this mail message.
+
+Note that the mail back ends are free to maul the poor, innocent,
+incoming headers all they want to.  They all add @code{Lines} headers;
+some add @code{X-Gnus-Group} headers; most rename the Unix mbox
+@code{From<SPACE>} line to something else.
+
+@vindex nnmail-crosspost
+The mail back ends all support cross-posting.  If several regexps match,
+the mail will be ``cross-posted'' to all those groups.
+@code{nnmail-crosspost} says whether to use this mechanism or not.  Note
+that no articles are crossposted to the general (@samp{""}) group.
+
+@vindex nnmail-crosspost-link-function
+@cindex crosspost
+@cindex links
+@code{nnmh} and @code{nnml} makes crossposts by creating hard links to
+the crossposted articles.  However, not all file systems support hard
+links.  If that's the case for you, set
+@code{nnmail-crosspost-link-function} to @code{copy-file}.  (This
+variable is @code{add-name-to-file} by default.)
+
+@kindex M-x nnmail-split-history
+@findex nnmail-split-history
+If you wish to see where the previous mail split put the messages, you
+can use the @kbd{M-x nnmail-split-history} command.  If you wish to see
+where re-spooling messages would put the messages, you can use
+@code{gnus-summary-respool-trace} and related commands (@pxref{Mail
+Group Commands}).
+
+@vindex nnmail-split-header-length-limit
+Header lines longer than the value of
+@code{nnmail-split-header-length-limit} are excluded from the split
+function.
+
+@vindex nnmail-mail-splitting-decodes
+@vindex nnmail-mail-splitting-charset
+By default, splitting does not decode headers, so you can not match on
+non-@acronym{ASCII} strings.  But it is useful if you want to match
+articles based on the raw header data.  To enable it, set the
+@code{nnmail-mail-splitting-decodes} variable to a non-@code{nil} value.
+In addition, the value of the @code{nnmail-mail-splitting-charset}
+variable is used for decoding non-@acronym{MIME} encoded string when
+@code{nnmail-mail-splitting-decodes} is non-@code{nil}.  The default
+value is @code{nil} which means not to decode non-@acronym{MIME} encoded
+string.  A suitable value for you will be @code{undecided} or be the
+charset used normally in mails you are interested in.
+
+@vindex nnmail-resplit-incoming
+By default, splitting is performed on all incoming messages.  If you
+specify a @code{directory} entry for the variable @code{mail-sources}
+(@pxref{Mail Source Specifiers}), however, then splitting does
+@emph{not} happen by default.  You can set the variable
+@code{nnmail-resplit-incoming} to a non-@code{nil} value to make
+splitting happen even in this case.  (This variable has no effect on
+other kinds of entries.)
+
+Gnus gives you all the opportunity you could possibly want for shooting
+yourself in the foot.  Let's say you create a group that will contain
+all the mail you get from your boss.  And then you accidentally
+unsubscribe from the group.  Gnus will still put all the mail from your
+boss in the unsubscribed group, and so, when your boss mails you ``Have
+that report ready by Monday or you're fired!'', you'll never see it and,
+come Tuesday, you'll still believe that you're gainfully employed while
+you really should be out collecting empty bottles to save up for next
+month's rent money.
+
+
+@node Mail Sources
+@subsection Mail Sources
+
+Mail can be gotten from many different sources---the mail spool, from
+a @acronym{POP} mail server, from a procmail directory, or from a
+maildir, for instance.
+
+@menu
+* Mail Source Specifiers::      How to specify what a mail source is.
+* Mail Source Customization::   Some variables that influence things.
+* Fetching Mail::               Using the mail source specifiers.
+@end menu
+
+
+@node Mail Source Specifiers
+@subsubsection Mail Source Specifiers
+@cindex POP
+@cindex mail server
+@cindex procmail
+@cindex mail spool
+@cindex mail source
+
+You tell Gnus how to fetch mail by setting @code{mail-sources}
+(@pxref{Fetching Mail}) to a @dfn{mail source specifier}.
+
+Here's an example:
+
+@lisp
+(pop :server "pop3.mailserver.com" :user "myname")
+@end lisp
+
+As can be observed, a mail source specifier is a list where the first
+element is a @dfn{mail source type}, followed by an arbitrary number of
+@dfn{keywords}.  Keywords that are not explicitly specified are given
+default values.
+
+The following mail source types are available:
+
+@table @code
+@item file
+Get mail from a single file; typically from the mail spool.
+
+Keywords:
+
+@table @code
+@item :path
+The file name.  Defaults to the value of the @env{MAIL}
+environment variable or the value of @code{rmail-spool-directory}
+(usually something like @file{/usr/mail/spool/user-name}).
+
+@item :prescript
+@itemx :postscript
+Script run before/after fetching mail.
+@end table
+
+An example file mail source:
+
+@lisp
+(file :path "/usr/spool/mail/user-name")
+@end lisp
+
+Or using the default file name:
+
+@lisp
+(file)
+@end lisp
+
+If the mail spool file is not located on the local machine, it's best
+to use @acronym{POP} or @acronym{IMAP} or the like to fetch the mail.
+You can not use ange-ftp file names here---it has no way to lock the
+mail spool while moving the mail.
+
+If it's impossible to set up a proper server, you can use ssh instead.
+
+@lisp
+(setq mail-sources
+      '((file :prescript "ssh host bin/getmail >%t")))
+@end lisp
+
+The @samp{getmail} script would look something like the following:
+
+@example
+#!/bin/sh
+#  getmail - move mail from spool to stdout
+#  flu@@iki.fi
+
+MOVEMAIL=/usr/lib/emacs/20.3/i386-redhat-linux/movemail
+TMP=$HOME/Mail/tmp
+rm -f $TMP; $MOVEMAIL $MAIL $TMP >/dev/null && cat $TMP
+@end example
+
+Alter this script to fit the @samp{movemail} and temporary
+file you want to use.
+
+
+@item directory
+@vindex nnmail-scan-directory-mail-source-once
+Get mail from several files in a directory.  This is typically used
+when you have procmail split the incoming mail into several files.
+That is, there is a one-to-one correspondence between files in that
+directory and groups, so that mail from the file @file{foo.bar.spool}
+will be put in the group @code{foo.bar}.  (You can change the suffix
+to be used instead of @code{.spool}.)  Setting
+@code{nnmail-scan-directory-mail-source-once} to non-@code{nil} forces
+Gnus to scan the mail source only once.  This is particularly useful
+if you want to scan mail groups at a specified level.
+
+@vindex nnmail-resplit-incoming
+There is also the variable @code{nnmail-resplit-incoming}, if you set
+that to a non-@code{nil} value, then the normal splitting process is
+applied to all the files from the directory, @ref{Splitting Mail}.
+
+Keywords:
+
+@table @code
+@item :path
+The name of the directory where the files are.  There is no default
+value.
+
+@item :suffix
+Only files ending with this suffix are used.  The default is
+@samp{.spool}.
+
+@item :predicate
+Only files that have this predicate return non-@code{nil} are returned.
+The default is @code{identity}.  This is used as an additional
+filter---only files that have the right suffix @emph{and} satisfy this
+predicate are considered.
+
+@item :prescript
+@itemx :postscript
+Script run before/after fetching mail.
+
+@end table
+
+An example directory mail source:
+
+@lisp
+(directory :path "/home/user-name/procmail-dir/"
+           :suffix ".prcml")
+@end lisp
+
+@item pop
+Get mail from a @acronym{POP} server.
+
+Keywords:
+
+@table @code
+@item :server
+The name of the @acronym{POP} server.  The default is taken from the
+@env{MAILHOST} environment variable.
+
+@item :port
+The port number of the @acronym{POP} server.  This can be a number (eg,
+@samp{:port 1234}) or a string (eg, @samp{:port "pop3"}).  If it is a
+string, it should be a service name as listed in @file{/etc/services} on
+Unix systems.  The default is @samp{"pop3"}.  On some systems you might
+need to specify it as @samp{"pop-3"} instead.
+
+@item :user
+The user name to give to the @acronym{POP} server.  The default is the login
+name.
+
+@item :password
+The password to give to the @acronym{POP} server.  If not specified,
+the user is prompted.
+
+@item :program
+The program to use to fetch mail from the @acronym{POP} server.  This
+should be a @code{format}-like string.  Here's an example:
+
+@example
+fetchmail %u@@%s -P %p %t
+@end example
+
+The valid format specifier characters are:
+
+@table @samp
+@item t
+The name of the file the mail is to be moved to.  This must always be
+included in this string.
+
+@item s
+The name of the server.
+
+@item P
+The port number of the server.
+
+@item u
+The user name to use.
+
+@item p
+The password to use.
+@end table
+
+The values used for these specs are taken from the values you give the
+corresponding keywords.
+
+@item :prescript
+A script to be run before fetching the mail.  The syntax is the same as
+the @code{:program} keyword.  This can also be a function to be run.
+
+@item :postscript
+A script to be run after fetching the mail.  The syntax is the same as
+the @code{:program} keyword.  This can also be a function to be run.
+
+@item :function
+The function to use to fetch mail from the @acronym{POP} server.  The
+function is called with one parameter---the name of the file where the
+mail should be moved to.
+
+@item :authentication
+This can be either the symbol @code{password} or the symbol @code{apop}
+and says what authentication scheme to use.  The default is
+@code{password}.
+
+@end table
+
+@vindex pop3-movemail
+@vindex pop3-leave-mail-on-server
+If the @code{:program} and @code{:function} keywords aren't specified,
+@code{pop3-movemail} will be used.  If @code{pop3-leave-mail-on-server}
+is non-@code{nil} the mail is to be left on the @acronym{POP} server
+after fetching when using @code{pop3-movemail}.  Note that POP servers
+maintain no state information between sessions, so what the client
+believes is there and what is actually there may not match up.  If they
+do not, then you may get duplicate mails or the whole thing can fall
+apart and leave you with a corrupt mailbox.
+
+Here are some examples for getting mail from a @acronym{POP} server.
+Fetch from the default @acronym{POP} server, using the default user
+name, and default fetcher:
+
+@lisp
+(pop)
+@end lisp
+
+Fetch from a named server with a named user and password:
+
+@lisp
+(pop :server "my.pop.server"
+     :user "user-name" :password "secret")
+@end lisp
+
+Use @samp{movemail} to move the mail:
+
+@lisp
+(pop :program "movemail po:%u %t %p")
+@end lisp
+
+@item maildir
+Get mail from a maildir.  This is a type of mailbox that is supported by
+at least qmail and postfix, where each file in a special directory
+contains exactly one mail.
+
+Keywords:
+
+@table @code
+@item :path
+The name of the directory where the mails are stored.  The default is
+taken from the @env{MAILDIR} environment variable or
+@file{~/Maildir/}.
+@item :subdirs
+The subdirectories of the Maildir.  The default is
+@samp{("new" "cur")}.
+
+@c If you sometimes look at your mail through a pop3 daemon before fetching
+@c them with Gnus, you may also have to fetch your mails from the
+@c @code{cur} directory inside the maildir, like in the first example
+@c below.
+
+You can also get mails from remote hosts (because maildirs don't suffer
+from locking problems).
+
+@end table
+
+Two example maildir mail sources:
+
+@lisp
+(maildir :path "/home/user-name/Maildir/"
+         :subdirs ("cur" "new"))
+@end lisp
+
+@lisp
+(maildir :path "/user@@remotehost.org:~/Maildir/"
+         :subdirs ("new"))
+@end lisp
+
+@item imap
+Get mail from a @acronym{IMAP} server.  If you don't want to use
+@acronym{IMAP} as intended, as a network mail reading protocol (ie
+with nnimap), for some reason or other, Gnus let you treat it similar
+to a @acronym{POP} server and fetches articles from a given
+@acronym{IMAP} mailbox.  @xref{IMAP}, for more information.
+
+Note that for the Kerberos, GSSAPI, @acronym{TLS}/@acronym{SSL} and STARTTLS support you
+may need external programs and libraries, @xref{IMAP}.
+
+Keywords:
+
+@table @code
+@item :server
+The name of the @acronym{IMAP} server.  The default is taken from the
+@env{MAILHOST} environment variable.
+
+@item :port
+The port number of the @acronym{IMAP} server.  The default is @samp{143}, or
+@samp{993} for @acronym{TLS}/@acronym{SSL} connections.
+
+@item :user
+The user name to give to the @acronym{IMAP} server.  The default is the login
+name.
+
+@item :password
+The password to give to the @acronym{IMAP} server.  If not specified, the user is
+prompted.
+
+@item :stream
+What stream to use for connecting to the server, this is one of the
+symbols in @code{imap-stream-alist}.  Right now, this means
+@samp{gssapi}, @samp{kerberos4}, @samp{starttls}, @samp{tls},
+@samp{ssl}, @samp{shell} or the default @samp{network}.
+
+@item :authentication
+Which authenticator to use for authenticating to the server, this is
+one of the symbols in @code{imap-authenticator-alist}.  Right now,
+this means @samp{gssapi}, @samp{kerberos4}, @samp{digest-md5},
+@samp{cram-md5}, @samp{anonymous} or the default @samp{login}.
+
+@item :program
+When using the `shell' :stream, the contents of this variable is
+mapped into the @code{imap-shell-program} variable.  This should be a
+@code{format}-like string (or list of strings).  Here's an example:
+
+@example
+ssh %s imapd
+@end example
+
+The valid format specifier characters are:
+
+@table @samp
+@item s
+The name of the server.
+
+@item l
+User name from @code{imap-default-user}.
+
+@item p
+The port number of the server.
+@end table
+
+The values used for these specs are taken from the values you give the
+corresponding keywords.
+
+@item :mailbox
+The name of the mailbox to get mail from.  The default is @samp{INBOX}
+which normally is the mailbox which receive incoming mail.
+
+@item :predicate
+The predicate used to find articles to fetch.  The default, @samp{UNSEEN
+UNDELETED}, is probably the best choice for most people, but if you
+sometimes peek in your mailbox with a @acronym{IMAP} client and mark some
+articles as read (or; SEEN) you might want to set this to @samp{1:*}.
+Then all articles in the mailbox is fetched, no matter what.  For a
+complete list of predicates, see RFC 2060 section 6.4.4.
+
+@item :fetchflag
+How to flag fetched articles on the server, the default @samp{\Deleted}
+will mark them as deleted, an alternative would be @samp{\Seen} which
+would simply mark them as read.  These are the two most likely choices,
+but more flags are defined in RFC 2060 section 2.3.2.
+
+@item :dontexpunge
+If non-@code{nil}, don't remove all articles marked as deleted in the
+mailbox after finishing the fetch.
+
+@end table
+
+An example @acronym{IMAP} mail source:
+
+@lisp
+(imap :server "mail.mycorp.com"
+      :stream kerberos4
+      :fetchflag "\\Seen")
+@end lisp
+
+@item webmail
+Get mail from a webmail server, such as @uref{http://www.hotmail.com/},
+@uref{http://webmail.netscape.com/}, @uref{http://www.netaddress.com/},
+@uref{http://mail.yahoo.com/}.
+
+NOTE: Webmail largely depends on cookies.  A "one-line-cookie" patch is
+required for url "4.0pre.46".
+
+WARNING: Mails may be lost.  NO WARRANTY.
+
+Keywords:
+
+@table @code
+@item :subtype
+The type of the webmail server.  The default is @code{hotmail}.  The
+alternatives are @code{netscape}, @code{netaddress}, @code{my-deja}.
+
+@item :user
+The user name to give to the webmail server.  The default is the login
+name.
+
+@item :password
+The password to give to the webmail server.  If not specified, the user is
+prompted.
+
+@item :dontexpunge
+If non-@code{nil}, only fetch unread articles and don't move them to
+trash folder after finishing the fetch.
+
+@end table
+
+An example webmail source:
+
+@lisp
+(webmail :subtype 'hotmail
+         :user "user-name"
+         :password "secret")
+@end lisp
+@end table
+
+@table @dfn
+@item Common Keywords
+Common keywords can be used in any type of mail source.
+
+Keywords:
+
+@table @code
+@item :plugged
+If non-@code{nil}, fetch the mail even when Gnus is unplugged.  If you
+use directory source to get mail, you can specify it as in this
+example:
+
+@lisp
+(setq mail-sources
+      '((directory :path "/home/pavel/.Spool/"
+                   :suffix ""
+                   :plugged t)))
+@end lisp
+
+Gnus will then fetch your mail even when you are unplugged.  This is
+useful when you use local mail and news.
+
+@end table
+@end table
+
+@subsubsection Function Interface
+
+Some of the above keywords specify a Lisp function to be executed.
+For each keyword @code{:foo}, the Lisp variable @code{foo} is bound to
+the value of the keyword while the function is executing.  For example,
+consider the following mail-source setting:
+
+@lisp
+(setq mail-sources '((pop :user "jrl"
+                          :server "pophost" :function fetchfunc)))
+@end lisp
+
+While the function @code{fetchfunc} is executing, the symbol @code{user}
+is bound to @code{"jrl"}, and the symbol @code{server} is bound to
+@code{"pophost"}.  The symbols @code{port}, @code{password},
+@code{program}, @code{prescript}, @code{postscript}, @code{function},
+and @code{authentication} are also bound (to their default values).
+
+See above for a list of keywords for each type of mail source.
+
+
+@node Mail Source Customization
+@subsubsection Mail Source Customization
+
+The following is a list of variables that influence how the mail is
+fetched.  You would normally not need to set or change any of these
+variables.
+
+@table @code
+@item mail-source-crash-box
+@vindex mail-source-crash-box
+File where mail will be stored while processing it.  The default is@*
+@file{~/.emacs-mail-crash-box}.
+
+@item mail-source-delete-incoming
+@vindex mail-source-delete-incoming
+If non-@code{nil}, delete incoming files after handling them.  If
+@code{t}, delete the files immediately, if @code{nil}, never delete any
+files.  If a positive number, delete files older than number of days
+(This 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.
+
+@item mail-source-delete-old-incoming-confirm
+@vindex mail-source-delete-old-incoming-confirm
+If non-@code{nil}, ask for confirmation before deleting old incoming
+files.  This variable only applies when
+@code{mail-source-delete-incoming} is a positive number.
+
+@item mail-source-ignore-errors
+@vindex mail-source-ignore-errors
+If non-@code{nil}, ignore errors when reading mail from a mail source.
+
+@item mail-source-directory
+@vindex mail-source-directory
+Directory where incoming mail source files (if any) will be stored.  The
+default is @file{~/Mail/}.  At present, the only thing this is used for
+is to say where the incoming files will be stored if the variable
+@code{mail-source-delete-incoming} is @code{nil} or a number.
+
+@item mail-source-incoming-file-prefix
+@vindex mail-source-incoming-file-prefix
+Prefix for file name for storing incoming mail.  The default is
+@file{Incoming}, in which case files will end up with names like
+@file{Incoming30630D_} or @file{Incoming298602ZD}.  This is really only
+relevant if @code{mail-source-delete-incoming} is @code{nil} or a
+number.
+
+@item mail-source-default-file-modes
+@vindex mail-source-default-file-modes
+All new mail files will get this file mode.  The default is 384.
+
+@item mail-source-movemail-program
+@vindex mail-source-movemail-program
+If non-@code{nil}, name of program for fetching new mail.  If
+@code{nil}, @code{movemail} in @var{exec-directory}.
+
+@end table
+
+
+@node Fetching Mail
+@subsubsection Fetching Mail
+
+@vindex mail-sources
+@vindex nnmail-spool-file
+The way to actually tell Gnus where to get new mail from is to set
+@code{mail-sources} to a list of mail source specifiers
+(@pxref{Mail Source Specifiers}).
+
+If this variable (and the obsolescent @code{nnmail-spool-file}) is
+@code{nil}, the mail back ends will never attempt to fetch mail by
+themselves.
+
+If you want to fetch mail both from your local spool as well as a
+@acronym{POP} mail server, you'd say something like:
+
+@lisp
+(setq mail-sources
+      '((file)
+        (pop :server "pop3.mail.server"
+             :password "secret")))
+@end lisp
+
+Or, if you don't want to use any of the keyword defaults:
+
+@lisp
+(setq mail-sources
+      '((file :path "/var/spool/mail/user-name")
+        (pop :server "pop3.mail.server"
+             :user "user-name"
+             :port "pop3"
+             :password "secret")))
+@end lisp
+
+
+When you use a mail back end, Gnus will slurp all your mail from your
+inbox and plonk it down in your home directory.  Gnus doesn't move any
+mail if you're not using a mail back end---you have to do a lot of magic
+invocations first.  At the time when you have finished drawing the
+pentagram, lightened the candles, and sacrificed the goat, you really
+shouldn't be too surprised when Gnus moves your mail.
+
+
+
+@node Mail Back End Variables
+@subsection Mail Back End Variables
+
+These variables are (for the most part) pertinent to all the various
+mail back ends.
+
+@table @code
+@vindex nnmail-read-incoming-hook
+@item nnmail-read-incoming-hook
+The mail back ends all call this hook after reading new mail.  You can
+use this hook to notify any mail watch programs, if you want to.
+
+@vindex nnmail-split-hook
+@item nnmail-split-hook
+@findex gnus-article-decode-encoded-words
+@cindex RFC 1522 decoding
+@cindex RFC 2047 decoding
+Hook run in the buffer where the mail headers of each message is kept
+just before the splitting based on these headers is done.  The hook is
+free to modify the buffer contents in any way it sees fit---the buffer
+is discarded after the splitting has been done, and no changes performed
+in the buffer will show up in any files.
+@code{gnus-article-decode-encoded-words} is one likely function to add
+to this hook.
+
+@vindex nnmail-pre-get-new-mail-hook
+@vindex nnmail-post-get-new-mail-hook
+@item nnmail-pre-get-new-mail-hook
+@itemx nnmail-post-get-new-mail-hook
+These are two useful hooks executed when treating new incoming
+mail---@code{nnmail-pre-get-new-mail-hook} (is called just before
+starting to handle the new mail) and
+@code{nnmail-post-get-new-mail-hook} (is called when the mail handling
+is done).  Here's and example of using these two hooks to change the
+default file modes the new mail files get:
+
+@lisp
+(add-hook 'nnmail-pre-get-new-mail-hook
+          (lambda () (set-default-file-modes 511)))
+
+(add-hook 'nnmail-post-get-new-mail-hook
+          (lambda () (set-default-file-modes 551)))
+@end lisp
+
+@item nnmail-use-long-file-names
+@vindex nnmail-use-long-file-names
+If non-@code{nil}, the mail back ends will use long file and directory
+names.  Groups like @samp{mail.misc} will end up in directories
+(assuming use of @code{nnml} back end) or files (assuming use of
+@code{nnfolder} back end) like @file{mail.misc}.  If it is @code{nil},
+the same group will end up in @file{mail/misc}.
+
+@item nnmail-delete-file-function
+@vindex nnmail-delete-file-function
+@findex delete-file
+Function called to delete files.  It is @code{delete-file} by default.
+
+@item nnmail-cache-accepted-message-ids
+@vindex nnmail-cache-accepted-message-ids
+If non-@code{nil}, put the @code{Message-ID}s of articles imported into
+the back end (via @code{Gcc}, for instance) into the mail duplication
+discovery cache.  The default is @code{nil}.
+
+@item nnmail-cache-ignore-groups
+@vindex nnmail-cache-ignore-groups
+This can be a regular expression or a list of regular expressions.
+Group names that match any of the regular expressions will never be
+recorded in the @code{Message-ID} cache.
+
+This can be useful, for example, when using Fancy Splitting
+(@pxref{Fancy Mail Splitting}) together with the function
+@code{nnmail-split-fancy-with-parent}.
+
+@end table
+
+
+@node Fancy Mail Splitting
+@subsection Fancy Mail Splitting
+@cindex mail splitting
+@cindex fancy mail splitting
+
+@vindex nnmail-split-fancy
+@findex nnmail-split-fancy
+If the rather simple, standard method for specifying how to split mail
+doesn't allow you to do what you want, you can set
+@code{nnmail-split-methods} to @code{nnmail-split-fancy}.  Then you can
+play with the @code{nnmail-split-fancy} variable.
+
+Let's look at an example value of this variable first:
+
+@lisp
+;; @r{Messages from the mailer daemon are not crossposted to any of}
+;; @r{the ordinary groups.  Warnings are put in a separate group}
+;; @r{from real errors.}
+(| ("from" mail (| ("subject" "warn.*" "mail.warning")
+                   "mail.misc"))
+   ;; @r{Non-error messages are crossposted to all relevant}
+   ;; @r{groups, but we don't crosspost between the group for the}
+   ;; @r{(ding) list and the group for other (ding) related mail.}
+   (& (| (any "ding@@ifi\\.uio\\.no" "ding.list")
+         ("subject" "ding" "ding.misc"))
+      ;; @r{Other mailing lists@dots{}}
+      (any "procmail@@informatik\\.rwth-aachen\\.de" "procmail.list")
+      (any "SmartList@@informatik\\.rwth-aachen\\.de" "SmartList.list")
+      ;; @r{Both lists below have the same suffix, so prevent}
+      ;; @r{cross-posting to mkpkg.list of messages posted only to}
+      ;; @r{the bugs- list, but allow cross-posting when the}
+      ;; @r{message was really cross-posted.}
+      (any "bugs-mypackage@@somewhere" "mypkg.bugs")
+      (any "mypackage@@somewhere" - "bugs-mypackage" "mypkg.list")
+      ;; @r{People@dots{}}
+      (any "larsi@@ifi\\.uio\\.no" "people.Lars_Magne_Ingebrigtsen"))
+   ;; @r{Unmatched mail goes to the catch all group.}
+   "misc.misc")
+@end lisp
+
+This variable has the format of a @dfn{split}.  A split is a
+(possibly) recursive structure where each split may contain other
+splits.  Here are the possible split syntaxes:
+
+@table @code
+
+@item group
+If the split is a string, that will be taken as a group name.  Normal
+regexp match expansion will be done.  See below for examples.
+
+@c Don't fold this line.
+@item (@var{field} @var{value} [- @var{restrict} [@dots{}] ] @var{split} [@var{invert-partial}])
+The split can be a list containing at least three elements.  If the
+first element @var{field} (a regexp matching a header) contains
+@var{value} (also a regexp) then store the message as specified by
+@var{split}.
+
+If @var{restrict} (yet another regexp) matches some string after
+@var{field} and before the end of the matched @var{value}, the
+@var{split} is ignored.  If none of the @var{restrict} clauses match,
+@var{split} is processed.
+
+The last element @var{invert-partial} is optional.  If it is
+non-@code{nil}, the match-partial-words behavior controlled by the
+variable @code{nnmail-split-fancy-match-partial-words} (see below) is
+be inverted.  (New in Gnus 5.10.7)
+
+@item (| @var{split} @dots{})
+If the split is a list, and the first element is @code{|} (vertical
+bar), then process each @var{split} until one of them matches.  A
+@var{split} is said to match if it will cause the mail message to be
+stored in one or more groups.
+
+@item (& @var{split} @dots{})
+If the split is a list, and the first element is @code{&}, then
+process all @var{split}s in the list.
+
+@item junk
+If the split is the symbol @code{junk}, then don't save (i.e., delete)
+this message.  Use with extreme caution.
+
+@item (: @var{function} @var{arg1} @var{arg2} @dots{})
+If the split is a list, and the first element is @samp{:}, then the
+second element will be called as a function with @var{args} given as
+arguments.  The function should return a @var{split}.
+
+@cindex body split
+For instance, the following function could be used to split based on the
+body of the messages:
+
+@lisp
+(defun split-on-body ()
+  (save-excursion
+    (save-restriction
+      (widen)
+      (goto-char (point-min))
+      (when (re-search-forward "Some.*string" nil t)
+        "string.group"))))
+@end lisp
+
+The buffer is narrowed to the message in question when @var{function}
+is run.  That's why @code{(widen)} needs to be called after
+@code{save-excursion} and @code{save-restriction} in the example
+above.  Also note that with the nnimap backend, message bodies will
+not be downloaded by default.  You need to set
+@code{nnimap-split-download-body} to @code{t} to do that
+(@pxref{Splitting in IMAP}).
+
+@item (! @var{func} @var{split})
+If the split is a list, and the first element is @code{!}, then
+@var{split} will be processed, and @var{func} will be called as a
+function with the result of @var{split} as argument.  @var{func}
+should return a split.
+
+@item nil
+If the split is @code{nil}, it is ignored.
+
+@end table
+
+In these splits, @var{field} must match a complete field name.
+
+Normally, @var{value} in these splits must match a complete @emph{word}
+according to the fundamental mode syntax table.  In other words, all
+@var{value}'s will be implicitly surrounded by @code{\<...\>} markers,
+which are word delimiters.  Therefore, if you use the following split,
+for example,
+
+@example
+(any "joe" "joemail")
+@end example
+
+@noindent
+messages sent from @samp{joedavis@@foo.org} will normally not be filed
+in @samp{joemail}.  If you want to alter this behavior, you can use any
+of the following three ways:
+
+@enumerate
+@item
+@vindex nnmail-split-fancy-match-partial-words
+You can set the @code{nnmail-split-fancy-match-partial-words} variable
+to non-@code{nil} in order to ignore word boundaries and instead the
+match becomes more like a grep.  This variable controls whether partial
+words are matched during fancy splitting.  The default value is
+@code{nil}.
+
+Note that it influences all @var{value}'s in your split rules.
+
+@item
+@var{value} beginning with @code{.*} ignores word boundaries in front of
+a word.  Similarly, if @var{value} ends with @code{.*}, word boundaries
+in the rear of a word will be ignored.  For example, the @var{value}
+@code{"@@example\\.com"} does not match @samp{foo@@example.com} but
+@code{".*@@example\\.com"} does.
+
+@item
+You can set the @var{invert-partial} flag in your split rules of the
+@samp{(@var{field} @var{value} @dots{})} types, aforementioned in this
+section.  If the flag is set, word boundaries on both sides of a word
+are ignored even if @code{nnmail-split-fancy-match-partial-words} is
+@code{nil}.  Contrarily, if the flag is set, word boundaries are not
+ignored even if @code{nnmail-split-fancy-match-partial-words} is
+non-@code{nil}.  (New in Gnus 5.10.7)
+@end enumerate
+
+@vindex nnmail-split-abbrev-alist
+@var{field} and @var{value} can also be Lisp symbols, in that case
+they are expanded as specified by the variable
+@code{nnmail-split-abbrev-alist}.  This is an alist of cons cells,
+where the @sc{car} of a cell contains the key, and the @sc{cdr}
+contains the associated value.  Predefined entries in
+@code{nnmail-split-abbrev-alist} include:
+
+@table @code
+@item from
+Matches the @samp{From}, @samp{Sender} and @samp{Resent-From} fields.
+@item to
+Matches the @samp{To}, @samp{Cc}, @samp{Apparently-To},
+@samp{Resent-To} and @samp{Resent-Cc} fields.
+@item any
+Is the union of the @code{from} and @code{to} entries.
+@end table
+
+@vindex nnmail-split-fancy-syntax-table
+@code{nnmail-split-fancy-syntax-table} is the syntax table in effect
+when all this splitting is performed.
+
+If you want to have Gnus create groups dynamically based on some
+information in the headers (i.e., do @code{replace-match}-like
+substitutions in the group names), you can say things like:
+
+@example
+(any "debian-\\b\\(\\w+\\)@@lists.debian.org" "mail.debian.\\1")
+@end example
+
+In this example, messages sent to @samp{debian-foo@@lists.debian.org}
+will be filed in @samp{mail.debian.foo}.
+
+If the string contains the element @samp{\&}, then the previously
+matched string will be substituted.  Similarly, the elements @samp{\\1}
+up to @samp{\\9} will be substituted with the text matched by the
+groupings 1 through 9.
+
+@vindex nnmail-split-lowercase-expanded
+Where @code{nnmail-split-lowercase-expanded} controls whether the
+lowercase of the matched string should be used for the substitution.
+Setting it as non-@code{nil} is useful to avoid the creation of multiple
+groups when users send to an address using different case
+(i.e. mailing-list@@domain vs Mailing-List@@Domain).  The default value
+is @code{t}.
+
+@findex nnmail-split-fancy-with-parent
+@code{nnmail-split-fancy-with-parent} is a function which allows you to
+split followups into the same groups their parents are in.  Sometimes
+you can't make splitting rules for all your mail.  For example, your
+boss might send you personal mail regarding different projects you are
+working on, and as you can't tell your boss to put a distinguishing
+string into the subject line, you have to resort to manually moving the
+messages into the right group.  With this function, you only have to do
+it once per thread.
+
+To use this feature, you have to set @code{nnmail-treat-duplicates}
+and @code{nnmail-cache-accepted-message-ids} to a non-@code{nil}
+value.  And then you can include @code{nnmail-split-fancy-with-parent}
+using the colon feature, like so:
+@lisp
+(setq nnmail-treat-duplicates 'warn     ; @r{or @code{delete}}
+      nnmail-cache-accepted-message-ids t
+      nnmail-split-fancy
+      '(| (: nnmail-split-fancy-with-parent)
+          ;; @r{other splits go here}
+        ))
+@end lisp
+
+This feature works as follows: when @code{nnmail-treat-duplicates} is
+non-@code{nil}, Gnus records the message id of every message it sees
+in the file specified by the variable
+@code{nnmail-message-id-cache-file}, together with the group it is in
+(the group is omitted for non-mail messages).  When mail splitting is
+invoked, the function @code{nnmail-split-fancy-with-parent} then looks
+at the References (and In-Reply-To) header of each message to split
+and searches the file specified by @code{nnmail-message-id-cache-file}
+for the message ids.  When it has found a parent, it returns the
+corresponding group name unless the group name matches the regexp
+@code{nnmail-split-fancy-with-parent-ignore-groups}.  It is
+recommended that you set @code{nnmail-message-id-cache-length} to a
+somewhat higher number than the default so that the message ids are
+still in the cache.  (A value of 5000 appears to create a file some
+300 kBytes in size.)
+@vindex nnmail-cache-accepted-message-ids
+When @code{nnmail-cache-accepted-message-ids} is non-@code{nil}, Gnus
+also records the message ids of moved articles, so that the followup
+messages goes into the new group.
+
+Also see the variable @code{nnmail-cache-ignore-groups} if you don't
+want certain groups to be recorded in the cache.  For example, if all
+outgoing messages are written to an ``outgoing'' group, you could set
+@code{nnmail-cache-ignore-groups} to match that group name.
+Otherwise, answers to all your messages would end up in the
+``outgoing'' group.
+
+
+@node Group Mail Splitting
+@subsection Group Mail Splitting
+@cindex mail splitting
+@cindex group mail splitting
+
+@findex gnus-group-split
+If you subscribe to dozens of mailing lists but you don't want to
+maintain mail splitting rules manually, group mail splitting is for you.
+You just have to set @code{to-list} and/or @code{to-address} in group
+parameters or group customization and set @code{nnmail-split-methods} to
+@code{gnus-group-split}.  This splitting function will scan all groups
+for those parameters and split mail accordingly, i.e., messages posted
+from or to the addresses specified in the parameters @code{to-list} or
+@code{to-address} of a mail group will be stored in that group.
+
+Sometimes, mailing lists have multiple addresses, and you may want mail
+splitting to recognize them all: just set the @code{extra-aliases} group
+parameter to the list of additional addresses and it's done.  If you'd
+rather use a regular expression, set @code{split-regexp}.
+
+All these parameters in a group will be used to create an
+@code{nnmail-split-fancy} split, in which the @var{field} is @samp{any},
+the @var{value} is a single regular expression that matches
+@code{to-list}, @code{to-address}, all of @code{extra-aliases} and all
+matches of @code{split-regexp}, and the @var{split} is the name of the
+group.  @var{restrict}s are also supported: just set the
+@code{split-exclude} parameter to a list of regular expressions.
+
+If you can't get the right split to be generated using all these
+parameters, or you just need something fancier, you can set the
+parameter @code{split-spec} to an @code{nnmail-split-fancy} split.  In
+this case, all other aforementioned parameters will be ignored by
+@code{gnus-group-split}.  In particular, @code{split-spec} may be set to
+@code{nil}, in which case the group will be ignored by
+@code{gnus-group-split}.
+
+@vindex gnus-group-split-default-catch-all-group
+@code{gnus-group-split} will do cross-posting on all groups that match,
+by defining a single @code{&} fancy split containing one split for each
+group.  If a message doesn't match any split, it will be stored in the
+group named in @code{gnus-group-split-default-catch-all-group}, unless
+some group has @code{split-spec} set to @code{catch-all}, in which case
+that group is used as the catch-all group.  Even though this variable is
+often used just to name a group, it may also be set to an arbitrarily
+complex fancy split (after all, a group name is a fancy split), and this
+may be useful to split mail that doesn't go to any mailing list to
+personal mail folders.  Note that this fancy split is added as the last
+element of a @code{|} split list that also contains a @code{&} split
+with the rules extracted from group parameters.
+
+It's time for an example.  Assume the following group parameters have
+been defined:
+
+@example
+nnml:mail.bar:
+((to-address . "bar@@femail.com")
+ (split-regexp . ".*@@femail\\.com"))
+nnml:mail.foo:
+((to-list . "foo@@nowhere.gov")
+ (extra-aliases "foo@@localhost" "foo-redist@@home")
+ (split-exclude "bugs-foo" "rambling-foo")
+ (admin-address . "foo-request@@nowhere.gov"))
+nnml:mail.others:
+((split-spec . catch-all))
+@end example
+
+Setting @code{nnmail-split-methods} to @code{gnus-group-split} will
+behave as if @code{nnmail-split-fancy} had been selected and variable
+@code{nnmail-split-fancy} had been set as follows:
+
+@lisp
+(| (& (any "\\(bar@@femail\\.com\\|.*@@femail\\.com\\)" "mail.bar")
+      (any "\\(foo@@nowhere\\.gov\\|foo@@localhost\\|foo-redist@@home\\)"
+           - "bugs-foo" - "rambling-foo" "mail.foo"))
+   "mail.others")
+@end lisp
+
+@findex gnus-group-split-fancy
+If you'd rather not use group splitting for all your mail groups, you
+may use it for only some of them, by using @code{nnmail-split-fancy}
+splits like this:
+
+@lisp
+(: gnus-group-split-fancy @var{groups} @var{no-crosspost} @var{catch-all})
+@end lisp
+
+@var{groups} may be a regular expression or a list of group names whose
+parameters will be scanned to generate the output split.
+@var{no-crosspost} can be used to disable cross-posting; in this case, a
+single @code{|} split will be output.  @var{catch-all} is the fall back
+fancy split, used like @code{gnus-group-split-default-catch-all-group}.
+If @var{catch-all} is @code{nil}, or if @code{split-regexp} matches the
+empty string in any selected group, no catch-all split will be issued.
+Otherwise, if some group has @code{split-spec} set to @code{catch-all},
+this group will override the value of the @var{catch-all} argument.
+
+@findex gnus-group-split-setup
+Unfortunately, scanning all groups and their parameters can be quite
+slow, especially considering that it has to be done for every message.
+But don't despair!  The function @code{gnus-group-split-setup} can be
+used to enable @code{gnus-group-split} in a much more efficient way.  It
+sets @code{nnmail-split-methods} to @code{nnmail-split-fancy} and sets
+@code{nnmail-split-fancy} to the split produced by
+@code{gnus-group-split-fancy}.  Thus, the group parameters are only
+scanned once, no matter how many messages are split.
+
+@findex gnus-group-split-update
+However, if you change group parameters, you'd have to update
+@code{nnmail-split-fancy} manually.  You can do it by running
+@code{gnus-group-split-update}.  If you'd rather have it updated
+automatically, just tell @code{gnus-group-split-setup} to do it for
+you.  For example, add to your @file{~/.gnus.el}:
+
+@lisp
+(gnus-group-split-setup @var{auto-update} @var{catch-all})
+@end lisp
+
+If @var{auto-update} is non-@code{nil}, @code{gnus-group-split-update}
+will be added to @code{nnmail-pre-get-new-mail-hook}, so you won't ever
+have to worry about updating @code{nnmail-split-fancy} again.  If you
+don't omit @var{catch-all} (it's optional, equivalent to @code{nil}),
+@code{gnus-group-split-default-catch-all-group} will be set to its
+value.
+
+@vindex gnus-group-split-updated-hook
+Because you may want to change @code{nnmail-split-fancy} after it is set
+by @code{gnus-group-split-update}, this function will run
+@code{gnus-group-split-updated-hook} just before finishing.
+
+@node Incorporating Old Mail
+@subsection Incorporating Old Mail
+@cindex incorporating old mail
+@cindex import old mail
+
+Most people have lots of old mail stored in various file formats.  If
+you have set up Gnus to read mail using one of the spiffy Gnus mail
+back ends, you'll probably wish to have that old mail incorporated into
+your mail groups.
+
+Doing so can be quite easy.
+
+To take an example: You're reading mail using @code{nnml}
+(@pxref{Mail Spool}), and have set @code{nnmail-split-methods} to a
+satisfactory value (@pxref{Splitting Mail}).  You have an old Unix mbox
+file filled with important, but old, mail.  You want to move it into
+your @code{nnml} groups.
+
+Here's how:
+
+@enumerate
+@item
+Go to the group buffer.
+
+@item
+Type @kbd{G f} and give the file name to the mbox file when prompted to create an
+@code{nndoc} group from the mbox file (@pxref{Foreign Groups}).
+
+@item
+Type @kbd{SPACE} to enter the newly created group.
+
+@item
+Type @kbd{M P b} to process-mark all articles in this group's buffer
+(@pxref{Setting Process Marks}).
+
+@item
+Type @kbd{B r} to respool all the process-marked articles, and answer
+@samp{nnml} when prompted (@pxref{Mail Group Commands}).
+@end enumerate
+
+All the mail messages in the mbox file will now also be spread out over
+all your @code{nnml} groups.  Try entering them and check whether things
+have gone without a glitch.  If things look ok, you may consider
+deleting the mbox file, but I wouldn't do that unless I was absolutely
+sure that all the mail has ended up where it should be.
+
+Respooling is also a handy thing to do if you're switching from one mail
+back end to another.  Just respool all the mail in the old mail groups
+using the new mail back end.
+
+
+@node Expiring Mail
+@subsection Expiring Mail
+@cindex article expiry
+@cindex expiring mail
+
+Traditional mail readers have a tendency to remove mail articles when
+you mark them as read, in some way.  Gnus takes a fundamentally
+different approach to mail reading.
+
+Gnus basically considers mail just to be news that has been received in
+a rather peculiar manner.  It does not think that it has the power to
+actually change the mail, or delete any mail messages.  If you enter a
+mail group, and mark articles as ``read'', or kill them in some other
+fashion, the mail articles will still exist on the system.  I repeat:
+Gnus will not delete your old, read mail.  Unless you ask it to, of
+course.
+
+To make Gnus get rid of your unwanted mail, you have to mark the
+articles as @dfn{expirable}.  (With the default key bindings, this means
+that you have to type @kbd{E}.)  This does not mean that the articles
+will disappear right away, however.  In general, a mail article will be
+deleted from your system if, 1) it is marked as expirable, AND 2) it is
+more than one week old.  If you do not mark an article as expirable, it
+will remain on your system until hell freezes over.  This bears
+repeating one more time, with some spurious capitalizations: IF you do
+NOT mark articles as EXPIRABLE, Gnus will NEVER delete those ARTICLES.
+
+You do not have to mark articles as expirable by hand.  Gnus provides
+two features, called ``auto-expire'' and ``total-expire'', that can help you
+with this.  In a nutshell, ``auto-expire'' means that Gnus hits @kbd{E}
+for you when you select an article.  And ``total-expire'' means that Gnus
+considers all articles as expirable that are read.  So, in addition to
+the articles marked @samp{E}, also the articles marked @samp{r},
+@samp{R}, @samp{O}, @samp{K}, @samp{Y} and so on are considered
+expirable.
+
+When should either auto-expire or total-expire be used?  Most people
+who are subscribed to mailing lists split each list into its own group
+and then turn on auto-expire or total-expire for those groups.
+(@xref{Splitting Mail}, for more information on splitting each list
+into its own group.)
+
+Which one is better, auto-expire or total-expire?  It's not easy to
+answer.  Generally speaking, auto-expire is probably faster.  Another
+advantage of auto-expire is that you get more marks to work with: for
+the articles that are supposed to stick around, you can still choose
+between tick and dormant and read marks.  But with total-expire, you
+only have dormant and ticked to choose from.  The advantage of
+total-expire is that it works well with adaptive scoring (@pxref{Adaptive
+Scoring}).  Auto-expire works with normal scoring but not with adaptive
+scoring.
+
+@vindex gnus-auto-expirable-newsgroups
+Groups that match the regular expression
+@code{gnus-auto-expirable-newsgroups} will have all articles that you
+read marked as expirable automatically.  All articles marked as
+expirable have an @samp{E} in the first column in the summary buffer.
+
+By default, if you have auto expiry switched on, Gnus will mark all the
+articles you read as expirable, no matter if they were read or unread
+before.  To avoid having articles marked as read marked as expirable
+automatically, you can put something like the following in your
+@file{~/.gnus.el} file:
+
+@vindex gnus-mark-article-hook
+@lisp
+(remove-hook 'gnus-mark-article-hook
+             'gnus-summary-mark-read-and-unread-as-read)
+(add-hook 'gnus-mark-article-hook 'gnus-summary-mark-unread-as-read)
+@end lisp
+
+Note that making a group auto-expirable doesn't mean that all read
+articles are expired---only the articles marked as expirable
+will be expired.  Also note that using the @kbd{d} command won't make
+articles expirable---only semi-automatic marking of articles as read will
+mark the articles as expirable in auto-expirable groups.
+
+Let's say you subscribe to a couple of mailing lists, and you want the
+articles you have read to disappear after a while:
+
+@lisp
+(setq gnus-auto-expirable-newsgroups
+      "mail.nonsense-list\\|mail.nice-list")
+@end lisp
+
+Another way to have auto-expiry happen is to have the element
+@code{auto-expire} in the group parameters of the group.
+
+If you use adaptive scoring (@pxref{Adaptive Scoring}) and
+auto-expiring, you'll have problems.  Auto-expiring and adaptive scoring
+don't really mix very well.
+
+@vindex nnmail-expiry-wait
+The @code{nnmail-expiry-wait} variable supplies the default time an
+expirable article has to live.  Gnus starts counting days from when the
+message @emph{arrived}, not from when it was sent.  The default is seven
+days.
+
+Gnus also supplies a function that lets you fine-tune how long articles
+are to live, based on what group they are in.  Let's say you want to
+have one month expiry period in the @samp{mail.private} group, a one day
+expiry period in the @samp{mail.junk} group, and a six day expiry period
+everywhere else:
+
+@vindex nnmail-expiry-wait-function
+@lisp
+(setq nnmail-expiry-wait-function
+      (lambda (group)
+       (cond ((string= group "mail.private")
+               31)
+             ((string= group "mail.junk")
+               1)
+             ((string= group "important")
+               'never)
+             (t
+               6))))
+@end lisp
+
+The group names this function is fed are ``unadorned'' group
+names---no @samp{nnml:} prefixes and the like.
+
+The @code{nnmail-expiry-wait} variable and
+@code{nnmail-expiry-wait-function} function can either be a number (not
+necessarily an integer) or one of the symbols @code{immediate} or
+@code{never}.
+
+You can also use the @code{expiry-wait} group parameter to selectively
+change the expiry period (@pxref{Group Parameters}).
+
+@vindex nnmail-expiry-target
+The normal action taken when expiring articles is to delete them.
+However, in some circumstances it might make more sense to move them
+to other groups instead of deleting them.  The variable
+@code{nnmail-expiry-target} (and the @code{expiry-target} group
+parameter) controls this.  The variable supplies a default value for
+all groups, which can be overridden for specific groups by the group
+parameter.  default value is @code{delete}, but this can also be a
+string (which should be the name of the group the message should be
+moved to), or a function (which will be called in a buffer narrowed to
+the message in question, and with the name of the group being moved
+from as its parameter) which should return a target---either a group
+name or @code{delete}.
+
+Here's an example for specifying a group name:
+@lisp
+(setq nnmail-expiry-target "nnml:expired")
+@end lisp
+
+@findex nnmail-fancy-expiry-target
+@vindex nnmail-fancy-expiry-targets
+Gnus provides a function @code{nnmail-fancy-expiry-target} which will
+expire mail to groups according to the variable
+@code{nnmail-fancy-expiry-targets}.  Here's an example:
+
+@lisp
+ (setq nnmail-expiry-target 'nnmail-fancy-expiry-target
+       nnmail-fancy-expiry-targets
+       '((to-from "boss" "nnfolder:Work")
+         ("subject" "IMPORTANT" "nnfolder:IMPORTANT.%Y.%b")
+         ("from" ".*" "nnfolder:Archive-%Y")))
+@end lisp
+
+With this setup, any mail that has @code{IMPORTANT} in its Subject
+header and was sent in the year @code{YYYY} and month @code{MMM}, will
+get expired to the group @code{nnfolder:IMPORTANT.YYYY.MMM}.  If its
+From or To header contains the string @code{boss}, it will get expired
+to @code{nnfolder:Work}.  All other mail will get expired to
+@code{nnfolder:Archive-YYYY}.
+
+@vindex nnmail-keep-last-article
+If @code{nnmail-keep-last-article} is non-@code{nil}, Gnus will never
+expire the final article in a mail newsgroup.  This is to make life
+easier for procmail users.
+
+@vindex gnus-total-expirable-newsgroups
+By the way: That line up there, about Gnus never expiring non-expirable
+articles, is a lie.  If you put @code{total-expire} in the group
+parameters, articles will not be marked as expirable, but all read
+articles will be put through the expiry process.  Use with extreme
+caution.  Even more dangerous is the
+@code{gnus-total-expirable-newsgroups} variable.  All groups that match
+this regexp will have all read articles put through the expiry process,
+which means that @emph{all} old mail articles in the groups in question
+will be deleted after a while.  Use with extreme caution, and don't come
+crying to me when you discover that the regexp you used matched the
+wrong group and all your important mail has disappeared.  Be a
+@emph{man}!  Or a @emph{woman}!  Whatever you feel more comfortable
+with!  So there!
+
+Most people make most of their mail groups total-expirable, though.
+
+@vindex gnus-inhibit-user-auto-expire
+If @code{gnus-inhibit-user-auto-expire} is non-@code{nil}, user marking
+commands will not mark an article as expirable, even if the group has
+auto-expire turned on.
+
+
+@node Washing Mail
+@subsection Washing Mail
+@cindex mail washing
+@cindex list server brain damage
+@cindex incoming mail treatment
+
+Mailers and list servers are notorious for doing all sorts of really,
+really stupid things with mail.  ``Hey, RFC 822 doesn't explicitly
+prohibit us from adding the string @code{wE aRe ElItE!!!!!1!!} to the
+end of all lines passing through our server, so let's do that!!!!1!''
+Yes, but RFC 822 wasn't designed to be read by morons.  Things that were
+considered to be self-evident were not discussed.  So.  Here we are.
+
+Case in point:  The German version of Microsoft Exchange adds @samp{AW:
+} to the subjects of replies instead of @samp{Re: }.  I could pretend to
+be shocked and dismayed by this, but I haven't got the energy.  It is to
+laugh.
+
+Gnus provides a plethora of functions for washing articles while
+displaying them, but it might be nicer to do the filtering before
+storing the mail to disk.  For that purpose, we have three hooks and
+various functions that can be put in these hooks.
+
+@table @code
+@item nnmail-prepare-incoming-hook
+@vindex nnmail-prepare-incoming-hook
+This hook is called before doing anything with the mail and is meant for
+grand, sweeping gestures.  It is called in a buffer that contains all
+the new, incoming mail.  Functions to be used include:
+
+@table @code
+@item nnheader-ms-strip-cr
+@findex nnheader-ms-strip-cr
+Remove trailing carriage returns from each line.  This is default on
+Emacs running on MS machines.
+
+@end table
+
+@item nnmail-prepare-incoming-header-hook
+@vindex nnmail-prepare-incoming-header-hook
+This hook is called narrowed to each header.  It can be used when
+cleaning up the headers.  Functions that can be used include:
+
+@table @code
+@item nnmail-remove-leading-whitespace
+@findex nnmail-remove-leading-whitespace
+Clear leading white space that ``helpful'' listservs have added to the
+headers to make them look nice.  Aaah.
+
+(Note that this function works on both the header on the body of all
+messages, so it is a potentially dangerous function to use (if a body
+of a message contains something that looks like a header line).  So
+rather than fix the bug, it is of course the right solution to make it
+into a feature by documenting it.)
+
+@item nnmail-remove-list-identifiers
+@findex nnmail-remove-list-identifiers
+Some list servers add an identifier---for example, @samp{(idm)}---to the
+beginning of all @code{Subject} headers.  I'm sure that's nice for
+people who use stone age mail readers.  This function will remove
+strings that match the @code{nnmail-list-identifiers} regexp, which can
+also be a list of regexp.  @code{nnmail-list-identifiers} may not contain
+@code{\\(..\\)}.
+
+For instance, if you want to remove the @samp{(idm)} and the
+@samp{nagnagnag} identifiers:
+
+@lisp
+(setq nnmail-list-identifiers
+      '("(idm)" "nagnagnag"))
+@end lisp
+
+This can also be done non-destructively with
+@code{gnus-list-identifiers}, @xref{Article Hiding}.
+
+@item nnmail-remove-tabs
+@findex nnmail-remove-tabs
+Translate all @samp{TAB} characters into @samp{SPACE} characters.
+
+@item nnmail-fix-eudora-headers
+@findex nnmail-fix-eudora-headers
+@cindex Eudora
+Eudora produces broken @code{References} headers, but OK
+@code{In-Reply-To} headers.  This function will get rid of the
+@code{References} headers.
+
+@end table
+
+@item nnmail-prepare-incoming-message-hook
+@vindex nnmail-prepare-incoming-message-hook
+This hook is called narrowed to each message.  Functions to be used
+include:
+
+@table @code
+@item article-de-quoted-unreadable
+@findex article-de-quoted-unreadable
+Decode Quoted Readable encoding.
+
+@end table
+@end table
+
+
+@node Duplicates
+@subsection Duplicates
+
+@vindex nnmail-treat-duplicates
+@vindex nnmail-message-id-cache-length
+@vindex nnmail-message-id-cache-file
+@cindex duplicate mails
+If you are a member of a couple of mailing lists, you will sometimes
+receive two copies of the same mail.  This can be quite annoying, so
+@code{nnmail} checks for and treats any duplicates it might find.  To do
+this, it keeps a cache of old @code{Message-ID}s---
+@code{nnmail-message-id-cache-file}, which is @file{~/.nnmail-cache} by
+default.  The approximate maximum number of @code{Message-ID}s stored
+there is controlled by the @code{nnmail-message-id-cache-length}
+variable, which is 1000 by default.  (So 1000 @code{Message-ID}s will be
+stored.) If all this sounds scary to you, you can set
+@code{nnmail-treat-duplicates} to @code{warn} (which is what it is by
+default), and @code{nnmail} won't delete duplicate mails.  Instead it
+will insert a warning into the head of the mail saying that it thinks
+that this is a duplicate of a different message.
+
+This variable can also be a function.  If that's the case, the function
+will be called from a buffer narrowed to the message in question with
+the @code{Message-ID} as a parameter.  The function must return either
+@code{nil}, @code{warn}, or @code{delete}.
+
+You can turn this feature off completely by setting the variable to
+@code{nil}.
+
+If you want all the duplicate mails to be put into a special
+@dfn{duplicates} group, you could do that using the normal mail split
+methods:
+
+@lisp
+(setq nnmail-split-fancy
+      '(| ;; @r{Messages duplicates go to a separate group.}
+        ("gnus-warning" "duplicat\\(e\\|ion\\) of message" "duplicate")
+        ;; @r{Message from daemons, postmaster, and the like to another.}
+        (any mail "mail.misc")
+        ;; @r{Other rules.}
+        [...] ))
+@end lisp
+@noindent
+Or something like:
+@lisp
+(setq nnmail-split-methods
+      '(("duplicates" "^Gnus-Warning:.*duplicate")
+        ;; @r{Other rules.}
+        [...]))
+@end lisp
+
+Here's a neat feature: If you know that the recipient reads her mail
+with Gnus, and that she has @code{nnmail-treat-duplicates} set to
+@code{delete}, you can send her as many insults as you like, just by
+using a @code{Message-ID} of a mail that you know that she's already
+received.  Think of all the fun!  She'll never see any of it!  Whee!
+
+
+@node Not Reading Mail
+@subsection Not Reading Mail
+
+If you start using any of the mail back ends, they have the annoying
+habit of assuming that you want to read mail with them.  This might not
+be unreasonable, but it might not be what you want.
+
+If you set @code{mail-sources} and @code{nnmail-spool-file} to
+@code{nil}, none of the back ends will ever attempt to read incoming
+mail, which should help.
+
+@vindex nnbabyl-get-new-mail
+@vindex nnmbox-get-new-mail
+@vindex nnml-get-new-mail
+@vindex nnmh-get-new-mail
+@vindex nnfolder-get-new-mail
+This might be too much, if, for instance, you are reading mail quite
+happily with @code{nnml} and just want to peek at some old Rmail
+file you have stashed away with @code{nnbabyl}.  All back ends have
+variables called back-end-@code{get-new-mail}.  If you want to disable
+the @code{nnbabyl} mail reading, you edit the virtual server for the
+group to have a setting where @code{nnbabyl-get-new-mail} to @code{nil}.
+
+All the mail back ends will call @code{nn}*@code{-prepare-save-mail-hook}
+narrowed to the article to be saved before saving it when reading
+incoming mail.
+
+
+@node Choosing a Mail Back End
+@subsection Choosing a Mail Back End
+
+Gnus will read the mail spool when you activate a mail group.  The mail
+file is first copied to your home directory.  What happens after that
+depends on what format you want to store your mail in.
+
+There are six different mail back ends in the standard Gnus, and more
+back ends are available separately.  The mail back end most people use
+(because it is possibly the fastest) is @code{nnml} (@pxref{Mail
+Spool}).
+
+@menu
+* Unix Mail Box::               Using the (quite) standard Un*x mbox.
+* Rmail Babyl::                 Emacs programs use the Rmail Babyl format.
+* Mail Spool::                  Store your mail in a private spool?
+* MH Spool::                    An mhspool-like back end.
+* Maildir::                     Another one-file-per-message format.
+* Mail Folders::                Having one file for each group.
+* Comparing Mail Back Ends::    An in-depth looks at pros and cons.
+@end menu
+
+
+@node Unix Mail Box
+@subsubsection Unix Mail Box
+@cindex nnmbox
+@cindex unix mail box
+
+@vindex nnmbox-active-file
+@vindex nnmbox-mbox-file
+The @dfn{nnmbox} back end will use the standard Un*x mbox file to store
+mail.  @code{nnmbox} will add extra headers to each mail article to say
+which group it belongs in.
+
+Virtual server settings:
+
+@table @code
+@item nnmbox-mbox-file
+@vindex nnmbox-mbox-file
+The name of the mail box in the user's home directory.  Default is
+@file{~/mbox}.
+
+@item nnmbox-active-file
+@vindex nnmbox-active-file
+The name of the active file for the mail box.  Default is
+@file{~/.mbox-active}.
+
+@item nnmbox-get-new-mail
+@vindex nnmbox-get-new-mail
+If non-@code{nil}, @code{nnmbox} will read incoming mail and split it
+into groups.  Default is @code{t}.
+@end table
+
+
+@node Rmail Babyl
+@subsubsection Rmail Babyl
+@cindex nnbabyl
+@cindex Rmail mbox
+
+@vindex nnbabyl-active-file
+@vindex nnbabyl-mbox-file
+The @dfn{nnbabyl} back end will use a Babyl mail box (aka. @dfn{Rmail
+mbox}) to store mail.  @code{nnbabyl} will add extra headers to each
+mail article to say which group it belongs in.
+
+Virtual server settings:
+
+@table @code
+@item nnbabyl-mbox-file
+@vindex nnbabyl-mbox-file
+The name of the Rmail mbox file.  The default is @file{~/RMAIL}
+
+@item nnbabyl-active-file
+@vindex nnbabyl-active-file
+The name of the active file for the rmail box.  The default is
+@file{~/.rmail-active}
+
+@item nnbabyl-get-new-mail
+@vindex nnbabyl-get-new-mail
+If non-@code{nil}, @code{nnbabyl} will read incoming mail.  Default is
+@code{t}
+@end table
+
+
+@node Mail Spool
+@subsubsection Mail Spool
+@cindex nnml
+@cindex mail @acronym{NOV} spool
+
+The @dfn{nnml} spool mail format isn't compatible with any other known
+format.  It should be used with some caution.
+
+@vindex nnml-directory
+If you use this back end, Gnus will split all incoming mail into files,
+one file for each mail, and put the articles into the corresponding
+directories under the directory specified by the @code{nnml-directory}
+variable.  The default value is @file{~/Mail/}.
+
+You do not have to create any directories beforehand; Gnus will take
+care of all that.
+
+If you have a strict limit as to how many files you are allowed to store
+in your account, you should not use this back end.  As each mail gets its
+own file, you might very well occupy thousands of inodes within a few
+weeks.  If this is no problem for you, and it isn't a problem for you
+having your friendly systems administrator walking around, madly,
+shouting ``Who is eating all my inodes?! Who? Who!?!'', then you should
+know that this is probably the fastest format to use.  You do not have
+to trudge through a big mbox file just to read your new mail.
+
+@code{nnml} is probably the slowest back end when it comes to article
+splitting.  It has to create lots of files, and it also generates
+@acronym{NOV} databases for the incoming mails.  This makes it possibly the
+fastest back end when it comes to reading mail.
+
+@cindex self contained nnml servers
+@cindex marks
+When the marks file is used (which it is by default), @code{nnml}
+servers have the property that you may backup them using @code{tar} or
+similar, and later be able to restore them into Gnus (by adding the
+proper @code{nnml} server) and have all your marks be preserved.  Marks
+for a group is usually stored in the @code{.marks} file (but see
+@code{nnml-marks-file-name}) within each @code{nnml} group's directory.
+Individual @code{nnml} groups are also possible to backup, use @kbd{G m}
+to restore the group (after restoring the backup into the nnml
+directory).
+
+If for some reason you believe your @file{.marks} files are screwed
+up, you can just delete them all.  Gnus will then correctly regenerate
+them next time it starts.
+
+Virtual server settings:
+
+@table @code
+@item nnml-directory
+@vindex nnml-directory
+All @code{nnml} directories will be placed under this directory.  The
+default is the value of @code{message-directory} (whose default value
+is @file{~/Mail}).
+
+@item nnml-active-file
+@vindex nnml-active-file
+The active file for the @code{nnml} server.  The default is
+@file{~/Mail/active}.
+
+@item nnml-newsgroups-file
+@vindex nnml-newsgroups-file
+The @code{nnml} group descriptions file.  @xref{Newsgroups File
+Format}.  The default is @file{~/Mail/newsgroups}.
+
+@item nnml-get-new-mail
+@vindex nnml-get-new-mail
+If non-@code{nil}, @code{nnml} will read incoming mail.  The default is
+@code{t}.
+
+@item nnml-nov-is-evil
+@vindex nnml-nov-is-evil
+If non-@code{nil}, this back end will ignore any @acronym{NOV} files.  The
+default is @code{nil}.
+
+@item nnml-nov-file-name
+@vindex nnml-nov-file-name
+The name of the @acronym{NOV} files.  The default is @file{.overview}.
+
+@item nnml-prepare-save-mail-hook
+@vindex nnml-prepare-save-mail-hook
+Hook run narrowed to an article before saving.
+
+@item nnml-marks-is-evil
+@vindex nnml-marks-is-evil
+If non-@code{nil}, this back end will ignore any @sc{marks} files.  The
+default is @code{nil}.
+
+@item nnml-marks-file-name
+@vindex nnml-marks-file-name
+The name of the @dfn{marks} files.  The default is @file{.marks}.
+
+@item nnml-use-compressed-files
+@vindex nnml-use-compressed-files
+If non-@code{nil}, @code{nnml} will allow using compressed message
+files.
+
+@end table
+
+@findex nnml-generate-nov-databases
+If your @code{nnml} groups and @acronym{NOV} files get totally out of
+whack, you can do a complete update by typing @kbd{M-x
+nnml-generate-nov-databases}.  This command will trawl through the
+entire @code{nnml} hierarchy, looking at each and every article, so it
+might take a while to complete.  A better interface to this
+functionality can be found in the server buffer (@pxref{Server
+Commands}).
+
+
+@node MH Spool
+@subsubsection MH Spool
+@cindex nnmh
+@cindex mh-e mail spool
+
+@code{nnmh} is just like @code{nnml}, except that is doesn't generate
+@acronym{NOV} databases and it doesn't keep an active file or marks
+file.  This makes @code{nnmh} a @emph{much} slower back end than
+@code{nnml}, but it also makes it easier to write procmail scripts
+for.
+
+Virtual server settings:
+
+@table @code
+@item nnmh-directory
+@vindex nnmh-directory
+All @code{nnmh} directories will be located under this directory.  The
+default is the value of @code{message-directory} (whose default is
+@file{~/Mail})
+
+@item nnmh-get-new-mail
+@vindex nnmh-get-new-mail
+If non-@code{nil}, @code{nnmh} will read incoming mail.  The default is
+@code{t}.
+
+@item nnmh-be-safe
+@vindex nnmh-be-safe
+If non-@code{nil}, @code{nnmh} will go to ridiculous lengths to make
+sure that the articles in the folder are actually what Gnus thinks
+they are.  It will check date stamps and stat everything in sight, so
+setting this to @code{t} will mean a serious slow-down.  If you never
+use anything but Gnus to read the @code{nnmh} articles, you do not
+have to set this variable to @code{t}.  The default is @code{nil}.
+@end table
+
+
+@node Maildir
+@subsubsection Maildir
+@cindex nnmaildir
+@cindex maildir
+
+@code{nnmaildir} stores mail in the maildir format, with each maildir
+corresponding to a group in Gnus.  This format is documented here:
+@uref{http://cr.yp.to/proto/maildir.html} and here:
+@uref{http://www.qmail.org/man/man5/maildir.html}.  @code{nnmaildir}
+also stores extra information in the @file{.nnmaildir/} directory
+within a maildir.
+
+Maildir format was designed to allow concurrent deliveries and
+reading, without needing locks.  With other back ends, you would have
+your mail delivered to a spool of some kind, and then you would
+configure Gnus to split mail from that spool into your groups.  You
+can still do that with @code{nnmaildir}, but the more common
+configuration is to have your mail delivered directly to the maildirs
+that appear as group in Gnus.
+
+@code{nnmaildir} is designed to be perfectly reliable: @kbd{C-g} will
+never corrupt its data in memory, and @code{SIGKILL} will never
+corrupt its data in the filesystem.
+
+@code{nnmaildir} stores article marks and @acronym{NOV} data in each
+maildir.  So you can copy a whole maildir from one Gnus setup to
+another, and you will keep your marks.
+
+Virtual server settings:
+
+@table @code
+@item directory
+For each of your @code{nnmaildir} servers (it's very unlikely that
+you'd need more than one), you need to create a directory and populate
+it with maildirs or symlinks to maildirs (and nothing else; do not
+choose a directory already used for other purposes).  Each maildir
+will be represented in Gnus as a newsgroup on that server; the
+filename of the symlink will be the name of the group.  Any filenames
+in the directory starting with @samp{.} are ignored.  The directory is
+scanned when you first start Gnus, and each time you type @kbd{g} in
+the group buffer; if any maildirs have been removed or added,
+@code{nnmaildir} notices at these times.
+
+The value of the @code{directory} parameter should be a Lisp form
+which is processed by @code{eval} and @code{expand-file-name} to get
+the path of the directory for this server.  The form is @code{eval}ed
+only when the server is opened; the resulting string is used until the
+server is closed.  (If you don't know about forms and @code{eval},
+don't worry---a simple string will work.)  This parameter is not
+optional; you must specify it.  I don't recommend using
+@code{"~/Mail"} or a subdirectory of it; several other parts of Gnus
+use that directory by default for various things, and may get confused
+if @code{nnmaildir} uses it too.  @code{"~/.nnmaildir"} is a typical
+value.
+
+@item target-prefix
+This should be a Lisp form which is processed by @code{eval} and
+@code{expand-file-name}.  The form is @code{eval}ed only when the
+server is opened; the resulting string is used until the server is
+closed.
+
+When you create a group on an @code{nnmaildir} server, the maildir is
+created with @code{target-prefix} prepended to its name, and a symlink
+pointing to that maildir is created, named with the plain group name.
+So if @code{directory} is @code{"~/.nnmaildir"} and
+@code{target-prefix} is @code{"../maildirs/"}, then when you create
+the group @code{foo}, @code{nnmaildir} will create
+@file{~/.nnmaildir/../maildirs/foo} as a maildir, and will create
+@file{~/.nnmaildir/foo} as a symlink pointing to
+@file{../maildirs/foo}.
+
+You can set @code{target-prefix} to a string without any slashes to
+create both maildirs and symlinks in the same @code{directory}; in
+this case, any maildirs found in @code{directory} whose names start
+with @code{target-prefix} will not be listed as groups (but the
+symlinks pointing to them will be).
+
+As a special case, if @code{target-prefix} is @code{""} (the default),
+then when you create a group, the maildir will be created in
+@code{directory} without a corresponding symlink.  Beware that you
+cannot use @code{gnus-group-delete-group} on such groups without the
+@code{force} argument.
+
+@item directory-files
+This should be a function with the same interface as
+@code{directory-files} (such as @code{directory-files} itself).  It is
+used to scan the server's @code{directory} for maildirs.  This
+parameter is optional; the default is
+@code{nnheader-directory-files-safe} if
+@code{nnheader-directory-files-is-safe} is @code{nil}, and
+@code{directory-files} otherwise.
+(@code{nnheader-directory-files-is-safe} is checked only once when the
+server is opened; if you want to check it each time the directory is
+scanned, you'll have to provide your own function that does that.)
+
+@item get-new-mail
+If non-@code{nil}, then after scanning for new mail in the group
+maildirs themselves as usual, this server will also incorporate mail
+the conventional Gnus way, from @code{mail-sources} according to
+@code{nnmail-split-methods} or @code{nnmail-split-fancy}.  The default
+value is @code{nil}.
+
+Do @emph{not} use the same maildir both in @code{mail-sources} and as
+an @code{nnmaildir} group.  The results might happen to be useful, but
+that would be by chance, not by design, and the results might be
+different in the future.  If your split rules create new groups,
+remember to supply a @code{create-directory} server parameter.
+@end table
+
+@subsubsection Group parameters
+
+@code{nnmaildir} uses several group parameters.  It's safe to ignore
+all this; the default behavior for @code{nnmaildir} is the same as the
+default behavior for other mail back ends: articles are deleted after
+one week, etc.  Except for the expiry parameters, all this
+functionality is unique to @code{nnmaildir}, so you can ignore it if
+you're just trying to duplicate the behavior you already have with
+another back end.
+
+If the value of any of these parameters is a vector, the first element
+is evaluated as a Lisp form and the result is used, rather than the
+original value.  If the value is not a vector, the value itself is
+evaluated as a Lisp form.  (This is why these parameters use names
+different from those of other, similar parameters supported by other
+back ends: they have different, though similar, meanings.)  (For
+numbers, strings, @code{nil}, and @code{t}, you can ignore the
+@code{eval} business again; for other values, remember to use an extra
+quote and wrap the value in a vector when appropriate.)
+
+@table @code
+@item expire-age
+An integer specifying the minimum age, in seconds, of an article
+before it will be expired, or the symbol @code{never} to specify that
+articles should never be expired.  If this parameter is not set,
+@code{nnmaildir} falls back to the usual
+@code{nnmail-expiry-wait}(@code{-function}) variables (the
+@code{expiry-wait} group parameter overrides @code{nnmail-expiry-wait}
+and makes @code{nnmail-expiry-wait-function} ineffective).  If you
+wanted a value of 3 days, you could use something like @code{[(* 3 24
+60 60)]}; @code{nnmaildir} will evaluate the form and use the result.
+An article's age is measured starting from the article file's
+modification time.  Normally, this is the same as the article's
+delivery time, but editing an article makes it younger.  Moving an
+article (other than via expiry) may also make an article younger.
+
+@item expire-group
+If this is set to a string such as a full Gnus group name, like
+@example
+"backend+server.address.string:group.name"
+@end example
+and if it is not the name of the same group that the parameter belongs
+to, then articles will be moved to the specified group during expiry
+before being deleted.  @emph{If this is set to an @code{nnmaildir}
+group, the article will be just as old in the destination group as it
+was in the source group.}  So be careful with @code{expire-age} in the
+destination group.  If this is set to the name of the same group that
+the parameter belongs to, then the article is not expired at all.  If
+you use the vector form, the first element is evaluated once for each
+article.  So that form can refer to
+@code{nnmaildir-article-file-name}, etc., to decide where to put the
+article.  @emph{Even if this parameter is not set, @code{nnmaildir}
+does not fall back to the @code{expiry-target} group parameter or the
+@code{nnmail-expiry-target} variable.}
+
+@item read-only
+If this is set to @code{t}, @code{nnmaildir} will treat the articles
+in this maildir as read-only.  This means: articles are not renamed
+from @file{new/} into @file{cur/}; articles are only found in
+@file{new/}, not @file{cur/}; articles are never deleted; articles
+cannot be edited.  @file{new/} is expected to be a symlink to the
+@file{new/} directory of another maildir---e.g., a system-wide mailbox
+containing a mailing list of common interest.  Everything in the
+maildir outside @file{new/} is @emph{not} treated as read-only, so for
+a shared mailbox, you do still need to set up your own maildir (or
+have write permission to the shared mailbox); your maildir just won't
+contain extra copies of the articles.
+
+@item directory-files
+A function with the same interface as @code{directory-files}.  It is
+used to scan the directories in the maildir corresponding to this
+group to find articles.  The default is the function specified by the
+server's @code{directory-files} parameter.
+
+@item distrust-Lines:
+If non-@code{nil}, @code{nnmaildir} will always count the lines of an
+article, rather than use the @code{Lines:} header field.  If
+@code{nil}, the header field will be used if present.
+
+@item always-marks
+A list of mark symbols, such as @code{['(read expire)]}.  Whenever
+Gnus asks @code{nnmaildir} for article marks, @code{nnmaildir} will
+say that all articles have these marks, regardless of whether the
+marks stored in the filesystem say so.  This is a proof-of-concept
+feature that will probably be removed eventually; it ought to be done
+in Gnus proper, or abandoned if it's not worthwhile.
+
+@item never-marks
+A list of mark symbols, such as @code{['(tick expire)]}.  Whenever
+Gnus asks @code{nnmaildir} for article marks, @code{nnmaildir} will
+say that no articles have these marks, regardless of whether the marks
+stored in the filesystem say so.  @code{never-marks} overrides
+@code{always-marks}.  This is a proof-of-concept feature that will
+probably be removed eventually; it ought to be done in Gnus proper, or
+abandoned if it's not worthwhile.
+
+@item nov-cache-size
+An integer specifying the size of the @acronym{NOV} memory cache.  To
+speed things up, @code{nnmaildir} keeps @acronym{NOV} data in memory
+for a limited number of articles in each group.  (This is probably not
+worthwhile, and will probably be removed in the future.)  This
+parameter's value is noticed only the first time a group is seen after
+the server is opened---i.e., when you first start Gnus, typically.
+The @acronym{NOV} cache is never resized until the server is closed
+and reopened.  The default is an estimate of the number of articles
+that would be displayed in the summary buffer: a count of articles
+that are either marked with @code{tick} or not marked with
+@code{read}, plus a little extra.
+@end table
+
+@subsubsection Article identification
+Articles are stored in the @file{cur/} subdirectory of each maildir.
+Each article file is named like @code{uniq:info}, where @code{uniq}
+contains no colons.  @code{nnmaildir} ignores, but preserves, the
+@code{:info} part.  (Other maildir readers typically use this part of
+the filename to store marks.)  The @code{uniq} part uniquely
+identifies the article, and is used in various places in the
+@file{.nnmaildir/} subdirectory of the maildir to store information
+about the corresponding article.  The full pathname of an article is
+available in the variable @code{nnmaildir-article-file-name} after you
+request the article in the summary buffer.
+
+@subsubsection NOV data
+An article identified by @code{uniq} has its @acronym{NOV} data (used
+to generate lines in the summary buffer) stored in
+@code{.nnmaildir/nov/uniq}.  There is no
+@code{nnmaildir-generate-nov-databases} function.  (There isn't much
+need for it---an article's @acronym{NOV} data is updated automatically
+when the article or @code{nnmail-extra-headers} has changed.)  You can
+force @code{nnmaildir} to regenerate the @acronym{NOV} data for a
+single article simply by deleting the corresponding @acronym{NOV}
+file, but @emph{beware}: this will also cause @code{nnmaildir} to
+assign a new article number for this article, which may cause trouble
+with @code{seen} marks, the Agent, and the cache.
+
+@subsubsection Article marks
+An article identified by @code{uniq} is considered to have the mark
+@code{flag} when the file @file{.nnmaildir/marks/flag/uniq} exists.
+When Gnus asks @code{nnmaildir} for a group's marks, @code{nnmaildir}
+looks for such files and reports the set of marks it finds.  When Gnus
+asks @code{nnmaildir} to store a new set of marks, @code{nnmaildir}
+creates and deletes the corresponding files as needed.  (Actually,
+rather than create a new file for each mark, it just creates hard
+links to @file{.nnmaildir/markfile}, to save inodes.)
+
+You can invent new marks by creating a new directory in
+@file{.nnmaildir/marks/}.  You can tar up a maildir and remove it from
+your server, untar it later, and keep your marks.  You can add and
+remove marks yourself by creating and deleting mark files.  If you do
+this while Gnus is running and your @code{nnmaildir} server is open,
+it's best to exit all summary buffers for @code{nnmaildir} groups and
+type @kbd{s} in the group buffer first, and to type @kbd{g} or
+@kbd{M-g} in the group buffer afterwards.  Otherwise, Gnus might not
+pick up the changes, and might undo them.
+
+
+@node Mail Folders
+@subsubsection Mail Folders
+@cindex nnfolder
+@cindex mbox folders
+@cindex mail folders
+
+@code{nnfolder} is a back end for storing each mail group in a
+separate file.  Each file is in the standard Un*x mbox format.
+@code{nnfolder} will add extra headers to keep track of article
+numbers and arrival dates.
+
+@cindex self contained nnfolder servers
+@cindex marks
+When the marks file is used (which it is by default), @code{nnfolder}
+servers have the property that you may backup them using @code{tar} or
+similar, and later be able to restore them into Gnus (by adding the
+proper @code{nnfolder} server) and have all your marks be preserved.
+Marks for a group are usually stored in a file named as the mbox file
+with @code{.mrk} concatenated to it (but see
+@code{nnfolder-marks-file-suffix}) within the @code{nnfolder}
+directory.  Individual @code{nnfolder} groups are also possible to
+backup, use @kbd{G m} to restore the group (after restoring the backup
+into the @code{nnfolder} directory).
+
+Virtual server settings:
+
+@table @code
+@item nnfolder-directory
+@vindex nnfolder-directory
+All the @code{nnfolder} mail boxes will be stored under this
+directory.  The default is the value of @code{message-directory}
+(whose default is @file{~/Mail})
+
+@item nnfolder-active-file
+@vindex nnfolder-active-file
+The name of the active file.  The default is @file{~/Mail/active}.
+
+@item nnfolder-newsgroups-file
+@vindex nnfolder-newsgroups-file
+The name of the group descriptions file.  @xref{Newsgroups File
+Format}.  The default is @file{~/Mail/newsgroups}
+
+@item nnfolder-get-new-mail
+@vindex nnfolder-get-new-mail
+If non-@code{nil}, @code{nnfolder} will read incoming mail.  The
+default is @code{t}
+
+@item nnfolder-save-buffer-hook
+@vindex nnfolder-save-buffer-hook
+@cindex backup files
+Hook run before saving the folders.  Note that Emacs does the normal
+backup renaming of files even with the @code{nnfolder} buffers.  If
+you wish to switch this off, you could say something like the
+following in your @file{.emacs} file:
+
+@lisp
+(defun turn-off-backup ()
+  (set (make-local-variable 'backup-inhibited) t))
+
+(add-hook 'nnfolder-save-buffer-hook 'turn-off-backup)
+@end lisp
+
+@item nnfolder-delete-mail-hook
+@vindex nnfolder-delete-mail-hook
+Hook run in a buffer narrowed to the message that is to be deleted.
+This function can be used to copy the message to somewhere else, or to
+extract some information from it before removing it.
+
+@item nnfolder-nov-is-evil
+@vindex nnfolder-nov-is-evil
+If non-@code{nil}, this back end will ignore any @acronym{NOV} files.  The
+default is @code{nil}.
+
+@item nnfolder-nov-file-suffix
+@vindex nnfolder-nov-file-suffix
+The extension for @acronym{NOV} files.  The default is @file{.nov}.
+
+@item nnfolder-nov-directory
+@vindex nnfolder-nov-directory
+The directory where the @acronym{NOV} files should be stored.  If
+@code{nil}, @code{nnfolder-directory} is used.
+
+@item nnfolder-marks-is-evil
+@vindex nnfolder-marks-is-evil
+If non-@code{nil}, this back end will ignore any @sc{marks} files.  The
+default is @code{nil}.
+
+@item nnfolder-marks-file-suffix
+@vindex nnfolder-marks-file-suffix
+The extension for @sc{marks} files.  The default is @file{.mrk}.
+
+@item nnfolder-marks-directory
+@vindex nnfolder-marks-directory
+The directory where the @sc{marks} files should be stored.  If
+@code{nil}, @code{nnfolder-directory} is used.
+
+@end table
+
+
+@findex nnfolder-generate-active-file
+@kindex M-x nnfolder-generate-active-file
+If you have lots of @code{nnfolder}-like files you'd like to read with
+@code{nnfolder}, you can use the @kbd{M-x nnfolder-generate-active-file}
+command to make @code{nnfolder} aware of all likely files in
+@code{nnfolder-directory}.  This only works if you use long file names,
+though.
+
+@node Comparing Mail Back Ends
+@subsubsection Comparing Mail Back Ends
+
+First, just for terminology, the @dfn{back end} is the common word for a
+low-level access method---a transport, if you will, by which something
+is acquired.  The sense is that one's mail has to come from somewhere,
+and so selection of a suitable back end is required in order to get that
+mail within spitting distance of Gnus.
+
+The same concept exists for Usenet itself: Though access to articles is
+typically done by @acronym{NNTP} these days, once upon a midnight dreary, everyone
+in the world got at Usenet by running a reader on the machine where the
+articles lay (the machine which today we call an @acronym{NNTP} server), and
+access was by the reader stepping into the articles' directory spool
+area directly.  One can still select between either the @code{nntp} or
+@code{nnspool} back ends, to select between these methods, if one happens
+actually to live on the server (or can see its spool directly, anyway,
+via NFS).
+
+The goal in selecting a mail back end is to pick one which
+simultaneously represents a suitable way of dealing with the original
+format plus leaving mail in a form that is convenient to use in the
+future.  Here are some high and low points on each:
+
+@table @code
+@item nnmbox
+
+UNIX systems have historically had a single, very common, and well-
+defined format.  All messages arrive in a single @dfn{spool file}, and
+they are delineated by a line whose regular expression matches
+@samp{^From_}.  (My notational use of @samp{_} is to indicate a space,
+to make it clear in this instance that this is not the RFC-specified
+@samp{From:} header.)  Because Emacs and therefore Gnus emanate
+historically from the Unix environment, it is simplest if one does not
+mess a great deal with the original mailbox format, so if one chooses
+this back end, Gnus' primary activity in getting mail from the real spool
+area to Gnus' preferred directory is simply to copy it, with no
+(appreciable) format change in the process.  It is the ``dumbest'' way
+to move mail into availability in the Gnus environment.  This makes it
+fast to move into place, but slow to parse, when Gnus has to look at
+what's where.
+
+@item nnbabyl
+
+Once upon a time, there was the DEC-10 and DEC-20, running operating
+systems called TOPS and related things, and the usual (only?) mail
+reading environment was a thing called Babyl.  I don't know what format
+was used for mail landing on the system, but Babyl had its own internal
+format to which mail was converted, primarily involving creating a
+spool-file-like entity with a scheme for inserting Babyl-specific
+headers and status bits above the top of each message in the file.
+Rmail was Emacs' first mail reader, it was written by Richard Stallman,
+and Stallman came out of that TOPS/Babyl environment, so he wrote Rmail
+to understand the mail files folks already had in existence.  Gnus (and
+VM, for that matter) continue to support this format because it's
+perceived as having some good qualities in those mailer-specific
+headers/status bits stuff.  Rmail itself still exists as well, of
+course, and is still maintained by Stallman.
+
+Both of the above forms leave your mail in a single file on your
+file system, and they must parse that entire file each time you take a
+look at your mail.
+
+@item nnml
+
+@code{nnml} is the back end which smells the most as though you were
+actually operating with an @code{nnspool}-accessed Usenet system.  (In
+fact, I believe @code{nnml} actually derived from @code{nnspool} code,
+lo these years ago.)  One's mail is taken from the original spool file,
+and is then cut up into individual message files, 1:1.  It maintains a
+Usenet-style active file (analogous to what one finds in an INN- or
+CNews-based news system in (for instance) @file{/var/lib/news/active},
+or what is returned via the @samp{NNTP LIST} verb) and also creates
+@dfn{overview} files for efficient group entry, as has been defined for
+@acronym{NNTP} servers for some years now.  It is slower in mail-splitting,
+due to the creation of lots of files, updates to the @code{nnml} active
+file, and additions to overview files on a per-message basis, but it is
+extremely fast on access because of what amounts to the indexing support
+provided by the active file and overviews.
+
+@code{nnml} costs @dfn{inodes} in a big way; that is, it soaks up the
+resource which defines available places in the file system to put new
+files.  Sysadmins take a dim view of heavy inode occupation within
+tight, shared file systems.  But if you live on a personal machine where
+the file system is your own and space is not at a premium, @code{nnml}
+wins big.
+
+It is also problematic using this back end if you are living in a
+FAT16-based Windows world, since much space will be wasted on all these
+tiny files.
+
+@item nnmh
+
+The Rand MH mail-reading system has been around UNIX systems for a very
+long time; it operates by splitting one's spool file of messages into
+individual files, but with little or no indexing support---@code{nnmh}
+is considered to be semantically equivalent to ``@code{nnml} without
+active file or overviews''.  This is arguably the worst choice, because
+one gets the slowness of individual file creation married to the
+slowness of access parsing when learning what's new in one's groups.
+
+@item nnfolder
+
+Basically the effect of @code{nnfolder} is @code{nnmbox} (the first
+method described above) on a per-group basis.  That is, @code{nnmbox}
+itself puts @emph{all} one's mail in one file; @code{nnfolder} provides a
+little bit of optimization to this so that each of one's mail groups has
+a Unix mail box file.  It's faster than @code{nnmbox} because each group
+can be parsed separately, and still provides the simple Unix mail box
+format requiring minimal effort in moving the mail around.  In addition,
+it maintains an ``active'' file making it much faster for Gnus to figure
+out how many messages there are in each separate group.
+
+If you have groups that are expected to have a massive amount of
+messages, @code{nnfolder} is not the best choice, but if you receive
+only a moderate amount of mail, @code{nnfolder} is probably the most
+friendly mail back end all over.
+
+@item nnmaildir
+
+For configuring expiry and other things, @code{nnmaildir} uses
+incompatible group parameters, slightly different from those of other
+mail back ends.
+
+@code{nnmaildir} is largely similar to @code{nnml}, with some notable
+differences.  Each message is stored in a separate file, but the
+filename is unrelated to the article number in Gnus.  @code{nnmaildir}
+also stores the equivalent of @code{nnml}'s overview files in one file
+per article, so it uses about twice as many inodes as @code{nnml}.  (Use
+@code{df -i} to see how plentiful your inode supply is.)  If this slows
+you down or takes up very much space, consider switching to
+@uref{http://www.namesys.com/, ReiserFS} or another non-block-structured
+file system.
+
+Since maildirs don't require locking for delivery, the maildirs you use
+as groups can also be the maildirs your mail is directly delivered to.
+This means you can skip Gnus' mail splitting if your mail is already
+organized into different mailboxes during delivery.  A @code{directory}
+entry in @code{mail-sources} would have a similar effect, but would
+require one set of mailboxes for spooling deliveries (in mbox format,
+thus damaging message bodies), and another set to be used as groups (in
+whatever format you like).  A maildir has a built-in spool, in the
+@code{new/} subdirectory.  Beware that currently, mail moved from
+@code{new/} to @code{cur/} instead of via mail splitting will not
+undergo treatment such as duplicate checking.
+
+@code{nnmaildir} stores article marks for a given group in the
+corresponding maildir, in a way designed so that it's easy to manipulate
+them from outside Gnus.  You can tar up a maildir, unpack it somewhere
+else, and still have your marks.  @code{nnml} also stores marks, but
+it's not as easy to work with them from outside Gnus as with
+@code{nnmaildir}.
+
+@code{nnmaildir} uses a significant amount of memory to speed things up.
+(It keeps in memory some of the things that @code{nnml} stores in files
+and that @code{nnmh} repeatedly parses out of message files.)  If this
+is a problem for you, you can set the @code{nov-cache-size} group
+parameter to something small (0 would probably not work, but 1 probably
+would) to make it use less memory.  This caching will probably be
+removed in the future.
+
+Startup is likely to be slower with @code{nnmaildir} than with other
+back ends.  Everything else is likely to be faster, depending in part
+on your file system.
+
+@code{nnmaildir} does not use @code{nnoo}, so you cannot use @code{nnoo}
+to write an @code{nnmaildir}-derived back end.
+
+@end table
+
+
+@node Browsing the Web
+@section Browsing the Web
+@cindex web
+@cindex browsing the web
+@cindex www
+@cindex http
+
+Web-based discussion forums are getting more and more popular.  On many
+subjects, the web-based forums have become the most important forums,
+eclipsing the importance of mailing lists and news groups.  The reason
+is easy to understand---they are friendly to new users; you just point
+and click, and there's the discussion.  With mailing lists, you have to
+go through a cumbersome subscription procedure, and most people don't
+even know what a news group is.
+
+The problem with this scenario is that web browsers are not very good at
+being newsreaders.  They do not keep track of what articles you've read;
+they do not allow you to score on subjects you're interested in; they do
+not allow off-line browsing; they require you to click around and drive
+you mad in the end.
+
+So---if web browsers suck at reading discussion forums, why not use Gnus
+to do it instead?
+
+Gnus has been getting a bit of a collection of back ends for providing
+interfaces to these sources.
+
+@menu
+* Archiving Mail::
+* Web Searches::                Creating groups from articles that match a string.
+* Slashdot::                    Reading the Slashdot comments.
+* Ultimate::                    The Ultimate Bulletin Board systems.
+* Web Archive::                 Reading mailing list archived on web.
+* RSS::                         Reading RDF site summary.
+* Customizing W3::              Doing stuff to Emacs/W3 from Gnus.
+@end menu
+
+All the web sources require Emacs/W3 and the url library or those
+alternatives to work.
+
+The main caveat with all these web sources is that they probably won't
+work for a very long time.  Gleaning information from the @acronym{HTML} data
+is guesswork at best, and when the layout is altered, the Gnus back end
+will fail.  If you have reasonably new versions of these back ends,
+though, you should be ok.
+
+One thing all these Web methods have in common is that the Web sources
+are often down, unavailable or just plain too slow to be fun.  In those
+cases, it makes a lot of sense to let the Gnus Agent (@pxref{Gnus
+Unplugged}) handle downloading articles, and then you can read them at
+leisure from your local disk.  No more World Wide Wait for you.
+
+@node Archiving Mail
+@subsection Archiving Mail
+@cindex archiving mail
+@cindex backup of mail
+
+Some of the back ends, notably @code{nnml}, @code{nnfolder}, and
+@code{nnmaildir}, now actually store the article marks with each group.
+For these servers, archiving and restoring a group while preserving
+marks is fairly simple.
+
+(Preserving the group level and group parameters as well still
+requires ritual dancing and sacrifices to the @file{.newsrc.eld} deity
+though.)
+
+To archive an entire @code{nnml}, @code{nnfolder}, or @code{nnmaildir}
+server, take a recursive copy of the server directory.  There is no need
+to shut down Gnus, so archiving may be invoked by @code{cron} or
+similar.  You restore the data by restoring the directory tree, and
+adding a server definition pointing to that directory in Gnus.  The
+@ref{Article Backlog}, @ref{Asynchronous Fetching} and other things
+might interfere with overwriting data, so you may want to shut down Gnus
+before you restore the data.
+
+It is also possible to archive individual @code{nnml},
+@code{nnfolder}, or @code{nnmaildir} groups, while preserving marks.
+For @code{nnml} or @code{nnmaildir}, you copy all files in the group's
+directory.  For @code{nnfolder} you need to copy both the base folder
+file itself (@file{FOO}, say), and the marks file (@file{FOO.mrk} in
+this example).  Restoring the group is done with @kbd{G m} from the Group
+buffer.  The last step makes Gnus notice the new directory.
+@code{nnmaildir} notices the new directory automatically, so @kbd{G m}
+is unnecessary in that case.
+
+@node Web Searches
+@subsection Web Searches
+@cindex nnweb
+@cindex Google
+@cindex dejanews
+@cindex gmane
+@cindex Usenet searches
+@cindex searching the Usenet
+
+It's, like, too neat to search the Usenet for articles that match a
+string, but it, like, totally @emph{sucks}, like, totally, to use one of
+those, like, Web browsers, and you, like, have to, rilly, like, look at
+the commercials, so, like, with Gnus you can do @emph{rad}, rilly,
+searches without having to use a browser.
+
+The @code{nnweb} back end allows an easy interface to the mighty search
+engine.  You create an @code{nnweb} group, enter a search pattern, and
+then enter the group and read the articles like you would any normal
+group.  The @kbd{G w} command in the group buffer (@pxref{Foreign
+Groups}) will do this in an easy-to-use fashion.
+
+@code{nnweb} groups don't really lend themselves to being solid
+groups---they have a very fleeting idea of article numbers.  In fact,
+each time you enter an @code{nnweb} group (not even changing the search
+pattern), you are likely to get the articles ordered in a different
+manner.  Not even using duplicate suppression (@pxref{Duplicate
+Suppression}) will help, since @code{nnweb} doesn't even know the
+@code{Message-ID} of the articles before reading them using some search
+engines (Google, for instance).  The only possible way to keep track
+of which articles you've read is by scoring on the @code{Date}
+header---mark all articles posted before the last date you read the
+group as read.
+
+If the search engine changes its output substantially, @code{nnweb}
+won't be able to parse it and will fail.  One could hardly fault the Web
+providers if they were to do this---their @emph{raison d'être} is to
+make money off of advertisements, not to provide services to the
+community.  Since @code{nnweb} washes the ads off all the articles, one
+might think that the providers might be somewhat miffed.  We'll see.
+
+You must have the @code{url} and @code{W3} package or those alternatives
+(try @code{customize-group} on the @samp{mm-url} variable group)
+installed to be able to use @code{nnweb}.
+
+Virtual server variables:
+
+@table @code
+@item nnweb-type
+@vindex nnweb-type
+What search engine type is being used.  The currently supported types
+are @code{google}, @code{dejanews}, and @code{gmane}.  Note that
+@code{dejanews} is an alias to @code{google}.
+
+@item nnweb-search
+@vindex nnweb-search
+The search string to feed to the search engine.
+
+@item nnweb-max-hits
+@vindex nnweb-max-hits
+Advisory maximum number of hits per search to display.  The default is
+999.
+
+@item nnweb-type-definition
+@vindex nnweb-type-definition
+Type-to-definition alist.  This alist says what @code{nnweb} should do
+with the various search engine types.  The following elements must be
+present:
+
+@table @code
+@item article
+Function to decode the article and provide something that Gnus
+understands.
+
+@item map
+Function to create an article number to message header and URL alist.
+
+@item search
+Function to send the search string to the search engine.
+
+@item address
+The address the aforementioned function should send the search string
+to.
+
+@item id
+Format string URL to fetch an article by @code{Message-ID}.
+@end table
+
+@end table
+
+
+@node Slashdot
+@subsection Slashdot
+@cindex Slashdot
+@cindex nnslashdot
+
+@uref{http://slashdot.org/, Slashdot} is a popular news site, with
+lively discussion following the news articles.  @code{nnslashdot} will
+let you read this forum in a convenient manner.
+
+The easiest way to read this source is to put something like the
+following in your @file{~/.gnus.el} file:
+
+@lisp
+(setq gnus-secondary-select-methods
+      '((nnslashdot "")))
+@end lisp
+
+This will make Gnus query the @code{nnslashdot} back end for new comments
+and groups.  The @kbd{F} command will subscribe each new news article as
+a new Gnus group, and you can read the comments by entering these
+groups.  (Note that the default subscription method is to subscribe new
+groups as zombies.  Other methods are available (@pxref{Subscription
+Methods}).
+
+If you want to remove an old @code{nnslashdot} group, the @kbd{G DEL}
+command is the most handy tool (@pxref{Foreign Groups}).
+
+When following up to @code{nnslashdot} comments (or posting new
+comments), some light @acronym{HTML}izations will be performed.  In
+particular, text quoted with @samp{> } will be quoted with
+@samp{blockquote} instead, and signatures will have @samp{br} added to
+the end of each line.  Other than that, you can just write @acronym{HTML}
+directly into the message buffer.  Note that Slashdot filters out some
+@acronym{HTML} forms.
+
+The following variables can be altered to change its behavior:
+
+@table @code
+@item nnslashdot-threaded
+Whether @code{nnslashdot} should display threaded groups or not.  The
+default is @code{t}.  To be able to display threads, @code{nnslashdot}
+has to retrieve absolutely all comments in a group upon entry.  If a
+threaded display is not required, @code{nnslashdot} will only retrieve
+the comments that are actually wanted by the user.  Threading is nicer,
+but much, much slower than unthreaded.
+
+@item nnslashdot-login-name
+@vindex nnslashdot-login-name
+The login name to use when posting.
+
+@item nnslashdot-password
+@vindex nnslashdot-password
+The password to use when posting.
+
+@item nnslashdot-directory
+@vindex nnslashdot-directory
+Where @code{nnslashdot} will store its files.  The default is
+@file{~/News/slashdot/}.
+
+@item nnslashdot-active-url
+@vindex nnslashdot-active-url
+The @acronym{URL} format string that will be used to fetch the
+information on news articles and comments.  The default is@*
+@samp{http://slashdot.org/search.pl?section=&min=%d}.
+
+@item nnslashdot-comments-url
+@vindex nnslashdot-comments-url
+The @acronym{URL} format string that will be used to fetch comments.
+
+@item nnslashdot-article-url
+@vindex nnslashdot-article-url
+The @acronym{URL} format string that will be used to fetch the news
+article.  The default is
+@samp{http://slashdot.org/article.pl?sid=%s&mode=nocomment}.
+
+@item nnslashdot-threshold
+@vindex nnslashdot-threshold
+The score threshold.  The default is -1.
+
+@item nnslashdot-group-number
+@vindex nnslashdot-group-number
+The number of old groups, in addition to the ten latest, to keep
+updated.  The default is 0.
+
+@end table
+
+
+
+@node Ultimate
+@subsection Ultimate
+@cindex nnultimate
+@cindex Ultimate Bulletin Board
+
+@uref{http://www.ultimatebb.com/, The Ultimate Bulletin Board} is
+probably the most popular Web bulletin board system used.  It has a
+quite regular and nice interface, and it's possible to get the
+information Gnus needs to keep groups updated.
+
+The easiest way to get started with @code{nnultimate} is to say
+something like the following in the group buffer:  @kbd{B nnultimate RET
+http://www.tcj.com/messboard/ubbcgi/ RET}.  (Substitute the @acronym{URL}
+(not including @samp{Ultimate.cgi} or the like at the end) for a forum
+you're interested in; there's quite a list of them on the Ultimate web
+site.)  Then subscribe to the groups you're interested in from the
+server buffer, and read them from the group buffer.
+
+The following @code{nnultimate} variables can be altered:
+
+@table @code
+@item nnultimate-directory
+@vindex nnultimate-directory
+The directory where @code{nnultimate} stores its files.  The default is@*
+@file{~/News/ultimate/}.
+@end table
+
+
+@node Web Archive
+@subsection Web Archive
+@cindex nnwarchive
+@cindex Web Archive
+
+Some mailing lists only have archives on Web servers, such as
+@uref{http://www.egroups.com/} and
+@uref{http://www.mail-archive.com/}.  It has a quite regular and nice
+interface, and it's possible to get the information Gnus needs to keep
+groups updated.
+
+@findex gnus-group-make-warchive-group
+The easiest way to get started with @code{nnwarchive} is to say
+something like the following in the group buffer: @kbd{M-x
+gnus-group-make-warchive-group RET @var{an_egroup} RET egroups RET
+www.egroups.com RET @var{your@@email.address} RET}.  (Substitute the
+@var{an_egroup} with the mailing list you subscribed, the
+@var{your@@email.address} with your email address.), or to browse the
+back end by @kbd{B nnwarchive RET mail-archive RET}.
+
+The following @code{nnwarchive} variables can be altered:
+
+@table @code
+@item nnwarchive-directory
+@vindex nnwarchive-directory
+The directory where @code{nnwarchive} stores its files.  The default is@*
+@file{~/News/warchive/}.
+
+@item nnwarchive-login
+@vindex nnwarchive-login
+The account name on the web server.
+
+@item nnwarchive-passwd
+@vindex nnwarchive-passwd
+The password for your account on the web server.
+@end table
+
+@node RSS
+@subsection RSS
+@cindex nnrss
+@cindex RSS
+
+Some web sites have an RDF Site Summary (@acronym{RSS}).
+@acronym{RSS} is a format for summarizing headlines from news related
+sites (such as BBC or CNN).  But basically anything list-like can be
+presented as an @acronym{RSS} feed: weblogs, changelogs or recent
+changes to a wiki (e.g. @url{http://cliki.net/recent-changes.rdf}).
+
+@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 (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.
+The title, which allows any characters, will be used for the group name
+and the name of the group data file.  The description can be omitted.
+
+An easy way to get started with @code{nnrss} is to say something like
+the following in the group buffer: @kbd{B nnrss RET RET y}, then
+subscribe to groups.
+
+The @code{nnrss} back end saves the group data file in
+@code{nnrss-directory} (see below) for each @code{nnrss} group.  File
+names containing non-@acronym{ASCII} characters will be encoded by the
+coding system specified with the @code{nnmail-pathname-coding-system}
+variable.  If it is @code{nil}, in Emacs the coding system defaults to
+the value of @code{default-file-name-coding-system}.  If you are using
+XEmacs and want to use non-@acronym{ASCII} group names, you should set
+the value for the @code{nnmail-pathname-coding-system} variable properly.
+
+The @code{nnrss} back end generates @samp{multipart/alternative}
+@acronym{MIME} articles in which each contains a @samp{text/plain} part
+and a @samp{text/html} part.
+
+@cindex OPML
+You can also use the following commands to import and export your
+subscriptions from a file in @acronym{OPML} format (Outline Processor
+Markup Language).
+
+@defun nnrss-opml-import file
+Prompt for an @acronym{OPML} file, and subscribe to each feed in the
+file.
+@end defun
+
+@defun nnrss-opml-export
+Write your current @acronym{RSS} subscriptions to a buffer in
+@acronym{OPML} format.
+@end defun
+
+The following @code{nnrss} variables can be altered:
+
+@table @code
+@item nnrss-directory
+@vindex nnrss-directory
+The directory where @code{nnrss} stores its files.  The default is
+@file{~/News/rss/}.
+
+@item nnrss-file-coding-system
+@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}
+in Emacs or @code{escape-quoted} in XEmacs).
+
+@item nnrss-use-local
+@vindex nnrss-use-local
+@findex nnrss-generate-download-script
+If you set @code{nnrss-use-local} to @code{t}, @code{nnrss} will read
+the feeds from local files in @code{nnrss-directory}.  You can use
+the command @code{nnrss-generate-download-script} to generate a
+download script using @command{wget}.
+
+@item nnrss-wash-html-in-text-plain-parts
+Non-@code{nil} means that @code{nnrss} renders text in @samp{text/plain}
+parts as @acronym{HTML}.  The function specified by the
+@code{mm-text-html-renderer} variable (@pxref{Display Customization,
+,Display Customization, emacs-mime, The Emacs MIME Manual}) will be used
+to render text.  If it is @code{nil}, which is the default, text will
+simply be folded.  Leave it @code{nil} if you prefer to see
+@samp{text/html} parts.
+@end table
+
+The following code may be helpful, if you want to show the description in
+the summary buffer.
+
+@lisp
+(add-to-list 'nnmail-extra-headers nnrss-description-field)
+(setq gnus-summary-line-format "%U%R%z%I%(%[%4L: %-15,15f%]%) %s%uX\n")
+
+(defun gnus-user-format-function-X (header)
+  (let ((descr
+         (assq nnrss-description-field (mail-header-extra header))))
+    (if descr (concat "\n\t" (cdr descr)) "")))
+@end lisp
+
+The following code may be useful to open an nnrss url directly from the
+summary buffer.
+
+@lisp
+(require 'browse-url)
+
+(defun browse-nnrss-url( arg )
+  (interactive "p")
+  (let ((url (assq nnrss-url-field
+                   (mail-header-extra
+                    (gnus-data-header
+                     (assq (gnus-summary-article-number)
+                           gnus-newsgroup-data))))))
+    (if url
+        (progn
+          (browse-url (cdr url))
+          (gnus-summary-mark-as-read-forward 1))
+      (gnus-summary-scroll-up arg))))
+
+(eval-after-load "gnus"
+  #'(define-key gnus-summary-mode-map
+      (kbd "<RET>") 'browse-nnrss-url))
+(add-to-list 'nnmail-extra-headers nnrss-url-field)
+@end lisp
+
+Even if you have added @code{"text/html"} to the
+@code{mm-discouraged-alternatives} variable (@pxref{Display
+Customization, ,Display Customization, emacs-mime, The Emacs MIME
+Manual}) since you don't want to see @acronym{HTML} parts, it might be
+more useful especially in @code{nnrss} groups to display
+@samp{text/html} parts.  Here's an example of setting
+@code{mm-discouraged-alternatives} as a group parameter (@pxref{Group
+Parameters}) in order to display @samp{text/html} parts only in
+@code{nnrss} groups:
+
+@lisp
+;; @r{Set the default value of @code{mm-discouraged-alternatives}.}
+(eval-after-load "gnus-sum"
+  '(add-to-list
+    'gnus-newsgroup-variables
+    '(mm-discouraged-alternatives
+      . '("text/html" "image/.*"))))
+
+;; @r{Display @samp{text/html} parts in @code{nnrss} groups.}
+(add-to-list
+ 'gnus-parameters
+ '("\\`nnrss:" (mm-discouraged-alternatives nil)))
+@end lisp
+
+
+@node Customizing W3
+@subsection Customizing W3
+@cindex W3
+@cindex html
+@cindex url
+@cindex Netscape
+
+Gnus uses the url library to fetch web pages and Emacs/W3 (or those
+alternatives) to display web pages.  Emacs/W3 is documented in its own
+manual, but there are some things that may be more relevant for Gnus
+users.
+
+For instance, a common question is how to make Emacs/W3 follow links
+using the @code{browse-url} functions (which will call some external web
+browser like Netscape).  Here's one way:
+
+@lisp
+(eval-after-load "w3"
+  '(progn
+    (fset 'w3-fetch-orig (symbol-function 'w3-fetch))
+    (defun w3-fetch (&optional url target)
+      (interactive (list (w3-read-url-with-default)))
+      (if (eq major-mode 'gnus-article-mode)
+          (browse-url url)
+        (w3-fetch-orig url target)))))
+@end lisp
+
+Put that in your @file{.emacs} file, and hitting links in W3-rendered
+@acronym{HTML} in the Gnus article buffers will use @code{browse-url} to
+follow the link.
+
+
+@node IMAP
+@section IMAP
+@cindex nnimap
+@cindex @acronym{IMAP}
+
+@acronym{IMAP} is a network protocol for reading mail (or news, or @dots{}),
+think of it as a modernized @acronym{NNTP}.  Connecting to a @acronym{IMAP}
+server is much similar to connecting to a news server, you just
+specify the network address of the server.
+
+@acronym{IMAP} has two properties.  First, @acronym{IMAP} can do
+everything that @acronym{POP} can, it can hence be viewed as a
+@acronym{POP++}.  Secondly, @acronym{IMAP} is a mail storage protocol,
+similar to @acronym{NNTP} being a news storage protocol---however,
+@acronym{IMAP} offers more features than @acronym{NNTP} because news
+is more or less read-only whereas mail is read-write.
+
+If you want to use @acronym{IMAP} as a @acronym{POP++}, use an imap
+entry in @code{mail-sources}.  With this, Gnus will fetch mails from
+the @acronym{IMAP} server and store them on the local disk.  This is
+not the usage described in this section---@xref{Mail Sources}.
+
+If you want to use @acronym{IMAP} as a mail storage protocol, use an nnimap
+entry in @code{gnus-secondary-select-methods}.  With this, Gnus will
+manipulate mails stored on the @acronym{IMAP} server.  This is the kind of
+usage explained in this section.
+
+A server configuration in @file{~/.gnus.el} with a few @acronym{IMAP}
+servers might look something like the following.  (Note that for
+@acronym{TLS}/@acronym{SSL}, you need external programs and libraries,
+see below.)
+
+@lisp
+(setq gnus-secondary-select-methods
+      '((nnimap "simpleserver") ; @r{no special configuration}
+        ; @r{perhaps a ssh port forwarded server:}
+        (nnimap "dolk"
+                (nnimap-address "localhost")
+                (nnimap-server-port 1430))
+        ; @r{a UW server running on localhost}
+        (nnimap "barbar"
+                (nnimap-server-port 143)
+                (nnimap-address "localhost")
+                (nnimap-list-pattern ("INBOX" "mail/*")))
+        ; @r{anonymous public cyrus server:}
+        (nnimap "cyrus.andrew.cmu.edu"
+                (nnimap-authenticator anonymous)
+                (nnimap-list-pattern "archive.*")
+                (nnimap-stream network))
+        ; @r{a ssl server on a non-standard port:}
+        (nnimap "vic20"
+                (nnimap-address "vic20.somewhere.com")
+                (nnimap-server-port 9930)
+                (nnimap-stream ssl))))
+@end lisp
+
+After defining the new server, you can subscribe to groups on the
+server using normal Gnus commands such as @kbd{U} in the Group Buffer
+(@pxref{Subscription Commands}) or via the Server Buffer
+(@pxref{Server Buffer}).
+
+The following variables can be used to create a virtual @code{nnimap}
+server:
+
+@table @code
+
+@item nnimap-address
+@vindex nnimap-address
+
+The address of the remote @acronym{IMAP} server.  Defaults to the virtual
+server name if not specified.
+
+@item nnimap-server-port
+@vindex nnimap-server-port
+Port on server to contact.  Defaults to port 143, or 993 for @acronym{TLS}/@acronym{SSL}.
+
+Note that this should be an integer, example server specification:
+
+@lisp
+(nnimap "mail.server.com"
+        (nnimap-server-port 4711))
+@end lisp
+
+@item nnimap-list-pattern
+@vindex nnimap-list-pattern
+String or list of strings of mailboxes to limit available groups to.
+This is used when the server has very many mailboxes and you're only
+interested in a few---some servers export your home directory via
+@acronym{IMAP}, you'll probably want to limit the mailboxes to those in
+@file{~/Mail/*} then.
+
+The string can also be a cons of REFERENCE and the string as above, what
+REFERENCE is used for is server specific, but on the University of
+Washington server it's a directory that will be concatenated with the
+mailbox.
+
+Example server specification:
+
+@lisp
+(nnimap "mail.server.com"
+        (nnimap-list-pattern ("INBOX" "Mail/*" "alt.sex.*"
+                               ("~friend/Mail/" . "list/*"))))
+@end lisp
+
+@item nnimap-stream
+@vindex nnimap-stream
+The type of stream used to connect to your server.  By default, nnimap
+will detect and automatically use all of the below, with the exception
+of @acronym{TLS}/@acronym{SSL}.  (@acronym{IMAP} over
+@acronym{TLS}/@acronym{SSL} is being replaced by STARTTLS, which can
+be automatically detected, but it's not widely deployed yet.)
+
+Example server specification:
+
+@lisp
+(nnimap "mail.server.com"
+        (nnimap-stream ssl))
+@end lisp
+
+Please note that the value of @code{nnimap-stream} is a symbol!
+
+@itemize @bullet
+@item
+@dfn{gssapi:} Connect with GSSAPI (usually Kerberos 5).  Requires the
+@samp{gsasl} or @samp{imtest} program.
+@item
+@dfn{kerberos4:} Connect with Kerberos 4.  Requires the @samp{imtest} program.
+@item
+@dfn{starttls:} Connect via the STARTTLS extension (similar to
+@acronym{TLS}/@acronym{SSL}).  Requires the external library @samp{starttls.el} and program
+@samp{starttls}.
+@item
+@dfn{tls:} Connect through @acronym{TLS}.  Requires GNUTLS (the program
+@samp{gnutls-cli}).
+@item
+@dfn{ssl:} Connect through @acronym{SSL}.  Requires OpenSSL (the program
+@samp{openssl}) or SSLeay (@samp{s_client}).
+@item
+@dfn{shell:} Use a shell command to start @acronym{IMAP} connection.
+@item
+@dfn{network:} Plain, TCP/IP network connection.
+@end itemize
+
+@vindex imap-kerberos4-program
+The @samp{imtest} program is shipped with Cyrus IMAPD.  If you're
+using @samp{imtest} from Cyrus IMAPD < 2.0.14 (which includes version
+1.5.x and 1.6.x) you need to frob @code{imap-process-connection-type}
+to make @code{imap.el} use a pty instead of a pipe when communicating
+with @samp{imtest}.  You will then suffer from a line length
+restrictions on @acronym{IMAP} commands, which might make Gnus seem to hang
+indefinitely if you have many articles in a mailbox.  The variable
+@code{imap-kerberos4-program} contain parameters to pass to the imtest
+program.
+
+For @acronym{TLS} connection, the @code{gnutls-cli} program from GNUTLS is
+needed.  It is available from
+@uref{http://www.gnu.org/software/gnutls/}.
+
+@vindex imap-gssapi-program
+This parameter specifies a list of command lines that invoke a GSSAPI
+authenticated @acronym{IMAP} stream in a subshell.  They are tried
+sequentially until a connection is made, or the list has been
+exhausted.  By default, @samp{gsasl} from GNU SASL, available from
+@uref{http://www.gnu.org/software/gsasl/}, and the @samp{imtest}
+program from Cyrus IMAPD (see @code{imap-kerberos4-program}), are
+tried.
+
+@vindex imap-ssl-program
+For @acronym{SSL} connections, the OpenSSL program is available from
+@uref{http://www.openssl.org/}.  OpenSSL was formerly known as SSLeay,
+and nnimap support it too---although the most recent versions of
+SSLeay, 0.9.x, are known to have serious bugs making it
+useless.  Earlier versions, especially 0.8.x, of SSLeay are known to
+work.  The variable @code{imap-ssl-program} contain parameters to pass
+to OpenSSL/SSLeay.
+
+@vindex imap-shell-program
+@vindex imap-shell-host
+For @acronym{IMAP} connections using the @code{shell} stream, the variable
+@code{imap-shell-program} specify what program to call.
+
+@item nnimap-authenticator
+@vindex nnimap-authenticator
+
+The authenticator used to connect to the server.  By default, nnimap
+will use the most secure authenticator your server is capable of.
+
+Example server specification:
+
+@lisp
+(nnimap "mail.server.com"
+        (nnimap-authenticator anonymous))
+@end lisp
+
+Please note that the value of @code{nnimap-authenticator} is a symbol!
+
+@itemize @bullet
+@item
+@dfn{gssapi:} GSSAPI (usually kerberos 5) authentication.  Requires
+external program @code{gsasl} or @code{imtest}.
+@item
+@dfn{kerberos4:} Kerberos 4 authentication.  Requires external program
+@code{imtest}.
+@item
+@dfn{digest-md5:} Encrypted username/password via DIGEST-MD5.  Requires
+external library @code{digest-md5.el}.
+@item
+@dfn{cram-md5:} Encrypted username/password via CRAM-MD5.
+@item
+@dfn{login:} Plain-text username/password via LOGIN.
+@item
+@dfn{anonymous:} Login as ``anonymous'', supplying your email address as password.
+@end itemize
+
+@item nnimap-expunge-on-close
+@cindex expunging
+@vindex nnimap-expunge-on-close
+Unlike Parmenides the @acronym{IMAP} designers have decided things that
+don't exist actually do exist.  More specifically, @acronym{IMAP} has
+this concept of marking articles @code{Deleted} which doesn't actually
+delete them, and this (marking them @code{Deleted}, that is) is what
+nnimap does when you delete an article in Gnus (with @kbd{B DEL} or
+similar).
+
+Since the articles aren't really removed when we mark them with the
+@code{Deleted} flag we'll need a way to actually delete them.  Feel like
+running in circles yet?
+
+Traditionally, nnimap has removed all articles marked as @code{Deleted}
+when closing a mailbox but this is now configurable by this server
+variable.
+
+The possible options are:
+
+@table @code
+
+@item always
+The default behavior, delete all articles marked as ``Deleted'' when
+closing a mailbox.
+@item never
+Never actually delete articles.  Currently there is no way of showing
+the articles marked for deletion in nnimap, but other @acronym{IMAP} clients
+may allow you to do this.  If you ever want to run the EXPUNGE command
+manually, @xref{Expunging mailboxes}.
+@item ask
+When closing mailboxes, nnimap will ask if you wish to expunge deleted
+articles or not.
+
+@end table
+
+@item nnimap-importantize-dormant
+@vindex nnimap-importantize-dormant
+
+If non-@code{nil} (the default), marks dormant articles as ticked (as
+well), for other @acronym{IMAP} clients.  Within Gnus, dormant articles will
+naturally still (only) be marked as dormant.  This is to make dormant
+articles stand out, just like ticked articles, in other @acronym{IMAP}
+clients.  (In other words, Gnus has two ``Tick'' marks and @acronym{IMAP}
+has only one.)
+
+Probably the only reason for frobbing this would be if you're trying
+enable per-user persistent dormant flags, using something like:
+
+@lisp
+(setcdr (assq 'dormant nnimap-mark-to-flag-alist)
+        (format "gnus-dormant-%s" (user-login-name)))
+(setcdr (assq 'dormant nnimap-mark-to-predicate-alist)
+        (format "KEYWORD gnus-dormant-%s" (user-login-name)))
+@end lisp
+
+In this case, you would not want the per-user dormant flag showing up
+as ticked for other users.
+
+@item nnimap-expunge-search-string
+@cindex expunging
+@vindex nnimap-expunge-search-string
+@cindex expiring @acronym{IMAP} mail
+
+This variable contain the @acronym{IMAP} search command sent to server when
+searching for articles eligible for expiring.  The default is
+@code{"UID %s NOT SINCE %s"}, where the first @code{%s} is replaced by
+UID set and the second @code{%s} is replaced by a date.
+
+Probably the only useful value to change this to is
+@code{"UID %s NOT SENTSINCE %s"}, which makes nnimap use the Date: in
+messages instead of the internal article date.  See section 6.4.4 of
+RFC 2060 for more information on valid strings.
+
+However, if @code{nnimap-search-uids-not-since-is-evil}
+is true, this variable has no effect since the search logic
+is reversed, as described below.
+
+@item nnimap-authinfo-file
+@vindex nnimap-authinfo-file
+
+A file containing credentials used to log in on servers.  The format is
+(almost) the same as the @code{ftp} @file{~/.netrc} file.  See the
+variable @code{nntp-authinfo-file} for exact syntax; also see
+@ref{NNTP}.  An example of an .authinfo line for an IMAP server, is:
+
+@example
+machine students.uio.no login larsi password geheimnis port imap
+@end example
+
+Note that it should be @code{port imap}, or @code{port 143}, if you
+use a @code{nnimap-stream} of @code{tls} or @code{ssl}, even if the
+actual port number used is port 993 for secured IMAP.  For
+convenience, Gnus will accept @code{port imaps} as a synonym of
+@code{port imap}.
+
+@item nnimap-need-unselect-to-notice-new-mail
+@vindex nnimap-need-unselect-to-notice-new-mail
+
+Unselect mailboxes before looking for new mail in them.  Some servers
+seem to need this under some circumstances; it was reported that
+Courier 1.7.1 did.
+
+@item nnimap-nov-is-evil
+@vindex nnimap-nov-is-evil
+@cindex Courier @acronym{IMAP} server
+@cindex @acronym{NOV}
+
+Never generate or use a local @acronym{NOV} database. Defaults to the
+value of @code{gnus-agent}.
+
+Using a @acronym{NOV} database usually makes header fetching much
+faster, but it uses the @code{UID SEARCH UID} command, which is very
+slow on some servers (notably some versions of Courier). Since the Gnus
+Agent caches the information in the @acronym{NOV} database without using
+the slow command, this variable defaults to true if the Agent is in use,
+and false otherwise.
+
+@item nnimap-search-uids-not-since-is-evil
+@vindex nnimap-search-uids-not-since-is-evil
+@cindex Courier @acronym{IMAP} server
+@cindex expiring @acronym{IMAP} mail
+
+Avoid the @code{UID SEARCH UID @var{message numbers} NOT SINCE
+@var{date}} command, which is slow on some @acronym{IMAP} servers
+(notably, some versions of Courier). Instead, use @code{UID SEARCH SINCE
+@var{date}} and prune the list of expirable articles within Gnus.
+
+When Gnus expires your mail (@pxref{Expiring Mail}), it starts with a
+list of expirable articles and asks the IMAP server questions like ``Of
+these articles, which ones are older than a week?'' While this seems
+like a perfectly reasonable question, some IMAP servers take a long time
+to answer it, since they seemingly go looking into every old article to
+see if it is one of the expirable ones. Curiously, the question ``Of
+@emph{all} articles, which ones are newer than a week?'' seems to be
+much faster to answer, so setting this variable causes Gnus to ask this
+question and figure out the answer to the real question itself.
+
+This problem can really sneak up on you: when you first configure Gnus,
+everything works fine, but once you accumulate a couple thousand
+messages, you start cursing Gnus for being so slow. On the other hand,
+if you get a lot of email within a week, setting this variable will
+cause a lot of network traffic between Gnus and the IMAP server.
+
+@end table
+
+@menu
+* Splitting in IMAP::           Splitting mail with nnimap.
+* Expiring in IMAP::            Expiring mail with nnimap.
+* Editing IMAP ACLs::           Limiting/enabling other users access to a mailbox.
+* Expunging mailboxes::         Equivalent of a ``compress mailbox'' button.
+* A note on namespaces::        How to (not) use @acronym{IMAP} namespace in Gnus.
+* Debugging IMAP::              What to do when things don't work.
+@end menu
+
+
+
+@node Splitting in IMAP
+@subsection Splitting in IMAP
+@cindex splitting imap mail
+
+Splitting is something Gnus users have loved and used for years, and now
+the rest of the world is catching up.  Yeah, dream on, not many
+@acronym{IMAP} servers have server side splitting and those that have
+splitting seem to use some non-standard protocol.  This means that
+@acronym{IMAP} support for Gnus has to do its own splitting.
+
+And it does.
+
+(Incidentally, people seem to have been dreaming on, and Sieve has
+gaining a market share and is supported by several IMAP servers.
+Fortunately, Gnus support it too, @xref{Sieve Commands}.)
+
+Here are the variables of interest:
+
+@table @code
+
+@item nnimap-split-crosspost
+@cindex splitting, crosspost
+@cindex crosspost
+@vindex nnimap-split-crosspost
+
+If non-@code{nil}, do crossposting if several split methods match the
+mail.  If @code{nil}, the first match in @code{nnimap-split-rule}
+found will be used.
+
+Nnmail equivalent: @code{nnmail-crosspost}.
+
+@item nnimap-split-inbox
+@cindex splitting, inbox
+@cindex inbox
+@vindex nnimap-split-inbox
+
+A string or a list of strings that gives the name(s) of @acronym{IMAP}
+mailboxes to split from.  Defaults to @code{nil}, which means that
+splitting is disabled!
+
+@lisp
+(setq nnimap-split-inbox
+      '("INBOX" ("~/friend/Mail" . "lists/*") "lists.imap"))
+@end lisp
+
+No nnmail equivalent.
+
+@item nnimap-split-rule
+@cindex splitting, rules
+@vindex nnimap-split-rule
+
+New mail found in @code{nnimap-split-inbox} will be split according to
+this variable.
+
+This variable contains a list of lists, where the first element in the
+sublist gives the name of the @acronym{IMAP} mailbox to move articles
+matching the regexp in the second element in the sublist.  Got that?
+Neither did I, we need examples.
+
+@lisp
+(setq nnimap-split-rule
+      '(("INBOX.nnimap"
+         "^Sender: owner-nnimap@@vic20.globalcom.se")
+        ("INBOX.junk"    "^Subject:.*MAKE MONEY")
+        ("INBOX.private" "")))
+@end lisp
+
+This will put all articles from the nnimap mailing list into mailbox
+INBOX.nnimap, all articles containing MAKE MONEY in the Subject: line
+into INBOX.junk and everything else in INBOX.private.
+
+The first string may contain @samp{\\1} forms, like the ones used by
+replace-match to insert sub-expressions from the matched text.  For
+instance:
+
+@lisp
+("INBOX.lists.\\1"     "^Sender: owner-\\([a-z-]+\\)@@")
+@end lisp
+
+The first element can also be the symbol @code{junk} to indicate that
+matching messages should simply be deleted.  Use with care.
+
+The second element can also be a function.  In that case, it will be
+called with the first element of the rule as the argument, in a buffer
+containing the headers of the article.  It should return a
+non-@code{nil} value if it thinks that the mail belongs in that group.
+
+Nnmail users might recollect that the last regexp had to be empty to
+match all articles (like in the example above).  This is not required in
+nnimap.  Articles not matching any of the regexps will not be moved out
+of your inbox.  (This might affect performance if you keep lots of
+unread articles in your inbox, since the splitting code would go over
+them every time you fetch new mail.)
+
+These rules are processed from the beginning of the alist toward the
+end.  The first rule to make a match will ``win'', unless you have
+crossposting enabled.  In that case, all matching rules will ``win''.
+
+This variable can also have a function as its value, the function will
+be called with the headers narrowed and should return a group where it
+thinks the article should be split to.  See @code{nnimap-split-fancy}.
+
+The splitting code tries to create mailboxes if it needs to.
+
+To allow for different split rules on different virtual servers, and
+even different split rules in different inboxes on the same server,
+the syntax of this variable have been extended along the lines of:
+
+@lisp
+(setq nnimap-split-rule
+      '(("my1server"    (".*" (("ding"    "ding@@gnus.org")
+                               ("junk"    "From:.*Simon"))))
+        ("my2server"    ("INBOX" nnimap-split-fancy))
+        ("my[34]server" (".*" (("private" "To:.*Simon")
+                               ("junk"    my-junk-func))))))
+@end lisp
+
+The virtual server name is in fact a regexp, so that the same rules
+may apply to several servers.  In the example, the servers
+@code{my3server} and @code{my4server} both use the same rules.
+Similarly, the inbox string is also a regexp.  The actual splitting
+rules are as before, either a function, or a list with group/regexp or
+group/function elements.
+
+Nnmail equivalent: @code{nnmail-split-methods}.
+
+@item nnimap-split-predicate
+@cindex splitting
+@vindex nnimap-split-predicate
+
+Mail matching this predicate in @code{nnimap-split-inbox} will be
+split, it is a string and the default is @samp{UNSEEN UNDELETED}.
+
+This might be useful if you use another @acronym{IMAP} client to read mail in
+your inbox but would like Gnus to split all articles in the inbox
+regardless of readedness.  Then you might change this to
+@samp{UNDELETED}.
+
+@item nnimap-split-fancy
+@cindex splitting, fancy
+@findex nnimap-split-fancy
+@vindex nnimap-split-fancy
+
+It's possible to set @code{nnimap-split-rule} to
+@code{nnmail-split-fancy} if you want to use fancy
+splitting.  @xref{Fancy Mail Splitting}.
+
+However, to be able to have different fancy split rules for nnmail and
+nnimap back ends you can set @code{nnimap-split-rule} to
+@code{nnimap-split-fancy} and define the nnimap specific fancy split
+rule in @code{nnimap-split-fancy}.
+
+Example:
+
+@lisp
+(setq nnimap-split-rule 'nnimap-split-fancy
+      nnimap-split-fancy ...)
+@end lisp
+
+Nnmail equivalent: @code{nnmail-split-fancy}.
+
+@item nnimap-split-download-body
+@findex nnimap-split-download-body
+@vindex nnimap-split-download-body
+
+Set to non-@code{nil} to download entire articles during splitting.
+This is generally not required, and will slow things down
+considerably.  You may need it if you want to use an advanced
+splitting function that analyzes the body to split the article.
+
+@end table
+
+@node Expiring in IMAP
+@subsection Expiring in IMAP
+@cindex expiring @acronym{IMAP} mail
+
+Even though @code{nnimap} is not a proper @code{nnmail} derived back
+end, it supports most features in regular expiring (@pxref{Expiring
+Mail}).  Unlike splitting in @acronym{IMAP} (@pxref{Splitting in
+IMAP}) it does not clone the @code{nnmail} variables (i.e., creating
+@var{nnimap-expiry-wait}) but reuse the @code{nnmail} variables.  What
+follows below are the variables used by the @code{nnimap} expiry
+process.
+
+A note on how the expire mark is stored on the @acronym{IMAP} server is
+appropriate here as well.  The expire mark is translated into a
+@code{imap} client specific mark, @code{gnus-expire}, and stored on the
+message.  This means that likely only Gnus will understand and treat
+the @code{gnus-expire} mark properly, although other clients may allow
+you to view client specific flags on the message.  It also means that
+your server must support permanent storage of client specific flags on
+messages.  Most do, fortunately.
+
+If expiring @acronym{IMAP} mail seems very slow, try setting the server
+variable @code{nnimap-search-uids-not-since-is-evil}.
+
+@table @code
+
+@item nnmail-expiry-wait
+@item nnmail-expiry-wait-function
+
+These variables are fully supported.  The expire value can be a
+number, the symbol @code{immediate} or @code{never}.
+
+@item nnmail-expiry-target
+
+This variable is supported, and internally implemented by calling the
+@code{nnmail} functions that handle this.  It contains an optimization
+that if the destination is a @acronym{IMAP} group on the same server, the
+article is copied instead of appended (that is, uploaded again).
+
+@end table
+
+@node Editing IMAP ACLs
+@subsection Editing IMAP ACLs
+@cindex editing imap acls
+@cindex Access Control Lists
+@cindex Editing @acronym{IMAP} ACLs
+@kindex G l (Group)
+@findex gnus-group-nnimap-edit-acl
+
+ACL stands for Access Control List.  ACLs are used in @acronym{IMAP} for
+limiting (or enabling) other users access to your mail boxes.  Not all
+@acronym{IMAP} servers support this, this function will give an error if it
+doesn't.
+
+To edit an ACL for a mailbox, type @kbd{G l}
+(@code{gnus-group-edit-nnimap-acl}) and you'll be presented with an ACL
+editing window with detailed instructions.
+
+Some possible uses:
+
+@itemize @bullet
+@item
+Giving ``anyone'' the ``lrs'' rights (lookup, read, keep seen/unseen flags)
+on your mailing list mailboxes enables other users on the same server to
+follow the list without subscribing to it.
+@item
+At least with the Cyrus server, you are required to give the user
+``anyone'' posting ("p") capabilities to have ``plussing'' work (that is,
+mail sent to user+mailbox@@domain ending up in the @acronym{IMAP} mailbox
+INBOX.mailbox).
+@end itemize
+
+@node Expunging mailboxes
+@subsection Expunging mailboxes
+@cindex expunging
+
+@cindex expunge
+@cindex manual expunging
+@kindex G x (Group)
+@findex gnus-group-nnimap-expunge
+
+If you're using the @code{never} setting of @code{nnimap-expunge-on-close},
+you may want the option of expunging all deleted articles in a mailbox
+manually.  This is exactly what @kbd{G x} does.
+
+Currently there is no way of showing deleted articles, you can just
+delete them.
+
+@node A note on namespaces
+@subsection A note on namespaces
+@cindex IMAP namespace
+@cindex namespaces
+
+The @acronym{IMAP} protocol has a concept called namespaces, described
+by the following text in the RFC2060:
+
+@display
+5.1.2.  Mailbox Namespace Naming Convention
+
+   By convention, the first hierarchical element of any mailbox name
+   which begins with "#" identifies the "namespace" of the remainder of
+   the name.  This makes it possible to disambiguate between different
+   types of mailbox stores, each of which have their own namespaces.
+
+      For example, implementations which offer access to USENET
+      newsgroups MAY use the "#news" namespace to partition the USENET
+      newsgroup namespace from that of other mailboxes.  Thus, the
+      comp.mail.misc newsgroup would have an mailbox name of
+      "#news.comp.mail.misc", and the name "comp.mail.misc" could refer
+      to a different object (e.g. a user's private mailbox).
+@end display
+
+While there is nothing in this text that warrants concern for the
+@acronym{IMAP} implementation in Gnus, some servers use namespace
+prefixes in a way that does not work with how Gnus uses mailbox names.
+
+Specifically, University of Washington's @acronym{IMAP} server uses
+mailbox names like @code{#driver.mbx/read-mail} which are valid only
+in the @sc{create} and @sc{append} commands.  After the mailbox is
+created (or a messages is appended to a mailbox), it must be accessed
+without the namespace prefix, i.e. @code{read-mail}.  Since Gnus do
+not make it possible for the user to guarantee that user entered
+mailbox names will only be used with the CREATE and APPEND commands,
+you should simply not use the namespace prefixed mailbox names in
+Gnus.
+
+See the UoW IMAPD documentation for the @code{#driver.*/} prefix
+for more information on how to use the prefixes.  They are a power
+tool and should be used only if you are sure what the effects are.
+
+@node Debugging IMAP
+@subsection Debugging IMAP
+@cindex IMAP debugging
+@cindex protocol dump (IMAP)
+
+@acronym{IMAP} is a complex protocol, more so than @acronym{NNTP} or
+@acronym{POP3}.  Implementation bugs are not unlikely, and we do our
+best to fix them right away.  If you encounter odd behavior, chances
+are that either the server or Gnus is buggy.
+
+If you are familiar with network protocols in general, you will
+probably be able to extract some clues from the protocol dump of the
+exchanges between Gnus and the server.  Even if you are not familiar
+with network protocols, when you include the protocol dump in
+@acronym{IMAP}-related bug reports you are helping us with data
+critical to solving the problem.  Therefore, we strongly encourage you
+to include the protocol dump when reporting IMAP bugs in Gnus.
+
+
+@vindex imap-log
+Because the protocol dump, when enabled, generates lots of data, it is
+disabled by default.  You can enable it by setting @code{imap-log} as
+follows:
+
+@lisp
+(setq imap-log t)
+@end lisp
+
+This instructs the @code{imap.el} package to log any exchanges with
+the server.  The log is stored in the buffer @samp{*imap-log*}.  Look
+for error messages, which sometimes are tagged with the keyword
+@code{BAD}---but when submitting a bug, make sure to include all the
+data.
+
+@node Other Sources
+@section Other Sources
+
+Gnus can do more than just read news or mail.  The methods described
+below allow Gnus to view directories and files as if they were
+newsgroups.
+
+@menu
+* Directory Groups::            You can read a directory as if it was a newsgroup.
+* Anything Groups::             Dired?  Who needs dired?
+* Document Groups::             Single files can be the basis of a group.
+* SOUP::                        Reading @sc{soup} packets ``offline''.
+* Mail-To-News Gateways::       Posting articles via mail-to-news gateways.
+@end menu
+
+
+@node Directory Groups
+@subsection Directory Groups
+@cindex nndir
+@cindex directory groups
+
+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.
+
+@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{nndir} will use @acronym{NOV} files if they are present.
+
+@code{nndir} is a ``read-only'' back end---you can't delete or expire
+articles with this method.  You can use @code{nnmh} or @code{nnml} for
+whatever you use @code{nndir} for, so you could switch to any of those
+methods if you feel the need to have a non-read-only @code{nndir}.
+
+
+@node Anything Groups
+@subsection Anything Groups
+@cindex nneething
+
+From the @code{nndir} back end (which reads a single spool-like
+directory), it's just a hop and a skip to @code{nneething}, which
+pretends that any arbitrary directory is a newsgroup.  Strange, but
+true.
+
+When @code{nneething} is presented with a directory, it will scan this
+directory and assign article numbers to each file.  When you enter such
+a group, @code{nneething} must create ``headers'' that Gnus can use.
+After all, Gnus is a newsreader, in case you're forgetting.
+@code{nneething} does this in a two-step process.  First, it snoops each
+file in question.  If the file looks like an article (i.e., the first
+few lines look like headers), it will use this as the head.  If this is
+just some arbitrary file without a head (e.g. a C source file),
+@code{nneething} will cobble up a header out of thin air.  It will use
+file ownership, name and date and do whatever it can with these
+elements.
+
+All this should happen automatically for you, and you will be presented
+with something that looks very much like a newsgroup.  Totally like a
+newsgroup, to be precise.  If you select an article, it will be displayed
+in the article buffer, just as usual.
+
+If you select a line that represents a directory, Gnus will pop you into
+a new summary buffer for this @code{nneething} group.  And so on.  You can
+traverse the entire disk this way, if you feel like, but remember that
+Gnus is not dired, really, and does not intend to be, either.
+
+There are two overall modes to this action---ephemeral or solid.  When
+doing the ephemeral thing (i.e., @kbd{G D} from the group buffer), Gnus
+will not store information on what files you have read, and what files
+are new, and so on.  If you create a solid @code{nneething} group the
+normal way with @kbd{G m}, Gnus will store a mapping table between
+article numbers and file names, and you can treat this group like any
+other groups.  When you activate a solid @code{nneething} group, you will
+be told how many unread articles it contains, etc., etc.
+
+Some variables:
+
+@table @code
+@item nneething-map-file-directory
+@vindex nneething-map-file-directory
+All the mapping files for solid @code{nneething} groups will be stored
+in this directory, which defaults to @file{~/.nneething/}.
+
+@item nneething-exclude-files
+@vindex nneething-exclude-files
+All files that match this regexp will be ignored.  Nice to use to exclude
+auto-save files and the like, which is what it does by default.
+
+@item nneething-include-files
+@vindex nneething-include-files
+Regexp saying what files to include in the group.  If this variable is
+non-@code{nil}, only files matching this regexp will be included.
+
+@item nneething-map-file
+@vindex nneething-map-file
+Name of the map files.
+@end table
+
+
+@node Document Groups
+@subsection Document Groups
+@cindex nndoc
+@cindex documentation group
+@cindex help group
+
+@code{nndoc} is a cute little thing that will let you read a single file
+as a newsgroup.  Several files types are supported:
+
+@table @code
+@cindex Babyl
+@cindex Rmail mbox
+@item babyl
+The Babyl (Rmail) mail box.
+
+@cindex mbox
+@cindex Unix mbox
+@item mbox
+The standard Unix mbox file.
+
+@cindex MMDF mail box
+@item mmdf
+The MMDF mail box format.
+
+@item news
+Several news articles appended into a file.
+
+@cindex rnews batch files
+@item rnews
+The rnews batch transport format.
+
+@item nsmail
+Netscape mail boxes.
+
+@item mime-parts
+@acronym{MIME} multipart messages.
+
+@item standard-digest
+The standard (RFC 1153) digest format.
+
+@item mime-digest
+A @acronym{MIME} digest of messages.
+
+@item lanl-gov-announce
+Announcement messages from LANL Gov Announce.
+
+@cindex forwarded messages
+@item rfc822-forward
+A message forwarded according to RFC822.
+
+@item outlook
+The Outlook mail box.
+
+@item oe-dbx
+The Outlook Express dbx mail box.
+
+@item exim-bounce
+A bounce message from the Exim MTA.
+
+@item forward
+A message forwarded according to informal rules.
+
+@item rfc934
+An RFC934-forwarded message.
+
+@item mailman
+A mailman digest.
+
+@item clari-briefs
+A digest of Clarinet brief news items.
+
+@item slack-digest
+Non-standard digest format---matches most things, but does it badly.
+
+@item mail-in-mail
+The last resort.
+@end table
+
+You can also use the special ``file type'' @code{guess}, which means
+that @code{nndoc} will try to guess what file type it is looking at.
+@code{digest} means that @code{nndoc} should guess what digest type the
+file is.
+
+@code{nndoc} will not try to change the file or insert any extra headers into
+it---it will simply, like, let you use the file as the basis for a
+group.  And that's it.
+
+If you have some old archived articles that you want to insert into your
+new & spiffy Gnus mail back end, @code{nndoc} can probably help you with
+that.  Say you have an old @file{RMAIL} file with mail that you now want
+to split into your new @code{nnml} groups.  You look at that file using
+@code{nndoc} (using the @kbd{G f} command in the group buffer
+(@pxref{Foreign Groups})), set the process mark on all the articles in
+the buffer (@kbd{M P b}, for instance), and then re-spool (@kbd{B r})
+using @code{nnml}.  If all goes well, all the mail in the @file{RMAIL}
+file is now also stored in lots of @code{nnml} directories, and you can
+delete that pesky @file{RMAIL} file.  If you have the guts!
+
+Virtual server variables:
+
+@table @code
+@item nndoc-article-type
+@vindex nndoc-article-type
+This should be one of @code{mbox}, @code{babyl}, @code{digest},
+@code{news}, @code{rnews}, @code{mmdf}, @code{forward}, @code{rfc934},
+@code{rfc822-forward}, @code{mime-parts}, @code{standard-digest},
+@code{slack-digest}, @code{clari-briefs}, @code{nsmail}, @code{outlook},
+@code{oe-dbx}, @code{mailman}, and @code{mail-in-mail} or @code{guess}.
+
+@item nndoc-post-type
+@vindex nndoc-post-type
+This variable says whether Gnus is to consider the group a news group or
+a mail group.  There are two valid values:  @code{mail} (the default)
+and @code{news}.
+@end table
+
+@menu
+* Document Server Internals::   How to add your own document types.
+@end menu
+
+
+@node Document Server Internals
+@subsubsection Document Server Internals
+
+Adding new document types to be recognized by @code{nndoc} isn't
+difficult.  You just have to whip up a definition of what the document
+looks like, write a predicate function to recognize that document type,
+and then hook into @code{nndoc}.
+
+First, here's an example document type definition:
+
+@example
+(mmdf
+ (article-begin .  "^\^A\^A\^A\^A\n")
+ (body-end .  "^\^A\^A\^A\^A\n"))
+@end example
+
+The definition is simply a unique @dfn{name} followed by a series of
+regexp pseudo-variable settings.  Below are the possible
+variables---don't be daunted by the number of variables; most document
+types can be defined with very few settings:
+
+@table @code
+@item first-article
+If present, @code{nndoc} will skip past all text until it finds
+something that match this regexp.  All text before this will be
+totally ignored.
+
+@item article-begin
+This setting has to be present in all document type definitions.  It
+says what the beginning of each article looks like.  To do more
+complicated things that cannot be dealt with a simple regexp, you can
+use @code{article-begin-function} instead of this.
+
+@item article-begin-function
+If present, this should be a function that moves point to the beginning
+of each article.  This setting overrides @code{article-begin}.
+
+@item head-begin
+If present, this should be a regexp that matches the head of the
+article.  To do more complicated things that cannot be dealt with a
+simple regexp, you can use @code{head-begin-function} instead of this.
+
+@item head-begin-function
+If present, this should be a function that moves point to the head of
+the article.  This setting overrides @code{head-begin}.
+
+@item head-end
+This should match the end of the head of the article.  It defaults to
+@samp{^$}---the empty line.
+
+@item body-begin
+This should match the beginning of the body of the article.  It defaults
+to @samp{^\n}.  To do more complicated things that cannot be dealt with
+a simple regexp, you can use @code{body-begin-function} instead of this.
+
+@item body-begin-function
+If present, this function should move point to the beginning of the body
+of the article.  This setting overrides @code{body-begin}.
+
+@item body-end
+If present, this should match the end of the body of the article.  To do
+more complicated things that cannot be dealt with a simple regexp, you
+can use @code{body-end-function} instead of this.
+
+@item body-end-function
+If present, this function should move point to the end of the body of
+the article.  This setting overrides @code{body-end}.
+
+@item file-begin
+If present, this should match the beginning of the file.  All text
+before this regexp will be totally ignored.
+
+@item file-end
+If present, this should match the end of the file.  All text after this
+regexp will be totally ignored.
+
+@end table
+
+So, using these variables @code{nndoc} is able to dissect a document
+file into a series of articles, each with a head and a body.  However, a
+few more variables are needed since not all document types are all that
+news-like---variables needed to transform the head or the body into
+something that's palatable for Gnus:
+
+@table @code
+@item prepare-body-function
+If present, this function will be called when requesting an article.  It
+will be called with point at the start of the body, and is useful if the
+document has encoded some parts of its contents.
+
+@item article-transform-function
+If present, this function is called when requesting an article.  It's
+meant to be used for more wide-ranging transformation of both head and
+body of the article.
+
+@item generate-head-function
+If present, this function is called to generate a head that Gnus can
+understand.  It is called with the article number as a parameter, and is
+expected to generate a nice head for the article in question.  It is
+called when requesting the headers of all articles.
+
+@item generate-article-function
+If present, this function is called to generate an entire article that
+Gnus can understand.  It is called with the article number as a
+parameter when requesting all articles.
+
+@item dissection-function
+If present, this function is called to dissect a document by itself,
+overriding @code{first-article}, @code{article-begin},
+@code{article-begin-function}, @code{head-begin},
+@code{head-begin-function}, @code{head-end}, @code{body-begin},
+@code{body-begin-function}, @code{body-end}, @code{body-end-function},
+@code{file-begin}, and @code{file-end}.
+
+@end table
+
+Let's look at the most complicated example I can come up with---standard
+digests:
+
+@example
+(standard-digest
+ (first-article . ,(concat "^" (make-string 70 ?-) "\n\n+"))
+ (article-begin . ,(concat "\n\n" (make-string 30 ?-) "\n\n+"))
+ (prepare-body-function . nndoc-unquote-dashes)
+ (body-end-function . nndoc-digest-body-end)
+ (head-end . "^ ?$")
+ (body-begin . "^ ?\n")
+ (file-end . "^End of .*digest.*[0-9].*\n\\*\\*\\|^End of.*Digest *$")
+ (subtype digest guess))
+@end example
+
+We see that all text before a 70-width line of dashes is ignored; all
+text after a line that starts with that @samp{^End of} is also ignored;
+each article begins with a 30-width line of dashes; the line separating
+the head from the body may contain a single space; and that the body is
+run through @code{nndoc-unquote-dashes} before being delivered.
+
+To hook your own document definition into @code{nndoc}, use the
+@code{nndoc-add-type} function.  It takes two parameters---the first
+is the definition itself and the second (optional) parameter says
+where in the document type definition alist to put this definition.
+The alist is traversed sequentially, and
+@code{nndoc-@var{type}-type-p} is called for a given type @var{type}.
+So @code{nndoc-mmdf-type-p} is called to see whether a document is of
+@code{mmdf} type, and so on.  These type predicates should return
+@code{nil} if the document is not of the correct type; @code{t} if it
+is of the correct type; and a number if the document might be of the
+correct type.  A high number means high probability; a low number
+means low probability with @samp{0} being the lowest valid number.
+
+
+@node SOUP
+@subsection SOUP
+@cindex SOUP
+@cindex offline
+
+In the PC world people often talk about ``offline'' newsreaders.  These
+are thingies that are combined reader/news transport monstrosities.
+With built-in modem programs.  Yecchh!
+
+Of course, us Unix Weenie types of human beans use things like
+@code{uucp} and, like, @code{nntpd} and set up proper news and mail
+transport things like Ghod intended.  And then we just use normal
+newsreaders.
+
+However, it can sometimes be convenient to do something that's a bit
+easier on the brain if you have a very slow modem, and you're not really
+that interested in doing things properly.
+
+A file format called @sc{soup} has been developed for transporting news
+and mail from servers to home machines and back again.  It can be a bit
+fiddly.
+
+First some terminology:
+
+@table @dfn
+
+@item server
+This is the machine that is connected to the outside world and where you
+get news and/or mail from.
+
+@item home machine
+This is the machine that you want to do the actual reading and responding
+on.  It is typically not connected to the rest of the world in any way.
+
+@item packet
+Something that contains messages and/or commands.  There are two kinds
+of packets:
+
+@table @dfn
+@item message packets
+These are packets made at the server, and typically contain lots of
+messages for you to read.  These are called @file{SoupoutX.tgz} by
+default, where @var{x} is a number.
+
+@item response packets
+These are packets made at the home machine, and typically contains
+replies that you've written.  These are called @file{SoupinX.tgz} by
+default, where @var{x} is a number.
+
+@end table
+
+@end table
+
+
+@enumerate
+
+@item
+You log in on the server and create a @sc{soup} packet.  You can either
+use a dedicated @sc{soup} thingie (like the @code{awk} program), or you
+can use Gnus to create the packet with its @sc{soup} commands (@kbd{O
+s} and/or @kbd{G s b}; and then @kbd{G s p}) (@pxref{SOUP Commands}).
+
+@item
+You transfer the packet home.  Rail, boat, car or modem will do fine.
+
+@item
+You put the packet in your home directory.
+
+@item
+You fire up Gnus on your home machine using the @code{nnsoup} back end as
+the native or secondary server.
+
+@item
+You read articles and mail and answer and followup to the things you
+want (@pxref{SOUP Replies}).
+
+@item
+You do the @kbd{G s r} command to pack these replies into a @sc{soup}
+packet.
+
+@item
+You transfer this packet to the server.
+
+@item
+You use Gnus to mail this packet out with the @kbd{G s s} command.
+
+@item
+You then repeat until you die.
+
+@end enumerate
+
+So you basically have a bipartite system---you use @code{nnsoup} for
+reading and Gnus for packing/sending these @sc{soup} packets.
+
+@menu
+* SOUP Commands::               Commands for creating and sending @sc{soup} packets
+* SOUP Groups::                 A back end for reading @sc{soup} packets.
+* SOUP Replies::                How to enable @code{nnsoup} to take over mail and news.
+@end menu
+
+
+@node SOUP Commands
+@subsubsection SOUP Commands
+
+These are commands for creating and manipulating @sc{soup} packets.
+
+@table @kbd
+@item G s b
+@kindex G s b (Group)
+@findex gnus-group-brew-soup
+Pack all unread articles in the current group
+(@code{gnus-group-brew-soup}).  This command understands the
+process/prefix convention.
+
+@item G s w
+@kindex G s w (Group)
+@findex gnus-soup-save-areas
+Save all @sc{soup} data files (@code{gnus-soup-save-areas}).
+
+@item G s s
+@kindex G s s (Group)
+@findex gnus-soup-send-replies
+Send all replies from the replies packet
+(@code{gnus-soup-send-replies}).
+
+@item G s p
+@kindex G s p (Group)
+@findex gnus-soup-pack-packet
+Pack all files into a @sc{soup} packet (@code{gnus-soup-pack-packet}).
+
+@item G s r
+@kindex G s r (Group)
+@findex nnsoup-pack-replies
+Pack all replies into a replies packet (@code{nnsoup-pack-replies}).
+
+@item O s
+@kindex O s (Summary)
+@findex gnus-soup-add-article
+This summary-mode command adds the current article to a @sc{soup} packet
+(@code{gnus-soup-add-article}).  It understands the process/prefix
+convention (@pxref{Process/Prefix}).
+
+@end table
+
+
+There are a few variables to customize where Gnus will put all these
+thingies:
+
+@table @code
+
+@item gnus-soup-directory
+@vindex gnus-soup-directory
+Directory where Gnus will save intermediate files while composing
+@sc{soup} packets.  The default is @file{~/SoupBrew/}.
+
+@item gnus-soup-replies-directory
+@vindex gnus-soup-replies-directory
+This is what Gnus will use as a temporary directory while sending our
+reply packets.  @file{~/SoupBrew/SoupReplies/} is the default.
+
+@item gnus-soup-prefix-file
+@vindex gnus-soup-prefix-file
+Name of the file where Gnus stores the last used prefix.  The default is
+@samp{gnus-prefix}.
+
+@item gnus-soup-packer
+@vindex gnus-soup-packer
+A format string command for packing a @sc{soup} packet.  The default is
+@samp{tar cf - %s | gzip > $HOME/Soupout%d.tgz}.
+
+@item gnus-soup-unpacker
+@vindex gnus-soup-unpacker
+Format string command for unpacking a @sc{soup} packet.  The default is
+@samp{gunzip -c %s | tar xvf -}.
+
+@item gnus-soup-packet-directory
+@vindex gnus-soup-packet-directory
+Where Gnus will look for reply packets.  The default is @file{~/}.
+
+@item gnus-soup-packet-regexp
+@vindex gnus-soup-packet-regexp
+Regular expression matching @sc{soup} reply packets in
+@code{gnus-soup-packet-directory}.
+
+@end table
+
+
+@node SOUP Groups
+@subsubsection SOUP Groups
+@cindex nnsoup
+
+@code{nnsoup} is the back end for reading @sc{soup} packets.  It will
+read incoming packets, unpack them, and put them in a directory where
+you can read them at leisure.
+
+These are the variables you can use to customize its behavior:
+
+@table @code
+
+@item nnsoup-tmp-directory
+@vindex nnsoup-tmp-directory
+When @code{nnsoup} unpacks a @sc{soup} packet, it does it in this
+directory.  (@file{/tmp/} by default.)
+
+@item nnsoup-directory
+@vindex nnsoup-directory
+@code{nnsoup} then moves each message and index file to this directory.
+The default is @file{~/SOUP/}.
+
+@item nnsoup-replies-directory
+@vindex nnsoup-replies-directory
+All replies will be stored in this directory before being packed into a
+reply packet.  The default is @file{~/SOUP/replies/}.
+
+@item nnsoup-replies-format-type
+@vindex nnsoup-replies-format-type
+The @sc{soup} format of the replies packets.  The default is @samp{?n}
+(rnews), and I don't think you should touch that variable.  I probably
+shouldn't even have documented it.  Drats!  Too late!
+
+@item nnsoup-replies-index-type
+@vindex nnsoup-replies-index-type
+The index type of the replies packet.  The default is @samp{?n}, which
+means ``none''.  Don't fiddle with this one either!
+
+@item nnsoup-active-file
+@vindex nnsoup-active-file
+Where @code{nnsoup} stores lots of information.  This is not an ``active
+file'' in the @code{nntp} sense; it's an Emacs Lisp file.  If you lose
+this file or mess it up in any way, you're dead.  The default is
+@file{~/SOUP/active}.
+
+@item nnsoup-packer
+@vindex nnsoup-packer
+Format string command for packing a reply @sc{soup} packet.  The default
+is @samp{tar cf - %s | gzip > $HOME/Soupin%d.tgz}.
+
+@item nnsoup-unpacker
+@vindex nnsoup-unpacker
+Format string command for unpacking incoming @sc{soup} packets.  The
+default is @samp{gunzip -c %s | tar xvf -}.
+
+@item nnsoup-packet-directory
+@vindex nnsoup-packet-directory
+Where @code{nnsoup} will look for incoming packets.  The default is
+@file{~/}.
+
+@item nnsoup-packet-regexp
+@vindex nnsoup-packet-regexp
+Regular expression matching incoming @sc{soup} packets.  The default is
+@samp{Soupout}.
+
+@item nnsoup-always-save
+@vindex nnsoup-always-save
+If non-@code{nil}, save the replies buffer after each posted message.
+
+@end table
+
+
+@node SOUP Replies
+@subsubsection SOUP Replies
+
+Just using @code{nnsoup} won't mean that your postings and mailings end
+up in @sc{soup} reply packets automagically.  You have to work a bit
+more for that to happen.
+
+@findex nnsoup-set-variables
+The @code{nnsoup-set-variables} command will set the appropriate
+variables to ensure that all your followups and replies end up in the
+@sc{soup} system.
+
+In specific, this is what it does:
+
+@lisp
+(setq message-send-news-function 'nnsoup-request-post)
+(setq message-send-mail-function 'nnsoup-request-mail)
+@end lisp
+
+And that's it, really.  If you only want news to go into the @sc{soup}
+system you just use the first line.  If you only want mail to be
+@sc{soup}ed you use the second.
+
+
+@node Mail-To-News Gateways
+@subsection Mail-To-News Gateways
+@cindex mail-to-news gateways
+@cindex gateways
+
+If your local @code{nntp} server doesn't allow posting, for some reason
+or other, you can post using one of the numerous mail-to-news gateways.
+The @code{nngateway} back end provides the interface.
+
+Note that you can't read anything from this back end---it can only be
+used to post with.
+
+Server variables:
+
+@table @code
+@item nngateway-address
+@vindex nngateway-address
+This is the address of the mail-to-news gateway.
+
+@item nngateway-header-transformation
+@vindex nngateway-header-transformation
+News headers often have to be transformed in some odd way or other
+for the mail-to-news gateway to accept it.  This variable says what
+transformation should be called, and defaults to
+@code{nngateway-simple-header-transformation}.  The function is called
+narrowed to the headers to be transformed and with one parameter---the
+gateway address.
+
+This default function just inserts a new @code{To} header based on the
+@code{Newsgroups} header and the gateway address.
+For instance, an article with this @code{Newsgroups} header:
+
+@example
+Newsgroups: alt.religion.emacs
+@end example
+
+will get this @code{To} header inserted:
+
+@example
+To: alt-religion-emacs@@GATEWAY
+@end example
+
+The following pre-defined functions exist:
+
+@findex nngateway-simple-header-transformation
+@table @code
+
+@item nngateway-simple-header-transformation
+Creates a @code{To} header that looks like
+@var{newsgroup}@@@code{nngateway-address}.
+
+@findex nngateway-mail2news-header-transformation
+
+@item nngateway-mail2news-header-transformation
+Creates a @code{To} header that looks like
+@code{nngateway-address}.
+@end table
+
+@end table
+
+Here's an example:
+
+@lisp
+(setq gnus-post-method
+      '(nngateway
+        "mail2news@@replay.com"
+        (nngateway-header-transformation
+         nngateway-mail2news-header-transformation)))
+@end lisp
+
+So, to use this, simply say something like:
+
+@lisp
+(setq gnus-post-method '(nngateway "GATEWAY.ADDRESS"))
+@end lisp
+
+
+
+@node Combined Groups
+@section Combined Groups
+
+Gnus allows combining a mixture of all the other group types into bigger
+groups.
+
+@menu
+* Virtual Groups::              Combining articles from many groups.
+* Kibozed Groups::              Looking through parts of the newsfeed for articles.
+@end menu
+
+
+@node Virtual Groups
+@subsection Virtual Groups
+@cindex nnvirtual
+@cindex virtual groups
+@cindex merging groups
+
+An @dfn{nnvirtual group} is really nothing more than a collection of
+other groups.
+
+For instance, if you are tired of reading many small groups, you can
+put them all in one big group, and then grow tired of reading one
+big, unwieldy group.  The joys of computing!
+
+You specify @code{nnvirtual} as the method.  The address should be a
+regexp to match component groups.
+
+All marks in the virtual group will stick to the articles in the
+component groups.  So if you tick an article in a virtual group, the
+article will also be ticked in the component group from whence it
+came.  (And vice versa---marks from the component groups will also be
+shown in the virtual group.).  To create an empty virtual group, run
+@kbd{G V} (@code{gnus-group-make-empty-virtual}) in the group buffer
+and edit the method regexp with @kbd{M-e}
+(@code{gnus-group-edit-group-method})
+
+Here's an example @code{nnvirtual} method that collects all Andrea Dworkin
+newsgroups into one, big, happy newsgroup:
+
+@lisp
+(nnvirtual "^alt\\.fan\\.andrea-dworkin$\\|^rec\\.dworkin.*")
+@end lisp
+
+The component groups can be native or foreign; everything should work
+smoothly, but if your computer explodes, it was probably my fault.
+
+Collecting the same group from several servers might actually be a good
+idea if users have set the Distribution header to limit distribution.
+If you would like to read @samp{soc.motss} both from a server in Japan
+and a server in Norway, you could use the following as the group regexp:
+
+@example
+"^nntp\\+server\\.jp:soc\\.motss$\\|^nntp\\+server\\.no:soc\\.motss$"
+@end example
+
+(Remember, though, that if you're creating the group with @kbd{G m}, you
+shouldn't double the backslashes, and you should leave off the quote
+characters at the beginning and the end of the string.)
+
+This should work kinda smoothly---all articles from both groups should
+end up in this one, and there should be no duplicates.  Threading (and
+the rest) will still work as usual, but there might be problems with the
+sequence of articles.  Sorting on date might be an option here
+(@pxref{Selecting a Group}).
+
+One limitation, however---all groups included in a virtual
+group have to be alive (i.e., subscribed or unsubscribed).  Killed or
+zombie groups can't be component groups for @code{nnvirtual} groups.
+
+@vindex nnvirtual-always-rescan
+If the @code{nnvirtual-always-rescan} variable is non-@code{nil} (which
+is the default), @code{nnvirtual} will always scan groups for unread
+articles when entering a virtual group.  If this variable is @code{nil}
+and you read articles in a component group after the virtual group has
+been activated, the read articles from the component group will show up
+when you enter the virtual group.  You'll also see this effect if you
+have two virtual groups that have a component group in common.  If
+that's the case, you should set this variable to @code{t}.  Or you can
+just tap @code{M-g} on the virtual group every time before you enter
+it---it'll have much the same effect.
+
+@code{nnvirtual} can have both mail and news groups as component groups.
+When responding to articles in @code{nnvirtual} groups, @code{nnvirtual}
+has to ask the back end of the component group the article comes from
+whether it is a news or mail back end.  However, when you do a @kbd{^},
+there is typically no sure way for the component back end to know this,
+and in that case @code{nnvirtual} tells Gnus that the article came from a
+not-news back end.  (Just to be on the safe side.)
+
+@kbd{C-c C-n} in the message buffer will insert the @code{Newsgroups}
+line from the article you respond to in these cases.
+
+@code{nnvirtual} groups do not inherit anything but articles and marks
+from component groups---group parameters, for instance, are not
+inherited.
+
+
+@node Kibozed Groups
+@subsection Kibozed Groups
+@cindex nnkiboze
+@cindex kibozing
+
+@dfn{Kibozing} is defined by the @acronym{OED} as ``grepping through
+(parts of) the news feed''.  @code{nnkiboze} is a back end that will
+do this for you.  Oh joy!  Now you can grind any @acronym{NNTP} server
+down to a halt with useless requests!  Oh happiness!
+
+@kindex G k (Group)
+To create a kibozed group, use the @kbd{G k} command in the group
+buffer.
+
+The address field of the @code{nnkiboze} method is, as with
+@code{nnvirtual}, a regexp to match groups to be ``included'' in the
+@code{nnkiboze} group.  That's where most similarities between
+@code{nnkiboze} and @code{nnvirtual} end.
+
+In addition to this regexp detailing component groups, an
+@code{nnkiboze} group must have a score file to say what articles are
+to be included in the group (@pxref{Scoring}).
+
+@kindex M-x nnkiboze-generate-groups
+@findex nnkiboze-generate-groups
+You must run @kbd{M-x nnkiboze-generate-groups} after creating the
+@code{nnkiboze} groups you want to have.  This command will take time.
+Lots of time.  Oodles and oodles of time.  Gnus has to fetch the
+headers from all the articles in all the component groups and run them
+through the scoring process to determine if there are any articles in
+the groups that are to be part of the @code{nnkiboze} groups.
+
+Please limit the number of component groups by using restrictive
+regexps.  Otherwise your sysadmin may become annoyed with you, and the
+@acronym{NNTP} site may throw you off and never let you back in again.
+Stranger things have happened.
+
+@code{nnkiboze} component groups do not have to be alive---they can be dead,
+and they can be foreign.  No restrictions.
+
+@vindex nnkiboze-directory
+The generation of an @code{nnkiboze} group means writing two files in
+@code{nnkiboze-directory}, which is @file{~/News/kiboze/} by default.
+One contains the @acronym{NOV} header lines for all the articles in
+the group, and the other is an additional @file{.newsrc} file to store
+information on what groups have been searched through to find
+component articles.
+
+Articles marked as read in the @code{nnkiboze} group will have
+their @acronym{NOV} lines removed from the @acronym{NOV} file.
+
+
+@node Email Based Diary
+@section Email Based Diary
+@cindex diary
+@cindex email based diary
+@cindex calendar
+
+This section describes a special mail back end called @code{nndiary},
+and its companion library @code{gnus-diary}.  It is ``special'' in the
+sense that it is not meant to be one of the standard alternatives for
+reading mail with Gnus.  See @ref{Choosing a Mail Back End} for that.
+Instead, it is used to treat @emph{some} of your mails in a special way,
+namely, as event reminders.
+
+Here is a typical scenario:
+
+@itemize @bullet
+@item
+You've got a date with Andy Mc Dowell or Bruce Willis (select according
+to your sexual preference) in one month.  You don't want to forget it.
+@item
+So you send a ``reminder'' message (actually, a diary one) to yourself.
+@item
+You forget all about it and keep on getting and reading new mail, as usual.
+@item
+From time to time, as you type `g' in the group buffer and as the date
+is getting closer, the message will pop up again to remind you of your
+appointment, just as if it were new and unread.
+@item
+Read your ``new'' messages, this one included, and start dreaming again
+of the night you're gonna have.
+@item
+Once the date is over (you actually fell asleep just after dinner), the
+message will be automatically deleted if it is marked as expirable.
+@end itemize
+
+The Gnus Diary back end has the ability to handle regular appointments
+(that wouldn't ever be deleted) as well as punctual ones, operates as a
+real mail back end and is configurable in many ways.  All of this is
+explained in the sections below.
+
+@menu
+* The NNDiary Back End::        Basic setup and usage.
+* The Gnus Diary Library::      Utility toolkit on top of nndiary.
+* Sending or Not Sending::      A final note on sending diary messages.
+@end menu
+
+
+@node The NNDiary Back End
+@subsection The NNDiary Back End
+@cindex nndiary
+@cindex the nndiary back end
+
+@code{nndiary} is a back end very similar to @code{nnml} (@pxref{Mail
+Spool}).  Actually, it could appear as a mix of @code{nnml} and
+@code{nndraft}.  If you know @code{nnml}, you're already familiar with
+the message storing scheme of @code{nndiary}: one file per message, one
+directory per group.
+
+  Before anything, there is one requirement to be able to run
+@code{nndiary} properly: you @emph{must} use the group timestamp feature
+of Gnus.  This adds a timestamp to each group's parameters.  @ref{Group
+Timestamp} to see how it's done.
+
+@menu
+* Diary Messages::              What makes a message valid for nndiary.
+* Running NNDiary::             NNDiary has two modes of operation.
+* Customizing NNDiary::         Bells and whistles.
+@end menu
+
+@node Diary Messages
+@subsubsection Diary Messages
+@cindex nndiary messages
+@cindex nndiary mails
+
+@code{nndiary} messages are just normal ones, except for the mandatory
+presence of 7 special headers.  These headers are of the form
+@code{X-Diary-<something>}, @code{<something>} being one of
+@code{Minute}, @code{Hour}, @code{Dom}, @code{Month}, @code{Year},
+@code{Time-Zone} and @code{Dow}.  @code{Dom} means ``Day of Month'', and
+@code{dow} means ``Day of Week''.  These headers actually behave like
+crontab specifications and define the event date(s):
+
+@itemize @bullet
+@item
+For all headers except the @code{Time-Zone} one, a header value is
+either a star (meaning all possible values), or a list of fields
+(separated by a comma).
+@item
+A field is either an integer, or a range.
+@item
+A range is two integers separated by a dash.
+@item
+Possible integer values are 0--59 for @code{Minute}, 0--23 for
+@code{Hour}, 1--31 for @code{Dom}, 1--12 for @code{Month}, above 1971
+for @code{Year} and 0--6 for @code{Dow} (0 meaning Sunday).
+@item
+As a special case, a star in either @code{Dom} or @code{Dow} doesn't
+mean ``all possible values'', but ``use only the other field''.  Note
+that if both are star'ed, the use of either one gives the same result.
+@item
+The @code{Time-Zone} header is special in that it can only have one
+value (@code{GMT}, for instance).  A star doesn't mean ``all possible
+values'' (because it makes no sense), but ``the current local time
+zone''.  Most of the time, you'll be using a star here.  However, for a
+list of available time zone values, see the variable
+@code{nndiary-headers}.
+@end itemize
+
+As a concrete example, here are the diary headers to add to your message
+for specifying ``Each Monday and each 1st of month, at 12:00, 20:00,
+21:00, 22:00, 23:00 and 24:00, from 1999 to 2010'' (I'll let you find
+what to do then):
+
+@example
+X-Diary-Minute: 0
+X-Diary-Hour: 12, 20-24
+X-Diary-Dom: 1
+X-Diary-Month: *
+X-Diary-Year: 1999-2010
+X-Diary-Dow: 1
+X-Diary-Time-Zone: *
+@end example
+
+@node Running NNDiary
+@subsubsection Running NNDiary
+@cindex running nndiary
+@cindex nndiary operation modes
+
+@code{nndiary} has two modes of operation: ``traditional'' (the default)
+and ``autonomous''.  In traditional mode, @code{nndiary} does not get new
+mail by itself.  You have to move (@kbd{B m}) or copy (@kbd{B c}) mails
+from your primary mail back end to nndiary groups in order to handle them
+as diary messages.  In autonomous mode, @code{nndiary} retrieves its own
+mail and handles it independently from your primary mail back end.
+
+One should note that Gnus is not inherently designed to allow several
+``master'' mail back ends at the same time.  However, this does make
+sense with @code{nndiary}: you really want to send and receive diary
+messages to your diary groups directly.  So, @code{nndiary} supports
+being sort of a ``second primary mail back end'' (to my knowledge, it is
+the only back end offering this feature).  However, there is a limitation
+(which I hope to fix some day): respooling doesn't work in autonomous
+mode.
+
+In order to use @code{nndiary} in autonomous mode, you have several
+things to do:
+
+@itemize @bullet
+@item
+Allow @code{nndiary} to retrieve new mail by itself.  Put the following
+line in your @file{~/.gnus.el} file:
+
+@lisp
+(setq nndiary-get-new-mail t)
+@end lisp
+@item
+You must arrange for diary messages (those containing @code{X-Diary-*}
+headers) to be split in a private folder @emph{before} Gnus treat them.
+Again, this is needed because Gnus cannot (yet ?) properly handle
+multiple primary mail back ends.  Getting those messages from a separate
+source will compensate this misfeature to some extent.
+
+As an example, here's my procmailrc entry to store diary files in
+@file{~/.nndiary} (the default @code{nndiary} mail source file):
+
+@example
+:0 HD :
+* ^X-Diary
+.nndiary
+@end example
+@end itemize
+
+Once this is done, you might want to customize the following two options
+that affect the diary mail retrieval and splitting processes:
+
+@defvar nndiary-mail-sources
+This is the diary-specific replacement for the standard
+@code{mail-sources} variable.  It obeys the same syntax, and defaults to
+@code{(file :path "~/.nndiary")}.
+@end defvar
+
+@defvar nndiary-split-methods
+This is the diary-specific replacement for the standard
+@code{nnmail-split-methods} variable.  It obeys the same syntax.
+@end defvar
+
+  Finally, you may add a permanent @code{nndiary} virtual server
+(something like @code{(nndiary "diary")} should do) to your
+@code{gnus-secondary-select-methods}.
+
+  Hopefully, almost everything (see the TODO section in
+@file{nndiary.el}) will work as expected when you restart Gnus: in
+autonomous mode, typing @kbd{g} and @kbd{M-g} in the group buffer, will
+also get your new diary mails and split them according to your
+diary-specific rules, @kbd{F} will find your new diary groups etc.
+
+@node Customizing NNDiary
+@subsubsection Customizing NNDiary
+@cindex customizing nndiary
+@cindex nndiary customization
+
+Now that @code{nndiary} is up and running, it's time to customize it.
+The custom group is called @code{nndiary} (no, really ?!).  You should
+browse it to figure out which options you'd like to tweak.  The following
+two variables are probably the only ones you will want to change:
+
+@defvar nndiary-reminders
+This is the list of times when you want to be reminded of your
+appointments (e.g. 3 weeks before, then 2 days before, then 1 hour
+before and that's it).  Remember that ``being reminded'' means that the
+diary message will pop up as brand new and unread again when you get new
+mail.
+@end defvar
+
+@defvar nndiary-week-starts-on-monday
+Rather self-explanatory.  Otherwise, Sunday is assumed (this is the
+default).
+@end defvar
+
+
+@node The Gnus Diary Library
+@subsection The Gnus Diary Library
+@cindex gnus-diary
+@cindex the gnus diary library
+
+Using @code{nndiary} manually (I mean, writing the headers by hand and
+so on) would be rather boring.  Fortunately, there is a library called
+@code{gnus-diary} written on top of @code{nndiary}, that does many
+useful things for you.
+
+  In order to use it, add the following line to your @file{~/.gnus.el} file:
+
+@lisp
+(require 'gnus-diary)
+@end lisp
+
+  Also, you shouldn't use any @code{gnus-user-format-function-[d|D]}
+(@pxref{Summary Buffer Lines}).  @code{gnus-diary} provides both of these
+(sorry if you used them before).
+
+
+@menu
+* Diary Summary Line Format::           A nicer summary buffer line format.
+* Diary Articles Sorting::              A nicer way to sort messages.
+* Diary Headers Generation::            Not doing it manually.
+* Diary Group Parameters::              Not handling them manually.
+@end menu
+
+@node Diary Summary Line Format
+@subsubsection Diary Summary Line Format
+@cindex diary summary buffer line
+@cindex diary summary line format
+
+Displaying diary messages in standard summary line format (usually
+something like @samp{From Joe: Subject}) is pretty useless.  Most of
+the time, you're the one who wrote the message, and you mostly want to
+see the event's date.
+
+  @code{gnus-diary} provides two supplemental user formats to be used in
+summary line formats.  @code{D} corresponds to a formatted time string
+for the next occurrence of the event (e.g. ``Sat, Sep 22 01, 12:00''),
+while @code{d} corresponds to an approximative remaining time until the
+next occurrence of the event (e.g. ``in 6 months, 1 week'').
+
+  For example, here's how Joe's birthday is displayed in my
+@code{nndiary+diary:birthdays} summary buffer (note that the message is
+expirable, but will never be deleted, as it specifies a periodic event):
+
+@example
+   E  Sat, Sep 22 01, 12:00: Joe's birthday (in 6 months, 1 week)
+@end example
+
+In order to get something like the above, you would normally add the
+following line to your diary groups'parameters:
+
+@lisp
+(gnus-summary-line-format "%U%R%z %uD: %(%s%) (%ud)\n")
+@end lisp
+
+However, @code{gnus-diary} does it automatically (@pxref{Diary Group
+Parameters}).  You can however customize the provided summary line format
+with the following user options:
+
+@defvar gnus-diary-summary-line-format
+Defines the summary line format used for diary groups (@pxref{Summary
+Buffer Lines}).  @code{gnus-diary} uses it to automatically update the
+diary groups'parameters.
+@end defvar
+
+@defvar gnus-diary-time-format
+Defines the format to display dates in diary summary buffers.  This is
+used by the @code{D} user format.  See the docstring for details.
+@end defvar
+
+@defvar gnus-diary-delay-format-function
+Defines the format function to use for displaying delays (remaining
+times) in diary summary buffers.  This is used by the @code{d} user
+format.  There are currently built-in functions for English and French;
+you can also define your own.  See the docstring for details.
+@end defvar
+
+@node Diary Articles Sorting
+@subsubsection Diary Articles Sorting
+@cindex diary articles sorting
+@cindex diary summary lines sorting
+@findex gnus-summary-sort-by-schedule
+@findex gnus-thread-sort-by-schedule
+@findex gnus-article-sort-by-schedule
+
+@code{gnus-diary} provides new sorting functions (@pxref{Sorting the
+Summary Buffer} ) called @code{gnus-summary-sort-by-schedule},
+@code{gnus-thread-sort-by-schedule} and
+@code{gnus-article-sort-by-schedule}.  These functions let you organize
+your diary summary buffers from the closest event to the farthest one.
+
+@code{gnus-diary} automatically installs
+@code{gnus-summary-sort-by-schedule} as a menu item in the summary
+buffer's ``sort'' menu, and the two others as the primary (hence
+default) sorting functions in the group parameters (@pxref{Diary Group
+Parameters}).
+
+@node Diary Headers Generation
+@subsubsection Diary Headers Generation
+@cindex diary headers generation
+@findex gnus-diary-check-message
+
+@code{gnus-diary} provides a function called
+@code{gnus-diary-check-message} to help you handle the @code{X-Diary-*}
+headers.  This function ensures that the current message contains all the
+required diary headers, and prompts you for values or corrections if
+needed.
+
+  This function is hooked into the @code{nndiary} back end, so that
+moving or copying an article to a diary group will trigger it
+automatically.  It is also bound to @kbd{C-c D c} in @code{message-mode}
+and @code{article-edit-mode} in order to ease the process of converting
+a usual mail to a diary one.
+
+  This function takes a prefix argument which will force prompting of
+all diary headers, regardless of their presence or validity.  That way,
+you can very easily reschedule an already valid diary message, for
+instance.
+
+@node Diary Group Parameters
+@subsubsection Diary Group Parameters
+@cindex diary group parameters
+
+When you create a new diary group, or visit one, @code{gnus-diary}
+automatically checks your group parameters and if needed, sets the
+summary line format to the diary-specific value, installs the
+diary-specific sorting functions, and also adds the different
+@code{X-Diary-*} headers to the group's posting-style.  It is then easier
+to send a diary message, because if you use @kbd{C-u a} or @kbd{C-u m}
+on a diary group to prepare a message, these headers will be inserted
+automatically (although not filled with proper values yet).
+
+@node Sending or Not Sending
+@subsection Sending or Not Sending
+
+Well, assuming you've read all of the above, here are two final notes on
+mail sending with @code{nndiary}:
+
+@itemize @bullet
+@item
+@code{nndiary} is a @emph{real} mail back end.  You really send real diary
+messsages for real.  This means for instance that you can give
+appointments to anybody (provided they use Gnus and @code{nndiary}) by
+sending the diary message to them as well.
+@item
+However, since @code{nndiary} also has a @code{request-post} method, you
+can also use @kbd{C-u a} instead of @kbd{C-u m} on a diary group and the
+message won't actually be sent; just stored locally in the group. This
+comes in very handy for private appointments.
+@end itemize
+
+@node Gnus Unplugged
+@section Gnus Unplugged
+@cindex offline
+@cindex unplugged
+@cindex agent
+@cindex Gnus agent
+@cindex Gnus unplugged
+
+In olden times (ca. February '88), people used to run their newsreaders
+on big machines with permanent connections to the net.  News transport
+was dealt with by news servers, and all the newsreaders had to do was to
+read news.  Believe it or not.
+
+Nowadays most people read news and mail at home, and use some sort of
+modem to connect to the net.  To avoid running up huge phone bills, it
+would be nice to have a way to slurp down all the news and mail, hang up
+the phone, read for several hours, and then upload any responses you
+have to make.  And then you repeat the procedure.
+
+Of course, you can use news servers for doing this as well.  I've used
+@code{inn} together with @code{slurp}, @code{pop} and @code{sendmail}
+for some years, but doing that's a bore.  Moving the news server
+functionality up to the newsreader makes sense if you're the only person
+reading news on a machine.
+
+Setting up Gnus as an ``offline'' newsreader is quite simple.  In
+fact, you don't even have to configure anything.
+
+Of course, to use it as such, you have to learn a few new commands.
+
+@menu
+* Agent Basics::                How it all is supposed to work.
+* Agent Categories::            How to tell the Gnus Agent what to download.
+* Agent Commands::              New commands for all the buffers.
+* Agent Visuals::               Ways that the agent may effect your summary buffer.
+* Agent as Cache::              The Agent is a big cache too.
+* Agent Expiry::                How to make old articles go away.
+* Agent Regeneration::          How to recover from lost connections and other accidents.
+* Agent and IMAP::              How to use the Agent with @acronym{IMAP}.
+* Outgoing Messages::           What happens when you post/mail something?
+* Agent Variables::             Customizing is fun.
+* Example Setup::               An example @file{~/.gnus.el} file for offline people.
+* Batching Agents::             How to fetch news from a @code{cron} job.
+* Agent Caveats::               What you think it'll do and what it does.
+@end menu
+
+
+@node Agent Basics
+@subsection Agent Basics
+
+First, let's get some terminology out of the way.
+
+The Gnus Agent is said to be @dfn{unplugged} when you have severed the
+connection to the net (and notified the Agent that this is the case).
+When the connection to the net is up again (and Gnus knows this), the
+Agent is @dfn{plugged}.
+
+The @dfn{local} machine is the one you're running on, and which isn't
+connected to the net continuously.
+
+@dfn{Downloading} means fetching things from the net to your local
+machine.  @dfn{Uploading} is doing the opposite.
+
+You know that Gnus gives you all the opportunity you'd ever want for
+shooting yourself in the foot.  Some people call it flexibility.  Gnus
+is also customizable to a great extent, which means that the user has a
+say on how Gnus behaves.  Other newsreaders might unconditionally shoot
+you in your foot, but with Gnus, you have a choice!
+
+Gnus is never really in plugged or unplugged state.  Rather, it applies
+that state to each server individually.  This means that some servers
+can be plugged while others can be unplugged.  Additionally, some
+servers can be ignored by the Agent altogether (which means that
+they're kinda like plugged always).
+
+So when you unplug the Agent and then wonder why is Gnus opening a
+connection to the Net, the next step to do is to look whether all
+servers are agentized.  If there is an unagentized server, you found
+the culprit.
+
+Another thing is the @dfn{offline} state.  Sometimes, servers aren't
+reachable.  When Gnus notices this, it asks you whether you want the
+server to be switched to offline state.  If you say yes, then the
+server will behave somewhat as if it was unplugged, except that Gnus
+will ask you whether you want to switch it back online again.
+
+Let's take a typical Gnus session using the Agent.
+
+@itemize @bullet
+
+@item
+@findex gnus-unplugged
+You start Gnus with @code{gnus-unplugged}.  This brings up the Gnus
+Agent in a disconnected state.  You can read all the news that you have
+already fetched while in this mode.
+
+@item
+You then decide to see whether any new news has arrived.  You connect
+your machine to the net (using PPP or whatever), and then hit @kbd{J j}
+to make Gnus become @dfn{plugged} and use @kbd{g} to check for new mail
+as usual.  To check for new mail in unplugged mode (@pxref{Mail
+Source Specifiers}).
+
+@item
+You can then read the new news immediately, or you can download the
+news onto your local machine.  If you want to do the latter, you press
+@kbd{g} to check if there are any new news and then @kbd{J s} to fetch
+all the eligible articles in all the groups.  (To let Gnus know which
+articles you want to download, @pxref{Agent Categories}).
+
+@item
+After fetching the articles, you press @kbd{J j} to make Gnus become
+unplugged again, and you shut down the PPP thing (or whatever).  And
+then you read the news offline.
+
+@item
+And then you go to step 2.
+@end itemize
+
+Here are some things you should do the first time (or so) that you use
+the Agent.
+
+@itemize @bullet
+
+@item
+Decide which servers should be covered by the Agent.  If you have a mail
+back end, it would probably be nonsensical to have it covered by the
+Agent.  Go to the server buffer (@kbd{^} in the group buffer) and press
+@kbd{J a} on the server (or servers) that you wish to have covered by the
+Agent (@pxref{Server Agent Commands}), or @kbd{J r} on automatically
+added servers you do not wish to have covered by the Agent.  By default,
+all @code{nntp} and @code{nnimap} servers in @code{gnus-select-method} and
+@code{gnus-secondary-select-methods} are agentized.
+
+@item
+Decide on download policy.  It's fairly simple once you decide whether
+you are going to use agent categories, topic parameters, and/or group
+parameters to implement your policy.  If you're new to gnus, it
+is probably best to start with a category, @xref{Agent Categories}.
+
+Both topic parameters (@pxref{Topic Parameters}) and agent categories
+(@pxref{Agent Categories}) provide for setting a policy that applies
+to multiple groups.  Which you use is entirely up to you.  Topic
+parameters do override categories so, if you mix the two, you'll have
+to take that into account.  If you have a few groups that deviate from
+your policy, you can use group parameters (@pxref{Group Parameters}) to
+configure them.
+
+@item
+Uhm@dots{} that's it.
+@end itemize
+
+
+@node Agent Categories
+@subsection Agent Categories
+
+One of the main reasons to integrate the news transport layer into the
+newsreader is to allow greater control over what articles to download.
+There's not much point in downloading huge amounts of articles, just to
+find out that you're not interested in reading any of them.  It's better
+to be somewhat more conservative in choosing what to download, and then
+mark the articles for downloading manually if it should turn out that
+you're interested in the articles anyway.
+
+One of the more effective methods for controlling what is to be
+downloaded is to create a @dfn{category} and then assign some (or all)
+groups to this category.  Groups that do not belong in any other
+category belong to the @code{default} category.  Gnus has its own
+buffer for creating and managing categories.
+
+If you prefer, you can also use group parameters (@pxref{Group
+Parameters}) and topic parameters (@pxref{Topic Parameters}) for an
+alternative approach to controlling the agent.  The only real
+difference is that categories are specific to the agent (so there is
+less to learn) while group and topic parameters include the kitchen
+sink.
+
+Since you can set agent parameters in several different places we have
+a rule to decide which source to believe.  This rule specifies that
+the parameter sources are checked in the following order: group
+parameters, topic parameters, agent category, and finally customizable
+variables.  So you can mix all of these sources to produce a wide range
+of behavior, just don't blame me if you don't remember where you put
+your settings.
+
+@menu
+* Category Syntax::             What a category looks like.
+* Category Buffer::             A buffer for maintaining categories.
+* Category Variables::          Customize'r'Us.
+@end menu
+
+
+@node Category Syntax
+@subsubsection Category Syntax
+
+A category consists of a name, the list of groups belonging to the
+category, and a number of optional parameters that override the
+customizable variables.  The complete list of agent parameters are
+listed below.
+
+@cindex Agent Parameters
+@table @code
+@item gnus-agent-cat-name
+The name of the category.
+
+@item gnus-agent-cat-groups
+The list of groups that are in this category.
+
+@item gnus-agent-cat-predicate
+A predicate which (generally) gives a rough outline of which articles
+are eligible for downloading; and
+
+@item gnus-agent-cat-score-file
+a score rule which (generally) gives you a finer granularity when
+deciding what articles to download.  (Note that this @dfn{download
+score} is not necessarily related to normal scores.)
+
+@item gnus-agent-cat-enable-expiration
+a boolean indicating whether the agent should expire old articles in
+this group.  Most groups should be expired to conserve disk space.  In
+fact, its probably safe to say that the gnus.* hierarchy contains the
+only groups that should not be expired.
+
+@item gnus-agent-cat-days-until-old
+an integer indicating the number of days that the agent should wait
+before deciding that a read article is safe to expire.
+
+@item gnus-agent-cat-low-score
+an integer that overrides the value of @code{gnus-agent-low-score}.
+
+@item gnus-agent-cat-high-score
+an integer that overrides the value of @code{gnus-agent-high-score}.
+
+@item gnus-agent-cat-length-when-short
+an integer that overrides the value of
+@code{gnus-agent-short-article}.
+
+@item gnus-agent-cat-length-when-long
+an integer that overrides the value of @code{gnus-agent-long-article}.
+
+@c @item gnus-agent-cat-disable-undownloaded-faces
+@c a symbol indicating whether the summary buffer should @emph{not} display
+@c undownloaded articles using the gnus-summary-*-undownloaded-face
+@c faces.  The symbol nil will enable the use of undownloaded faces while
+@c all other symbols disable them.
+
+@item gnus-agent-cat-enable-undownloaded-faces
+a symbol indicating whether the summary buffer should display
+undownloaded articles using the gnus-summary-*-undownloaded-face
+faces.  The symbol nil will disable the use of undownloaded faces while
+all other symbols enable them.
+@end table
+
+The name of a category can not be changed once the category has been
+created.
+
+Each category maintains a list of groups that are exclusive members of
+that category.  The exclusivity rule is automatically enforced, add a
+group to a new category and it is automatically removed from its old
+category.
+
+A predicate in its simplest form can be a single predicate such as
+@code{true} or @code{false}.  These two will download every available
+article or nothing respectively.  In the case of these two special
+predicates an additional score rule is superfluous.
+
+Predicates of @code{high} or @code{low} download articles in respect of
+their scores in relationship to @code{gnus-agent-high-score} and
+@code{gnus-agent-low-score} as described below.
+
+To gain even finer control of what is to be regarded eligible for
+download a predicate can consist of a number of predicates with logical
+operators sprinkled in between.
+
+Perhaps some examples are in order.
+
+Here's a simple predicate.  (It's the default predicate, in fact, used
+for all groups that don't belong to any other category.)
+
+@lisp
+short
+@end lisp
+
+Quite simple, eh?  This predicate is true if and only if the article is
+short (for some value of ``short'').
+
+Here's a more complex predicate:
+
+@lisp
+(or high
+    (and
+     (not low)
+     (not long)))
+@end lisp
+
+This means that an article should be downloaded if it has a high score,
+or if the score is not low and the article is not long.  You get the
+drift.
+
+The available logical operators are @code{or}, @code{and} and
+@code{not}.  (If you prefer, you can use the more ``C''-ish operators
+@samp{|}, @code{&} and @code{!} instead.)
+
+The following predicates are pre-defined, but if none of these fit what
+you want to do, you can write your own.
+
+When evaluating each of these predicates, the named constant will be
+bound to the value determined by calling
+@code{gnus-agent-find-parameter} on the appropriate parameter.  For
+example, gnus-agent-short-article will be bound to
+@code{(gnus-agent-find-parameter group 'agent-short-article)}.  This
+means that you can specify a predicate in your category then tune that
+predicate to individual groups.
+
+@table @code
+@item short
+True if the article is shorter than @code{gnus-agent-short-article}
+lines; default 100.
+
+@item long
+True if the article is longer than @code{gnus-agent-long-article}
+lines; default 200.
+
+@item low
+True if the article has a download score less than
+@code{gnus-agent-low-score}; default 0.
+
+@item high
+True if the article has a download score greater than
+@code{gnus-agent-high-score}; default 0.
+
+@item spam
+True if the Gnus Agent guesses that the article is spam.  The
+heuristics may change over time, but at present it just computes a
+checksum and sees whether articles match.
+
+@item true
+Always true.
+
+@item false
+Always false.
+@end table
+
+If you want to create your own predicate function, here's what you have
+to know:  The functions are called with no parameters, but the
+@code{gnus-headers} and @code{gnus-score} dynamic variables are bound to
+useful values.
+
+For example, you could decide that you don't want to download articles
+that were posted more than a certain number of days ago (e.g. posted
+more than @code{gnus-agent-expire-days} ago) you might write a function
+something along the lines of the following:
+
+@lisp
+(defun my-article-old-p ()
+  "Say whether an article is old."
+  (< (time-to-days (date-to-time (mail-header-date gnus-headers)))
+     (- (time-to-days (current-time)) gnus-agent-expire-days)))
+@end lisp
+
+with the predicate then defined as:
+
+@lisp
+(not my-article-old-p)
+@end lisp
+
+or you could append your predicate to the predefined
+@code{gnus-category-predicate-alist} in your @file{~/.gnus.el} or
+wherever.
+
+@lisp
+(require 'gnus-agent)
+(setq  gnus-category-predicate-alist
+  (append gnus-category-predicate-alist
+         '((old . my-article-old-p))))
+@end lisp
+
+and simply specify your predicate as:
+
+@lisp
+(not old)
+@end lisp
+
+If/when using something like the above, be aware that there are many
+misconfigured systems/mailers out there and so an article's date is not
+always a reliable indication of when it was posted.  Hell, some people
+just don't give a damn.
+
+The above predicates apply to @emph{all} the groups which belong to the
+category.  However, if you wish to have a specific predicate for an
+individual group within a category, or you're just too lazy to set up a
+new category, you can enter a group's individual predicate in its group
+parameters like so:
+
+@lisp
+(agent-predicate . short)
+@end lisp
+
+This is the group/topic parameter equivalent of the agent category default.
+Note that when specifying a single word predicate like this, the
+@code{agent-predicate} specification must be in dotted pair notation.
+
+The equivalent of the longer example from above would be:
+
+@lisp
+(agent-predicate or high (and (not low) (not long)))
+@end lisp
+
+The outer parenthesis required in the category specification are not
+entered here as, not being in dotted pair notation, the value of the
+predicate is assumed to be a list.
+
+
+Now, the syntax of the download score is the same as the syntax of
+normal score files, except that all elements that require actually
+seeing the article itself are verboten.  This means that only the
+following headers can be scored on: @code{Subject}, @code{From},
+@code{Date}, @code{Message-ID}, @code{References}, @code{Chars},
+@code{Lines}, and @code{Xref}.
+
+As with predicates, the specification of the @code{download score rule}
+to use in respect of a group can be in either the category definition if
+it's to be applicable to all groups in therein, or a group's parameters
+if it's to be specific to that group.
+
+In both of these places the @code{download score rule} can take one of
+three forms:
+
+@enumerate
+@item
+Score rule
+
+This has the same syntax as a normal Gnus score file except only a
+subset of scoring keywords are available as mentioned above.
+
+example:
+
+@itemize @bullet
+@item
+Category specification
+
+@lisp
+(("from"
+       ("Lars Ingebrigtsen" 1000000 nil s))
+("lines"
+       (500 -100 nil <)))
+@end lisp
+
+@item
+Group/Topic Parameter specification
+
+@lisp
+(agent-score ("from"
+                   ("Lars Ingebrigtsen" 1000000 nil s))
+             ("lines"
+                   (500 -100 nil <)))
+@end lisp
+
+Again, note the omission of the outermost parenthesis here.
+@end itemize
+
+@item
+Agent score file
+
+These score files must @emph{only} contain the permitted scoring
+keywords stated above.
+
+example:
+
+@itemize @bullet
+@item
+Category specification
+
+@lisp
+("~/News/agent.SCORE")
+@end lisp
+
+or perhaps
+
+@lisp
+("~/News/agent.SCORE" "~/News/agent.group.SCORE")
+@end lisp
+
+@item
+Group Parameter specification
+
+@lisp
+(agent-score "~/News/agent.SCORE")
+@end lisp
+
+Additional score files can be specified as above.  Need I say anything
+about parenthesis?
+@end itemize
+
+@item
+Use @code{normal} score files
+
+If you don't want to maintain two sets of scoring rules for a group, and
+your desired @code{downloading} criteria for a group are the same as your
+@code{reading} criteria then you can tell the agent to refer to your
+@code{normal} score files when deciding what to download.
+
+These directives in either the category definition or a group's
+parameters will cause the agent to read in all the applicable score
+files for a group, @emph{filtering out} those sections that do not
+relate to one of the permitted subset of scoring keywords.
+
+@itemize @bullet
+@item
+Category Specification
+
+@lisp
+file
+@end lisp
+
+@item
+Group Parameter specification
+
+@lisp
+(agent-score . file)
+@end lisp
+@end itemize
+@end enumerate
+
+@node Category Buffer
+@subsubsection Category Buffer
+
+You'd normally do all category maintenance from the category buffer.
+When you enter it for the first time (with the @kbd{J c} command from
+the group buffer), you'll only see the @code{default} category.
+
+The following commands are available in this buffer:
+
+@table @kbd
+@item q
+@kindex q (Category)
+@findex gnus-category-exit
+Return to the group buffer (@code{gnus-category-exit}).
+
+@item e
+@kindex e (Category)
+@findex gnus-category-customize-category
+Use a customization buffer to set all of the selected category's
+parameters at one time (@code{gnus-category-customize-category}).
+
+@item k
+@kindex k (Category)
+@findex gnus-category-kill
+Kill the current category (@code{gnus-category-kill}).
+
+@item c
+@kindex c (Category)
+@findex gnus-category-copy
+Copy the current category (@code{gnus-category-copy}).
+
+@item a
+@kindex a (Category)
+@findex gnus-category-add
+Add a new category (@code{gnus-category-add}).
+
+@item p
+@kindex p (Category)
+@findex gnus-category-edit-predicate
+Edit the predicate of the current category
+(@code{gnus-category-edit-predicate}).
+
+@item g
+@kindex g (Category)
+@findex gnus-category-edit-groups
+Edit the list of groups belonging to the current category
+(@code{gnus-category-edit-groups}).
+
+@item s
+@kindex s (Category)
+@findex gnus-category-edit-score
+Edit the download score rule of the current category
+(@code{gnus-category-edit-score}).
+
+@item l
+@kindex l (Category)
+@findex gnus-category-list
+List all the categories (@code{gnus-category-list}).
+@end table
+
+
+@node Category Variables
+@subsubsection Category Variables
+
+@table @code
+@item gnus-category-mode-hook
+@vindex gnus-category-mode-hook
+Hook run in category buffers.
+
+@item gnus-category-line-format
+@vindex gnus-category-line-format
+Format of the lines in the category buffer (@pxref{Formatting
+Variables}).  Valid elements are:
+
+@table @samp
+@item c
+The name of the category.
+
+@item g
+The number of groups in the category.
+@end table
+
+@item gnus-category-mode-line-format
+@vindex gnus-category-mode-line-format
+Format of the category mode line (@pxref{Mode Line Formatting}).
+
+@item gnus-agent-short-article
+@vindex gnus-agent-short-article
+Articles that have fewer lines than this are short.  Default 100.
+
+@item gnus-agent-long-article
+@vindex gnus-agent-long-article
+Articles that have more lines than this are long.  Default 200.
+
+@item gnus-agent-low-score
+@vindex gnus-agent-low-score
+Articles that have a score lower than this have a low score.  Default
+0.
+
+@item gnus-agent-high-score
+@vindex gnus-agent-high-score
+Articles that have a score higher than this have a high score.  Default
+0.
+
+@item gnus-agent-expire-days
+@vindex gnus-agent-expire-days
+The number of days that a @samp{read} article must stay in the agent's
+local disk before becoming eligible for expiration (While the name is
+the same, this doesn't mean expiring the article on the server.  It
+just means deleting the local copy of the article).  What is also
+important to understand is that the counter starts with the time the
+article was written to the local disk and not the time the article was
+read.
+Default 7.
+
+@item gnus-agent-enable-expiration
+@vindex gnus-agent-enable-expiration
+Determines whether articles in a group are, by default, expired or
+retained indefinitely.  The default is @code{ENABLE} which means that
+you'll have to disable expiration when desired.  On the other hand,
+you could set this to @code{DISABLE}.  In that case, you would then
+have to enable expiration in selected groups.
+
+@end table
+
+
+@node Agent Commands
+@subsection Agent Commands
+@findex gnus-agent-toggle-plugged
+@kindex J j (Agent)
+
+All the Gnus Agent commands are on the @kbd{J} submap.  The @kbd{J j}
+(@code{gnus-agent-toggle-plugged}) command works in all modes, and
+toggles the plugged/unplugged state of the Gnus Agent.
+
+
+@menu
+* Group Agent Commands::        Configure groups and fetch their contents.
+* Summary Agent Commands::      Manually select then fetch specific articles.
+* Server Agent Commands::       Select the servers that are supported by the agent.
+@end menu
+
+
+
+
+@node Group Agent Commands
+@subsubsection Group Agent Commands
+
+@table @kbd
+@item J u
+@kindex J u (Agent Group)
+@findex gnus-agent-fetch-groups
+Fetch all eligible articles in the current group
+(@code{gnus-agent-fetch-groups}).
+
+@item J c
+@kindex J c (Agent Group)
+@findex gnus-enter-category-buffer
+Enter the Agent category buffer (@code{gnus-enter-category-buffer}).
+
+@item J s
+@kindex J s (Agent Group)
+@findex gnus-agent-fetch-session
+Fetch all eligible articles in all groups
+(@code{gnus-agent-fetch-session}).
+
+@item J S
+@kindex J S (Agent Group)
+@findex gnus-group-send-queue
+Send all sendable messages in the queue group
+(@code{gnus-group-send-queue}).  @xref{Drafts}.
+
+@item J a
+@kindex J a (Agent Group)
+@findex gnus-agent-add-group
+Add the current group to an Agent category
+(@code{gnus-agent-add-group}).  This command understands the
+process/prefix convention (@pxref{Process/Prefix}).
+
+@item J r
+@kindex J r (Agent Group)
+@findex gnus-agent-remove-group
+Remove the current group from its category, if any
+(@code{gnus-agent-remove-group}).  This command understands the
+process/prefix convention (@pxref{Process/Prefix}).
+
+@item J Y
+@kindex J Y (Agent Group)
+@findex gnus-agent-synchronize-flags
+Synchronize flags changed while unplugged with remote server, if any.
+
+
+@end table
+
+
+@node Summary Agent Commands
+@subsubsection Summary Agent Commands
+
+@table @kbd
+@item J #
+@kindex J # (Agent Summary)
+@findex gnus-agent-mark-article
+Mark the article for downloading (@code{gnus-agent-mark-article}).
+
+@item J M-#
+@kindex J M-# (Agent Summary)
+@findex gnus-agent-unmark-article
+Remove the downloading mark from the article
+(@code{gnus-agent-unmark-article}).
+
+@cindex %
+@item @@
+@kindex @@ (Agent Summary)
+@findex gnus-agent-toggle-mark
+Toggle whether to download the article
+(@code{gnus-agent-toggle-mark}).  The download mark is @samp{%} by
+default.
+
+@item J c
+@kindex J c (Agent Summary)
+@findex gnus-agent-catchup
+Mark all articles as read (@code{gnus-agent-catchup}) that are neither cached, downloaded, nor downloadable.
+
+@item J S
+@kindex J S (Agent Summary)
+@findex gnus-agent-fetch-group
+Download all eligible (@pxref{Agent Categories}) articles in this group.
+(@code{gnus-agent-fetch-group}).
+
+@item J s
+@kindex J s (Agent Summary)
+@findex gnus-agent-fetch-series
+Download all processable articles in this group.
+(@code{gnus-agent-fetch-series}).
+
+@item J u
+@kindex J u (Agent Summary)
+@findex gnus-agent-summary-fetch-group
+Download all downloadable articles in the current group
+(@code{gnus-agent-summary-fetch-group}).
+
+@end table
+
+
+@node Server Agent Commands
+@subsubsection Server Agent Commands
+
+@table @kbd
+@item J a
+@kindex J a (Agent Server)
+@findex gnus-agent-add-server
+Add the current server to the list of servers covered by the Gnus Agent
+(@code{gnus-agent-add-server}).
+
+@item J r
+@kindex J r (Agent Server)
+@findex gnus-agent-remove-server
+Remove the current server from the list of servers covered by the Gnus
+Agent (@code{gnus-agent-remove-server}).
+
+@end table
+
+
+@node Agent Visuals
+@subsection Agent Visuals
+
+If you open a summary while unplugged and, Gnus knows from the group's
+active range that there are more articles than the headers currently
+stored in the Agent, you may see some articles whose subject looks
+something like @samp{[Undownloaded article #####]}.  These are
+placeholders for the missing headers.  Aside from setting a mark,
+there is not much that can be done with one of these placeholders.
+When Gnus finally gets a chance to fetch the group's headers, the
+placeholders will automatically be replaced by the actual headers.
+You can configure the summary buffer's maneuvering to skip over the
+placeholders if you care (See @code{gnus-auto-goto-ignores}).
+
+While it may be obvious to all, the only headers and articles
+available while unplugged are those headers and articles that were
+fetched into the Agent while previously plugged.  To put it another
+way, ``If you forget to fetch something while plugged, you might have a
+less than satisfying unplugged session''.  For this reason, the Agent
+adds two visual effects to your summary buffer.  These effects display
+the download status of each article so that you always know which
+articles will be available when unplugged.
+
+The first visual effect is the @samp{%O} spec.  If you customize
+@code{gnus-summary-line-format} to include this specifier, you will add
+a single character field that indicates an article's download status.
+Articles that have been fetched into either the Agent or the Cache,
+will display @code{gnus-downloaded-mark} (defaults to @samp{+}).  All
+other articles will display @code{gnus-undownloaded-mark} (defaults to
+@samp{-}).  If you open a group that has not been agentized, a space
+(@samp{ }) will be displayed.
+
+The second visual effect are the undownloaded faces.  The faces, there
+are three indicating the article's score (low, normal, high), seem to
+result in a love/hate response from many Gnus users.  The problem is
+that the face selection is controlled by a list of condition tests and
+face names (See @code{gnus-summary-highlight}).  Each condition is
+tested in the order in which it appears in the list so early
+conditions have precedence over later conditions.  All of this means
+that, if you tick an undownloaded article, the article will continue
+to be displayed in the undownloaded face rather than the ticked face.
+
+If you use the Agent as a cache (to avoid downloading the same article
+each time you visit it or to minimize your connection time), the
+undownloaded face will probably seem like a good idea.  The reason
+being that you do all of our work (marking, reading, deleting) with
+downloaded articles so the normal faces always appear.
+
+For occasional Agent users, the undownloaded faces may appear to be an
+absolutely horrible idea.  The issue being that, since most of their
+articles have not been fetched into the Agent, most of the normal
+faces will be obscured by the undownloaded faces.  If this is your
+situation, you have two choices available.  First, you can completely
+disable the undownload faces by customizing
+@code{gnus-summary-highlight} to delete the three cons-cells that
+refer to the @code{gnus-summary-*-undownloaded-face} faces.  Second,
+if you prefer to take a more fine-grained approach, you may set the
+@code{agent-disable-undownloaded-faces} group parameter to @code{t}.
+This parameter, like all other agent parameters, may be set on an
+Agent Category (@pxref{Agent Categories}), a Group Topic (@pxref{Topic
+Parameters}), or an individual group (@pxref{Group Parameters}).
+
+@node Agent as Cache
+@subsection Agent as Cache
+
+When Gnus is plugged, it is not efficient to download headers or
+articles from the server again, if they are already stored in the
+Agent.  So, Gnus normally only downloads headers once, and stores them
+in the Agent.  These headers are later used when generating the summary
+buffer, regardless of whether you are plugged or unplugged.  Articles
+are not cached in the Agent by default though (that would potentially
+consume lots of disk space), but if you have already downloaded an
+article into the Agent, Gnus will not download the article from the
+server again but use the locally stored copy instead.
+
+If you so desire, you can configure the agent (see @code{gnus-agent-cache}
+@pxref{Agent Variables}) to always download headers and articles while
+plugged.  Gnus will almost certainly be slower, but it will be kept
+synchronized with the server.  That last point probably won't make any
+sense if you are using a nntp or nnimap back end.
+
+@node Agent Expiry
+@subsection Agent Expiry
+
+@vindex gnus-agent-expire-days
+@findex gnus-agent-expire
+@kindex M-x gnus-agent-expire
+@kindex M-x gnus-agent-expire-group
+@findex gnus-agent-expire-group
+@cindex agent expiry
+@cindex Gnus agent expiry
+@cindex expiry, in Gnus agent
+
+The Agent back end, @code{nnagent}, doesn't handle expiry.  Well, at
+least it doesn't handle it like other back ends.  Instead, there are
+special @code{gnus-agent-expire} and @code{gnus-agent-expire-group}
+commands that will expire all read articles that are older than
+@code{gnus-agent-expire-days} days.  They can be run whenever you feel
+that you're running out of space.  Neither are particularly fast or
+efficient, and it's not a particularly good idea to interrupt them (with
+@kbd{C-g} or anything else) once you've started one of them.
+
+Note that other functions, e.g. @code{gnus-request-expire-articles},
+might run @code{gnus-agent-expire} for you to keep the agent
+synchronized with the group.
+
+The agent parameter @code{agent-enable-expiration} may be used to
+prevent expiration in selected groups.
+
+@vindex gnus-agent-expire-all
+If @code{gnus-agent-expire-all} is non-@code{nil}, the agent
+expiration commands will expire all articles---unread, read, ticked
+and dormant.  If @code{nil} (which is the default), only read articles
+are eligible for expiry, and unread, ticked and dormant articles will
+be kept indefinitely.
+
+If you find that some articles eligible for expiry are never expired,
+perhaps some Gnus Agent files are corrupted.  There's are special
+commands, @code{gnus-agent-regenerate} and
+@code{gnus-agent-regenerate-group}, to fix possible problems.
+
+@node Agent Regeneration
+@subsection Agent Regeneration
+
+@cindex agent regeneration
+@cindex Gnus agent regeneration
+@cindex regeneration
+
+The local data structures used by @code{nnagent} may become corrupted
+due to certain exceptional conditions.  When this happens,
+@code{nnagent} functionality may degrade or even fail.  The solution
+to this problem is to repair the local data structures by removing all
+internal inconsistencies.
+
+For example, if your connection to your server is lost while
+downloaded articles into the agent, the local data structures will not
+know about articles successfully downloaded prior to the connection
+failure.  Running @code{gnus-agent-regenerate} or
+@code{gnus-agent-regenerate-group} will update the data structures
+such that you don't need to download these articles a second time.
+
+@findex gnus-agent-regenerate
+@kindex M-x gnus-agent-regenerate
+The command @code{gnus-agent-regenerate} will perform
+@code{gnus-agent-regenerate-group} on every agentized group.  While
+you can run @code{gnus-agent-regenerate} in any buffer, it is strongly
+recommended that you first close all summary buffers.
+
+@findex gnus-agent-regenerate-group
+@kindex M-x gnus-agent-regenerate-group
+The command @code{gnus-agent-regenerate-group} uses the local copies
+of individual articles to repair the local @acronym{NOV}(header) database.  It
+then updates the internal data structures that document which articles
+are stored locally.  An optional argument will mark articles in the
+agent as unread.
+
+@node Agent and IMAP
+@subsection Agent and IMAP
+
+The Agent works with any Gnus back end, including nnimap.  However,
+since there are some conceptual differences between @acronym{NNTP} and
+@acronym{IMAP}, this section (should) provide you with some information to
+make Gnus Agent work smoother as a @acronym{IMAP} Disconnected Mode client.
+
+The first thing to keep in mind is that all flags (read, ticked, etc)
+are kept on the @acronym{IMAP} server, rather than in @file{.newsrc} as is the
+case for nntp.  Thus Gnus need to remember flag changes when
+disconnected, and synchronize these flags when you plug back in.
+
+Gnus keeps track of flag changes when reading nnimap groups under the
+Agent.  When you plug back in, Gnus will check if you have any changed
+any flags and ask if you wish to synchronize these with the server.
+The behavior is customizable by @code{gnus-agent-synchronize-flags}.
+
+@vindex gnus-agent-synchronize-flags
+If @code{gnus-agent-synchronize-flags} is @code{nil}, the Agent will
+never automatically synchronize flags.  If it is @code{ask}, which is
+the default, the Agent will check if you made any changes and if so
+ask if you wish to synchronize these when you re-connect.  If it has
+any other value, all flags will be synchronized automatically.
+
+If you do not wish to synchronize flags automatically when you
+re-connect, you can do it manually with the
+@code{gnus-agent-synchronize-flags} command that is bound to @kbd{J Y}
+in the group buffer.
+
+Some things are currently not implemented in the Agent that you'd might
+expect from a disconnected @acronym{IMAP} client, including:
+
+@itemize @bullet
+
+@item
+Copying/moving articles into nnimap groups when unplugged.
+
+@item
+Creating/deleting nnimap groups when unplugged.
+
+@end itemize
+
+Technical note: the synchronization algorithm does not work by ``pushing''
+all local flags to the server, but rather incrementally update the
+server view of flags by changing only those flags that were changed by
+the user.  Thus, if you set one flag on an article, quit the group and
+re-select the group and remove the flag; the flag will be set and
+removed from the server when you ``synchronize''.  The queued flag
+operations can be found in the per-server @code{flags} file in the Agent
+directory.  It's emptied when you synchronize flags.
+
+
+@node Outgoing Messages
+@subsection Outgoing Messages
+
+When Gnus is unplugged, all outgoing messages (both mail and news) are
+stored in the draft group ``queue'' (@pxref{Drafts}).  You can view
+them there after posting, and edit them at will.
+
+When Gnus is plugged again, you can send the messages either from the
+draft group with the special commands available there, or you can use
+the @kbd{J S} command in the group buffer to send all the sendable
+messages in the draft group.
+
+
+
+@node Agent Variables
+@subsection Agent Variables
+
+@table @code
+@item gnus-agent-directory
+@vindex gnus-agent-directory
+Where the Gnus Agent will store its files.  The default is
+@file{~/News/agent/}.
+
+@item gnus-agent-handle-level
+@vindex gnus-agent-handle-level
+Groups on levels (@pxref{Group Levels}) higher than this variable will
+be ignored by the Agent.  The default is @code{gnus-level-subscribed},
+which means that only subscribed group will be considered by the Agent
+by default.
+
+@item gnus-agent-plugged-hook
+@vindex gnus-agent-plugged-hook
+Hook run when connecting to the network.
+
+@item gnus-agent-unplugged-hook
+@vindex gnus-agent-unplugged-hook
+Hook run when disconnecting from the network.
+
+@item gnus-agent-fetched-hook
+@vindex gnus-agent-fetched-hook
+Hook run when finished fetching articles.
+
+@item gnus-agent-cache
+@vindex gnus-agent-cache
+Variable to control whether use the locally stored @acronym{NOV} and
+articles when plugged, e.g. essentially using the Agent as a cache.
+The default is non-@code{nil}, which means to use the Agent as a cache.
+
+@item gnus-agent-go-online
+@vindex gnus-agent-go-online
+If @code{gnus-agent-go-online} is @code{nil}, the Agent will never
+automatically switch offline servers into online status.  If it is
+@code{ask}, the default, the Agent will ask if you wish to switch
+offline servers into online status when you re-connect.  If it has any
+other value, all offline servers will be automatically switched into
+online status.
+
+@item gnus-agent-mark-unread-after-downloaded
+@vindex gnus-agent-mark-unread-after-downloaded
+If @code{gnus-agent-mark-unread-after-downloaded} is non-@code{nil},
+mark articles as unread after downloading.  This is usually a safe
+thing to do as the newly downloaded article has obviously not been
+read.  The default is @code{t}.
+
+@item gnus-agent-consider-all-articles
+@vindex gnus-agent-consider-all-articles
+If @code{gnus-agent-consider-all-articles} is non-@code{nil}, the
+agent will let the agent predicate decide whether articles need to be
+downloaded or not, for all articles.  When @code{nil}, the default,
+the agent will only let the predicate decide whether unread articles
+are downloaded or not.  If you enable this, you may also want to look
+into the agent expiry settings (@pxref{Category Variables}), so that
+the agent doesn't download articles which the agent will later expire,
+over and over again.
+
+@item gnus-agent-max-fetch-size
+@vindex gnus-agent-max-fetch-size
+The agent fetches articles into a temporary buffer prior to parsing
+them into individual files.  To avoid exceeding the max. buffer size,
+the agent alternates between fetching and parsing until all articles
+have been fetched.  @code{gnus-agent-max-fetch-size} provides a size
+limit to control how often the cycling occurs.  A large value improves
+performance.  A small value minimizes the time lost should the
+connection be lost while fetching (You may need to run
+@code{gnus-agent-regenerate-group} to update the group's state.
+However, all articles parsed prior to loosing the connection will be
+available while unplugged).  The default is 10M so it is unusual to
+see any cycling.
+
+@item gnus-server-unopen-status
+@vindex gnus-server-unopen-status
+Perhaps not an Agent variable, but closely related to the Agent, this
+variable says what will happen if Gnus cannot open a server.  If the
+Agent is enabled, the default, @code{nil}, makes Gnus ask the user
+whether to deny the server or whether to unplug the agent.  If the
+Agent is disabled, Gnus always simply deny the server.  Other choices
+for this variable include @code{denied} and @code{offline} the latter
+is only valid if the Agent is used.
+
+@item gnus-auto-goto-ignores
+@vindex gnus-auto-goto-ignores
+Another variable that isn't an Agent variable, yet so closely related
+that most will look for it here, this variable tells the summary
+buffer how to maneuver around undownloaded (only headers stored in the
+agent) and unfetched (neither article nor headers stored) articles.
+
+The valid values are @code{nil} (maneuver to any article),
+@code{undownloaded} (maneuvering while unplugged ignores articles that
+have not been fetched), @code{always-undownloaded} (maneuvering always
+ignores articles that have not been fetched), @code{unfetched}
+(maneuvering ignores articles whose headers have not been fetched).
+
+@item gnus-agent-auto-agentize-methods
+@vindex gnus-agent-auto-agentize-methods
+If you have never used the Agent before (or more technically, if
+@file{~/News/agent/lib/servers} does not exist), Gnus will
+automatically agentize a few servers for you.  This variable control
+which backends should be auto-agentized.  It is typically only useful
+to agentize remote backends.  The auto-agentizing has the same effect
+as running @kbd{J a} on the servers (@pxref{Server Agent Commands}).
+If the file exist, you must manage the servers manually by adding or
+removing them, this variable is only applicable the first time you
+start Gnus.  The default is @samp{(nntp nnimap)}.
+
+@end table
+
+
+@node Example Setup
+@subsection Example Setup
+
+If you don't want to read this manual, and you have a fairly standard
+setup, you may be able to use something like the following as your
+@file{~/.gnus.el} file to get started.
+
+@lisp
+;; @r{Define how Gnus is to fetch news.  We do this over @acronym{NNTP}}
+;; @r{from your ISP's server.}
+(setq gnus-select-method '(nntp "news.your-isp.com"))
+
+;; @r{Define how Gnus is to read your mail.  We read mail from}
+;; @r{your ISP's @acronym{POP} server.}
+(setq mail-sources '((pop :server "pop.your-isp.com")))
+
+;; @r{Say how Gnus is to store the mail.  We use nnml groups.}
+(setq gnus-secondary-select-methods '((nnml "")))
+
+;; @r{Make Gnus into an offline newsreader.}
+;; (gnus-agentize) ; @r{The obsolete setting.}
+;; (setq gnus-agent t) ; @r{Now the default.}
+@end lisp
+
+That should be it, basically.  Put that in your @file{~/.gnus.el} file,
+edit to suit your needs, start up PPP (or whatever), and type @kbd{M-x
+gnus}.
+
+If this is the first time you've run Gnus, you will be subscribed
+automatically to a few default newsgroups.  You'll probably want to
+subscribe to more groups, and to do that, you have to query the
+@acronym{NNTP} server for a complete list of groups with the @kbd{A A}
+command.  This usually takes quite a while, but you only have to do it
+once.
+
+After reading and parsing a while, you'll be presented with a list of
+groups.  Subscribe to the ones you want to read with the @kbd{u}
+command.  @kbd{l} to make all the killed groups disappear after you've
+subscribe to all the groups you want to read.  (@kbd{A k} will bring
+back all the killed groups.)
+
+You can now read the groups at once, or you can download the articles
+with the @kbd{J s} command.  And then read the rest of this manual to
+find out which of the other gazillion things you want to customize.
+
+
+@node Batching Agents
+@subsection Batching Agents
+@findex gnus-agent-batch
+
+Having the Gnus Agent fetch articles (and post whatever messages you've
+written) is quite easy once you've gotten things set up properly.  The
+following shell script will do everything that is necessary:
+
+You can run a complete batch command from the command line with the
+following incantation:
+
+@example
+#!/bin/sh
+emacs -batch -l ~/.emacs -l ~/.gnus.el -f gnus-agent-batch >/dev/null 2>&1
+@end example
+
+
+@node Agent Caveats
+@subsection Agent Caveats
+
+The Gnus Agent doesn't seem to work like most other offline
+newsreaders.  Here are some common questions that some imaginary people
+may ask:
+
+@table @dfn
+@item If I read an article while plugged, do they get entered into the Agent?
+
+@strong{No}.  If you want this behavior, add
+@code{gnus-agent-fetch-selected-article} to
+@code{gnus-select-article-hook}.
+
+@item If I read an article while plugged, and the article already exists in
+the Agent, will it get downloaded once more?
+
+@strong{No}, unless @code{gnus-agent-cache} is @code{nil}.
+
+@end table
+
+In short, when Gnus is unplugged, it only looks into the locally stored
+articles; when it's plugged, it talks to your ISP and may also use the
+locally stored articles.
+
+
+@node Scoring
+@chapter Scoring
+@cindex scoring
+
+Other people use @dfn{kill files}, but we here at Gnus Towers like
+scoring better than killing, so we'd rather switch than fight.  They do
+something completely different as well, so sit up straight and pay
+attention!
+
+@vindex gnus-summary-mark-below
+All articles have a default score (@code{gnus-summary-default-score}),
+which is 0 by default.  This score may be raised or lowered either
+interactively or by score files.  Articles that have a score lower than
+@code{gnus-summary-mark-below} are marked as read.
+
+Gnus will read any @dfn{score files} that apply to the current group
+before generating the summary buffer.
+
+There are several commands in the summary buffer that insert score
+entries based on the current article.  You can, for instance, ask Gnus to
+lower or increase the score of all articles with a certain subject.
+
+There are two sorts of scoring entries: Permanent and temporary.
+Temporary score entries are self-expiring entries.  Any entries that are
+temporary and have not been used for, say, a week, will be removed
+silently to help keep the sizes of the score files down.
+
+@menu
+* Summary Score Commands::      Adding score entries for the current group.
+* Group Score Commands::        General score commands.
+* Score Variables::             Customize your scoring.  (My, what terminology).
+* Score File Format::           What a score file may contain.
+* Score File Editing::          You can edit score files by hand as well.
+* Adaptive Scoring::            Big Sister Gnus knows what you read.
+* Home Score File::             How to say where new score entries are to go.
+* Followups To Yourself::       Having Gnus notice when people answer you.
+* Scoring On Other Headers::    Scoring on non-standard headers.
+* Scoring Tips::                How to score effectively.
+* Reverse Scoring::             That problem child of old is not problem.
+* Global Score Files::          Earth-spanning, ear-splitting score files.
+* Kill Files::                  They are still here, but they can be ignored.
+* Converting Kill Files::       Translating kill files to score files.
+* GroupLens::                   Getting predictions on what you like to read.
+* Advanced Scoring::            Using logical expressions to build score rules.
+* Score Decays::                It can be useful to let scores wither away.
+@end menu
+
+
+@node Summary Score Commands
+@section Summary Score Commands
+@cindex score commands
+
+The score commands that alter score entries do not actually modify real
+score files.  That would be too inefficient.  Gnus maintains a cache of
+previously loaded score files, one of which is considered the
+@dfn{current score file alist}.  The score commands simply insert
+entries into this list, and upon group exit, this list is saved.
+
+The current score file is by default the group's local score file, even
+if no such score file actually exists.  To insert score commands into
+some other score file (e.g. @file{all.SCORE}), you must first make this
+score file the current one.
+
+General score commands that don't actually change the score file:
+
+@table @kbd
+
+@item V s
+@kindex V s (Summary)
+@findex gnus-summary-set-score
+Set the score of the current article (@code{gnus-summary-set-score}).
+
+@item V S
+@kindex V S (Summary)
+@findex gnus-summary-current-score
+Display the score of the current article
+(@code{gnus-summary-current-score}).
+
+@item V t
+@kindex V t (Summary)
+@findex gnus-score-find-trace
+Display all score rules that have been used on the current article
+(@code{gnus-score-find-trace}).  In the @code{*Score Trace*} buffer, you
+may type @kbd{e} to edit score file corresponding to the score rule on
+current line and @kbd{f} to format (@code{gnus-score-pretty-print}) the
+score file and edit it.
+
+@item V w
+@kindex V w (Summary)
+@findex gnus-score-find-favourite-words
+List words used in scoring (@code{gnus-score-find-favourite-words}).
+
+@item V R
+@kindex V R (Summary)
+@findex gnus-summary-rescore
+Run the current summary through the scoring process
+(@code{gnus-summary-rescore}).  This might be useful if you're playing
+around with your score files behind Gnus' back and want to see the
+effect you're having.
+
+@item V c
+@kindex V c (Summary)
+@findex gnus-score-change-score-file
+Make a different score file the current
+(@code{gnus-score-change-score-file}).
+
+@item V e
+@kindex V e (Summary)
+@findex gnus-score-edit-current-scores
+Edit the current score file (@code{gnus-score-edit-current-scores}).
+You will be popped into a @code{gnus-score-mode} buffer (@pxref{Score
+File Editing}).
+
+@item V f
+@kindex V f (Summary)
+@findex gnus-score-edit-file
+Edit a score file and make this score file the current one
+(@code{gnus-score-edit-file}).
+
+@item V F
+@kindex V F (Summary)
+@findex gnus-score-flush-cache
+Flush the score cache (@code{gnus-score-flush-cache}).  This is useful
+after editing score files.
+
+@item V C
+@kindex V C (Summary)
+@findex gnus-score-customize
+Customize a score file in a visually pleasing manner
+(@code{gnus-score-customize}).
+
+@end table
+
+The rest of these commands modify the local score file.
+
+@table @kbd
+
+@item V m
+@kindex V m (Summary)
+@findex gnus-score-set-mark-below
+Prompt for a score, and mark all articles with a score below this as
+read (@code{gnus-score-set-mark-below}).
+
+@item V x
+@kindex V x (Summary)
+@findex gnus-score-set-expunge-below
+Prompt for a score, and add a score rule to the current score file to
+expunge all articles below this score
+(@code{gnus-score-set-expunge-below}).
+@end table
+
+The keystrokes for actually making score entries follow a very regular
+pattern, so there's no need to list all the commands.  (Hundreds of
+them.)
+
+@findex gnus-summary-increase-score
+@findex gnus-summary-lower-score
+
+@enumerate
+@item
+The first key is either @kbd{I} (upper case i) for increasing the score
+or @kbd{L} for lowering the score.
+@item
+The second key says what header you want to score on.  The following
+keys are available:
+@table @kbd
+
+@item a
+Score on the author name.
+
+@item s
+Score on the subject line.
+
+@item x
+Score on the @code{Xref} line---i.e., the cross-posting line.
+
+@item r
+Score on the @code{References} line.
+
+@item d
+Score on the date.
+
+@item l
+Score on the number of lines.
+
+@item i
+Score on the @code{Message-ID} header.
+
+@item e
+Score on an ``extra'' header, that is, one of those in gnus-extra-headers,
+if your @acronym{NNTP} server tracks additional header data in overviews.
+
+@item f
+Score on followups---this matches the author name, and adds scores to
+the followups to this author.  (Using this key leads to the creation of
+@file{ADAPT} files.)
+
+@item b
+Score on the body.
+
+@item h
+Score on the head.
+
+@item t
+Score on thread.  (Using this key leads to the creation of @file{ADAPT}
+files.)
+
+@end table
+
+@item
+The third key is the match type.  Which match types are valid depends on
+what headers you are scoring on.
+
+@table @code
+
+@item strings
+
+@table @kbd
+
+@item e
+Exact matching.
+
+@item s
+Substring matching.
+
+@item f
+Fuzzy matching (@pxref{Fuzzy Matching}).
+
+@item r
+Regexp matching
+@end table
+
+@item date
+@table @kbd
+
+@item b
+Before date.
+
+@item a
+After date.
+
+@item n
+This date.
+@end table
+
+@item number
+@table @kbd
+
+@item <
+Less than number.
+
+@item =
+Equal to number.
+
+@item >
+Greater than number.
+@end table
+@end table
+
+@item
+The fourth and usually final key says whether this is a temporary (i.e.,
+expiring) score entry, or a permanent (i.e., non-expiring) score entry,
+or whether it is to be done immediately, without adding to the score
+file.
+@table @kbd
+
+@item t
+Temporary score entry.
+
+@item p
+Permanent score entry.
+
+@item i
+Immediately scoring.
+@end table
+
+@item
+If you are scoring on `e' (extra) headers, you will then be prompted for
+the header name on which you wish to score.  This must be a header named
+in gnus-extra-headers, and @samp{TAB} completion is available.
+
+@end enumerate
+
+So, let's say you want to increase the score on the current author with
+exact matching permanently: @kbd{I a e p}.  If you want to lower the
+score based on the subject line, using substring matching, and make a
+temporary score entry: @kbd{L s s t}.  Pretty easy.
+
+To make things a bit more complicated, there are shortcuts.  If you use
+a capital letter on either the second or third keys, Gnus will use
+defaults for the remaining one or two keystrokes.  The defaults are
+``substring'' and ``temporary''.  So @kbd{I A} is the same as @kbd{I a s
+t}, and @kbd{I a R} is the same as @kbd{I a r t}.
+
+These functions take both the numerical prefix and the symbolic prefix
+(@pxref{Symbolic Prefixes}).  A numerical prefix says how much to lower
+(or increase) the score of the article.  A symbolic prefix of @code{a}
+says to use the @file{all.SCORE} file for the command instead of the
+current score file.
+
+@vindex gnus-score-mimic-keymap
+The @code{gnus-score-mimic-keymap} says whether these commands will
+pretend they are keymaps or not.
+
+
+@node Group Score Commands
+@section Group Score Commands
+@cindex group score commands
+
+There aren't many of these as yet, I'm afraid.
+
+@table @kbd
+
+@item W f
+@kindex W f (Group)
+@findex gnus-score-flush-cache
+Gnus maintains a cache of score alists to avoid having to reload them
+all the time.  This command will flush the cache
+(@code{gnus-score-flush-cache}).
+
+@end table
+
+You can do scoring from the command line by saying something like:
+
+@findex gnus-batch-score
+@cindex batch scoring
+@example
+$ emacs -batch -l ~/.emacs -l ~/.gnus.el -f gnus-batch-score
+@end example
+
+
+@node Score Variables
+@section Score Variables
+@cindex score variables
+
+@table @code
+
+@item gnus-use-scoring
+@vindex gnus-use-scoring
+If @code{nil}, Gnus will not check for score files, and will not, in
+general, do any score-related work.  This is @code{t} by default.
+
+@item gnus-kill-killed
+@vindex gnus-kill-killed
+If this variable is @code{nil}, Gnus will never apply score files to
+articles that have already been through the kill process.  While this
+may save you lots of time, it also means that if you apply a kill file
+to a group, and then change the kill file and want to run it over you
+group again to kill more articles, it won't work.  You have to set this
+variable to @code{t} to do that.  (It is @code{t} by default.)
+
+@item gnus-kill-files-directory
+@vindex gnus-kill-files-directory
+All kill and score files will be stored in this directory, which is
+initialized from the @env{SAVEDIR} environment variable by default.
+This is @file{~/News/} by default.
+
+@item gnus-score-file-suffix
+@vindex gnus-score-file-suffix
+Suffix to add to the group name to arrive at the score file name
+(@file{SCORE} by default.)
+
+@item gnus-score-uncacheable-files
+@vindex gnus-score-uncacheable-files
+@cindex score cache
+All score files are normally cached to avoid excessive re-loading of
+score files.  However, if this might make your Emacs grow big and
+bloated, so this regexp can be used to weed out score files unlikely
+to be needed again.  It would be a bad idea to deny caching of
+@file{all.SCORE}, while it might be a good idea to not cache
+@file{comp.infosystems.www.authoring.misc.ADAPT}.  In fact, this
+variable is @samp{ADAPT$} by default, so no adaptive score files will
+be cached.
+
+@item gnus-save-score
+@vindex gnus-save-score
+If you have really complicated score files, and do lots of batch
+scoring, then you might set this variable to @code{t}.  This will make
+Gnus save the scores into the @file{.newsrc.eld} file.
+
+If you do not set this to @code{t}, then manual scores (like those set
+with @kbd{V s} (@code{gnus-summary-set-score})) will not be preserved
+across group visits.
+
+@item gnus-score-interactive-default-score
+@vindex gnus-score-interactive-default-score
+Score used by all the interactive raise/lower commands to raise/lower
+score with.  Default is 1000, which may seem excessive, but this is to
+ensure that the adaptive scoring scheme gets enough room to play with.
+We don't want the small changes from the adaptive scoring to overwrite
+manually entered data.
+
+@item gnus-summary-default-score
+@vindex gnus-summary-default-score
+Default score of an article, which is 0 by default.
+
+@item gnus-summary-expunge-below
+@vindex gnus-summary-expunge-below
+Don't display the summary lines of articles that have scores lower than
+this variable.  This is @code{nil} by default, which means that no
+articles will be hidden.  This variable is local to the summary buffers,
+and has to be set from @code{gnus-summary-mode-hook}.
+
+@item gnus-score-over-mark
+@vindex gnus-score-over-mark
+Mark (in the third column) used for articles with a score over the
+default.  Default is @samp{+}.
+
+@item gnus-score-below-mark
+@vindex gnus-score-below-mark
+Mark (in the third column) used for articles with a score below the
+default.  Default is @samp{-}.
+
+@item gnus-score-find-score-files-function
+@vindex gnus-score-find-score-files-function
+Function used to find score files for the current group.  This function
+is called with the name of the group as the argument.
+
+Predefined functions available are:
+@table @code
+
+@item gnus-score-find-single
+@findex gnus-score-find-single
+Only apply the group's own score file.
+
+@item gnus-score-find-bnews
+@findex gnus-score-find-bnews
+Apply all score files that match, using bnews syntax.  This is the
+default.  If the current group is @samp{gnu.emacs.gnus}, for instance,
+@file{all.emacs.all.SCORE}, @file{not.alt.all.SCORE} and
+@file{gnu.all.SCORE} would all apply.  In short, the instances of
+@samp{all} in the score file names are translated into @samp{.*}, and
+then a regexp match is done.
+
+This means that if you have some score entries that you want to apply to
+all groups, then you put those entries in the @file{all.SCORE} file.
+
+The score files are applied in a semi-random order, although Gnus will
+try to apply the more general score files before the more specific score
+files.  It does this by looking at the number of elements in the score
+file names---discarding the @samp{all} elements.
+
+@item gnus-score-find-hierarchical
+@findex gnus-score-find-hierarchical
+Apply all score files from all the parent groups.  This means that you
+can't have score files like @file{all.SCORE}, but you can have
+@file{SCORE}, @file{comp.SCORE} and @file{comp.emacs.SCORE} for each
+server.
+
+@end table
+This variable can also be a list of functions.  In that case, all
+these functions will be called with the group name as argument, and
+all the returned lists of score files will be applied.  These
+functions can also return lists of lists of score alists directly.  In
+that case, the functions that return these non-file score alists
+should probably be placed before the ``real'' score file functions, to
+ensure that the last score file returned is the local score file.
+Phu.
+
+For example, to do hierarchical scoring but use a non-server-specific
+overall score file, you could use the value
+@example
+(list (lambda (group) ("all.SCORE"))
+      'gnus-score-find-hierarchical)
+@end example
+
+@item gnus-score-expiry-days
+@vindex gnus-score-expiry-days
+This variable says how many days should pass before an unused score file
+entry is expired.  If this variable is @code{nil}, no score file entries
+are expired.  It's 7 by default.
+
+@item gnus-update-score-entry-dates
+@vindex gnus-update-score-entry-dates
+If this variable is non-@code{nil}, temporary score entries that have
+been triggered (matched) will have their dates updated.  (This is how Gnus
+controls expiry---all non-matched-entries will become too old while
+matched entries will stay fresh and young.)  However, if you set this
+variable to @code{nil}, even matched entries will grow old and will
+have to face that oh-so grim reaper.
+
+@item gnus-score-after-write-file-function
+@vindex gnus-score-after-write-file-function
+Function called with the name of the score file just written.
+
+@item gnus-score-thread-simplify
+@vindex gnus-score-thread-simplify
+If this variable is non-@code{nil}, article subjects will be
+simplified for subject scoring purposes in the same manner as with
+threading---according to the current value of
+@code{gnus-simplify-subject-functions}.  If the scoring entry uses
+@code{substring} or @code{exact} matching, the match will also be
+simplified in this manner.
+
+@end table
+
+
+@node Score File Format
+@section Score File Format
+@cindex score file format
+
+A score file is an @code{emacs-lisp} file that normally contains just a
+single form.  Casual users are not expected to edit these files;
+everything can be changed from the summary buffer.
+
+Anyway, if you'd like to dig into it yourself, here's an example:
+
+@lisp
+(("from"
+  ("Lars Ingebrigtsen" -10000)
+  ("Per Abrahamsen")
+  ("larsi\\|lmi" -50000 nil R))
+ ("subject"
+  ("Ding is Badd" nil 728373))
+ ("xref"
+  ("alt.politics" -1000 728372 s))
+ ("lines"
+  (2 -100 nil <))
+ (mark 0)
+ (expunge -1000)
+ (mark-and-expunge -10)
+ (read-only nil)
+ (orphan -10)
+ (adapt t)
+ (files "/hom/larsi/News/gnu.SCORE")
+ (exclude-files "all.SCORE")
+ (local (gnus-newsgroup-auto-expire t)
+        (gnus-summary-make-false-root empty))
+ (eval (ding)))
+@end lisp
+
+This example demonstrates most score file elements.  @xref{Advanced
+Scoring}, for a different approach.
+
+Even though this looks much like Lisp code, nothing here is actually
+@code{eval}ed.  The Lisp reader is used to read this form, though, so it
+has to be valid syntactically, if not semantically.
+
+Six keys are supported by this alist:
+
+@table @code
+
+@item STRING
+If the key is a string, it is the name of the header to perform the
+match on.  Scoring can only be performed on these eight headers:
+@code{From}, @code{Subject}, @code{References}, @code{Message-ID},
+@code{Xref}, @code{Lines}, @code{Chars} and @code{Date}.  In addition to
+these headers, there are three strings to tell Gnus to fetch the entire
+article and do the match on larger parts of the article: @code{Body}
+will perform the match on the body of the article, @code{Head} will
+perform the match on the head of the article, and @code{All} will
+perform the match on the entire article.  Note that using any of these
+last three keys will slow down group entry @emph{considerably}.  The
+final ``header'' you can score on is @code{Followup}.  These score
+entries will result in new score entries being added for all follow-ups
+to articles that matches these score entries.
+
+Following this key is an arbitrary number of score entries, where each
+score entry has one to four elements.
+@enumerate
+
+@item
+The first element is the @dfn{match element}.  On most headers this will
+be a string, but on the Lines and Chars headers, this must be an
+integer.
+
+@item
+If the second element is present, it should be a number---the @dfn{score
+element}.  This number should be an integer in the neginf to posinf
+interval.  This number is added to the score of the article if the match
+is successful.  If this element is not present, the
+@code{gnus-score-interactive-default-score} number will be used
+instead.  This is 1000 by default.
+
+@item
+If the third element is present, it should be a number---the @dfn{date
+element}.  This date says when the last time this score entry matched,
+which provides a mechanism for expiring the score entries.  It this
+element is not present, the score entry is permanent.  The date is
+represented by the number of days since December 31, 1 BCE.
+
+@item
+If the fourth element is present, it should be a symbol---the @dfn{type
+element}.  This element specifies what function should be used to see
+whether this score entry matches the article.  What match types that can
+be used depends on what header you wish to perform the match on.
+@table @dfn
+
+@item From, Subject, References, Xref, Message-ID
+For most header types, there are the @code{r} and @code{R} (regexp), as
+well as @code{s} and @code{S} (substring) types, and @code{e} and
+@code{E} (exact match), and @code{w} (word match) types.  If this
+element is not present, Gnus will assume that substring matching should
+be used.  @code{R}, @code{S}, and @code{E} differ from the others in
+that the matches will be done in a case-sensitive manner.  All these
+one-letter types are really just abbreviations for the @code{regexp},
+@code{string}, @code{exact}, and @code{word} types, which you can use
+instead, if you feel like.
+
+@item Extra
+Just as for the standard string overview headers, if you are using
+gnus-extra-headers, you can score on these headers' values.  In this
+case, there is a 5th element in the score entry, being the name of the
+header to be scored.  The following entry is useful in your
+@file{all.SCORE} file in case of spam attacks from a single origin
+host, if your @acronym{NNTP} server tracks @samp{NNTP-Posting-Host} in
+overviews:
+
+@lisp
+("111.222.333.444" -1000 nil s
+ "NNTP-Posting-Host")
+@end lisp
+
+@item Lines, Chars
+These two headers use different match types: @code{<}, @code{>},
+@code{=}, @code{>=} and @code{<=}.
+
+These predicates are true if
+
+@example
+(PREDICATE HEADER MATCH)
+@end example
+
+evaluates to non-@code{nil}.  For instance, the advanced match
+@code{("lines" 4 <)} (@pxref{Advanced Scoring}) will result in the
+following form:
+
+@lisp
+(< header-value 4)
+@end lisp
+
+Or to put it another way: When using @code{<} on @code{Lines} with 4 as
+the match, we get the score added if the article has less than 4 lines.
+(It's easy to get confused and think it's the other way around.  But
+it's not.  I think.)
+
+When matching on @code{Lines}, be careful because some back ends (like
+@code{nndir}) do not generate @code{Lines} header, so every article ends
+up being marked as having 0 lines.  This can lead to strange results if
+you happen to lower score of the articles with few lines.
+
+@item Date
+For the Date header we have three kinda silly match types:
+@code{before}, @code{at} and @code{after}.  I can't really imagine this
+ever being useful, but, like, it would feel kinda silly not to provide
+this function.  Just in case.  You never know.  Better safe than sorry.
+Once burnt, twice shy.  Don't judge a book by its cover.  Never not have
+sex on a first date.  (I have been told that at least one person, and I
+quote, ``found this function indispensable'', however.)
+
+@cindex ISO8601
+@cindex date
+A more useful match type is @code{regexp}.  With it, you can match the
+date string using a regular expression.  The date is normalized to
+ISO8601 compact format first---@var{YYYYMMDD}@code{T}@var{HHMMSS}.  If
+you want to match all articles that have been posted on April 1st in
+every year, you could use @samp{....0401.........} as a match string,
+for instance.  (Note that the date is kept in its original time zone, so
+this will match articles that were posted when it was April 1st where
+the article was posted from.  Time zones are such wholesome fun for the
+whole family, eh?)
+
+@item Head, Body, All
+These three match keys use the same match types as the @code{From} (etc)
+header uses.
+
+@item Followup
+This match key is somewhat special, in that it will match the
+@code{From} header, and affect the score of not only the matching
+articles, but also all followups to the matching articles.  This allows
+you e.g. increase the score of followups to your own articles, or
+decrease the score of followups to the articles of some known
+trouble-maker.  Uses the same match types as the @code{From} header
+uses.  (Using this match key will lead to creation of @file{ADAPT}
+files.)
+
+@item Thread
+This match key works along the same lines as the @code{Followup} match
+key.  If you say that you want to score on a (sub-)thread started by an
+article with a @code{Message-ID} @var{x}, then you add a @samp{thread}
+match.  This will add a new @samp{thread} match for each article that
+has @var{x} in its @code{References} header.  (These new @samp{thread}
+matches will use the @code{Message-ID}s of these matching articles.)
+This will ensure that you can raise/lower the score of an entire thread,
+even though some articles in the thread may not have complete
+@code{References} headers.  Note that using this may lead to
+undeterministic scores of the articles in the thread.  (Using this match
+key will lead to creation of @file{ADAPT} files.)
+@end table
+@end enumerate
+
+@cindex score file atoms
+@item mark
+The value of this entry should be a number.  Any articles with a score
+lower than this number will be marked as read.
+
+@item expunge
+The value of this entry should be a number.  Any articles with a score
+lower than this number will be removed from the summary buffer.
+
+@item mark-and-expunge
+The value of this entry should be a number.  Any articles with a score
+lower than this number will be marked as read and removed from the
+summary buffer.
+
+@item thread-mark-and-expunge
+The value of this entry should be a number.  All articles that belong to
+a thread that has a total score below this number will be marked as read
+and removed from the summary buffer.  @code{gnus-thread-score-function}
+says how to compute the total score for a thread.
+
+@item files
+The value of this entry should be any number of file names.  These files
+are assumed to be score files as well, and will be loaded the same way
+this one was.
+
+@item exclude-files
+The clue of this entry should be any number of files.  These files will
+not be loaded, even though they would normally be so, for some reason or
+other.
+
+@item eval
+The value of this entry will be @code{eval}el.  This element will be
+ignored when handling global score files.
+
+@item read-only
+Read-only score files will not be updated or saved.  Global score files
+should feature this atom (@pxref{Global Score Files}).  (Note:
+@dfn{Global} here really means @dfn{global}; not your personal
+apply-to-all-groups score files.)
+
+@item orphan
+The value of this entry should be a number.  Articles that do not have
+parents will get this number added to their scores.  Imagine you follow
+some high-volume newsgroup, like @samp{comp.lang.c}.  Most likely you
+will only follow a few of the threads, also want to see any new threads.
+
+You can do this with the following two score file entries:
+
+@example
+        (orphan -500)
+        (mark-and-expunge -100)
+@end example
+
+When you enter the group the first time, you will only see the new
+threads.  You then raise the score of the threads that you find
+interesting (with @kbd{I T} or @kbd{I S}), and ignore (@kbd{C y}) the
+rest.  Next time you enter the group, you will see new articles in the
+interesting threads, plus any new threads.
+
+I.e.---the orphan score atom is for high-volume groups where a few
+interesting threads which can't be found automatically by ordinary
+scoring rules exist.
+
+@item adapt
+This entry controls the adaptive scoring.  If it is @code{t}, the
+default adaptive scoring rules will be used.  If it is @code{ignore}, no
+adaptive scoring will be performed on this group.  If it is a list, this
+list will be used as the adaptive scoring rules.  If it isn't present,
+or is something other than @code{t} or @code{ignore}, the default
+adaptive scoring rules will be used.  If you want to use adaptive
+scoring on most groups, you'd set @code{gnus-use-adaptive-scoring} to
+@code{t}, and insert an @code{(adapt ignore)} in the groups where you do
+not want adaptive scoring.  If you only want adaptive scoring in a few
+groups, you'd set @code{gnus-use-adaptive-scoring} to @code{nil}, and
+insert @code{(adapt t)} in the score files of the groups where you want
+it.
+
+@item adapt-file
+All adaptive score entries will go to the file named by this entry.  It
+will also be applied when entering the group.  This atom might be handy
+if you want to adapt on several groups at once, using the same adaptive
+file for a number of groups.
+
+@item local
+@cindex local variables
+The value of this entry should be a list of @code{(@var{var}
+@var{value})} pairs.  Each @var{var} will be made buffer-local to the
+current summary buffer, and set to the value specified.  This is a
+convenient, if somewhat strange, way of setting variables in some
+groups if you don't like hooks much.  Note that the @var{value} won't
+be evaluated.
+@end table
+
+
+@node Score File Editing
+@section Score File Editing
+
+You normally enter all scoring commands from the summary buffer, but you
+might feel the urge to edit them by hand as well, so we've supplied you
+with a mode for that.
+
+It's simply a slightly customized @code{emacs-lisp} mode, with these
+additional commands:
+
+@table @kbd
+
+@item C-c C-c
+@kindex C-c C-c (Score)
+@findex gnus-score-edit-done
+Save the changes you have made and return to the summary buffer
+(@code{gnus-score-edit-done}).
+
+@item C-c C-d
+@kindex C-c C-d (Score)
+@findex gnus-score-edit-insert-date
+Insert the current date in numerical format
+(@code{gnus-score-edit-insert-date}).  This is really the day number, if
+you were wondering.
+
+@item C-c C-p
+@kindex C-c C-p (Score)
+@findex gnus-score-pretty-print
+The adaptive score files are saved in an unformatted fashion.  If you
+intend to read one of these files, you want to @dfn{pretty print} it
+first.  This command (@code{gnus-score-pretty-print}) does that for
+you.
+
+@end table
+
+Type @kbd{M-x gnus-score-mode} to use this mode.
+
+@vindex gnus-score-mode-hook
+@code{gnus-score-menu-hook} is run in score mode buffers.
+
+In the summary buffer you can use commands like @kbd{V f}, @kbd{V e} and
+@kbd{V t} to begin editing score files.
+
+
+@node Adaptive Scoring
+@section Adaptive Scoring
+@cindex adaptive scoring
+
+If all this scoring is getting you down, Gnus has a way of making it all
+happen automatically---as if by magic.  Or rather, as if by artificial
+stupidity, to be precise.
+
+@vindex gnus-use-adaptive-scoring
+When you read an article, or mark an article as read, or kill an
+article, you leave marks behind.  On exit from the group, Gnus can sniff
+these marks and add score elements depending on what marks it finds.
+You turn on this ability by setting @code{gnus-use-adaptive-scoring} to
+@code{t} or @code{(line)}.  If you want score adaptively on separate
+words appearing in the subjects, you should set this variable to
+@code{(word)}.  If you want to use both adaptive methods, set this
+variable to @code{(word line)}.
+
+@vindex gnus-default-adaptive-score-alist
+To give you complete control over the scoring process, you can customize
+the @code{gnus-default-adaptive-score-alist} variable.  For instance, it
+might look something like this:
+
+@lisp
+(setq gnus-default-adaptive-score-alist
+  '((gnus-unread-mark)
+    (gnus-ticked-mark (from 4))
+    (gnus-dormant-mark (from 5))
+    (gnus-del-mark (from -4) (subject -1))
+    (gnus-read-mark (from 4) (subject 2))
+    (gnus-expirable-mark (from -1) (subject -1))
+    (gnus-killed-mark (from -1) (subject -3))
+    (gnus-kill-file-mark)
+    (gnus-ancient-mark)
+    (gnus-low-score-mark)
+    (gnus-catchup-mark (from -1) (subject -1))))
+@end lisp
+
+As you see, each element in this alist has a mark as a key (either a
+variable name or a ``real'' mark---a character).  Following this key is
+a arbitrary number of header/score pairs.  If there are no header/score
+pairs following the key, no adaptive scoring will be done on articles
+that have that key as the article mark.  For instance, articles with
+@code{gnus-unread-mark} in the example above will not get adaptive score
+entries.
+
+Each article can have only one mark, so just a single of these rules
+will be applied to each article.
+
+To take @code{gnus-del-mark} as an example---this alist says that all
+articles that have that mark (i.e., are marked with @samp{e}) will have a
+score entry added to lower based on the @code{From} header by -4, and
+lowered by @code{Subject} by -1.  Change this to fit your prejudices.
+
+If you have marked 10 articles with the same subject with
+@code{gnus-del-mark}, the rule for that mark will be applied ten times.
+That means that that subject will get a score of ten times -1, which
+should be, unless I'm much mistaken, -10.
+
+If you have auto-expirable (mail) groups (@pxref{Expiring Mail}), all
+the read articles will be marked with the @samp{E} mark.  This'll
+probably make adaptive scoring slightly impossible, so auto-expiring and
+adaptive scoring doesn't really mix very well.
+
+The headers you can score on are @code{from}, @code{subject},
+@code{message-id}, @code{references}, @code{xref}, @code{lines},
+@code{chars} and @code{date}.  In addition, you can score on
+@code{followup}, which will create an adaptive score entry that matches
+on the @code{References} header using the @code{Message-ID} of the
+current article, thereby matching the following thread.
+
+If you use this scheme, you should set the score file atom @code{mark}
+to something small---like -300, perhaps, to avoid having small random
+changes result in articles getting marked as read.
+
+After using adaptive scoring for a week or so, Gnus should start to
+become properly trained and enhance the authors you like best, and kill
+the authors you like least, without you having to say so explicitly.
+
+You can control what groups the adaptive scoring is to be performed on
+by using the score files (@pxref{Score File Format}).  This will also
+let you use different rules in different groups.
+
+@vindex gnus-adaptive-file-suffix
+The adaptive score entries will be put into a file where the name is the
+group name with @code{gnus-adaptive-file-suffix} appended.  The default
+is @file{ADAPT}.
+
+@vindex gnus-score-exact-adapt-limit
+When doing adaptive scoring, substring or fuzzy matching would probably
+give you the best results in most cases.  However, if the header one
+matches is short, the possibility for false positives is great, so if
+the length of the match is less than
+@code{gnus-score-exact-adapt-limit}, exact matching will be used.  If
+this variable is @code{nil}, exact matching will always be used to avoid
+this problem.
+
+@vindex gnus-default-adaptive-word-score-alist
+As mentioned above, you can adapt either on individual words or entire
+headers.  If you adapt on words, the
+@code{gnus-default-adaptive-word-score-alist} variable says what score
+each instance of a word should add given a mark.
+
+@lisp
+(setq gnus-default-adaptive-word-score-alist
+      `((,gnus-read-mark . 30)
+        (,gnus-catchup-mark . -10)
+        (,gnus-killed-mark . -20)
+        (,gnus-del-mark . -15)))
+@end lisp
+
+This is the default value.  If you have adaption on words enabled, every
+word that appears in subjects of articles marked with
+@code{gnus-read-mark} will result in a score rule that increase the
+score with 30 points.
+
+@vindex gnus-default-ignored-adaptive-words
+@vindex gnus-ignored-adaptive-words
+Words that appear in the @code{gnus-default-ignored-adaptive-words} list
+will be ignored.  If you wish to add more words to be ignored, use the
+@code{gnus-ignored-adaptive-words} list instead.
+
+@vindex gnus-adaptive-word-length-limit
+Some may feel that short words shouldn't count when doing adaptive
+scoring.  If so, you may set @code{gnus-adaptive-word-length-limit} to
+an integer.  Words shorter than this number will be ignored.  This
+variable defaults to @code{nil}.
+
+@vindex gnus-adaptive-word-syntax-table
+When the scoring is done, @code{gnus-adaptive-word-syntax-table} is the
+syntax table in effect.  It is similar to the standard syntax table, but
+it considers numbers to be non-word-constituent characters.
+
+@vindex gnus-adaptive-word-minimum
+If @code{gnus-adaptive-word-minimum} is set to a number, the adaptive
+word scoring process will never bring down the score of an article to
+below this number.  The default is @code{nil}.
+
+@vindex gnus-adaptive-word-no-group-words
+If @code{gnus-adaptive-word-no-group-words} is set to @code{t}, gnus
+won't adaptively word score any of the words in the group name.  Useful
+for groups like @samp{comp.editors.emacs}, where most of the subject
+lines contain the word @samp{emacs}.
+
+After using this scheme for a while, it might be nice to write a
+@code{gnus-psychoanalyze-user} command to go through the rules and see
+what words you like and what words you don't like.  Or perhaps not.
+
+Note that the adaptive word scoring thing is highly experimental and is
+likely to change in the future.  Initial impressions seem to indicate
+that it's totally useless as it stands.  Some more work (involving more
+rigorous statistical methods) will have to be done to make this useful.
+
+
+@node Home Score File
+@section Home Score File
+
+The score file where new score file entries will go is called the
+@dfn{home score file}.  This is normally (and by default) the score file
+for the group itself.  For instance, the home score file for
+@samp{gnu.emacs.gnus} is @file{gnu.emacs.gnus.SCORE}.
+
+However, this may not be what you want.  It is often convenient to share
+a common home score file among many groups---all @samp{emacs} groups
+could perhaps use the same home score file.
+
+@vindex gnus-home-score-file
+The variable that controls this is @code{gnus-home-score-file}.  It can
+be:
+
+@enumerate
+@item
+A string.  Then this file will be used as the home score file for all
+groups.
+
+@item
+A function.  The result of this function will be used as the home score
+file.  The function will be called with the name of the group as the
+parameter.
+
+@item
+A list.  The elements in this list can be:
+
+@enumerate
+@item
+@code{(@var{regexp} @var{file-name})}.  If the @var{regexp} matches the
+group name, the @var{file-name} will be used as the home score file.
+
+@item
+A function.  If the function returns non-@code{nil}, the result will
+be used as the home score file.  The function will be called with the
+name of the group as the parameter.
+
+@item
+A string.  Use the string as the home score file.
+@end enumerate
+
+The list will be traversed from the beginning towards the end looking
+for matches.
+
+@end enumerate
+
+So, if you want to use just a single score file, you could say:
+
+@lisp
+(setq gnus-home-score-file
+      "my-total-score-file.SCORE")
+@end lisp
+
+If you want to use @file{gnu.SCORE} for all @samp{gnu} groups and
+@file{rec.SCORE} for all @samp{rec} groups (and so on), you can say:
+
+@findex gnus-hierarchial-home-score-file
+@lisp
+(setq gnus-home-score-file
+      'gnus-hierarchial-home-score-file)
+@end lisp
+
+This is a ready-made function provided for your convenience.
+Other functions include
+
+@table @code
+@item gnus-current-home-score-file
+@findex gnus-current-home-score-file
+Return the ``current'' regular score file.  This will make scoring
+commands add entry to the ``innermost'' matching score file.
+
+@end table
+
+If you want to have one score file for the @samp{emacs} groups and
+another for the @samp{comp} groups, while letting all other groups use
+their own home score files:
+
+@lisp
+(setq gnus-home-score-file
+      ;; @r{All groups that match the regexp @code{"\\.emacs"}}
+      '(("\\.emacs" "emacs.SCORE")
+        ;; @r{All the comp groups in one score file}
+        ("^comp" "comp.SCORE")))
+@end lisp
+
+@vindex gnus-home-adapt-file
+@code{gnus-home-adapt-file} works exactly the same way as
+@code{gnus-home-score-file}, but says what the home adaptive score file
+is instead.  All new adaptive file entries will go into the file
+specified by this variable, and the same syntax is allowed.
+
+In addition to using @code{gnus-home-score-file} and
+@code{gnus-home-adapt-file}, you can also use group parameters
+(@pxref{Group Parameters}) and topic parameters (@pxref{Topic
+Parameters}) to achieve much the same.  Group and topic parameters take
+precedence over this variable.
+
+
+@node Followups To Yourself
+@section Followups To Yourself
+
+Gnus offers two commands for picking out the @code{Message-ID} header in
+the current buffer.  Gnus will then add a score rule that scores using
+this @code{Message-ID} on the @code{References} header of other
+articles.  This will, in effect, increase the score of all articles that
+respond to the article in the current buffer.  Quite useful if you want
+to easily note when people answer what you've said.
+
+@table @code
+
+@item gnus-score-followup-article
+@findex gnus-score-followup-article
+This will add a score to articles that directly follow up your own
+article.
+
+@item gnus-score-followup-thread
+@findex gnus-score-followup-thread
+This will add a score to all articles that appear in a thread ``below''
+your own article.
+@end table
+
+@vindex message-sent-hook
+These two functions are both primarily meant to be used in hooks like
+@code{message-sent-hook}, like this:
+@lisp
+(add-hook 'message-sent-hook 'gnus-score-followup-thread)
+@end lisp
+
+
+If you look closely at your own @code{Message-ID}, you'll notice that
+the first two or three characters are always the same.  Here's two of
+mine:
+
+@example
+<x6u3u47icf.fsf@@eyesore.no>
+<x6sp9o7ibw.fsf@@eyesore.no>
+@end example
+
+So ``my'' ident on this machine is @samp{x6}.  This can be
+exploited---the following rule will raise the score on all followups to
+myself:
+
+@lisp
+("references"
+ ("<x6[0-9a-z]+\\.fsf\\(_-_\\)?@@.*eyesore\\.no>"
+  1000 nil r))
+@end lisp
+
+Whether it's the first two or first three characters that are ``yours''
+is system-dependent.
+
+
+@node Scoring On Other Headers
+@section Scoring On Other Headers
+@cindex scoring on other headers
+
+Gnus is quite fast when scoring the ``traditional''
+headers---@samp{From}, @samp{Subject} and so on.  However, scoring
+other headers requires writing a @code{head} scoring rule, which means
+that Gnus has to request every single article from the back end to find
+matches.  This takes a long time in big groups.
+
+Now, there's not much you can do about this for news groups, but for
+mail groups, you have greater control.  In @ref{To From Newsgroups},
+it's explained in greater detail what this mechanism does, but here's
+a cookbook example for @code{nnml} on how to allow scoring on the
+@samp{To} and @samp{Cc} headers.
+
+Put the following in your @file{~/.gnus.el} file.
+
+@lisp
+(setq gnus-extra-headers '(To Cc Newsgroups Keywords)
+      nnmail-extra-headers gnus-extra-headers)
+@end lisp
+
+Restart Gnus and rebuild your @code{nnml} overview files with the
+@kbd{M-x nnml-generate-nov-databases} command.  This will take a long
+time if you have much mail.
+
+Now you can score on @samp{To} and @samp{Cc} as ``extra headers'' like
+so: @kbd{I e s p To RET <your name> RET}.
+
+See?  Simple.
+
+
+@node Scoring Tips
+@section Scoring Tips
+@cindex scoring tips
+
+@table @dfn
+
+@item Crossposts
+@cindex crossposts
+@cindex scoring crossposts
+If you want to lower the score of crossposts, the line to match on is
+the @code{Xref} header.
+@lisp
+("xref" (" talk.politics.misc:" -1000))
+@end lisp
+
+@item Multiple crossposts
+If you want to lower the score of articles that have been crossposted to
+more than, say, 3 groups:
+@lisp
+("xref"
+  ("[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+"
+   -1000 nil r))
+@end lisp
+
+@item Matching on the body
+This is generally not a very good idea---it takes a very long time.
+Gnus actually has to fetch each individual article from the server.  But
+you might want to anyway, I guess.  Even though there are three match
+keys (@code{Head}, @code{Body} and @code{All}), you should choose one
+and stick with it in each score file.  If you use any two, each article
+will be fetched @emph{twice}.  If you want to match a bit on the
+@code{Head} and a bit on the @code{Body}, just use @code{All} for all
+the matches.
+
+@item Marking as read
+You will probably want to mark articles that have scores below a certain
+number as read.  This is most easily achieved by putting the following
+in your @file{all.SCORE} file:
+@lisp
+((mark -100))
+@end lisp
+You may also consider doing something similar with @code{expunge}.
+
+@item Negated character classes
+If you say stuff like @code{[^abcd]*}, you may get unexpected results.
+That will match newlines, which might lead to, well, The Unknown.  Say
+@code{[^abcd\n]*} instead.
+@end table
+
+
+@node Reverse Scoring
+@section Reverse Scoring
+@cindex reverse scoring
+
+If you want to keep just articles that have @samp{Sex with Emacs} in the
+subject header, and expunge all other articles, you could put something
+like this in your score file:
+
+@lisp
+(("subject"
+  ("Sex with Emacs" 2))
+ (mark 1)
+ (expunge 1))
+@end lisp
+
+So, you raise all articles that match @samp{Sex with Emacs} and mark the
+rest as read, and expunge them to boot.
+
+
+@node Global Score Files
+@section Global Score Files
+@cindex global score files
+
+Sure, other newsreaders have ``global kill files''.  These are usually
+nothing more than a single kill file that applies to all groups, stored
+in the user's home directory.  Bah!  Puny, weak newsreaders!
+
+What I'm talking about here are Global Score Files.  Score files from
+all over the world, from users everywhere, uniting all nations in one
+big, happy score file union!  Ange-score!  New and untested!
+
+@vindex gnus-global-score-files
+All you have to do to use other people's score files is to set the
+@code{gnus-global-score-files} variable.  One entry for each score file,
+or each score file directory.  Gnus will decide by itself what score
+files are applicable to which group.
+
+To use the score file
+@file{/ftp@@ftp.gnus.org:/pub/larsi/ding/score/soc.motss.SCORE} and
+all score files in the @file{/ftp@@ftp.some-where:/pub/score} directory,
+say this:
+
+@lisp
+(setq gnus-global-score-files
+      '("/ftp@@ftp.gnus.org:/pub/larsi/ding/score/soc.motss.SCORE"
+        "/ftp@@ftp.some-where:/pub/score/"))
+@end lisp
+
+@findex gnus-score-search-global-directories
+@noindent
+Simple, eh?  Directory names must end with a @samp{/}.  These
+directories are typically scanned only once during each Gnus session.
+If you feel the need to manually re-scan the remote directories, you can
+use the @code{gnus-score-search-global-directories} command.
+
+Note that, at present, using this option will slow down group entry
+somewhat.  (That is---a lot.)
+
+If you want to start maintaining score files for other people to use,
+just put your score file up for anonymous ftp and announce it to the
+world.  Become a retro-moderator!  Participate in the retro-moderator
+wars sure to ensue, where retro-moderators battle it out for the
+sympathy of the people, luring them to use their score files on false
+premises!  Yay!  The net is saved!
+
+Here are some tips for the would-be retro-moderator, off the top of my
+head:
+
+@itemize @bullet
+
+@item
+Articles heavily crossposted are probably junk.
+@item
+To lower a single inappropriate article, lower by @code{Message-ID}.
+@item
+Particularly brilliant authors can be raised on a permanent basis.
+@item
+Authors that repeatedly post off-charter for the group can safely be
+lowered out of existence.
+@item
+Set the @code{mark} and @code{expunge} atoms to obliterate the nastiest
+articles completely.
+
+@item
+Use expiring score entries to keep the size of the file down.  You
+should probably have a long expiry period, though, as some sites keep
+old articles for a long time.
+@end itemize
+
+@dots{} I wonder whether other newsreaders will support global score files
+in the future.  @emph{Snicker}.  Yup, any day now, newsreaders like Blue
+Wave, xrn and 1stReader are bound to implement scoring.  Should we start
+holding our breath yet?
+
+
+@node Kill Files
+@section Kill Files
+@cindex kill files
+
+Gnus still supports those pesky old kill files.  In fact, the kill file
+entries can now be expiring, which is something I wrote before Daniel
+Quinlan thought of doing score files, so I've left the code in there.
+
+In short, kill processing is a lot slower (and I do mean @emph{a lot})
+than score processing, so it might be a good idea to rewrite your kill
+files into score files.
+
+Anyway, a kill file is a normal @code{emacs-lisp} file.  You can put any
+forms into this file, which means that you can use kill files as some
+sort of primitive hook function to be run on group entry, even though
+that isn't a very good idea.
+
+Normal kill files look like this:
+
+@lisp
+(gnus-kill "From" "Lars Ingebrigtsen")
+(gnus-kill "Subject" "ding")
+(gnus-expunge "X")
+@end lisp
+
+This will mark every article written by me as read, and remove the
+marked articles from the summary buffer.  Very useful, you'll agree.
+
+Other programs use a totally different kill file syntax.  If Gnus
+encounters what looks like a @code{rn} kill file, it will take a stab at
+interpreting it.
+
+Two summary functions for editing a @sc{gnus} kill file:
+
+@table @kbd
+
+@item M-k
+@kindex M-k (Summary)
+@findex gnus-summary-edit-local-kill
+Edit this group's kill file (@code{gnus-summary-edit-local-kill}).
+
+@item M-K
+@kindex M-K (Summary)
+@findex gnus-summary-edit-global-kill
+Edit the general kill file (@code{gnus-summary-edit-global-kill}).
+@end table
+
+Two group mode functions for editing the kill files:
+
+@table @kbd
+
+@item M-k
+@kindex M-k (Group)
+@findex gnus-group-edit-local-kill
+Edit this group's kill file (@code{gnus-group-edit-local-kill}).
+
+@item M-K
+@kindex M-K (Group)
+@findex gnus-group-edit-global-kill
+Edit the general kill file (@code{gnus-group-edit-global-kill}).
+@end table
+
+Kill file variables:
+
+@table @code
+@item gnus-kill-file-name
+@vindex gnus-kill-file-name
+A kill file for the group @samp{soc.motss} is normally called
+@file{soc.motss.KILL}.  The suffix appended to the group name to get
+this file name is detailed by the @code{gnus-kill-file-name} variable.
+The ``global'' kill file (not in the score file sense of ``global'', of
+course) is just called @file{KILL}.
+
+@vindex gnus-kill-save-kill-file
+@item gnus-kill-save-kill-file
+If this variable is non-@code{nil}, Gnus will save the
+kill file after processing, which is necessary if you use expiring
+kills.
+
+@item gnus-apply-kill-hook
+@vindex gnus-apply-kill-hook
+@findex gnus-apply-kill-file-unless-scored
+@findex gnus-apply-kill-file
+A hook called to apply kill files to a group.  It is
+@code{(gnus-apply-kill-file)} by default.  If you want to ignore the
+kill file if you have a score file for the same group, you can set this
+hook to @code{(gnus-apply-kill-file-unless-scored)}.  If you don't want
+kill files to be processed, you should set this variable to @code{nil}.
+
+@item gnus-kill-file-mode-hook
+@vindex gnus-kill-file-mode-hook
+A hook called in kill-file mode buffers.
+
+@end table
+
+
+@node Converting Kill Files
+@section Converting Kill Files
+@cindex kill files
+@cindex converting kill files
+
+If you have loads of old kill files, you may want to convert them into
+score files.  If they are ``regular'', you can use
+the @file{gnus-kill-to-score.el} package; if not, you'll have to do it
+by hand.
+
+The kill to score conversion package isn't included in Gnus by default.
+You can fetch it from
+@uref{http://www.stud.ifi.uio.no/~larsi/ding-various/gnus-kill-to-score.el}.
+
+If your old kill files are very complex---if they contain more
+non-@code{gnus-kill} forms than not, you'll have to convert them by
+hand.  Or just let them be as they are.  Gnus will still use them as
+before.
+
+
+@node GroupLens
+@section GroupLens
+@cindex GroupLens
+
+@sc{Note:} Unfortunately the GroupLens system seems to have shut down,
+so this section is mostly of historical interest.
+
+@uref{http://www.cs.umn.edu/Research/GroupLens/, GroupLens} is a
+collaborative filtering system that helps you work together with other
+people to find the quality news articles out of the huge volume of
+news articles generated every day.
+
+To accomplish this the GroupLens system combines your opinions about
+articles you have already read with the opinions of others who have done
+likewise and gives you a personalized prediction for each unread news
+article.  Think of GroupLens as a matchmaker.  GroupLens watches how you
+rate articles, and finds other people that rate articles the same way.
+Once it has found some people you agree with it tells you, in the form
+of a prediction, what they thought of the article.  You can use this
+prediction to help you decide whether or not you want to read the
+article.
+
+@menu
+* Using GroupLens::             How to make Gnus use GroupLens.
+* Rating Articles::             Letting GroupLens know how you rate articles.
+* Displaying Predictions::      Displaying predictions given by GroupLens.
+* GroupLens Variables::         Customizing GroupLens.
+@end menu
+
+
+@node Using GroupLens
+@subsection Using GroupLens
+
+To use GroupLens you must register a pseudonym with your local
+@uref{http://www.cs.umn.edu/Research/GroupLens/bbb.html, Better Bit
+Bureau (BBB)} is the only better bit in town at the moment.
+
+Once you have registered you'll need to set a couple of variables.
+
+@table @code
+
+@item gnus-use-grouplens
+@vindex gnus-use-grouplens
+Setting this variable to a non-@code{nil} value will make Gnus hook into
+all the relevant GroupLens functions.
+
+@item grouplens-pseudonym
+@vindex grouplens-pseudonym
+This variable should be set to the pseudonym you got when registering
+with the Better Bit Bureau.
+
+@item grouplens-newsgroups
+@vindex grouplens-newsgroups
+A list of groups that you want to get GroupLens predictions for.
+
+@end table
+
+That's the minimum of what you need to get up and running with GroupLens.
+Once you've registered, GroupLens will start giving you scores for
+articles based on the average of what other people think.  But, to get
+the real benefit of GroupLens you need to start rating articles
+yourself.  Then the scores GroupLens gives you will be personalized for
+you, based on how the people you usually agree with have already rated.
+
+
+@node Rating Articles
+@subsection Rating Articles
+
+In GroupLens, an article is rated on a scale from 1 to 5, inclusive.
+Where 1 means something like this article is a waste of bandwidth and 5
+means that the article was really good.  The basic question to ask
+yourself is, ``on a scale from 1 to 5 would I like to see more articles
+like this one?''
+
+There are four ways to enter a rating for an article in GroupLens.
+
+@table @kbd
+
+@item r
+@kindex r (GroupLens)
+@findex bbb-summary-rate-article
+This function will prompt you for a rating on a scale of one to five.
+
+@item k
+@kindex k (GroupLens)
+@findex grouplens-score-thread
+This function will prompt you for a rating, and rate all the articles in
+the thread.  This is really useful for some of those long running giant
+threads in rec.humor.
+
+@end table
+
+The next two commands, @kbd{n} and @kbd{,} take a numerical prefix to be
+the score of the article you're reading.
+
+@table @kbd
+
+@item 1-5 n
+@kindex n (GroupLens)
+@findex grouplens-next-unread-article
+Rate the article and go to the next unread article.
+
+@item 1-5 ,
+@kindex , (GroupLens)
+@findex grouplens-best-unread-article
+Rate the article and go to the next unread article with the highest score.
+
+@end table
+
+If you want to give the current article a score of 4 and then go to the
+next article, just type @kbd{4 n}.
+
+
+@node Displaying Predictions
+@subsection Displaying Predictions
+
+GroupLens makes a prediction for you about how much you will like a
+news article.  The predictions from GroupLens are on a scale from 1 to
+5, where 1 is the worst and 5 is the best.  You can use the predictions
+from GroupLens in one of three ways controlled by the variable
+@code{gnus-grouplens-override-scoring}.
+
+@vindex gnus-grouplens-override-scoring
+There are three ways to display predictions in grouplens.  You may
+choose to have the GroupLens scores contribute to, or override the
+regular Gnus scoring mechanism.  override is the default; however, some
+people prefer to see the Gnus scores plus the grouplens scores.  To get
+the separate scoring behavior you need to set
+@code{gnus-grouplens-override-scoring} to @code{'separate}.  To have the
+GroupLens predictions combined with the grouplens scores set it to
+@code{'override} and to combine the scores set
+@code{gnus-grouplens-override-scoring} to @code{'combine}.  When you use
+the combine option you will also want to set the values for
+@code{grouplens-prediction-offset} and
+@code{grouplens-score-scale-factor}.
+
+@vindex grouplens-prediction-display
+In either case, GroupLens gives you a few choices for how you would like
+to see your predictions displayed.  The display of predictions is
+controlled by the @code{grouplens-prediction-display} variable.
+
+The following are valid values for that variable.
+
+@table @code
+@item prediction-spot
+The higher the prediction, the further to the right an @samp{*} is
+displayed.
+
+@item confidence-interval
+A numeric confidence interval.
+
+@item prediction-bar
+The higher the prediction, the longer the bar.
+
+@item confidence-bar
+Numerical confidence.
+
+@item confidence-spot
+The spot gets bigger with more confidence.
+
+@item prediction-num
+Plain-old numeric value.
+
+@item confidence-plus-minus
+Prediction +/- confidence.
+
+@end table
+
+
+@node GroupLens Variables
+@subsection GroupLens Variables
+
+@table @code
+
+@item gnus-summary-grouplens-line-format
+The summary line format used in GroupLens-enhanced summary buffers.  It
+accepts the same specs as the normal summary line format (@pxref{Summary
+Buffer Lines}).  The default is @samp{%U%R%z%l%I%(%[%4L: %-23,23n%]%)
+%s\n}.
+
+@item grouplens-bbb-host
+Host running the bbbd server.  @samp{grouplens.cs.umn.edu} is the
+default.
+
+@item grouplens-bbb-port
+Port of the host running the bbbd server.  The default is 9000.
+
+@item grouplens-score-offset
+Offset the prediction by this value.  In other words, subtract the
+prediction value by this number to arrive at the effective score.  The
+default is 0.
+
+@item grouplens-score-scale-factor
+This variable allows the user to magnify the effect of GroupLens scores.
+The scale factor is applied after the offset.  The default is 1.
+
+@end table
+
+
+@node Advanced Scoring
+@section Advanced Scoring
+
+Scoring on Subjects and From headers is nice enough, but what if you're
+really interested in what a person has to say only when she's talking
+about a particular subject?  Or what if you really don't want to
+read what person A has to say when she's following up to person B, but
+want to read what she says when she's following up to person C?
+
+By using advanced scoring rules you may create arbitrarily complex
+scoring patterns.
+
+@menu
+* Advanced Scoring Syntax::     A definition.
+* Advanced Scoring Examples::   What they look like.
+* Advanced Scoring Tips::       Getting the most out of it.
+@end menu
+
+
+@node Advanced Scoring Syntax
+@subsection Advanced Scoring Syntax
+
+Ordinary scoring rules have a string as the first element in the rule.
+Advanced scoring rules have a list as the first element.  The second
+element is the score to be applied if the first element evaluated to a
+non-@code{nil} value.
+
+These lists may consist of three logical operators, one redirection
+operator, and various match operators.
+
+Logical operators:
+
+@table @code
+@item &
+@itemx and
+This logical operator will evaluate each of its arguments until it finds
+one that evaluates to @code{false}, and then it'll stop.  If all arguments
+evaluate to @code{true} values, then this operator will return
+@code{true}.
+
+@item |
+@itemx or
+This logical operator will evaluate each of its arguments until it finds
+one that evaluates to @code{true}.  If no arguments are @code{true},
+then this operator will return @code{false}.
+
+@item !
+@itemx not
+@itemx Â¬
+This logical operator only takes a single argument.  It returns the
+logical negation of the value of its argument.
+
+@end table
+
+There is an @dfn{indirection operator} that will make its arguments
+apply to the ancestors of the current article being scored.  For
+instance, @code{1-} will make score rules apply to the parent of the
+current article.  @code{2-} will make score rules apply to the
+grandparent of the current article.  Alternatively, you can write
+@code{^^}, where the number of @code{^}s (carets) says how far back into
+the ancestry you want to go.
+
+Finally, we have the match operators.  These are the ones that do the
+real work.  Match operators are header name strings followed by a match
+and a match type.  A typical match operator looks like @samp{("from"
+"Lars Ingebrigtsen" s)}.  The header names are the same as when using
+simple scoring, and the match types are also the same.
+
+
+@node Advanced Scoring Examples
+@subsection Advanced Scoring Examples
+
+Please note that the following examples are score file rules.  To
+make a complete score file from them, surround them with another pair
+of parentheses.
+
+Let's say you want to increase the score of articles written by Lars
+when he's talking about Gnus:
+
+@example
+@group
+((&
+  ("from" "Lars Ingebrigtsen")
+  ("subject" "Gnus"))
+ 1000)
+@end group
+@end example
+
+Quite simple, huh?
+
+When he writes long articles, he sometimes has something nice to say:
+
+@example
+((&
+  ("from" "Lars Ingebrigtsen")
+  (|
+   ("subject" "Gnus")
+   ("lines" 100 >)))
+ 1000)
+@end example
+
+However, when he responds to things written by Reig Eigil Logge, you
+really don't want to read what he's written:
+
+@example
+((&
+  ("from" "Lars Ingebrigtsen")
+  (1- ("from" "Reig Eigil Logge")))
+ -100000)
+@end example
+
+Everybody that follows up Redmondo when he writes about disappearing
+socks should have their scores raised, but only when they talk about
+white socks.  However, when Lars talks about socks, it's usually not
+very interesting:
+
+@example
+((&
+  (1-
+   (&
+    ("from" "redmondo@@.*no" r)
+    ("body" "disappearing.*socks" t)))
+  (! ("from" "Lars Ingebrigtsen"))
+  ("body" "white.*socks"))
+ 1000)
+@end example
+
+Suppose you're reading a high volume group and you're only interested
+in replies. The plan is to score down all articles that don't have
+subject that begin with "Re:", "Fw:" or "Fwd:" and then score up all
+parents of articles that have subjects that begin with reply marks.
+
+@example
+((! ("subject" "re:\\|fwd?:" r))
+  -200)
+((1- ("subject" "re:\\|fwd?:" r))
+  200)
+@end example
+
+The possibilities are endless.
+
+@node Advanced Scoring Tips
+@subsection Advanced Scoring Tips
+
+The @code{&} and @code{|} logical operators do short-circuit logic.
+That is, they stop processing their arguments when it's clear what the
+result of the operation will be.  For instance, if one of the arguments
+of an @code{&} evaluates to @code{false}, there's no point in evaluating
+the rest of the arguments.  This means that you should put slow matches
+(@samp{body}, @samp{header}) last and quick matches (@samp{from},
+@samp{subject}) first.
+
+The indirection arguments (@code{1-} and so on) will make their
+arguments work on previous generations of the thread.  If you say
+something like:
+
+@example
+...
+(1-
+ (1-
+  ("from" "lars")))
+...
+@end example
+
+Then that means ``score on the from header of the grandparent of the
+current article''.  An indirection is quite fast, but it's better to say:
+
+@example
+(1-
+ (&
+  ("from" "Lars")
+  ("subject" "Gnus")))
+@end example
+
+than it is to say:
+
+@example
+(&
+ (1- ("from" "Lars"))
+ (1- ("subject" "Gnus")))
+@end example
+
+
+@node Score Decays
+@section Score Decays
+@cindex score decays
+@cindex decays
+
+You may find that your scores have a tendency to grow without
+bounds, especially if you're using adaptive scoring.  If scores get too
+big, they lose all meaning---they simply max out and it's difficult to
+use them in any sensible way.
+
+@vindex gnus-decay-scores
+@findex gnus-decay-score
+@vindex gnus-decay-score-function
+Gnus provides a mechanism for decaying scores to help with this problem.
+When score files are loaded and @code{gnus-decay-scores} is
+non-@code{nil}, Gnus will run the score files through the decaying
+mechanism thereby lowering the scores of all non-permanent score rules.
+The decay itself if performed by the @code{gnus-decay-score-function}
+function, which is @code{gnus-decay-score} by default.  Here's the
+definition of that function:
+
+@lisp
+(defun gnus-decay-score (score)
+  "Decay SCORE according to `gnus-score-decay-constant'
+and `gnus-score-decay-scale'."
+  (let ((n (- score
+              (* (if (< score 0) -1 1)
+                 (min (abs score)
+                      (max gnus-score-decay-constant
+                           (* (abs score)
+                              gnus-score-decay-scale)))))))
+    (if (and (featurep 'xemacs)
+             ;; XEmacs' floor can handle only the floating point
+             ;; number below the half of the maximum integer.
+             (> (abs n) (lsh -1 -2)))
+        (string-to-number
+         (car (split-string (number-to-string n) "\\.")))
+      (floor n))))
+@end lisp
+
+@vindex gnus-score-decay-scale
+@vindex gnus-score-decay-constant
+@code{gnus-score-decay-constant} is 3 by default and
+@code{gnus-score-decay-scale} is 0.05.  This should cause the following:
+
+@enumerate
+@item
+Scores between -3 and 3 will be set to 0 when this function is called.
+
+@item
+Scores with magnitudes between 3 and 60 will be shrunk by 3.
+
+@item
+Scores with magnitudes greater than 60 will be shrunk by 5% of the
+score.
+@end enumerate
+
+If you don't like this decay function, write your own.  It is called
+with the score to be decayed as its only parameter, and it should return
+the new score, which should be an integer.
+
+Gnus will try to decay scores once a day.  If you haven't run Gnus for
+four days, Gnus will decay the scores four times, for instance.
+
+@iftex
+@iflatex
+@chapter Message
+@include message.texi
+@chapter Emacs MIME
+@include emacs-mime.texi
+@chapter Sieve
+@include sieve.texi
+@chapter PGG
+@include pgg.texi
+@end iflatex
+@end iftex
+
+@node Various
+@chapter Various
+
+@menu
+* Process/Prefix::              A convention used by many treatment commands.
+* Interactive::                 Making Gnus ask you many questions.
+* Symbolic Prefixes::           How to supply some Gnus functions with options.
+* Formatting Variables::        You can specify what buffers should look like.
+* Window Layout::               Configuring the Gnus buffer windows.
+* Faces and Fonts::             How to change how faces look.
+* Compilation::                 How to speed Gnus up.
+* Mode Lines::                  Displaying information in the mode lines.
+* Highlighting and Menus::      Making buffers look all nice and cozy.
+* Buttons::                     Get tendinitis in ten easy steps!
+* Daemons::                     Gnus can do things behind your back.
+* NoCeM::                       How to avoid spam and other fatty foods.
+* Undo::                        Some actions can be undone.
+* Predicate Specifiers::        Specifying predicates.
+* Moderation::                  What to do if you're a moderator.
+* Fetching a Group::            Starting Gnus just to read a group.
+* Image Enhancements::          Modern versions of Emacs/XEmacs can display images.
+* Fuzzy Matching::              What's the big fuzz?
+* Thwarting Email Spam::        Simple ways to avoid unsolicited commercial email.
+* Spam Package::                A package for filtering and processing spam.
+* Other modes::                 Interaction with other modes.
+* Various Various::             Things that are really various.
+@end menu
+
+
+@node Process/Prefix
+@section Process/Prefix
+@cindex process/prefix convention
+
+Many functions, among them functions for moving, decoding and saving
+articles, use what is known as the @dfn{Process/Prefix convention}.
+
+This is a method for figuring out what articles the user wants the
+command to be performed on.
+
+It goes like this:
+
+If the numeric prefix is N, perform the operation on the next N
+articles, starting with the current one.  If the numeric prefix is
+negative, perform the operation on the previous N articles, starting
+with the current one.
+
+@vindex transient-mark-mode
+If @code{transient-mark-mode} in non-@code{nil} and the region is
+active, all articles in the region will be worked upon.
+
+If there is no numeric prefix, but some articles are marked with the
+process mark, perform the operation on the articles marked with
+the process mark.
+
+If there is neither a numeric prefix nor any articles marked with the
+process mark, just perform the operation on the current article.
+
+Quite simple, really, but it needs to be made clear so that surprises
+are avoided.
+
+Commands that react to the process mark will push the current list of
+process marked articles onto a stack and will then clear all process
+marked articles.  You can restore the previous configuration with the
+@kbd{M P y} command (@pxref{Setting Process Marks}).
+
+@vindex gnus-summary-goto-unread
+One thing that seems to shock & horrify lots of people is that, for
+instance, @kbd{3 d} does exactly the same as @kbd{d} @kbd{d} @kbd{d}.
+Since each @kbd{d} (which marks the current article as read) by default
+goes to the next unread article after marking, this means that @kbd{3 d}
+will mark the next three unread articles as read, no matter what the
+summary buffer looks like.  Set @code{gnus-summary-goto-unread} to
+@code{nil} for a more straightforward action.
+
+Many commands do not use the process/prefix convention.  All commands
+that do explicitly say so in this manual.  To apply the process/prefix
+convention to commands that do not use it, you can use the @kbd{M-&}
+command.  For instance, to mark all the articles in the group as
+expirable, you could say @kbd{M P b M-& E}.
+
+
+@node Interactive
+@section Interactive
+@cindex interaction
+
+@table @code
+
+@item gnus-novice-user
+@vindex gnus-novice-user
+If this variable is non-@code{nil}, you are either a newcomer to the
+World of Usenet, or you are very cautious, which is a nice thing to be,
+really.  You will be given questions of the type ``Are you sure you want
+to do this?'' before doing anything dangerous.  This is @code{t} by
+default.
+
+@item gnus-expert-user
+@vindex gnus-expert-user
+If this variable is non-@code{nil}, you will seldom be asked any
+questions by Gnus.  It will simply assume you know what you're doing, no
+matter how strange.
+
+@item gnus-interactive-catchup
+@vindex gnus-interactive-catchup
+Require confirmation before catching up a group if non-@code{nil}.  It
+is @code{t} by default.
+
+@item gnus-interactive-exit
+@vindex gnus-interactive-exit
+Require confirmation before exiting Gnus.  This variable is @code{t} by
+default.
+@end table
+
+
+@node Symbolic Prefixes
+@section Symbolic Prefixes
+@cindex symbolic prefixes
+
+Quite a lot of Emacs commands react to the (numeric) prefix.  For
+instance, @kbd{C-u 4 C-f} moves point four characters forward, and
+@kbd{C-u 9 0 0 I s s p} adds a permanent @code{Subject} substring score
+rule of 900 to the current article.
+
+This is all nice and well, but what if you want to give a command some
+additional information?  Well, what most commands do is interpret the
+``raw'' prefix in some special way.  @kbd{C-u 0 C-x C-s} means that one
+doesn't want a backup file to be created when saving the current buffer,
+for instance.  But what if you want to save without making a backup
+file, and you want Emacs to flash lights and play a nice tune at the
+same time?  You can't, and you're probably perfectly happy that way.
+
+@kindex M-i (Summary)
+@findex gnus-symbolic-argument
+I'm not, so I've added a second prefix---the @dfn{symbolic prefix}.  The
+prefix key is @kbd{M-i} (@code{gnus-symbolic-argument}), and the next
+character typed in is the value.  You can stack as many @kbd{M-i}
+prefixes as you want.  @kbd{M-i a C-M-u} means ``feed the @kbd{C-M-u}
+command the symbolic prefix @code{a}''.  @kbd{M-i a M-i b C-M-u} means
+``feed the @kbd{C-M-u} command the symbolic prefixes @code{a} and
+@code{b}''.  You get the drift.
+
+Typing in symbolic prefixes to commands that don't accept them doesn't
+hurt, but it doesn't do any good either.  Currently not many Gnus
+functions make use of the symbolic prefix.
+
+If you're interested in how Gnus implements this, @pxref{Extended
+Interactive}.
+
+
+@node Formatting Variables
+@section Formatting Variables
+@cindex formatting variables
+
+Throughout this manual you've probably noticed lots of variables called
+things like @code{gnus-group-line-format} and
+@code{gnus-summary-mode-line-format}.  These control how Gnus is to
+output lines in the various buffers.  There's quite a lot of them.
+Fortunately, they all use the same syntax, so there's not that much to
+be annoyed by.
+
+Here's an example format spec (from the group buffer): @samp{%M%S%5y:
+%(%g%)\n}.  We see that it is indeed extremely ugly, and that there are
+lots of percentages everywhere.
+
+@menu
+* Formatting Basics::           A formatting variable is basically a format string.
+* Mode Line Formatting::        Some rules about mode line formatting variables.
+* Advanced Formatting::         Modifying output in various ways.
+* User-Defined Specs::          Having Gnus call your own functions.
+* Formatting Fonts::            Making the formatting look colorful and nice.
+* Positioning Point::           Moving point to a position after an operation.
+* Tabulation::                  Tabulating your output.
+* Wide Characters::             Dealing with wide characters.
+@end menu
+
+Currently Gnus uses the following formatting variables:
+@code{gnus-group-line-format}, @code{gnus-summary-line-format},
+@code{gnus-server-line-format}, @code{gnus-topic-line-format},
+@code{gnus-group-mode-line-format},
+@code{gnus-summary-mode-line-format},
+@code{gnus-article-mode-line-format},
+@code{gnus-server-mode-line-format}, and
+@code{gnus-summary-pick-line-format}.
+
+All these format variables can also be arbitrary elisp forms.  In that
+case, they will be @code{eval}ed to insert the required lines.
+
+@kindex M-x gnus-update-format
+@findex gnus-update-format
+Gnus includes a command to help you while creating your own format
+specs.  @kbd{M-x gnus-update-format} will @code{eval} the current form,
+update the spec in question and pop you to a buffer where you can
+examine the resulting Lisp code to be run to generate the line.
+
+
+
+@node Formatting Basics
+@subsection Formatting Basics
+
+Each @samp{%} element will be replaced by some string or other when the
+buffer in question is generated.  @samp{%5y} means ``insert the @samp{y}
+spec, and pad with spaces to get a 5-character field''.
+
+As with normal C and Emacs Lisp formatting strings, the numerical
+modifier between the @samp{%} and the formatting type character will
+@dfn{pad} the output so that it is always at least that long.
+@samp{%5y} will make the field always (at least) five characters wide by
+padding with spaces to the left.  If you say @samp{%-5y}, it will pad to
+the right instead.
+
+You may also wish to limit the length of the field to protect against
+particularly wide values.  For that you can say @samp{%4,6y}, which
+means that the field will never be more than 6 characters wide and never
+less than 4 characters wide.
+
+Also Gnus supports some extended format specifications, such as
+@samp{%&user-date;}.
+
+
+@node Mode Line Formatting
+@subsection Mode Line Formatting
+
+Mode line formatting variables (e.g.,
+@code{gnus-summary-mode-line-format}) follow the same rules as other,
+buffer line oriented formatting variables (@pxref{Formatting Basics})
+with the following two differences:
+
+@enumerate
+
+@item
+There must be no newline (@samp{\n}) at the end.
+
+@item
+The special @samp{%%b} spec can be used to display the buffer name.
+Well, it's no spec at all, really---@samp{%%} is just a way to quote
+@samp{%} to allow it to pass through the formatting machinery unmangled,
+so that Emacs receives @samp{%b}, which is something the Emacs mode line
+display interprets to mean ``show the buffer name''.  For a full list of
+mode line specs Emacs understands, see the documentation of the
+@code{mode-line-format} variable.
+
+@end enumerate
+
+
+@node Advanced Formatting
+@subsection Advanced Formatting
+
+It is frequently useful to post-process the fields in some way.
+Padding, limiting, cutting off parts and suppressing certain values can
+be achieved by using @dfn{tilde modifiers}.  A typical tilde spec might
+look like @samp{%~(cut 3)~(ignore "0")y}.
+
+These are the valid modifiers:
+
+@table @code
+@item pad
+@itemx pad-left
+Pad the field to the left with spaces until it reaches the required
+length.
+
+@item pad-right
+Pad the field to the right with spaces until it reaches the required
+length.
+
+@item max
+@itemx max-left
+Cut off characters from the left until it reaches the specified length.
+
+@item max-right
+Cut off characters from the right until it reaches the specified
+length.
+
+@item cut
+@itemx cut-left
+Cut off the specified number of characters from the left.
+
+@item cut-right
+Cut off the specified number of characters from the right.
+
+@item ignore
+Return an empty string if the field is equal to the specified value.
+
+@item form
+Use the specified form as the field value when the @samp{@@} spec is
+used.
+
+Here's an example:
+
+@lisp
+"~(form (current-time-string))@@"
+@end lisp
+
+@end table
+
+Let's take an example.  The @samp{%o} spec in the summary mode lines
+will return a date in compact ISO8601 format---@samp{19960809T230410}.
+This is quite a mouthful, so we want to shave off the century number and
+the time, leaving us with a six-character date.  That would be
+@samp{%~(cut-left 2)~(max-right 6)~(pad 6)o}.  (Cutting is done before
+maxing, and we need the padding to ensure that the date is never less
+than 6 characters to make it look nice in columns.)
+
+Ignoring is done first; then cutting; then maxing; and then as the very
+last operation, padding.
+
+If you use lots of these advanced thingies, you'll find that Gnus gets
+quite slow.  This can be helped enormously by running @kbd{M-x
+gnus-compile} when you are satisfied with the look of your lines.
+@xref{Compilation}.
+
+
+@node User-Defined Specs
+@subsection User-Defined Specs
+
+All the specs allow for inserting user defined specifiers---@samp{u}.
+The next character in the format string should be a letter.  Gnus
+will call the function @code{gnus-user-format-function-}@samp{X}, where
+@samp{X} is the letter following @samp{%u}.  The function will be passed
+a single parameter---what the parameter means depends on what buffer
+it's being called from.  The function should return a string, which will
+be inserted into the buffer just like information from any other
+specifier.  This function may also be called with dummy values, so it
+should protect against that.
+
+Also Gnus supports extended user-defined specs, such as @samp{%u&foo;}.
+Gnus will call the function @code{gnus-user-format-function-}@samp{foo}.
+
+You can also use tilde modifiers (@pxref{Advanced Formatting} to achieve
+much the same without defining new functions.  Here's an example:
+@samp{%~(form (count-lines (point-min) (point)))@@}.  The form
+given here will be evaluated to yield the current line number, and then
+inserted.
+
+
+@node Formatting Fonts
+@subsection Formatting Fonts
+
+There are specs for highlighting, and these are shared by all the format
+variables.  Text inside the @samp{%(} and @samp{%)} specifiers will get
+the special @code{mouse-face} property set, which means that it will be
+highlighted (with @code{gnus-mouse-face}) when you put the mouse pointer
+over it.
+
+Text inside the @samp{%@{} and @samp{%@}} specifiers will have their
+normal faces set using @code{gnus-face-0}, which is @code{bold} by
+default.  If you say @samp{%1@{}, you'll get @code{gnus-face-1} instead,
+and so on.  Create as many faces as you wish.  The same goes for the
+@code{mouse-face} specs---you can say @samp{%3(hello%)} to have
+@samp{hello} mouse-highlighted with @code{gnus-mouse-face-3}.
+
+Text inside the @samp{%<<} and @samp{%>>} specifiers will get the
+special @code{balloon-help} property set to
+@code{gnus-balloon-face-0}.  If you say @samp{%1<<}, you'll get
+@code{gnus-balloon-face-1} and so on.  The @code{gnus-balloon-face-*}
+variables should be either strings or symbols naming functions that
+return a string.  When the mouse passes over text with this property
+set, a balloon window will appear and display the string.  Please
+refer to @ref{Tooltips, ,Tooltips, emacs, The Emacs Manual},
+(in GNU Emacs) or the doc string of @code{balloon-help-mode} (in
+XEmacs) for more information on this.  (For technical reasons, the
+guillemets have been approximated as @samp{<<} and @samp{>>} in this
+paragraph.)
+
+Here's an alternative recipe for the group buffer:
+
+@lisp
+;; @r{Create three face types.}
+(setq gnus-face-1 'bold)
+(setq gnus-face-3 'italic)
+
+;; @r{We want the article count to be in}
+;; @r{a bold and green face.  So we create}
+;; @r{a new face called @code{my-green-bold}.}
+(copy-face 'bold 'my-green-bold)
+;; @r{Set the color.}
+(set-face-foreground 'my-green-bold "ForestGreen")
+(setq gnus-face-2 'my-green-bold)
+
+;; @r{Set the new & fancy format.}
+(setq gnus-group-line-format
+      "%M%S%3@{%5y%@}%2[:%] %(%1@{%g%@}%)\n")
+@end lisp
+
+I'm sure you'll be able to use this scheme to create totally unreadable
+and extremely vulgar displays.  Have fun!
+
+Note that the @samp{%(} specs (and friends) do not make any sense on the
+mode-line variables.
+
+@node Positioning Point
+@subsection Positioning Point
+
+Gnus usually moves point to a pre-defined place on each line in most
+buffers.  By default, point move to the first colon character on the
+line.  You can customize this behavior in three different ways.
+
+You can move the colon character to somewhere else on the line.
+
+@findex gnus-goto-colon
+You can redefine the function that moves the point to the colon.  The
+function is called @code{gnus-goto-colon}.
+
+But perhaps the most convenient way to deal with this, if you don't want
+to have a colon in your line, is to use the @samp{%*} specifier.  If you
+put a @samp{%*} somewhere in your format line definition, Gnus will
+place point there.
+
+
+@node Tabulation
+@subsection Tabulation
+
+You can usually line up your displays by padding and cutting your
+strings.  However, when combining various strings of different size, it
+can often be more convenient to just output the strings, and then worry
+about lining up the following text afterwards.
+
+To do that, Gnus supplies tabulator specs---@samp{%=}.  There are two
+different types---@dfn{hard tabulators} and @dfn{soft tabulators}.
+
+@samp{%50=} will insert space characters to pad the line up to column
+50.  If the text is already past column 50, nothing will be inserted.
+This is the soft tabulator.
+
+@samp{%-50=} will insert space characters to pad the line up to column
+50.  If the text is already past column 50, the excess text past column
+50 will be removed.  This is the hard tabulator.
+
+
+@node Wide Characters
+@subsection Wide Characters
+
+Fixed width fonts in most countries have characters of the same width.
+Some countries, however, use Latin characters mixed with wider
+characters---most notable East Asian countries.
+
+The problem is that when formatting, Gnus assumes that if a string is 10
+characters wide, it'll be 10 Latin characters wide on the screen.  In
+these countries, that's not true.
+
+@vindex gnus-use-correct-string-widths
+To help fix this, you can set @code{gnus-use-correct-string-widths} to
+@code{t}.  This makes buffer generation slower, but the results will be
+prettier.  The default value under XEmacs is @code{t} but @code{nil}
+for Emacs.
+
+
+@node Window Layout
+@section Window Layout
+@cindex window layout
+
+No, there's nothing here about X, so be quiet.
+
+@vindex gnus-use-full-window
+If @code{gnus-use-full-window} non-@code{nil}, Gnus will delete all
+other windows and occupy the entire Emacs screen by itself.  It is
+@code{t} by default.
+
+Setting this variable to @code{nil} kinda works, but there are
+glitches.  Use at your own peril.
+
+@vindex gnus-buffer-configuration
+@code{gnus-buffer-configuration} describes how much space each Gnus
+buffer should be given.  Here's an excerpt of this variable:
+
+@lisp
+((group (vertical 1.0 (group 1.0 point)
+                      (if gnus-carpal (group-carpal 4))))
+ (article (vertical 1.0 (summary 0.25 point)
+                        (article 1.0))))
+@end lisp
+
+This is an alist.  The @dfn{key} is a symbol that names some action or
+other.  For instance, when displaying the group buffer, the window
+configuration function will use @code{group} as the key.  A full list of
+possible names is listed below.
+
+The @dfn{value} (i.e., the @dfn{split}) says how much space each buffer
+should occupy.  To take the @code{article} split as an example -
+
+@lisp
+(article (vertical 1.0 (summary 0.25 point)
+                       (article 1.0)))
+@end lisp
+
+This @dfn{split} says that the summary buffer should occupy 25% of upper
+half of the screen, and that it is placed over the article buffer.  As
+you may have noticed, 100% + 25% is actually 125% (yup, I saw y'all
+reaching for that calculator there).  However, the special number
+@code{1.0} is used to signal that this buffer should soak up all the
+rest of the space available after the rest of the buffers have taken
+whatever they need.  There should be only one buffer with the @code{1.0}
+size spec per split.
+
+Point will be put in the buffer that has the optional third element
+@code{point}.  In a @code{frame} split, the last subsplit having a leaf
+split where the tag @code{frame-focus} is a member (i.e. is the third or
+fourth element in the list, depending on whether the @code{point} tag is
+present) gets focus.
+
+Here's a more complicated example:
+
+@lisp
+(article (vertical 1.0 (group 4)
+                       (summary 0.25 point)
+                       (if gnus-carpal (summary-carpal 4))
+                       (article 1.0)))
+@end lisp
+
+If the size spec is an integer instead of a floating point number,
+then that number will be used to say how many lines a buffer should
+occupy, not a percentage.
+
+If the @dfn{split} looks like something that can be @code{eval}ed (to be
+precise---if the @code{car} of the split is a function or a subr), this
+split will be @code{eval}ed.  If the result is non-@code{nil}, it will
+be used as a split.  This means that there will be three buffers if
+@code{gnus-carpal} is @code{nil}, and four buffers if @code{gnus-carpal}
+is non-@code{nil}.
+
+Not complicated enough for you?  Well, try this on for size:
+
+@lisp
+(article (horizontal 1.0
+             (vertical 0.5
+                 (group 1.0)
+                 (gnus-carpal 4))
+             (vertical 1.0
+                 (summary 0.25 point)
+                 (summary-carpal 4)
+                 (article 1.0))))
+@end lisp
+
+Whoops.  Two buffers with the mystery 100% tag.  And what's that
+@code{horizontal} thingie?
+
+If the first element in one of the split is @code{horizontal}, Gnus will
+split the window horizontally, giving you two windows side-by-side.
+Inside each of these strips you may carry on all you like in the normal
+fashion.  The number following @code{horizontal} says what percentage of
+the screen is to be given to this strip.
+
+For each split, there @emph{must} be one element that has the 100% tag.
+The splitting is never accurate, and this buffer will eat any leftover
+lines from the splits.
+
+To be slightly more formal, here's a definition of what a valid split
+may look like:
+
+@example
+@group
+split      = frame | horizontal | vertical | buffer | form
+frame      = "(frame " size *split ")"
+horizontal = "(horizontal " size *split ")"
+vertical   = "(vertical " size *split ")"
+buffer     = "(" buf-name " " size *[ "point" ] *[ "frame-focus"] ")"
+size       = number | frame-params
+buf-name   = group | article | summary ...
+@end group
+@end example
+
+The limitations are that the @code{frame} split can only appear as the
+top-level split.  @var{form} should be an Emacs Lisp form that should
+return a valid split.  We see that each split is fully recursive, and
+may contain any number of @code{vertical} and @code{horizontal} splits.
+
+@vindex gnus-window-min-width
+@vindex gnus-window-min-height
+@cindex window height
+@cindex window width
+Finding the right sizes can be a bit complicated.  No window may be less
+than @code{gnus-window-min-height} (default 1) characters high, and all
+windows must be at least @code{gnus-window-min-width} (default 1)
+characters wide.  Gnus will try to enforce this before applying the
+splits.  If you want to use the normal Emacs window width/height limit,
+you can just set these two variables to @code{nil}.
+
+If you're not familiar with Emacs terminology, @code{horizontal} and
+@code{vertical} splits may work the opposite way of what you'd expect.
+Windows inside a @code{horizontal} split are shown side-by-side, and
+windows within a @code{vertical} split are shown above each other.
+
+@findex gnus-configure-frame
+If you want to experiment with window placement, a good tip is to call
+@code{gnus-configure-frame} directly with a split.  This is the function
+that does all the real work when splitting buffers.  Below is a pretty
+nonsensical configuration with 5 windows; two for the group buffer and
+three for the article buffer.  (I said it was nonsensical.)  If you
+@code{eval} the statement below, you can get an idea of how that would
+look straight away, without going through the normal Gnus channels.
+Play with it until you're satisfied, and then use
+@code{gnus-add-configuration} to add your new creation to the buffer
+configuration list.
+
+@lisp
+(gnus-configure-frame
+ '(horizontal 1.0
+    (vertical 10
+      (group 1.0)
+      (article 0.3 point))
+    (vertical 1.0
+      (article 1.0)
+      (horizontal 4
+        (group 1.0)
+        (article 10)))))
+@end lisp
+
+You might want to have several frames as well.  No prob---just use the
+@code{frame} split:
+
+@lisp
+(gnus-configure-frame
+ '(frame 1.0
+         (vertical 1.0
+                   (summary 0.25 point frame-focus)
+                   (article 1.0))
+         (vertical ((height . 5) (width . 15)
+                    (user-position . t)
+                    (left . -1) (top . 1))
+                   (picon 1.0))))
+
+@end lisp
+
+This split will result in the familiar summary/article window
+configuration in the first (or ``main'') frame, while a small additional
+frame will be created where picons will be shown.  As you can see,
+instead of the normal @code{1.0} top-level spec, each additional split
+should have a frame parameter alist as the size spec.
+@xref{Frame Parameters, , Frame Parameters, elisp, The GNU Emacs Lisp
+Reference Manual}.  Under XEmacs, a frame property list will be
+accepted, too---for instance, @code{(height 5 width 15 left -1 top 1)}
+is such a plist.
+The list of all possible keys for @code{gnus-buffer-configuration} can
+be found in its default value.
+
+Note that the @code{message} key is used for both
+@code{gnus-group-mail} and @code{gnus-summary-mail-other-window}.  If
+it is desirable to distinguish between the two, something like this
+might be used:
+
+@lisp
+(message (horizontal 1.0
+                     (vertical 1.0 (message 1.0 point))
+                     (vertical 0.24
+                               (if (buffer-live-p gnus-summary-buffer)
+                                   '(summary 0.5))
+                               (group 1.0))))
+@end lisp
+
+One common desire for a multiple frame split is to have a separate frame
+for composing mail and news while leaving the original frame intact.  To
+accomplish that, something like the following can be done:
+
+@lisp
+(message
+  (frame 1.0
+         (if (not (buffer-live-p gnus-summary-buffer))
+             (car (cdr (assoc 'group gnus-buffer-configuration)))
+           (car (cdr (assoc 'summary gnus-buffer-configuration))))
+         (vertical ((user-position . t) (top . 1) (left . 1)
+                    (name . "Message"))
+                   (message 1.0 point))))
+@end lisp
+
+@findex gnus-add-configuration
+Since the @code{gnus-buffer-configuration} variable is so long and
+complicated, there's a function you can use to ease changing the config
+of a single setting: @code{gnus-add-configuration}.  If, for instance,
+you want to change the @code{article} setting, you could say:
+
+@lisp
+(gnus-add-configuration
+ '(article (vertical 1.0
+               (group 4)
+               (summary .25 point)
+               (article 1.0))))
+@end lisp
+
+You'd typically stick these @code{gnus-add-configuration} calls in your
+@file{~/.gnus.el} file or in some startup hook---they should be run after
+Gnus has been loaded.
+
+@vindex gnus-always-force-window-configuration
+If all windows mentioned in the configuration are already visible, Gnus
+won't change the window configuration.  If you always want to force the
+``right'' window configuration, you can set
+@code{gnus-always-force-window-configuration} to non-@code{nil}.
+
+If you're using tree displays (@pxref{Tree Display}), and the tree
+window is displayed vertically next to another window, you may also want
+to fiddle with @code{gnus-tree-minimize-window} to avoid having the
+windows resized.
+
+@subsection Example Window Configurations
+
+@itemize @bullet
+@item
+Narrow left hand side occupied by group buffer.  Right hand side split
+between summary buffer (top one-sixth) and article buffer (bottom).
+
+@ifinfo
+@example
++---+---------+
+| G | Summary |
+| r +---------+
+| o |         |
+| u | Article |
+| p |         |
++---+---------+
+@end example
+@end ifinfo
+
+@lisp
+(gnus-add-configuration
+ '(article
+   (horizontal 1.0
+               (vertical 25 (group 1.0))
+               (vertical 1.0
+                         (summary 0.16 point)
+                         (article 1.0)))))
+
+(gnus-add-configuration
+ '(summary
+   (horizontal 1.0
+               (vertical 25 (group 1.0))
+               (vertical 1.0 (summary 1.0 point)))))
+@end lisp
+
+@end itemize
+
+
+@node Faces and Fonts
+@section Faces and Fonts
+@cindex faces
+@cindex fonts
+@cindex colors
+
+Fiddling with fonts and faces used to be very difficult, but these days
+it is very simple.  You simply say @kbd{M-x customize-face}, pick out
+the face you want to alter, and alter it via the standard Customize
+interface.
+
+
+@node Compilation
+@section Compilation
+@cindex compilation
+@cindex byte-compilation
+
+@findex gnus-compile
+
+Remember all those line format specification variables?
+@code{gnus-summary-line-format}, @code{gnus-group-line-format}, and so
+on.  Now, Gnus will of course heed whatever these variables are, but,
+unfortunately, changing them will mean a quite significant slow-down.
+(The default values of these variables have byte-compiled functions
+associated with them, while the user-generated versions do not, of
+course.)
+
+To help with this, you can run @kbd{M-x gnus-compile} after you've
+fiddled around with the variables and feel that you're (kind of)
+satisfied.  This will result in the new specs being byte-compiled, and
+you'll get top speed again.  Gnus will save these compiled specs in the
+@file{.newsrc.eld} file.  (User-defined functions aren't compiled by
+this function, though---you should compile them yourself by sticking
+them into the @file{~/.gnus.el} file and byte-compiling that file.)
+
+
+@node Mode Lines
+@section Mode Lines
+@cindex mode lines
+
+@vindex gnus-updated-mode-lines
+@code{gnus-updated-mode-lines} says what buffers should keep their mode
+lines updated.  It is a list of symbols.  Supported symbols include
+@code{group}, @code{article}, @code{summary}, @code{server},
+@code{browse}, and @code{tree}.  If the corresponding symbol is present,
+Gnus will keep that mode line updated with information that may be
+pertinent.  If this variable is @code{nil}, screen refresh may be
+quicker.
+
+@cindex display-time
+
+@vindex gnus-mode-non-string-length
+By default, Gnus displays information on the current article in the mode
+lines of the summary and article buffers.  The information Gnus wishes
+to display (e.g. the subject of the article) is often longer than the
+mode lines, and therefore have to be cut off at some point.  The
+@code{gnus-mode-non-string-length} variable says how long the other
+elements on the line is (i.e., the non-info part).  If you put
+additional elements on the mode line (e.g. a clock), you should modify
+this variable:
+
+@c Hook written by Francesco Potorti` <pot@cnuce.cnr.it>
+@lisp
+(add-hook 'display-time-hook
+          (lambda () (setq gnus-mode-non-string-length
+                           (+ 21
+                              (if line-number-mode 5 0)
+                              (if column-number-mode 4 0)
+                              (length display-time-string)))))
+@end lisp
+
+If this variable is @code{nil} (which is the default), the mode line
+strings won't be chopped off, and they won't be padded either.  Note
+that the default is unlikely to be desirable, as even the percentage
+complete in the buffer may be crowded off the mode line; the user should
+configure this variable appropriately for her configuration.
+
+
+@node Highlighting and Menus
+@section Highlighting and Menus
+@cindex visual
+@cindex highlighting
+@cindex menus
+
+@vindex gnus-visual
+The @code{gnus-visual} variable controls most of the Gnus-prettifying
+aspects.  If @code{nil}, Gnus won't attempt to create menus or use fancy
+colors or fonts.  This will also inhibit loading the @file{gnus-vis.el}
+file.
+
+This variable can be a list of visual properties that are enabled.  The
+following elements are valid, and are all included by default:
+
+@table @code
+@item group-highlight
+Do highlights in the group buffer.
+@item summary-highlight
+Do highlights in the summary buffer.
+@item article-highlight
+Do highlights in the article buffer.
+@item highlight
+Turn on highlighting in all buffers.
+@item group-menu
+Create menus in the group buffer.
+@item summary-menu
+Create menus in the summary buffers.
+@item article-menu
+Create menus in the article buffer.
+@item browse-menu
+Create menus in the browse buffer.
+@item server-menu
+Create menus in the server buffer.
+@item score-menu
+Create menus in the score buffers.
+@item menu
+Create menus in all buffers.
+@end table
+
+So if you only want highlighting in the article buffer and menus in all
+buffers, you could say something like:
+
+@lisp
+(setq gnus-visual '(article-highlight menu))
+@end lisp
+
+If you want highlighting only and no menus whatsoever, you'd say:
+
+@lisp
+(setq gnus-visual '(highlight))
+@end lisp
+
+If @code{gnus-visual} is @code{t}, highlighting and menus will be used
+in all Gnus buffers.
+
+Other general variables that influence the look of all buffers include:
+
+@table @code
+@item gnus-mouse-face
+@vindex gnus-mouse-face
+This is the face (i.e., font) used for mouse highlighting in Gnus.  No
+mouse highlights will be done if @code{gnus-visual} is @code{nil}.
+
+@end table
+
+There are hooks associated with the creation of all the different menus:
+
+@table @code
+
+@item gnus-article-menu-hook
+@vindex gnus-article-menu-hook
+Hook called after creating the article mode menu.
+
+@item gnus-group-menu-hook
+@vindex gnus-group-menu-hook
+Hook called after creating the group mode menu.
+
+@item gnus-summary-menu-hook
+@vindex gnus-summary-menu-hook
+Hook called after creating the summary mode menu.
+
+@item gnus-server-menu-hook
+@vindex gnus-server-menu-hook
+Hook called after creating the server mode menu.
+
+@item gnus-browse-menu-hook
+@vindex gnus-browse-menu-hook
+Hook called after creating the browse mode menu.
+
+@item gnus-score-menu-hook
+@vindex gnus-score-menu-hook
+Hook called after creating the score mode menu.
+
+@end table
+
+
+@node Buttons
+@section Buttons
+@cindex buttons
+@cindex mouse
+@cindex click
+
+Those new-fangled @dfn{mouse} contraptions is very popular with the
+young, hep kids who don't want to learn the proper way to do things
+these days.  Why, I remember way back in the summer of '89, when I was
+using Emacs on a Tops 20 system.  Three hundred users on one single
+machine, and every user was running Simula compilers.  Bah!
+
+Right.
+
+@vindex gnus-carpal
+Well, you can make Gnus display bufferfuls of buttons you can click to
+do anything by setting @code{gnus-carpal} to @code{t}.  Pretty simple,
+really.  Tell the chiropractor I sent you.
+
+
+@table @code
+
+@item gnus-carpal-mode-hook
+@vindex gnus-carpal-mode-hook
+Hook run in all carpal mode buffers.
+
+@item gnus-carpal-button-face
+@vindex gnus-carpal-button-face
+Face used on buttons.
+
+@item gnus-carpal-header-face
+@vindex gnus-carpal-header-face
+Face used on carpal buffer headers.
+
+@item gnus-carpal-group-buffer-buttons
+@vindex gnus-carpal-group-buffer-buttons
+Buttons in the group buffer.
+
+@item gnus-carpal-summary-buffer-buttons
+@vindex gnus-carpal-summary-buffer-buttons
+Buttons in the summary buffer.
+
+@item gnus-carpal-server-buffer-buttons
+@vindex gnus-carpal-server-buffer-buttons
+Buttons in the server buffer.
+
+@item gnus-carpal-browse-buffer-buttons
+@vindex gnus-carpal-browse-buffer-buttons
+Buttons in the browse buffer.
+@end table
+
+All the @code{buttons} variables are lists.  The elements in these list
+are either cons cells where the @code{car} contains a text to be displayed and
+the @code{cdr} contains a function symbol, or a simple string.
+
+
+@node Daemons
+@section Daemons
+@cindex demons
+@cindex daemons
+
+Gnus, being larger than any program ever written (allegedly), does lots
+of strange stuff that you may wish to have done while you're not
+present.  For instance, you may want it to check for new mail once in a
+while.  Or you may want it to close down all connections to all servers
+when you leave Emacs idle.  And stuff like that.
+
+Gnus will let you do stuff like that by defining various
+@dfn{handlers}.  Each handler consists of three elements:  A
+@var{function}, a @var{time}, and an @var{idle} parameter.
+
+Here's an example of a handler that closes connections when Emacs has
+been idle for thirty minutes:
+
+@lisp
+(gnus-demon-close-connections nil 30)
+@end lisp
+
+Here's a handler that scans for @acronym{PGP} headers every hour when
+Emacs is idle:
+
+@lisp
+(gnus-demon-scan-pgp 60 t)
+@end lisp
+
+This @var{time} parameter and that @var{idle} parameter work together
+in a strange, but wonderful fashion.  Basically, if @var{idle} is
+@code{nil}, then the function will be called every @var{time} minutes.
+
+If @var{idle} is @code{t}, then the function will be called after
+@var{time} minutes only if Emacs is idle.  So if Emacs is never idle,
+the function will never be called.  But once Emacs goes idle, the
+function will be called every @var{time} minutes.
+
+If @var{idle} is a number and @var{time} is a number, the function will
+be called every @var{time} minutes only when Emacs has been idle for
+@var{idle} minutes.
+
+If @var{idle} is a number and @var{time} is @code{nil}, the function
+will be called once every time Emacs has been idle for @var{idle}
+minutes.
+
+And if @var{time} is a string, it should look like @samp{07:31}, and
+the function will then be called once every day somewhere near that
+time.  Modified by the @var{idle} parameter, of course.
+
+@vindex gnus-demon-timestep
+(When I say ``minute'' here, I really mean @code{gnus-demon-timestep}
+seconds.  This is 60 by default.  If you change that variable,
+all the timings in the handlers will be affected.)
+
+So, if you want to add a handler, you could put something like this in
+your @file{~/.gnus.el} file:
+
+@findex gnus-demon-add-handler
+@lisp
+(gnus-demon-add-handler 'gnus-demon-close-connections 30 t)
+@end lisp
+
+@findex gnus-demon-add-nocem
+@findex gnus-demon-add-scanmail
+@findex gnus-demon-add-rescan
+@findex gnus-demon-add-scan-timestamps
+@findex gnus-demon-add-disconnection
+Some ready-made functions to do this have been created:
+@code{gnus-demon-add-nocem}, @code{gnus-demon-add-disconnection},
+@code{gnus-demon-add-nntp-close-connection},
+@code{gnus-demon-add-scan-timestamps}, @code{gnus-demon-add-rescan}, and
+@code{gnus-demon-add-scanmail}.  Just put those functions in your
+@file{~/.gnus.el} if you want those abilities.
+
+@findex gnus-demon-init
+@findex gnus-demon-cancel
+@vindex gnus-demon-handlers
+If you add handlers to @code{gnus-demon-handlers} directly, you should
+run @code{gnus-demon-init} to make the changes take hold.  To cancel all
+daemons, you can use the @code{gnus-demon-cancel} function.
+
+Note that adding daemons can be pretty naughty if you over do it.  Adding
+functions that scan all news and mail from all servers every two seconds
+is a sure-fire way of getting booted off any respectable system.  So
+behave.
+
+
+@node NoCeM
+@section NoCeM
+@cindex nocem
+@cindex spam
+
+@dfn{Spamming} is posting the same article lots and lots of times.
+Spamming is bad.  Spamming is evil.
+
+Spamming is usually canceled within a day or so by various anti-spamming
+agencies.  These agencies usually also send out @dfn{NoCeM} messages.
+NoCeM is pronounced ``no see-'em'', and means what the name
+implies---these are messages that make the offending articles, like, go
+away.
+
+What use are these NoCeM messages if the articles are canceled anyway?
+Some sites do not honor cancel messages and some sites just honor cancels
+from a select few people.  Then you may wish to make use of the NoCeM
+messages, which are distributed in the @samp{alt.nocem.misc} newsgroup.
+
+Gnus can read and parse the messages in this group automatically, and
+this will make spam disappear.
+
+There are some variables to customize, of course:
+
+@table @code
+@item gnus-use-nocem
+@vindex gnus-use-nocem
+Set this variable to @code{t} to set the ball rolling.  It is @code{nil}
+by default.
+
+You can also set this variable to a positive number as a group level.
+In that case, Gnus scans NoCeM messages when checking new news if this
+value is not exceeding a group level that you specify as the prefix
+argument to some commands, e.g. @code{gnus},
+@code{gnus-group-get-new-news}, etc.  Otherwise, Gnus does not scan
+NoCeM messages if you specify a group level to those commands.  For
+example, if you use 1 or 2 on the mail groups and the levels on the news
+groups remain the default, 3 is the best choice.
+
+@item gnus-nocem-groups
+@vindex gnus-nocem-groups
+Gnus will look for NoCeM messages in the groups in this list.  The
+default is
+@lisp
+("news.lists.filters" "news.admin.net-abuse.bulletins"
+ "alt.nocem.misc" "news.admin.net-abuse.announce")
+@end lisp
+
+@item gnus-nocem-issuers
+@vindex gnus-nocem-issuers
+There are many people issuing NoCeM messages.  This list says what
+people you want to listen to.  The default is
+@lisp
+("Automoose-1" "clewis@@ferret.ocunix.on.ca"
+ "cosmo.roadkill" "SpamHippo" "hweede@@snafu.de")
+@end lisp
+fine, upstanding citizens all of them.
+
+Known despammers that you can put in this list are listed at@*
+@uref{http://www.xs4all.nl/~rosalind/nocemreg/nocemreg.html}.
+
+You do not have to heed NoCeM messages from all these people---just the
+ones you want to listen to.  You also don't have to accept all NoCeM
+messages from the people you like.  Each NoCeM message has a @dfn{type}
+header that gives the message a (more or less, usually less) rigorous
+definition.  Common types are @samp{spam}, @samp{spew}, @samp{mmf},
+@samp{binary}, and @samp{troll}.  To specify this, you have to use
+@code{(@var{issuer} @var{conditions} @dots{})} elements in the list.
+Each condition is either a string (which is a regexp that matches types
+you want to use) or a list on the form @code{(not @var{string})}, where
+@var{string} is a regexp that matches types you don't want to use.
+
+For instance, if you want all NoCeM messages from Chris Lewis except his
+@samp{troll} messages, you'd say:
+
+@lisp
+("clewis@@ferret.ocunix.on.ca" ".*" (not "troll"))
+@end lisp
+
+On the other hand, if you just want nothing but his @samp{spam} and
+@samp{spew} messages, you'd say:
+
+@lisp
+("clewis@@ferret.ocunix.on.ca" (not ".*") "spew" "spam")
+@end lisp
+
+The specs are applied left-to-right.
+
+
+@item gnus-nocem-verifyer
+@vindex gnus-nocem-verifyer
+@findex pgg-verify
+This should be a function for verifying that the NoCeM issuer is who she
+says she is.  The default is @code{pgg-verify}, which returns
+non-@code{nil} if the verification is successful, otherwise (including
+the case the NoCeM message was not signed) returns @code{nil}.  If this
+is too slow and you don't care for verification (which may be dangerous),
+you can set this variable to @code{nil}.
+
+Formerly the default was @code{mc-verify}, which is a Mailcrypt
+function.  While you can still use it, you can change it into
+@code{pgg-verify} running with GnuPG if you are willing to add the
+@acronym{PGP} public keys to GnuPG's keyring.
+
+@item gnus-nocem-directory
+@vindex gnus-nocem-directory
+This is where Gnus will store its NoCeM cache files.  The default is@*
+@file{~/News/NoCeM/}.
+
+@item gnus-nocem-expiry-wait
+@vindex gnus-nocem-expiry-wait
+The number of days before removing old NoCeM entries from the cache.
+The default is 15.  If you make it shorter Gnus will be faster, but you
+might then see old spam.
+
+@item gnus-nocem-check-from
+@vindex gnus-nocem-check-from
+Non-@code{nil} means check for valid issuers in message bodies.
+Otherwise don't bother fetching articles unless their author matches a
+valid issuer; that is much faster if you are selective about the
+issuers.
+
+@item gnus-nocem-check-article-limit
+@vindex gnus-nocem-check-article-limit
+If non-@code{nil}, the maximum number of articles to check in any NoCeM
+group.  NoCeM groups can be huge and very slow to process.
+
+@end table
+
+Using NoCeM could potentially be a memory hog.  If you have many living
+(i. e., subscribed or unsubscribed groups), your Emacs process will grow
+big.  If this is a problem, you should kill off all (or most) of your
+unsubscribed groups (@pxref{Subscription Commands}).
+
+
+@node Undo
+@section Undo
+@cindex undo
+
+It is very useful to be able to undo actions one has done.  In normal
+Emacs buffers, it's easy enough---you just push the @code{undo} button.
+In Gnus buffers, however, it isn't that simple.
+
+The things Gnus displays in its buffer is of no value whatsoever to
+Gnus---it's all just data designed to look nice to the user.
+Killing a group in the group buffer with @kbd{C-k} makes the line
+disappear, but that's just a side-effect of the real action---the
+removal of the group in question from the internal Gnus structures.
+Undoing something like that can't be done by the normal Emacs
+@code{undo} function.
+
+Gnus tries to remedy this somewhat by keeping track of what the user
+does and coming up with actions that would reverse the actions the user
+takes.  When the user then presses the @code{undo} key, Gnus will run
+the code to reverse the previous action, or the previous actions.
+However, not all actions are easily reversible, so Gnus currently offers
+a few key functions to be undoable.  These include killing groups,
+yanking groups, and changing the list of read articles of groups.
+That's it, really.  More functions may be added in the future, but each
+added function means an increase in data to be stored, so Gnus will
+never be totally undoable.
+
+@findex gnus-undo-mode
+@vindex gnus-use-undo
+@findex gnus-undo
+The undoability is provided by the @code{gnus-undo-mode} minor mode.  It
+is used if @code{gnus-use-undo} is non-@code{nil}, which is the
+default.  The @kbd{C-M-_} key performs the @code{gnus-undo}
+command, which should feel kinda like the normal Emacs @code{undo}
+command.
+
+
+@node Predicate Specifiers
+@section Predicate Specifiers
+@cindex predicate specifiers
+
+Some Gnus variables are @dfn{predicate specifiers}.  This is a special
+form that allows flexible specification of predicates without having
+to type all that much.
+
+These specifiers are lists consisting of functions, symbols and lists.
+
+Here's an example:
+
+@lisp
+(or gnus-article-unseen-p
+    gnus-article-unread-p)
+@end lisp
+
+The available symbols are @code{or}, @code{and} and @code{not}.  The
+functions all take one parameter.
+
+@findex gnus-make-predicate
+Internally, Gnus calls @code{gnus-make-predicate} on these specifiers
+to create a function that can be called.  This input parameter to this
+function will be passed along to all the functions in the predicate
+specifier.
+
+
+@node Moderation
+@section Moderation
+@cindex moderation
+
+If you are a moderator, you can use the @file{gnus-mdrtn.el} package.
+It is not included in the standard Gnus package.  Write a mail to
+@samp{larsi@@gnus.org} and state what group you moderate, and you'll
+get a copy.
+
+The moderation package is implemented as a minor mode for summary
+buffers.  Put
+
+@lisp
+(add-hook 'gnus-summary-mode-hook 'gnus-moderate)
+@end lisp
+
+in your @file{~/.gnus.el} file.
+
+If you are the moderator of @samp{rec.zoofle}, this is how it's
+supposed to work:
+
+@enumerate
+@item
+You split your incoming mail by matching on
+@samp{Newsgroups:.*rec.zoofle}, which will put all the to-be-posted
+articles in some mail group---for instance, @samp{nnml:rec.zoofle}.
+
+@item
+You enter that group once in a while and post articles using the @kbd{e}
+(edit-and-post) or @kbd{s} (just send unedited) commands.
+
+@item
+If, while reading the @samp{rec.zoofle} newsgroup, you happen upon some
+articles that weren't approved by you, you can cancel them with the
+@kbd{c} command.
+@end enumerate
+
+To use moderation mode in these two groups, say:
+
+@lisp
+(setq gnus-moderated-list
+      "^nnml:rec.zoofle$\\|^rec.zoofle$")
+@end lisp
+
+
+@node Fetching a Group
+@section Fetching a Group
+@cindex fetching a group
+
+@findex gnus-fetch-group
+It is sometimes convenient to be able to just say ``I want to read this
+group and I don't care whether Gnus has been started or not''.  This is
+perhaps more useful for people who write code than for users, but the
+command @code{gnus-fetch-group} provides this functionality in any case.
+It takes the group name as a parameter.
+
+
+@node Image Enhancements
+@section Image Enhancements
+
+XEmacs, as well as Emacs 21@footnote{Emacs 21 on MS Windows doesn't
+support images, Emacs 22 does.} and up, are able to display pictures and
+stuff, so Gnus has taken advantage of that.
+
+@menu
+* X-Face::                      Display a funky, teensy black-and-white image.
+* Face::                        Display a funkier, teensier colored image.
+* Smileys::                     Show all those happy faces the way they were meant to be shown.
+* Picons::                      How to display pictures of what you're reading.
+* XVarious::                    Other XEmacsy Gnusey variables.
+@end menu
+
+
+@node X-Face
+@subsection X-Face
+@cindex x-face
+
+@code{X-Face} headers describe a 48x48 pixel black-and-white (1 bit
+depth) image that's supposed to represent the author of the message.
+It seems to be supported by an ever-growing number of mail and news
+readers.
+
+@cindex x-face
+@findex gnus-article-display-x-face
+@vindex gnus-article-x-face-command
+@vindex gnus-article-x-face-too-ugly
+@iftex
+@iflatex
+\include{xface}
+@end iflatex
+@end iftex
+@c @anchor{X-Face}
+
+Viewing an @code{X-Face} header either requires an Emacs that has
+@samp{compface} support (which most XEmacs versions have), or that you
+have suitable conversion or display programs installed.  If your Emacs
+has image support the default action is to display the face before the
+@code{From} header.  If there's no native @code{X-Face} support, Gnus
+will try to convert the @code{X-Face} header using external programs
+from the @code{pbmplus} package and friends, see below.  For XEmacs it's
+faster if XEmacs has been compiled with @code{X-Face} support.  The
+default action under Emacs without image support is to fork off the
+@code{display} program.
+
+On a GNU/Linux system, the @code{display} program is included in the
+ImageMagick package.  For external conversion programs look for packages
+with names like @code{netpbm}, @code{libgr-progs} and @code{compface}.
+On Windows, you may use the packages @code{netpbm} and @code{compface}
+from @url{http://gnuwin32.sourceforge.net}.  You need to add the
+@code{bin} directory to your @code{PATH} environment variable.
+@c In fact only the following DLLs and binaries seem to be required:
+@c compface1.dll uncompface.exe libnetpbm10.dll icontopbm.exe
+
+The variable @code{gnus-article-x-face-command} controls which programs
+are used to display the @code{X-Face} header.  If this variable is a
+string, this string will be executed in a sub-shell.  If it is a
+function, this function will be called with the face as the argument.
+If @code{gnus-article-x-face-too-ugly} (which is a regexp) matches the
+@code{From} header, the face will not be shown.
+
+(Note: @code{x-face} is used in the variable/function names, not
+@code{xface}).
+
+@noindent
+Face and variable:
+
+@table @code
+@item gnus-x-face
+@vindex gnus-x-face
+Face to show X-Face.  The colors from this face are used as the
+foreground and background colors of the displayed X-Faces.  The
+default colors are black and white.
+@end table
+
+If you use posting styles, you can use an @code{x-face-file} entry in
+@code{gnus-posting-styles}, @xref{Posting Styles}.  If you don't, Gnus
+provides a few convenience functions and variables to allow easier
+insertion of X-Face headers in outgoing messages.  You also need the
+above mentioned ImageMagick, netpbm or other image conversion packages
+(depending the values of the variables below) for these functions.
+
+@findex gnus-random-x-face
+@vindex gnus-convert-pbm-to-x-face-command
+@vindex gnus-x-face-directory
+@code{gnus-random-x-face} goes through all the @samp{pbm} files in
+@code{gnus-x-face-directory} and picks one at random, and then
+converts it to the X-Face format by using the
+@code{gnus-convert-pbm-to-x-face-command} shell command.  The
+@samp{pbm} files should be 48x48 pixels big.  It returns the X-Face
+header data as a string.
+
+@findex gnus-insert-random-x-face-header
+@code{gnus-insert-random-x-face-header} calls
+@code{gnus-random-x-face} and inserts a @samp{X-Face} header with the
+randomly generated data.
+
+@findex gnus-x-face-from-file
+@vindex gnus-convert-image-to-x-face-command
+@code{gnus-x-face-from-file} takes a GIF file as the parameter, and then
+converts the file to X-Face format by using the
+@code{gnus-convert-image-to-x-face-command} shell command.
+
+Here's how you would typically use the first function.  Put something
+like the following in your @file{~/.gnus.el} file:
+
+@lisp
+(setq message-required-news-headers
+      (nconc message-required-news-headers
+             (list '(X-Face . gnus-random-x-face))))
+@end lisp
+
+Using the last function would be something like this:
+
+@lisp
+(setq message-required-news-headers
+      (nconc message-required-news-headers
+             (list '(X-Face . (lambda ()
+                                (gnus-x-face-from-file
+                                 "~/My-face.gif"))))))
+@end lisp
+
+
+@node Face
+@subsection Face
+@cindex face
+
+@c #### FIXME: faces and x-faces' implementations should really be harmonized.
+
+@code{Face} headers are essentially a funkier version of @code{X-Face}
+ones. They describe a 48x48 pixel colored image that's supposed to
+represent the author of the message.
+
+@cindex face
+@findex gnus-article-display-face
+The contents of a @code{Face} header must be a base64 encoded PNG image.
+See @uref{http://quimby.gnus.org/circus/face/} for the precise
+specifications.
+
+Viewing an @code{Face} header requires an Emacs that is able to display
+PNG images.
+@c Maybe add this:
+@c (if (featurep 'xemacs)
+@c     (featurep 'png)
+@c   (image-type-available-p 'png))
+
+Gnus provides a few convenience functions and variables to allow
+easier insertion of Face headers in outgoing messages.
+
+@findex gnus-convert-png-to-face
+@code{gnus-convert-png-to-face} takes a 48x48 PNG image, no longer than
+726 bytes long, and converts it to a face.
+
+@findex gnus-face-from-file
+@vindex gnus-convert-image-to-face-command
+@code{gnus-face-from-file} takes a JPEG file as the parameter, and then
+converts the file to Face format by using the
+@code{gnus-convert-image-to-face-command} shell command.
+
+Here's how you would typically use this function. Put something like the
+following in your @file{~/.gnus.el} file:
+
+@lisp
+(setq message-required-news-headers
+      (nconc message-required-news-headers
+             (list '(Face . (lambda ()
+                              (gnus-face-from-file "~/face.jpg"))))))
+@end lisp
+
+
+@node Smileys
+@subsection Smileys
+@cindex smileys
+
+@iftex
+@iflatex
+\gnusfig{-3cm}{0.5cm}{\epsfig{figure=ps/BigFace,height=20cm}}
+\input{smiley}
+@end iflatex
+@end iftex
+
+@dfn{Smiley} is a package separate from Gnus, but since Gnus is
+currently the only package that uses Smiley, it is documented here.
+
+In short---to use Smiley in Gnus, put the following in your
+@file{~/.gnus.el} file:
+
+@lisp
+(setq gnus-treat-display-smileys t)
+@end lisp
+
+Smiley maps text smiley faces---@samp{:-)}, @samp{8-)}, @samp{:-(} and
+the like---to pictures and displays those instead of the text smiley
+faces.  The conversion is controlled by a list of regexps that matches
+text and maps that to file names.
+
+@vindex smiley-regexp-alist
+The alist used is specified by the @code{smiley-regexp-alist}
+variable.  The first item in each element is the regexp to be matched;
+the second element is the regexp match group that is to be replaced by
+the picture; and the third element is the name of the file to be
+displayed.
+
+The following variables customize where Smiley will look for these
+files:
+
+@table @code
+
+@item smiley-data-directory
+@vindex smiley-data-directory
+Where Smiley will look for smiley faces files.
+
+@item gnus-smiley-file-types
+@vindex gnus-smiley-file-types
+List of suffixes on smiley file names to try.
+
+@end table
+
+
+@node Picons
+@subsection Picons
+
+@iftex
+@iflatex
+\include{picons}
+@end iflatex
+@end iftex
+
+So@dots{}  You want to slow down your news reader even more!  This is a
+good way to do so.  It's also a great way to impress people staring
+over your shoulder as you read news.
+
+What are Picons?  To quote directly from the Picons Web site:
+
+@iftex
+@iflatex
+\margindex{}
+@end iflatex
+@end iftex
+
+@quotation
+@dfn{Picons} is short for ``personal icons''.  They're small,
+constrained images used to represent users and domains on the net,
+organized into databases so that the appropriate image for a given
+e-mail address can be found.  Besides users and domains, there are picon
+databases for Usenet newsgroups and weather forecasts.  The picons are
+in either monochrome @code{XBM} format or color @code{XPM} and
+@code{GIF} formats.
+@end quotation
+
+@vindex gnus-picon-databases
+For instructions on obtaining and installing the picons databases,
+point your Web browser at
+@uref{http://www.cs.indiana.edu/picons/ftp/index.html}.
+
+If you are using Debian GNU/Linux, saying @samp{apt-get install
+picons.*} will install the picons where Gnus can find them.
+
+To enable displaying picons, simply make sure that
+@code{gnus-picon-databases} points to the directory containing the
+Picons databases.
+
+The following variables offer control over where things are located.
+
+@table @code
+
+@item gnus-picon-databases
+@vindex gnus-picon-databases
+The location of the picons database.  This is a list of directories
+containing the @file{news}, @file{domains}, @file{users} (and so on)
+subdirectories.  Defaults to @code{("/usr/lib/picon"
+"/usr/local/faces")}.
+
+@item gnus-picon-news-directories
+@vindex gnus-picon-news-directories
+List of subdirectories to search in @code{gnus-picon-databases} for
+newsgroups faces.  @code{("news")} is the default.
+
+@item gnus-picon-user-directories
+@vindex gnus-picon-user-directories
+List of subdirectories to search in @code{gnus-picon-databases} for user
+faces.  @code{("users" "usenix" "local" "misc")} is the default.
+
+@item gnus-picon-domain-directories
+@vindex gnus-picon-domain-directories
+List of subdirectories to search in @code{gnus-picon-databases} for
+domain name faces.  Defaults to @code{("domains")}.  Some people may
+want to add @samp{"unknown"} to this list.
+
+@item gnus-picon-file-types
+@vindex gnus-picon-file-types
+Ordered list of suffixes on picon file names to try.  Defaults to
+@code{("xpm" "gif" "xbm")} minus those not built-in your Emacs.
+
+@end table
+
+
+@node XVarious
+@subsection Various XEmacs Variables
+
+@table @code
+@item gnus-xmas-glyph-directory
+@vindex gnus-xmas-glyph-directory
+This is where Gnus will look for pictures.  Gnus will normally
+auto-detect this directory, but you may set it manually if you have an
+unusual directory structure.
+
+@item gnus-xmas-modeline-glyph
+@vindex gnus-xmas-modeline-glyph
+A glyph displayed in all Gnus mode lines.  It is a tiny gnu head by
+default.
+
+@end table
+
+@subsubsection Toolbar
+
+@table @code
+
+@item gnus-use-toolbar
+@vindex gnus-use-toolbar
+This variable specifies the position to display the toolbar.  If
+@code{nil}, don't display toolbars.  If it is non-@code{nil}, it should
+be one of the symbols @code{default}, @code{top}, @code{bottom},
+@code{right}, and @code{left}.  @code{default} means to use the default
+toolbar, the rest mean to display the toolbar on the place which those
+names show.  The default is @code{default}.
+
+@item gnus-toolbar-thickness
+@vindex gnus-toolbar-thickness
+Cons of the height and the width specifying the thickness of a toolbar.
+The height is used for the toolbar displayed on the top or the bottom,
+the width is used for the toolbar displayed on the right or the left.
+The default is that of the default toolbar.
+
+@item gnus-group-toolbar
+@vindex gnus-group-toolbar
+The toolbar in the group buffer.
+
+@item gnus-summary-toolbar
+@vindex gnus-summary-toolbar
+The toolbar in the summary buffer.
+
+@item gnus-summary-mail-toolbar
+@vindex gnus-summary-mail-toolbar
+The toolbar in the summary buffer of mail groups.
+
+@end table
+
+@iftex
+@iflatex
+\margindex{}
+@end iflatex
+@end iftex
+
+
+@node Fuzzy Matching
+@section Fuzzy Matching
+@cindex fuzzy matching
+
+Gnus provides @dfn{fuzzy matching} of @code{Subject} lines when doing
+things like scoring, thread gathering and thread comparison.
+
+As opposed to regular expression matching, fuzzy matching is very fuzzy.
+It's so fuzzy that there's not even a definition of what @dfn{fuzziness}
+means, and the implementation has changed over time.
+
+Basically, it tries to remove all noise from lines before comparing.
+@samp{Re: }, parenthetical remarks, white space, and so on, are filtered
+out of the strings before comparing the results.  This often leads to
+adequate results---even when faced with strings generated by text
+manglers masquerading as newsreaders.
+
+
+@node Thwarting Email Spam
+@section Thwarting Email Spam
+@cindex email spam
+@cindex spam
+@cindex UCE
+@cindex unsolicited commercial email
+
+In these last days of the Usenet, commercial vultures are hanging about
+and grepping through news like crazy to find email addresses they can
+foist off their scams and products to.  As a reaction to this, many
+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.
+
+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
+have 10 new emails.  I say ``Golly gee!  Happy is me!'' and select the
+mail group, only to find two pyramid schemes, seven advertisements
+(``New!  Miracle tonic for growing full, lustrous hair on your toes!'')
+and one mail asking me to repent and find some god.
+
+This is annoying.  Here's what you can do about it.
+
+@menu
+* The problem of spam::         Some background, and some solutions
+* Anti-Spam Basics::            Simple steps to reduce the amount of spam.
+* SpamAssassin::                How to use external anti-spam tools.
+* Hashcash::                    Reduce spam by burning CPU time.
+@end menu
+
+@node The problem of spam
+@subsection The problem of spam
+@cindex email spam
+@cindex spam filtering approaches
+@cindex filtering approaches, spam
+@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.
+
+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
+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.
+
+This, unfortunately, is a great way to discard legitimate e-mail.  The
+risks of blocking a whole country (Bulgaria, Norway, Nigeria, China,
+etc.) or even a continent (Asia, Africa, Europe, etc.) from contacting
+you should be obvious, so don't do it if you have the choice.
+
+In another instance, the very informative and useful RISKS digest has
+been blocked by overzealous mail filters because it @strong{contained}
+words that were common in spam messages.  Nevertheless, in isolated
+cases, with great care, direct filtering of mail can be useful.
+
+Another approach to filtering e-mail is the distributed spam
+processing, for instance DCC implements such a system.  In essence,
+@var{N} systems around the world agree that a machine @var{X} in
+Ghana, Estonia, or California is sending out spam e-mail, and these
+@var{N} systems enter @var{X} or the spam e-mail from @var{X} into a
+database.  The criteria for spam detection vary---it may be the number
+of messages sent, the content of the messages, and so on.  When a user
+of the distributed processing system wants to find out if a message is
+spam, he consults one of those @var{N} systems.
+
+Distributed spam processing works very well against spammers that send
+a large number of messages at once, but it requires the user to set up
+fairly complicated checks.  There are commercial and free distributed
+spam processing systems.  Distributed spam processing has its risks as
+well.  For instance legitimate e-mail senders have been accused of
+sending spam, and their web sites and mailing lists have been shut
+down for some time because of the incident.
+
+The statistical approach to spam filtering is also popular.  It is
+based on a statistical analysis of previous spam messages.  Usually
+the analysis is a simple word frequency count, with perhaps pairs of
+words or 3-word combinations thrown into the mix.  Statistical
+analysis of spam works very well in most of the cases, but it can
+classify legitimate e-mail as spam in some cases.  It takes time to
+run the analysis, the full message must be analyzed, and the user has
+to store the database of spam analysis.  Statistical analysis on the
+server is gaining popularity.  This has the advantage of letting the
+user Just Read Mail, but has the disadvantage that it's harder to tell
+the server that it has misclassified mail.
+
+Fighting spam is not easy, no matter what anyone says.  There is no
+magic switch that will distinguish Viagra ads from Mom's e-mails.
+Even people are having a hard time telling spam apart from non-spam,
+because spammers are actively looking to fool us into thinking they
+are Mom, essentially.  Spamming is irritating, irresponsible, and
+idiotic behavior from a bunch of people who think the world owes them
+a favor.  We hope the following sections will help you in fighting the
+spam plague.
+
+@node Anti-Spam Basics
+@subsection Anti-Spam Basics
+@cindex email spam
+@cindex spam
+@cindex UCE
+@cindex unsolicited commercial email
+
+One way of dealing with spam is having Gnus split out all spam into a
+@samp{spam} mail group (@pxref{Splitting Mail}).
+
+First, pick one (1) valid mail address that you can be reached at, and
+put it in your @code{From} header of all your news articles.  (I've
+chosen @samp{larsi@@trym.ifi.uio.no}, but for many addresses on the form
+@samp{larsi+usenet@@ifi.uio.no} will be a better choice.  Ask your
+sysadmin whether your sendmail installation accepts keywords in the local
+part of the mail address.)
+
+@lisp
+(setq message-default-news-headers
+      "From: Lars Magne Ingebrigtsen <larsi@@trym.ifi.uio.no>\n")
+@end lisp
+
+Then put the following split rule in @code{nnmail-split-fancy}
+(@pxref{Fancy Mail Splitting}):
+
+@lisp
+(...
+ (to "larsi@@trym.ifi.uio.no"
+     (| ("subject" "re:.*" "misc")
+        ("references" ".*@@.*" "misc")
+        "spam"))
+ ...)
+@end lisp
+
+This says that all mail to this address is suspect, but if it has a
+@code{Subject} that starts with a @samp{Re:} or has a @code{References}
+header, it's probably ok.  All the rest goes to the @samp{spam} group.
+(This idea probably comes from Tim Pierce.)
+
+In addition, many mail spammers talk directly to your @acronym{SMTP} server
+and do not include your email address explicitly in the @code{To}
+header.  Why they do this is unknown---perhaps it's to thwart this
+thwarting scheme?  In any case, this is trivial to deal with---you just
+put anything not addressed to you in the @samp{spam} group by ending
+your fancy split rule in this way:
+
+@lisp
+(
+ ...
+ (to "larsi" "misc")
+ "spam")
+@end lisp
+
+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.
+
+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
+spam.  It's a win-win situation.  Forging @code{From} headers to point
+to non-existent domains is yucky, in my opinion.
+
+Be careful with this approach.  Spammers are wise to it.
+
+
+@node SpamAssassin
+@subsection SpamAssassin, Vipul's Razor, DCC, etc
+@cindex SpamAssassin
+@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
+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
+though this section will use SpamAssassin as an example, it should be
+easy to adapt it to most other tools.
+
+Note that this section does not involve the @code{spam.el} package,
+which is discussed in the next section.  If you don't care for all
+the features of @code{spam.el}, you can make do with these simple
+recipes.
+
+If the tool you are using is not installed on the mail server, you
+need to invoke it yourself.  Ideas on how to use the
+@code{:postscript} mail source parameter (@pxref{Mail Source
+Specifiers}) follow.
+
+@lisp
+(setq mail-sources
+      '((file :prescript "formail -bs spamassassin < /var/mail/%u")
+        (pop :user "jrl"
+             :server "pophost"
+             :postscript
+             "mv %t /tmp/foo; formail -bs spamc < /tmp/foo > %t")))
+@end lisp
+
+Once you manage to process your incoming spool somehow, thus making
+the mail contain e.g.@: a header indicating it is spam, you are ready to
+filter it out.  Using normal split methods (@pxref{Splitting Mail}):
+
+@lisp
+(setq nnmail-split-methods '(("spam"  "^X-Spam-Flag: YES")
+                             ...))
+@end lisp
+
+Or using fancy split methods (@pxref{Fancy Mail Splitting}):
+
+@lisp
+(setq nnmail-split-methods 'nnmail-split-fancy
+      nnmail-split-fancy '(| ("X-Spam-Flag" "YES" "spam")
+                             ...))
+@end lisp
+
+Some people might not like the idea of piping the mail through various
+programs using a @code{:prescript} (if some program is buggy, you
+might lose all mail).  If you are one of them, another solution is to
+call the external tools during splitting.  Example fancy split method:
+
+@lisp
+(setq nnmail-split-fancy '(| (: kevin-spamassassin)
+                             ...))
+(defun kevin-spamassassin ()
+  (save-excursion
+    (save-restriction
+      (widen)
+      (if (eq 1 (call-process-region (point-min) (point-max)
+                                     "spamc" nil nil nil "-c"))
+          "spam"))))
+@end lisp
+
+Note that with the nnimap backend, message bodies will not be
+downloaded by default.  You need to set
+@code{nnimap-split-download-body} to @code{t} to do that
+(@pxref{Splitting in IMAP}).
+
+That is about it.  As some spam is likely to get through anyway, you
+might want to have a nifty function to call when you happen to read
+spam.  And here is the nifty function:
+
+@lisp
+ (defun my-gnus-raze-spam ()
+  "Submit SPAM to Vipul's Razor, then mark it as expirable."
+  (interactive)
+  (gnus-summary-show-raw-article)
+  (gnus-summary-save-in-pipe "razor-report -f -d")
+  (gnus-summary-mark-as-expirable 1))
+@end lisp
+
+@node Hashcash
+@subsection Hashcash
+@cindex hashcash
+
+A novel technique to fight spam is to require senders to do something
+costly 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, but it may be useful
+in smaller communities.
+
+While the tools in the previous section work well in practice, they
+work only because the tools are constantly maintained and updated as
+new form of spam appears.  This means that a small percentage of spam
+will always get through.  It also means that somewhere, someone needs
+to read lots of spam to update these tools.  Hashcash avoids that, but
+instead prefers that everyone you contact through e-mail supports the
+scheme.  You can view the two approaches as pragmatic vs dogmatic.
+The approaches have their own advantages and disadvantages, but as
+often in the real world, a combination of them is stronger than either
+one of them separately.
+
+@cindex X-Hashcash
+The ``something costly'' is to burn CPU time, more specifically to
+compute a hash collision up to a certain number of bits.  The
+resulting hashcash cookie is inserted in a @samp{X-Hashcash:}
+header.  For more details, and for the external application
+@code{hashcash} you need to install to use this feature, see
+@uref{http://www.cypherspace.org/~adam/hashcash/}.  Even more
+information can be found at @uref{http://www.camram.org/}.
+
+If you wish to call hashcash for each message you send, say something
+like:
+
+@lisp
+(require 'hashcash)
+(add-hook 'message-send-hook 'mail-add-payment)
+@end lisp
+
+The @file{hashcash.el} library can be found in the Gnus development
+contrib directory or at
+@uref{http://users.actrix.gen.nz/mycroft/hashcash.el}.
+
+You will need to set up some additional variables as well:
+
+@table @code
+
+@item hashcash-default-payment
+@vindex hashcash-default-payment
+This variable indicates the default number of bits the hash collision
+should consist of.  By default this is 0, meaning nothing will be
+done.  Suggested useful values include 17 to 29.
+
+@item hashcash-payment-alist
+@vindex hashcash-payment-alist
+Some receivers may require you to spend burn more CPU time than the
+default.  This variable contains a list of @samp{(@var{addr}
+@var{amount})} cells, where @var{addr} is the receiver (email address
+or newsgroup) and @var{amount} is the number of bits in the collision
+that is needed.  It can also contain @samp{(@var{addr} @var{string}
+@var{amount})} cells, where the @var{string} is the string to use
+(normally the email address or newsgroup name is used).
+
+@item hashcash
+@vindex hashcash
+Where the @code{hashcash} binary is installed.
+
+@end table
+
+Currently there is no built in functionality in Gnus to verify
+hashcash cookies, it is expected that this is performed by your hand
+customized mail filtering scripts.  Improvements in this area would be
+a useful contribution, however.
+
+@node Spam Package
+@section Spam Package
+@cindex spam filtering
+@cindex spam
+
+The Spam package provides Gnus with a centralized mechanism for
+detecting and filtering spam.  It filters new mail, and processes
+messages according to whether they are spam or ham.  (@dfn{Ham} is the
+name used throughout this manual to indicate non-spam messages.)
+
+@menu
+* Spam Package Introduction::
+* Filtering Incoming Mail::
+* Detecting Spam in Groups::
+* Spam and Ham Processors::
+* Spam Package Configuration Examples::
+* Spam Back Ends::
+* Extending the Spam package::
+* Spam Statistics Package::
+@end menu
+
+@node Spam Package Introduction
+@subsection Spam Package Introduction
+@cindex spam filtering
+@cindex spam filtering sequence of events
+@cindex spam
+
+You must read this section to understand how the Spam package works.
+Do not skip, speed-read, or glance through this section.
+
+@cindex spam-initialize
+@vindex spam-use-stat
+To use the Spam package, you @strong{must} first run the function
+@code{spam-initialize}:
+
+@example
+(spam-initialize)
+@end example
+
+This autoloads @code{spam.el} and installs the various hooks necessary
+to let the Spam package do its job.  In order to make use of the Spam
+package, you have to set up certain group parameters and variables,
+which we will describe below.  All of the variables controlling the
+Spam package can be found in the @samp{spam} customization group.
+
+There are two ``contact points'' between the Spam package and the rest
+of Gnus: checking new mail for spam, and leaving a group.
+
+Checking new mail for spam is done in one of two ways: while splitting
+incoming mail, or when you enter a group.
+
+The first way, checking for spam while splitting incoming mail, is
+suited to mail back ends such as @code{nnml} or @code{nnimap}, where
+new mail appears in a single spool file.  The Spam package processes
+incoming mail, and sends mail considered to be spam to a designated
+``spam'' group.  @xref{Filtering Incoming Mail}.
+
+The second way is suited to back ends such as @code{nntp}, which have
+no incoming mail spool, or back ends where the server is in charge of
+splitting incoming mail.  In this case, when you enter a Gnus group,
+the unseen or unread messages in that group are checked for spam.
+Detected spam messages are marked as spam.  @xref{Detecting Spam in
+Groups}.
+
+@cindex spam back ends
+In either case, you have to tell the Spam package what method to use
+to detect spam messages.  There are several methods, or @dfn{spam back
+ends} (not to be confused with Gnus back ends!) to choose from: spam
+``blacklists'' and ``whitelists'', dictionary-based filters, and so
+forth.  @xref{Spam Back Ends}.
+
+In the Gnus summary buffer, messages that have been identified as spam
+always appear with a @samp{$} symbol.
+
+The Spam package divides Gnus groups into three categories: ham
+groups, spam groups, and unclassified groups.  You should mark each of
+the groups you subscribe to as either a ham group or a spam group,
+using the @code{spam-contents} group parameter (@pxref{Group
+Parameters}).  Spam groups have a special property: when you enter a
+spam group, all unseen articles are marked as spam.  Thus, mail split
+into a spam group is automatically marked as spam.
+
+Identifying spam messages is only half of the Spam package's job.  The
+second half comes into play whenever you exit a group buffer.  At this
+point, the Spam package does several things:
+
+First, it calls @dfn{spam and ham processors} to process the articles
+according to whether they are spam or ham.  There is a pair of spam
+and ham processors associated with each spam back end, and what the
+processors do depends on the back end.  At present, the main role of
+spam and ham processors is for dictionary-based spam filters: they add
+the contents of the messages in the group to the filter's dictionary,
+to improve its ability to detect future spam.  The @code{spam-process}
+group parameter specifies what spam processors to use.  @xref{Spam and
+Ham Processors}.
+
+If the spam filter failed to mark a spam message, you can mark it
+yourself, so that the message is processed as spam when you exit the
+group:
+
+@table @kbd
+@item M-d
+@itemx M s x
+@itemx S x
+@kindex M-d
+@kindex S x
+@kindex M s x
+@findex gnus-summary-mark-as-spam
+@findex gnus-summary-mark-as-spam
+Mark current article as spam, showing it with the @samp{$} mark
+(@code{gnus-summary-mark-as-spam}).
+@end table
+
+@noindent
+Similarly, you can unmark an article if it has been erroneously marked
+as spam.  @xref{Setting Marks}.
+
+Normally, a ham message found in a non-ham group is not processed as
+ham---the rationale is that it should be moved into a ham group for
+further processing (see below).  However, you can force these articles
+to be processed as ham by setting
+@code{spam-process-ham-in-spam-groups} and
+@code{spam-process-ham-in-nonham-groups}.
+
+@vindex gnus-ham-process-destinations
+@vindex gnus-spam-process-destinations
+The second thing that the Spam package does when you exit a group is
+to move ham articles out of spam groups, and spam articles out of ham
+groups.  Ham in a spam group is moved to the group specified by the
+variable @code{gnus-ham-process-destinations}, or the group parameter
+@code{ham-process-destination}.  Spam in a ham group is moved to the
+group specified by the variable @code{gnus-spam-process-destinations},
+or the group parameter @code{spam-process-destination}.  If these
+variables are not set, the articles are left in their current group.
+If an article cannot be moved (e.g., with a read-only backend such
+as @acronym{NNTP}), it is copied.
+
+If an article is moved to another group, it is processed again when
+you visit the new group.  Normally, this is not a problem, but if you
+want each article to be processed only once, load the
+@code{gnus-registry.el} package and set the variable
+@code{spam-log-to-registry} to @code{t}.  @xref{Spam Package
+Configuration Examples}.
+
+Normally, spam groups ignore @code{gnus-spam-process-destinations}.
+However, if you set @code{spam-move-spam-nonspam-groups-only} to
+@code{nil}, spam will also be moved out of spam groups, depending on
+the @code{spam-process-destination} parameter.
+
+The final thing the Spam package does is to mark spam articles as
+expired, which is usually the right thing to do.
+
+If all this seems confusing, don't worry.  Soon it will be as natural
+as typing Lisp one-liners on a neural interface@dots{} err, sorry, that's
+50 years in the future yet.  Just trust us, it's not so bad.
+
+@node Filtering Incoming Mail
+@subsection Filtering Incoming Mail
+@cindex spam filtering
+@cindex spam filtering incoming mail
+@cindex spam
+
+To use the Spam package to filter incoming mail, you must first set up
+fancy mail splitting.  @xref{Fancy Mail Splitting}.  The Spam package
+defines a special splitting function that you can add to your fancy
+split variable (either @code{nnmail-split-fancy} or
+@code{nnimap-split-fancy}, depending on your mail back end):
+
+@example
+(: spam-split)
+@end example
+
+@vindex spam-split-group
+@noindent
+The @code{spam-split} function scans incoming mail according to your
+chosen spam back end(s), and sends messages identified as spam to a
+spam group.  By default, the spam group is a group named @samp{spam},
+but you can change this by customizing @code{spam-split-group}.  Make
+sure the contents of @code{spam-split-group} are an unqualified group
+name.  For instance, in an @code{nnimap} server @samp{your-server},
+the value @samp{spam} means @samp{nnimap+your-server:spam}.  The value
+@samp{nnimap+server:spam} is therefore wrong---it gives the group
+@samp{nnimap+your-server:nnimap+server:spam}.
+
+@code{spam-split} does not modify the contents of messages in any way.
+
+@vindex nnimap-split-download-body
+Note for IMAP users: if you use the @code{spam-check-bogofilter},
+@code{spam-check-ifile}, and @code{spam-check-stat} spam back ends,
+you should also set set the variable @code{nnimap-split-download-body}
+to @code{t}.  These spam back ends are most useful when they can
+``scan'' the full message body.  By default, the nnimap back end only
+retrieves the message headers; @code{nnimap-split-download-body} tells
+it to retrieve the message bodies as well.  We don't set this by
+default because it will slow @acronym{IMAP} down, and that is not an
+appropriate decision to make on behalf of the user.  @xref{Splitting
+in IMAP}.
+
+You have to specify one or more spam back ends for @code{spam-split}
+to use, by setting the @code{spam-use-*} variables.  @xref{Spam Back
+Ends}.  Normally, @code{spam-split} simply uses all the spam back ends
+you enabled in this way.  However, you can tell @code{spam-split} to
+use only some of them.  Why this is useful?  Suppose you are using the
+@code{spam-use-regex-headers} and @code{spam-use-blackholes} spam back
+ends, and the following split rule:
+
+@example
+ nnimap-split-fancy '(|
+                      (any "ding" "ding")
+                      (: spam-split)
+                      ;; @r{default mailbox}
+                      "mail")
+@end example
+
+@noindent
+The problem is that you want all ding messages to make it to the ding
+folder.  But that will let obvious spam (for example, spam detected by
+SpamAssassin, and @code{spam-use-regex-headers}) through, when it's
+sent to the ding list.  On the other hand, some messages to the ding
+list are from a mail server in the blackhole list, so the invocation
+of @code{spam-split} can't be before the ding rule.
+
+The solution is to let SpamAssassin headers supersede ding rules, and
+perform the other @code{spam-split} rules (including a second
+invocation of the regex-headers check) after the ding rule.  This is
+done by passing a parameter to @code{spam-split}:
+
+@example
+nnimap-split-fancy
+      '(|
+        ;; @r{spam detected by @code{spam-use-regex-headers} goes to @samp{regex-spam}}
+        (: spam-split "regex-spam" 'spam-use-regex-headers)
+        (any "ding" "ding")
+        ;; @r{all other spam detected by spam-split goes to @code{spam-split-group}}
+        (: spam-split)
+        ;; @r{default mailbox}
+        "mail")
+@end example
+
+@noindent
+This lets you invoke specific @code{spam-split} checks depending on
+your particular needs, and target the results of those checks to a
+particular spam group.  You don't have to throw all mail into all the
+spam tests.  Another reason why this is nice is that messages to
+mailing lists you have rules for don't have to have resource-intensive
+blackhole checks performed on them.  You could also specify different
+spam checks for your nnmail split vs. your nnimap split.  Go crazy.
+
+You should set the @code{spam-use-*} variables for whatever spam back
+ends you intend to use.  The reason is that when loading
+@file{spam.el}, some conditional loading is done depending on what
+@code{spam-use-xyz} variables you have set.  @xref{Spam Back Ends}.
+
+@c @emph{TODO: spam.el needs to provide a uniform way of training all the
+@c statistical databases.  Some have that functionality built-in, others
+@c don't.}
+
+@node Detecting Spam in Groups
+@subsection Detecting Spam in Groups
+
+To detect spam when visiting a group, set the group's
+@code{spam-autodetect} and @code{spam-autodetect-methods} group
+parameters.  These are accessible with @kbd{G c} or @kbd{G p}, as
+usual (@pxref{Group Parameters}).
+
+You should set the @code{spam-use-*} variables for whatever spam back
+ends you intend to use.  The reason is that when loading
+@file{spam.el}, some conditional loading is done depending on what
+@code{spam-use-xyz} variables you have set.
+
+By default, only unseen articles are processed for spam.  You can
+force Gnus to recheck all messages in the group by setting the
+variable @code{spam-autodetect-recheck-messages} to @code{t}.
+
+If you use the @code{spam-autodetect} method of checking for spam, you
+can specify different spam detection methods for different groups.
+For instance, the @samp{ding} group may have @code{spam-use-BBDB} as
+the autodetection method, while the @samp{suspect} group may have the
+@code{spam-use-blacklist} and @code{spam-use-bogofilter} methods
+enabled.  Unlike with @code{spam-split}, you don't have any control
+over the @emph{sequence} of checks, but this is probably unimportant.
+
+@node Spam and Ham Processors
+@subsection Spam and Ham Processors
+@cindex spam filtering
+@cindex spam filtering variables
+@cindex spam variables
+@cindex spam
+
+@vindex gnus-spam-process-newsgroups
+Spam and ham processors specify special actions to take when you exit
+a group buffer.  Spam processors act on spam messages, and ham
+processors on ham messages.  At present, the main role of these
+processors is to update the dictionaries of dictionary-based spam back
+ends such as Bogofilter (@pxref{Bogofilter}) and the Spam Statistics
+package (@pxref{Spam Statistics Filtering}).
+
+The spam and ham processors that apply to each group are determined by
+the group's@code{spam-process} group parameter.  If this group
+parameter is not defined, they are determined by the variable
+@code{gnus-spam-process-newsgroups}.
+
+@vindex gnus-spam-newsgroup-contents
+Gnus learns from the spam you get.  You have to collect your spam in
+one or more spam groups, and set or customize the variable
+@code{spam-junk-mailgroups} as appropriate.  You can also declare
+groups to contain spam by setting their group parameter
+@code{spam-contents} to @code{gnus-group-spam-classification-spam}, or
+by customizing the corresponding variable
+@code{gnus-spam-newsgroup-contents}.  The @code{spam-contents} group
+parameter and the @code{gnus-spam-newsgroup-contents} variable can
+also be used to declare groups as @emph{ham} groups if you set their
+classification to @code{gnus-group-spam-classification-ham}.  If
+groups are not classified by means of @code{spam-junk-mailgroups},
+@code{spam-contents}, or @code{gnus-spam-newsgroup-contents}, they are
+considered @emph{unclassified}.  All groups are unclassified by
+default.
+
+@vindex gnus-spam-mark
+@cindex $
+In spam groups, all messages are considered to be spam by default:
+they get the @samp{$} mark (@code{gnus-spam-mark}) when you enter the
+group.  If you have seen a message, had it marked as spam, then
+unmarked it, it won't be marked as spam when you enter the group
+thereafter.  You can disable that behavior, so all unread messages
+will get the @samp{$} mark, if you set the
+@code{spam-mark-only-unseen-as-spam} parameter to @code{nil}.  You
+should remove the @samp{$} mark when you are in the group summary
+buffer for every message that is not spam after all.  To remove the
+@samp{$} mark, you can use @kbd{M-u} to ``unread'' the article, or
+@kbd{d} for declaring it read the non-spam way.  When you leave a
+group, all spam-marked (@samp{$}) articles are sent to a spam
+processor which will study them as spam samples.
+
+Messages may also be deleted in various other ways, and unless
+@code{ham-marks} group parameter gets overridden below, marks @samp{R}
+and @samp{r} for default read or explicit delete, marks @samp{X} and
+@samp{K} for automatic or explicit kills, as well as mark @samp{Y} for
+low scores, are all considered to be associated with articles which
+are not spam.  This assumption might be false, in particular if you
+use kill files or score files as means for detecting genuine spam, you
+should then adjust the @code{ham-marks} group parameter.
+
+@defvar ham-marks
+You can customize this group or topic parameter to be the list of
+marks you want to consider ham.  By default, the list contains the
+deleted, read, killed, kill-filed, and low-score marks (the idea is
+that these articles have been read, but are not spam).  It can be
+useful to also include the tick mark in the ham marks.  It is not
+recommended to make the unread mark a ham mark, because it normally
+indicates a lack of classification.  But you can do it, and we'll be
+happy for you.
+@end defvar
+
+@defvar spam-marks
+You can customize this group or topic parameter to be the list of
+marks you want to consider spam.  By default, the list contains only
+the spam mark.  It is not recommended to change that, but you can if
+you really want to.
+@end defvar
+
+When you leave @emph{any} group, regardless of its
+@code{spam-contents} classification, all spam-marked articles are sent
+to a spam processor, which will study these as spam samples.  If you
+explicit kill a lot, you might sometimes end up with articles marked
+@samp{K} which you never saw, and which might accidentally contain
+spam.  Best is to make sure that real spam is marked with @samp{$},
+and nothing else.
+
+@vindex gnus-ham-process-destinations
+When you leave a @emph{spam} group, all spam-marked articles are
+marked as expired after processing with the spam processor.  This is
+not done for @emph{unclassified} or @emph{ham} groups.  Also, any
+@strong{ham} articles in a spam group will be moved to a location
+determined by either the @code{ham-process-destination} group
+parameter or a match in the @code{gnus-ham-process-destinations}
+variable, which is a list of regular expressions matched with group
+names (it's easiest to customize this variable with @kbd{M-x
+customize-variable @key{RET} gnus-ham-process-destinations}).  Each
+group name list is a standard Lisp list, if you prefer to customize
+the variable manually.  If the @code{ham-process-destination}
+parameter is not set, ham articles are left in place.  If the
+@code{spam-mark-ham-unread-before-move-from-spam-group} parameter is
+set, the ham articles are marked as unread before being moved.
+
+If ham can not be moved---because of a read-only backend such as
+@acronym{NNTP}, for example, it will be copied.
+
+Note that you can use multiples destinations per group or regular
+expression!  This enables you to send your ham to a regular mail
+group and to a @emph{ham training} group.
+
+When you leave a @emph{ham} group, all ham-marked articles are sent to
+a ham processor, which will study these as non-spam samples.
+
+@vindex spam-process-ham-in-spam-groups
+By default the variable @code{spam-process-ham-in-spam-groups} is
+@code{nil}.  Set it to @code{t} if you want ham found in spam groups
+to be processed.  Normally this is not done, you are expected instead
+to send your ham to a ham group and process it there.
+
+@vindex spam-process-ham-in-nonham-groups
+By default the variable @code{spam-process-ham-in-nonham-groups} is
+@code{nil}.  Set it to @code{t} if you want ham found in non-ham (spam
+or unclassified) groups to be processed.  Normally this is not done,
+you are expected instead to send your ham to a ham group and process
+it there.
+
+@vindex gnus-spam-process-destinations
+When you leave a @emph{ham} or @emph{unclassified} group, all
+@strong{spam} articles are moved to a location determined by either
+the @code{spam-process-destination} group parameter or a match in the
+@code{gnus-spam-process-destinations} variable, which is a list of
+regular expressions matched with group names (it's easiest to
+customize this variable with @kbd{M-x customize-variable @key{RET}
+gnus-spam-process-destinations}).  Each group name list is a standard
+Lisp list, if you prefer to customize the variable manually.  If the
+@code{spam-process-destination} parameter is not set, the spam
+articles are only expired.  The group name is fully qualified, meaning
+that if you see @samp{nntp:servername} before the group name in the
+group buffer then you need it here as well.
+
+If spam can not be moved---because of a read-only backend such as
+@acronym{NNTP}, for example, it will be copied.
+
+Note that you can use multiples destinations per group or regular
+expression!  This enables you to send your spam to multiple @emph{spam
+training} groups.
+
+@vindex spam-log-to-registry
+The problem with processing ham and spam is that Gnus doesn't track
+this processing by default.  Enable the @code{spam-log-to-registry}
+variable so @code{spam.el} will use @code{gnus-registry.el} to track
+what articles have been processed, and avoid processing articles
+multiple times.  Keep in mind that if you limit the number of registry
+entries, this won't work as well as it does without a limit.
+
+@vindex spam-mark-only-unseen-as-spam
+Set this variable if you want only unseen articles in spam groups to
+be marked as spam.  By default, it is set.  If you set it to
+@code{nil}, unread articles will also be marked as spam.
+
+@vindex spam-mark-ham-unread-before-move-from-spam-group
+Set this variable if you want ham to be unmarked before it is moved
+out of the spam group.  This is very useful when you use something
+like the tick mark @samp{!} to mark ham---the article will be placed
+in your @code{ham-process-destination}, unmarked as if it came fresh
+from the mail server.
+
+@vindex spam-autodetect-recheck-messages
+When autodetecting spam, this variable tells @code{spam.el} whether
+only unseen articles or all unread articles should be checked for
+spam.  It is recommended that you leave it off.
+
+@node Spam Package Configuration Examples
+@subsection Spam Package Configuration Examples
+@cindex spam filtering
+@cindex spam filtering configuration examples
+@cindex spam configuration examples
+@cindex spam
+
+@subsubheading Ted's setup
+
+From Ted Zlatanov <tzz@@lifelogs.com>.
+@example
+;; @r{for @code{gnus-registry-split-fancy-with-parent} and spam autodetection}
+;; @r{see @file{gnus-registry.el} for more information}
+(gnus-registry-initialize)
+(spam-initialize)
+
+(setq
+ spam-log-to-registry t     ; @r{for spam autodetection}
+ spam-use-BBDB t
+ spam-use-regex-headers t   ; @r{catch X-Spam-Flag (SpamAssassin)}
+ ;; @r{all groups with @samp{spam} in the name contain spam}
+ gnus-spam-newsgroup-contents
+  '(("spam" gnus-group-spam-classification-spam))
+ ;; @r{see documentation for these}
+ spam-move-spam-nonspam-groups-only nil
+ spam-mark-only-unseen-as-spam t
+ spam-mark-ham-unread-before-move-from-spam-group t
+ nnimap-split-rule 'nnimap-split-fancy
+ ;; @r{understand what this does before you copy it to your own setup!}
+ nnimap-split-fancy '(|
+                      ;; @r{trace references to parents and put in their group}
+                      (: gnus-registry-split-fancy-with-parent)
+                      ;; @r{this will catch server-side SpamAssassin tags}
+                      (: spam-split 'spam-use-regex-headers)
+                      (any "ding" "ding")
+                      ;; @r{note that spam by default will go to @samp{spam}}
+                      (: spam-split)
+                      ;; @r{default mailbox}
+                      "mail"))
+
+;; @r{my parameters, set with @kbd{G p}}
+
+;; @r{all nnml groups, and all nnimap groups except}
+;; @r{@samp{nnimap+mail.lifelogs.com:train} and}
+;; @r{@samp{nnimap+mail.lifelogs.com:spam}: any spam goes to nnimap training,}
+;; @r{because it must have been detected manually}
+
+((spam-process-destination . "nnimap+mail.lifelogs.com:train"))
+
+;; @r{all @acronym{NNTP} groups}
+;; @r{autodetect spam with the blacklist and ham with the BBDB}
+((spam-autodetect-methods spam-use-blacklist spam-use-BBDB)
+;; @r{send all spam to the training group}
+ (spam-process-destination . "nnimap+mail.lifelogs.com:train"))
+
+;; @r{only some @acronym{NNTP} groups, where I want to autodetect spam}
+((spam-autodetect . t))
+
+;; @r{my nnimap @samp{nnimap+mail.lifelogs.com:spam} group}
+
+;; @r{this is a spam group}
+((spam-contents gnus-group-spam-classification-spam)
+
+ ;; @r{any spam (which happens when I enter for all unseen messages,}
+ ;; @r{because of the @code{gnus-spam-newsgroup-contents} setting above), goes to}
+ ;; @r{@samp{nnimap+mail.lifelogs.com:train} unless I mark it as ham}
+
+ (spam-process-destination "nnimap+mail.lifelogs.com:train")
+
+ ;; @r{any ham goes to my @samp{nnimap+mail.lifelogs.com:mail} folder, but}
+ ;; @r{also to my @samp{nnimap+mail.lifelogs.com:trainham} folder for training}
+
+ (ham-process-destination "nnimap+mail.lifelogs.com:mail"
+                          "nnimap+mail.lifelogs.com:trainham")
+ ;; @r{in this group, only @samp{!} marks are ham}
+ (ham-marks
+  (gnus-ticked-mark))
+ ;; @r{remembers senders in the blacklist on the way out---this is}
+ ;; @r{definitely not needed, it just makes me feel better}
+ (spam-process (gnus-group-spam-exit-processor-blacklist)))
+
+;; @r{Later, on the @acronym{IMAP} server I use the @samp{train} group for training}
+;; @r{SpamAssassin to recognize spam, and the @samp{trainham} group fora}
+;; @r{recognizing ham---but Gnus has nothing to do with it.}
+
+@end example
+
+@subsubheading Using @file{spam.el} on an IMAP server with a statistical filter on the server
+From Reiner Steib <reiner.steib@@gmx.de>.
+
+My provider has set up bogofilter (in combination with @acronym{DCC}) on
+the mail server (@acronym{IMAP}).  Recognized spam goes to
+@samp{spam.detected}, the rest goes through the normal filter rules,
+i.e. to @samp{some.folder} or to @samp{INBOX}.  Training on false
+positives or negatives is done by copying or moving the article to
+@samp{training.ham} or @samp{training.spam} respectively.  A cron job on
+the server feeds those to bogofilter with the suitable ham or spam
+options and deletes them from the @samp{training.ham} and
+@samp{training.spam} folders.
+
+With the following entries in @code{gnus-parameters}, @code{spam.el}
+does most of the job for me:
+
+@lisp
+   ("nnimap:spam\\.detected"
+    (gnus-article-sort-functions '(gnus-article-sort-by-chars))
+    (ham-process-destination "nnimap:INBOX" "nnimap:training.ham")
+    (spam-contents gnus-group-spam-classification-spam))
+   ("nnimap:\\(INBOX\\|other-folders\\)"
+    (spam-process-destination . "nnimap:training.spam")
+    (spam-contents gnus-group-spam-classification-ham))
+@end lisp
+
+@itemize
+
+@item @b{The Spam folder:}
+
+In the folder @samp{spam.detected}, I have to check for false positives
+(i.e. legitimate mails, that were wrongly judged as spam by
+bogofilter or DCC).
+
+Because of the @code{gnus-group-spam-classification-spam} entry, all
+messages are marked as spam (with @code{$}).  When I find a false
+positive, I mark the message with some other ham mark
+(@code{ham-marks}, @ref{Spam and Ham Processors}).  On group exit,
+those messages are copied to both groups, @samp{INBOX} (where I want
+to have the article) and @samp{training.ham} (for training bogofilter)
+and deleted from the @samp{spam.detected} folder.
+
+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.)
+
+@item @b{Ham folders:}
+
+In my ham folders, I just hit @kbd{S x}
+(@code{gnus-summary-mark-as-spam}) whenever I see an unrecognized spam
+mail (false negative).  On group exit, those messages are moved to
+@samp{training.ham}.
+@end itemize
+
+@subsubheading Reporting spam articles in Gmane groups with @code{spam-report.el}
+
+From Reiner Steib <reiner.steib@@gmx.de>.
+
+With following entry in @code{gnus-parameters}, @kbd{S x}
+(@code{gnus-summary-mark-as-spam}) marks articles in @code{gmane.*}
+groups as spam and reports the to Gmane at group exit:
+
+@lisp
+   ("^gmane\\."
+    (spam-process (gnus-group-spam-exit-processor-report-gmane)))
+@end lisp
+
+Additionally, I use @code{(setq spam-report-gmane-use-article-number nil)}
+because I don't read the groups directly from news.gmane.org, but
+through my local news server (leafnode).  I.e. the article numbers are
+not the same as on news.gmane.org, thus @code{spam-report.el} has to check
+the @code{X-Report-Spam} header to find the correct number.
+
+@node Spam Back Ends
+@subsection Spam Back Ends
+@cindex spam back ends
+
+The spam package offers a variety of back ends for detecting spam.
+Each back end defines a set of methods for detecting spam
+(@pxref{Filtering Incoming Mail}, @pxref{Detecting Spam in Groups}),
+and a pair of spam and ham processors (@pxref{Spam and Ham
+Processors}).
+
+@menu
+* Blacklists and Whitelists::
+* BBDB Whitelists::
+* Gmane Spam Reporting::
+* Anti-spam Hashcash Payments::
+* Blackholes::
+* Regular Expressions Header Matching::
+* Bogofilter::
+* ifile spam filtering::
+* Spam Statistics Filtering::
+* SpamOracle::
+@end menu
+
+@node Blacklists and Whitelists
+@subsubsection Blacklists and Whitelists
+@cindex spam filtering
+@cindex whitelists, spam filtering
+@cindex blacklists, spam filtering
+@cindex spam
+
+@defvar spam-use-blacklist
+
+Set this variable to @code{t} if you want to use blacklists when
+splitting incoming mail.  Messages whose senders are in the blacklist
+will be sent to the @code{spam-split-group}.  This is an explicit
+filter, meaning that it acts only on mail senders @emph{declared} to
+be spammers.
+
+@end defvar
+
+@defvar spam-use-whitelist
+
+Set this variable to @code{t} if you want to use whitelists when
+splitting incoming mail.  Messages whose senders are not in the
+whitelist will be sent to the next spam-split rule.  This is an
+explicit filter, meaning that unless someone is in the whitelist, their
+messages are not assumed to be spam or ham.
+
+@end defvar
+
+@defvar spam-use-whitelist-exclusive
+
+Set this variable to @code{t} if you want to use whitelists as an
+implicit filter, meaning that every message will be considered spam
+unless the sender is in the whitelist.  Use with care.
+
+@end defvar
+
+@defvar gnus-group-spam-exit-processor-blacklist
+
+Add this symbol to a group's @code{spam-process} parameter by
+customizing the group parameters or the
+@code{gnus-spam-process-newsgroups} variable.  When this symbol is
+added to a group's @code{spam-process} parameter, the senders of
+spam-marked articles will be added to the blacklist.
+
+@emph{WARNING}
+
+Instead of the obsolete
+@code{gnus-group-spam-exit-processor-blacklist}, it is recommended
+that you use @code{'(spam spam-use-blacklist)}.  Everything will work
+the same way, we promise.
+
+@end defvar
+
+@defvar gnus-group-ham-exit-processor-whitelist
+
+Add this symbol to a group's @code{spam-process} parameter by
+customizing the group parameters or the
+@code{gnus-spam-process-newsgroups} variable.  When this symbol is
+added to a group's @code{spam-process} parameter, the senders of
+ham-marked articles in @emph{ham} groups will be added to the
+whitelist.  Note that this ham processor has no effect in @emph{spam}
+or @emph{unclassified} groups.
+
+@emph{WARNING}
+
+Instead of the obsolete
+@code{gnus-group-ham-exit-processor-whitelist}, it is recommended
+that you use @code{'(ham spam-use-whitelist)}.  Everything will work
+the same way, we promise.
+
+@end defvar
+
+Blacklists are lists of regular expressions matching addresses you
+consider to be spam senders.  For instance, to block mail from any
+sender at @samp{vmadmin.com}, you can put @samp{vmadmin.com} in your
+blacklist.  You start out with an empty blacklist.  Blacklist entries
+use the Emacs regular expression syntax.
+
+Conversely, whitelists tell Gnus what addresses are considered
+legitimate.  All messages from whitelisted addresses are considered
+non-spam.  Also see @ref{BBDB Whitelists}.  Whitelist entries use the
+Emacs regular expression syntax.
+
+The blacklist and whitelist file locations can be customized with the
+@code{spam-directory} variable (@file{~/News/spam} by default), or
+the @code{spam-whitelist} and @code{spam-blacklist} variables
+directly.  The whitelist and blacklist files will by default be in the
+@code{spam-directory} directory, named @file{whitelist} and
+@file{blacklist} respectively.
+
+@node BBDB Whitelists
+@subsubsection BBDB Whitelists
+@cindex spam filtering
+@cindex BBDB whitelists, spam filtering
+@cindex BBDB, spam filtering
+@cindex spam
+
+@defvar spam-use-BBDB
+
+Analogous to @code{spam-use-whitelist} (@pxref{Blacklists and
+Whitelists}), but uses the BBDB as the source of whitelisted
+addresses, without regular expressions.  You must have the BBDB loaded
+for @code{spam-use-BBDB} to work properly.  Messages whose senders are
+not in the BBDB will be sent to the next spam-split rule.  This is an
+explicit filter, meaning that unless someone is in the BBDB, their
+messages are not assumed to be spam or ham.
+
+@end defvar
+
+@defvar spam-use-BBDB-exclusive
+
+Set this variable to @code{t} if you want to use the BBDB as an
+implicit filter, meaning that every message will be considered spam
+unless the sender is in the BBDB.  Use with care.  Only sender
+addresses in the BBDB will be allowed through; all others will be
+classified as spammers.
+
+@end defvar
+
+@defvar gnus-group-ham-exit-processor-BBDB
+
+Add this symbol to a group's @code{spam-process} parameter by
+customizing the group parameters or the
+@code{gnus-spam-process-newsgroups} variable.  When this symbol is
+added to a group's @code{spam-process} parameter, the senders of
+ham-marked articles in @emph{ham} groups will be added to the
+BBDB.  Note that this ham processor has no effect in @emph{spam}
+or @emph{unclassified} groups.
+
+@emph{WARNING}
+
+Instead of the obsolete
+@code{gnus-group-ham-exit-processor-BBDB}, it is recommended
+that you use @code{'(ham spam-use-BBDB)}.  Everything will work
+the same way, we promise.
+
+@end defvar
+
+@node Gmane Spam Reporting
+@subsubsection Gmane Spam Reporting
+@cindex spam reporting
+@cindex Gmane, spam reporting
+@cindex Gmane, spam reporting
+@cindex spam
+
+@defvar gnus-group-spam-exit-processor-report-gmane
+
+Add this symbol to a group's @code{spam-process} parameter by
+customizing the group parameters or the
+@code{gnus-spam-process-newsgroups} variable.  When this symbol is
+added to a group's @code{spam-process} parameter, the spam-marked
+articles groups will be reported to the Gmane administrators via a
+HTTP request.
+
+Gmane can be found at @uref{http://gmane.org}.
+
+@emph{WARNING}
+
+Instead of the obsolete
+@code{gnus-group-spam-exit-processor-report-gmane}, it is recommended
+that you use @code{'(spam spam-use-gmane)}.  Everything will work the
+same way, we promise.
+
+@end defvar
+
+@defvar spam-report-gmane-use-article-number
+
+This variable is @code{t} by default.  Set it to @code{nil} if you are
+running your own news server, for instance, and the local article
+numbers don't correspond to the Gmane article numbers.  When
+@code{spam-report-gmane-use-article-number} is @code{nil},
+@code{spam-report.el} will use the @code{X-Report-Spam} header that
+Gmane provides.
+
+@end defvar
+
+@node Anti-spam Hashcash Payments
+@subsubsection Anti-spam Hashcash Payments
+@cindex spam filtering
+@cindex hashcash, spam filtering
+@cindex spam
+
+@defvar spam-use-hashcash
+
+Similar to @code{spam-use-whitelist} (@pxref{Blacklists and
+Whitelists}), but uses hashcash tokens for whitelisting messages
+instead of the sender address.  You must have the @code{hashcash.el}
+package loaded for @code{spam-use-hashcash} to work properly.
+Messages without a hashcash payment token will be sent to the next
+spam-split rule.  This is an explicit filter, meaning that unless a
+hashcash token is found, the messages are not assumed to be spam or
+ham.
+
+@end defvar
+
+@node Blackholes
+@subsubsection Blackholes
+@cindex spam filtering
+@cindex blackholes, spam filtering
+@cindex spam
+
+@defvar spam-use-blackholes
+
+This option is disabled by default.  You can let Gnus consult the
+blackhole-type distributed spam processing systems (DCC, for instance)
+when you set this option.  The variable @code{spam-blackhole-servers}
+holds the list of blackhole servers Gnus will consult.  The current
+list is fairly comprehensive, but make sure to let us know if it
+contains outdated servers.
+
+The blackhole check uses the @code{dig.el} package, but you can tell
+@file{spam.el} to use @code{dns.el} instead for better performance if
+you set @code{spam-use-dig} to @code{nil}.  It is not recommended at
+this time to set @code{spam-use-dig} to @code{nil} despite the
+possible performance improvements, because some users may be unable to
+use it, but you can try it and see if it works for you.
+
+@end defvar
+
+@defvar spam-blackhole-servers
+
+The list of servers to consult for blackhole checks.
+
+@end defvar
+
+@defvar spam-blackhole-good-server-regex
+
+A regular expression for IPs that should not be checked against the
+blackhole server list.  When set to @code{nil}, it has no effect.
+
+@end defvar
+
+@defvar spam-use-dig
+
+Use the @code{dig.el} package instead of the @code{dns.el} package.
+The default setting of @code{t} is recommended.
+
+@end defvar
+
+Blackhole checks are done only on incoming mail.  There is no spam or
+ham processor for blackholes.
+
+@node Regular Expressions Header Matching
+@subsubsection Regular Expressions Header Matching
+@cindex spam filtering
+@cindex regular expressions header matching, spam filtering
+@cindex spam
+
+@defvar spam-use-regex-headers
+
+This option is disabled by default.  You can let Gnus check the
+message headers against lists of regular expressions when you set this
+option.  The variables @code{spam-regex-headers-spam} and
+@code{spam-regex-headers-ham} hold the list of regular expressions.
+Gnus will check against the message headers to determine if the
+message is spam or ham, respectively.
+
+@end defvar
+
+@defvar spam-regex-headers-spam
+
+The list of regular expressions that, when matched in the headers of
+the message, positively identify it as spam.
+
+@end defvar
+
+@defvar spam-regex-headers-ham
+
+The list of regular expressions that, when matched in the headers of
+the message, positively identify it as ham.
+
+@end defvar
+
+Regular expression header checks are done only on incoming mail.
+There is no specific spam or ham processor for regular expressions.
+
+@node Bogofilter
+@subsubsection Bogofilter
+@cindex spam filtering
+@cindex bogofilter, spam filtering
+@cindex spam
+
+@defvar spam-use-bogofilter
+
+Set this variable if you want @code{spam-split} to use Eric Raymond's
+speedy Bogofilter.
+
+With a minimum of care for associating the @samp{$} mark for spam
+articles only, Bogofilter training all gets fairly automatic.  You
+should do this until you get a few hundreds of articles in each
+category, spam or not.  The command @kbd{S t} in summary mode, either
+for debugging or for curiosity, shows the @emph{spamicity} score of
+the current article (between 0.0 and 1.0).
+
+Bogofilter determines if a message is spam based on a specific
+threshold.  That threshold can be customized, consult the Bogofilter
+documentation.
+
+If the @code{bogofilter} executable is not in your path, Bogofilter
+processing will be turned off.
+
+You should not enable this if you use @code{spam-use-bogofilter-headers}.
+
+@end defvar
+
+@table @kbd
+@item M s t
+@itemx S t
+@kindex M s t
+@kindex S t
+@findex spam-bogofilter-score
+Get the Bogofilter spamicity score (@code{spam-bogofilter-score}).
+@end table
+
+@defvar spam-use-bogofilter-headers
+
+Set this variable if you want @code{spam-split} to use Eric Raymond's
+speedy Bogofilter, looking only at the message headers.  It works
+similarly to @code{spam-use-bogofilter}, but the @code{X-Bogosity} header
+must be in the message already.  Normally you would do this with a
+procmail recipe or something similar; consult the Bogofilter
+installation documents for details.
+
+You should not enable this if you use @code{spam-use-bogofilter}.
+
+@end defvar
+
+@defvar gnus-group-spam-exit-processor-bogofilter
+Add this symbol to a group's @code{spam-process} parameter by
+customizing the group parameters or the
+@code{gnus-spam-process-newsgroups} variable.  When this symbol is
+added to a group's @code{spam-process} parameter, spam-marked articles
+will be added to the Bogofilter spam database.
+
+@emph{WARNING}
+
+Instead of the obsolete
+@code{gnus-group-spam-exit-processor-bogofilter}, it is recommended
+that you use @code{'(spam spam-use-bogofilter)}.  Everything will work
+the same way, we promise.
+@end defvar
+
+@defvar gnus-group-ham-exit-processor-bogofilter
+Add this symbol to a group's @code{spam-process} parameter by
+customizing the group parameters or the
+@code{gnus-spam-process-newsgroups} variable.  When this symbol is
+added to a group's @code{spam-process} parameter, the ham-marked
+articles in @emph{ham} groups will be added to the Bogofilter database
+of non-spam messages.  Note that this ham processor has no effect in
+@emph{spam} or @emph{unclassified} groups.
+
+@emph{WARNING}
+
+Instead of the obsolete
+@code{gnus-group-ham-exit-processor-bogofilter}, it is recommended
+that you use @code{'(ham spam-use-bogofilter)}.  Everything will work
+the same way, we promise.
+@end defvar
+
+@defvar spam-bogofilter-database-directory
+
+This is the directory where Bogofilter will store its databases.  It
+is not specified by default, so Bogofilter will use its own default
+database directory.
+
+@end defvar
+
+The Bogofilter mail classifier is similar to @command{ifile} in intent and
+purpose.  A ham and a spam processor are provided, plus the
+@code{spam-use-bogofilter} and @code{spam-use-bogofilter-headers}
+variables to indicate to spam-split that Bogofilter should either be
+used, or has already been used on the article.  The 0.9.2.1 version of
+Bogofilter was used to test this functionality.
+
+@node ifile spam filtering
+@subsubsection ifile spam filtering
+@cindex spam filtering
+@cindex ifile, spam filtering
+@cindex spam
+
+@defvar spam-use-ifile
+
+Enable this variable if you want @code{spam-split} to use @command{ifile}, a
+statistical analyzer similar to Bogofilter.
+
+@end defvar
+
+@defvar spam-ifile-all-categories
+
+Enable this variable if you want @code{spam-use-ifile} to give you all
+the ifile categories, not just spam/non-spam.  If you use this, make
+sure you train ifile as described in its documentation.
+
+@end defvar
+
+@defvar spam-ifile-spam-category
+
+This is the category of spam messages as far as ifile is concerned.
+The actual string used is irrelevant, but you probably want to leave
+the default value of @samp{spam}.
+@end defvar
+
+@defvar spam-ifile-database
+
+This is the filename for the ifile database.  It is not specified by
+default, so ifile will use its own default database name.
+
+@end defvar
+
+The ifile mail classifier is similar to Bogofilter in intent and
+purpose.  A ham and a spam processor are provided, plus the
+@code{spam-use-ifile} variable to indicate to spam-split that ifile
+should be used.  The 1.2.1 version of ifile was used to test this
+functionality.
+
+@node Spam Statistics Filtering
+@subsubsection Spam Statistics Filtering
+@cindex spam filtering
+@cindex spam-stat, spam filtering
+@cindex spam-stat
+@cindex spam
+
+This back end uses the Spam Statistics Emacs Lisp package to perform
+statistics-based filtering (@pxref{Spam Statistics Package}).  Before
+using this, you may want to perform some additional steps to
+initialize your Spam Statistics dictionary.  @xref{Creating a
+spam-stat dictionary}.
+
+@defvar spam-use-stat
+
+@end defvar
+
+@defvar gnus-group-spam-exit-processor-stat
+Add this symbol to a group's @code{spam-process} parameter by
+customizing the group parameters or the
+@code{gnus-spam-process-newsgroups} variable.  When this symbol is
+added to a group's @code{spam-process} parameter, the spam-marked
+articles will be added to the spam-stat database of spam messages.
+
+@emph{WARNING}
+
+Instead of the obsolete
+@code{gnus-group-spam-exit-processor-stat}, it is recommended
+that you use @code{'(spam spam-use-stat)}.  Everything will work
+the same way, we promise.
+@end defvar
+
+@defvar gnus-group-ham-exit-processor-stat
+Add this symbol to a group's @code{spam-process} parameter by
+customizing the group parameters or the
+@code{gnus-spam-process-newsgroups} variable.  When this symbol is
+added to a group's @code{spam-process} parameter, the ham-marked
+articles in @emph{ham} groups will be added to the spam-stat database
+of non-spam messages.  Note that this ham processor has no effect in
+@emph{spam} or @emph{unclassified} groups.
+
+@emph{WARNING}
+
+Instead of the obsolete
+@code{gnus-group-ham-exit-processor-stat}, it is recommended
+that you use @code{'(ham spam-use-stat)}.  Everything will work
+the same way, we promise.
+@end defvar
+
+This enables @file{spam.el} to cooperate with @file{spam-stat.el}.
+@file{spam-stat.el} provides an internal (Lisp-only) spam database,
+which unlike ifile or Bogofilter does not require external programs.
+A spam and a ham processor, and the @code{spam-use-stat} variable for
+@code{spam-split} are provided.
+
+@node SpamOracle
+@subsubsection Using SpamOracle with Gnus
+@cindex spam filtering
+@cindex SpamOracle
+@cindex spam
+
+An easy way to filter out spam is to use SpamOracle.  SpamOracle is an
+statistical mail filtering tool written by Xavier Leroy and needs to be
+installed separately.
+
+There are several ways to use SpamOracle with Gnus.  In all cases, your
+mail is piped through SpamOracle in its @emph{mark} mode.  SpamOracle will
+then enter an @samp{X-Spam} header indicating whether it regards the
+mail as a spam mail or not.
+
+One possibility is to run SpamOracle as a @code{:prescript} from the
+@xref{Mail Source Specifiers}, (@pxref{SpamAssassin}).  This method has
+the advantage that the user can see the @emph{X-Spam} headers.
+
+The easiest method is to make @file{spam.el} (@pxref{Spam Package})
+call SpamOracle.
+
+@vindex spam-use-spamoracle
+To enable SpamOracle usage by @file{spam.el}, set the variable
+@code{spam-use-spamoracle} to @code{t} and configure the
+@code{nnmail-split-fancy} or @code{nnimap-split-fancy}.  @xref{Spam
+Package}.  In this example the @samp{INBOX} of an nnimap server is
+filtered using SpamOracle.  Mails recognized as spam mails will be
+moved to @code{spam-split-group}, @samp{Junk} in this case.  Ham
+messages stay in @samp{INBOX}:
+
+@example
+(setq spam-use-spamoracle t
+      spam-split-group "Junk"
+      nnimap-split-inbox '("INBOX")
+      nnimap-split-rule 'nnimap-split-fancy
+      nnimap-split-fancy '(| (: spam-split) "INBOX"))
+@end example
+
+@defvar spam-use-spamoracle
+Set to @code{t} if you want Gnus to enable spam filtering using
+SpamOracle.
+@end defvar
+
+@defvar spam-spamoracle-binary
+Gnus uses the SpamOracle binary called @file{spamoracle} found in the
+user's PATH.  Using the variable @code{spam-spamoracle-binary}, this
+can be customized.
+@end defvar
+
+@defvar spam-spamoracle-database
+By default, SpamOracle uses the file @file{~/.spamoracle.db} as a database to
+store its analysis.  This is controlled by the variable
+@code{spam-spamoracle-database} which defaults to @code{nil}.  That means
+the default SpamOracle database will be used.  In case you want your
+database to live somewhere special, set
+@code{spam-spamoracle-database} to this path.
+@end defvar
+
+SpamOracle employs a statistical algorithm to determine whether a
+message is spam or ham.  In order to get good results, meaning few
+false hits or misses, SpamOracle needs training.  SpamOracle learns
+the characteristics of your spam mails.  Using the @emph{add} mode
+(training mode) one has to feed good (ham) and spam mails to
+SpamOracle.  This can be done by pressing @kbd{|} in the Summary
+buffer and pipe the mail to a SpamOracle process or using
+@file{spam.el}'s spam- and ham-processors, which is much more
+convenient.  For a detailed description of spam- and ham-processors,
+@xref{Spam Package}.
+
+@defvar gnus-group-spam-exit-processor-spamoracle
+Add this symbol to a group's @code{spam-process} parameter by
+customizing the group parameter or the
+@code{gnus-spam-process-newsgroups} variable.  When this symbol is added
+to a group's @code{spam-process} parameter, spam-marked articles will be
+sent to SpamOracle as spam samples.
+
+@emph{WARNING}
+
+Instead of the obsolete
+@code{gnus-group-spam-exit-processor-spamoracle}, it is recommended
+that you use @code{'(spam spam-use-spamoracle)}.  Everything will work
+the same way, we promise.
+@end defvar
+
+@defvar gnus-group-ham-exit-processor-spamoracle
+Add this symbol to a group's @code{spam-process} parameter by
+customizing the group parameter or the
+@code{gnus-spam-process-newsgroups} variable.  When this symbol is added
+to a group's @code{spam-process} parameter, the ham-marked articles in
+@emph{ham} groups will be sent to the SpamOracle as samples of ham
+messages.  Note that this ham processor has no effect in @emph{spam} or
+@emph{unclassified} groups.
+
+@emph{WARNING}
+
+Instead of the obsolete
+@code{gnus-group-ham-exit-processor-spamoracle}, it is recommended
+that you use @code{'(ham spam-use-spamoracle)}.  Everything will work
+the same way, we promise.
+@end defvar
+
+@emph{Example:} These are the Group Parameters of a group that has been
+classified as a ham group, meaning that it should only contain ham
+messages.
+@example
+ ((spam-contents gnus-group-spam-classification-ham)
+  (spam-process ((ham spam-use-spamoracle)
+                 (spam spam-use-spamoracle))))
+@end example
+For this group the @code{spam-use-spamoracle} is installed for both
+ham and spam processing.  If the group contains spam message
+(e.g. because SpamOracle has not had enough sample messages yet) and
+the user marks some messages as spam messages, these messages will be
+processed by SpamOracle.  The processor sends the messages to
+SpamOracle as new samples for spam.
+
+@node Extending the Spam package
+@subsection Extending the Spam package
+@cindex spam filtering
+@cindex spam elisp package, extending
+@cindex extending the spam elisp package
+
+Say you want to add a new back end called blackbox.  For filtering
+incoming mail, provide the following:
+
+@enumerate
+
+@item
+Code
+
+@lisp
+(defvar spam-use-blackbox nil
+  "True if blackbox should be used.")
+@end lisp
+
+Add
+@lisp
+(spam-use-blackbox   . spam-check-blackbox)
+@end lisp
+to @code{spam-list-of-checks}.
+
+Add
+@lisp
+(gnus-group-ham-exit-processor-blackbox  ham spam-use-blackbox)
+(gnus-group-spam-exit-processor-blackbox spam spam-use-blackbox)
+@end lisp
+
+to @code{spam-list-of-processors}.
+
+Add
+@lisp
+(spam-use-blackbox spam-blackbox-register-routine
+                   nil
+                   spam-blackbox-unregister-routine
+                   nil)
+@end lisp
+
+to @code{spam-registration-functions}.  Write the register/unregister
+routines using the bogofilter register/unregister routines as a
+start, or other register/unregister routines more appropriate to
+Blackbox.
+
+@item
+Functionality
+
+Write the @code{spam-check-blackbox} function.  It should return
+@samp{nil} or @code{spam-split-group}, observing the other
+conventions.  See the existing @code{spam-check-*} functions for
+examples of what you can do, and stick to the template unless you
+fully understand the reasons why you aren't.
+
+Make sure to add @code{spam-use-blackbox} to
+@code{spam-list-of-statistical-checks} if Blackbox is a statistical
+mail analyzer that needs the full message body to operate.
+
+@end enumerate
+
+For processing spam and ham messages, provide the following:
+
+@enumerate
+
+@item
+Code
+
+Note you don't have to provide a spam or a ham processor.  Only
+provide them if Blackbox supports spam or ham processing.
+
+Also, ham and spam processors are being phased out as single
+variables.  Instead the form @code{'(spam spam-use-blackbox)} or
+@code{'(ham spam-use-blackbox)} is favored.  For now, spam/ham
+processor variables are still around but they won't be for long.
+
+@lisp
+(defvar gnus-group-spam-exit-processor-blackbox "blackbox-spam"
+  "The Blackbox summary exit spam processor.
+Only applicable to spam groups.")
+
+(defvar gnus-group-ham-exit-processor-blackbox "blackbox-ham"
+  "The whitelist summary exit ham processor.
+Only applicable to non-spam (unclassified and ham) groups.")
+
+@end lisp
+
+@item
+Gnus parameters
+
+Add
+@lisp
+(const :tag "Spam: Blackbox" (spam spam-use-blackbox))
+(const :tag "Ham: Blackbox"  (ham spam-use-blackbox))
+@end lisp
+to the @code{spam-process} group parameter in @code{gnus.el}.  Make
+sure you do it twice, once for the parameter and once for the
+variable customization.
+
+Add
+@lisp
+(variable-item spam-use-blackbox)
+@end lisp
+to the @code{spam-autodetect-methods} group parameter in
+@code{gnus.el}.
+
+@end enumerate
+
+@node Spam Statistics Package
+@subsection Spam Statistics Package
+@cindex Paul Graham
+@cindex Graham, Paul
+@cindex naive Bayesian spam filtering
+@cindex Bayesian spam filtering, naive
+@cindex spam filtering, naive Bayesian
+
+Paul Graham has written an excellent essay about spam filtering using
+statistics: @uref{http://www.paulgraham.com/spam.html,A Plan for
+Spam}.  In it he describes the inherent deficiency of rule-based
+filtering as used by SpamAssassin, for example: Somebody has to write
+the rules, and everybody else has to install these rules.  You are
+always late.  It would be much better, he argues, to filter mail based
+on whether it somehow resembles spam or non-spam.  One way to measure
+this is word distribution.  He then goes on to describe a solution
+that checks whether a new mail resembles any of your other spam mails
+or not.
+
+The basic idea is this:  Create a two collections of your mail, one
+with spam, one with non-spam.  Count how often each word appears in
+either collection, weight this by the total number of mails in the
+collections, and store this information in a dictionary.  For every
+word in a new mail, determine its probability to belong to a spam or a
+non-spam mail.  Use the 15 most conspicuous words, compute the total
+probability of the mail being spam.  If this probability is higher
+than a certain threshold, the mail is considered to be spam.
+
+The Spam Statistics package adds support to Gnus for this kind of
+filtering.  It can be used as one of the back ends of the Spam package
+(@pxref{Spam Package}), or by itself.
+
+Before using the Spam Statistics package, you need to set it up.
+First, you need two collections of your mail, one with spam, one with
+non-spam.  Then you need to create a dictionary using these two
+collections, and save it.  And last but not least, you need to use
+this dictionary in your fancy mail splitting rules.
+
+@menu
+* Creating a spam-stat dictionary::
+* Splitting mail using spam-stat::
+* Low-level interface to the spam-stat dictionary::
+@end menu
+
+@node Creating a spam-stat dictionary
+@subsubsection Creating a spam-stat dictionary
+
+Before you can begin to filter spam based on statistics, you must
+create these statistics based on two mail collections, one with spam,
+one with non-spam.  These statistics are then stored in a dictionary
+for later use.  In order for these statistics to be meaningful, you
+need several hundred emails in both collections.
+
+Gnus currently supports only the nnml back end for automated dictionary
+creation.  The nnml back end stores all mails in a directory, one file
+per mail.  Use the following:
+
+@defun spam-stat-process-spam-directory
+Create spam statistics for every file in this directory.  Every file
+is treated as one spam mail.
+@end defun
+
+@defun spam-stat-process-non-spam-directory
+Create non-spam statistics for every file in this directory.  Every
+file is treated as one non-spam mail.
+@end defun
+
+Usually you would call @code{spam-stat-process-spam-directory} on a
+directory such as @file{~/Mail/mail/spam} (this usually corresponds to
+the group @samp{nnml:mail.spam}), and you would call
+@code{spam-stat-process-non-spam-directory} on a directory such as
+@file{~/Mail/mail/misc} (this usually corresponds to the group
+@samp{nnml:mail.misc}).
+
+When you are using @acronym{IMAP}, you won't have the mails available
+locally, so that will not work.  One solution is to use the Gnus Agent
+to cache the articles.  Then you can use directories such as
+@file{"~/News/agent/nnimap/mail.yourisp.com/personal_spam"} for
+@code{spam-stat-process-spam-directory}.  @xref{Agent as Cache}.
+
+@defvar spam-stat
+This variable holds the hash-table with all the statistics---the
+dictionary we have been talking about.  For every word in either
+collection, this hash-table stores a vector describing how often the
+word appeared in spam and often it appeared in non-spam mails.
+@end defvar
+
+If you want to regenerate the statistics from scratch, you need to
+reset the dictionary.
+
+@defun spam-stat-reset
+Reset the @code{spam-stat} hash-table, deleting all the statistics.
+@end defun
+
+When you are done, you must save the dictionary.  The dictionary may
+be rather large.  If you will not update the dictionary incrementally
+(instead, you will recreate it once a month, for example), then you
+can reduce the size of the dictionary by deleting all words that did
+not appear often enough or that do not clearly belong to only spam or
+only non-spam mails.
+
+@defun spam-stat-reduce-size
+Reduce the size of the dictionary.  Use this only if you do not want
+to update the dictionary incrementally.
+@end defun
+
+@defun spam-stat-save
+Save the dictionary.
+@end defun
+
+@defvar spam-stat-file
+The filename used to store the dictionary.  This defaults to
+@file{~/.spam-stat.el}.
+@end defvar
+
+@node Splitting mail using spam-stat
+@subsubsection Splitting mail using spam-stat
+
+This section describes how to use the Spam statistics
+@emph{independently} of the @xref{Spam Package}.
+
+First, add the following to your @file{~/.gnus.el} file:
+
+@lisp
+(require 'spam-stat)
+(spam-stat-load)
+@end lisp
+
+This will load the necessary Gnus code, and the dictionary you
+created.
+
+Next, you need to adapt your fancy splitting rules:  You need to
+determine how to use @code{spam-stat}.  The following examples are for
+the nnml back end.  Using the nnimap back end works just as well.  Just
+use @code{nnimap-split-fancy} instead of @code{nnmail-split-fancy}.
+
+In the simplest case, you only have two groups, @samp{mail.misc} and
+@samp{mail.spam}.  The following expression says that mail is either
+spam or it should go into @samp{mail.misc}.  If it is spam, then
+@code{spam-stat-split-fancy} will return @samp{mail.spam}.
+
+@lisp
+(setq nnmail-split-fancy
+      `(| (: spam-stat-split-fancy)
+          "mail.misc"))
+@end lisp
+
+@defvar spam-stat-split-fancy-spam-group
+The group to use for spam.  Default is @samp{mail.spam}.
+@end defvar
+
+If you also filter mail with specific subjects into other groups, use
+the following expression.  Only mails not matching the regular
+expression are considered potential spam.
+
+@lisp
+(setq nnmail-split-fancy
+      `(| ("Subject" "\\bspam-stat\\b" "mail.emacs")
+          (: spam-stat-split-fancy)
+          "mail.misc"))
+@end lisp
+
+If you want to filter for spam first, then you must be careful when
+creating the dictionary.  Note that @code{spam-stat-split-fancy} must
+consider both mails in @samp{mail.emacs} and in @samp{mail.misc} as
+non-spam, therefore both should be in your collection of non-spam
+mails, when creating the dictionary!
+
+@lisp
+(setq nnmail-split-fancy
+      `(| (: spam-stat-split-fancy)
+          ("Subject" "\\bspam-stat\\b" "mail.emacs")
+          "mail.misc"))
+@end lisp
+
+You can combine this with traditional filtering.  Here, we move all
+HTML-only mails into the @samp{mail.spam.filtered} group.  Note that since
+@code{spam-stat-split-fancy} will never see them, the mails in
+@samp{mail.spam.filtered} should be neither in your collection of spam mails,
+nor in your collection of non-spam mails, when creating the
+dictionary!
+
+@lisp
+(setq nnmail-split-fancy
+      `(| ("Content-Type" "text/html" "mail.spam.filtered")
+          (: spam-stat-split-fancy)
+          ("Subject" "\\bspam-stat\\b" "mail.emacs")
+          "mail.misc"))
+@end lisp
+
+
+@node Low-level interface to the spam-stat dictionary
+@subsubsection Low-level interface to the spam-stat dictionary
+
+The main interface to using @code{spam-stat}, are the following functions:
+
+@defun spam-stat-buffer-is-spam
+Called in a buffer, that buffer is considered to be a new spam mail.
+Use this for new mail that has not been processed before.
+@end defun
+
+@defun spam-stat-buffer-is-no-spam
+Called in a buffer, that buffer is considered to be a new non-spam
+mail.  Use this for new mail that has not been processed before.
+@end defun
+
+@defun spam-stat-buffer-change-to-spam
+Called in a buffer, that buffer is no longer considered to be normal
+mail but spam.  Use this to change the status of a mail that has
+already been processed as non-spam.
+@end defun
+
+@defun spam-stat-buffer-change-to-non-spam
+Called in a buffer, that buffer is no longer considered to be spam but
+normal mail.  Use this to change the status of a mail that has already
+been processed as spam.
+@end defun
+
+@defun spam-stat-save
+Save the hash table to the file.  The filename used is stored in the
+variable @code{spam-stat-file}.
+@end defun
+
+@defun spam-stat-load
+Load the hash table from a file.  The filename used is stored in the
+variable @code{spam-stat-file}.
+@end defun
+
+@defun spam-stat-score-word
+Return the spam score for a word.
+@end defun
+
+@defun spam-stat-score-buffer
+Return the spam score for a buffer.
+@end defun
+
+@defun spam-stat-split-fancy
+Use this function for fancy mail splitting.  Add the rule @samp{(:
+spam-stat-split-fancy)} to @code{nnmail-split-fancy}
+@end defun
+
+Make sure you load the dictionary before using it.  This requires the
+following in your @file{~/.gnus.el} file:
+
+@lisp
+(require 'spam-stat)
+(spam-stat-load)
+@end lisp
+
+Typical test will involve calls to the following functions:
+
+@smallexample
+Reset: (setq spam-stat (make-hash-table :test 'equal))
+Learn spam: (spam-stat-process-spam-directory "~/Mail/mail/spam")
+Learn non-spam: (spam-stat-process-non-spam-directory "~/Mail/mail/misc")
+Save table: (spam-stat-save)
+File size: (nth 7 (file-attributes spam-stat-file))
+Number of words: (hash-table-count spam-stat)
+Test spam: (spam-stat-test-directory "~/Mail/mail/spam")
+Test non-spam: (spam-stat-test-directory "~/Mail/mail/misc")
+Reduce table size: (spam-stat-reduce-size)
+Save table: (spam-stat-save)
+File size: (nth 7 (file-attributes spam-stat-file))
+Number of words: (hash-table-count spam-stat)
+Test spam: (spam-stat-test-directory "~/Mail/mail/spam")
+Test non-spam: (spam-stat-test-directory "~/Mail/mail/misc")
+@end smallexample
+
+Here is how you would create your dictionary:
+
+@smallexample
+Reset: (setq spam-stat (make-hash-table :test 'equal))
+Learn spam: (spam-stat-process-spam-directory "~/Mail/mail/spam")
+Learn non-spam: (spam-stat-process-non-spam-directory "~/Mail/mail/misc")
+Repeat for any other non-spam group you need...
+Reduce table size: (spam-stat-reduce-size)
+Save table: (spam-stat-save)
+@end smallexample
+
+@node Other modes
+@section Interaction with other modes
+
+@subsection Dired
+@cindex dired
+
+@code{gnus-dired-minor-mode} provides some useful functions for dired
+buffers.  It is enabled with
+@lisp
+(add-hook 'dired-mode-hook 'turn-on-gnus-dired-mode)
+@end lisp
+
+@table @kbd
+@item C-c C-m C-a
+@findex gnus-dired-attach
+@cindex attachments, selection via dired
+Send dired's marked files as an attachment (@code{gnus-dired-attach}).
+You will be prompted for a message buffer.
+
+@item C-c C-m C-l
+@findex gnus-dired-find-file-mailcap
+Visit a file according to the appropriate mailcap entry
+(@code{gnus-dired-find-file-mailcap}).  With prefix, open file in a new
+buffer.
+
+@item C-c C-m C-p
+@findex gnus-dired-print
+Print file according to the mailcap entry (@code{gnus-dired-print}).  If
+there is no print command, print in a PostScript image.
+@end table
+
+@node Various Various
+@section Various Various
+@cindex mode lines
+@cindex highlights
+
+@table @code
+
+@item gnus-home-directory
+@vindex gnus-home-directory
+All Gnus file and directory variables will be initialized from this
+variable, which defaults to @file{~/}.
+
+@item gnus-directory
+@vindex gnus-directory
+Most Gnus storage file and directory variables will be initialized from
+this variable, which defaults to the @env{SAVEDIR} environment
+variable, or @file{~/News/} if that variable isn't set.
+
+Note that Gnus is mostly loaded when the @file{~/.gnus.el} file is read.
+This means that other directory variables that are initialized from this
+variable won't be set properly if you set this variable in
+@file{~/.gnus.el}.  Set this variable in @file{.emacs} instead.
+
+@item gnus-default-directory
+@vindex gnus-default-directory
+Not related to the above variable at all---this variable says what the
+default directory of all Gnus buffers should be.  If you issue commands
+like @kbd{C-x C-f}, the prompt you'll get starts in the current buffer's
+default directory.  If this variable is @code{nil} (which is the
+default), the default directory will be the default directory of the
+buffer you were in when you started Gnus.
+
+@item gnus-verbose
+@vindex gnus-verbose
+This variable is an integer between zero and ten.  The higher the value,
+the more messages will be displayed.  If this variable is zero, Gnus
+will never flash any messages, if it is seven (which is the default),
+most important messages will be shown, and if it is ten, Gnus won't ever
+shut up, but will flash so many messages it will make your head swim.
+
+@item gnus-verbose-backends
+@vindex gnus-verbose-backends
+This variable works the same way as @code{gnus-verbose}, but it applies
+to the Gnus back ends instead of Gnus proper.
+
+@item nnheader-max-head-length
+@vindex nnheader-max-head-length
+When the back ends read straight heads of articles, they all try to read
+as little as possible.  This variable (default 8192) specifies
+the absolute max length the back ends will try to read before giving up
+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}.
+
+@item nnheader-head-chop-length
+@vindex nnheader-head-chop-length
+This variable (default 2048) says how big a piece of each article to
+read when doing the operation described above.
+
+@item nnheader-file-name-translation-alist
+@vindex nnheader-file-name-translation-alist
+@cindex file names
+@cindex invalid characters in file names
+@cindex characters in file names
+This is an alist that says how to translate characters in file names.
+For instance, if @samp{:} is invalid as a file character in file names
+on your system (you OS/2 user you), you could say something like:
+
+@lisp
+@group
+(setq nnheader-file-name-translation-alist
+      '((?: . ?_)))
+@end group
+@end lisp
+
+In fact, this is the default value for this variable on OS/2 and MS
+Windows (phooey) systems.
+
+@item gnus-hidden-properties
+@vindex gnus-hidden-properties
+This is a list of properties to use to hide ``invisible'' text.  It is
+@code{(invisible t intangible t)} by default on most systems, which
+makes invisible text invisible and intangible.
+
+@item gnus-parse-headers-hook
+@vindex gnus-parse-headers-hook
+A hook called before parsing headers.  It can be used, for instance, to
+gather statistics on the headers fetched, or perhaps you'd like to prune
+some headers.  I don't see why you'd want that, though.
+
+@item gnus-shell-command-separator
+@vindex gnus-shell-command-separator
+String used to separate two shell commands.  The default is @samp{;}.
+
+@item gnus-invalid-group-regexp
+@vindex gnus-invalid-group-regexp
+
+Regexp to match ``invalid'' group names when querying user for a group
+name.  The default value catches some @strong{really} invalid group
+names who could possibly mess up Gnus internally (like allowing
+@samp{:} in a group name, which is normally used to delimit method and
+group).
+
+@acronym{IMAP} users might want to allow @samp{/} in group names though.
+
+
+@end table
+
+@node The End
+@chapter The End
+
+Well, that's the manual---you can get on with your life now.  Keep in
+touch.  Say hello to your cats from me.
+
+My @strong{ghod}---I just can't stand goodbyes.  Sniffle.
+
+Ol' Charles Reznikoff said it pretty well, so I leave the floor to him:
+
+@quotation
+@strong{Te Deum}
+
+@sp 1
+Not because of victories @*
+I sing,@*
+having none,@*
+but for the common sunshine,@*
+the breeze,@*
+the largess of the spring.
+
+@sp 1
+Not for victory@*
+but for the day's work done@*
+as well as I was able;@*
+not for a seat upon the dais@*
+but at the common table.@*
+@end quotation
+
+
+@node Appendices
+@chapter Appendices
+
+@menu
+* XEmacs::                      Requirements for installing under XEmacs.
+* History::                     How Gnus got where it is today.
+* On Writing Manuals::          Why this is not a beginner's guide.
+* Terminology::                 We use really difficult, like, words here.
+* Customization::               Tailoring Gnus to your needs.
+* Troubleshooting::             What you might try if things do not work.
+* Gnus Reference Guide::        Rilly, rilly technical stuff.
+* Emacs for Heathens::          A short introduction to Emacsian terms.
+* Frequently Asked Questions::  The Gnus FAQ
+@end menu
+
+
+@node XEmacs
+@section XEmacs
+@cindex XEmacs
+@cindex installing under XEmacs
+
+XEmacs is distributed as a collection of packages.  You should install
+whatever packages the Gnus XEmacs package requires.  The current
+requirements are @samp{gnus}, @samp{mail-lib}, @samp{xemacs-base},
+@samp{eterm}, @samp{sh-script}, @samp{net-utils}, @samp{os-utils},
+@samp{dired}, @samp{mh-e}, @samp{sieve}, @samp{ps-print}, @samp{W3},
+@samp{pgg}, @samp{mailcrypt}, @samp{ecrypto}, and @samp{sasl}.
+
+
+@node History
+@section History
+
+@cindex history
+@sc{gnus} was written by Masanobu @sc{Umeda}.  When autumn crept up in
+'94, Lars Magne Ingebrigtsen grew bored and decided to rewrite Gnus.
+
+If you want to investigate the person responsible for this outrage,
+you can point your (feh!) web browser to
+@uref{http://quimby.gnus.org/}.  This is also the primary
+distribution point for the new and spiffy versions of Gnus, and is
+known as The Site That Destroys Newsrcs And Drives People Mad.
+
+During the first extended alpha period of development, the new Gnus was
+called ``(ding) Gnus''.  @dfn{(ding)} is, of course, short for
+@dfn{ding is not Gnus}, which is a total and utter lie, but who cares?
+(Besides, the ``Gnus'' in this abbreviation should probably be
+pronounced ``news'' as @sc{Umeda} intended, which makes it a more
+appropriate name, don't you think?)
+
+In any case, after spending all that energy on coming up with a new and
+spunky name, we decided that the name was @emph{too} spunky, so we
+renamed it back again to ``Gnus''.  But in mixed case.  ``Gnus'' vs.
+``@sc{gnus}''.  New vs. old.
+
+@menu
+* Gnus Versions::               What Gnus versions have been released.
+* Other Gnus Versions::         Other Gnus versions that also 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
+
+
+@node Gnus Versions
+@subsection Gnus Versions
+@cindex ding Gnus
+@cindex September Gnus
+@cindex Red Gnus
+@cindex Quassia Gnus
+@cindex Pterodactyl Gnus
+@cindex Oort Gnus
+@cindex No Gnus
+@cindex Gnus versions
+
+The first ``proper'' release of Gnus 5 was done in November 1995 when it
+was included in the Emacs 19.30 distribution (132 (ding) Gnus releases
+plus 15 Gnus 5.0 releases).
+
+In May 1996 the next Gnus generation (aka. ``September Gnus'' (after 99
+releases)) was released under the name ``Gnus 5.2'' (40 releases).
+
+On July 28th 1996 work on Red Gnus was begun, and it was released on
+January 25th 1997 (after 84 releases) as ``Gnus 5.4'' (67 releases).
+
+On September 13th 1997, Quassia Gnus was started and lasted 37 releases.
+It was released as ``Gnus 5.6'' on March 8th 1998 (46 releases).
+
+Gnus 5.6 begat Pterodactyl Gnus on August 29th 1998 and was released as
+``Gnus 5.8'' (after 99 releases and a CVS repository) on December 3rd
+1999.
+
+On the 26th of October 2000, Oort Gnus was begun and was released as
+Gnus 5.10 on May 1st 2003 (24 releases).
+
+On the January 4th 2004, No Gnus was begun.
+
+If you happen upon a version of Gnus that has a prefixed name --
+``(ding) Gnus'', ``September Gnus'', ``Red Gnus'', ``Quassia Gnus'',
+``Pterodactyl Gnus'', ``Oort Gnus'', ``No Gnus'' -- don't panic.
+Don't let it know that you're frightened.  Back away.  Slowly.  Whatever
+you do, don't run.  Walk away, calmly, until you're out of its reach.
+Find a proper released version of Gnus and snuggle up to that instead.
+
+
+@node Other Gnus Versions
+@subsection Other Gnus Versions
+@cindex Semi-gnus
+
+In addition to the versions of Gnus which have had their releases
+coordinated by Lars, one major development has been Semi-gnus from
+Japan.  It's based on a library called @acronym{SEMI}, which provides
+@acronym{MIME} capabilities.
+
+These Gnusae are based mainly on Gnus 5.6 and Pterodactyl Gnus.
+Collectively, they are called ``Semi-gnus'', and different strains are
+called T-gnus, ET-gnus, Nana-gnus and Chaos.  These provide powerful
+@acronym{MIME} and multilingualization things, especially important for
+Japanese users.
+
+
+@node Why?
+@subsection Why?
+
+What's the point of Gnus?
+
+I want to provide a ``rad'', ``happening'', ``way cool'' and ``hep''
+newsreader, that lets you do anything you can think of.  That was my
+original motivation, but while working on Gnus, it has become clear to
+me that this generation of newsreaders really belong in the stone age.
+Newsreaders haven't developed much since the infancy of the net.  If the
+volume continues to rise with the current rate of increase, all current
+newsreaders will be pretty much useless.  How do you deal with
+newsgroups that have thousands of new articles each day?  How do you
+keep track of millions of people who post?
+
+Gnus offers no real solutions to these questions, but I would very much
+like to see Gnus being used as a testing ground for new methods of
+reading and fetching news.  Expanding on @sc{Umeda}-san's wise decision
+to separate the newsreader from the back ends, Gnus now offers a simple
+interface for anybody who wants to write new back ends for fetching mail
+and news from different sources.  I have added hooks for customizations
+everywhere I could imagine it being useful.  By doing so, I'm inviting
+every one of you to explore and invent.
+
+May Gnus never be complete.  @kbd{C-u 100 M-x all-hail-emacs} and
+@kbd{C-u 100 M-x all-hail-xemacs}.
+
+
+@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.
+
+@kindex M-x gnus-bug
+@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}.
+
+@vindex gnus-bug-create-help-buffer
+If you are in the habit of sending bug reports @emph{very} often, you
+may find the helpful help buffer annoying after a while.  If so, set
+@code{gnus-bug-create-help-buffer} to @code{nil} to avoid having it pop
+up at you.
+
+
+@node Conformity
+@subsection Conformity
+
+No rebels without a clue here, ma'am.  We conform to all standards known
+to (wo)man.  Except for those standards and/or conventions we disagree
+with, of course.
+
+@table @strong
+
+@item RFC (2)822
+@cindex RFC 822
+@cindex RFC 2822
+There are no known breaches of this standard.
+
+@item RFC 1036
+@cindex RFC 1036
+There are no known breaches of this standard, either.
+
+@item Son-of-RFC 1036
+@cindex Son-of-RFC 1036
+We do have some breaches to this one.
+
+@table @emph
+
+@item X-Newsreader
+@itemx User-Agent
+These are considered to be ``vanity headers'', while I consider them
+to be consumer information.  After seeing so many badly formatted
+articles coming from @code{tin} and @code{Netscape} I know not to use
+either of those for posting articles.  I would not have known that if
+it wasn't for the @code{X-Newsreader} header.
+@end table
+
+@item USEFOR
+@cindex USEFOR
+USEFOR is an IETF working group writing a successor to RFC 1036, based
+on Son-of-RFC 1036.  They have produced a number of drafts proposing
+various changes to the format of news articles.  The Gnus towers will
+look into implementing the changes when the draft is accepted as an RFC.
+
+@item MIME - RFC 2045-2049 etc
+@cindex @acronym{MIME}
+All the various @acronym{MIME} RFCs are supported.
+
+@item Disposition Notifications - RFC 2298
+Message Mode is able to request notifications from the receiver.
+
+@item PGP - RFC 1991 and RFC 2440
+@cindex RFC 1991
+@cindex RFC 2440
+RFC 1991 is the original @acronym{PGP} message specification,
+published as an informational RFC.  RFC 2440 was the follow-up, now
+called Open PGP, and put on the Standards Track.  Both document a
+non-@acronym{MIME} aware @acronym{PGP} format.  Gnus supports both
+encoding (signing and encryption) and decoding (verification and
+decryption).
+
+@item PGP/MIME - RFC 2015/3156
+RFC 2015 (superseded by 3156 which references RFC 2440 instead of RFC
+1991) describes the @acronym{MIME}-wrapping around the RFC 1991/2440 format.
+Gnus supports both encoding and decoding.
+
+@item S/MIME - RFC 2633
+RFC 2633 describes the @acronym{S/MIME} format.
+
+@item IMAP - RFC 1730/2060, RFC 2195, RFC 2086, RFC 2359, RFC 2595, RFC 1731
+RFC 1730 is @acronym{IMAP} version 4, updated somewhat by RFC 2060
+(@acronym{IMAP} 4 revision 1).  RFC 2195 describes CRAM-MD5
+authentication for @acronym{IMAP}.  RFC 2086 describes access control
+lists (ACLs) for @acronym{IMAP}.  RFC 2359 describes a @acronym{IMAP}
+protocol enhancement.  RFC 2595 describes the proper @acronym{TLS}
+integration (STARTTLS) with @acronym{IMAP}.  RFC 1731 describes the
+GSSAPI/Kerberos4 mechanisms for @acronym{IMAP}.
+
+@end table
+
+If you ever notice Gnus acting non-compliant with regards to the texts
+mentioned above, don't hesitate to drop a note to Gnus Towers and let us
+know.
+
+
+@node Emacsen
+@subsection Emacsen
+@cindex Emacsen
+@cindex XEmacs
+@cindex Mule
+@cindex Emacs
+
+Gnus should work on:
+
+@itemize @bullet
+
+@item
+Emacs 21.1 and up.
+
+@item
+XEmacs 21.4 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 and XEmacs 21.1.
+
+There are some vague differences between Gnus on the various
+platforms---XEmacs features more graphics (a logo and a toolbar)---but
+other than that, things should look pretty much the same under all
+Emacsen.
+
+
+@node Gnus Development
+@subsection Gnus Development
+
+Gnus is developed in a two-phased cycle.  The first phase involves much
+discussion on the @samp{ding@@gnus.org} mailing list, 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 ``Red Gnus'' and ``Quassia Gnus''.
+
+After futzing around for 50-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.6.32'' instead.  Normal people are
+supposed to be able to use these, and these are mostly discussed on the
+@samp{gnu.emacs.gnus} newsgroup.
+
+@cindex Incoming*
+@vindex mail-source-delete-incoming
+Some variable defaults differ between alpha Gnusae and released Gnusae.
+In particular, @code{mail-source-delete-incoming} defaults to @code{nil} in
+alpha Gnusae and @code{t} in released Gnusae.  This is to prevent
+lossage of mail if an alpha release hiccups while handling the mail.
+
+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.
+
+
+
+@node Contributors
+@subsection Contributors
+@cindex contributors
+
+The new Gnus version couldn't have been done without the help of all the
+people on the (ding) mailing list.  Every day for over a year I have
+gotten billions of nice bug reports from them, filling me with joy,
+every single one of them.  Smooches.  The people on the list have been
+tried beyond endurance, what with my ``oh, that's a neat idea <type
+type>, yup, I'll release it right away <ship off> no wait, that doesn't
+work at all <type type>, yup, I'll ship that one off right away <ship
+off> no, wait, that absolutely does not work'' policy for releases.
+Micro$oft---bah.  Amateurs.  I'm @emph{much} worse.  (Or is that
+``worser''? ``much worser''?  ``worsest''?)
+
+I would like to take this opportunity to thank the Academy for@dots{}  oops,
+wrong show.
+
+@itemize @bullet
+
+@item
+Masanobu @sc{Umeda}---the writer of the original @sc{gnus}.
+
+@item
+Shenghuo Zhu---uudecode.el, mm-uu.el, rfc1843.el, webmail.el,
+nnwarchive and many, many other things connected with @acronym{MIME} and
+other types of en/decoding, as well as general bug fixing, new
+functionality and stuff.
+
+@item
+Per Abrahamsen---custom, scoring, highlighting and @sc{soup} code (as
+well as numerous other things).
+
+@item
+Luis Fernandes---design and graphics.
+
+@item
+Joe Reiss---creator of the smiley faces.
+
+@item
+Justin Sheehy---the @acronym{FAQ} maintainer.
+
+@item
+Erik Naggum---help, ideas, support, code and stuff.
+
+@item
+Wes Hardaker---@file{gnus-picon.el} and the manual section on
+@dfn{picons} (@pxref{Picons}).
+
+@item
+Kim-Minh Kaplan---further work on the picon code.
+
+@item
+Brad Miller---@file{gnus-gl.el} and the GroupLens manual section
+(@pxref{GroupLens}).
+
+@item
+Sudish Joseph---innumerable bug fixes.
+
+@item
+Ilja Weis---@file{gnus-topic.el}.
+
+@item
+Steven L. Baur---lots and lots and lots of bugs detections and fixes.
+
+@item
+Vladimir Alexiev---the refcard and reference booklets.
+
+@item
+Felix Lee & Jamie Zawinski---I stole some pieces from the XGnus
+distribution by Felix Lee and JWZ.
+
+@item
+Scott Byer---@file{nnfolder.el} enhancements & rewrite.
+
+@item
+Peter Mutsaers---orphan article scoring code.
+
+@item
+Ken Raeburn---POP mail support.
+
+@item
+Hallvard B Furuseth---various bits and pieces, especially dealing with
+.newsrc files.
+
+@item
+Brian Edmonds---@file{gnus-bbdb.el}.
+
+@item
+David Moore---rewrite of @file{nnvirtual.el} and many other things.
+
+@item
+Kevin Davidson---came up with the name @dfn{ding}, so blame him.
+
+@item
+François Pinard---many, many interesting and thorough bug reports, as
+well as autoconf support.
+
+@end itemize
+
+This manual was proof-read by Adrian Aichner, with Ricardo Nassif, Mark
+Borges, and Jost Krieger proof-reading parts of the manual.
+
+The following people have contributed many patches and suggestions:
+
+Christopher Davis,
+Andrew Eskilsson,
+Kai Grossjohann,
+Kevin Greiner,
+Jesper Harder,
+Paul Jarc,
+Simon Josefsson,
+David KÃ¥gedal,
+Richard Pieri,
+Fabrice Popineau,
+Daniel Quinlan,
+Michael Shields,
+Reiner Steib,
+Jason L. Tibbitts, III,
+Jack Vinson,
+Katsumi Yamaoka, @c Yamaoka
+and
+Teodor Zlatanov.
+
+Also thanks to the following for patches and stuff:
+
+Jari Aalto,
+Adrian Aichner,
+Vladimir Alexiev,
+Russ Allbery,
+Peter Arius,
+Matt Armstrong,
+Marc Auslander,
+Miles Bader,
+Alexei V. Barantsev,
+Frank Bennett,
+Robert Bihlmeyer,
+Chris Bone,
+Mark Borges,
+Mark Boyns,
+Lance A. Brown,
+Rob Browning,
+Kees de Bruin,
+Martin Buchholz,
+Joe Buehler,
+Kevin Buhr,
+Alastair Burt,
+Joao Cachopo,
+Zlatko Calusic,
+Massimo Campostrini,
+Castor,
+David Charlap,
+Dan Christensen,
+Kevin Christian,
+Jae-you Chung, @c ?
+James H. Cloos, Jr.,
+Laura Conrad,
+Michael R. Cook,
+Glenn Coombs,
+Andrew J. Cosgriff,
+Neil Crellin,
+Frank D. Cringle,
+Geoffrey T. Dairiki,
+Andre Deparade,
+Ulrik Dickow,
+Dave Disser,
+Rui-Tao Dong, @c ?
+Joev Dubach,
+Michael Welsh Duggan,
+Dave Edmondson,
+Paul Eggert,
+Mark W. Eichin,
+Karl Eichwalder,
+Enami Tsugutomo, @c Enami
+Michael Ernst,
+Luc Van Eycken,
+Sam Falkner,
+Nelson Jose dos Santos Ferreira,
+Sigbjorn Finne,
+Sven Fischer,
+Paul Fisher,
+Decklin Foster,
+Gary D. Foster,
+Paul Franklin,
+Guy Geens,
+Arne Georg Gleditsch,
+David S. Goldberg,
+Michelangelo Grigni,
+Dale Hagglund,
+D. Hall,
+Magnus Hammerin,
+Kenichi Handa, @c Handa
+Raja R. Harinath,
+Yoshiki Hayashi, @c Hayashi
+P. E. Jareth Hein,
+Hisashige Kenji, @c Hisashige
+Scott Hofmann,
+Marc Horowitz,
+Gunnar Horrigmo,
+Richard Hoskins,
+Brad Howes,
+Miguel de Icaza,
+François Felix Ingrand,
+Tatsuya Ichikawa, @c Ichikawa
+Ishikawa Ichiro, @c Ishikawa
+Lee Iverson,
+Iwamuro Motonori, @c Iwamuro
+Rajappa Iyer,
+Andreas Jaeger,
+Adam P. Jenkins,
+Randell Jesup,
+Fred Johansen,
+Gareth Jones,
+Greg Klanderman,
+Karl Kleinpaste,
+Michael Klingbeil,
+Peter Skov Knudsen,
+Shuhei Kobayashi, @c Kobayashi
+Petr Konecny,
+Koseki Yoshinori, @c Koseki
+Thor Kristoffersen,
+Jens Lautenbacher,
+Martin Larose,
+Seokchan Lee, @c Lee
+Joerg Lenneis,
+Carsten Leonhardt,
+James LewisMoss,
+Christian Limpach,
+Markus Linnala,
+Dave Love,
+Mike McEwan,
+Tonny Madsen,
+Shlomo Mahlab,
+Nat Makarevitch,
+Istvan Marko,
+David Martin,
+Jason R. Mastaler,
+Gordon Matzigkeit,
+Timo Metzemakers,
+Richard Mlynarik,
+Lantz Moore,
+Morioka Tomohiko, @c Morioka
+Erik Toubro Nielsen,
+Hrvoje Niksic,
+Andy Norman,
+Fred Oberhauser,
+C. R. Oldham,
+Alexandre Oliva,
+Ken Olstad,
+Masaharu Onishi, @c Onishi
+Hideki Ono, @c Ono
+Ettore Perazzoli,
+William Perry,
+Stephen Peters,
+Jens-Ulrik Holger Petersen,
+Ulrich Pfeifer,
+Matt Pharr,
+Andy Piper,
+John McClary Prevost,
+Bill Pringlemeir,
+Mike Pullen,
+Jim Radford,
+Colin Rafferty,
+Lasse Rasinen,
+Lars Balker Rasmussen,
+Joe Reiss,
+Renaud Rioboo,
+Roland B. Roberts,
+Bart Robinson,
+Christian von Roques,
+Markus Rost,
+Jason Rumney,
+Wolfgang Rupprecht,
+Jay Sachs,
+Dewey M. Sasser,
+Conrad Sauerwald,
+Loren Schall,
+Dan Schmidt,
+Ralph Schleicher,
+Philippe Schnoebelen,
+Andreas Schwab,
+Randal L. Schwartz,
+Danny Siu,
+Matt Simmons,
+Paul D. Smith,
+Jeff Sparkes,
+Toby Speight,
+Michael Sperber,
+Darren Stalder,
+Richard Stallman,
+Greg Stark,
+Sam Steingold,
+Paul Stevenson,
+Jonas Steverud,
+Paul Stodghill,
+Kiyokazu Suto, @c Suto
+Kurt Swanson,
+Samuel Tardieu,
+Teddy,
+Chuck Thompson,
+Tozawa Akihiko, @c Tozawa
+Philippe Troin,
+James Troup,
+Trung Tran-Duc,
+Jack Twilley,
+Aaron M. Ucko,
+Aki Vehtari,
+Didier Verna,
+Vladimir Volovich,
+Jan Vroonhof,
+Stefan Waldherr,
+Pete Ware,
+Barry A. Warsaw,
+Christoph Wedler,
+Joe Wells,
+Lee Willis,
+and
+Lloyd Zusman.
+
+
+For a full overview of what each person has done, the ChangeLogs
+included in the Gnus alpha distributions should give ample reading
+(550kB and counting).
+
+Apologies to everybody that I've forgotten, of which there are many, I'm
+sure.
+
+Gee, that's quite a list of people.  I guess that must mean that there
+actually are people who are using Gnus.  Who'd'a thunk it!
+
+
+@node New Features
+@subsection New Features
+@cindex new features
+
+@menu
+* ding Gnus::                   New things in Gnus 5.0/5.1, the first new Gnus.
+* September Gnus::              The Thing Formally Known As Gnus 5.2/5.3.
+* Red Gnus::                    Third time best---Gnus 5.4/5.5.
+* Quassia Gnus::                Two times two is four, or Gnus 5.6/5.7.
+* Pterodactyl Gnus::            Pentad also starts with P, AKA Gnus 5.8/5.9.
+* Oort Gnus::                   It's big.  It's far out.  Gnus 5.10/5.11.
+@end menu
+
+These lists are, of course, just @emph{short} overviews of the
+@emph{most} important new features.  No, really.  There are tons more.
+Yes, we have feeping creaturism in full effect.
+
+@node ding Gnus
+@subsubsection (ding) Gnus
+
+New features in Gnus 5.0/5.1:
+
+@itemize @bullet
+
+@item
+The look of all buffers can be changed by setting format-like variables
+(@pxref{Group Buffer Format} and @pxref{Summary Buffer Format}).
+
+@item
+Local spool and several @acronym{NNTP} servers can be used at once
+(@pxref{Select Methods}).
+
+@item
+You can combine groups into virtual groups (@pxref{Virtual Groups}).
+
+@item
+You can read a number of different mail formats (@pxref{Getting Mail}).
+All the mail back ends implement a convenient mail expiry scheme
+(@pxref{Expiring Mail}).
+
+@item
+Gnus can use various strategies for gathering threads that have lost
+their roots (thereby gathering loose sub-threads into one thread) or it
+can go back and retrieve enough headers to build a complete thread
+(@pxref{Customizing Threading}).
+
+@item
+Killed groups can be displayed in the group buffer, and you can read
+them as well (@pxref{Listing Groups}).
+
+@item
+Gnus can do partial group updates---you do not have to retrieve the
+entire active file just to check for new articles in a few groups
+(@pxref{The Active File}).
+
+@item
+Gnus implements a sliding scale of subscribedness to groups
+(@pxref{Group Levels}).
+
+@item
+You can score articles according to any number of criteria
+(@pxref{Scoring}).  You can even get Gnus to find out how to score
+articles for you (@pxref{Adaptive Scoring}).
+
+@item
+Gnus maintains a dribble buffer that is auto-saved the normal Emacs
+manner, so it should be difficult to lose much data on what you have
+read if your machine should go down (@pxref{Auto Save}).
+
+@item
+Gnus now has its own startup file (@file{~/.gnus.el}) to avoid
+cluttering up the @file{.emacs} file.
+
+@item
+You can set the process mark on both groups and articles and perform
+operations on all the marked items (@pxref{Process/Prefix}).
+
+@item
+You can grep through a subset of groups and create a group from the
+results (@pxref{Kibozed Groups}).
+
+@item
+You can list subsets of groups according to, well, anything
+(@pxref{Listing Groups}).
+
+@item
+You can browse foreign servers and subscribe to groups from those
+servers (@pxref{Browse Foreign Server}).
+
+@item
+Gnus can fetch articles, asynchronously, on a second connection to the
+server (@pxref{Asynchronous Fetching}).
+
+@item
+You can cache articles locally (@pxref{Article Caching}).
+
+@item
+The uudecode functions have been expanded and generalized
+(@pxref{Decoding Articles}).
+
+@item
+You can still post uuencoded articles, which was a little-known feature
+of @sc{gnus}' past (@pxref{Uuencoding and Posting}).
+
+@item
+Fetching parents (and other articles) now actually works without
+glitches (@pxref{Finding the Parent}).
+
+@item
+Gnus can fetch @acronym{FAQ}s and group descriptions (@pxref{Group Information}).
+
+@item
+Digests (and other files) can be used as the basis for groups
+(@pxref{Document Groups}).
+
+@item
+Articles can be highlighted and customized (@pxref{Customizing
+Articles}).
+
+@item
+URLs and other external references can be buttonized (@pxref{Article
+Buttons}).
+
+@item
+You can do lots of strange stuff with the Gnus window & frame
+configuration (@pxref{Window Layout}).
+
+@item
+You can click on buttons instead of using the keyboard
+(@pxref{Buttons}).
+
+@end itemize
+
+
+@node September Gnus
+@subsubsection September Gnus
+
+@iftex
+@iflatex
+\gnusfig{-28cm}{0cm}{\epsfig{figure=ps/september,height=20cm}}
+@end iflatex
+@end iftex
+
+New features in Gnus 5.2/5.3:
+
+@itemize @bullet
+
+@item
+A new message composition mode is used.  All old customization variables
+for @code{mail-mode}, @code{rnews-reply-mode} and @code{gnus-msg} are
+now obsolete.
+
+@item
+Gnus is now able to generate @dfn{sparse} threads---threads where
+missing articles are represented by empty nodes (@pxref{Customizing
+Threading}).
+
+@lisp
+(setq gnus-build-sparse-threads 'some)
+@end lisp
+
+@item
+Outgoing articles are stored on a special archive server
+(@pxref{Archived Messages}).
+
+@item
+Partial thread regeneration now happens when articles are
+referred.
+
+@item
+Gnus can make use of GroupLens predictions (@pxref{GroupLens}).
+
+@item
+Picons (personal icons) can be displayed under XEmacs (@pxref{Picons}).
+
+@item
+A @code{trn}-like tree buffer can be displayed (@pxref{Tree Display}).
+
+@lisp
+(setq gnus-use-trees t)
+@end lisp
+
+@item
+An @code{nn}-like pick-and-read minor mode is available for the summary
+buffers (@pxref{Pick and Read}).
+
+@lisp
+(add-hook 'gnus-summary-mode-hook 'gnus-pick-mode)
+@end lisp
+
+@item
+In binary groups you can use a special binary minor mode (@pxref{Binary
+Groups}).
+
+@item
+Groups can be grouped in a folding topic hierarchy (@pxref{Group
+Topics}).
+
+@lisp
+(add-hook 'gnus-group-mode-hook 'gnus-topic-mode)
+@end lisp
+
+@item
+Gnus can re-send and bounce mail (@pxref{Summary Mail Commands}).
+
+@item
+Groups can now have a score, and bubbling based on entry frequency
+is possible (@pxref{Group Score}).
+
+@lisp
+(add-hook 'gnus-summary-exit-hook 'gnus-summary-bubble-group)
+@end lisp
+
+@item
+Groups can be process-marked, and commands can be performed on
+groups of groups (@pxref{Marking Groups}).
+
+@item
+Caching is possible in virtual groups.
+
+@item
+@code{nndoc} now understands all kinds of digests, mail boxes, rnews
+news batches, ClariNet briefs collections, and just about everything
+else (@pxref{Document Groups}).
+
+@item
+Gnus has a new back end (@code{nnsoup}) to create/read SOUP packets
+(@pxref{SOUP}).
+
+@item
+The Gnus cache is much faster.
+
+@item
+Groups can be sorted according to many criteria (@pxref{Sorting
+Groups}).
+
+@item
+New group parameters have been introduced to set list-addresses and
+expiry times (@pxref{Group Parameters}).
+
+@item
+All formatting specs allow specifying faces to be used
+(@pxref{Formatting Fonts}).
+
+@item
+There are several more commands for setting/removing/acting on process
+marked articles on the @kbd{M P} submap (@pxref{Setting Process Marks}).
+
+@item
+The summary buffer can be limited to show parts of the available
+articles based on a wide range of criteria.  These commands have been
+bound to keys on the @kbd{/} submap (@pxref{Limiting}).
+
+@item
+Articles can be made persistent with the @kbd{*} command
+(@pxref{Persistent Articles}).
+
+@item
+All functions for hiding article elements are now toggles.
+
+@item
+Article headers can be buttonized (@pxref{Article Washing}).
+
+@item
+All mail back ends support fetching articles by @code{Message-ID}.
+
+@item
+Duplicate mail can now be treated properly (@pxref{Duplicates}).
+
+@item
+All summary mode commands are available directly from the article
+buffer (@pxref{Article Keymap}).
+
+@item
+Frames can be part of @code{gnus-buffer-configuration} (@pxref{Window
+Layout}).
+
+@item
+Mail can be re-scanned by a daemonic process (@pxref{Daemons}).
+@iftex
+@iflatex
+\marginpar[\mbox{}\hfill\epsfig{figure=ps/fseptember,height=5cm}]{\epsfig{figure=ps/fseptember,height=5cm}}
+@end iflatex
+@end iftex
+
+@item
+Gnus can make use of NoCeM files to weed out spam (@pxref{NoCeM}).
+
+@lisp
+(setq gnus-use-nocem t)
+@end lisp
+
+@item
+Groups can be made permanently visible (@pxref{Listing Groups}).
+
+@lisp
+(setq gnus-permanently-visible-groups "^nnml:")
+@end lisp
+
+@item
+Many new hooks have been introduced to make customizing easier.
+
+@item
+Gnus respects the @code{Mail-Copies-To} header.
+
+@item
+Threads can be gathered by looking at the @code{References} header
+(@pxref{Customizing Threading}).
+
+@lisp
+(setq gnus-summary-thread-gathering-function
+      'gnus-gather-threads-by-references)
+@end lisp
+
+@item
+Read articles can be stored in a special backlog buffer to avoid
+refetching (@pxref{Article Backlog}).
+
+@lisp
+(setq gnus-keep-backlog 50)
+@end lisp
+
+@item
+A clean copy of the current article is always stored in a separate
+buffer to allow easier treatment.
+
+@item
+Gnus can suggest where to save articles (@pxref{Saving Articles}).
+
+@item
+Gnus doesn't have to do as much prompting when saving (@pxref{Saving
+Articles}).
+
+@lisp
+(setq gnus-prompt-before-saving t)
+@end lisp
+
+@item
+@code{gnus-uu} can view decoded files asynchronously while fetching
+articles (@pxref{Other Decode Variables}).
+
+@lisp
+(setq gnus-uu-grabbed-file-functions 'gnus-uu-grab-view)
+@end lisp
+
+@item
+Filling in the article buffer now works properly on cited text
+(@pxref{Article Washing}).
+
+@item
+Hiding cited text adds buttons to toggle hiding, and how much
+cited text to hide is now customizable (@pxref{Article Hiding}).
+
+@lisp
+(setq gnus-cited-lines-visible 2)
+@end lisp
+
+@item
+Boring headers can be hidden (@pxref{Article Hiding}).
+
+@item
+Default scoring values can now be set from the menu bar.
+
+@item
+Further syntax checking of outgoing articles have been added.
+
+@end itemize
+
+
+@node Red Gnus
+@subsubsection Red Gnus
+
+New features in Gnus 5.4/5.5:
+
+@iftex
+@iflatex
+\gnusfig{-5.5cm}{-4cm}{\epsfig{figure=ps/red,height=20cm}}
+@end iflatex
+@end iftex
+
+@itemize @bullet
+
+@item
+@file{nntp.el} has been totally rewritten in an asynchronous fashion.
+
+@item
+Article prefetching functionality has been moved up into
+Gnus (@pxref{Asynchronous Fetching}).
+
+@item
+Scoring can now be performed with logical operators like @code{and},
+@code{or}, @code{not}, and parent redirection (@pxref{Advanced
+Scoring}).
+
+@item
+Article washing status can be displayed in the
+article mode line (@pxref{Misc Article}).
+
+@item
+@file{gnus.el} has been split into many smaller files.
+
+@item
+Suppression of duplicate articles based on Message-ID can be done
+(@pxref{Duplicate Suppression}).
+
+@lisp
+(setq gnus-suppress-duplicates t)
+@end lisp
+
+@item
+New variables for specifying what score and adapt files are to be
+considered home score and adapt files (@pxref{Home Score File}) have
+been added.
+
+@item
+@code{nndoc} was rewritten to be easily extendable (@pxref{Document
+Server Internals}).
+
+@item
+Groups can inherit group parameters from parent topics (@pxref{Topic
+Parameters}).
+
+@item
+Article editing has been revamped and is now actually usable.
+
+@item
+Signatures can be recognized in more intelligent fashions
+(@pxref{Article Signature}).
+
+@item
+Summary pick mode has been made to look more @code{nn}-like.  Line
+numbers are displayed and the @kbd{.} command can be used to pick
+articles (@code{Pick and Read}).
+
+@item
+Commands for moving the @file{.newsrc.eld} from one server to
+another have been added (@pxref{Changing Servers}).
+
+@item
+There's a way now to specify that ``uninteresting'' fields be suppressed
+when generating lines in buffers (@pxref{Advanced Formatting}).
+
+@item
+Several commands in the group buffer can be undone with @kbd{C-M-_}
+(@pxref{Undo}).
+
+@item
+Scoring can be done on words using the new score type @code{w}
+(@pxref{Score File Format}).
+
+@item
+Adaptive scoring can be done on a Subject word-by-word basis
+(@pxref{Adaptive Scoring}).
+
+@lisp
+(setq gnus-use-adaptive-scoring '(word))
+@end lisp
+
+@item
+Scores can be decayed (@pxref{Score Decays}).
+
+@lisp
+(setq gnus-decay-scores t)
+@end lisp
+
+@item
+Scoring can be performed using a regexp on the Date header.  The Date is
+normalized to compact ISO 8601 format first (@pxref{Score File Format}).
+
+@item
+A new command has been added to remove all data on articles from
+the native server (@pxref{Changing Servers}).
+
+@item
+A new command for reading collections of documents
+(@code{nndoc} with @code{nnvirtual} on top) has been added---@kbd{C-M-d}
+(@pxref{Really Various Summary Commands}).
+
+@item
+Process mark sets can be pushed and popped (@pxref{Setting Process
+Marks}).
+
+@item
+A new mail-to-news back end makes it possible to post even when the @acronym{NNTP}
+server doesn't allow posting (@pxref{Mail-To-News Gateways}).
+
+@item
+A new back end for reading searches from Web search engines
+(@dfn{DejaNews}, @dfn{Alta Vista}, @dfn{InReference}) has been added
+(@pxref{Web Searches}).
+
+@item
+Groups inside topics can now be sorted using the standard sorting
+functions, and each topic can be sorted independently (@pxref{Topic
+Sorting}).
+
+@item
+Subsets of the groups can be sorted independently (@code{Sorting
+Groups}).
+
+@item
+Cached articles can be pulled into the groups (@pxref{Summary Generation
+Commands}).
+@iftex
+@iflatex
+\marginpar[\mbox{}\hfill\epsfig{figure=ps/fred,width=3cm}]{\epsfig{figure=ps/fred,width=3cm}}
+@end iflatex
+@end iftex
+
+@item
+Score files are now applied in a more reliable order (@pxref{Score
+Variables}).
+
+@item
+Reports on where mail messages end up can be generated (@pxref{Splitting
+Mail}).
+
+@item
+More hooks and functions have been added to remove junk from incoming
+mail before saving the mail (@pxref{Washing Mail}).
+
+@item
+Emphasized text can be properly fontisized:
+
+@end itemize
+
+
+@node Quassia Gnus
+@subsubsection Quassia Gnus
+
+New features in Gnus 5.6:
+
+@itemize @bullet
+
+@item
+New functionality for using Gnus as an offline newsreader has been
+added.  A plethora of new commands and modes have been added.
+@xref{Gnus Unplugged}, for the full story.
+
+@item
+The @code{nndraft} back end has returned, but works differently than
+before.  All Message buffers are now also articles in the @code{nndraft}
+group, which is created automatically.
+
+@item
+@code{gnus-alter-header-function} can now be used to alter header
+values.
+
+@item
+@code{gnus-summary-goto-article} now accept Message-ID's.
+
+@item
+A new Message command for deleting text in the body of a message
+outside the region: @kbd{C-c C-v}.
+
+@item
+You can now post to component group in @code{nnvirtual} groups with
+@kbd{C-u C-c C-c}.
+
+@item
+ @code{nntp-rlogin-program}---new variable to ease customization.
+
+@item
+@code{C-u C-c C-c} in @code{gnus-article-edit-mode} will now inhibit
+re-highlighting of the article buffer.
+
+@item
+New element in @code{gnus-boring-article-headers}---@code{long-to}.
+
+@item
+@kbd{M-i} symbolic prefix command.  @xref{Symbolic Prefixes}, for
+details.
+
+@item
+@kbd{L} and @kbd{I} in the summary buffer now take the symbolic prefix
+@kbd{a} to add the score rule to the @file{all.SCORE} file.
+
+@item
+@code{gnus-simplify-subject-functions} variable to allow greater
+control over simplification.
+
+@item
+@kbd{A T}---new command for fetching the current thread.
+
+@item
+@kbd{/ T}---new command for including the current thread in the
+limit.
+
+@item
+@kbd{M-RET} is a new Message command for breaking cited text.
+
+@item
+@samp{\\1}-expressions are now valid in @code{nnmail-split-methods}.
+
+@item
+The @code{custom-face-lookup} function has been removed.
+If you used this function in your initialization files, you must
+rewrite them to use @code{face-spec-set} instead.
+
+@item
+Canceling now uses the current select method.  Symbolic prefix
+@kbd{a} forces normal posting method.
+
+@item
+New command to translate M******** sm*rtq**t*s into proper
+text---@kbd{W d}.
+
+@item
+For easier debugging of @code{nntp}, you can set
+@code{nntp-record-commands} to a non-@code{nil} value.
+
+@item
+@code{nntp} now uses @file{~/.authinfo}, a @file{.netrc}-like file, for
+controlling where and how to send @sc{authinfo} to @acronym{NNTP} servers.
+
+@item
+A command for editing group parameters from the summary buffer
+has been added.
+
+@item
+A history of where mails have been split is available.
+
+@item
+A new article date command has been added---@code{article-date-iso8601}.
+
+@item
+Subjects can be simplified when threading by setting
+@code{gnus-score-thread-simplify}.
+
+@item
+A new function for citing in Message has been
+added---@code{message-cite-original-without-signature}.
+
+@item
+@code{article-strip-all-blank-lines}---new article command.
+
+@item
+A new Message command to kill to the end of the article has
+been added.
+
+@item
+A minimum adaptive score can be specified by using the
+@code{gnus-adaptive-word-minimum} variable.
+
+@item
+The ``lapsed date'' article header can be kept continually
+updated by the @code{gnus-start-date-timer} command.
+
+@item
+Web listserv archives can be read with the @code{nnlistserv} back end.
+
+@item
+Old dejanews archives can now be read by @code{nnweb}.
+
+@end itemize
+
+@node Pterodactyl Gnus
+@subsubsection Pterodactyl Gnus
+
+New features in Gnus 5.8:
+
+@itemize @bullet
+
+@item
+The mail-fetching functions have changed.  See the manual for the
+many details.  In particular, all procmail fetching variables are gone.
+
+If you used procmail like in
+
+@lisp
+(setq nnmail-use-procmail t)
+(setq nnmail-spool-file 'procmail)
+(setq nnmail-procmail-directory "~/mail/incoming/")
+(setq nnmail-procmail-suffix "\\.in")
+@end lisp
+
+this now has changed to
+
+@lisp
+(setq mail-sources
+      '((directory :path "~/mail/incoming/"
+                   :suffix ".in")))
+@end lisp
+
+@xref{Mail Source Specifiers}.
+
+@item
+Gnus is now a @acronym{MIME}-capable reader.  This affects many parts of
+Gnus, and adds a slew of new commands.  See the manual for details.
+
+@item
+Gnus has also been multilingualized.  This also affects too
+many parts of Gnus to summarize here, and adds many new variables.
+
+@item
+@code{gnus-auto-select-first} can now be a function to be
+called to position point.
+
+@item
+The user can now decide which extra headers should be included in
+summary buffers and @acronym{NOV} files.
+
+@item
+@code{gnus-article-display-hook} has been removed.  Instead, a number
+of variables starting with @code{gnus-treat-} have been added.
+
+@item
+The Gnus posting styles have been redone again and now works in a
+subtly different manner.
+
+@item
+New web-based back ends have been added: @code{nnslashdot},
+@code{nnwarchive} and @code{nnultimate}.  nnweb has been revamped,
+again, to keep up with ever-changing layouts.
+
+@item
+Gnus can now read @acronym{IMAP} mail via @code{nnimap}.
+
+@end itemize
+
+@node Oort Gnus
+@subsubsection Oort Gnus
+@cindex Oort Gnus
+
+New features in Gnus 5.10:
+
+@itemize @bullet
+
+@item Installation changes
+@c ***********************
+
+@itemize @bullet
+@item
+Upgrading from previous (stable) version if you have used Oort.
+
+If you have tried Oort (the unstable Gnus branch leading to this
+release) but went back to a stable version, be careful when upgrading to
+this version.  In particular, you will probably want to remove all
+@file{.marks} (nnml) and @file{.mrk} (nnfolder) files, so that flags are
+read from your @file{.newsrc.eld} instead of from the
+@file{.marks}/@file{.mrk} file where this release store flags.  See a
+later entry for more information about marks.  Note that downgrading
+isn't save in general.
+
+@item
+Lisp files are now installed in @file{.../site-lisp/gnus/} by default.
+It defaulted to @file{.../site-lisp/} formerly.  In addition to this,
+the new installer issues a warning if other Gnus installations which
+will shadow the latest one are detected.  You can then remove those
+shadows manually or remove them using @code{make
+remove-installed-shadows}.
+
+@item
+New @file{make.bat} for compiling and installing Gnus under MS Windows
+
+Use @file{make.bat} if you want to install Gnus under MS Windows, the
+first argument to the batch-program should be the directory where
+@file{xemacs.exe} respectively @file{emacs.exe} is located, if you want
+to install Gnus after compiling it, give @file{make.bat} @code{/copy} as
+the second parameter.
+
+@file{make.bat} has been rewritten from scratch, it now features
+automatic recognition of XEmacs and GNU Emacs, generates
+@file{gnus-load.el}, checks if errors occur while compilation and
+generation of info files and reports them at the end of the build
+process.  It now uses @code{makeinfo} if it is available and falls
+back to @file{infohack.el} otherwise.  @file{make.bat} should now
+install all files which are necessary to run Gnus and be generally a
+complete replacement for the @code{configure; make; make install}
+cycle used under Unix systems.
+
+The new @file{make.bat} makes @file{make-x.bat} and @file{xemacs.mak}
+superfluous, so they have been removed.
+
+@item
+@file{~/News/overview/} not used.
+
+As a result of the following change, the @file{~/News/overview/}
+directory is not used any more.  You can safely delete the entire
+hierarchy.
+
+@c FIXME: `gnus-load' is mentioned in README, which is not included in
+@c CVS.  We should find a better place for this item.
+@item
+@code{(require 'gnus-load)}
+
+If you use a stand-alone Gnus distribution, you'd better add
+@code{(require 'gnus-load)} into your @file{~/.emacs} after adding the Gnus
+lisp directory into load-path.
+
+File @file{gnus-load.el} contains autoload commands, functions and variables,
+some of which may not be included in distributions of Emacsen.
+
+@end itemize
+
+@item New packages and libraries within Gnus
+@c *****************************************
+
+@itemize @bullet
+
+@item
+The revised Gnus @acronym{FAQ} is included in the manual,
+@xref{Frequently Asked Questions}.
+
+@item
+@acronym{TLS} wrapper shipped with Gnus
+
+@acronym{TLS}/@acronym{SSL} is now supported in @acronym{IMAP} and
+@acronym{NNTP} via @file{tls.el} and GNUTLS.  The old
+@acronym{TLS}/@acronym{SSL} support via (external third party)
+@file{ssl.el} and OpenSSL still works.
+
+@item
+Improved anti-spam features.
+
+Gnus is now able to take out spam from your mail and news streams
+using a wide variety of programs and filter rules.  Among the supported
+methods are RBL blocklists, bogofilter and white/blacklists.  Hooks
+for easy use of external packages such as SpamAssassin and Hashcash
+are also new.  @xref{Thwarting Email Spam}.
+@c FIXME: @xref{Spam Package}?.  Should this be under Misc?
+
+@item
+Gnus supports server-side mail filtering using Sieve.
+
+Sieve rules can be added as Group Parameters for groups, and the
+complete Sieve script is generated using @kbd{D g} from the Group
+buffer, and then uploaded to the server using @kbd{C-c C-l} in the
+generated Sieve buffer.  @xref{Sieve Commands}, and the new Sieve
+manual @ref{Top, , Top, sieve, Emacs Sieve}.
+
+@end itemize
+
+@item Changes in group mode
+@c ************************
+
+@itemize @bullet
+
+@item
+@code{gnus-group-read-ephemeral-group} can be called interactively,
+using @kbd{G M}.
+
+@item
+Retrieval of charters and control messages
+
+There are new commands for fetching newsgroup charters (@kbd{H c}) and
+control messages (@kbd{H C}).
+
+@item
+The new variable @code{gnus-parameters} can be used to set group parameters.
+
+Earlier this was done only via @kbd{G p} (or @kbd{G c}), which stored
+the parameters in @file{~/.newsrc.eld}, but via this variable you can
+enjoy the powers of customize, and simplified backups since you set the
+variable in @file{~/.gnus.el} instead of @file{~/.newsrc.eld}.  The
+variable maps regular expressions matching group names to group
+parameters, a'la:
+@lisp
+(setq gnus-parameters
+      '(("mail\\..*"
+         (gnus-show-threads nil)
+         (gnus-use-scoring nil))
+        ("^nnimap:\\(foo.bar\\)$"
+         (to-group . "\\1"))))
+@end lisp
+
+@item
+Unread count correct in nnimap groups.
+
+The estimated number of unread articles in the group buffer should now
+be correct for nnimap groups.  This is achieved by calling
+@code{nnimap-fixup-unread-after-getting-new-news} from the
+@code{gnus-setup-news-hook} (called on startup) and
+@code{gnus-after-getting-new-news-hook}. (called after getting new
+mail).  If you have modified those variables from the default, you may
+want to add @code{nnimap-fixup-unread-after-getting-new-news} again.  If
+you were happy with the estimate and want to save some (minimal) time
+when getting new mail, remove the function.
+
+@item
+Group names are treated as UTF-8 by default.
+
+This is supposedly what USEFOR wanted to migrate to.  See
+@code{gnus-group-name-charset-group-alist} and
+@code{gnus-group-name-charset-method-alist} for customization.
+
+@item
+@code{gnus-group-charset-alist} and
+@code{gnus-group-ignored-charsets-alist}.
+
+The regexps in these variables are compared with full group names
+instead of real group names in 5.8.  Users who customize these
+variables should change those regexps accordingly.  For example:
+@lisp
+("^han\\>" euc-kr) -> ("\\(^\\|:\\)han\\>" euc-kr)
+@end lisp
+
+@end itemize
+
+@item Changes in summary and article mode
+@c **************************************
+
+@itemize @bullet
+
+@item
+@kbd{F} (@code{gnus-article-followup-with-original}) and @kbd{R}
+(@code{gnus-article-reply-with-original}) only yank the text in the
+region if the region is active.
+
+@item
+In draft groups, @kbd{e} is now bound to @code{gnus-draft-edit-message}.
+Use @kbd{B w} for @code{gnus-summary-edit-article} instead.
+
+@item
+Article Buttons
+
+More buttons for URLs, mail addresses, Message-IDs, Info links, man
+pages and Emacs or Gnus related references.  @xref{Article Buttons}.  The
+variables @code{gnus-button-@var{*}-level} can be used to control the
+appearance of all article buttons.  @xref{Article Button Levels}.
+
+@item
+Single-part yenc encoded attachments can be decoded.
+
+@item
+Picons
+
+The picons code has been reimplemented to work in GNU Emacs---some of
+the previous options have been removed or renamed.
+
+Picons are small ``personal icons'' representing users, domain and
+newsgroups, which can be displayed in the Article buffer.
+@xref{Picons}.
+
+@item
+If the new option @code{gnus-treat-body-boundary} is non-@code{nil}, a
+boundary line is drawn at the end of the headers.
+
+@item
+Signed article headers (X-PGP-Sig) can be verified with @kbd{W p}.
+
+@item
+The Summary Buffer uses an arrow in the fringe to indicate the current
+article.  Use @code{(setq gnus-summary-display-arrow nil)} to disable it.
+
+@item
+Warn about email replies to news
+
+Do you often find yourself replying to news by email by mistake?  Then
+the new option @code{gnus-confirm-mail-reply-to-news} is just the thing for
+you.
+
+@item
+If the new option @code{gnus-summary-display-while-building} is
+non-@code{nil}, the summary buffer is shown and updated as it's being
+built.
+
+@item
+The new @code{recent} mark @samp{.} indicates newly arrived messages (as
+opposed to old but unread messages).
+
+@item
+Gnus supports RFC 2369 mailing list headers, and adds a number of
+related commands in mailing list groups.  @xref{Mailing List}.
+
+@item
+The Date header can be displayed in a format that can be read aloud
+in English.  @xref{Article Date}.
+
+@item
+diffs are automatically highlighted in groups matching
+@code{mm-uu-diff-groups-regexp}
+
+@item
+Better handling of Microsoft citation styles
+
+Gnus now tries to recognize the mangled header block that some Microsoft
+mailers use to indicate that the rest of the message is a citation, even
+though it is not quoted in any way.  The variable
+@code{gnus-cite-unsightly-citation-regexp} matches the start of these
+citations.
+
+The new command @kbd{W Y f}
+(@code{gnus-article-outlook-deuglify-article}) allows deuglifying broken
+Outlook (Express) articles.
+
+@item
+@code{gnus-article-skip-boring}
+
+If you set @code{gnus-article-skip-boring} to @code{t}, then Gnus will
+not scroll down to show you a page that contains only boring text,
+which by default means cited text and signature.  You can customize
+what is skippable using @code{gnus-article-boring-faces}.
+
+This feature is especially useful if you read many articles that
+consist of a little new content at the top with a long, untrimmed
+message cited below.
+
+@item
+Smileys (@samp{:-)}, @samp{;-)} etc) are now displayed graphically in
+Emacs too.
+
+Put @code{(setq gnus-treat-display-smileys nil)} in @file{~/.gnus.el} to
+disable it.
+
+@item
+Face headers handling.  @xref{Face}.
+
+@item
+In the summary buffer, the new command @kbd{/ N} inserts new messages
+and @kbd{/ o} inserts old messages.
+
+@item
+Gnus decodes morse encoded messages if you press @kbd{W m}.
+
+@item
+@code{gnus-summary-line-format}
+
+The default value changed to @samp{%U%R%z%I%(%[%4L: %-23,23f%]%)
+%s\n}.  Moreover @code{gnus-extra-headers},
+@code{nnmail-extra-headers} and @code{gnus-ignored-from-addresses}
+changed their default so that the users name will be replaced by the
+recipient's name or the group name posting to for @acronym{NNTP}
+groups.
+
+@item
+Deleting of attachments.
+
+The command @code{gnus-mime-save-part-and-strip} (bound to @kbd{C-o}
+on @acronym{MIME} buttons) saves a part and replaces the part with an
+external one.  @code{gnus-mime-delete-part} (bound to @kbd{d} on
+@acronym{MIME} buttons) removes a part.  It works only on back ends
+that support editing.
+
+@item
+@code{gnus-default-charset}
+
+The default value is determined from the
+@code{current-language-environment} variable, instead of
+@code{iso-8859-1}.  Also the @samp{.*} item in
+@code{gnus-group-charset-alist} is removed.
+
+@item
+Printing capabilities are enhanced.
+
+Gnus supports Muttprint natively with @kbd{O P} from the Summary and
+Article buffers.  Also, each individual @acronym{MIME} part can be
+printed using @kbd{p} on the @acronym{MIME} button.
+
+@item
+Extended format specs.
+
+Format spec @samp{%&user-date;} is added into
+@code{gnus-summary-line-format-alist}.  Also, user defined extended
+format specs are supported.  The extended format specs look like
+@samp{%u&foo;}, which invokes function
+@code{gnus-user-format-function-@var{foo}}.  Because @samp{&} is used as the
+escape character, old user defined format @samp{%u&} is no longer supported.
+
+@item
+@kbd{/ *} (@code{gnus-summary-limit-include-cached}) is rewritten.
+@c FIXME: Was this a user-visible change?
+
+It was aliased to @kbd{Y c}
+(@code{gnus-summary-insert-cached-articles}).  The new function filters
+out other articles.
+
+@item
+Some limiting commands accept a @kbd{C-u} prefix to negate the match.
+
+If @kbd{C-u} is used on subject, author or extra headers, i.e., @kbd{/
+s}, @kbd{/ a}, and @kbd{/ x}
+(@code{gnus-summary-limit-to-@{subject,author,extra@}}) respectively, the
+result will be to display all articles that do not match the expression.
+
+@item
+Gnus inlines external parts (message/external).
+
+@end itemize
+
+@item Changes in Message mode and related Gnus features
+@c ****************************************************
+
+@itemize @bullet
+
+@item
+Delayed articles
+
+You can delay the sending of a message with @kbd{C-c C-j} in the Message
+buffer.  The messages are delivered at specified time.  This is useful
+for sending yourself reminders.  @xref{Delayed Articles}.
+
+@item
+If the new option @code{nnml-use-compressed-files} is non-@code{nil},
+the nnml back end allows compressed message files.
+
+@item
+The new option @code{gnus-gcc-mark-as-read} automatically marks
+Gcc articles as read.
+
+@item
+Externalizing of attachments
+
+If @code{gnus-gcc-externalize-attachments} or
+@code{message-fcc-externalize-attachments} is non-@code{nil}, attach
+local files as external parts.
+
+@item
+The envelope sender address can be customized when using Sendmail.
+@xref{Mail Variables, Mail Variables,, message, Message Manual}.
+
+@item
+Gnus no longer generate the Sender: header automatically.
+
+Earlier it was generated when the user configurable email address was
+different from the Gnus guessed default user address.  As the guessing
+algorithm is rarely correct these days, and (more controversially) the
+only use of the Sender: header was to check if you are entitled to
+cancel/supersede news (which is now solved by Cancel Locks instead,
+see another entry), generation of the header has been disabled by
+default.  See the variables @code{message-required-headers},
+@code{message-required-news-headers}, and
+@code{message-required-mail-headers}.
+
+@item
+Features from third party @file{message-utils.el} added to @file{message.el}.
+
+Message now asks if you wish to remove @samp{(was: <old subject>)} from
+subject lines (see @code{message-subject-trailing-was-query}).  @kbd{C-c
+M-m} and @kbd{C-c M-f} inserts markers indicating included text.
+@kbd{C-c C-f a} adds a X-No-Archive: header.  @kbd{C-c C-f x} inserts
+appropriate headers and a note in the body for cross-postings and
+followups (see the variables @code{message-cross-post-@var{*}}).
+
+@item
+References and X-Draft-From headers are no longer generated when you
+start composing messages and @code{message-generate-headers-first} is
+@code{nil}.
+
+@item
+Easy inclusion of X-Faces headers.  @xref{X-Face}.
+
+@item
+Group Carbon Copy (GCC) quoting
+
+To support groups that contains SPC and other weird characters, groups
+are quoted before they are placed in the Gcc: header.  This means
+variables such as @code{gnus-message-archive-group} should no longer
+contain quote characters to make groups containing SPC work.  Also, if
+you are using the string @samp{nnml:foo, nnml:bar} (indicating Gcc
+into two groups) you must change it to return the list
+@code{("nnml:foo" "nnml:bar")}, otherwise the Gcc: line will be quoted
+incorrectly.  Note that returning the string @samp{nnml:foo, nnml:bar}
+was incorrect earlier, it just didn't generate any problems since it
+was inserted directly.
+
+@item
+@code{message-insinuate-rmail}
+
+Adding @code{(message-insinuate-rmail)} and @code{(setq
+mail-user-agent 'gnus-user-agent)} in @file{.emacs} convinces Rmail to
+compose, reply and forward messages in message-mode, where you can
+enjoy the power of @acronym{MML}.
+
+@item
+@code{message-minibuffer-local-map}
+
+The line below enables BBDB in resending a message:
+@lisp
+(define-key message-minibuffer-local-map [(tab)]
+  'bbdb-complete-name)
+@end lisp
+
+@item
+@code{gnus-posting-styles}
+
+Add a new format of match like
+@lisp
+((header "to" "larsi.*org")
+ (Organization "Somewhere, Inc."))
+@end lisp
+The old format like the lines below is obsolete, but still accepted.
+@lisp
+(header "to" "larsi.*org"
+        (Organization "Somewhere, Inc."))
+@end lisp
+
+@item
+@code{message-ignored-news-headers} and @code{message-ignored-mail-headers}
+
+@samp{X-Draft-From} and @samp{X-Gnus-Agent-Meta-Information} have been
+added into these two variables.  If you customized those, perhaps you
+need add those two headers too.
+
+@item
+Gnus supports the ``format=flowed'' (RFC 2646) parameter.  On
+composing messages, it is enabled by @code{use-hard-newlines}.
+Decoding format=flowed was present but not documented in earlier
+versions.
+
+@item
+The option @code{mm-fill-flowed} can be used to disable treatment of
+``format=flowed'' messages.  Also, flowed text is disabled when sending
+inline PGP signed messages.  @xref{Flowed text, , Flowed text,
+emacs-mime, The Emacs MIME Manual}.  (New in Gnus 5.10.7)
+@c This entry is also present in the node "No Gnus".
+
+@item
+Gnus supports the generation of RFC 2298 Disposition Notification requests.
+
+This is invoked with the @kbd{C-c M-n} key binding from message mode.
+
+@item
+Message supports the Importance: (RFC 2156) header.
+
+In the message buffer, @kbd{C-c C-f C-i} or @kbd{C-c C-u} cycles through
+the valid values.
+
+@item
+Gnus supports Cancel Locks in News.
+
+This means a header @samp{Cancel-Lock} is inserted in news posting.  It is
+used to determine if you wrote an article or not (for canceling and
+superseding).  Gnus generates a random password string the first time
+you post a message, and saves it in your @file{~/.emacs} using the Custom
+system.  While the variable is called @code{canlock-password}, it is not
+security sensitive data.  Publishing your canlock string on the web
+will not allow anyone to be able to anything she could not already do.
+The behavior can be changed by customizing @code{message-insert-canlock}.
+
+@item
+Gnus supports @acronym{PGP} (RFC 1991/2440), @acronym{PGP/MIME} (RFC
+2015/3156) and @acronym{S/MIME} (RFC 2630-2633).
+
+It needs an external @acronym{S/MIME} and OpenPGP implementation, but no
+additional Lisp libraries.  This add several menu items to the
+Attachments menu, and @kbd{C-c RET} key bindings, when composing
+messages.  This also obsoletes @code{gnus-article-hide-pgp-hook}.
+
+@item
+@acronym{MML} (Mime compose) prefix changed from @kbd{M-m} to @kbd{C-c
+C-m}.
+
+This change was made to avoid conflict with the standard binding of
+@code{back-to-indentation}, which is also useful in message mode.
+
+@item
+The default for @code{message-forward-show-mml} changed to the symbol
+@code{best}.
+
+The behavior for the @code{best} value is to show @acronym{MML} (i.e.,
+convert to @acronym{MIME}) when appropriate.  @acronym{MML} will not be
+used when forwarding signed or encrypted messages, as the conversion
+invalidate the digital signature.
+
+@item
+If @code{auto-compression-mode} is enabled, attachments are automatically
+decompressed when activated.
+@c FIXME: Does this affect article or message mode?
+
+@item
+Support for non-@acronym{ASCII} domain names
+
+Message supports non-@acronym{ASCII} domain names in From:, To: and
+Cc: and will query you whether to perform encoding when you try to
+send a message.  The variable @code{message-use-idna} controls this.
+Gnus will also decode non-@acronym{ASCII} domain names in From:, To:
+and Cc: when you view a message.  The variable @code{gnus-use-idna}
+controls this.
+
+@item You can now drag and drop attachments to the Message buffer.
+See @code{mml-dnd-protocol-alist} and @code{mml-dnd-attach-options}.
+@xref{MIME, ,MIME, message, Message Manual}.
+@c New in 5.10.9 / 5.11
+
+@end itemize
+
+@item Changes in back ends
+@c ***********************
+
+@itemize @bullet
+@item
+Gnus can display RSS newsfeeds as a newsgroup.  @xref{RSS}.
+
+@item
+The nndoc back end now supports mailman digests and exim bounces.
+
+@item
+Gnus supports Maildir groups.
+
+Gnus includes a new back end @file{nnmaildir.el}.  @xref{Maildir}.
+
+@item
+The nnml and nnfolder back ends store marks for each groups.
+
+This makes it possible to take backup of nnml/nnfolder servers/groups
+separately of @file{~/.newsrc.eld}, while preserving marks.  It also
+makes it possible to share articles and marks between users (without
+sharing the @file{~/.newsrc.eld} file) within e.g. a department.  It
+works by storing the marks stored in @file{~/.newsrc.eld} in a per-group
+file @file{.marks} (for nnml) and @file{@var{groupname}.mrk} (for
+nnfolder, named @var{groupname}).  If the nnml/nnfolder is moved to
+another machine, Gnus will automatically use the @file{.marks} or
+@file{.mrk} file instead of the information in @file{~/.newsrc.eld}.
+The new server variables @code{nnml-marks-is-evil} and
+@code{nnfolder-marks-is-evil} can be used to disable this feature.
+
+@end itemize
+
+@item Appearance
+@c *************
+
+@itemize @bullet
+
+@item
+The menu bar item (in Group and Summary buffer) named ``Misc'' has
+been renamed to ``Gnus''.
+
+@item
+The menu bar item (in Message mode) named ``@acronym{MML}'' has been
+renamed to ``Attachments''.  Note that this menu also contains security
+related stuff, like signing and encryption (@pxref{Security, Security,,
+message, Message Manual}).
+
+@item
+The tool bars have been updated to use GNOME icons in Group, Summary and
+Message mode.  You can also customize the tool bars.  This is a new
+feature in Gnus 5.10.9.  (Only for Emacs, not in XEmacs.)
+
+@item The tool bar icons are now (de)activated correctly
+in the group buffer, see the variable @code{gnus-group-update-tool-bar}.
+Its default value depends on your Emacs version.  This is a new feature
+in Gnus 5.10.9.
+@end itemize
+
+
+@item Miscellaneous changes
+@c ************************
+
+@itemize @bullet
+
+@item
+@code{gnus-agent}
+
+The Gnus Agent has seen a major updated and is now enabled by default,
+and all nntp and nnimap servers from @code{gnus-select-method} and
+@code{gnus-secondary-select-method} are agentized by default.  Earlier
+only the server in @code{gnus-select-method} was agentized by the
+default, and the agent was disabled by default.  When the agent is
+enabled, headers are now also retrieved from the Agent cache instead
+of the back ends when possible.  Earlier this only happened in the
+unplugged state.  You can enroll or remove servers with @kbd{J a} and
+@kbd{J r} in the server buffer.  Gnus will not download articles into
+the Agent cache, unless you instruct it to do so, though, by using
+@kbd{J u} or @kbd{J s} from the Group buffer.  You revert to the old
+behavior of having the Agent disabled with @code{(setq gnus-agent
+nil)}.  Note that putting @code{(gnus-agentize)} in @file{~/.gnus.el}
+is not needed any more.
+
+@item
+Gnus reads the @acronym{NOV} and articles in the Agent if plugged.
+
+If one reads an article while plugged, and the article already exists
+in the Agent, it won't get downloaded once more.  @code{(setq
+gnus-agent-cache nil)} reverts to the old behavior.
+
+@item
+Dired integration
+
+@code{gnus-dired-minor-mode} (see @ref{Other modes}) installs key
+bindings in dired buffers to send a file as an attachment, open a file
+using the appropriate mailcap entry, and print a file using the mailcap
+entry.
+
+@item
+The format spec @code{%C} for positioning point has changed to @code{%*}.
+
+@item
+@code{gnus-slave-unplugged}
+
+A new command which starts Gnus offline in slave mode.
+
+@end itemize
+
+@end itemize
+
+@iftex
+
+@page
+@node The Manual
+@section The Manual
+@cindex colophon
+@cindex manual
+
+This manual was generated from a TeXinfo file and then run through
+either @code{texi2dvi}
+@iflatex
+or my own home-brewed TeXinfo to \LaTeX\ transformer,
+and then run through @code{latex} and @code{dvips}
+@end iflatex
+to get what you hold in your hands now.
+
+The following conventions have been used:
+
+@enumerate
+
+@item
+This is a @samp{string}
+
+@item
+This is a @kbd{keystroke}
+
+@item
+This is a @file{file}
+
+@item
+This is a @code{symbol}
+
+@end enumerate
+
+So if I were to say ``set @code{flargnoze} to @samp{yes}'', that would
+mean:
+
+@lisp
+(setq flargnoze "yes")
+@end lisp
+
+If I say ``set @code{flumphel} to @code{yes}'', that would mean:
+
+@lisp
+(setq flumphel 'yes)
+@end lisp
+
+@samp{yes} and @code{yes} are two @emph{very} different things---don't
+ever get them confused.
+
+@iflatex
+@c @head
+Of course, everything in this manual is of vital interest, so you should
+read it all.  Several times.  However, if you feel like skimming the
+manual, look for that gnu head you should see in the margin over
+there---it means that what's being discussed is of more importance than
+the rest of the stuff.  (On the other hand, if everything is infinitely
+important, how can anything be more important than that?  Just one more
+of the mysteries of this world, I guess.)
+@end iflatex
+
+@end iftex
+
+
+@node On Writing Manuals
+@section On Writing Manuals
+
+I guess most manuals are written after-the-fact; documenting a program
+that's already there.  This is not how this manual is written.  When
+implementing something, I write the manual entry for that something
+straight away.  I then see that it's difficult to explain the
+functionality, so I write how it's supposed to be, and then I change the
+implementation.  Writing the documentation and writing the code go hand
+in hand.
+
+This, of course, means that this manual has no, or little, flow.  It
+documents absolutely everything in Gnus, but often not where you're
+looking for it.  It is a reference manual, and not a guide to how to get
+started with Gnus.
+
+That would be a totally different book, that should be written using the
+reference manual as source material.  It would look quite different.
+
+
+@page
+@node Terminology
+@section Terminology
+
+@cindex terminology
+@table @dfn
+
+@item news
+@cindex news
+This is what you are supposed to use this thing for---reading news.
+News is generally fetched from a nearby @acronym{NNTP} server, and is
+generally publicly available to everybody.  If you post news, the entire
+world is likely to read just what you have written, and they'll all
+snigger mischievously.  Behind your back.
+
+@item mail
+@cindex mail
+Everything that's delivered to you personally is mail.  Some news/mail
+readers (like Gnus) blur the distinction between mail and news, but
+there is a difference.  Mail is private.  News is public.  Mailing is
+not posting, and replying is not following up.
+
+@item reply
+@cindex reply
+Send a mail to the person who has written what you are reading.
+
+@item follow up
+@cindex follow up
+Post an article to the current newsgroup responding to the article you
+are reading.
+
+@item back end
+@cindex back end
+Gnus considers mail and news to be mostly the same, really.  The only
+difference is how to access the actual articles.  News articles are
+commonly fetched via the protocol @acronym{NNTP}, whereas mail
+messages could be read from a file on the local disk.  The internal
+architecture of Gnus thus comprises a ``front end'' and a number of
+``back ends''.  Internally, when you enter a group (by hitting
+@key{RET}, say), you thereby invoke a function in the front end in
+Gnus.  The front end then ``talks'' to a back end and says things like
+``Give me the list of articles in the foo group'' or ``Show me article
+number 4711''.
+
+So a back end mainly defines either a protocol (the @code{nntp} back
+end accesses news via @acronym{NNTP}, the @code{nnimap} back end
+accesses mail via @acronym{IMAP}) or a file format and directory
+layout (the @code{nnspool} back end accesses news via the common
+``spool directory'' format, the @code{nnml} back end access mail via a
+file format and directory layout that's quite similar).
+
+Gnus does not handle the underlying media, so to speak---this is all
+done by the back ends.  A back end is a collection of functions to
+access the articles.
+
+However, sometimes the term ``back end'' is also used where ``server''
+would have been more appropriate.  And then there is the term ``select
+method'' which can mean either.  The Gnus terminology can be quite
+confusing.
+
+@item native
+@cindex native
+Gnus will always use one method (and back end) as the @dfn{native}, or
+default, way of getting news.
+
+@item foreign
+@cindex foreign
+You can also have any number of foreign groups active at the same time.
+These are groups that use non-native non-secondary back ends for getting
+news.
+
+@item secondary
+@cindex secondary
+Secondary back ends are somewhere half-way between being native and being
+foreign, but they mostly act like they are native.
+
+@item article
+@cindex article
+A message that has been posted as news.
+
+@item mail message
+@cindex mail message
+A message that has been mailed.
+
+@item message
+@cindex message
+A mail message or news article
+
+@item head
+@cindex head
+The top part of a message, where administrative information (etc.) is
+put.
+
+@item body
+@cindex body
+The rest of an article.  Everything not in the head is in the
+body.
+
+@item header
+@cindex header
+A line from the head of an article.
+
+@item headers
+@cindex headers
+A collection of such lines, or a collection of heads.  Or even a
+collection of @acronym{NOV} lines.
+
+@item @acronym{NOV}
+@cindex @acronym{NOV}
+@acronym{NOV} stands for News OverView, which is a type of news server
+header which provide datas containing the condensed header information
+of articles.  They are produced by the server itself; in the @code{nntp}
+back end Gnus uses the ones that the @acronym{NNTP} server makes, but
+Gnus makes them by itself for some backends (in particular, @code{nnml}).
+
+When Gnus enters a group, it asks the back end for the headers of all
+unread articles in the group.  Most servers support the News OverView
+format, which is more compact and much faster to read and parse than the
+normal @sc{head} format.
+
+The @acronym{NOV} data consist of one or more text lines (@pxref{Text
+Lines, ,Motion by Text Lines, elisp, The Emacs Lisp Reference Manual})
+where each line has the header information of one article.  The header
+information is a tab-separated series of the header's contents including
+an article number, a subject, an author, a date, a message-id,
+references, etc.
+
+Those data enable Gnus to generate summary lines quickly.  However, if
+the server does not support @acronym{NOV} or you disable it purposely or
+for some reason, Gnus will try to generate the header information by
+parsing each article's headers one by one.  It will take time.
+Therefore, it is not usually a good idea to set nn*-nov-is-evil
+(@pxref{Slow/Expensive Connection}) to a non-@code{nil} value unless you
+know that the server makes wrong @acronym{NOV} data.
+
+@item level
+@cindex levels
+Each group is subscribed at some @dfn{level} or other (1-9).  The ones
+that have a lower level are ``more'' subscribed than the groups with a
+higher level.  In fact, groups on levels 1-5 are considered
+@dfn{subscribed}; 6-7 are @dfn{unsubscribed}; 8 are @dfn{zombies}; and 9
+are @dfn{killed}.  Commands for listing groups and scanning for new
+articles will all use the numeric prefix as @dfn{working level}.
+
+@item killed groups
+@cindex killed groups
+No information on killed groups is stored or updated, which makes killed
+groups much easier to handle than subscribed groups.
+
+@item zombie groups
+@cindex zombie groups
+Just like killed groups, only slightly less dead.
+
+@item active file
+@cindex active file
+The news server has to keep track of what articles it carries, and what
+groups exist.  All this information in stored in the active file, which
+is rather large, as you might surmise.
+
+@item bogus groups
+@cindex bogus groups
+A group that exists in the @file{.newsrc} file, but isn't known to the
+server (i.e.,  it isn't in the active file), is a @emph{bogus group}.
+This means that the group probably doesn't exist (any more).
+
+@item activating
+@cindex activating groups
+The act of asking the server for info on a group and computing the
+number of unread articles is called @dfn{activating the group}.
+Un-activated groups are listed with @samp{*} in the group buffer.
+
+@item spool
+@cindex spool
+News servers store their articles locally in one fashion or other.
+One old-fashioned storage method is to have just one file per
+article.  That's called a ``traditional spool''.
+
+@item server
+@cindex server
+A machine one can connect to and get news (or mail) from.
+
+@item select method
+@cindex select method
+A structure that specifies the back end, the server and the virtual
+server settings.
+
+@item virtual server
+@cindex virtual server
+A named select method.  Since a select method defines all there is to
+know about connecting to a (physical) server, taking the thing as a
+whole is a virtual server.
+
+@item washing
+@cindex washing
+Taking a buffer and running it through a filter of some sort.  The
+result will (more often than not) be cleaner and more pleasing than the
+original.
+
+@item ephemeral groups
+@cindex ephemeral groups
+@cindex temporary groups
+Most groups store data on what articles you have read.  @dfn{Ephemeral}
+groups are groups that will have no data stored---when you exit the
+group, it'll disappear into the aether.
+
+@item solid groups
+@cindex solid groups
+This is the opposite of ephemeral groups.  All groups listed in the
+group buffer are solid groups.
+
+@item sparse articles
+@cindex sparse articles
+These are article placeholders shown in the summary buffer when
+@code{gnus-build-sparse-threads} has been switched on.
+
+@item threading
+@cindex threading
+To put responses to articles directly after the articles they respond
+to---in a hierarchical fashion.
+
+@item root
+@cindex root
+@cindex thread root
+The first article in a thread is the root.  It is the ancestor of all
+articles in the thread.
+
+@item parent
+@cindex parent
+An article that has responses.
+
+@item child
+@cindex child
+An article that responds to a different article---its parent.
+
+@item digest
+@cindex digest
+A collection of messages in one file.  The most common digest format is
+specified by RFC 1153.
+
+@item splitting
+@cindex splitting, terminology
+@cindex mail sorting
+@cindex mail filtering (splitting)
+The action of sorting your emails according to certain rules. Sometimes
+incorrectly called mail filtering.
+
+@end table
+
+
+@page
+@node Customization
+@section Customization
+@cindex general customization
+
+All variables are properly documented elsewhere in this manual.  This
+section is designed to give general pointers on how to customize Gnus
+for some quite common situations.
+
+@menu
+* Slow/Expensive Connection::   You run a local Emacs and get the news elsewhere.
+* Slow Terminal Connection::    You run a remote Emacs.
+* Little Disk Space::           You feel that having large setup files is icky.
+* Slow Machine::                You feel like buying a faster machine.
+@end menu
+
+
+@node Slow/Expensive Connection
+@subsection Slow/Expensive Connection
+
+If you run Emacs on a machine locally, and get your news from a machine
+over some very thin strings, you want to cut down on the amount of data
+Gnus has to get from the server.
+
+@table @code
+
+@item gnus-read-active-file
+Set this to @code{nil}, which will inhibit Gnus from requesting the
+entire active file from the server.  This file is often very large.  You
+also have to set @code{gnus-check-new-newsgroups} and
+@code{gnus-check-bogus-newsgroups} to @code{nil} to make sure that Gnus
+doesn't suddenly decide to fetch the active file anyway.
+
+@item gnus-nov-is-evil
+@vindex gnus-nov-is-evil
+Usually this one must @emph{always} be @code{nil} (which is the
+default).  If, for example, you wish to not use @acronym{NOV}
+(@pxref{Terminology}) with the @code{nntp} back end (@pxref{Crosspost
+Handling}), set @code{nntp-nov-is-evil} to a non-@code{nil} value
+instead of setting this.  But you normally do not need to set
+@code{nntp-nov-is-evil} since Gnus by itself will detect whether the
+@acronym{NNTP} server supports @acronym{NOV}.  Anyway, grabbing article
+headers from the @acronym{NNTP} server will not be very fast if you tell
+Gnus not to use @acronym{NOV}.
+
+As the variables for the other back ends, there are
+@code{nndiary-nov-is-evil}, @code{nndir-nov-is-evil},
+@code{nnfolder-nov-is-evil}, @code{nnimap-nov-is-evil},
+@code{nnml-nov-is-evil}, @code{nnspool-nov-is-evil}, and
+@code{nnwarchive-nov-is-evil}.  Note that a non-@code{nil} value for
+@code{gnus-nov-is-evil} overrides all those variables.@footnote{Although
+the back ends @code{nnkiboze}, @code{nnslashdot}, @code{nnultimate}, and
+@code{nnwfm} don't have their own nn*-nov-is-evil.}
+@end table
+
+
+@node Slow Terminal Connection
+@subsection Slow Terminal Connection
+
+Let's say you use your home computer for dialing up the system that runs
+Emacs and Gnus.  If your modem is slow, you want to reduce (as much as
+possible) the amount of data sent over the wires.
+
+@table @code
+
+@item gnus-auto-center-summary
+Set this to @code{nil} to inhibit Gnus from re-centering the summary
+buffer all the time.  If it is @code{vertical}, do only vertical
+re-centering.  If it is neither @code{nil} nor @code{vertical}, do both
+horizontal and vertical recentering.
+
+@item gnus-visible-headers
+Cut down on the headers included in the articles to the
+minimum.  You can, in fact, make do without them altogether---most of the
+useful data is in the summary buffer, anyway.  Set this variable to
+@samp{^NEVVVVER} or @samp{From:}, or whatever you feel you need.
+
+Use the following to enable all the available hiding features:
+@lisp
+(setq gnus-treat-hide-headers 'head
+      gnus-treat-hide-signature t
+      gnus-treat-hide-citation t)
+@end lisp
+
+@item gnus-use-full-window
+By setting this to @code{nil}, you can make all the windows smaller.
+While this doesn't really cut down much generally, it means that you
+have to see smaller portions of articles before deciding that you didn't
+want to read them anyway.
+
+@item gnus-thread-hide-subtree
+If this is non-@code{nil}, all threads in the summary buffer will be
+hidden initially.
+
+
+@item gnus-updated-mode-lines
+If this is @code{nil}, Gnus will not put information in the buffer mode
+lines, which might save some time.
+@end table
+
+
+@node Little Disk Space
+@subsection Little Disk Space
+@cindex disk space
+
+The startup files can get rather large, so you may want to cut their
+sizes a bit if you are running out of space.
+
+@table @code
+
+@item gnus-save-newsrc-file
+If this is @code{nil}, Gnus will never save @file{.newsrc}---it will
+only save @file{.newsrc.eld}.  This means that you will not be able to
+use any other newsreaders than Gnus.  This variable is @code{t} by
+default.
+
+@item gnus-read-newsrc-file
+If this is @code{nil}, Gnus will never read @file{.newsrc}---it will
+only read @file{.newsrc.eld}.  This means that you will not be able to
+use any other newsreaders than Gnus.  This variable is @code{t} by
+default.
+
+@item gnus-save-killed-list
+If this is @code{nil}, Gnus will not save the list of dead groups.  You
+should also set @code{gnus-check-new-newsgroups} to @code{ask-server}
+and @code{gnus-check-bogus-newsgroups} to @code{nil} if you set this
+variable to @code{nil}.  This variable is @code{t} by default.
+
+@end table
+
+
+@node Slow Machine
+@subsection Slow Machine
+@cindex slow machine
+
+If you have a slow machine, or are just really impatient, there are a
+few things you can do to make Gnus run faster.
+
+Set @code{gnus-check-new-newsgroups} and
+@code{gnus-check-bogus-newsgroups} to @code{nil} to make startup faster.
+
+Set @code{gnus-show-threads}, @code{gnus-use-cross-reference} and
+@code{gnus-nov-is-evil} to @code{nil} to make entering and exiting the
+summary buffer faster.  Also @pxref{Slow/Expensive Connection}.
+
+
+@page
+@node Troubleshooting
+@section Troubleshooting
+@cindex troubleshooting
+
+Gnus works @emph{so} well straight out of the box---I can't imagine any
+problems, really.
+
+Ahem.
+
+@enumerate
+
+@item
+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 @samp{Gnus v5.10.6} 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.
+
+@item
+@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
+something like that.
+@end enumerate
+
+If all else fails, report the problem as a bug.
+
+@cindex bugs
+@cindex reporting bugs
+
+@kindex M-x gnus-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 RET debug-on-error RET t 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.
+
+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
+a 10Kb mail each time you use it, and even if you have sent me your
+environment 500 times before.  I don't care.  I want the full info each
+time.
+
+It is also important to remember that I have no memory whatsoever.  If
+you send a bug report, and I send you a reply, and then you just send
+back ``No, it's not! Moron!'', I will have no idea what you are
+insulting me about.  Always over-explain everything.  It's much easier
+for all of us---if I don't have all the information I need, I will just
+mail you and ask for more info, and everything takes more time.
+
+If the problem you're seeing is very visual, and you can't quite explain
+it, copy the Emacs window to a file (with @code{xwd}, for instance), put
+it somewhere it can be reached, and include the URL of the picture in
+the bug report.
+
+@cindex patches
+If you would like to contribute a patch to fix bugs or make
+improvements, please produce the patch using @samp{diff -u}.
+
+@cindex edebug
+If you want to debug your problem further before reporting, possibly
+in order to solve the problem yourself and send a patch, you can use
+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
+the documentation buffer that leads you to the function definition,
+then press @kbd{M-x edebug-defun RET} with point inside that function,
+return to Gnus and press @kbd{c} to invoke the code.  You will be
+placed in the lisp buffer and can single step using @kbd{SPC} and
+evaluate expressions using @kbd{M-:} or inspect variables using
+@kbd{C-h v}, abort execution with @kbd{q}, and resume execution with
+@kbd{c} or @kbd{g}.
+
+@cindex elp
+@cindex profile
+@cindex slow
+Sometimes, a problem do not directly generate an elisp 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
+helps isolating the real problem areas).
+
+A fancier approach is to use the elisp profiler, ELP.  The profiler is
+(or should be) fully documented elsewhere, but to get you started
+there are a few steps that need to be followed.  First, instrument the
+part of Gnus you are interested in for profiling, e.g. @kbd{M-x
+elp-instrument-package RET gnus} or @kbd{M-x elp-instrument-package
+RET message}.  Then perform the operation that is slow and press
+@kbd{M-x elp-results}.  You will then see which operations that takes
+time, and can debug them further.  If the entire operation takes much
+longer than the time spent in the slowest function in the profiler
+output, you probably profiled the wrong part of Gnus.  To reset
+profiling statistics, use @kbd{M-x elp-reset-all}.  @kbd{M-x
+elp-restore-all} is supposed to remove profiling, but given the
+complexities and dynamic code generation in Gnus, it might not always
+work perfectly.
+
+@cindex gnu.emacs.gnus
+@cindex ding mailing list
+If you just need help, you are better off asking on
+@samp{gnu.emacs.gnus}.  I'm not very helpful.  You can also ask on
+@email{ding@@gnus.org, the ding mailing list}.  Write to
+@email{ding-request@@gnus.org} to subscribe.
+
+
+@page
+@node Gnus Reference Guide
+@section Gnus Reference Guide
+
+It is my hope that other people will figure out smart stuff that Gnus
+can do, and that other people will write those smart things as well.  To
+facilitate that I thought it would be a good idea to describe the inner
+workings of Gnus.  And some of the not-so-inner workings, while I'm at
+it.
+
+You can never expect the internals of a program not to change, but I
+will be defining (in some details) the interface between Gnus and its
+back ends (this is written in stone), the format of the score files
+(ditto), data structures (some are less likely to change than others)
+and general methods of operation.
+
+@menu
+* Gnus Utility Functions::      Common functions and variable to use.
+* Back End Interface::          How Gnus communicates with the servers.
+* Score File Syntax::           A BNF definition of the score file standard.
+* Headers::                     How Gnus stores headers internally.
+* Ranges::                      A handy format for storing mucho numbers.
+* Group Info::                  The group info format.
+* Extended Interactive::        Symbolic prefixes and stuff.
+* Emacs/XEmacs Code::           Gnus can be run under all modern Emacsen.
+* Various File Formats::        Formats of files that Gnus use.
+@end menu
+
+
+@node Gnus Utility Functions
+@subsection Gnus Utility Functions
+@cindex Gnus utility functions
+@cindex utility functions
+@cindex functions
+@cindex internal variables
+
+When writing small functions to be run from hooks (and stuff), it's
+vital to have access to the Gnus internal functions and variables.
+Below is a list of the most common ones.
+
+@table @code
+
+@item gnus-newsgroup-name
+@vindex gnus-newsgroup-name
+This variable holds the name of the current newsgroup.
+
+@item gnus-find-method-for-group
+@findex gnus-find-method-for-group
+A function that returns the select method for @var{group}.
+
+@item gnus-group-real-name
+@findex gnus-group-real-name
+Takes a full (prefixed) Gnus group name, and returns the unprefixed
+name.
+
+@item gnus-group-prefixed-name
+@findex gnus-group-prefixed-name
+Takes an unprefixed group name and a select method, and returns the full
+(prefixed) Gnus group name.
+
+@item gnus-get-info
+@findex gnus-get-info
+Returns the group info list for @var{group}.
+
+@item gnus-group-unread
+@findex gnus-group-unread
+The number of unread articles in @var{group}, or @code{t} if that is
+unknown.
+
+@item gnus-active
+@findex gnus-active
+The active entry for @var{group}.
+
+@item gnus-set-active
+@findex gnus-set-active
+Set the active entry for @var{group}.
+
+@item gnus-add-current-to-buffer-list
+@findex gnus-add-current-to-buffer-list
+Adds the current buffer to the list of buffers to be killed on Gnus
+exit.
+
+@item gnus-continuum-version
+@findex gnus-continuum-version
+Takes a Gnus version string as a parameter and returns a floating point
+number.  Earlier versions will always get a lower number than later
+versions.
+
+@item gnus-group-read-only-p
+@findex gnus-group-read-only-p
+Says whether @var{group} is read-only or not.
+
+@item gnus-news-group-p
+@findex gnus-news-group-p
+Says whether @var{group} came from a news back end.
+
+@item gnus-ephemeral-group-p
+@findex gnus-ephemeral-group-p
+Says whether @var{group} is ephemeral or not.
+
+@item gnus-server-to-method
+@findex gnus-server-to-method
+Returns the select method corresponding to @var{server}.
+
+@item gnus-server-equal
+@findex gnus-server-equal
+Says whether two virtual servers are equal.
+
+@item gnus-group-native-p
+@findex gnus-group-native-p
+Says whether @var{group} is native or not.
+
+@item gnus-group-secondary-p
+@findex gnus-group-secondary-p
+Says whether @var{group} is secondary or not.
+
+@item gnus-group-foreign-p
+@findex gnus-group-foreign-p
+Says whether @var{group} is foreign or not.
+
+@item gnus-group-find-parameter
+@findex gnus-group-find-parameter
+Returns the parameter list of @var{group}.  If given a second parameter,
+returns the value of that parameter for @var{group}.
+
+@item gnus-group-set-parameter
+@findex gnus-group-set-parameter
+Takes three parameters; @var{group}, @var{parameter} and @var{value}.
+
+@item gnus-narrow-to-body
+@findex gnus-narrow-to-body
+Narrows the current buffer to the body of the article.
+
+@item gnus-check-backend-function
+@findex gnus-check-backend-function
+Takes two parameters, @var{function} and @var{group}.  If the back end
+@var{group} comes from supports @var{function}, return non-@code{nil}.
+
+@lisp
+(gnus-check-backend-function "request-scan" "nnml:misc")
+@result{} t
+@end lisp
+
+@item gnus-read-method
+@findex gnus-read-method
+Prompts the user for a select method.
+
+@end table
+
+
+@node Back End Interface
+@subsection Back End Interface
+
+Gnus doesn't know anything about @acronym{NNTP}, spools, mail or virtual
+groups.  It only knows how to talk to @dfn{virtual servers}.  A virtual
+server is a @dfn{back end} and some @dfn{back end variables}.  As examples
+of the first, we have @code{nntp}, @code{nnspool} and @code{nnmbox}.  As
+examples of the latter we have @code{nntp-port-number} and
+@code{nnmbox-directory}.
+
+When Gnus asks for information from a back end---say @code{nntp}---on
+something, it will normally include a virtual server name in the
+function parameters.  (If not, the back end should use the ``current''
+virtual server.)  For instance, @code{nntp-request-list} takes a virtual
+server as its only (optional) parameter.  If this virtual server hasn't
+been opened, the function should fail.
+
+Note that a virtual server name has no relation to some physical server
+name.  Take this example:
+
+@lisp
+(nntp "odd-one"
+      (nntp-address "ifi.uio.no")
+      (nntp-port-number 4324))
+@end lisp
+
+Here the virtual server name is @samp{odd-one} while the name of
+the physical server is @samp{ifi.uio.no}.
+
+The back ends should be able to switch between several virtual servers.
+The standard back ends implement this by keeping an alist of virtual
+server environments that they pull down/push up when needed.
+
+There are two groups of interface functions: @dfn{required functions},
+which must be present, and @dfn{optional functions}, which Gnus will
+always check for presence before attempting to call 'em.
+
+All these functions are expected to return data in the buffer
+@code{nntp-server-buffer} (@samp{ *nntpd*}), which is somewhat
+unfortunately named, but we'll have to live with it.  When I talk about
+@dfn{resulting data}, I always refer to the data in that buffer.  When I
+talk about @dfn{return value}, I talk about the function value returned by
+the function call.  Functions that fail should return @code{nil} as the
+return value.
+
+Some back ends could be said to be @dfn{server-forming} back ends, and
+some might be said not to be.  The latter are back ends that generally
+only operate on one group at a time, and have no concept of ``server''
+---they have a group, and they deliver info on that group and nothing
+more.
+
+Gnus identifies each message by way of group name and article number.  A
+few remarks about these article numbers might be useful.  First of all,
+the numbers are positive integers.  Secondly, it is normally not
+possible for later articles to ``re-use'' older article numbers without
+confusing Gnus.  That is, if a group has ever contained a message
+numbered 42, then no other message may get that number, or Gnus will get
+mightily confused.@footnote{See the function
+@code{nnchoke-request-update-info}, @ref{Optional Back End Functions}.}
+Third, article numbers must be assigned in order of arrival in the
+group; this is not necessarily the same as the date of the message.
+
+The previous paragraph already mentions all the ``hard'' restrictions that
+article numbers must fulfill.  But it seems that it might be useful to
+assign @emph{consecutive} article numbers, for Gnus gets quite confused
+if there are holes in the article numbering sequence.  However, due to
+the ``no-reuse'' restriction, holes cannot be avoided altogether.  It's
+also useful for the article numbers to start at 1 to avoid running out
+of numbers as long as possible.
+
+Note that by convention, back ends are named @code{nnsomething}, but
+Gnus also comes with some @code{nnnotbackends}, such as
+@file{nnheader.el}, @file{nnmail.el} and @file{nnoo.el}.
+
+In the examples and definitions I will refer to the imaginary back end
+@code{nnchoke}.
+
+@cindex @code{nnchoke}
+
+@menu
+* Required Back End Functions::  Functions that must be implemented.
+* Optional Back End Functions::  Functions that need not be implemented.
+* Error Messaging::             How to get messages and report errors.
+* Writing New Back Ends::       Extending old back ends.
+* Hooking New Back Ends Into Gnus::  What has to be done on the Gnus end.
+* Mail-like Back Ends::         Some tips on mail back ends.
+@end menu
+
+
+@node Required Back End Functions
+@subsubsection Required Back End Functions
+
+@table @code
+
+@item (nnchoke-retrieve-headers ARTICLES &optional GROUP SERVER FETCH-OLD)
+
+@var{articles} is either a range of article numbers or a list of
+@code{Message-ID}s.  Current back ends do not fully support either---only
+sequences (lists) of article numbers, and most back ends do not support
+retrieval of @code{Message-ID}s.  But they should try for both.
+
+The result data should either be HEADs or @acronym{NOV} lines, and the result
+value should either be @code{headers} or @code{nov} to reflect this.
+This might later be expanded to @code{various}, which will be a mixture
+of HEADs and @acronym{NOV} lines, but this is currently not supported by Gnus.
+
+If @var{fetch-old} is non-@code{nil} it says to try fetching ``extra
+headers'', in some meaning of the word.  This is generally done by
+fetching (at most) @var{fetch-old} extra headers less than the smallest
+article number in @code{articles}, and filling the gaps as well.  The
+presence of this parameter can be ignored if the back end finds it
+cumbersome to follow the request.  If this is non-@code{nil} and not a
+number, do maximum fetches.
+
+Here's an example HEAD:
+
+@example
+221 1056 Article retrieved.
+Path: ifi.uio.no!sturles
+From: sturles@@ifi.uio.no (Sturle Sunde)
+Newsgroups: ifi.discussion
+Subject: Re: Something very droll
+Date: 27 Oct 1994 14:02:57 +0100
+Organization: Dept. of Informatics, University of Oslo, Norway
+Lines: 26
+Message-ID: <38o8e1$a0o@@holmenkollen.ifi.uio.no>
+References: <38jdmq$4qu@@visbur.ifi.uio.no>
+NNTP-Posting-Host: holmenkollen.ifi.uio.no
+.
+@end example
+
+So a @code{headers} return value would imply that there's a number of
+these in the data buffer.
+
+Here's a BNF definition of such a buffer:
+
+@example
+headers        = *head
+head           = error / valid-head
+error-message  = [ "4" / "5" ] 2number " " <error message> eol
+valid-head     = valid-message *header "." eol
+valid-message  = "221 " <number> " Article retrieved." eol
+header         = <text> eol
+@end example
+
+@cindex BNF
+(The version of BNF used here is the one used in RFC822.)
+
+If the return value is @code{nov}, the data buffer should contain
+@dfn{network overview database} lines.  These are basically fields
+separated by tabs.
+
+@example
+nov-buffer = *nov-line
+nov-line   = field 7*8[ <TAB> field ] eol
+field      = <text except TAB>
+@end example
+
+For a closer look at what should be in those fields,
+@pxref{Headers}.
+
+
+@item (nnchoke-open-server SERVER &optional DEFINITIONS)
+
+@var{server} is here the virtual server name.  @var{definitions} is a
+list of @code{(VARIABLE VALUE)} pairs that define this virtual server.
+
+If the server can't be opened, no error should be signaled.  The back end
+may then choose to refuse further attempts at connecting to this
+server.  In fact, it should do so.
+
+If the server is opened already, this function should return a
+non-@code{nil} value.  There should be no data returned.
+
+
+@item (nnchoke-close-server &optional SERVER)
+
+Close connection to @var{server} and free all resources connected
+to it.  Return @code{nil} if the server couldn't be closed for some
+reason.
+
+There should be no data returned.
+
+
+@item (nnchoke-request-close)
+
+Close connection to all servers and free all resources that the back end
+have reserved.  All buffers that have been created by that back end
+should be killed.  (Not the @code{nntp-server-buffer}, though.)  This
+function is generally only called when Gnus is shutting down.
+
+There should be no data returned.
+
+
+@item (nnchoke-server-opened &optional SERVER)
+
+If @var{server} is the current virtual server, and the connection to the
+physical server is alive, then this function should return a
+non-@code{nil} value.  This function should under no circumstances
+attempt to reconnect to a server we have lost connection to.
+
+There should be no data returned.
+
+
+@item (nnchoke-status-message &optional SERVER)
+
+This function should return the last error message from @var{server}.
+
+There should be no data returned.
+
+
+@item (nnchoke-request-article ARTICLE &optional GROUP SERVER TO-BUFFER)
+
+The result data from this function should be the article specified by
+@var{article}.  This might either be a @code{Message-ID} or a number.
+It is optional whether to implement retrieval by @code{Message-ID}, but
+it would be nice if that were possible.
+
+If @var{to-buffer} is non-@code{nil}, the result data should be returned
+in this buffer instead of the normal data buffer.  This is to make it
+possible to avoid copying large amounts of data from one buffer to
+another, while Gnus mainly requests articles to be inserted directly
+into its article buffer.
+
+If it is at all possible, this function should return a cons cell where
+the @code{car} is the group name the article was fetched from, and the @code{cdr} is
+the article number.  This will enable Gnus to find out what the real
+group and article numbers are when fetching articles by
+@code{Message-ID}.  If this isn't possible, @code{t} should be returned
+on successful article retrieval.
+
+
+@item (nnchoke-request-group GROUP &optional SERVER FAST)
+
+Get data on @var{group}.  This function also has the side effect of
+making @var{group} the current group.
+
+If @var{fast}, don't bother to return useful data, just make @var{group}
+the current group.
+
+Here's an example of some result data and a definition of the same:
+
+@example
+211 56 1000 1059 ifi.discussion
+@end example
+
+The first number is the status, which should be 211.  Next is the
+total number of articles in the group, the lowest article number, the
+highest article number, and finally the group name.  Note that the total
+number of articles may be less than one might think while just
+considering the highest and lowest article numbers, but some articles
+may have been canceled.  Gnus just discards the total-number, so
+whether one should take the bother to generate it properly (if that is a
+problem) is left as an exercise to the reader.  If the group contains no
+articles, the lowest article number should be reported as 1 and the
+highest as 0.
+
+@example
+group-status = [ error / info ] eol
+error        = [ "4" / "5" ] 2<number> " " <Error message>
+info         = "211 " 3* [ <number> " " ] <string>
+@end example
+
+
+@item (nnchoke-close-group GROUP &optional SERVER)
+
+Close @var{group} and free any resources connected to it.  This will be
+a no-op on most back ends.
+
+There should be no data returned.
+
+
+@item (nnchoke-request-list &optional SERVER)
+
+Return a list of all groups available on @var{server}.  And that means
+@emph{all}.
+
+Here's an example from a server that only carries two groups:
+
+@example
+ifi.test 0000002200 0000002000 y
+ifi.discussion 3324 3300 n
+@end example
+
+On each line we have a group name, then the highest article number in
+that group, the lowest article number, and finally a flag.  If the group
+contains no articles, the lowest article number should be reported as 1
+and the highest as 0.
+
+@example
+active-file = *active-line
+active-line = name " " <number> " " <number> " " flags eol
+name        = <string>
+flags       = "n" / "y" / "m" / "x" / "j" / "=" name
+@end example
+
+The flag says whether the group is read-only (@samp{n}), is moderated
+(@samp{m}), is dead (@samp{x}), is aliased to some other group
+(@samp{=other-group}) or none of the above (@samp{y}).
+
+
+@item (nnchoke-request-post &optional SERVER)
+
+This function should post the current buffer.  It might return whether
+the posting was successful or not, but that's not required.  If, for
+instance, the posting is done asynchronously, it has generally not been
+completed by the time this function concludes.  In that case, this
+function should set up some kind of sentinel to beep the user loud and
+clear if the posting could not be completed.
+
+There should be no result data from this function.
+
+@end table
+
+
+@node Optional Back End Functions
+@subsubsection Optional Back End Functions
+
+@table @code
+
+@item (nnchoke-retrieve-groups GROUPS &optional SERVER)
+
+@var{groups} is a list of groups, and this function should request data
+on all those groups.  How it does it is of no concern to Gnus, but it
+should attempt to do this in a speedy fashion.
+
+The return value of this function can be either @code{active} or
+@code{group}, which says what the format of the result data is.  The
+former is in the same format as the data from
+@code{nnchoke-request-list}, while the latter is a buffer full of lines
+in the same format as @code{nnchoke-request-group} gives.
+
+@example
+group-buffer = *active-line / *group-status
+@end example
+
+
+@item (nnchoke-request-update-info GROUP INFO &optional SERVER)
+
+A Gnus group info (@pxref{Group Info}) is handed to the back end for
+alterations.  This comes in handy if the back end really carries all
+the information (as is the case with virtual and imap groups).  This
+function should destructively alter the info to suit its needs, and
+should return a non-@code{nil} value.
+
+There should be no result data from this function.
+
+
+@item (nnchoke-request-type GROUP &optional ARTICLE)
+
+When the user issues commands for ``sending news'' (@kbd{F} in the
+summary buffer, for instance), Gnus has to know whether the article the
+user is following up on is news or mail.  This function should return
+@code{news} if @var{article} in @var{group} is news, @code{mail} if it
+is mail and @code{unknown} if the type can't be decided.  (The
+@var{article} parameter is necessary in @code{nnvirtual} groups which
+might very well combine mail groups and news groups.)  Both @var{group}
+and @var{article} may be @code{nil}.
+
+There should be no result data from this function.
+
+
+@item (nnchoke-request-set-mark GROUP ACTION &optional SERVER)
+
+Set/remove/add marks on articles.  Normally Gnus handles the article
+marks (such as read, ticked, expired etc) internally, and store them in
+@file{~/.newsrc.eld}.  Some back ends (such as @acronym{IMAP}) however carry
+all information about the articles on the server, so Gnus need to
+propagate the mark information to the server.
+
+@var{action} is a list of mark setting requests, having this format:
+
+@example
+(RANGE ACTION MARK)
+@end example
+
+@var{range} is a range of articles you wish to update marks on.
+@var{action} is @code{add} or @code{del}, used to add marks or remove
+marks (preserving all marks not mentioned).  @var{mark} is a list of
+marks; where each mark is a symbol.  Currently used marks are
+@code{read}, @code{tick}, @code{reply}, @code{expire}, @code{killed},
+@code{dormant}, @code{save}, @code{download}, @code{unsend},
+@code{forward} and @code{recent}, but your back end should, if
+possible, not limit itself to these.
+
+Given contradictory actions, the last action in the list should be the
+effective one.  That is, if your action contains a request to add the
+@code{tick} mark on article 1 and, later in the list, a request to
+remove the mark on the same article, the mark should in fact be removed.
+
+An example action list:
+
+@example
+(((5 12 30) 'del '(tick))
+ ((10 . 90) 'add '(read expire))
+ ((92 94) 'del '(read)))
+@end example
+
+The function should return a range of articles it wasn't able to set the
+mark on (currently not used for anything).
+
+There should be no result data from this function.
+
+@item (nnchoke-request-update-mark GROUP ARTICLE MARK)
+
+If the user tries to set a mark that the back end doesn't like, this
+function may change the mark.  Gnus will use whatever this function
+returns as the mark for @var{article} instead of the original
+@var{mark}.  If the back end doesn't care, it must return the original
+@var{mark}, and not @code{nil} or any other type of garbage.
+
+The only use for this I can see is what @code{nnvirtual} does with
+it---if a component group is auto-expirable, marking an article as read
+in the virtual group should result in the article being marked as
+expirable.
+
+There should be no result data from this function.
+
+
+@item (nnchoke-request-scan &optional GROUP SERVER)
+
+This function may be called at any time (by Gnus or anything else) to
+request that the back end check for incoming articles, in one way or
+another.  A mail back end will typically read the spool file or query
+the @acronym{POP} server when this function is invoked.  The
+@var{group} doesn't have to be heeded---if the back end decides that
+it is too much work just scanning for a single group, it may do a
+total scan of all groups.  It would be nice, however, to keep things
+local if that's practical.
+
+There should be no result data from this function.
+
+
+@item (nnchoke-request-group-description GROUP &optional SERVER)
+
+The result data from this function should be a description of
+@var{group}.
+
+@example
+description-line = name <TAB> description eol
+name             = <string>
+description      = <text>
+@end example
+
+@item (nnchoke-request-list-newsgroups &optional SERVER)
+
+The result data from this function should be the description of all
+groups available on the server.
+
+@example
+description-buffer = *description-line
+@end example
+
+
+@item (nnchoke-request-newgroups DATE &optional SERVER)
+
+The result data from this function should be all groups that were
+created after @samp{date}, which is in normal human-readable date format
+(i.e., the date format used in mail and news headers, and returned by
+the function @code{message-make-date} by default).  The data should be
+in the active buffer format.
+
+It is okay for this function to return ``too many'' groups; some back ends
+might find it cheaper to return the full list of groups, rather than
+just the new groups.  But don't do this for back ends with many groups.
+Normally, if the user creates the groups herself, there won't be too
+many groups, so @code{nnml} and the like are probably safe.  But for
+back ends like @code{nntp}, where the groups have been created by the
+server, it is quite likely that there can be many groups.
+
+
+@item (nnchoke-request-create-group GROUP &optional SERVER)
+
+This function should create an empty group with name @var{group}.
+
+There should be no return data.
+
+
+@item (nnchoke-request-expire-articles ARTICLES &optional GROUP SERVER FORCE)
+
+This function should run the expiry process on all articles in the
+@var{articles} range (which is currently a simple list of article
+numbers.)  It is left up to the back end to decide how old articles
+should be before they are removed by this function.  If @var{force} is
+non-@code{nil}, all @var{articles} should be deleted, no matter how new
+they are.
+
+This function should return a list of articles that it did not/was not
+able to delete.
+
+There should be no result data returned.
+
+
+@item (nnchoke-request-move-article ARTICLE GROUP SERVER ACCEPT-FORM &optional LAST)
+
+This function should move @var{article} (which is a number) from
+@var{group} by calling @var{accept-form}.
+
+This function should ready the article in question for moving by
+removing any header lines it has added to the article, and generally
+should ``tidy up'' the article.  Then it should @code{eval}
+@var{accept-form} in the buffer where the ``tidy'' article is.  This
+will do the actual copying.  If this @code{eval} returns a
+non-@code{nil} value, the article should be removed.
+
+If @var{last} is @code{nil}, that means that there is a high likelihood
+that there will be more requests issued shortly, so that allows some
+optimizations.
+
+The function should return a cons where the @code{car} is the group name and
+the @code{cdr} is the article number that the article was entered as.
+
+There should be no data returned.
+
+
+@item (nnchoke-request-accept-article GROUP &optional SERVER LAST)
+
+This function takes the current buffer and inserts it into @var{group}.
+If @var{last} in @code{nil}, that means that there will be more calls to
+this function in short order.
+
+The function should return a cons where the @code{car} is the group name and
+the @code{cdr} is the article number that the article was entered as.
+
+The group should exist before the back end is asked to accept the
+article for that group.
+
+There should be no data returned.
+
+
+@item (nnchoke-request-replace-article ARTICLE GROUP BUFFER)
+
+This function should remove @var{article} (which is a number) from
+@var{group} and insert @var{buffer} there instead.
+
+There should be no data returned.
+
+
+@item (nnchoke-request-delete-group GROUP FORCE &optional SERVER)
+
+This function should delete @var{group}.  If @var{force}, it should
+really delete all the articles in the group, and then delete the group
+itself.  (If there is such a thing as ``the group itself''.)
+
+There should be no data returned.
+
+
+@item (nnchoke-request-rename-group GROUP NEW-NAME &optional SERVER)
+
+This function should rename @var{group} into @var{new-name}.  All
+articles in @var{group} should move to @var{new-name}.
+
+There should be no data returned.
+
+@end table
+
+
+@node Error Messaging
+@subsubsection Error Messaging
+
+@findex nnheader-report
+@findex nnheader-get-report
+The back ends should use the function @code{nnheader-report} to report
+error conditions---they should not raise errors when they aren't able to
+perform a request.  The first argument to this function is the back end
+symbol, and the rest are interpreted as arguments to @code{format} if
+there are multiple of them, or just a string if there is one of them.
+This function must always returns @code{nil}.
+
+@lisp
+(nnheader-report 'nnchoke "You did something totally bogus")
+
+(nnheader-report 'nnchoke "Could not request group %s" group)
+@end lisp
+
+Gnus, in turn, will call @code{nnheader-get-report} when it gets a
+@code{nil} back from a server, and this function returns the most
+recently reported message for the back end in question.  This function
+takes one argument---the server symbol.
+
+Internally, these functions access @var{back-end}@code{-status-string},
+so the @code{nnchoke} back end will have its error message stored in
+@code{nnchoke-status-string}.
+
+
+@node Writing New Back Ends
+@subsubsection Writing New Back Ends
+
+Many back ends are quite similar.  @code{nnml} is just like
+@code{nnspool}, but it allows you to edit the articles on the server.
+@code{nnmh} is just like @code{nnml}, but it doesn't use an active file,
+and it doesn't maintain overview databases.  @code{nndir} is just like
+@code{nnml}, but it has no concept of ``groups'', and it doesn't allow
+editing articles.
+
+It would make sense if it were possible to ``inherit'' functions from
+back ends when writing new back ends.  And, indeed, you can do that if you
+want to.  (You don't have to if you don't want to, of course.)
+
+All the back ends declare their public variables and functions by using a
+package called @code{nnoo}.
+
+To inherit functions from other back ends (and allow other back ends to
+inherit functions from the current back end), you should use the
+following macros:
+
+@table @code
+
+@item nnoo-declare
+This macro declares the first parameter to be a child of the subsequent
+parameters.  For instance:
+
+@lisp
+(nnoo-declare nndir
+  nnml nnmh)
+@end lisp
+
+@code{nndir} has declared here that it intends to inherit functions from
+both @code{nnml} and @code{nnmh}.
+
+@item defvoo
+This macro is equivalent to @code{defvar}, but registers the variable as
+a public server variable.  Most state-oriented variables should be
+declared with @code{defvoo} instead of @code{defvar}.
+
+In addition to the normal @code{defvar} parameters, it takes a list of
+variables in the parent back ends to map the variable to when executing
+a function in those back ends.
+
+@lisp
+(defvoo nndir-directory nil
+  "Where nndir will look for groups."
+  nnml-current-directory nnmh-current-directory)
+@end lisp
+
+This means that @code{nnml-current-directory} will be set to
+@code{nndir-directory} when an @code{nnml} function is called on behalf
+of @code{nndir}.  (The same with @code{nnmh}.)
+
+@item nnoo-define-basics
+This macro defines some common functions that almost all back ends should
+have.
+
+@lisp
+(nnoo-define-basics nndir)
+@end lisp
+
+@item deffoo
+This macro is just like @code{defun} and takes the same parameters.  In
+addition to doing the normal @code{defun} things, it registers the
+function as being public so that other back ends can inherit it.
+
+@item nnoo-map-functions
+This macro allows mapping of functions from the current back end to
+functions from the parent back ends.
+
+@lisp
+(nnoo-map-functions nndir
+  (nnml-retrieve-headers 0 nndir-current-group 0 0)
+  (nnmh-request-article 0 nndir-current-group 0 0))
+@end lisp
+
+This means that when @code{nndir-retrieve-headers} is called, the first,
+third, and fourth parameters will be passed on to
+@code{nnml-retrieve-headers}, while the second parameter is set to the
+value of @code{nndir-current-group}.
+
+@item nnoo-import
+This macro allows importing functions from back ends.  It should be the
+last thing in the source file, since it will only define functions that
+haven't already been defined.
+
+@lisp
+(nnoo-import nndir
+  (nnmh
+   nnmh-request-list
+   nnmh-request-newgroups)
+  (nnml))
+@end lisp
+
+This means that calls to @code{nndir-request-list} should just be passed
+on to @code{nnmh-request-list}, while all public functions from
+@code{nnml} that haven't been defined in @code{nndir} yet should be
+defined now.
+
+@end table
+
+Below is a slightly shortened version of the @code{nndir} back end.
+
+@lisp
+;;; @r{nndir.el --- single directory newsgroup access for Gnus}
+;; @r{Copyright (C) 1995,96 Free Software Foundation, Inc.}
+
+;;; @r{Code:}
+
+(require 'nnheader)
+(require 'nnmh)
+(require 'nnml)
+(require 'nnoo)
+(eval-when-compile (require 'cl))
+
+(nnoo-declare nndir
+  nnml nnmh)
+
+(defvoo nndir-directory nil
+  "Where nndir will look for groups."
+  nnml-current-directory nnmh-current-directory)
+
+(defvoo nndir-nov-is-evil nil
+  "*Non-nil means that nndir will never retrieve NOV headers."
+  nnml-nov-is-evil)
+
+(defvoo nndir-current-group ""
+  nil
+  nnml-current-group nnmh-current-group)
+(defvoo nndir-top-directory nil nil nnml-directory nnmh-directory)
+(defvoo nndir-get-new-mail nil nil nnml-get-new-mail nnmh-get-new-mail)
+
+(defvoo nndir-status-string "" nil nnmh-status-string)
+(defconst nndir-version "nndir 1.0")
+
+;;; @r{Interface functions.}
+
+(nnoo-define-basics nndir)
+
+(deffoo nndir-open-server (server &optional defs)
+  (setq nndir-directory
+        (or (cadr (assq 'nndir-directory defs))
+            server))
+  (unless (assq 'nndir-directory defs)
+    (push `(nndir-directory ,server) defs))
+  (push `(nndir-current-group
+          ,(file-name-nondirectory
+            (directory-file-name nndir-directory)))
+        defs)
+  (push `(nndir-top-directory
+          ,(file-name-directory (directory-file-name nndir-directory)))
+        defs)
+  (nnoo-change-server 'nndir server defs))
+
+(nnoo-map-functions nndir
+  (nnml-retrieve-headers 0 nndir-current-group 0 0)
+  (nnmh-request-article 0 nndir-current-group 0 0)
+  (nnmh-request-group nndir-current-group 0 0)
+  (nnmh-close-group nndir-current-group 0))
+
+(nnoo-import nndir
+  (nnmh
+   nnmh-status-message
+   nnmh-request-list
+   nnmh-request-newgroups))
+
+(provide 'nndir)
+@end lisp
+
+
+@node Hooking New Back Ends Into Gnus
+@subsubsection Hooking New Back Ends Into Gnus
+
+@vindex gnus-valid-select-methods
+@findex gnus-declare-backend
+Having Gnus start using your new back end is rather easy---you just
+declare it with the @code{gnus-declare-backend} functions.  This will
+enter the back end into the @code{gnus-valid-select-methods} variable.
+
+@code{gnus-declare-backend} takes two parameters---the back end name and
+an arbitrary number of @dfn{abilities}.
+
+Here's an example:
+
+@lisp
+(gnus-declare-backend "nnchoke" 'mail 'respool 'address)
+@end lisp
+
+The above line would then go in the @file{nnchoke.el} file.
+
+The abilities can be:
+
+@table @code
+@item mail
+This is a mailish back end---followups should (probably) go via mail.
+@item post
+This is a newsish back end---followups should (probably) go via news.
+@item post-mail
+This back end supports both mail and news.
+@item none
+This is neither a post nor mail back end---it's something completely
+different.
+@item respool
+It supports respooling---or rather, it is able to modify its source
+articles and groups.
+@item address
+The name of the server should be in the virtual server name.  This is
+true for almost all back ends.
+@item prompt-address
+The user should be prompted for an address when doing commands like
+@kbd{B} in the group buffer.  This is true for back ends like
+@code{nntp}, but not @code{nnmbox}, for instance.
+@end table
+
+
+@node Mail-like Back Ends
+@subsubsection Mail-like Back Ends
+
+One of the things that separate the mail back ends from the rest of the
+back ends is the heavy dependence by most of the mail back ends on
+common functions in @file{nnmail.el}.  For instance, here's the
+definition of @code{nnml-request-scan}:
+
+@lisp
+(deffoo nnml-request-scan (&optional group server)
+  (setq nnml-article-file-alist nil)
+  (nnmail-get-new-mail 'nnml 'nnml-save-nov nnml-directory group))
+@end lisp
+
+It simply calls @code{nnmail-get-new-mail} with a few parameters,
+and @code{nnmail} takes care of all the moving and splitting of the
+mail.
+
+This function takes four parameters.
+
+@table @var
+@item method
+This should be a symbol to designate which back end is responsible for
+the call.
+
+@item exit-function
+This function should be called after the splitting has been performed.
+
+@item temp-directory
+Where the temporary files should be stored.
+
+@item group
+This optional argument should be a group name if the splitting is to be
+performed for one group only.
+@end table
+
+@code{nnmail-get-new-mail} will call @var{back-end}@code{-save-mail} to
+save each article.  @var{back-end}@code{-active-number} will be called to
+find the article number assigned to this article.
+
+The function also uses the following variables:
+@var{back-end}@code{-get-new-mail} (to see whether to get new mail for
+this back end); and @var{back-end}@code{-group-alist} and
+@var{back-end}@code{-active-file} to generate the new active file.
+@var{back-end}@code{-group-alist} should be a group-active alist, like
+this:
+
+@example
+(("a-group" (1 . 10))
+ ("some-group" (34 . 39)))
+@end example
+
+
+@node Score File Syntax
+@subsection Score File Syntax
+
+Score files are meant to be easily parseable, but yet extremely
+mallable.  It was decided that something that had the same read syntax
+as an Emacs Lisp list would fit that spec.
+
+Here's a typical score file:
+
+@lisp
+(("summary"
+  ("win95" -10000 nil s)
+  ("Gnus"))
+ ("from"
+  ("Lars" -1000))
+ (mark -100))
+@end lisp
+
+BNF definition of a score file:
+
+@example
+score-file      = "" / "(" *element ")"
+element         = rule / atom
+rule            = string-rule / number-rule / date-rule
+string-rule     = "(" quote string-header quote space *string-match ")"
+number-rule     = "(" quote number-header quote space *number-match ")"
+date-rule       = "(" quote date-header quote space *date-match ")"
+quote           = <ascii 34>
+string-header   = "subject" / "from" / "references" / "message-id" /
+                  "xref" / "body" / "head" / "all" / "followup"
+number-header   = "lines" / "chars"
+date-header     = "date"
+string-match    = "(" quote <string> quote [ "" / [ space score [ "" /
+                  space date [ "" / [ space string-match-t ] ] ] ] ] ")"
+score           = "nil" / <integer>
+date            = "nil" / <natural number>
+string-match-t  = "nil" / "s" / "substring" / "S" / "Substring" /
+                  "r" / "regex" / "R" / "Regex" /
+                  "e" / "exact" / "E" / "Exact" /
+                  "f" / "fuzzy" / "F" / "Fuzzy"
+number-match    = "(" <integer> [ "" / [ space score [ "" /
+                  space date [ "" / [ space number-match-t ] ] ] ] ] ")"
+number-match-t  = "nil" / "=" / "<" / ">" / ">=" / "<="
+date-match      = "(" quote <string> quote [ "" / [ space score [ "" /
+                  space date [ "" / [ space date-match-t ] ] ] ] ")"
+date-match-t    = "nil" / "at" / "before" / "after"
+atom            = "(" [ required-atom / optional-atom ] ")"
+required-atom   = mark / expunge / mark-and-expunge / files /
+                  exclude-files / read-only / touched
+optional-atom   = adapt / local / eval
+mark            = "mark" space nil-or-number
+nil-or-number   = "nil" / <integer>
+expunge         = "expunge" space nil-or-number
+mark-and-expunge = "mark-and-expunge" space nil-or-number
+files           = "files" *[ space <string> ]
+exclude-files   = "exclude-files" *[ space <string> ]
+read-only       = "read-only" [ space "nil" / space "t" ]
+adapt        = "adapt" [ space "ignore" / space "t" / space adapt-rule ]
+adapt-rule      = "(" *[ <string> *[ "(" <string> <integer> ")" ] ")"
+local           = "local" *[ space "(" <string> space <form> ")" ]
+eval            = "eval" space <form>
+space           = *[ " " / <TAB> / <NEWLINE> ]
+@end example
+
+Any unrecognized elements in a score file should be ignored, but not
+discarded.
+
+As you can see, white space is needed, but the type and amount of white
+space is irrelevant.  This means that formatting of the score file is
+left up to the programmer---if it's simpler to just spew it all out on
+one looong line, then that's ok.
+
+The meaning of the various atoms are explained elsewhere in this
+manual (@pxref{Score File Format}).
+
+
+@node Headers
+@subsection Headers
+
+Internally Gnus uses a format for storing article headers that
+corresponds to the @acronym{NOV} format in a mysterious fashion.  One could
+almost suspect that the author looked at the @acronym{NOV} specification and
+just shamelessly @emph{stole} the entire thing, and one would be right.
+
+@dfn{Header} is a severely overloaded term.  ``Header'' is used in
+RFC 1036 to talk about lines in the head of an article (e.g.,
+@code{From}).  It is used by many people as a synonym for
+``head''---``the header and the body''.  (That should be avoided, in my
+opinion.)  And Gnus uses a format internally that it calls ``header'',
+which is what I'm talking about here.  This is a 9-element vector,
+basically, with each header (ouch) having one slot.
+
+These slots are, in order: @code{number}, @code{subject}, @code{from},
+@code{date}, @code{id}, @code{references}, @code{chars}, @code{lines},
+@code{xref}, and @code{extra}.  There are macros for accessing and
+setting these slots---they all have predictable names beginning with
+@code{mail-header-} and @code{mail-header-set-}, respectively.
+
+All these slots contain strings, except the @code{extra} slot, which
+contains an alist of header/value pairs (@pxref{To From Newsgroups}).
+
+
+@node Ranges
+@subsection Ranges
+
+@sc{gnus} introduced a concept that I found so useful that I've started
+using it a lot and have elaborated on it greatly.
+
+The question is simple: If you have a large amount of objects that are
+identified by numbers (say, articles, to take a @emph{wild} example)
+that you want to qualify as being ``included'', a normal sequence isn't
+very useful.  (A 200,000 length sequence is a bit long-winded.)
+
+The solution is as simple as the question: You just collapse the
+sequence.
+
+@example
+(1 2 3 4 5 6 10 11 12)
+@end example
+
+is transformed into
+
+@example
+((1 . 6) (10 . 12))
+@end example
+
+To avoid having those nasty @samp{(13 . 13)} elements to denote a
+lonesome object, a @samp{13} is a valid element:
+
+@example
+((1 . 6) 7 (10 . 12))
+@end example
+
+This means that comparing two ranges to find out whether they are equal
+is slightly tricky:
+
+@example
+((1 . 5) 7 8 (10 . 12))
+@end example
+
+and
+
+@example
+((1 . 5) (7 . 8) (10 . 12))
+@end example
+
+are equal.  In fact, any non-descending list is a range:
+
+@example
+(1 2 3 4 5)
+@end example
+
+is a perfectly valid range, although a pretty long-winded one.  This is
+also valid:
+
+@example
+(1 . 5)
+@end example
+
+and is equal to the previous range.
+
+Here's a BNF definition of ranges.  Of course, one must remember the
+semantic requirement that the numbers are non-descending.  (Any number
+of repetition of the same number is allowed, but apt to disappear in
+range handling.)
+
+@example
+range           = simple-range / normal-range
+simple-range    = "(" number " . " number ")"
+normal-range    = "(" start-contents ")"
+contents        = "" / simple-range *[ " " contents ] /
+                  number *[ " " contents ]
+@end example
+
+Gnus currently uses ranges to keep track of read articles and article
+marks.  I plan on implementing a number of range operators in C if The
+Powers That Be are willing to let me.  (I haven't asked yet, because I
+need to do some more thinking on what operators I need to make life
+totally range-based without ever having to convert back to normal
+sequences.)
+
+
+@node Group Info
+@subsection Group Info
+
+Gnus stores all permanent info on groups in a @dfn{group info} list.
+This list is from three to six elements (or more) long and exhaustively
+describes the group.
+
+Here are two example group infos; one is a very simple group while the
+second is a more complex one:
+
+@example
+("no.group" 5 ((1 . 54324)))
+
+("nnml:my.mail" 3 ((1 . 5) 9 (20 . 55))
+                ((tick (15 . 19)) (replied 3 6 (19 . 3)))
+                (nnml "")
+                ((auto-expire . t) (to-address . "ding@@gnus.org")))
+@end example
+
+The first element is the @dfn{group name}---as Gnus knows the group,
+anyway.  The second element is the @dfn{subscription level}, which
+normally is a small integer.  (It can also be the @dfn{rank}, which is a
+cons cell where the @code{car} is the level and the @code{cdr} is the
+score.)  The third element is a list of ranges of read articles.  The
+fourth element is a list of lists of article marks of various kinds.
+The fifth element is the select method (or virtual server, if you like).
+The sixth element is a list of @dfn{group parameters}, which is what
+this section is about.
+
+Any of the last three elements may be missing if they are not required.
+In fact, the vast majority of groups will normally only have the first
+three elements, which saves quite a lot of cons cells.
+
+Here's a BNF definition of the group info format:
+
+@example
+info          = "(" group space ralevel space read
+                [ "" / [ space marks-list [ "" / [ space method [ "" /
+                space parameters ] ] ] ] ] ")"
+group         = quote <string> quote
+ralevel       = rank / level
+level         = <integer in the range of 1 to inf>
+rank          = "(" level "." score ")"
+score         = <integer in the range of 1 to inf>
+read          = range
+marks-lists   = nil / "(" *marks ")"
+marks         = "(" <string> range ")"
+method        = "(" <string> *elisp-forms ")"
+parameters    = "(" *elisp-forms ")"
+@end example
+
+Actually that @samp{marks} rule is a fib.  A @samp{marks} is a
+@samp{<string>} consed on to a @samp{range}, but that's a bitch to say
+in pseudo-BNF.
+
+If you have a Gnus info and want to access the elements, Gnus offers a
+series of macros for getting/setting these elements.
+
+@table @code
+@item gnus-info-group
+@itemx gnus-info-set-group
+@findex gnus-info-group
+@findex gnus-info-set-group
+Get/set the group name.
+
+@item gnus-info-rank
+@itemx gnus-info-set-rank
+@findex gnus-info-rank
+@findex gnus-info-set-rank
+Get/set the group rank (@pxref{Group Score}).
+
+@item gnus-info-level
+@itemx gnus-info-set-level
+@findex gnus-info-level
+@findex gnus-info-set-level
+Get/set the group level.
+
+@item gnus-info-score
+@itemx gnus-info-set-score
+@findex gnus-info-score
+@findex gnus-info-set-score
+Get/set the group score (@pxref{Group Score}).
+
+@item gnus-info-read
+@itemx gnus-info-set-read
+@findex gnus-info-read
+@findex gnus-info-set-read
+Get/set the ranges of read articles.
+
+@item gnus-info-marks
+@itemx gnus-info-set-marks
+@findex gnus-info-marks
+@findex gnus-info-set-marks
+Get/set the lists of ranges of marked articles.
+
+@item gnus-info-method
+@itemx gnus-info-set-method
+@findex gnus-info-method
+@findex gnus-info-set-method
+Get/set the group select method.
+
+@item gnus-info-params
+@itemx gnus-info-set-params
+@findex gnus-info-params
+@findex gnus-info-set-params
+Get/set the group parameters.
+@end table
+
+All the getter functions take one parameter---the info list.  The setter
+functions take two parameters---the info list and the new value.
+
+The last three elements in the group info aren't mandatory, so it may be
+necessary to extend the group info before setting the element.  If this
+is necessary, you can just pass on a non-@code{nil} third parameter to
+the three final setter functions to have this happen automatically.
+
+
+@node Extended Interactive
+@subsection Extended Interactive
+@cindex interactive
+@findex gnus-interactive
+
+Gnus extends the standard Emacs @code{interactive} specification
+slightly to allow easy use of the symbolic prefix (@pxref{Symbolic
+Prefixes}).  Here's an example of how this is used:
+
+@lisp
+(defun gnus-summary-increase-score (&optional score symp)
+  (interactive (gnus-interactive "P\ny"))
+  ...
+  )
+@end lisp
+
+The best thing to do would have been to implement
+@code{gnus-interactive} as a macro which would have returned an
+@code{interactive} form, but this isn't possible since Emacs checks
+whether a function is interactive or not by simply doing an @code{assq}
+on the lambda form.  So, instead we have @code{gnus-interactive}
+function that takes a string and returns values that are usable to
+@code{interactive}.
+
+This function accepts (almost) all normal @code{interactive} specs, but
+adds a few more.
+
+@table @samp
+@item y
+@vindex gnus-current-prefix-symbol
+The current symbolic prefix---the @code{gnus-current-prefix-symbol}
+variable.
+
+@item Y
+@vindex gnus-current-prefix-symbols
+A list of the current symbolic prefixes---the
+@code{gnus-current-prefix-symbol} variable.
+
+@item A
+The current article number---the @code{gnus-summary-article-number}
+function.
+
+@item H
+The current article header---the @code{gnus-summary-article-header}
+function.
+
+@item g
+The current group name---the @code{gnus-group-group-name}
+function.
+
+@end table
+
+
+@node Emacs/XEmacs Code
+@subsection Emacs/XEmacs Code
+@cindex XEmacs
+@cindex Emacsen
+
+While Gnus runs under Emacs, XEmacs and Mule, I decided that one of the
+platforms must be the primary one.  I chose Emacs.  Not because I don't
+like XEmacs or Mule, but because it comes first alphabetically.
+
+This means that Gnus will byte-compile under Emacs with nary a warning,
+while XEmacs will pump out gigabytes of warnings while byte-compiling.
+As I use byte-compilation warnings to help me root out trivial errors in
+Gnus, that's very useful.
+
+I've also consistently used Emacs function interfaces, but have used
+Gnusey aliases for the functions.  To take an example:  Emacs defines a
+@code{run-at-time} function while XEmacs defines a @code{start-itimer}
+function.  I then define a function called @code{gnus-run-at-time} that
+takes the same parameters as the Emacs @code{run-at-time}.  When running
+Gnus under Emacs, the former function is just an alias for the latter.
+However, when running under XEmacs, the former is an alias for the
+following function:
+
+@lisp
+(defun gnus-xmas-run-at-time (time repeat function &rest args)
+  (start-itimer
+   "gnus-run-at-time"
+   `(lambda ()
+      (,function ,@@args))
+   time repeat))
+@end lisp
+
+This sort of thing has been done for bunches of functions.  Gnus does
+not redefine any native Emacs functions while running under XEmacs---it
+does this @code{defalias} thing with Gnus equivalents instead.  Cleaner
+all over.
+
+In the cases where the XEmacs function interface was obviously cleaner,
+I used it instead.  For example @code{gnus-region-active-p} is an alias
+for @code{region-active-p} in XEmacs, whereas in Emacs it is a function.
+
+Of course, I could have chosen XEmacs as my native platform and done
+mapping functions the other way around.  But I didn't.  The performance
+hit these indirections impose on Gnus under XEmacs should be slight.
+
+
+@node Various File Formats
+@subsection Various File Formats
+
+@menu
+* Active File Format::          Information on articles and groups available.
+* Newsgroups File Format::      Group descriptions.
+@end menu
+
+
+@node Active File Format
+@subsubsection Active File Format
+
+The active file lists all groups available on the server in
+question.  It also lists the highest and lowest current article numbers
+in each group.
+
+Here's an excerpt from a typical active file:
+
+@example
+soc.motss 296030 293865 y
+alt.binaries.pictures.fractals 3922 3913 n
+comp.sources.unix 1605 1593 m
+comp.binaries.ibm.pc 5097 5089 y
+no.general 1000 900 y
+@end example
+
+Here's a pseudo-BNF definition of this file:
+
+@example
+active      = *group-line
+group-line  = group spc high-number spc low-number spc flag <NEWLINE>
+group       = <non-white-space string>
+spc         = " "
+high-number = <non-negative integer>
+low-number  = <positive integer>
+flag        = "y" / "n" / "m" / "j" / "x" / "=" group
+@end example
+
+For a full description of this file, see the manual pages for
+@samp{innd}, in particular @samp{active(5)}.
+
+
+@node Newsgroups File Format
+@subsubsection Newsgroups File Format
+
+The newsgroups file lists groups along with their descriptions.  Not all
+groups on the server have to be listed,  and not all groups in the file
+have to exist on the server.  The file is meant purely as information to
+the user.
+
+The format is quite simple; a group name, a tab, and the description.
+Here's the definition:
+
+@example
+newsgroups    = *line
+line          = group tab description <NEWLINE>
+group         = <non-white-space string>
+tab           = <TAB>
+description   = <string>
+@end example
+
+
+@page
+@node Emacs for Heathens
+@section Emacs for Heathens
+
+Believe it or not, but some people who use Gnus haven't really used
+Emacs much before they embarked on their journey on the Gnus Love Boat.
+If you are one of those unfortunates whom ``@kbd{C-M-a}'', ``kill the
+region'', and ``set @code{gnus-flargblossen} to an alist where the key
+is a regexp that is used for matching on the group name'' are magical
+phrases with little or no meaning, then this appendix is for you.  If
+you are already familiar with Emacs, just ignore this and go fondle your
+cat instead.
+
+@menu
+* Keystrokes::                  Entering text and executing commands.
+* Emacs Lisp::                  The built-in Emacs programming language.
+@end menu
+
+
+@node Keystrokes
+@subsection Keystrokes
+
+@itemize @bullet
+@item
+Q: What is an experienced Emacs user?
+
+@item
+A: A person who wishes that the terminal had pedals.
+@end itemize
+
+Yes, when you use Emacs, you are apt to use the control key, the shift
+key and the meta key a lot.  This is very annoying to some people
+(notably @code{vi}le users), and the rest of us just love the hell out
+of it.  Just give up and submit.  Emacs really does stand for
+``Escape-Meta-Alt-Control-Shift'', and not ``Editing Macros'', as you
+may have heard from other disreputable sources (like the Emacs author).
+
+The shift keys are normally located near your pinky fingers, and are
+normally used to get capital letters and stuff.  You probably use it all
+the time.  The control key is normally marked ``CTRL'' or something like
+that.  The meta key is, funnily enough, never marked as such on any
+keyboard.  The one I'm currently at has a key that's marked ``Alt'',
+which is the meta key on this keyboard.  It's usually located somewhere
+to the left hand side of the keyboard, usually on the bottom row.
+
+Now, us Emacs people don't say ``press the meta-control-m key'',
+because that's just too inconvenient.  We say ``press the @kbd{C-M-m}
+key''.  @kbd{M-} is the prefix that means ``meta'' and ``C-'' is the
+prefix that means ``control''.  So ``press @kbd{C-k}'' means ``press
+down the control key, and hold it down while you press @kbd{k}''.
+``Press @kbd{C-M-k}'' means ``press down and hold down the meta key and
+the control key and then press @kbd{k}''.  Simple, ay?
+
+This is somewhat complicated by the fact that not all keyboards have a
+meta key.  In that case you can use the ``escape'' key.  Then @kbd{M-k}
+means ``press escape, release escape, press @kbd{k}''.  That's much more
+work than if you have a meta key, so if that's the case, I respectfully
+suggest you get a real keyboard with a meta key.  You can't live without
+it.
+
+
+
+@node Emacs Lisp
+@subsection Emacs Lisp
+
+Emacs is the King of Editors because it's really a Lisp interpreter.
+Each and every key you tap runs some Emacs Lisp code snippet, and since
+Emacs Lisp is an interpreted language, that means that you can configure
+any key to run any arbitrary code.  You just, like, do it.
+
+Gnus is written in Emacs Lisp, and is run as a bunch of interpreted
+functions.  (These are byte-compiled for speed, but it's still
+interpreted.)  If you decide that you don't like the way Gnus does
+certain things, it's trivial to have it do something a different way.
+(Well, at least if you know how to write Lisp code.)  However, that's
+beyond the scope of this manual, so we are simply going to talk about
+some common constructs that you normally use in your @file{~/.gnus.el}
+file to customize Gnus.  (You can also use the @file{~/.emacs} file, but
+in order to set things of Gnus up, it is much better to use the
+@file{~/.gnus.el} file, @xref{Startup Files}.)
+
+If you want to set the variable @code{gnus-florgbnize} to four (4), you
+write the following:
+
+@lisp
+(setq gnus-florgbnize 4)
+@end lisp
+
+This function (really ``special form'') @code{setq} is the one that can
+set a variable to some value.  This is really all you need to know.  Now
+you can go and fill your @file{~/.gnus.el} file with lots of these to
+change how Gnus works.
+
+If you have put that thing in your @file{~/.gnus.el} file, it will be
+read and @code{eval}ed (which is Lisp-ese for ``run'') the next time you
+start Gnus.  If you want to change the variable right away, simply say
+@kbd{C-x C-e} after the closing parenthesis.  That will @code{eval} the
+previous ``form'', which is a simple @code{setq} statement here.
+
+Go ahead---just try it, if you're located at your Emacs.  After you
+@kbd{C-x C-e}, you will see @samp{4} appear in the echo area, which
+is the return value of the form you @code{eval}ed.
+
+Some pitfalls:
+
+If the manual says ``set @code{gnus-read-active-file} to @code{some}'',
+that means:
+
+@lisp
+(setq gnus-read-active-file 'some)
+@end lisp
+
+On the other hand, if the manual says ``set @code{gnus-nntp-server} to
+@samp{nntp.ifi.uio.no}'', that means:
+
+@lisp
+(setq gnus-nntp-server "nntp.ifi.uio.no")
+@end lisp
+
+So be careful not to mix up strings (the latter) with symbols (the
+former).  The manual is unambiguous, but it can be confusing.
+
+@page
+@include gnus-faq.texi
+
+@node GNU Free Documentation License
+@chapter GNU Free Documentation License
+@include doclicense.texi
+
+@node Index
+@chapter Index
+@printindex cp
+
+@node Key Index
+@chapter Key Index
+@printindex ky
+
+@summarycontents
+@contents
+@bye
+
+@iftex
+@iflatex
+\end{document}
+@end iflatex
+@end iftex
+
+@c Local Variables:
+@c mode: texinfo
+@c coding: iso-8859-1
+@c End:
+
+@ignore
+   arch-tag: c9fa47e7-78ca-4681-bda9-9fef45d1c819
+@end ignore
diff --git a/doc/misc/gpl.texi b/doc/misc/gpl.texi
new file mode 100644 (file)
index 0000000..5b416d3
--- /dev/null
@@ -0,0 +1,721 @@
+@c The GNU General Public License.
+@center Version 3, 29 June 2007
+
+@c This file is intended to be included within another document,
+@c hence no sectioning command or @node.  
+
+@display
+Copyright @copyright{} 2007 Free Software Foundation, Inc. @url{http://fsf.org/}
+
+Everyone is permitted to copy and distribute verbatim copies of this
+license document, but changing it is not allowed.
+@end display
+
+@heading Preamble
+
+The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom
+to share and change all versions of a program---to make sure it remains
+free software for all its users.  We, the Free Software Foundation,
+use the GNU General Public License for most of our software; it
+applies also to any other work released this way by its authors.  You
+can apply it to your programs, too.
+
+When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you
+have certain responsibilities if you distribute copies of the
+software, or if you modify it: responsibilities to respect the freedom
+of others.
+
+For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too,
+receive or can get the source code.  And you must show them these
+terms so they know their rights.
+
+Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the
+manufacturer can do so.  This is fundamentally incompatible with the
+aim of protecting users' freedom to change the software.  The
+systematic pattern of such abuse occurs in the area of products for
+individuals to use, which is precisely where it is most unacceptable.
+Therefore, we have designed this version of the GPL to prohibit the
+practice for those products.  If such problems arise substantially in
+other domains, we stand ready to extend this provision to those
+domains in future versions of the GPL, as needed to protect the
+freedom of users.
+
+Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish
+to avoid the special danger that patents applied to a free program
+could make it effectively proprietary.  To prevent this, the GPL
+assures that patents cannot be used to render the program non-free.
+
+The precise terms and conditions for copying, distribution and
+modification follow.
+
+@heading TERMS AND CONDITIONS
+
+@enumerate 0
+@item Definitions.
+
+``This License'' refers to version 3 of the GNU General Public License.
+
+``Copyright'' also means copyright-like laws that apply to other kinds
+of works, such as semiconductor masks.
+
+``The Program'' refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as ``you''.  ``Licensees'' and
+``recipients'' may be individuals or organizations.
+
+To ``modify'' a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of
+an exact copy.  The resulting work is called a ``modified version'' of
+the earlier work or a work ``based on'' the earlier work.
+
+A ``covered work'' means either the unmodified Program or a work based
+on the Program.
+
+To ``propagate'' a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+To ``convey'' a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user
+through a computer network, with no transfer of a copy, is not
+conveying.
+
+An interactive user interface displays ``Appropriate Legal Notices'' to
+the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+@item Source Code.
+
+The ``source code'' for a work means the preferred form of the work for
+making modifications to it.  ``Object code'' means any non-source form
+of a work.
+
+A ``Standard Interface'' means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+The ``System Libraries'' of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+``Major Component'', in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+The ``Corresponding Source'' for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+The Corresponding Source need not include anything that users can
+regenerate automatically from other parts of the Corresponding Source.
+
+The Corresponding Source for a work in source code form is that same
+work.
+
+@item Basic Permissions.
+
+All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+You may make, run and propagate covered works that you do not convey,
+without conditions so long as your license otherwise remains in force.
+You may convey covered works to others for the sole purpose of having
+them make modifications exclusively for you, or provide you with
+facilities for running those works, provided that you comply with the
+terms of this License in conveying all material for which you do not
+control copyright.  Those thus making or running the covered works for
+you must do so exclusively on your behalf, under your direction and
+control, on terms that prohibit them from making any copies of your
+copyrighted material outside their relationship with you.
+
+Conveying under any other circumstances is permitted solely under the
+conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+@item Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such
+circumvention is effected by exercising rights under this License with
+respect to the covered work, and you disclaim any intention to limit
+operation or modification of the work as a means of enforcing, against
+the work's users, your or third parties' legal rights to forbid
+circumvention of technological measures.
+
+@item Conveying Verbatim Copies.
+
+You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+@item Conveying Modified Source Versions.
+
+You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these
+conditions:
+
+@enumerate a
+@item 
+The work must carry prominent notices stating that you modified it,
+and giving a relevant date.
+
+@item
+The work must carry prominent notices stating that it is released
+under this License and any conditions added under section 7.  This
+requirement modifies the requirement in section 4 to ``keep intact all
+notices''.
+
+@item
+You must license the entire work, as a whole, under this License to
+anyone who comes into possession of a copy.  This License will
+therefore apply, along with any applicable section 7 additional terms,
+to the whole of the work, and all its parts, regardless of how they
+are packaged.  This License gives no permission to license the work in
+any other way, but it does not invalidate such permission if you have
+separately received it.
+
+@item
+If the work has interactive user interfaces, each must display
+Appropriate Legal Notices; however, if the Program has interactive
+interfaces that do not display Appropriate Legal Notices, your work
+need not make them do so.
+@end enumerate
+
+A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+``aggregate'' if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+@item  Conveying Non-Source Forms.
+
+You may convey a covered work in object code form under the terms of
+sections 4 and 5, provided that you also convey the machine-readable
+Corresponding Source under the terms of this License, in one of these
+ways:
+
+@enumerate a
+@item
+Convey the object code in, or embodied in, a physical product
+(including a physical distribution medium), accompanied by the
+Corresponding Source fixed on a durable physical medium customarily
+used for software interchange.
+
+@item
+Convey the object code in, or embodied in, a physical product
+(including a physical distribution medium), accompanied by a written
+offer, valid for at least three years and valid for as long as you
+offer spare parts or customer support for that product model, to give
+anyone who possesses the object code either (1) a copy of the
+Corresponding Source for all the software in the product that is
+covered by this License, on a durable physical medium customarily used
+for software interchange, for a price no more than your reasonable
+cost of physically performing this conveying of source, or (2) access
+to copy the Corresponding Source from a network server at no charge.
+
+@item
+Convey individual copies of the object code with a copy of the written
+offer to provide the Corresponding Source.  This alternative is
+allowed only occasionally and noncommercially, and only if you
+received the object code with such an offer, in accord with subsection
+6b.
+
+@item
+Convey the object code by offering access from a designated place
+(gratis or for a charge), and offer equivalent access to the
+Corresponding Source in the same way through the same place at no
+further charge.  You need not require recipients to copy the
+Corresponding Source along with the object code.  If the place to copy
+the object code is a network server, the Corresponding Source may be
+on a different server (operated by you or a third party) that supports
+equivalent copying facilities, provided you maintain clear directions
+next to the object code saying where to find the Corresponding Source.
+Regardless of what server hosts the Corresponding Source, you remain
+obligated to ensure that it is available for as long as needed to
+satisfy these requirements.
+
+@item
+Convey the object code using peer-to-peer transmission, provided you
+inform other peers where the object code and Corresponding Source of
+the work are being offered to the general public at no charge under
+subsection 6d.
+
+@end enumerate
+
+A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+A ``User Product'' is either (1) a ``consumer product'', which means any
+tangible personal property which is normally used for personal,
+family, or household purposes, or (2) anything designed or sold for
+incorporation into a dwelling.  In determining whether a product is a
+consumer product, doubtful cases shall be resolved in favor of
+coverage.  For a particular product received by a particular user,
+``normally used'' refers to a typical or common use of that class of
+product, regardless of the status of the particular user or of the way
+in which the particular user actually uses, or expects or is expected
+to use, the product.  A product is a consumer product regardless of
+whether the product has substantial commercial, industrial or
+non-consumer uses, unless such uses represent the only significant
+mode of use of the product.
+
+``Installation Information'' for a User Product means any methods,
+procedures, authorization keys, or other information required to
+install and execute modified versions of a covered work in that User
+Product from a modified version of its Corresponding Source.  The
+information must suffice to ensure that the continued functioning of
+the modified object code is in no case prevented or interfered with
+solely because modification has been made.
+
+If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or
+updates for a work that has been modified or installed by the
+recipient, or for the User Product in which it has been modified or
+installed.  Access to a network may be denied when the modification
+itself materially and adversely affects the operation of the network
+or violates the rules and protocols for communication across the
+network.
+
+Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+@item Additional Terms.
+
+``Additional permissions'' are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders
+of that material) supplement the terms of this License with terms:
+
+@enumerate a
+@item
+Disclaiming warranty or limiting liability differently from the terms
+of sections 15 and 16 of this License; or
+
+@item
+Requiring preservation of specified reasonable legal notices or author
+attributions in that material or in the Appropriate Legal Notices
+displayed by works containing it; or
+
+@item
+Prohibiting misrepresentation of the origin of that material, or
+requiring that modified versions of such material be marked in
+reasonable ways as different from the original version; or
+
+@item
+Limiting the use for publicity purposes of names of licensors or
+authors of the material; or
+
+@item
+Declining to grant rights under trademark law for use of some trade
+names, trademarks, or service marks; or
+
+@item
+Requiring indemnification of licensors and authors of that material by
+anyone who conveys the material (or modified versions of it) with
+contractual assumptions of liability to the recipient, for any
+liability that these contractual assumptions directly impose on those
+licensors and authors.
+@end enumerate
+
+All other non-permissive additional terms are considered ``further
+restrictions'' within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions; the
+above requirements apply either way.
+
+@item Termination.
+
+You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+However, if you cease all violation of this License, then your license
+from a particular copyright holder is reinstated (a) provisionally,
+unless and until the copyright holder explicitly and finally
+terminates your license, and (b) permanently, if the copyright holder
+fails to notify you of the violation by some reasonable means prior to
+60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+@item Acceptance Not Required for Having Copies.
+
+You are not required to accept this License in order to receive or run
+a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+@item Automatic Licensing of Downstream Recipients.
+
+Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+An ``entity transaction'' is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+@item Patents.
+
+A ``contributor'' is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's ``contributor version''.
+
+A contributor's ``essential patent claims'' are all patent claims owned
+or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, ``control'' includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+In the following three paragraphs, a ``patent license'' is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To ``grant'' such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  ``Knowingly relying'' means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+A patent license is ``discriminatory'' if it does not include within the
+scope of its coverage, prohibits the exercise of, or is conditioned on
+the non-exercise of one or more of the rights that are specifically
+granted under this License.  You may not convey a covered work if you
+are a party to an arrangement with a third party that is in the
+business of distributing software, under which you make payment to the
+third party based on the extent of your activity of conveying the
+work, and under which the third party grants, to any of the parties
+who would receive the covered work from you, a discriminatory patent
+license (a) in connection with copies of the covered work conveyed by
+you (or copies made from those copies), or (b) primarily for and in
+connection with specific products or compilations that contain the
+covered work, unless you entered into that arrangement, or that patent
+license was granted, prior to 28 March 2007.
+
+Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+@item No Surrender of Others' Freedom.
+
+If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey
+a covered work so as to satisfy simultaneously your obligations under
+this License and any other pertinent obligations, then as a
+consequence you may not convey it at all.  For example, if you agree
+to terms that obligate you to collect a royalty for further conveying
+from those to whom you convey the Program, the only way you could
+satisfy both those terms and this License would be to refrain entirely
+from conveying the Program.
+
+@item Use with the GNU Affero General Public License.
+
+Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+@item Revised Versions of this License.
+
+The Free Software Foundation may publish revised and/or new versions
+of the GNU General Public License from time to time.  Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies that a certain numbered version of the GNU General Public
+License ``or any later version'' applies to it, you have the option of
+following the terms and conditions either of that numbered version or
+of any later version published by the Free Software Foundation.  If
+the Program does not specify a version number of the GNU General
+Public License, you may choose any version ever published by the Free
+Software Foundation.
+
+If the Program specifies that a proxy can decide which future versions
+of the GNU General Public License can be used, that proxy's public
+statement of acceptance of a version permanently authorizes you to
+choose that version for the Program.
+
+Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+@item Disclaimer of Warranty.
+
+THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM ``AS IS'' WITHOUT
+WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND
+PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE PROGRAM PROVE
+DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
+CORRECTION.
+
+@item Limitation of Liability.
+
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR
+CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES
+ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT
+NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR
+LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM
+TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER
+PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+@item Interpretation of Sections 15 and 16.
+
+If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+@end enumerate
+
+@heading END OF TERMS AND CONDITIONS
+
+@heading How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these
+terms.
+
+To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the ``copyright'' line and a pointer to where the full notice is found.
+
+@smallexample
+@var{one line to give the program's name and a brief idea of what it does.}  
+Copyright (C) @var{year} @var{name of author}
+
+This program 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.
+
+This program 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 this program.  If not, see @url{http://www.gnu.org/licenses/}.
+@end smallexample
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+@smallexample
+@var{program} Copyright (C) @var{year} @var{name of author} 
+This program comes with ABSOLUTELY NO WARRANTY; for details type @samp{show w}.
+This is free software, and you are welcome to redistribute it
+under certain conditions; type @samp{show c} for details.
+@end smallexample
+
+The hypothetical commands @samp{show w} and @samp{show c} should show
+the appropriate parts of the General Public License.  Of course, your
+program's commands might be different; for a GUI interface, you would
+use an ``about box''.
+
+You should also get your employer (if you work as a programmer) or school,
+if any, to sign a ``copyright disclaimer'' for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+@url{http://www.gnu.org/licenses/}.
+
+The GNU General Public License does not permit incorporating your
+program into proprietary programs.  If your program is a subroutine
+library, you may consider it more useful to permit linking proprietary
+applications with the library.  If this is what you want to do, use
+the GNU Lesser General Public License instead of this License.  But
+first, please read @url{http://www.gnu.org/philosophy/why-not-lgpl.html}.
+
+@ignore
+   arch-tag: 0c4a2556-f87e-464f-9b1d-efd920fcaf67
+@end ignore
similarity index 99%
rename from man/idlwave.texi
rename to doc/misc/idlwave.texi
index 4f216ac87b880771ead700fa3516364ecd5f2521..36cc3e9087d72dfb4864949f39c7b617c9b4af21 100644 (file)
@@ -1,6 +1,6 @@
 \input texinfo  @c -*-texinfo-*-
 @c %**start of header
-@setfilename ../info/idlwave
+@setfilename ../../info/idlwave
 @settitle IDLWAVE User Manual
 @dircategory Emacs
 @direntry
similarity index 99%
rename from man/info.texi
rename to doc/misc/info.texi
index 285ef09554ea63cc51d7aa12cf2c231aa8586621..333e331b3540d09221c99f30ad19727f420e90c5 100644 (file)
@@ -869,6 +869,13 @@ which the header says is the @samp{Previous} node (from this node, the
 to revisit nodes in the history list in the forward direction, so that
 @kbd{r} will return you to the node you came from by typing @kbd{l}.
 
+@kindex L @r{(Info mode)}
+@findex Info-history
+@cindex history list of visited nodes
+  The @kbd{L} command (@code{Info-history} in Emacs) creates a virtual
+node that contains a list of all nodes you visited.  You can select
+a previously visited node from this menu to revisit it.
+
 @kindex d @r{(Info mode)}
 @findex Info-directory
 @cindex go to Directory node
similarity index 78%
rename from man/makefile.w32-in
rename to doc/misc/makefile.w32-in
index 7e3723c1949ccec2fab093b0b32e0672eabd1d5b..60c1efcde44af02bbb8e6ca40676c44677dc573e 100644 (file)
@@ -1,4 +1,4 @@
-#### -*- Makefile -*- for the Emacs Manual and other documentation.
+#### -*- Makefile -*- for documentation other than the Emacs manual.
 
 # Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
 
 # set by the configure script's `--srcdir' option.
 srcdir=.
 
-infodir = $(srcdir)/../info
+infodir = $(srcdir)/../../info
 
 # The makeinfo program is part of the Texinfo distribution.
 MAKEINFO = makeinfo --force
-MULTI_INSTALL_INFO = $(srcdir)\..\nt\multi-install-info.bat
-INFO_TARGETS = $(infodir)/emacs $(infodir)/ccmode \
+MULTI_INSTALL_INFO = $(srcdir)\..\..\nt\multi-install-info.bat
+INFO_TARGETS = $(infodir)/ccmode \
                $(infodir)/cl $(infodir)/dired-x $(infodir)/ediff \
                $(infodir)/forms $(infodir)/gnus $(infodir)/message \
                $(infodir)/sieve $(infodir)/pgg $(infodir)/emacs-mime \
@@ -43,14 +43,14 @@ INFO_TARGETS = $(infodir)/emacs $(infodir)/ccmode \
                $(infodir)/url $(infodir)/speedbar $(infodir)/tramp \
                $(infodir)/ses $(infodir)/smtpmail $(infodir)/flymake \
                $(infodir)/newsticker $(infodir)/rcirc $(infodir)/erc
-DVI_TARGETS =  emacs.dvi calc.dvi cc-mode.dvi cl.dvi dired-x.dvi \
+DVI_TARGETS = calc.dvi cc-mode.dvi cl.dvi dired-x.dvi \
                 ediff.dvi forms.dvi gnus.dvi message.dvi emacs-mime.dvi \
                  gnus.dvi message.dvi sieve.dvi pgg.dvi mh-e.dvi \
                 reftex.dvi sc.dvi vip.dvi viper.dvi widget.dvi faq.dvi \
                 ada-mode.dvi autotype.dvi idlwave.dvi eudc.dvi ebrowse.dvi \
                 pcl-cvs.dvi woman.dvi eshell.dvi org.dvi url.dvi \
                 speedbar.dvi tramp.dvi ses.dvi smtpmail.dvi flymake.dvi \
-                 newsticker.dvi emacs-xtra.dvi rcirc.dvi erc.dvi
+                 newsticker.dvi rcirc.dvi erc.dvi
 INFOSOURCES = info.texi
 
 # The following rule does not work with all versions of `make'.
@@ -59,66 +59,9 @@ INFOSOURCES = info.texi
        texi2dvi $<
 
 TEXI2DVI = texi2dvi
-ENVADD = $(srcdir)\..\nt\envadd.bat "TEXINPUTS=$(srcdir);$(TEXINPUTS)" \
+ENVADD = $(srcdir)\..\..\nt\envadd.bat "TEXINPUTS=$(srcdir);$(TEXINPUTS)" \
         "MAKEINFO=$(MAKEINFO) -I$(srcdir)" /C
 
-EMACS_XTRA=\
-       $(srcdir)/arevert-xtra.texi \
-       $(srcdir)/cal-xtra.texi \
-       $(srcdir)/dired-xtra.texi \
-       $(srcdir)/picture-xtra.texi \
-       $(srcdir)/emerge-xtra.texi \
-       $(srcdir)/vc-xtra.texi \
-       $(srcdir)/vc1-xtra.texi \
-       $(srcdir)/vc2-xtra.texi \
-       $(srcdir)/fortran-xtra.texi \
-       $(srcdir)/msdog-xtra.texi
-
-EMACSSOURCES= \
-       $(srcdir)/emacs.texi \
-       $(srcdir)/doclicense.texi \
-       $(srcdir)/screen.texi \
-       $(srcdir)/commands.texi \
-       $(srcdir)/entering.texi \
-       $(srcdir)/basic.texi \
-       $(srcdir)/mini.texi \
-       $(srcdir)/m-x.texi \
-       $(srcdir)/help.texi \
-       $(srcdir)/mark.texi \
-       $(srcdir)/killing.texi \
-       $(srcdir)/regs.texi \
-       $(srcdir)/display.texi \
-       $(srcdir)/search.texi \
-       $(srcdir)/fixit.texi \
-       $(srcdir)/files.texi \
-       $(srcdir)/buffers.texi \
-       $(srcdir)/windows.texi \
-       $(srcdir)/frames.texi \
-       $(srcdir)/mule.texi \
-       $(srcdir)/major.texi \
-       $(srcdir)/indent.texi \
-       $(srcdir)/text.texi \
-       $(srcdir)/programs.texi \
-       $(srcdir)/building.texi \
-       $(srcdir)/maintaining.texi \
-       $(srcdir)/abbrevs.texi \
-       $(srcdir)/sending.texi \
-       $(srcdir)/rmail.texi \
-       $(srcdir)/dired.texi \
-       $(srcdir)/calendar.texi \
-       $(srcdir)/misc.texi \
-       $(srcdir)/custom.texi \
-       $(srcdir)/trouble.texi \
-       $(srcdir)/cmdargs.texi \
-       $(srcdir)/xresources.texi \
-       $(srcdir)/anti.texi \
-       $(srcdir)/macos.texi \
-       $(srcdir)/msdog.texi \
-       $(srcdir)/gnu.texi \
-       $(srcdir)/glossary.texi \
-       $(srcdir)/ack.texi \
-       $(srcdir)/kmacro.texi \
-       $(EMACS_XTRA)
 
 info: $(INFO_TARGETS)
 
@@ -144,18 +87,6 @@ $(infodir)/info: $(INFOSOURCES)
 info.dvi: $(INFOSOURCES)
        $(ENVADD) $(TEXI2DVI) $(srcdir)/info.texi
 
-$(infodir)/emacs: $(EMACSSOURCES)
-       $(MAKEINFO) emacs.texi
-
-emacs.dvi: $(EMACSSOURCES)
-       $(ENVADD) $(TEXI2DVI) $(srcdir)/emacs.texi
-
-# This target is here so you could easily get the list of the *.texi
-# files which belong to the Emacs manual (as opposed to the separate
-# manuals for CL, CC Mode, Ebrowse, etc.).  With this target, you can
-# say things like "grep foo `make emacsman`".
-emacsman:
-       @echo $(EMACSSOURCES)
 
 $(infodir)/ccmode: cc-mode.texi
        $(MAKEINFO) cc-mode.texi
@@ -266,9 +197,6 @@ $(infodir)/efaq: faq.texi
 faq.dvi: faq.texi
        $(ENVADD) $(TEXI2DVI) $(srcdir)/faq.texi
 
-../etc/GNU: gnu1.texi gnu.texi
-       $(MAKEINFO) --no-headers -o ../etc/GNU gnu1.texi
-
 $(infodir)/autotype: autotype.texi
        $(MAKEINFO) autotype.texi
 autotype.dvi: autotype.texi
@@ -322,9 +250,6 @@ $(infodir)/smtpmail: smtpmail.texi
 smtpmail.dvi: smtpmail.texi
        $(ENVADD) $(TEXI2DVI) $(srcdir)/smtpmail.texi
 
-emacs-xtra.dvi: emacs-xtra.texi $(EMACS_XTRA)
-       $(ENVADD) $(TEXI2DVI) $(srcdir)/emacs-xtra.texi
-
 $(infodir)/org: org.texi
        $(MAKEINFO) org.texi
 org.dvi: org.texi
@@ -355,7 +280,7 @@ mostlyclean:
 
 clean: mostlyclean
        - $(DEL) *.dvi
-       - $(DEL) $(infodir)/emacs* $(infodir)/ccmode* \
+       - $(DEL) $(infodir)/ccmode* \
                 $(infodir)/cl* $(infodir)/dired-x* \
                 $(infodir)/ediff* $(infodir)/forms* \
                 $(infodir)/gnus* $(infodir)/info* \
similarity index 99%
rename from man/message.texi
rename to doc/misc/message.texi
index 2bca4b046e5875f0353be53ff3091979999085e7..828af92fc0c2db02490b1f98ff6bda7827fa046a 100644 (file)
@@ -1,6 +1,6 @@
 \input texinfo                  @c -*-texinfo-*-
 
-@setfilename ../info/message
+@setfilename ../../info/message
 @settitle Message Manual
 @synindex fn cp
 @synindex vr cp
similarity index 99%
rename from man/mh-e.texi
rename to doc/misc/mh-e.texi
index a6341e80465105f5100a467c79a55d265551c2b0..dd1808a5a833d3a99a4408f39d572724b6613a52 100644 (file)
@@ -3,17 +3,17 @@
 @c Note: This document requires makeinfo version 4.6 or greater to build.
 @c
 @c %**start of header
-@setfilename ../info/mh-e
+@setfilename ../../info/mh-e
 @settitle The MH-E Manual
 @c %**end of header
 
 @c Version of the software and manual.
-@set VERSION 8.0.3
+@set VERSION 8.0.3+CVS
 @c Edition of the manual. It is either empty for the first edition or
 @c has the form ", nth Edition" (without the quotes).
 @set EDITION
-@set UPDATED 2006-11-12
-@set UPDATE-MONTH November, 2006
+@set UPDATED 2007-09-25
+@set UPDATE-MONTH September, 2007
 
 @c Other variables.
 @set MH-BOOK-HOME http://rand-mh.sourceforge.net/book/mh
@@ -2556,16 +2556,14 @@ includes the results of a quick poll of MH-E users from 2005-12-23.
 @cindex browser, @samp{w3m}
 @cindex @samp{w3m}
 @kindex Mouse-2
-@kindex S-Mouse-2
 @item @samp{w3m} 7
 The @samp{w3m} browser requires an external program. It's quick,
 produces pretty nice output, and best of all, it's the only browser
 that highlights links. These can be clicked with @kbd{Mouse-2} to view
-the content of the link in @samp{w3m} or with @kbd{S-Mouse-2} to view
-the content of the link in an external browser. The @samp{w3m} browser
-handles tables well and actually respects the table's width parameter
-(which can cause text to wrap if the author didn't anticipate that the
-page would be viewed in Emacs).
+the content of the link in @samp{w3m}. The @samp{w3m} browser handles
+tables well and actually respects the table's width parameter (which
+can cause text to wrap if the author didn't anticipate that the page
+would be viewed in Emacs).
 @c -------------------------
 @cindex browser, @samp{w3m-standalone}
 @cindex @samp{w3m-standalone}
@@ -2643,6 +2641,20 @@ documentation for the Gnus command @kbd{W h} (see section
 @cite{The Gnus Manual}).
 @end ifnotinfo
 
+@cindex @file{.emacs}
+@cindex files, @file{.emacs}
+@findex browse-url-at-mouse
+@kindex S-Mouse-2
+
+A useful key binding that you can add to to @file{~/.emacs} is the
+following which displays an HTML link or textual URL in an external
+browser when clicked with @kbd{S-mouse-2}. This binding works in any
+buffer, including HTML buffers.
+
+@smalllisp
+(global-set-key [S-mouse-2] 'browse-url-at-mouse)
+@end smalllisp
+
 @node Digests, Reading PGP, HTML, Reading Mail
 @section Digests
 
similarity index 99%
rename from man/newsticker.texi
rename to doc/misc/newsticker.texi
index 48d7f9926676e568c05b36067499834641e4322c..31bba4aa36aa093416d64b4cb3b7ef38b5e7161a 100644 (file)
@@ -1,6 +1,6 @@
 \input texinfo   @c -*-texinfo-*-
 @comment %**start of header
-@setfilename ../info/newsticker
+@setfilename ../../info/newsticker
 @set VERSION 1.9
 @set UPDATED November 2005
 @settitle Newsticker @value{VERSION}
similarity index 99%
rename from man/org.texi
rename to doc/misc/org.texi
index d709de8d5a0ffc6f2610248b2c05e6ee87854597..cee6bf24cf018a1411674095f64c15b64d3a4855 100644 (file)
@@ -1,9 +1,9 @@
 \input texinfo
 @c %**start of header
-@setfilename ../info/org
+@setfilename ../../info/org
 @settitle Org Mode Manual
 
-@set VERSION 5.05
+@set VERSION 5.07
 @set DATE August 2007
 
 @dircategory Emacs
@@ -498,8 +498,8 @@ define @emph{global} keys for the commands @command{org-store-link} and
 @lisp
 ;; The following lines are always needed.  Choose your own keys.
 (add-to-list 'auto-mode-alist '("\\.org\\'" . org-mode))
-(define-key global-map "\C-cl" 'org-store-link)
-(define-key global-map "\C-ca" 'org-agenda)
+(global-set-key "\C-cl" 'org-store-link)
+(global-set-key "\C-ca" 'org-agenda)
 @end lisp
 
 Furthermore, you must activate @code{font-lock-mode} in org-mode
@@ -848,9 +848,9 @@ Sort same-level entries.  When there is an active region, all entries in
 the region will be sorted.  Otherwise the children of the current
 headline are sorted.  The command prompts for the sorting method, which
 can be alphabetically, numerically, by time (using the first time stamp
-in each entry), and each of these in reverse order.  With a @kbd{C-u}
-prefix, sorting will be case-sensitive.  With two @kbd{C-u C-u}
-prefixes, duplicate entries will also be removed.
+in each entry), by priority, and each of these in reverse order.  With a
+@kbd{C-u} prefix, sorting will be case-sensitive.  With two @kbd{C-u
+C-u} prefixes, duplicate entries will also be removed.
 @end table
 
 @cindex region, active
@@ -938,7 +938,9 @@ file, the archive file.
 @kindex C-c C-x C-s
 @item C-c C-x C-s
 Archive the subtree starting at the cursor position to the location
-given by @code{org-archive-location}.
+given by @code{org-archive-location}.  Context information that could be
+lost like the file name, the category, inherited tags, and the todo
+state will be store as properties in the entry.
 @kindex C-u C-c C-x C-s
 @item C-u C-c C-x C-s
 Check if any direct children of the current headline could be moved to
@@ -994,9 +996,9 @@ match is in the body of an entry, headline and body are made visible.
 In order to provide minimal context, also the full hierarchy of
 headlines above the match is shown, as well as the headline following
 the match.  Each match is also highlighted; the highlights disappear
-when the buffer is changed an editing command, or by pressing @kbd{C-c
-C-c}.  When called with a @kbd{C-u} prefix argument, previous highlights
-are kept, so several calls to this command can be stacked.
+when the buffer is changed by an editing command, or by pressing
+@kbd{C-c C-c}.  When called with a @kbd{C-u} prefix argument, previous
+highlights are kept, so several calls to this command can be stacked.
 @end table
 @noindent
 For frequently used sparse trees of specific search strings, you can
@@ -1969,7 +1971,9 @@ Recompute the entire table, line by line.  Any lines before the first
 hline are left alone, assuming that these are part of the table header.
 @c
 @kindex C-u C-u C-c *
+@kindex C-u C-u C-c C-c
 @item C-u C-u C-c *
+@itemx C-u C-u C-c C-c
 Iterate the table by recomputing it until no further changes occur.
 This may be necessary if some computed fields use the value of other
 fields that are computed @i{later} in the calculation sequence.
@@ -2186,15 +2190,15 @@ earlier.
 @cindex targets, radio
 @cindex links, radio targets
 
-You can configure Org-mode to link any occurrences of certain target
-names in normal text.  So without explicitly creating a link, the text
-connects to the target radioing its position.  Radio targets are
-enclosed by triple angular brackets.  For example, a target
-@samp{<<<My Target>>>} causes each occurrence of @samp{my target} in
-normal text to become activated as a link.  The Org-mode file is
-scanned automatically for radio targets only when the file is first
-loaded into Emacs.  To update the target list during editing, press
-@kbd{C-c C-c} with the cursor on or at a target.
+Org-mode can automatically turn any occurrences of certain target names
+in normal text into a link.  So without explicitly creating a link, the
+text connects to the target radioing its position.  Radio targets are
+enclosed by triple angular brackets.  For example, a target @samp{<<<My
+Target>>>} causes each occurrence of @samp{my target} in normal text to
+become activated as a link.  The Org-mode file is scanned automatically
+for radio targets only when the file is first loaded into Emacs.  To
+update the target list during editing, press @kbd{C-c C-c} with the
+cursor on or at a target.
 
 @node External links, Handling links, Internal links, Hyperlinks
 @section External links
@@ -2406,8 +2410,8 @@ global commands, like this (please select suitable global keys
 yourself):
 
 @lisp
-(define-key global-map 'org-insert-link-global "\\C-c L")
-(define-key global-map 'org-open-at-point-global "\\C-c o")
+(global-set-key "\C-c L" 'org-insert-link-global)
+(global-set-key "\C-c o" 'org-open-at-point-global)
 @end lisp
 
 @node Link abbreviations, Search options, Using links outside Org-mode, Hyperlinks
@@ -2757,7 +2761,17 @@ agenda buffers with the @kbd{t} command key (@pxref{Agenda commands}).
 @item S-@key{right}
 @itemx S-@key{left}
 Select the following/preceding TODO state, similar to cycling.  Mostly
-useful if more than two TODO states are possible (@pxref{TODO extensions}).
+useful if more than two TODO states are possible (@pxref{TODO
+extensions}).
+@kindex C-c C-c
+@item C-c C-c
+Use the fast tag interface to quickly and directly select a specific
+TODO state.  For this you need to assign keys to TODO state, like this:
+@example
+#+SEQ_TODO: TODO(t) STARTED(s) WAITING(w) | DONE(d)
+@end example
+@noindent See @ref{Per file keywords} and @ref{Setting tags} for more
+information.
 @kindex C-c C-v
 @cindex sparse tree, for TODO
 @item C-c C-v
@@ -2775,9 +2789,6 @@ agenda files (@pxref{Agenda views}) into a single buffer.  The buffer is in
 @code{agenda-mode}, so there are commands to examine and manipulate
 the TODO entries directly from that buffer (@pxref{Agenda commands}).
 @xref{Global TODO list}, for more information.
-@c @item @code{org-agenda-include-all-todo}
-@c If you would like to have all your TODO items listed as part of your
-@c agenda, customize the variable @code{org-agenda-include-all-todo}.
 @kindex S-M-@key{RET}
 @item S-M-@key{RET}
 Insert a new TODO entry below the current one.
@@ -2930,12 +2941,11 @@ or
 A setup for using several sets in parallel would be:
 
 @example
-#+SEQ_TODO: "TODO" "|" "DONE"
-#+SEQ_TODO: "REPORT" "BUG" "KNOWNCAUSE" "|" "FIXED"
-#+SEQ_TODO: "|" "CANCELED"
+#+SEQ_TODO: TODO | DONE
+#+SEQ_TODO: REPORT BUG KNOWNCAUSE | FIXED
+#+SEQ_TODO: | CANCELED
 @end example
 
-
 @cindex completion, of option keywords
 @kindex M-@key{TAB}
 @noindent To make sure you are using the correct keyword, type
@@ -5650,10 +5660,12 @@ file.
 @table @kbd
 @kindex C-c C-e a
 @item C-c C-e a
-Export as ASCII file.  If there is an active region, only the region
-will be exported.  For an org file @file{myfile.org}, the ASCII file
+Export as ASCII file.  For an org file @file{myfile.org}, the ASCII file
 will be @file{myfile.txt}.  The file will be overwritten without
-warning.
+warning.  If there is an active region, only the region will be
+exported. If the selected region is a single tree, the tree head will
+become the document title.  If the tree head entry has or inherits an
+EXPORT_FILE_NAME property, that name will be used for the export.
 @kindex C-c C-e v a
 @item C-c C-e v a
 Export only the visible part of the document.
@@ -5703,10 +5715,16 @@ language, but with additional support for tables.
 @table @kbd
 @kindex C-c C-e h
 @item C-c C-e h
-Export as HTML file @file{myfile.html}.
+Export as HTML file @file{myfile.html}.  For an org file
+@file{myfile.org}, the ASCII file will be @file{myfile.html}.  The file
+will be overwritten without warning.  If there is an active region, only
+the region will be exported. If the selected region is a single tree,
+the tree head will become the document title.  If the tree head entry
+has or inherits an EXPORT_FILE_NAME property, that name will be used for
+the export.
 @kindex C-c C-e b
 @item C-c C-e b
-Export as HTML file and open it with a browser.
+Export as HTML file and immediately open it with a browser.
 @kindex C-c C-e H
 @item C-c C-e H
 Export to a temporary buffer, do not create a file.
similarity index 99%
rename from man/pcl-cvs.texi
rename to doc/misc/pcl-cvs.texi
index 93bd54eb456330a737c8ac00ff3981990a89f089..5878b65cd25591950c1ee31d0975c17210a484aa 100644 (file)
@@ -1,6 +1,6 @@
 \input texinfo  @c -*-texinfo-*-
 @c %**start of header
-@setfilename ../info/pcl-cvs
+@setfilename ../../info/pcl-cvs
 @settitle PCL-CVS --- Emacs Front-End to CVS
 @syncodeindex vr fn
 @c %**end of header
similarity index 99%
rename from man/pgg.texi
rename to doc/misc/pgg.texi
index 6a175db4cb93308dd3c48ad8325ffaf588980a22..ca29e2184e546c6e898cb777454717f4bf1970ea 100644 (file)
@@ -1,6 +1,6 @@
 \input texinfo                  @c -*-texinfo-*-
 
-@setfilename ../info/pgg
+@setfilename ../../info/pgg
 
 @set VERSION 0.1
 
similarity index 99%
rename from man/rcirc.texi
rename to doc/misc/rcirc.texi
index 6d5319cef4ed0d64c1de0a99d2d90bff3d441a0a..f6d807f971f044f2f9679300f65c51861084dff9 100644 (file)
@@ -1,6 +1,6 @@
 \input texinfo
 @c %**start of header
-@setfilename ../info/rcirc
+@setfilename ../../info/rcirc
 @settitle rcirc Manual
 @c %**end of header
 
similarity index 99%
rename from man/reftex.texi
rename to doc/misc/reftex.texi
index a2c0a9689b2bca3d332180de1b9ebe0871096fcd..a599081a716b620a40573a199d407b53c42a550b 100644 (file)
@@ -1,6 +1,6 @@
 \input texinfo  @c -*-texinfo-*-
 @c %**start of header
-@setfilename ../info/reftex
+@setfilename ../../info/reftex
 @settitle RefTeX User Manual
 @synindex ky cp
 @syncodeindex vr cp
diff --git a/doc/misc/sc.texi b/doc/misc/sc.texi
new file mode 100644 (file)
index 0000000..55beaa5
--- /dev/null
@@ -0,0 +1,2533 @@
+\input texinfo  @comment -*-texinfo-*-
+@comment 3.48
+@comment %**start of header (This is for running Texinfo on a region.)
+@setfilename ../../info/sc
+@settitle Supercite Version 3.1 User's Manual
+@iftex
+@finalout
+@end iftex
+
+@c @setchapternewpage odd              % For book style double sided manual.
+@comment %**end of header (This is for running Texinfo on a region.)
+
+@copying
+This document describes the Supercite Version 3.1 package for citing and
+attributing the replies for various GNU Emacs mail and news reading
+subsystems.
+
+Copyright @copyright{} 1993, 2001, 2002, 2003, 2004,
+2005, 2006, 2007 Free Software Foundation, Inc.
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with the Front-Cover texts being ``A GNU
+Manual'', and with the Back-Cover Texts as in (a) below.  A copy of the
+license is included in the section entitled ``GNU Free Documentation
+License'' in the Emacs manual.
+
+(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
+this GNU Manual, like GNU software.  Copies published by the Free
+Software Foundation raise funds for GNU development.''
+
+This document is part of a collection distributed under the GNU Free
+Documentation License.  If you want to distribute this document
+separately from the collection, you can do so by adding a copy of the
+license to the document, as described in section 6 of the license.
+@end quotation
+@end copying
+
+@c      @smallbook
+
+@dircategory Emacs
+@direntry
+* SC: (sc).            Supercite lets you cite parts of messages you're
+                         replying to, in flexible ways.
+@end direntry
+
+@titlepage
+@sp 6
+@center @titlefont{Supercite User's Manual}
+@sp 2
+@center @titlefont{Supercite Version 3.1}
+@sp 4
+@center Manual Revision: 3.48
+@center April 2007
+@sp 5
+@center Barry A@. Warsaw
+@center @t{bwarsaw@@cen.com}
+@center @t{@dots{}!uunet!cen.com!bwarsaw}
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+@ifnottex
+@node Top, Introduction, (dir), (dir)
+@comment  node-name,  next,  previous,  up
+
+This document describes the Supercite Version 3.1 package for citing and
+attributing the replies for various GNU Emacs mail and news reading
+subsystems.  The manual is divided into the following chapters.
+
+@menu
+* Introduction::
+* Citations::
+* Getting Connected::
+* Replying and Yanking::
+* Selecting an Attribution::
+* Configuring the Citation Engine::
+* Post-yank Formatting Commands::
+* Information Keys and the Info Alist::
+* Reference Headers::
+* Hints to MUA Authors::
+* Version 3 Changes::
+* Thanks and History::
+* The Supercite Mailing List::
+
+* GNU Free Documentation License::
+* Concept Index::
+* Command Index::
+* Key Index::
+* Variable Index::
+@end menu
+@end ifnottex
+
+
+@node  Introduction, Usage Overview, Top, Top
+@comment  node-name,  next,  previous,  up
+@chapter Introduction
+@ifinfo
+
+@end ifinfo
+Supercite version 3.1 is a GNU Emacs package written entirely in Emacs
+Lisp. It interfaces to most of the commonly used Emacs mail user agents
+(@dfn{MUAs}) and news user agents (@dfn{NUAs}), and provides
+sophisticated facilities for the citing and attributing of message
+replies.  Supercite has a very specific and limited role in the process
+of composing replies to both USENET network news and electronic mail.
+
+The preferred way to spell Supercite is with a capital @samp{S},
+lowercase @samp{upercite}.  There are a few alternate spellings out there
+and I won't be terribly offended if you use them.  People often ask
+though@dots{}
+
+@ifinfo
+@menu
+* Usage Overview::
+* What Supercite Does Not Do::
+* What Supercite Does::
+@end menu
+@end ifinfo
+
+@cindex MUA
+@cindex NUA
+Supercite is only useful in conjunction with MUAs and NUAs such as VM,
+GNUS, RMAIL, etc@. (hereafter referred to collectively as MUAs).
+Supercite is typically called by the MUA after a reply buffer has been
+setup.  Thereafter, Supercite's many commands and formatting styles are
+available in that reply buffer until the reply is sent.  Supercite is
+re-initialized in each new reply buffer.
+
+Supercite is currently at major revision 3.1, and is known to work in the
+following environments:
+
+@table @asis
+@item Emacs versions:
+       GNU Emacs 18.57 through 18.59, all Emacs 19,
+       all current Lucid Emacs, and Epoch 4.@refill
+
+@item MUAs:
+       VM 4.37 and beyond (including VM version 5), RMAIL, MH-E 3.7 and
+       beyond, PCMAIL.@refill
+
+@item NUAs:
+       RNEWS, GNUS 3.12 and beyond, GNEWS.@refill
+
+@end table
+For systems with version numbers, all known subsequent versions also
+work with Supercite.  For those systems without version numbers,
+Supercite probably works with any recently released version.  Note that
+only some of these systems will work with Supercite ``out of the box.''
+All others must overload interfacing routines to supply the necessary
+glue.  @xref{Getting Connected}, for more details.@refill
+
+
+@node Usage Overview, What Supercite Does Not Do, Introduction, Introduction
+@comment  node-name,  next,  previous,  up
+@kindex r
+@kindex f
+@kindex C-c C-y
+@cindex yank
+@cindex cite, citing
+@cindex attribute, attributing
+@comment
+@section Usage Overview
+@ifinfo
+
+@end ifinfo
+Typical usage is as follows. You want to reply or followup to a message
+in your MUA. You will probably hit @kbd{r} (i.e., ``reply'') or @kbd{f}
+(i.e., ``forward'') to begin composing the reply.  In response, the MUA
+will create a reply buffer and initialize the outgoing mail headers
+appropriately.  The body of the reply will usually be empty at this
+point.  You now decide that you would like to include part of the
+original message in your reply. To do this, you @dfn{yank} the original
+message into the reply buffer, typically with a key stroke such as
+@kbd{C-c C-y}.  This sequence will invoke an MUA-specific function which
+fills the body of the reply with the original message and then
+@dfn{attributes} this text to its author.  This is called @dfn{citing}
+and its effect is to prefix every line from the original message with a
+special text tag.  Most MUAs provide some default style of citing; by
+using Supercite you gain a wider flexibility in the look and style of
+citations.  Supercite's only job is to cite the original message.
+
+@node  What Supercite Does Not Do, What Supercite Does, Usage Overview, Introduction
+@comment  node-name,  next,  previous,  up
+@section What Supercite Doesn't Do
+@ifinfo
+
+@end ifinfo
+Because of this clear division of labor, there are useful features which
+are the sole responsibility of the MUA, even though it might seem that
+Supercite should provide them.  For example, many people would like to
+be able to yank (and cite) only a portion of the original message.
+Since Supercite only modifies the text it finds in the reply buffer as
+set up by the MUA, it is the MUA's responsibility to do partial yanking.
+@xref{Reply Buffer Initialization}.@refill
+
+@vindex mail-header-separator
+@comment
+Another potentially useful thing would be for Supercite to set up the
+outgoing mail headers with information it gleans from the reply buffer.
+But by previously agreed upon convention, any text above the
+@code{mail-header-separator} which separates mail headers from message
+bodies cannot be modified by Supercite.  Supercite, in fact, doesn't
+know anything about the meaning of these headers, and never ventures
+outside the designated region. @xref{Hints to MUA Authors}, for more
+details.@refill
+
+@node  What Supercite Does, Citations, What Supercite Does Not Do, Introduction
+@comment  node-name,  next,  previous,  up
+@findex sc-cite-original
+@section What Supercite Does
+@ifinfo
+
+@end ifinfo
+Supercite is invoked for the first time on a reply buffer via your MUA's
+reply or forward command.  This command will actually perform citations
+by calling a hook variable to which Supercite's top-level function
+@code{sc-cite-original} has been added.  When @code{sc-cite-original} is
+executed, the original message must be set up in a very specific way,
+but this is handled automatically by the MUA.  @xref{Hints to MUA
+Authors}.@refill
+
+@cindex info alist
+The first thing Supercite does, via @code{sc-cite-original}, is to parse
+through the original message's mail headers.  It saves this data in an
+@dfn{information association list}, or @dfn{info alist}.  The information
+in this list is used in a number of places throughout Supercite.
+@xref{Information Keys and the Info Alist}.@refill
+
+@cindex nuking mail headers
+@cindex reference header
+After the mail header info is extracted, the headers are optionally
+removed (@dfn{nuked}) from the reply.  Supercite then writes a
+@dfn{reference header} into the buffer.  This reference header is a
+string carrying details about the citation it is about to perform.
+
+@cindex modeline
+Next, Supercite visits each line in the reply, transforming the line
+according to a customizable ``script.''  Lines which were not previously
+cited in the original message are given a citation, while already cited
+lines remain untouched, or are coerced to your preferred style.
+Finally, Supercite installs a keymap into the reply buffer so that you
+have access to Supercite's post-yank formatting and reciting commands as
+you subsequently edit your reply.  You can tell that Supercite has been
+installed into the reply buffer because that buffer's modeline will
+display the minor mode string @samp{SC}.
+
+@cindex filladapt
+@cindex gin-mode
+@vindex fill-prefix
+@findex fill-paragraph
+@comment
+When the original message is cited by @code{sc-cite-original}, it will
+(optionally) be filled by Supercite.  However, if you manually edit the
+cited text and want to re-fill it, you must use an add-on package such
+as @cite{filladapt} or @cite{gin-mode}.  These packages can recognize
+Supercited text and will fill them appropriately.  Emacs' built-in
+filling routines, e.g@. @code{fill-paragraph}, do not recognize cited
+text and will not re-fill them properly because it cannot guess the
+@code{fill-prefix} being used.
+@xref{Post-yank Formatting Commands}, for details.@refill
+
+As mentioned above, Supercite provides commands to recite or uncite
+regions of text in the reply buffer, and commands to perform other
+beautifications on the cited original text, maintaining consistent and
+informative citations throughout.  Supercite tries to be as configurable
+as possible to allow for a wide range of personalized citation styles,
+but it is also immediately useful with the default configuration, once
+it has been properly connected to your MUA.  @xref{Getting Connected},
+for more details.@refill
+
+@node  Citations, Citation Elements, What Supercite Does, Top
+@comment  node-name,  next,  previous,  up
+@cindex nested citations
+@cindex citation
+@comment
+@chapter Citations
+@ifinfo
+
+@end ifinfo
+A @dfn{citation} is the acknowledgement of the original author of a mail
+message in the body of the reply.  There are two basic citation styles
+which Supercite supports.  The first, called @dfn{nested citations} is
+an anonymous form of citation; in other words, an indication is made
+that the cited line was written by someone @emph{other} that the current
+message author (i.e., other than you, the person composing the reply),
+but no reference is made as to the identity of the original author.
+This style should look familiar since its use on the net is widespread.
+Here's an example of what a message buffer would look like using nested
+citations after multiple replies:
+
+@example
+>> John originally wrote this
+>> and this as well
+> Jane said that John didn't know
+> what he was talking about
+And that's what I think too.
+@end example
+
+@ifinfo
+@menu
+* Citation Elements::
+* Recognizing Citations::
+@end menu
+@end ifinfo
+
+Note that multiple inclusions of the original messages result in a
+nesting of the @samp{@code{>}} characters.  This can sometimes be quite
+confusing when many levels of citations are included since it may be
+difficult or impossible to figure out who actually participated in the
+thread, and multiple nesting of @samp{@code{>}} characters can sometimes
+make the message very difficult for the eye to scan.
+
+@cindex non-nested citations
+In @dfn{non-nested citations}, each cited line begins with an
+informative string attributing that line to the original author. Only
+the first level of attribution will be shown; subsequent citations don't
+nest the citation strings. The above dialog might look like this when
+non-nested citations are used:
+
+@example
+John> John originally wrote this
+John> and this as well
+Jane> Jane said that John didn't know
+Jane> what he was talking about
+And that's what I think too.
+@end example
+
+Notice here that my inclusion of Jane's inclusion of John's original
+message did not result in a line cited with @samp{Jane>John>}.
+
+@vindex sc-nested-citation-p
+@vindex nested-citation-p (sc-)
+Supercite supports both styles of citation, and the variable
+@code{sc-nested-citation-p} controls which style it will use when citing
+previously uncited text. When this variable is @code{nil} (the default),
+non-nested citations are used.  When non-@code{nil}, nested citations
+are used.
+
+
+@node  Citation Elements, Recognizing Citations, Citations, Citations
+@comment  node-name,  next,  previous,  up
+@cindex citation string
+@comment
+@section Citation Elements
+@ifinfo
+
+@end ifinfo
+@dfn{Citation strings} are composed of one or more elements. Non-nested
+citations are composed of four elements, three of which are directly
+user definable.  The elements are concatenated together, in this order:
+
+@cindex citation leader
+@vindex citation-leader (sc-)
+@vindex sc-citation-leader
+@enumerate
+@item
+The @dfn{citation leader}.  The citation leader is contained in the
+variable @code{sc-citation-leader}, and has the default value of a
+string containing four spaces.
+
+@cindex attribution string
+@item
+The @dfn{attribution string}.  This element is supplied automatically by
+Supercite, based on your preferences and the original message's mail
+headers, though you may be asked to confirm Supercite's choice.
+@xref{Selecting an Attribution}, for more details.@refill
+
+@cindex citation delimiter
+@vindex sc-citation-delimiter
+@vindex citation-delimiter (sc-)
+@item
+The @dfn{citation delimiter}.  This string, contained in the variable
+@code{sc-citation-delimiter} visually separates the citation from the
+text of the line.  This variable has a default value of @code{">"} and
+for best results, the string should consist of only a single character.
+
+@cindex citation separator
+@vindex citation-separator (sc-)
+@vindex sc-citation-separator
+@item
+The @dfn{citation separator}.  The citation separator is contained in
+the variable @code{sc-citation-separator}, and has the default value of
+a string containing a single space.
+@end enumerate
+
+For example, suppose you were using the default values for the above
+variables, and Supercite provided the attribution string @samp{Jane}.
+In this case, the composed, non-nested citation string used might be
+something like
+@code{@asis{"    Jane> "}}.
+This citation string will be inserted in front of
+every line in the original message that is not already cited.@refill
+
+Nested citations, being simpler than non-nested citations, are composed
+of the same elements, sans the attribution string.  Supercite is smart
+enough to not put additional spaces between citation delimiters for
+multi-level nested citations.
+
+@node  Recognizing Citations, Getting Connected, Citation Elements, Citations
+@comment  node-name,  next,  previous,  up
+@section Recognizing Citations
+@ifinfo
+
+@end ifinfo
+Supercite also recognizes citations in the original article, and can
+transform these already cited lines in a number of ways. This is how
+Supercite suppresses the multiple citing of non-nested citations.
+Recognition of cited lines is controlled by variables analogous to those
+that make up the citation string as mentioned previously.
+
+@vindex sc-citation-leader-regexp
+@vindex citation-leader-regexp (sc-)
+@vindex sc-citation-delimiter-regexp
+@vindex citation-delimiter-regexp (sc-)
+@vindex sc-citation-separator-regexp
+@vindex citation-separator-regexp (sc-)
+@vindex sc-citation-root-regexp
+@vindex citation-root-regexp (sc-)
+@vindex sc-citation-nonnested-root-regexp
+@vindex citation-nonnested-root-regexp (sc-)
+
+The variable @code{sc-citation-leader-regexp} describes how citation
+leaders can look, by default it matches any number of spaces or tabs.
+Note that since the lisp function @code{looking-at} is used to do the
+matching, if you change this variable it need not start with a leading
+@code{"^"}.
+
+Similarly, the variables @code{sc-citation-delimiter-regexp} and
+@code{sc-citation-separator-regexp} respectively describe how citation
+delimiters and separators can look.  They follow the same rule as
+@code{sc-citation-leader-regexp} above.
+
+When Supercite composes a citation string, it provides the attribution
+automatically.  The analogous variable which handles recognition of the
+attribution part of citation strings is @code{sc-citation-root-regexp}.
+This variable describes the attribution root for both nested and
+non-nested citations.  By default it can match zero-to-many alphanumeric
+characters (also ``.'', ``-'', and ``_'').  But in some situations,
+Supercite has to determine whether it is looking at a nested or
+non-nested citation.  Thus the variable
+@code{sc-citation-nonnested-root-regexp} is used to describe only
+non-nested citation roots.  It is important to remember that if you
+change @code{sc-citation-root-regexp} you should always also change
+@code{sc-citation-nonnested-root-regexp}.@refill
+
+@node  Information Keys and the Info Alist, Reference Headers, Miscellaneous Commands, Top
+@comment  node-name,  next,  previous,  up
+@cindex information keys
+@cindex Info Alist
+@cindex information extracted from mail fields
+@findex sc-mail-field
+@findex mail-field (sc-)
+@comment
+@chapter Information Keys and the Info Alist
+@ifinfo
+
+@end ifinfo
+@dfn{Mail header information keys} are nuggets of information that
+Supercite extracts from the various mail headers of the original
+message, placed in the reply buffer by the MUA.  Information is kept in
+the @dfn{Info Alist} as key-value pairs, and can be retrieved for use in
+various places within Supercite, such as in header rewrite functions and
+attribution selection.  Other bits of data, composed and created by
+Supercite, are also kept as key-value pairs in this alist. In the case
+of mail fields, the key is the name of the field, omitting the trailing
+colon.  Info keys are always case insensitive (as are mail headers), and
+the value for a corresponding key can be retrieved from the alist with
+the @code{sc-mail-field} function.  Thus, if the following fields were
+present in the original article:@refill
+
+@example
+Date:@: 08 April 1991, 17:32:09 EST
+Subject:@: Better get out your asbestos suit
+@end example
+
+@vindex sc-mumble
+@vindex mumble (sc-)
+@noindent
+then, the following lisp constructs return:
+
+@example
+(sc-mail-field "date")
+==> "08 April 1991, 17:32:09 EST"
+
+(sc-mail-field "subject")
+==> "Better get out your asbestos suit"
+@end example
+
+Since the argument to @code{sc-mail-field} can be any string, it is
+possible that the mail field will not be present on the info alist
+(possibly because the mail header was not present in the original
+message). In this case, @code{sc-mail-field} will return the value of
+the variable @code{sc-mumble}.
+
+Supercite always places all mail fields found in the yanked original
+article into the info alist.  If possible, Supercite will also places
+the following keys into the info alist:
+
+@table @code
+@cindex sc-attribution info field
+@cindex attribution info field (sc-)
+@item "sc-attribution"
+the selected attribution string.
+
+@cindex sc-citation info field
+@cindex citation info field (sc-)
+@item "sc-citation"
+the non-nested citation string.
+
+@cindex sc-from-address info field
+@cindex from-address info field (sc-)
+@item "sc-from-address"
+email address extracted from the @samp{From:@:} field.
+
+@cindex sc-reply-address info field
+@cindex reply-address info field (sc-)
+@item "sc-reply-address"
+email address extracted from the @samp{Reply-To:@:} field.
+
+@cindex sc-sender-address info field
+@cindex sender-address info field (sc-)
+@item "sc-sender-address"
+email address extracted from the @samp{Sender:@:} field.
+
+@cindex sc-emailname info field
+@cindex emailname info field (sc-)
+@item "sc-emailname"
+email terminus extracted from the @samp{From:@:} field.
+
+@cindex sc-initials info field
+@cindex initials info field (sc-)
+@item "sc-initials"
+the author's initials.
+
+@cindex sc-author info field
+@cindex author info field (sc-)
+@item "sc-author"
+the author's full name.
+
+@cindex sc-firstname info field
+@cindex firstname info field (sc-)
+@item "sc-firstname"
+the author's first name.
+
+@cindex sc-lastname info field
+@cindex lastname info field (sc-)
+@item "sc-lastname"
+the author's last name.
+
+@cindex sc-middlename-1 info field
+@cindex middlename-1 info field (sc-)
+@item "sc-middlename-1"
+the author's first middle name.
+@end table
+
+If the author's name has more than one middle name, they will appear as
+info keys with the appropriate index (e.g., @code{"sc-middlename-2"},
+@dots{}).  @xref{Selecting an Attribution}.@refill
+
+@node  Reference Headers, The Built-in Header Rewrite Functions, Information Keys and the Info Alist, Top
+@comment  node-name,  next,  previous,  up
+@cindex reference headers
+@chapter Reference Headers
+@ifinfo
+
+@end ifinfo
+Supercite will insert an informative @dfn{reference header} at the
+beginning of the cited body of text, which display more detail about the
+original article and provides the mapping between the attribution and
+the original author in non-nested citations.  Whereas the citation
+string usually only contains a portion of the original author's name,
+the reference header can contain such information as the author's full
+name, email address, the original article's subject, etc.  In fact any
+information contained in the info alist can be inserted into a reference
+header.
+
+@ifinfo
+@menu
+* The Built-in Header Rewrite Functions::
+* Electric References::
+@end menu
+@end ifinfo
+
+@cindex header rewrite functions
+@vindex sc-rewrite-header-list
+@vindex rewrite-header-list (sc-)
+There are a number of built-in @dfn{header rewrite functions} supplied
+by Supercite, but you can write your own custom header rewrite functions
+(perhaps using the built-in ones as examples). The variable
+@code{sc-rewrite-header-list} contains the list of such header rewrite
+functions.  This list is consulted both when inserting the initial
+reference header, and when displaying @dfn{electric references}.
+@xref{Electric References}.
+
+@vindex sc-preferred-header-style
+@vindex preferred-header-style (sc-)
+When Supercite is initially run on a reply buffer (via
+@code{sc-cite-original}), it will automatically call one of these
+functions. The one it uses is defined in the variable
+@code{sc-preferred-header-style}.  The value of this variable is an
+integer which is an index into the @code{sc-rewrite-header-list},
+beginning at zero.
+
+@node  The Built-in Header Rewrite Functions, Electric References, Reference Headers, Reference Headers
+@comment  node-name,  next,  previous,  up
+@cindex header rewrite functions, built-in
+@comment
+@section The Built-in Header Rewrite Functions
+@ifinfo
+
+@end ifinfo
+Below are examples of the various built-in header rewrite functions.
+Please note the following:@: first, the text which appears in the
+examples below as @var{infokey} indicates that the corresponding value
+of the info key from the info alist will be inserted there.
+(@pxref{Information Keys and the Info Alist}).  For example, in @code{sc-header-on-said}
+below, @var{date} and @var{from} correspond to the values of the
+@samp{Date:@:} and @samp{From:@:} mail headers respectively.@refill
+
+@vindex sc-reference-tag-string
+@vindex reference-tag-string (sc-)
+Also, the string @code{">>>>>"} below is really the value of the
+variable @code{sc-reference-tag-string}.  This variable is used in all
+built-in header rewrite functions, and you can customize its value to
+change the tag string globally.
+
+Finally, the references headers actually written may omit certain parts
+of the header if the info key associated with @var{infokey} is not
+present in the info alist.  In fact, for all built-in headers, if the
+@samp{From:@:} field is not present in the mail headers, the entire
+reference header will be omitted (but this usually signals a serious
+problem either in your MUA or in Supercite's installation).
+
+@table @code
+@findex sc-no-header
+@findex no-header (sc-)
+@item sc-no-header
+This function produces no header. It should be used instead of
+@code{nil} to produce a blank header.  This header can possibly contain
+a blank line after the @code{mail-header-separator} line.
+
+@item sc-no-blank-line-or-header
+@findex sc-no-blank-line-or-header
+@findex no-blank-line-or-header (sc-)
+This function is similar to @code{sc-no-header} except that any blank
+line after the @code{mail-header-separator} line will be removed.
+
+@item sc-header-on-said
+@findex sc-header-on-said
+@findex header-on-said (sc-)
+@code{>>>>> On @var{date}, @var{from} said:}
+
+@item sc-header-inarticle-writes
+@findex sc-header-inarticle-writes
+@findex header-inarticle-writes (sc-)
+@code{>>>>> In article @var{message-id}, @var{from} writes:}
+
+@item sc-header-regarding-adds
+@findex sc-header-regarding-adds
+@findex header-regarding-adds (sc-)
+@code{>>>>> Regarding @var{subject}; @var{from} adds:}
+
+@item sc-header-attributed-writes
+@findex sc-header-attributed-writes
+@findex header-attributed-writes (sc-)
+@code{>>>>> "@var{sc-attribution}" == @var{sc-author} <@var{sc-reply-address}> writes:}
+
+@item sc-header-author-writes
+@findex sc-header-author-writes
+@findex header-author-writes (sc-)
+@code{>>>>> @var{sc-author} writes:}
+
+@item sc-header-verbose
+@findex sc-header-verbose
+@findex header-verbose (sc-)
+@code{>>>>> On @var{date},}@*
+@code{>>>>> @var{sc-author}}@*
+@code{>>>>> from the organization of @var{organization}}@*
+@code{>>>>> who can be reached at:@: @var{sc-reply-address}}@*
+@code{>>>>> (whose comments are cited below with:@: "@var{sc-cite}")}@*
+@code{>>>>> had this to say in article @var{message-id}}@*
+@code{>>>>> in newsgroups @var{newsgroups}}@*
+@code{>>>>> concerning the subject of @var{subject}}@*
+@code{>>>>> see @var{references} for more details}
+@end table
+
+@node  Electric References, Hints to MUA Authors, The Built-in Header Rewrite Functions, Reference Headers
+@comment  node-name,  next,  previous,  up
+@cindex electric references
+@section Electric References
+@ifinfo
+
+@end ifinfo
+By default, when Supercite cites the original message for the first
+time, it just goes ahead and inserts the reference header indexed by
+@code{sc-preferred-header-style}.  However, you may want to select
+different reference headers based on the type of reply or forwarding you
+are doing. You may also want to preview the reference header before
+deciding whether to insert it into the reply buffer or not. Supercite
+provides an optional @dfn{electric reference} mode which you can drop
+into to give you this functionality.
+
+@vindex sc-electric-references-p
+@vindex electric-references-p (sc-)
+If the variable @code{sc-electric-references-p} is non-@code{nil},
+Supercite will bring up an electric reference mode buffer and place you
+into a recursive edit.  The electric reference buffer is read-only, so
+you cannot directly modify the reference text until you exit electric
+references and insert the text into the reply buffer.  But you can cycle
+through all the reference header rewrite functions in your
+@code{sc-rewrite-header-list}.
+
+You can also set a new preferred header style, jump to any header, or
+jump to the preferred header. The header will be shown in the electric
+reference buffer and the header index and function name will appear in
+the echo area.
+
+The following commands are available while in electric reference mode
+(shown here with their default key bindings):
+
+@table @asis
+@item @code{sc-eref-next} (@kbd{n})
+@findex sc-eref-next
+@findex eref-next (sc-)
+@kindex n
+@vindex sc-electric-circular-p
+@vindex electric-circular-p (sc-)
+Displays the next reference header in the electric reference buffer. If
+the variable @code{sc-electric-circular-p} is non-@code{nil}, invoking
+@code{sc-eref-next} while viewing the last reference header in the list
+will wrap around to the first header.@refill
+
+@item @code{sc-eref-prev} (@kbd{p})
+@findex sc-eref-prev
+@findex eref-prev (sc-)
+@kindex p
+Displays the previous reference header in the electric reference buffer.
+If the variable @code{sc-electric-circular-p} is non-@code{nil},
+invoking @code{sc-eref-prev} will wrap around to the last header.@refill
+
+@item @code{sc-eref-goto} (@kbd{g})
+@findex sc-eref-goto
+@findex eref-goto (sc-)
+@kindex g
+Goes to a specified reference header.  The index (into the
+@code{sc-rewrite-header-list}) can be specified as a numeric argument to
+the command.  Otherwise, Supercite will query you for the index in the
+minibuffer.@refill
+
+@item @code{sc-eref-jump} (@kbd{j})
+@findex sc-eref-jump
+@findex eref-jump (sc-)
+@kindex j
+Display the preferred reference header, i.e., the one indexed by the current
+value of @code{sc-preferred-header-style}.
+
+@item @code{sc-eref-setn} (@kbd{s})
+@findex sc-eref-setn
+@findex eref-setn (sc-)
+@kindex s
+Set the preferred reference header (i.e.,
+@code{sc-preferred-header-style}) to the currently displayed header.@refill
+
+@item @code{sc-eref-exit} (@kbd{C-j}, @key{RET}, and @key{ESC C-c})
+@kindex RET
+@kindex C-j
+@kindex q
+@findex sc-eref-exit
+@findex eref-exit (sc-)
+Exit from electric reference mode and insert the current header into the
+reply buffer.@refill
+
+@item @code{sc-eref-abort} (@kbd{q}, @kbd{x})
+@findex sc-eref-abort
+@findex eref-abort (sc-)
+@kindex x
+Exit from electric reference mode without inserting the current header.
+@end table
+
+@vindex sc-electric-mode-hook
+@vindex electric-mode-hook (sc-)
+@noindent
+Supercite will execute the hook @code{sc-electric-mode-hook} before
+entering electric reference mode.
+
+@node  Getting Connected, Emacs 19 MUAs, Recognizing Citations, Top
+@comment  node-name,  next,  previous,  up
+@cindex citation interface specification
+@chapter Getting Connected
+@ifinfo
+
+@end ifinfo
+Hitting @kbd{C-c C-y} in your MUA's reply buffer yanks and cites the
+original message into the reply buffer.  In reality, the citation of the
+original message is performed via a call through a configurable hook
+variable.  The name of this variable has been agreed to in advance as
+part of the @dfn{citation interface specification}.  By default this
+hook variable has a @code{nil} value, which the MUA recognizes to mean,
+``use your default citation function.''  When you add Supercite's
+citation function to the hook, thereby giving the variable a
+non-@code{nil} value, it tells the MUA to run the hook via
+@code{run-hooks} instead of using the default citation.@refill
+
+@ifinfo
+@menu
+* Emacs 19 MUAs::
+* Emacs 18 MUAs::
+* MH-E with any Emacsen::
+* VM with any Emacsen::
+* GNEWS with any Emacsen::
+* Overloading for Non-conforming MUAs::
+@end menu
+@end ifinfo
+
+Early in Supercite's development, the Supercite author, a few MUA
+authors, and some early Supercite users got together and agreed upon a
+standard interface between MUAs and citation packages (of which
+Supercite is currently the only known add-on @t{:-)}.  With the recent
+release of the Free Software Foundation's GNU Emacs 19, the interface
+has undergone some modification and it is possible that not all MUAs
+support the new interface yet.  Some support only the old interface and
+some do not support the interface at all.  Still, it is possible for all
+known MUAs to use Supercite, and the following sections will outline the
+procedures you need to follow.
+
+To learn exactly how to connect Supercite to the software systems you
+are using, read the appropriate following sections.  For details on the
+interface specifications, or if you are writing or maintaining an MUA,
+@pxref{Hints to MUA Authors}.
+
+@cindex autoload
+@cindex .emacs file
+@findex sc-cite-original
+@findex cite-original (sc-)
+@findex sc-submit-bug-report
+@findex submit-bug-report (sc-)
+The first thing that everyone should do, regardless of the MUA you are
+using is to set up Emacs so it will load Supercite at the appropriate
+time.  You can either dump Supercite into your Emacs binary (ask your
+local Emacs guru how to do this if you don't know), or you can set up an
+@dfn{autoload} for Supercite.  To do the latter, put the following in
+your @file{.emacs} file:
+
+@example
+(autoload 'sc-cite-original     "supercite" "Supercite 3.1" t)
+(autoload 'sc-submit-bug-report "supercite" "Supercite 3.1" t)
+@end example
+
+@cindex point
+@cindex mark
+The function @code{sc-cite-original} is the top-level Supercite function
+designed to be run from the citation hook.  It expects
+@samp{point} and @samp{mark} to be set around the region to cite, and it
+expects the original article's mail headers to be present within this
+region.  Note that Supercite @emph{never} touches any text outside this
+region.  Note further that for Emacs 19, the region need not be active
+for @code{sc-cite-original} to do its job.
+@xref{Hints to MUA Authors}.@refill
+
+The other step in the getting connected process is to make sure your
+MUA calls @code{sc-cite-original} at the right time.  As mentioned
+above, some MUAs handle this differently.  Read the sections that follow
+pertaining to the MUAs you are using.
+
+@vindex sc-load-hook
+@vindex load-hook (sc-)
+@vindex sc-pre-hook
+@vindex pre-hook (sc-)
+One final note.  After Supercite is loaded into your Emacs session, it
+runs the hook @code{sc-load-hook}.  You can put any customizations into
+this hook since it is only run once.  This will not work, however, if
+your Emacs maintainer has put Supercite into your dumped Emacs' image.
+In that case, you can use the @code{sc-pre-hook} variable, but this will
+get executed every time @code{sc-cite-original} is called.  @xref{Reply
+Buffer Initialization}.@refill
+
+@node   Emacs 19 MUAs, Emacs 18 MUAs, Getting Connected, Getting Connected
+@comment  node-name,  next,  previous,  up
+@vindex mail-citation-hook
+@cindex .emacs file
+@section GNUS, RMAIL, or RNEWS with any Emacs 19
+@ifinfo
+
+@end ifinfo
+These MUAs, distributed with Emacs and with Lucid Emacs, use Emacs's
+built-in yanking facility, which provides the citing hook variable
+@code{mail-citation-hook}.  By default, this hook's value is @code{nil},
+but by adding the following to your @file{.emacs} file, you can tell
+these MUAs to use Supercite to perform the citing of the original
+message:
+
+@example
+(add-hook 'mail-citation-hook 'sc-cite-original)
+@end example
+
+GNUS users may also want to add the following bit of lisp as well.  This
+prevents GNUS from inserting its default attribution header.  Otherwise,
+both GNUS and Supercite will insert an attribution header:
+
+@example
+(setq news-reply-header-hook nil)
+@end example
+
+@node   Emacs 18 MUAs, MH-E with any Emacsen, Emacs 19 MUAs, Getting Connected
+@comment  node-name,  next,  previous,  up
+@vindex mail-citation-hook
+@cindex .emacs file
+@cindex overloading
+@cindex sendmail.el file
+@section GNUS, RMAIL, PCMAIL, RNEWS with Emacs 18 or Epoch 4
+@ifinfo
+
+@end ifinfo
+These MUAs use Emacs' built-in yanking and citing routines, contained in
+the @file{sendmail.el} file.  @file{sendmail.el} for Emacs 18, and its
+derivative Epoch 4, do not know anything about the citation interface
+required by Supercite.  To connect Supercite to any of these MUAs under
+Emacs 18 or Epoch 4, you should first
+@pxref{Overloading for Non-conforming MUAs}.  Then follow the directions
+for using these MUAs under Emacs 19.
+@xref{Emacs 19 MUAs}.@refill
+
+@cindex add-hook substitute
+@cindex setq as a substitute for add-hook
+@findex setq
+@findex add-hook
+@cindex sc-unsupp.el file
+Note that those instructions will tell you to use the function
+@code{add-hook}. This function is new with Emacs 19 and you will not
+have it by default if you are running Emacs 18 or Epoch 4.  You can
+either substitute the appropriate call to @code{setq}, or you can use
+the @code{add-hook} function that is provided in the @file{sc-unsupp.el}
+file of unsupported Supercite hacks and ideas.  Or you can upgrade to
+some Emacs 19 variant!  @t{:-)}@refill
+
+To use @code{setq} instead of @code{add-hook}, you would, for example,
+change this:
+
+@example
+(add-hook 'mail-citation-hook 'sc-cite-original)
+@end example
+
+to:
+
+@example
+(setq mail-citation-hook 'sc-cite-original)
+@end example
+
+Note the lack of a single quote on the first argument to @code{setq}.
+
+@node  MH-E with any Emacsen, VM with any Emacsen, Emacs 18 MUAs, Getting Connected
+@comment  node-name,  next,  previous,  up
+@cindex .emacs file
+@vindex mh-yank-hooks
+@findex add-hook
+@cindex mail-citation-hook
+@section MH-E with any Emacsen
+@ifinfo
+
+@end ifinfo
+MH-E 4.x conforms to the @code{mail-citation-hook} interface supported
+by other MUAs.  At the time of this writing, MH-E 4.0 has not been
+released, but if you have it, put this in your @file{.emacs} file to
+connect Supercite and MH-E 4.x:
+
+@example
+(add-hook 'mail-citation-hook 'sc-cite-original)
+@end example
+
+Note that if you are using Emacs 18 or Epoch 4, you will not have the
+@code{add-hook} function.  @xref{Emacs 18 MUAs}, for details on how to
+proceed without @code{add-hook}.
+
+MH-E version 3.x uses a slightly different interface than other MUAs.
+MH-E provides a hook variable @code{mh-yank-hooks}, but it doesn't act
+like a hook, and doing an @code{add-hook} will not work.
+
+To connect Supercite to MH-E 3.x, you should instead add the following
+to your @code{.emacs} file:
+
+@example
+(add-hook 'mh-yank-hooks 'sc-cite-original)
+@end example
+
+@vindex mh-yank-from-start-of-msg
+You also need to make sure that MH-E includes all the original mail
+headers in the yanked message.  The variable that controls this is
+@code{mh-yank-from-start-of-msg}.  By default, this variable has the
+value @code{t}, which tells MH-E to include all the mail headers when
+yanking the original message.  Before you switched to using Supercite,
+you may have set this variable to other values so as not to include the
+mail headers in the yanked message.  Since Supercite requires these
+headers (and cleans them out for you), you need to make sure the value
+is @code{t}.  This lisp, in your @file{.emacs} file will do the trick:
+
+@example
+(setq mh-yank-from-start-of-msg t)
+@end example
+
+Note that versions of MH-E before 3.7 did not provide the
+@code{mh-yank-hooks} variable.  Your only option is to upgrade to MH-E
+version 3.7 or later.
+
+@node  VM with any Emacsen, GNEWS with any Emacsen, MH-E with any Emacsen, Getting Connected
+@comment  node-name,  next,  previous,  up
+@cindex .emacs file
+@vindex mail-citation-hook
+@vindex mail-yank-hooks
+@section VM with any Emacsen
+@ifinfo
+
+@end ifinfo
+Since release 4.40, VM has supported the citation interface required by
+Supercite.  But since the interface has changed recently the details of
+getting connected differ with the version of VM you are using.
+
+If you are running any release of VM after 4.40, you can add the
+following to your @file{.emacs} to connect Supercite with VM:
+
+@example
+(add-hook 'mail-yank-hooks 'sc-cite-original)
+@end example
+
+Note that if you are using Emacs 18 or Epoch 4, you will not have the
+@code{add-hook} function.  @xref{Emacs 18 MUAs}, for details on how to
+proceed without @code{add-hook}.
+
+Since version 5.34, VM has supported the newer @code{mail-citation-hook}
+interface, but @code{mail-yank-hooks} is still being supported for
+backward compatibility.  If you are running a newer version of VM and
+you want to maintain consistency with other MUAs, use this bit of code
+instead:
+
+@example
+(add-hook 'mail-citation-hook 'sc-cite-original)
+@end example
+
+@node  GNEWS with any Emacsen, Overloading for Non-conforming MUAs, VM with any Emacsen, Getting Connected
+@comment  node-name,  next,  previous,  up@cindex .emacs file
+@vindex news-reply-mode-hook
+@findex sc-perform-overloads
+@findex perform-overloads (sc-)
+@vindex gnews-ready-hook
+@section GNEWS with any Emacsen
+@ifinfo
+
+@end ifinfo
+As far as I know, no version of GNEWS supports the citation interface
+required by Supercite.  To connect Supercite with GNEWS, please first
+@pxref{Overloading for Non-conforming MUAs}.
+
+After you have followed the directions in that section.  You should add
+the following lisp code to your @file{.emacs} file:
+
+@example
+(add-hook 'mail-citation-hook 'sc-cite-original)
+@end example
+
+Note that if you are using Emacs 18 or Epoch 4, you will not have the
+@code{add-hook} function.  @xref{Emacs 18 MUAs}, for details on how to
+proceed without @code{add-hook}.
+
+@node  Overloading for Non-conforming MUAs, Replying and Yanking, GNEWS with any Emacsen, Getting Connected
+@comment  node-name,  next,  previous,  up
+@cindex overloading
+@cindex sc-oloads.el
+@vindex mail-citation-hook
+@findex sc-perform-overloads
+@cindex .emacs file
+@section Overloading for Non-conforming MUAs
+@ifinfo
+
+@end ifinfo
+As mentioned elsewhere, some MUAs do not provide the necessary hooks to
+connect with Supercite.  Supercite version 3.1 provides an unsupported
+mechanism, called @dfn{overloading} which redefines certain key
+functions in the MUA, so that it will call the @code{mail-citation-hook}
+variable instead of the MUA's default hard-coded citing routines.  Since
+most newer versions of the known MUAs support the
+@code{mail-citation-hook} variable, it is recommended that you upgrade
+if at all possible.  But if you can't upgrade, at least you're not out
+of luck!  Once you set up overloading properly, you should follow the
+directions for connecting Supercite to the Emacs 19 MUAs.
+@xref{Emacs 19 MUAs}.@refill
+
+@cindex Hyperbole
+@vindex hyperb:version
+Users of Bob Weiner's Hyperbole package take note.  Hyperbole provides
+the necessary overloads (and a whole lot more!) and you can potentially
+clobber it if you were to load Supercite's overloading after
+Hyperbole's.  For this reason, Supercite will @emph{not} perform any
+overloading if it finds the variable @code{hyperb:version} is
+@code{boundp} (i.e. it exists because Hyperbole has been loaded into
+your Emacs session).  If this is the case, Supercite will display a
+warning message in the minibuffer.  You should consult the Hyperbole
+manual for further details.
+
+Overloading involves the re-definition of the citing function with the
+new, @code{mail-citation-hook} savvy version.  The function in
+@file{sc-oloads.el} that does this is @code{sc-perform-overloads}.  This
+function is smart enough to only overload the MUA functions when it is
+absolutely necessary, based on the version numbers it can figure out.
+Also, @code{sc-perform-overloads} will only install the new functions
+once.  It is also smart enough to do nothing if the MUA is not yet
+loaded.@refill
+
+The tricky part is finding the right time and place to perform the
+overloading.  It must be done after the MUA has been loaded into your
+Emacs session, but before the first time you try to yank in a message.
+Fortunately, this has been figured out for you.
+
+If you must overload, you should put the following lisp code in your
+@file{.emacs} file, to make sure the @file{sc-oloads.el} file gets
+loaded at the right time:
+
+@example
+(autoload 'sc-perform-overloads "sc-oloads" "Supercite 3.1" t)
+@end example
+
+Then you must make sure that the function @code{sc-perform-overloads}
+gets run at the right time.  For GNUS, put this in your @file{.emacs}
+file:
+
+@example
+(setq news-reply-mode-hook 'sc-perform-overloads)
+(setq mail-setup-hook 'sc-perform-overloads)
+@end example
+
+If you are using RNEWS, put this in your @file{.emacs} file:
+
+@vindex news-reply-mode-hook
+@example
+(setq news-reply-mode-hook 'sc-perform-overloads)
+@end example
+
+If you are using RMAIL or PCMAIL, put this in your @file{.emacs} file:
+
+@example
+(setq mail-setup-hook 'sc-perform-overloads)
+@end example
+
+If you are using GNEWS, put this in your @file{.emacs} file:
+
+@example
+(setq news-reply-mode-hook 'sc-perform-overloads)
+(setq gnews-ready-hook 'sc-perform-overloads)
+@end example
+
+Now go back and follow the directions for getting the Emacs 19 MUAs
+connected to Supercite.  Be sure to @pxref{Emacs 18 MUAs} on substitutes
+for Emacs 19's @code{add-hook} function.@refill
+
+@node  Replying and Yanking, Reply Buffer Initialization, Overloading for Non-conforming MUAs, Top
+@comment  node-name,  next,  previous,  up
+@chapter Replying and Yanking
+@ifinfo
+
+This chapter explains what happens when you reply and yank an original
+message from an MUA.
+
+@menu
+* Reply Buffer Initialization::
+* Filling Cited Text::
+@end menu
+@end ifinfo
+@node  Reply Buffer Initialization, Filling Cited Text, Replying and Yanking, Replying and Yanking
+@comment  node-name,  next,  previous,  up
+@findex sc-cite-original
+@findex cite-original (sc-)
+@comment
+@section Reply Buffer Initialization
+@ifinfo
+
+@end ifinfo
+Executing @code{sc-cite-original} performs the following steps as it
+initializes the reply buffer:
+
+@enumerate
+@item
+@vindex sc-pre-hook
+@vindex pre-hook (sc-)
+@emph{Runs @code{sc-pre-hook}.}
+This hook variable is run before @code{sc-cite-original} does any other
+work.  You could conceivably use this hook to set certain Supercite
+variables based on the reply buffer's mode or name (i.e., to do
+something different based on whether you are replying or following up to
+an article).@refill
+
+@item
+@emph{Inserts Supercite's keymap.}
+@vindex sc-mode-map-prefix
+@vindex mode-map-prefix (sc-)
+@kindex C-c C-p
+@cindex keymap prefix
+Supercite provides a number of commands for performing post-yank
+modifications to the reply buffer.  These commands are installed on
+Supercite's top-level keymap.  Since Supercite has to interface with a
+wide variety of MUAs, it does not install all of its commands directly
+into the reply buffer's keymap.  Instead, it puts its commands on a
+keymap prefix, then installs this prefix onto the buffer's keymap.  What
+this means is that you typically have to type more characters to invoke
+a Supercite command, but Supercite's key bindings can be made much more
+consistent across MUAs.
+
+You can control what key Supercite uses as its keymap prefix by changing
+the variable @code{sc-mode-map-prefix}.  By default, this variable is
+set to @code{C-c C-p}; a finger twister perhaps, but unfortunately the
+best default due to the scarcity of available key bindings in many MUAs.
+
+@item
+@emph{Turns on Supercite minor mode.}
+@cindex modeline
+The modeline of the reply buffer should indicate that Supercite is
+active in that buffer by displaying the string @samp{SC}.
+
+@item
+@emph{Sets the ``Undo Boundary.''}
+@cindex undo boundary
+Supercite sets an undo boundary before it begins to modify the original
+yanked text.  This allows you to easily undo Supercite's changes to
+affect alternative citing styles.
+
+@item
+@emph{Processes the mail headers.}
+@vindex sc-confirm-always-p
+@vindex confirm-always-p (sc-)
+@vindex sc-mail-warn-if-non-rfc822-p
+@vindex mail-warn-if-non-rfc822-p (sc-)
+All previously retrieved info key-value pairs are deleted from the info
+alist, then the mail headers in the body of the yanked message are
+scanned. Info key-value pairs are created for each header found. Also,
+such useful information as the author's name and email address are
+extracted.  If the variable @code{sc-mail-warn-if-non-rfc822-p} is
+non-@code{nil}, then Supercite will warn you if it finds a mail header
+that does not conform to RFC822.  This is rare and indicates a problem
+either with your MUA or the original author's MUA, or some MTA (mail
+transport agent) along the way.
+
+@vindex sc-nuke-mail-headers
+@vindex sc-nuke-mail-header-list
+@vindex nuke-mail-headers (sc-)
+@vindex nuke-mail-header-list (sc-)
+Once the info keys have been extracted from the mail headers, the
+headers are nuked from the reply buffer.  You can control exactly which
+headers are removed or kept, but by default, all headers are removed.
+
+There are two variables which control mail header nuking.  The variable
+@code{sc-nuke-mail-headers} controls the overall behavior of the header
+nuking routines.  By setting this variable to @code{'all}, you
+automatically nuke all mail headers.  Likewise, setting this variable to
+@code{'none} inhibits nuking of any mail headers.  In between these
+extremes, you can tell Supercite to nuke only a specified list of mail
+headers by setting this variable to @code{'specified}, or to keep only a
+specified list of headers by setting it to @code{'keep}.
+
+If @code{sc-nuke-mail-headers} is set to @code{'specified} or
+@code{'keep}, then the variable @code{sc-nuke-mail-header-list} is
+consulted for the list of headers to nuke or keep.  This variable
+contains a list of regular expressions.  If the mail header line matches
+a regular expression in this list, the header will be nuked or kept.
+The line is matched against the regexp using @code{looking-at} rooted at
+the beginning of the line.
+
+@vindex sc-blank-lines-after-headers
+@vindex blank-lines-after-headers (sc-)
+If the variable @code{sc-blank-lines-after-headers} is non-@code{nil},
+it contains the number of blank lines remaining in the buffer after mail
+headers are nuked.  By default, only one blank line is left in the buffer.
+
+@item
+@emph{Selects the attribution and citation strings.}
+Once the mail headers have been processed, Supercite selects a
+attribution string and a citation string which it will use to cite the
+original message.  @xref{Selecting an Attribution}, for details.
+
+@item
+@emph{Cites the message body.}
+@vindex sc-cite-region-limit
+@vindex cite-region-limit (sc-)b
+After the selection of the attribution and citation strings, Supercite
+cites the original message by inserting the citation string prefix in
+front of every uncited line.  You may not want Supercite to
+automatically cite very long messages however.  For example, some email
+could contain a smaller header section followed by a huge uuencoded
+message.  It wouldn't make sense to cite the uuencoded message part when
+responding to the original author's short preface.  For this reason,
+Supercite provides a variable which limits the automatic citation of
+long messages to a certain maximum number of lines.  The variable is
+called @code{sc-cite-region-limit}.  If this variable contains an
+integer, messages with more lines that this will not be cited at all,
+and a warning message will be displayed.  Supercite has performed
+everything necessary, though, for you to manually cite only the small
+portion of the original message that you want to use.
+
+If @code{sc-cite-region-limit} contains a non-@code{nil} value, the
+original message will always be cited, regardless of its size.  If the
+variable contains the value @code{nil}, the region will never be cited
+automatically.  Use this if you always want to be able to edit and cite
+the message manually.
+
+@vindex sc-cite-blank-lines-p
+@vindex cite-blank-lines-p (sc-)
+The variable @code{sc-cite-blank-lines-p} controls whether blank lines
+in the original message should be cited or not.  If this variable is
+non-@code{nil}, blank lines will be cited just like non-blank lines.
+Otherwise, blank lines will be treated as paragraph separators.
+
+Citing of the original message is highly configurable. Supercite's
+default setup does a pretty good job of citing many common forms of
+previously cited messages.  But there are as many citation styles out
+there as people on the net, or just about!  It would be impossible for
+Supercite to anticipate every style in existence, and you probably
+wouldn't encounter them all anyway.  But you can configure Supercite to
+recognize those styles you see often.
+@xref{Configuring the Citation Engine}, for details.@refill
+
+@item
+@emph{Runs @code{sc-post-hook}.}
+@vindex sc-post-hook
+@vindex post-hook (sc-)
+This variable is very similar to @code{sc-pre-hook}, except that it runs
+after @code{sc-cite-original} is finished. This hook is provided mostly
+for completeness and backward compatibility. Perhaps it could be used to
+reset certain variables set in @code{sc-pre-hook}.@refill
+@end enumerate
+
+@node  Filling Cited Text, Selecting an Attribution, Reply Buffer Initialization, Replying and Yanking
+@comment  node-name,  next,  previous,  up
+@cindex filling paragraphs
+@vindex sc-auto-fill-region-p
+@vindex auto-fill-region-p (sc-)
+@cindex filladapt
+@cindex gin-mode
+@findex sc-setup-filladapt
+@findex setup-filladapt (sc-)
+@vindex sc-load-hook
+@vindex load-hook (sc-)
+@section Filling Cited Text
+@ifinfo
+
+@end ifinfo
+Supercite will automatically fill newly cited text from the original
+message unless the variable @code{sc-auto-fill-region-p} has a
+@code{nil} value.  Supercite will also re-fill paragraphs when you
+manually cite or re-cite text.
+
+However, during normal editing, Supercite itself cannot be used to fill
+paragraphs.  This is a change from version 2.  There are other add-on
+lisp packages which do filling much better than Supercite ever did.  The
+two best known are @dfn{filladapt} and @dfn{gin-mode}.  Both work well
+with Supercite and both are available at the normal Emacs Lisp archive
+sites.  @dfn{gin-mode} works pretty well out of the box, but if you use
+@dfn{filladapt}, you may want to run the function
+@code{sc-setup-filladapt} from your @code{sc-load-hook}.  This simply
+makes @dfn{filladapt} a little more Supercite savvy than its default
+setup.
+
+@vindex sc-fixup-whitespace-p
+@vindex fixup-whitespace-p (sc-)
+Also, Supercite will collapse leading whitespace between the citation
+string and the text on a line when the variable
+@code{sc-fixup-whitespace-p} is non-@code{nil}.  The default value for
+this variable is @code{nil}.@refill
+
+@vindex fill-prefix
+Its important to understand that Supercite's automatic filling (during
+the initial citation of the reply) is very fragile.  That is because
+figuring out the @code{fill-prefix} for a particular paragraph is a
+really hard thing to do automatically.  This is especially the case when
+the original message contains code or some other text where leading
+whitespace is important to preserve.  For this reason, many Supercite
+users typically run with @code{sc-auto-fill-region-p} (and possibly also
+@code{sc-fixup-whitespace-p}) set to @code{nil}.  They then manually
+fill each cited paragraph in the reply buffer.
+
+I usually run with both these variables containing their default values.
+When Supercite's automatic filling breaks on a particular message, I
+will use Emacs' undo feature to undo back before the citation was
+applied to the original message.  Then I'll toggle the variables and
+manually cite those paragraphs that I don't want to fill or collapse
+whitespace on.  @xref{Variable Toggling Shortcuts}.@refill
+
+@kindex C-c C-p C-p
+If you find that Supercite's automatic filling is just too fragile for
+your tastes, you might consider one of these alternate approaches.
+Also, to make life easier, a shortcut function to toggle the state of
+both of these variables is provided on the key binding
+@kbd{C-c C-p C-p} (with the default value of @code{sc-mode-map-prefix};
+@pxref{Post-yank Formatting Commands}).@refill
+
+You will noticed that the minor mode string will
+show the state of these variables as qualifier characters. When both
+variables are @code{nil}, the Supercite minor mode string will display
+@samp{SC}.  When just @code{sc-auto-fill-region-p} is non-@code{nil}, the
+string will display @samp{SC:f}, and when just
+@code{sc-fixup-whitespace-p} is non-@code{nil}, the string will display
+@samp{SC:w}.  When both variables are non-@code{nil}, the string will
+display @samp{SC:fw}.  Note that the qualifiers chosen are mnemonics for
+the default bindings of the toggling function for each respective
+variable.
+@xref{Variable Toggling Shortcuts}.@refill
+
+Why are these variables not set to @code{nil} by default?  It is because
+many users won't manually fill paragraphs that are Supercited, and there
+have been widespread complaints on the net about mail and news messages
+containing lines greater than about 72 characters.  So the default is to
+fill cited text.
+
+@node  Selecting an Attribution, Attribution Preferences, Filling Cited Text, Top
+@comment  node-name,  next,  previous,  up
+@cindex attribution list
+@vindex sc-preferred-attribution-list
+@vindex preferred-attribution-list (sc-)
+@comment
+@chapter Selecting an Attribution
+@ifinfo
+
+@end ifinfo
+As you know, the attribution string is the part of the author's name
+that will be used to composed a non-nested citation string. Supercite
+scans the various mail headers present in the original article and uses
+a number of heuristics to extract strings which it puts into the
+@dfn{attribution association list} or @dfn{attribution alist}. This is
+analogous, but different than, the info alist previously mentioned. Each
+element in the attribution alist is a key-value pair containing such
+information as the author's first name, middle names, and last name, the
+author's initials, and the author's email terminus.
+
+@ifinfo
+@menu
+* Attribution Preferences::
+* Anonymous Attributions::
+* Author Names::
+@end menu
+@end ifinfo
+
+@node  Attribution Preferences, Anonymous Attributions, Selecting an Attribution, Selecting an Attribution
+@comment  node-name,  next,  previous,  up
+@section Attribution Preferences
+@ifinfo
+
+@end ifinfo
+When you cite an original message, you can tell Supercite which part of
+the author's name you would prefer it to use as the attribution.  The
+variable @code{sc-preferred-attribution-list} controls this; it contains
+keys which are matched against the attribution alist in the given order.
+The first value of a key that produces a non-@code{nil}, non-empty
+string match is used as the attribution string, and if no keys match, a
+secondary mechanism is used to generate the attribution.
+@xref{Anonymous Attributions}.
+
+The following preferences are always available in the attribution alist
+(barring error):
+
+@table @code
+@item "emailname"
+the author's email terminus.
+
+@item "initials"
+the author's initials.
+
+@item "firstname"
+the author's first name.
+
+@item "lastname"
+the author's last name.
+
+@item "middlename-1"
+the author's first middle name.
+
+@item "sc-lastchoice"
+the last attribution string you have selected. This is useful when you
+recite paragraphs in the reply.@refill
+
+@item "sc-consult"
+@vindex sc-attrib-selection-list
+@vindex attrib-selection-list (sc-)
+consults the customizable list @code{sc-attrib-selection-list} which can
+be used to select special attributions based on the value of any info
+key.  See below for details.
+
+@item "x-attribution"
+the original author's suggestion for attribution string choice. See below
+for details.@refill
+@end table
+
+Middle name indexes can be any positive integer greater than zero,
+though it is unlikely that many authors will have more than one middle
+name, if that many.
+
+At this point, let me digress into a discussion of etiquette.  It is my
+belief that while the style of the citations is a reflection of the
+personal tastes of the replier (i.e., you), the attribution selection is
+ultimately the personal choice of the original author.  In a sense it is
+his or her ``net nickname'', and therefore the author should have some
+say in the selection of attribution string.  Imagine how you would feel
+if someone gave you a nickname that you didn't like?
+
+For this reason, Supercite recognizes a special mail header,
+@samp{X-Attribution:}, which if present, tells Supercite the attribution
+string preferred by the original author.  It is the value of this header
+that is associated with the @code{"x-attribution"} key in the
+attribution alist.  Currently, you can override the preference of this
+key by changing @code{sc-preferred-attribution-list}, but that isn't
+polite, and in the future Supercite may hard-code this.  For now, it is
+suggested that if you change the order of the keys in this list, that
+@code{"x-attribution"} always be first, or possible second behind only
+@code{"sc-lastchoice"}.  This latter is the default.
+
+@vindex sc-attrib-selection-list
+@vindex attrib-selection-list (sc-)
+The value @code{"sc-consult"} in @code{sc-preferred-attribution-list}
+has a special meaning during attribution selection.  When Supercite
+encounters this preference, it begins processing a customizable list of
+attributions, contained in the variable @code{sc-attrib-selection-list}.
+Each element in this list contains lists of the following form:
+
+@example
+@group
+(@var{infokey} ((@var{regexp} @. @var{attribution})
+         (@var{regexp} @. @var{attribution})
+         (@dots{})))
+@end group
+@end example
+
+@noindent
+@findex sc-mail-field
+@findex mail-field (sc-)
+where @var{infokey} is a key for @code{sc-mail-field} and @var{regexp}
+is a regular expression to match against the @var{infokey}'s value. If
+@var{regexp} matches the @var{infokey}'s value, the @var{attribution} is
+used as the attribution string.  Actually, @var{attribution} can be a
+string or a list; if it is a list, it is @code{eval}uated and the return
+value (which must be a string), is used as the attribution.
+
+This can be very useful for when you are replying to net acquaintances
+who do not use the @samp{X-Attribution:@:} mail header.  You may know
+what nickname they would prefer to use, and you can set up this list to
+match against a specific mail field, e.g., @samp{From:@:}, allowing you
+to cite your friend's message with the appropriate attribution.
+
+@node  Anonymous Attributions, Author Names, Attribution Preferences, Selecting an Attribution
+@comment  node-name,  next,  previous,  up
+@vindex sc-default-author-name
+@vindex default-author-name (sc-)
+@vindex sc-default-attribution
+@vindex default-attribution (sc-)
+@comment
+@section Anonymous Attributions
+@ifinfo
+
+@end ifinfo
+When the author's name cannot be found in the @samp{From:@:} mail
+header, a fallback author name and attribution string must be supplied.
+The fallback author name is contained in the variable
+@code{sc-default-author-name} and the fallback attribution string is
+contained in the variable @code{sc-default-attribution}.  Default values
+for these variables are @code{"Anonymous"} and @code{"Anon"},
+respectively. Note that in most circumstances, getting the default
+author name or attribution is a sign that something is set up
+incorrectly.
+
+@vindex sc-use-only-preference-p
+@vindex use-only-preference-p (sc-)
+Also, if the preferred attribution, which you specified in your
+@code{sc-preferred-attribution-list} variable cannot be found, a
+secondary method can be employed to find a valid attribution string. The
+variable @code{sc-use-only-preference-p} controls what happens in this
+case.  If the variable's value is non-@code{nil}, then
+@code{sc-default-author-name} and @code{sc-default-attribution} are
+used, otherwise, the following steps are taken to find a valid
+attribution string, and the first step to return a non-@code{nil},
+non-empty string becomes the attribution:@refill
+
+@enumerate
+@item
+Use the last selected attribution, if there is one.
+
+@item
+Use the value of the @code{"x-attribution"} key.
+
+@item
+Use the author's first name.
+
+@item
+Use the author's last name.
+
+@item
+Use the author's initials.
+
+@item
+Find the first non-@code{nil}, non-empty attribution string in the
+attribution alist.
+
+@item
+@code{sc-default-attribution} is used.
+@end enumerate
+
+@vindex sc-confirm-always-p
+@vindex confirm-always-p (sc-)
+Once the attribution string has been automatically selected, a number of
+things can happen. If the variable @code{sc-confirm-always-p} is
+non-@code{nil}, you are queried for confirmation of the chosen
+attribution string. The possible values for completion are those strings
+in the attribution alist, however you are not limited to these choices.
+You can type any arbitrary string at the confirmation prompt. The string
+you enter becomes the value associated with the @code{"sc-lastchoice"}
+key in the attribution alist.
+
+@vindex sc-downcase-p
+@vindex downcase-p (sc-)
+Once an attribution string has been selected, Supercite will force the
+string to lower case if the variable @code{sc-downcase-p} is
+non-@code{nil}.
+
+@vindex sc-attribs-preselect-hook
+@vindex attribs-preselect-hook (sc-)
+@vindex sc-attribs-postselect-hook
+@vindex attribs-postselect-hook (sc-)
+
+Two hook variables provide even greater control of the attribution
+selection process.  The hook @code{sc-attribs-preselect-hook} is run
+before any attribution is selected.  Likewise, the hook
+@code{sc-attribs-postselect-hook} is run after the attribution is
+selected (and the corresponding citation string is built), but before
+these values are committed for use by Supercite.  During the
+post-selection hook, the local variables @code{attribution} and
+@code{citation} are bound to the appropriate strings.  By changing these
+variables in your hook functions, you change the attribution and
+citation strings used by Supercite.  One possible use of this would be
+to override any automatically derived attribution string when it is only
+one character long; e.g. you prefer to use @code{"initials"} but the
+author only has one name.@refill
+
+@node  Author Names, Configuring the Citation Engine, Anonymous Attributions, Selecting an Attribution
+@comment  node-name,  next,  previous,  up
+@cindex author names
+@section Author Names
+@ifinfo
+
+@end ifinfo
+Supercite employs a number of heuristics to decipher the author's name
+based on value of the @samp{From:@:} mail field of the original message.
+Supercite can recognize almost all of the common @samp{From:@:} field
+formats in use.  If you encounter a @samp{From:@:} field that Supercite
+cannot parse, please report this bug.
+@xref{The Supercite Mailing List}.@refill
+
+@vindex sc-titlecue-regexp
+@vindex titlecue-regexp (sc-)
+There are a number of Supercite variables that control how author names
+are extracted from the @samp{From:@:} header.  Some headers may contain a
+descriptive title as in:
+
+@example
+From:@: computer!speedy!doe (John Xavier-Doe -- Decent Hacker)
+@end example
+
+Supercite knows which part of the @samp{From:@:} header is email address
+and which part is author name, but in this case the string @code{"Decent
+Hacker"} is not part of the author's name.  You can tell Supercite to
+ignore the title, while still recognizing hyphenated names through the
+use of a regular expression in the variable @code{sc-titlecue-regexp}.
+This variable has the default value of @code{"\\\\s +-+\\\\s +"}.  Any
+text after this regexp is encountered is ignored as noise.
+
+@vindex sc-name-filter-alist
+@vindex name-filter-alist (sc-)
+Some @samp{From:@:} headers may contain extra titles in the name fields
+not separated by a title cue, but which are nonetheless not part of the
+author's name proper.  Examples include the titles ``Dr.'', ``Mr.'',
+``Ms.'', ``Jr.'', ``Sr.'', and ``III'' (e.g., Thurston Howe, the Third).
+Also, some companies prepend or append the name of the division,
+organization, or project on the author's name.  All of these titles are
+noise which should be ignored.  The variable @code{sc-name-filter-alist}
+is used for this purpose. As implied by its name, this variable is an
+association list, where each element is a cons cell of the form:
+
+@example
+(@var{regexp} @. @var{position})
+@end example
+
+@noindent
+where @var{regexp} is a regular expression that is matched (using
+@code{string-match}) against each element of the @samp{From:@:} field's
+author name.  @var{position} is a position indicator, starting at zero.
+Thus to strip out all titles of ``Dr.'', ``Mr.'', etc. from the name,
+@code{sc-name-filter-alist} would have an entry such as:
+
+@example
+("^\\(Mr\\|Mrs\\|Ms\\|Dr\\)[.]?$" @. 0)
+@end example
+
+@noindent
+which only removes them if they appear as the first word in the name.
+The position indicator is an integer, or one of the two special symbols
+@code{last} or @code{any}.  @code{last} always matches against the last
+word in the name field, while @code{any} matches against every word in
+the name field.
+
+@node  Configuring the Citation Engine, Using Regi, Author Names, Top
+@comment  node-name,  next,  previous,  up
+@cindex Regi
+@cindex frames (Regi)
+@cindex entries (Regi)
+@chapter Configuring the Citation Engine
+@ifinfo
+
+@end ifinfo
+At the heart of Supercite is a regular expression interpreting engine
+called @dfn{Regi}.  Regi operates by interpreting a data structure
+called a Regi-frame (or just @dfn{frame}), which is a list of
+Regi-entries (or just @dfn{entry}).  Each entry contains a predicate,
+typically a regular expression, which is matched against a line of text
+in the current buffer.  If the predicate matches true, an associated
+expression is @code{eval}uated.  In this way, an entire region of text
+can be transformed in an @emph{awk}-like manner.  Regi is used
+throughout Supercite, from mail header information extraction, to header
+nuking, to citing text.
+
+@ifinfo
+@menu
+* Using Regi::
+* Frames You Can Customize::
+@end menu
+@end ifinfo
+
+While the details of Regi are discussed below (@pxref{Using Regi}), only
+those who wish to customize certain aspects of Supercite need concern
+themselves with it.  It is important to understand though, that any
+conceivable citation style that can be described by a regular expression
+can be recognized by Supercite.  This leads to some interesting
+applications.  For example, if you regularly receive email from a
+co-worker that uses an uncommon citation style (say one that employs a
+@samp{|} or @samp{@}} character at the front of the line), it is
+possible for Supercite to recognize this and @emph{coerce} the citation
+to your preferred style, for consistency.  In theory, it is possible for
+Supercite to recognize such things as uuencoded messages or C code and
+cite or fill those differently than normal text.  None of this is
+currently part of Supercite, but contributions are welcome!
+
+@node  Using Regi, Frames You Can Customize, Configuring the Citation Engine, Configuring the Citation Engine
+@comment  node-name,  next,  previous,  up
+@findex regi-interpret
+@findex eval
+@findex looking-at
+@section Using Regi
+@ifinfo
+
+@end ifinfo
+Regi works by interpreting frames with the function
+@code{regi-interpret}.  A frame is a list of arbitrary size where each
+element is a entry of the following form:
+
+@example
+(@var{pred} @var{func} [@var{negate-p} [@var{case-fold-search}]])
+@end example
+
+Regi starts with the first entry in a frame, evaluating the @var{pred}
+of that entry against the beginning of the line that @samp{point} is on.
+If the @var{pred} evaluates to true (or false if the optional
+@var{negate-p} is non-@code{nil}), then the @var{func} for that entry is
+@code{eval}uated.  How processing continues is determined by the return
+value for @var{func}, and is described below.  If @var{pred} was false
+the next entry in the frame is checked until all entries have been
+matched against the current line.  If no entry matches, @samp{point} is
+moved forward one line and the frame is reset to the first entry.
+
+@var{pred} can be a string, a variable, a list or one of the following
+symbols: @code{t}, @code{begin}, @code{end}, or @code{every}.  If
+@var{pred} is a string, or a variable or list that @code{eval}uates to a
+string, it is interpreted as a regular expression.  This regexp is
+matched against the current line, from the beginning, using
+@code{looking-at}.  This match folds case if the optional
+@var{case-fold-search} is non-@code{nil}.  If @var{pred} is not a
+string, or does not @code{eval}uate to a string, it is interpreted as a
+binary value (@code{nil} or non-@code{nil}).@refill
+
+The four special symbol values for @var{pred} are recognized:
+
+@table @code
+@item t
+Always produces a true outcome.
+@item begin
+Always executed before the frame is interpreted. This can be used to
+initialize some global variables for example.
+@item end
+Always executed after frame interpreting is completed. This can be used
+to perform any necessary post-processing.
+@item every
+Executes whenever the frame is reset, usually after the entire frame has
+been matched against the current line.
+@end table
+
+Note that @var{negate-p} and @var{case-fold-search} are ignored if
+@var{pred} is one of these special symbols.  Only the first occurrence of
+each symbol in a frame is used; any duplicates are ignored.  Also
+note that for performance reasons, the entries associated with these
+symbols are removed from the frame during the main interpreting loop.
+
+Your @var{func} can return certain values which control continued Regi
+processing.  By default, if your @var{func} returns @code{nil} (as it
+should be careful to do explicitly), Regi will reset the frame to the
+first entry, and advance @samp{point} to the beginning of the next line.
+If a list is returned from your function, it can contain any combination
+of the following elements:@refill
+
+@table @asis
+@item the symbol @code{continue}
+This tells Regi to continue processing entries after a match, instead of
+resetting the frame and moving @samp{point}. In this way, lines of text
+can have multiple matches, but you have to be careful to avoid entering
+infinite loops.
+
+@item the symbol @code{abort}
+This tells Regi to terminate frame processing. However, any @code{end}
+entry is still processed.
+
+@item the list @code{(frame . @var{newframe})}
+This tells Regi to substitute @var{newframe} as the frame it is
+interpreting.  In other words, your @var{func} can modify the Regi frame
+on the fly.  @var{newframe} can be a variable containing a frame, or it
+can be the frame in-lined.@refill
+
+@item the list @code{(step . @var{step})}
+Tells Regi to move @var{step} number of lines forward as it continues
+processing. By default, Regi moves forward one line.  @var{step} can be
+zero or negative of course, but watch out for infinite loops.@refill
+@end table
+
+During execution of your @var{func}, the following variables will be
+temporarily bound to some useful information:@refill
+
+@table @code
+@item curline
+The current line in the buffer that Regi is @code{looking-at}, as a string.
+@item curframe
+The current frame being interpreted.
+@item curentry
+The current frame entry being interpreted.
+@end table
+
+@node  Frames You Can Customize, Post-yank Formatting Commands, Using Regi, Configuring the Citation Engine
+@comment  node-name,  next,  previous,  up
+@vindex sc-nuke-mail-header
+@section Frames You Can Customize
+@ifinfo
+
+@end ifinfo
+As mentioned earlier, Supercite uses various frames to perform
+certain jobs such as mail header information extraction and mail header
+nuking.  However, these frames are not available for you to customize,
+except through abstract interfaces such as @code{sc-nuke-mail-header},
+et al.
+
+@vindex sc-default-cite-frame
+However, the citation frames Supercite uses provide a lot of customizing
+power and are thus available to you to change to suit your needs.  The
+workhorse of citation is the frame contained in the variable
+@code{sc-default-cite-frame}.  This frame recognizes many situations,
+such as blank lines, which it interprets as paragraph separators.  It
+also recognizes previously cited nested and non-nested citations in the
+original message.  By default it will coerce non-nested citations into
+your preferred citation style, and it will add a level of citation to
+nested citations.  It will also simply cite uncited lines in your
+preferred style.
+
+@cindex unciting
+@cindex reciting
+@vindex sc-default-uncite-frame
+@vindex sc-default-recite-frame
+In a similar vein, there are default frames for @dfn{unciting} and
+@dfn{reciting}, contained in the variables
+@code{sc-default-uncite-frame} and @code{sc-default-recite-frame}
+respectively.@refill
+
+As mentioned earlier (@pxref{Recognizing Citations}), citations are
+recognized through the values of the regular expressions
+@code{sc-citation-root-regexp}, et al.  To recognize odd styles, you
+could modify these variables, or you could modify the default citing
+frame.  Alternatively, you could set up association lists of frames for
+recognizing specific alternative forms.
+
+@vindex sc-cite-frame-alist
+@vindex sc-uncite-frame-alist
+@vindex sc-recite-frame-alist
+For each of the actions -- citing, unciting, and reciting -- an alist is
+consulted to find the frame to use (@code{sc-cite-frame-alist},
+@code{sc-uncite-frame-alist}, and @code{sc-recite-frame-alist}
+respectively).  These frames can contain alists of the form:
+
+@example
+((@var{infokey} (@var{regexp} @. @var{frame}) (@var{regexp} @. @var{frame}) @dots{})
+ (@var{infokey} (@var{regexp} @. @var{frame}) (@var{regexp} @. @var{frame}) @dots{})
+ (@dots{}))
+@end example
+
+@vindex sc-mail-field
+@findex string-match
+Where @var{infokey} is a key suitable for @code{sc-mail-field},
+@var{regexp} is a regular expression which is @code{string-match}'d
+against the value of the @code{sc-mail-field} key, and @var{frame} is
+the frame to use if a match occurred.  @var{frame} can be a variable
+containing a frame or a frame in-lined.@refill
+
+When Supercite is about to cite, uncite, or recite a region, it consults
+the appropriate alist and attempts to find a frame to use.  If one
+is not found from the alist, then the appropriate default frame is used.
+
+@node  Post-yank Formatting Commands, Citing Commands, Frames You Can Customize, Top
+@comment  node-name,  next,  previous,  up
+@vindex sc-mode-map-prefix
+@vindex mode-map-prefix (sc-)
+@kindex C-c C-p
+@chapter Post-yank Formatting Commands
+@ifinfo
+
+@end ifinfo
+Once the original message has been yanked into the reply buffer, and
+@code{sc-cite-original} has had a chance to do its thing, a number of
+useful Supercite commands will be available to you. Since there is wide
+variety in the keymaps that MUAs set up in their reply buffers, it is
+next to impossible for Supercite to properly sprinkle its commands into
+the existing keymap.  For this reason Supercite places its commands on a
+separate keymap, putting this keymap onto a prefix key in the reply
+buffer. You can customize the prefix key Supercite uses by changing the
+variable @code{sc-mode-map-prefix}.  By default, the
+@code{sc-mode-map-prefix} is @kbd{C-c C-p}; granted, not a great choice,
+but unfortunately the best general solution so far.  In the rest of this
+chapter, we'll assume you've installed Supercite's keymap on the default
+prefix.@refill
+
+@ifinfo
+@menu
+* Citing Commands::
+* Insertion Commands::
+* Variable Toggling Shortcuts::
+* Mail Field Commands::
+* Miscellaneous Commands::
+@end menu
+@end ifinfo
+
+@node   Citing Commands, Insertion Commands, Post-yank Formatting Commands, Post-yank Formatting Commands
+@comment  node-name,  next,  previous,  up
+@vindex sc-cite-region-limit
+@section Commands to Manually Cite, Recite, and Uncite
+@ifinfo
+
+@end ifinfo
+Probably the three most common post-yank formatting operations that you
+will perform will be the manual citing, reciting, and unciting of
+regions of text in the reply buffer. Often you may want to recite a
+paragraph to use a nickname, or manually cite a message when setting
+@code{sc-cite-region-limit} to @code{nil}.  The following commands
+perform these functions on the region of text between @samp{point} and
+@samp{mark}.  Each of them sets the @dfn{undo boundary} before modifying
+the region so that the command can be undone in the standard Emacs
+way.@refill
+
+A quick note about Emacs 19.  Unlike in Emacs 18, the region delimited
+by @samp{point} and @samp{mark} can have two states.  It can be
+@dfn{active} or @dfn{inactive}.  Although Emacs 19 and Lucid Emacs 19
+use different terminology and functions, both employ the same convention
+such that when the region is inactive, commands that modify the region
+should generate an error.  The user needs to explicitly activate the
+region before successfully executing the command.  All Supercite
+commands conform to this convention.
+
+Here is the list of Supercite citing commands:
+
+@table @asis
+@findex sc-cite-region
+@findex cite-region (sc-)
+@kindex C-c C-p c
+@vindex sc-pre-cite-hook
+@vindex pre-cite-hook (sc-)
+@vindex sc-confirm-always-p
+@vindex confirm-always-p
+@kindex C-u
+@item @code{sc-cite-region} (@kbd{C-c C-p c})
+@comment
+This command cites each line in the region of text by interpreting the
+selected frame from @code{sc-cite-frame-alist}, or the default citing
+frame @code{sc-default-cite-frame}.  It runs the hook
+@code{sc-pre-cite-hook} before interpreting the frame.  With an optional
+universal argument (@kbd{C-u}), it temporarily sets
+@code{sc-confirm-always-p} to @code{t} so you can confirm the
+attribution string for a single manual citing.
+@xref{Configuring the Citation Engine}.@refill
+
+@findex sc-uncite-region
+@findex uncite-region (sc-)
+@kindex C-c C-p u
+@item @code{sc-uncite-region} (@kbd{C-c C-p u})
+@comment
+This command removes any citation strings from the beginning of each
+cited line in the region by interpreting the selected frame from
+@code{sc-uncite-frame-alist}, or the default unciting frame
+@code{sc-default-uncite-frame}.  It runs the hook
+@code{sc-pre-uncite-hook} before interpreting the frame.
+@xref{Configuring the Citation Engine}.@refill
+
+@findex sc-recite-region
+@findex recite-region (sc-)
+@kindex C-c C-p r
+@item @code{sc-recite-region} (@kbd{C-c C-p r})
+@comment
+This command recites each line the region by interpreting the selected
+frame from @code{sc-recite-frame-alist}, or the default reciting frame
+@code{sc-default-recite-frame}. It runs the hook
+@code{sc-pre-recite-hook} before interpreting the frame.
+@xref{Configuring the Citation Engine}.@refill
+
+@vindex sc-confirm-always-p
+@vindex confirm-always-p (sc-)
+Supercite will always ask you to confirm the attribution when reciting a
+region, regardless of the value of @code{sc-confirm-always-p}.
+@end table
+
+@node  Insertion Commands, Variable Toggling Shortcuts, Citing Commands, Post-yank Formatting Commands
+@comment  node-name,  next,  previous,  up
+@section Insertion Commands
+@ifinfo
+
+@end ifinfo
+These two functions insert various strings into the reply buffer.
+
+@table @asis
+@findex sc-insert-reference
+@findex insert-reference (sc-)
+@kindex C-c C-p w
+@item @code{sc-insert-reference} (@kbd{C-c C-p w})
+@comment
+@vindex sc-preferred-header-style
+@vindex preferred-header-style (sc-)
+Inserts a reference header into the reply buffer at @samp{point}.  With
+no arguments, the header indexed by @code{sc-preferred-header-style} is
+inserted. An optional numeric argument is the index into
+@code{sc-rewrite-header-list} indicating which reference header to
+write.@refill
+
+With just the universal argument (@kbd{C-u}), electric reference mode is
+entered, regardless of the value of @code{sc-electric-references-p}.
+
+@findex sc-insert-citation
+@findex insert-citation (sc-)
+@kindex C-c C-p i
+@item @code{sc-insert-citation} (@kbd{C-c C-p i})
+@comment
+Inserts the current citation string at the beginning of the line that
+@samp{point} is on.  If the line is already cited, Supercite will issue
+an error and will not cite the line.
+@end table
+
+@node  Variable Toggling Shortcuts, Mail Field Commands, Insertion Commands, Post-yank Formatting Commands
+@comment  node-name,  next,  previous,  up
+@cindex toggling variables
+@section Variable Toggling Shortcuts
+@ifinfo
+
+@end ifinfo
+Supercite defines a number of commands that make it easier for you to
+toggle and set various Supercite variables as you are editing the reply
+buffer.  For example, you may want to turn off filling or whitespace
+cleanup, but only temporarily.  These toggling shortcut commands make
+this easy to do.
+
+@kindex C-c C-p C-t
+Like Supercite commands in general, the toggling commands are placed on
+a keymap prefix within the greater Supercite keymap.  For the default
+value of @code{sc-mode-map-prefix}, this will be
+@kbd{C-c C-p C-t}.@refill
+
+The following commands toggle the value of certain Supercite variables
+which take only a binary value:
+
+@table @kbd
+@item C-c C-p C-t b
+Toggles the variable @code{sc-mail-nuke-blank-lines-p}.
+
+@item C-c C-p C-t c
+Toggles the variable @code{sc-confirm-always-p}.
+
+@item C-c C-p C-t d
+Toggles the variable @code{sc-downcase-p}.
+
+@item C-c C-p C-t e
+Toggles the variable @code{sc-electric-references-p}.
+
+@item C-c C-p C-t f
+Toggles the variable @code{sc-auto-fill-region-p}.
+
+@item C-c C-p C-t o
+Toggles the variable @code{sc-electric-circular-p}.
+
+@item C-c C-p C-t s
+Toggles the variable @code{sc-nested-citation-p}.
+
+@item C-c C-p C-t u
+Toggles the variable @code{sc-use-only-preferences-p}.
+
+@item C-c C-p C-t w
+Toggles the variable @code{sc-fixup-whitespace-p}.
+@end table
+
+@findex set-variable
+The following commands let you set the value of multi-value variables,
+in the same way that Emacs' @code{set-variable} does:
+
+@table @kbd
+@item C-c C-p C-t a
+Sets the value of the variable @code{sc-preferred-attribution-list}.
+
+@item C-c C-p C-t l
+Sets the value of the variable @code{sc-cite-region-limit}.
+
+@item C-c C-p C-t n
+Sets the value of the variable @code{sc-mail-nuke-mail-headers}.
+
+@item C-c C-p C-t N
+Sets the value of the variable @code{sc-mail-header-nuke-list}.
+
+@item C-c C-p C-t p
+Sets the value of the variable @code{sc-preferred-header-style}.
+@end table
+
+@kindex C-c C-p C-p
+One special command is provided to toggle both
+@code{sc-auto-fill-region-p} and @code{sc-fixup-whitespace-p} together.
+This is because you typically want to run Supercite with either variable
+as @code{nil} or non-@code{nil}.  The command to toggle these variables
+together is bound on @kbd{C-c C-p C-p}.@refill
+
+Finally, the command @kbd{C-c C-p C-t h} (also @kbd{C-c C-p C-t ?})
+brings up a Help message on the toggling keymap.
+
+
+@node  Mail Field Commands, Miscellaneous Commands, Variable Toggling Shortcuts, Post-yank Formatting Commands
+@comment  node-name,  next,  previous,  up
+@section Mail Field Commands
+@ifinfo
+
+@end ifinfo
+These commands allow you to view, modify, add, and delete various bits
+of information from the info alist.
+@xref{Information Keys and the Info Alist}.@refill
+
+@table @asis
+@kindex C-c C-p f
+@findex sc-mail-field-query
+@findex mail-field-query (sc-)
+@kindex C-c C-p f
+@item @code{sc-mail-field-query} (@kbd{C-c C-p f})
+@comment
+Allows you to interactively view, modify, add, and delete info alist
+key-value pairs.  With no argument, you are prompted (with completion)
+for a info key.  The value associated with that key is displayed in the
+minibuffer.  With an argument, this command will first ask if you want
+to view, modify, add, or delete an info key. Viewing is identical to
+running the command with no arguments.
+
+If you want to modify the value of a key, Supercite will first prompt
+you (with completion) for the key of the value you want to change.  It
+will then put you in the minibuffer with the key's current value so you
+can edit the value as you wish.  When you hit @key{RET}, the key's value
+is changed.  For those of you running Emacs 19, minibuffer history is
+kept for the values.
+
+If you choose to delete a key-value pair, Supercite will prompt you (with
+completion) for the key to delete.
+
+If you choose to add a new key-value pair, Supercite firsts prompts you
+for the key to add.  Note that completion is turned on for this prompt,
+but you can type any key name here, even one that does not yet exist.
+After entering the key, Supercite prompts you for the key's value.  It
+is not an error to enter a key that already exists, but the new value
+will override any old value.  It will not replace it though; if you
+subsequently delete the key-value pair, the old value will reappear.
+
+@findex sc-mail-process-headers
+@findex mail-process-headers (sc-)
+@kindex C-c C-p g
+@item @code{sc-mail-process-headers} (@kbd{C-c C-p g})
+@comment
+This command lets you re-initialize Supercite's info alist from any set
+of mail headers in the region between @samp{point} and @samp{mark}.
+This function is especially useful for replying to digest messages where
+Supercite will initially set up its information for the digest
+originator, but you want to cite each component article with the real
+message author.  Note that unless an error during processing occurs, any
+old information is lost.@refill
+@end table
+
+@node  Miscellaneous Commands, Information Keys and the Info Alist, Mail Field Commands, Post-yank Formatting Commands
+@comment  node-name,  next,  previous,  up
+@section Miscellaneous Commands
+@ifinfo
+
+@end ifinfo
+@table @asis
+@findex sc-open-line
+@findex open-line (sc-)
+@findex open-line
+@kindex C-c C-p o
+@item @code{sc-open-line} (@kbd{C-c C-p o})
+@comment
+Similar to Emacs' standard @code{open-line} commands, but inserts the
+citation string in front of the new line.  As with @code{open-line},
+an optional numeric argument inserts that many new lines.@refill
+
+@findex sc-describe
+@findex describe (sc-)
+@kindex C-c C-p ?
+@kindex C-c C-p h
+@item @code{sc-describe} (@kbd{C-c C-p h} and @kbd{C-c C-p ?})
+@comment
+This function has been obsoleted by the @TeX{}info manual you are now
+reading. It is still provided for compatibility, but it will eventually
+go away.
+
+@findex sc-version
+@findex version (sc-)
+@kindex C-c C-p v
+@item @code{sc-version} (@kbd{C-c C-p v})
+@comment
+Echos the version of Supercite you are using.  With the optional
+universal argument (@kbd{C-u}), this command inserts the version
+information into the current buffer.
+
+@findex sc-submit-bug-report
+@findex submit-bug-report (sc-)
+@kindex C-c C-p C-b
+@item @code{sc-submit-bug-report} (@kbd{C-c C-p C-b})
+@comment
+If you encounter a bug, or wish to suggest an enhancement, use this
+command to set up an outgoing mail buffer, with the proper address to
+the Supercite maintainer automatically inserted in the @samp{To:@:}
+field.  This command also inserts information that the Supercite
+maintainer can use to recreate your exact setup, making it easier to
+verify your bug.
+@end table
+
+@node  Hints to MUA Authors, Version 3 Changes, Electric References, Top
+@comment  node-name,  next,  previous,  up
+@chapter Hints to MUA Authors
+@ifinfo
+
+@end ifinfo
+In June of 1989, some discussion was held between the various MUA
+authors, the Supercite author, and other Supercite users. These
+discussions centered around the need for a standard interface between
+MUAs and Supercite (or any future Supercite-like packages).  This
+interface was formally proposed by Martin Neitzel on Fri, 23 Jun 89, in
+a mail message to the Supercite mailing list:
+
+@example
+       Martin> Each news/mail-reader should provide a form of
+       Martin> mail-yank-original that
+
+       Martin> 1: inserts the original message incl. header into the
+       Martin>    reply buffer; no indentation/prefixing is done, the header
+       Martin>    tends to be a "full blown" version rather than to be
+       Martin>    stripped down.
+
+       Martin> 2: `point' is at the start of the header, `mark' at the
+       Martin>    end of the message body.
+
+       Martin> 3: (run-hooks 'mail-yank-hooks)
+
+       Martin> [Supercite] should be run as such a hook and merely
+       Martin> rewrite the message.  This way it isn't anymore
+       Martin> [Supercite]'s job to gather the original from obscure
+       Martin> sources. [@dots{}]
+@end example
+
+@vindex mail-citation-hook
+@vindex mail-yank-hooks
+@cindex sendmail.el
+@findex mail-yank-original
+@findex defvar
+This specification was adopted, but with the recent release of
+Emacs 19, it has undergone a slight modification.  Instead of the
+variable @code{mail-yank-hooks}, the new preferred hook variable that
+the MUA should provide is @code{mail-citation-hook}.
+@code{mail-yank-hooks} can be provided for backward compatibility, but
+@code{mail-citation-hook} should always take precedence.  Richard
+Stallman (of the FSF) suggests that the MUAs should @code{defvar}
+@code{mail-citation-hook} to @code{nil} and perform some default citing
+when that is the case.  Take a look at Emacs 19's @file{sendmail.el}
+file, specifically the @code{mail-yank-original} defun for
+details.@refill
+
+If you are writing a new MUA package, or maintaining an existing MUA
+package, you should make it conform to this interface so that your users
+will be able to link Supercite easily and seamlessly. To do this, when
+setting up a reply or forward buffer, your MUA should follow these
+steps:
+
+@enumerate
+@item
+Insert the original message, including the mail headers into the reply
+buffer. At this point you should not modify the raw text in any way, and
+you should place all the original headers into the body of the reply.
+This means that many of the mail headers will be duplicated, one copy
+above the @code{mail-header-separator} line and one copy below,
+however there will probably be more headers below this line.@refill
+
+@item
+Set @samp{point} to the beginning of the line containing the first mail
+header in the body of the reply. Set @samp{mark} at the end of the
+message text.  It is very important that the region be set around the
+text Supercite is to modify and that the mail headers are within this
+region.  Supercite will not venture outside the region for any reason,
+and anything within the region is fair game, so don't put anything that
+@strong{must} remain unchanged inside the region.  Further note that for
+Emacs 19, the region need not be set active.  Supercite will work
+properly when the region is inactive, as should any other like-minded
+package.@refill
+
+@item
+Run the hook @code{mail-citation-hook}. You will probably want to
+provide some kind of default citation functions in cases where the user
+does not have Supercite installed.  By default, your MUA should
+@code{defvar} @code{mail-citation-hook} to @code{nil}, and in your
+yanking function, check its value.  If it finds
+@code{mail-citation-hook} to be @code{nil}, it should perform some
+default citing behavior.  User who want to connect to Supercite then
+need only add @code{sc-cite-original} to this list of hooks using
+@code{add-hook}.@refill
+@end enumerate
+
+If you do all this, your users will not need to overload your routines
+to use Supercite, and your MUA will join the ranks of those that conform
+to this interface ``out of the box.''
+
+@node Version 3 Changes, Thanks and History, Hints to MUA Authors, Top
+@comment  node-name,  next,  previous,  up
+@chapter Version 3 Changes
+@ifinfo
+
+@end ifinfo
+@cindex sc-unsupp.el file
+With version 3, Supercite has undergone an almost complete rewrite, and
+has hopefully benefited in a number of ways, including vast
+improvements in the speed of performance, a big reduction in size of the
+code and in the use of Emacs resources, and a much cleaner and flexible
+internal architecture.  The central construct of the info alist, and its
+role in Supercite has been expanded, and the other central concept, the
+general package Regi, was developed to provide a theoretically unlimited
+flexibility.
+
+But most of this work is internal and not of very great importance to the
+casual user. There have been some changes at the user-visible level,
+but for the most part, the Supercite configuration variables from
+version 2 should still be relevant to version 3.  Below, I briefly
+outline those user-visible things that have changed since version 2. For
+details, look to other sections of this manual.
+
+@enumerate
+@item
+@cindex supercite.el file
+@cindex reporter.el file
+@cindex regi.el file
+@cindex sc.el from version 2
+@cindex sc-elec.el from version 2
+Supercite proper now comes in a single file, @file{supercite.el}, which
+contains everything except the unsupported noodlings, overloading (which
+should be more or less obsolete with the release of Emacs 19), and the
+general lisp packages @file{reporter.el} and @file{regi.el}.  Finally,
+the @TeX{}info manual comes in its own file as well.  In particular, the
+file @file{sc.el} from the version 2 distribution is obsolete, as is the
+file @file{sc-elec.el}.
+
+@item
+@code{sc-spacify-name-chars} is gone in version 3.
+
+@item
+@vindex sc-attrib-selection-list
+@vindex attrib-selection-list
+@code{sc-nickname-alist} is gone in version 3.  The
+@code{sc-attrib-selection-list} is a more general construct supporting
+the same basic feature.
+
+@item
+The version 2 variable @code{sc-preferred-attribution} has been changed
+to @code{sc-preferred-attribution-list}, and has been expanded upon to
+allow you to specify an ordered list of preferred attributions.
+
+@item
+@code{sc-mail-fields-list} has been removed, and header nuking in
+general has been greatly improved, giving you wider flexibility in
+specifying which headers to keep and remove while presenting a
+simplified interface to commonly chosen defaults.
+
+@item
+Post-yank paragraph filling has been completely removed from Supercite,
+other packages just do it better than Supercite ever would.  Supercite
+will still fill newly cited paragraphs.
+
+@item
+@vindex sc-cite-region-limit
+@vindex cite-region-limit
+The variable @code{sc-all-but-cite-p} has been replaced by
+@code{sc-cite-region-limit}.
+
+@item
+Keymap hacking in the reply buffer has been greatly simplified, with, I
+believe, little reduction in functionality.
+
+@item
+Hacking of the reply buffer's docstring has been completely eliminated.
+@end enumerate
+
+@node  Thanks and History, The Supercite Mailing List, Version 3 Changes, Top
+@comment  node-name,  next,  previous,  up
+@chapter Thanks and History
+@ifinfo
+
+@end ifinfo
+The Supercite package was derived from its predecessor Superyank 1.11
+which was inspired by various bits of code and ideas from Martin Neitzel
+and Ashwin Ram. They were the folks who came up with the idea of
+non-nested citations and implemented some rough code to provide this
+style. Superyank and Supercite version 2 evolved to the point where much
+of the attribution selection mechanism was automatic, and features have
+been continuously added through the comments and suggestions of the
+Supercite mailing list participants.  Supercite version 3 represents a
+nearly complete rewrite with many of the algorithms and coding styles
+being vastly improved.  Hopefully Supercite version 3 is faster,
+smaller, and much more flexible than its predecessors.
+
+In the version 2 manual I thanked some specific people for their help in
+developing Supercite 2.  You folks know who you are and your continued
+support is greatly appreciated.  I wish to thank everyone on the
+Supercite mailing list, especially the brave alpha testers, who helped
+considerably in testing out the concepts and implementation of Supercite
+version 3.  Special thanks go out to the MUA and Emacs authors Kyle
+Jones, Stephen Gildea, Richard Stallman, and Jamie Zawinski for coming
+to a quick agreement on the new @code{mail-citation-hook} interface, and
+for adding the magic lisp to their code to support this.
+
+All who have helped and contributed have been greatly appreciated.
+
+@node  The Supercite Mailing List, GNU Free Documentation License, Thanks and History, Top
+@comment  node-name,  next,  previous,  up
+@cindex supercite mailing list address
+@cindex mailing list address
+@chapter The Supercite Mailing List
+@ifinfo
+
+@end ifinfo
+The author runs a simple mail expanding mailing list for discussion of
+issues related to Supercite. This includes enhancement requests, bug
+reports, general help questions, etc.  To subscribe or unsubscribe to
+the mailing list, send a request to the administrative address:
+
+@example
+supercite-request@@python.org
+@end example
+
+Please be sure to include the most reliable and shortest (preferably
+Internet) address back to you.  To post articles to the list, send your
+message to this address (you do not need to be a member to post, but be
+sure to indicate this in your article or replies may not be CC'd to
+you):
+
+@example
+supercite@@python.org
+@end example
+
+If you are sending bug reports, they should go to the following address,
+but @emph{please}! use the command @code{sc-submit-bug-report} since it
+will be much easier for me to duplicate your problem if you do so.  It
+will set up a mail buffer automatically with this address on the
+@samp{To:@:} line:
+
+@example
+supercite-help@@python.org
+@end example
+
+@node GNU Free Documentation License, Concept Index, The Supercite Mailing List, Top
+@appendix GNU Free Documentation License
+@include doclicense.texi
+
+@node  Concept Index, Command Index, GNU Free Documentation License, Top
+@comment  node-name,  next,  previous,  up
+@unnumbered Concept Index
+@printindex cp
+
+@node  Command Index, Key Index, Concept Index, Top
+@comment  node-name,  next,  previous,  up
+@unnumbered Command Index
+@ifinfo
+
+@end ifinfo
+Since all supercite commands are prepended with the string
+``@code{sc-}'', each appears under its @code{sc-}@var{command} name and
+its @var{command} name.
+@iftex
+@sp 2
+@end iftex
+@printindex fn
+
+@node  Key Index, Variable Index, Command Index, Top
+@comment  node-name,  next,  previous,  up
+@unnumbered Key Index
+@printindex ky
+
+@node Variable Index,  , Key Index, Top
+@comment  node-name,  next,  previous,  up
+@unnumbered Variable Index
+@ifinfo
+
+@end ifinfo
+Since all supercite variables are prepended with the string
+``@code{sc-}'', each appears under its @code{sc-}@var{variable} name and
+its @var{variable} name.
+@iftex
+@sp 2
+@end iftex
+@printindex vr
+@setchapternewpage odd
+@summarycontents
+@contents
+@bye
+
+@ignore
+   arch-tag: 0521847a-4680-44b6-ae6e-13ce20e18436
+@end ignore
similarity index 99%
rename from man/ses.texi
rename to doc/misc/ses.texi
index 089e13a9cc0250af105c1cb3e9016d989ef6c630..8e1b6f397f5f560ba0e6d14c8e51ec46091e40b9 100644 (file)
@@ -1,6 +1,6 @@
 \input texinfo   @c -*-texinfo-*-
 @c %**start of header
-@setfilename ../info/ses
+@setfilename ../../info/ses
 @settitle SES: Simple Emacs Spreadsheet
 @setchapternewpage off
 @syncodeindex fn cp
similarity index 99%
rename from man/sieve.texi
rename to doc/misc/sieve.texi
index 4b7a95be952676bab64071726633ada132b215f4..af2132e4997e8b63cd24f3a4e06cf54fb65b27bb 100644 (file)
@@ -1,6 +1,6 @@
 \input texinfo                  @c -*-texinfo-*-
 
-@setfilename ../info/sieve
+@setfilename ../../info/sieve
 @settitle Emacs Sieve Manual
 @synindex fn cp
 @synindex vr cp
similarity index 99%
rename from man/smtpmail.texi
rename to doc/misc/smtpmail.texi
index 644cd061b74f90f8a2a4fd15d43eaa331358e73f..5f5eb61a6ba6a10a857bf3eb6a42d25dbf256c6e 100644 (file)
@@ -1,5 +1,5 @@
 \input texinfo  @c -*-texinfo-*-
-@setfilename ../info/smtpmail
+@setfilename ../../info/smtpmail
 @settitle Emacs SMTP Library
 @syncodeindex vr fn
 @copying
similarity index 99%
rename from man/speedbar.texi
rename to doc/misc/speedbar.texi
index 2a05993f569bf19b231a6c340dc876eff554112e..5cefcc97df696f0daa8c3f0261f4802fc761dff3 100644 (file)
@@ -1,6 +1,6 @@
 \input texinfo   @c -*-texinfo-*-
 
-@setfilename ../info/speedbar
+@setfilename ../../info/speedbar
 @settitle Speedbar: File/Tag summarizing utility
 @syncodeindex fn cp
 
similarity index 100%
rename from man/texinfo.tex
rename to doc/misc/texinfo.tex
similarity index 98%
rename from man/tramp.texi
rename to doc/misc/tramp.texi
index b53bc59d506fe9593b0ecd02203c5bea67396e80..e5cd5e1a33b590121ef59eb7f2d4d0812a612ca5 100644 (file)
@@ -1,5 +1,5 @@
 \input texinfo   @c -*-texinfo-*-
-@setfilename ../info/tramp
+@setfilename ../../info/tramp
 @c %**start of header
 @settitle TRAMP User Manual
 @setchapternewpage odd
@@ -231,6 +231,9 @@ Things related to Version Control that don't fit elsewhere
 How file names, directories and localnames are mangled and managed
 
 * Localname deconstruction::    Breaking a localname into its components.
+@ifset emacs
+* External packages::           Integration with external Lisp packages.
+@end ifset
 
 @end detailmenu
 @end menu
@@ -2079,7 +2082,8 @@ connecting to @code{melancholia} as @code{daniel} and editing
 @file{@trampfn{, daniel, melancholia, .emacs}}.
 
 It is also possible to specify other file transfer methods
-(@pxref{Default Method}) as part of the filename.
+(@pxref{Inline methods}, @pxref{External transfer methods}) as part of
+the filename.
 @ifset emacs
 This is done by putting the method before the user and host name, as
 in @file{@value{prefix}@var{method}@value{postfixhop}} (Note the
@@ -3118,6 +3122,9 @@ system basis and the results cached to improve performance.
 
 @menu
 * Localname deconstruction::    Breaking a localname into its components.
+@ifset emacs
+* External packages::           Integration with external Lisp packages.
+@end ifset
 @end menu
 
 
@@ -3137,6 +3144,33 @@ This allows the platform specific hacks in the original handlers to take
 effect while preserving the @value{tramp} file name information.
 
 
+@ifset emacs
+@node External packages
+@section Integration with external Lisp packages.
+
+While reading filenames in the minibuffer, @value{tramp} must decide
+whether it completes possible incomplete filenames, or not.  Imagine
+there is the following situation: You have typed @kbd{C-x C-f
+@value{prefix}ssh@value{postfixhop} @key{TAB}}.  @value{tramp} cannot
+know, whether @option{ssh} is a method or a host name.  It checks
+therefore the last input character you have typed.  If this is
+@key{TAB}, @key{SPACE} or @kbd{?}, @value{tramp} assumes that you are
+still in filename completion, and it does not connect to the possible
+remote host @option{ssh}.
+
+@vindex tramp-completion-mode
+External packages, which use other characters for completing filenames
+in the minibuffer, must signal this to @value{tramp}.  For this case,
+the variable @code{tramp-completion-mode} can be bound temporarily to
+a non-nil value.
+
+@lisp
+(let ((tramp-completion-mode t))
+  ...)
+@end lisp
+@end ifset
+
+
 @node Traces and Profiles
 @chapter How to Customize Traces
 
diff --git a/doc/misc/trampver.texi b/doc/misc/trampver.texi
new file mode 100644 (file)
index 0000000..4ed196a
--- /dev/null
@@ -0,0 +1,62 @@
+@c -*-texinfo-*-
+@c texi/trampver.texi.  Generated from trampver.texi.in by configure.
+
+@c In the Tramp CVS, the version number is auto-frobbed from
+@c configure.ac, so you should edit that file and run
+@c "autoconf && ./configure" to change the version number.
+@set trampver 2.1.11-pre
+
+@c Other flags from configuration
+@set instprefix /usr/local
+@set lispdir /usr/local/share/emacs/site-lisp
+@set infodir /usr/local/info
+
+@c Formatting of the tramp program name consistent.
+@set tramp @sc{tramp}
+
+@c Whether or not describe gateway methods.
+@ifclear noemacsgw
+@set emacsgw
+@end ifclear
+
+@c Some flags which make the text independent on the (X)Emacs flavor.
+@c "emacs" resp "xemacs" are set in the Makefile.  Default is "emacs".
+@ifclear emacs
+@ifclear xemacs
+@set emacs
+@end ifclear
+@end ifclear
+
+@c Emacs values.
+@ifset emacs
+@set emacsname          GNU Emacs
+@set emacsdir           emacs
+@set ftppackagename     Ange-FTP
+@set prefix             /
+@set prefixhop
+@set postfix            :
+@set postfixhop         :
+@set emacsothername     XEmacs
+@set emacsotherdir      xemacs
+@set emacsotherfilename tramp-xemacs.html
+@set japanesemanual     tramp_ja-emacs.html
+@end ifset
+
+@c XEmacs counterparts.
+@ifset xemacs
+@set emacsname          XEmacs
+@set emacsdir           xemacs
+@set ftppackagename     EFS
+@set prefix             /[
+@set prefixhop          [
+@set postfix            ]
+@set postfixhop         /
+@set emacsothername     GNU Emacs
+@set emacsotherdir      emacs
+@set emacsotherfilename tramp-emacs.html
+@set japanesemanual     tramp_ja-xemacs.html
+@end ifset
+
+@ignore
+   arch-tag: e0fe322c-e06b-46eb-bb5b-d091b521f41c
+@end ignore
similarity index 99%
rename from man/url.texi
rename to doc/misc/url.texi
index 0fc6b08acdcfe79e11d381dd64d53a2b4ce071f6..2948793eed8a1b984657ee03252a63b2e4c33111 100644 (file)
@@ -1,5 +1,5 @@
 \input texinfo
-@setfilename ../info/url
+@setfilename ../../info/url
 @settitle URL Programmer's Manual
 
 @iftex
similarity index 99%
rename from man/vip.texi
rename to doc/misc/vip.texi
index a3f4a447f828be7ecb588dac992bac8ed45eb38d..4b27df5b0457fc5a547b25d02dadf555ece53129 100644 (file)
@@ -1,6 +1,6 @@
 \input texinfo
 
-@setfilename ../info/vip
+@setfilename ../../info/vip
 @settitle VIP
 
 @copying
similarity index 99%
rename from man/viper.texi
rename to doc/misc/viper.texi
index 55c97f18c9c17d1c2c19636f819cc08b49ee3b69..c86b2383168e5b98626fc9e1ef3876a8ae7368cd 100644 (file)
@@ -4,7 +4,7 @@
 @comment Using viper.info instead of viper in setfilename breaks DOS.
 @comment @setfilename viper
 @comment @setfilename viper.info
-@setfilename ../info/viper
+@setfilename ../../info/viper
 
 @copying
 Copyright @copyright{} 1995, 1996, 1997, 2001, 2002, 2003, 2004,
@@ -1745,7 +1745,8 @@ Setting this variable too high may slow down your typing.  Setting it too
 low may make it hard to type macros quickly enough.
 @item viper-translate-all-ESC-keysequences @code{t} on tty, @code{nil} on windowing display
 Normally, Viper lets Emacs translate only those ESC key sequences that are
-defined in the low-level key-translation-map or function-key-map, such as those
+defined in the low-level @code{input-decode-map}, @code{key-translation-map}
+or @code{function-key-map}, such as those
 emitted by the arrow and function keys. Other sequences, e.g., @kbd{\\e/}, are
 treated as @kbd{ESC} command followed by a @kbd{/}. This is good for people
 who type fast and tend to hit other characters right after they hit
@@ -2009,12 +2010,12 @@ not emit the right signals for Emacs to understand.  To let Emacs know about
 those keys, you will have to find out which key sequences they emit
 by typing @kbd{C-q} and then the key (you should switch to Emacs state
 first).  Then you can bind those sequences to their preferred forms using
-@code{function-key-map} as follows:
+@code{input-decode-map} as follows:
 
 @lisp
 (cond ((string= (getenv "TERM") "xterm")
-(define-key function-key-map "\e[192z" [f11])    ; L1
-(define-key function-key-map "\e[195z" [f14])    ; L4, Undo
+(define-key input-decode-map "\e[192z" [f11])    ; L1
+(define-key input-decode-map "\e[195z" [f14])    ; L4, Undo
 @end lisp
 
 The above illustrates how to do this for Xterm.  On VT100, you would have to
@@ -2206,6 +2207,7 @@ So much about Viper-specific bindings.
 Manual}, and the Emacs quick reference card for the general info on key
 bindings in Emacs.
 
+@vindex @code{input-decode-map}
 @vindex @code{function-key-map}
 @vindex @code{viper-vi-global-user-map}
 @vindex @code{viper-insert-global-user-map}
diff --git a/doc/misc/widget.texi b/doc/misc/widget.texi
new file mode 100644 (file)
index 0000000..35f0722
--- /dev/null
@@ -0,0 +1,1855 @@
+\input texinfo.tex
+
+@c %**start of header
+@setfilename ../../info/widget
+@settitle The Emacs Widget Library
+@syncodeindex fn cp
+@syncodeindex vr cp
+@syncodeindex ky cp
+@afourpaper
+@c %**end of header
+
+@copying
+Copyright @copyright{} 2000, 2001, 2002, 2003, 2004, 2005,
+2006, 2007  Free Software Foundation, Inc.
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with the
+Invariant Sections being ``The GNU Manifesto'', ``Distribution'' and
+``GNU GENERAL PUBLIC LICENSE'', with the Front-Cover texts being ``A GNU
+Manual'', and with the Back-Cover Texts as in (a) below.  A copy of the
+license is included in the section entitled ``GNU Free Documentation
+License'' in the Emacs manual.
+
+This document is part of a collection distributed under the GNU Free
+Documentation License.  If you want to distribute this document
+separately from the collection, you can do so by adding a copy of the
+license to the document, as described in section 6 of the license.
+
+(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
+this GNU Manual, like GNU software.  Copies published by the Free
+Software Foundation raise funds for GNU development.''
+@end quotation
+@end copying
+
+@dircategory Emacs
+@direntry
+* Widget: (widget).      The "widget" package used by the Emacs Customization
+                           facility.
+@end direntry
+
+@node Top, Introduction, (dir), (dir)
+@comment  node-name,  next,  previous,  up
+@top The Emacs Widget Library
+
+@menu
+* Introduction::
+* User Interface::
+* Programming Example::
+* Setting Up the Buffer::
+* Basic Types::
+* Sexp Types::
+* Widget Properties::
+* Defining New Widgets::
+* Widget Browser::
+* Widget Minor Mode::
+* Utilities::
+* Widget Wishlist::
+* GNU Free Documentation License::
+* Index::
+@end menu
+
+@node  Introduction, User Interface, Top, Top
+@comment  node-name,  next,  previous,  up
+@section Introduction
+
+Most graphical user interface toolkits provide a number of standard
+user interface controls (sometimes known as `widgets' or `gadgets').
+Emacs doesn't really support anything like this, except for an
+incredibly powerful text ``widget.''  On the other hand, Emacs does
+provide the necessary primitives to implement many other widgets
+within a text buffer.  The @code{widget} package simplifies this task.
+
+@cindex basic widgets
+@cindex widgets, basic types
+The basic widgets are:
+
+@table @code
+@item link
+Areas of text with an associated action.  Intended for hypertext links
+embedded in text.
+@item push-button
+Like link, but intended for stand-alone buttons.
+@item editable-field
+An editable text field.  It can be either variable or fixed length.
+@item menu-choice
+Allows the user to choose one of multiple options from a menu, each
+option is itself a widget.  Only the selected option will be visible in
+the buffer.
+@item radio-button-choice
+Allows the user to choose one of multiple options by activating radio
+buttons.  The options are implemented as widgets.  All options will be
+visible in the buffer.
+@item item
+A simple constant widget intended to be used in the @code{menu-choice} and
+@code{radio-button-choice} widgets.
+@item choice-item
+A button item only intended for use in choices.  When invoked, the user
+will be asked to select another option from the choice widget.
+@item toggle
+A simple @samp{on}/@samp{off} switch.
+@item checkbox
+A checkbox (@samp{[ ]}/@samp{[X]}).
+@item editable-list
+Create an editable list.  The user can insert or delete items in the
+list.  Each list item is itself a widget.
+@end table
+
+Now, of what possible use can support for widgets be in a text editor?
+I'm glad you asked.  The answer is that widgets are useful for
+implementing forms.  A @dfn{form} in Emacs is a buffer where the user is
+supposed to fill out a number of fields, each of which has a specific
+meaning.  The user is not supposed to change or delete any of the text
+between the fields.  Examples of forms in Emacs are the @file{forms}
+package (of course), the customize buffers, the mail and news compose
+modes, and the @acronym{HTML} form support in the @file{w3} browser.
+
+@cindex widget library, why use it
+The advantages for a programmer of using the @code{widget} package to
+implement forms are:
+
+@enumerate
+@item
+More complex fields than just editable text are supported.
+@item
+You can give the users immediate feedback if they enter invalid data in a
+text field, and sometimes prevent entering invalid data.
+@item
+You can have fixed sized fields, thus allowing multiple fields to be
+lined up in columns.
+@item
+It is simple to query or set the value of a field.
+@item
+Editing happens in the buffer, not in the mini-buffer.
+@item
+Packages using the library get a uniform look, making them easier for
+the user to learn.
+@item
+As support for embedded graphics improve, the widget library will be
+extended to use the GUI features.  This means that your code using the
+widget library will also use the new graphic features automatically.
+@end enumerate
+
+In order to minimize the code that is loaded by users who do not
+create any widgets, the code has been split in two files:
+
+@cindex widget library, files
+@table @file
+@item widget.el
+This will declare the user variables, define the function
+@code{define-widget}, and autoload the function @code{widget-create}.
+@item wid-edit.el
+Everything else is here, there is no reason to load it explicitly, as
+it will be autoloaded when needed.
+@end table
+
+@node User Interface, Programming Example, Introduction, Top
+@comment  node-name,  next,  previous,  up
+@section User Interface
+
+A form consists of read only text for documentation and some fields,
+where each field contains two parts, a tag and a value.  The tags are
+used to identify the fields, so the documentation can refer to the
+@samp{foo field}, meaning the field tagged with @samp{Foo}. Here is an
+example form:
+
+@example
+Here is some documentation.
+
+Name: @i{My Name}     @strong{Choose}: This option
+Address:  @i{Some Place
+In some City
+Some country.}
+
+See also @b{_other work_} for more information.
+
+Numbers: count to three below
+@b{[INS]} @b{[DEL]} @i{One}
+@b{[INS]} @b{[DEL]} @i{Eh, two?}
+@b{[INS]} @b{[DEL]} @i{Five!}
+@b{[INS]}
+
+Select multiple:
+
+@b{[X]} This
+@b{[ ]} That
+@b{[X]} Thus
+
+Select one:
+
+@b{(*)} One
+@b{( )} Another One.
+@b{( )} A Final One.
+
+@b{[Apply Form]} @b{[Reset Form]}
+@end example
+
+The top level widgets in this example are tagged @samp{Name},
+@samp{Choose}, @samp{Address}, @samp{_other work_}, @samp{Numbers},
+@samp{Select multiple}, @samp{Select one}, @samp{[Apply Form]}, and
+@samp{[Reset Form]}.  There are basically two things the user can do
+within a form, namely editing the editable text fields and activating
+the buttons.
+
+@subsection Editable Text Fields
+
+In the example, the value for the @samp{Name} is most likely displayed
+in an editable text field, and so are values for each of the members of
+the @samp{Numbers} list.  All the normal Emacs editing operations are
+available for editing these fields.  The only restriction is that each
+change you make must be contained within a single editable text field.
+For example, capitalizing all text from the middle of one field to the
+middle of another field is prohibited.
+
+Editable text fields are created by the @code{editable-field} widget.
+
+@strong{Warning:} In an @code{editable-field} widget, the editable
+field must not be adjacent to another widget---that won't work.
+You must put some text in between.  Either make this text part of
+the @code{editable-field} widget itself, or insert it with
+@code{widget-insert}.
+
+The @code{:format} keyword is useful for generating the necessary
+text; for instance, if you give it a value of @code{"Name: %v "},
+the @samp{Name: } part will provide the necessary separating text
+before the field and the trailing space will provide the
+separating text after the field.  If you don't include the
+@code{:size} keyword, the field will extend to the end of the
+line, and the terminating newline will provide separation after.
+
+@strong{Warning:} In an @code{editable-field} widget, the @samp{%v} escape
+must be preceded by some other text in the @code{:format} string
+(if specified).
+
+The editing text fields are highlighted with the
+@code{widget-field-face} face, making them easy to find.
+
+@deffn Face widget-field-face
+Face used for other editing fields.
+@end deffn
+
+@subsection Buttons
+
+@cindex widget buttons
+@cindex button widgets
+Some portions of the buffer have an associated @dfn{action}, which can
+be @dfn{invoked} by a standard key or mouse command.  These portions
+are called @dfn{buttons}.  The default commands for activating a button
+are:
+
+@table @kbd
+@item @key{RET}
+@deffn Command widget-button-press @var{pos} &optional @var{event}
+Invoke the button at @var{pos}, defaulting to point.
+If point is not located on a button, invoke the binding in
+@code{widget-global-map} (by default the global map).
+@end deffn
+
+@kindex Mouse-2 @r{(on button widgets})
+@item Mouse-2
+@deffn Command widget-button-click @var{event}
+Invoke the button at the location of the mouse pointer.  If the mouse
+pointer is located in an editable text field, invoke the binding in
+@code{widget-global-map} (by default the global map).
+@end deffn
+@end table
+
+There are several different kind of buttons, all of which are present in
+the example:
+
+@table @emph
+@cindex option field tag
+@item The Option Field Tags
+When you invoke one of these buttons, you will be asked to choose
+between a number of different options.  This is how you edit an option
+field.  Option fields are created by the @code{menu-choice} widget.  In
+the example, @samp{@b{Choose}} is an option field tag.
+@item The @samp{@b{[INS]}} and @samp{@b{[DEL]}} buttons
+Activating these will insert or delete elements from an editable list.
+The list is created by the @code{editable-list} widget.
+@cindex embedded buttons
+@item Embedded Buttons
+The @samp{@b{_other work_}} is an example of an embedded
+button.  Embedded buttons are not associated with any fields, but can serve
+any purpose, such as implementing hypertext references.  They are
+usually created by the @code{link} widget.
+@item The @samp{@b{[ ]}} and @samp{@b{[X]}} buttons
+Activating one of these will convert it to the other.  This is useful
+for implementing multiple-choice fields.  You can create them with the
+@code{checkbox} widget.
+@item The @samp{@b{( )}} and @samp{@b{(*)}} buttons
+Only one radio button in a @code{radio-button-choice} widget can be
+selected at any time.  When you invoke one of the unselected radio
+buttons, it will be selected and the previous selected radio button will
+become unselected.
+@item The @samp{@b{[Apply Form]}} and @samp{@b{[Reset Form]}} buttons
+These are explicit buttons made with the @code{push-button} widget.  The
+main difference from the @code{link} widget is that the buttons will be
+displayed as GUI buttons when possible.
+@end table
+
+To make them easier to locate, buttons are emphasized in the buffer.
+
+@deffn Face widget-button-face
+Face used for buttons.
+@end deffn
+
+@defopt widget-mouse-face
+Face used for highlighting a button when the mouse pointer moves across
+it.
+@end defopt
+
+@subsection Navigation
+
+You can use all the normal Emacs commands to move around in a form
+buffer, plus you will have these additional commands:
+
+@table @kbd
+@item @key{TAB}
+@deffn Command widget-forward &optional count
+Move point @var{count} buttons or editing fields forward.
+@end deffn
+@item @kbd{M-@key{TAB}}
+@itemx @kbd{S-@key{TAB}}
+@deffn Command widget-backward &optional count
+Move point @var{count} buttons or editing fields backward.
+@end deffn
+@end table
+
+@node Programming Example, Setting Up the Buffer, User Interface, Top
+@comment  node-name,  next,  previous,  up
+@section Programming Example
+
+@cindex widgets, programming example
+@cindex example of using widgets
+Here is the code to implement the user interface example (@pxref{User
+Interface}).
+
+@lisp
+(require 'widget)
+
+(eval-when-compile
+  (require 'wid-edit))
+
+(defvar widget-example-repeat)
+
+(defun widget-example ()
+  "Create the widgets from the Widget manual."
+  (interactive)
+  (switch-to-buffer "*Widget Example*")
+  (kill-all-local-variables)
+  (make-local-variable 'widget-example-repeat)
+  (let ((inhibit-read-only t))
+    (erase-buffer))
+  (remove-overlays)
+  (widget-insert "Here is some documentation.\n\n")
+  (widget-create 'editable-field
+                :size 13
+                :format "Name: %v " ; Text after the field!
+                "My Name")
+  (widget-create 'menu-choice
+                :tag "Choose"
+                :value "This"
+                :help-echo "Choose me, please!"
+                :notify (lambda (widget &rest ignore)
+                          (message "%s is a good choice!"
+                                   (widget-value widget)))
+                '(item :tag "This option" :value "This")
+                '(choice-item "That option")
+                '(editable-field :menu-tag "No option" "Thus option"))
+  (widget-create 'editable-field
+                :format "Address: %v"
+                "Some Place\nIn some City\nSome country.")
+  (widget-insert "\nSee also ")
+  (widget-create 'link
+                :notify (lambda (&rest ignore)
+                          (widget-value-set widget-example-repeat
+                                            '("En" "To" "Tre"))
+                          (widget-setup))
+                "other work")
+  (widget-insert
+    " for more information.\n\nNumbers: count to three below\n")
+  (setq widget-example-repeat
+       (widget-create 'editable-list
+                      :entry-format "%i %d %v"
+                      :notify (lambda (widget &rest ignore)
+                                (let ((old (widget-get widget
+                                                       ':example-length))
+                                      (new (length (widget-value widget))))
+                                  (unless (eq old new)
+                                    (widget-put widget ':example-length new)
+                                    (message "You can count to %d." new))))
+                      :value '("One" "Eh, two?" "Five!")
+                      '(editable-field :value "three")))
+  (widget-insert "\n\nSelect multiple:\n\n")
+  (widget-create 'checkbox t)
+  (widget-insert " This\n")
+  (widget-create 'checkbox nil)
+  (widget-insert " That\n")
+  (widget-create 'checkbox
+                :notify (lambda (&rest ignore) (message "Tickle"))
+                t)
+  (widget-insert " Thus\n\nSelect one:\n\n")
+  (widget-create 'radio-button-choice
+                :value "One"
+                :notify (lambda (widget &rest ignore)
+                          (message "You selected %s"
+                                   (widget-value widget)))
+                '(item "One") '(item "Another One.") '(item "A Final One."))
+  (widget-insert "\n")
+  (widget-create 'push-button
+                :notify (lambda (&rest ignore)
+                          (if (= (length (widget-value widget-example-repeat))
+                                 3)
+                              (message "Congratulation!")
+                            (error "Three was the count!")))
+                "Apply Form")
+  (widget-insert " ")
+  (widget-create 'push-button
+                :notify (lambda (&rest ignore)
+                          (widget-example))
+                "Reset Form")
+  (widget-insert "\n")
+  (use-local-map widget-keymap)
+  (widget-setup))
+@end lisp
+
+@node Setting Up the Buffer, Basic Types, Programming Example, Top
+@comment  node-name,  next,  previous,  up
+@section Setting Up the Buffer
+
+Widgets are created with @code{widget-create}, which returns a
+@dfn{widget} object.  This object can be queried and manipulated by
+other widget functions, until it is deleted with @code{widget-delete}.
+After the widgets have been created, @code{widget-setup} must be called
+to enable them.
+
+@defun widget-create type [ keyword argument ]@dots{}
+Create and return a widget of type @var{type}.
+The syntax for the @var{type} argument is described in @ref{Basic Types}.
+
+The keyword arguments can be used to overwrite the keyword arguments
+that are part of @var{type}.
+@end defun
+
+@defun widget-delete widget
+Delete @var{widget} and remove it from the buffer.
+@end defun
+
+@defun widget-setup
+Set up a buffer to support widgets.
+
+This should be called after creating all the widgets and before allowing
+the user to edit them.
+@refill
+@end defun
+
+If you want to insert text outside the widgets in the form, the
+recommended way to do that is with @code{widget-insert}.
+
+@defun widget-insert
+Insert the arguments, either strings or characters, at point.
+The inserted text will be read-only.
+@end defun
+
+There is a standard widget keymap which you might find useful.
+
+@findex widget-button-press
+@findex widget-button-click
+@defvr Const widget-keymap
+A keymap with the global keymap as its parent.@*
+@key{TAB} and @kbd{C-@key{TAB}} are bound to @code{widget-forward} and
+@code{widget-backward}, respectively.  @key{RET} and @kbd{Mouse-2}
+are bound to @code{widget-button-press} and
+@code{widget-button-click}.@refill
+@end defvr
+
+@defvar widget-global-map
+Keymap used by @code{widget-button-press} and @code{widget-button-click}
+when not on a button.  By default this is @code{global-map}.
+@end defvar
+
+@node Basic Types, Sexp Types, Setting Up the Buffer, Top
+@comment  node-name,  next,  previous,  up
+@section Basic Types
+
+This is the general syntax of a type specification:
+
+@example
+@var{name} ::= (@var{name} [@var{keyword} @var{argument}]... @var{args})
+     |   @var{name}
+@end example
+
+Where, @var{name} is a widget name, @var{keyword} is the name of a
+property, @var{argument} is the value of the property, and @var{args}
+are interpreted in a widget specific way.
+
+@cindex keyword arguments
+The following keyword arguments apply to all widgets:
+
+@table @code
+@vindex value@r{ keyword}
+@item :value
+The initial value for widgets of this type.
+
+@vindex format@r{ keyword}
+@item :format
+This string will be inserted in the buffer when you create a widget.
+The following @samp{%} escapes are available:
+
+@table @samp
+@item %[
+@itemx %]
+The text inside will be marked as a button.
+
+By default, the text will be shown in @code{widget-button-face}, and
+surrounded by brackets.
+
+@defopt widget-button-prefix
+String to prefix buttons.
+@end defopt
+
+@defopt widget-button-suffix
+String to suffix buttons.
+@end defopt
+
+@item %@{
+@itemx %@}
+The text inside will be displayed with the face specified by
+@code{:sample-face}.
+
+@item %v
+This will be replaced with the buffer representation of the widget's
+value.  What this is depends on the widget type.
+
+@strong{Warning:} In an @code{editable-field} widget, the @samp{%v} escape
+must be preceded by some other text in the format string (if specified).
+
+@item %d
+Insert the string specified by @code{:doc} here.
+
+@item %h
+Like @samp{%d}, with the following modifications: If the documentation
+string is more than one line, it will add a button which will toggle
+between showing only the first line, and showing the full text.
+Furthermore, if there is no @code{:doc} property in the widget, it will
+instead examine the @code{:documentation-property} property.  If it is a
+lambda expression, it will be called with the widget's value as an
+argument, and the result will be used as the documentation text.
+
+@item %t
+Insert the string specified by @code{:tag} here, or the @code{princ}
+representation of the value if there is no tag.
+
+@item %%
+Insert a literal @samp{%}.
+@end table
+
+@vindex button-face@r{ keyword}
+@item :button-face
+Face used to highlight text inside %[ %] in the format.
+
+@vindex button-prefix@r{ keyword}
+@vindex button-suffix@r{ keyword}
+@item :button-prefix
+@itemx :button-suffix
+Text around %[ %] in the format.
+
+These can be
+@table @emph
+@item nil
+No text is inserted.
+
+@item a string
+The string is inserted literally.
+
+@item a symbol
+The value of the symbol is expanded according to this table.
+@end table
+
+@vindex doc@r{ keyword}
+@item :doc
+The string inserted by the @samp{%d} escape in the format
+string.
+
+@vindex tag@r{ keyword}
+@item :tag
+The string inserted by the @samp{%t} escape in the format
+string.
+
+@vindex tag-glyph@r{ keyword}
+@item :tag-glyph
+Name of image to use instead of the string specified by @code{:tag} on
+Emacsen that supports it.
+
+@vindex help-echo@r{ keyword}
+@item :help-echo
+Specifies how to display a message whenever you move to the widget with
+either @code{widget-forward} or @code{widget-backward} or move the mouse
+over it (using the standard @code{help-echo} mechanism).  The argument
+is either a string to display, a function of one argument, the widget,
+which should return a string to display, or a form that evaluates to
+such a string.
+
+@vindex follow-link@r{ keyword}
+@item :follow-link
+Specifies how to interpret a @key{mouse-1} click on the widget.
+@xref{Links and Mouse-1,,, elisp, the Emacs Lisp Reference Manual}.
+
+@vindex indent@r{ keyword}
+@item :indent
+An integer indicating the absolute number of spaces to indent children
+of this widget.
+
+@vindex offset@r{ keyword}
+@item :offset
+An integer indicating how many extra spaces to add to the widget's
+grandchildren compared to this widget.
+
+@vindex extra-offset@r{ keyword}
+@item :extra-offset
+An integer indicating how many extra spaces to add to the widget's
+children compared to this widget.
+
+@vindex notify@r{ keyword}
+@item :notify
+A function called each time the widget or a nested widget is changed.
+The function is called with two or three arguments.  The first argument
+is the widget itself, the second argument is the widget that was
+changed, and the third argument is the event leading to the change, if
+any.
+
+@vindex menu-tag@r{ keyword}
+@item :menu-tag
+Tag used in the menu when the widget is used as an option in a
+@code{menu-choice} widget.
+
+@vindex menu-tag-get@r{ keyword}
+@item :menu-tag-get
+Function used for finding the tag when the widget is used as an option
+in a @code{menu-choice} widget.  By default, the tag used will be either the
+@code{:menu-tag} or @code{:tag} property if present, or the @code{princ}
+representation of the @code{:value} property if not.
+
+@vindex match@r{ keyword}
+@item :match
+Should be a function called with two arguments, the widget and a value,
+and returning non-@code{nil} if the widget can represent the specified value.
+
+@vindex validate@r{ keyword}
+@item :validate
+A function which takes a widget as an argument, and returns @code{nil}
+if the widget's current value is valid for the widget.  Otherwise it
+should return the widget containing the invalid data, and set that
+widget's @code{:error} property to a string explaining the error.
+
+The following predefined function can be used:
+
+@defun widget-children-validate widget
+All the @code{:children} of @var{widget} must be valid.
+@end defun
+
+@vindex tab-order@r{ keyword}
+@item :tab-order
+Specify the order in which widgets are traversed with
+@code{widget-forward} or @code{widget-backward}.  This is only partially
+implemented.
+
+@enumerate a
+@item
+Widgets with tabbing order @code{-1} are ignored.
+
+@item
+(Unimplemented) When on a widget with tabbing order @var{n}, go to the
+next widget in the buffer with tabbing order @var{n+1} or @code{nil},
+whichever comes first.
+
+@item
+When on a widget with no tabbing order specified, go to the next widget
+in the buffer with a positive tabbing order, or @code{nil}
+@end enumerate
+
+@vindex parent@r{ keyword}
+@item :parent
+The parent of a nested widget (e.g.@: a @code{menu-choice} item or an
+element of a @code{editable-list} widget).
+
+@vindex sibling-args@r{ keyword}
+@item :sibling-args
+This keyword is only used for members of a @code{radio-button-choice} or
+@code{checklist}.  The value should be a list of extra keyword
+arguments, which will be used when creating the @code{radio-button} or
+@code{checkbox} associated with this item.
+
+@end table
+
+@deffn {User Option} widget-glyph-directory
+Directory where glyphs are found.
+Widget will look here for a file with the same name as specified for the
+image, with either a @file{.xpm} (if supported) or @file{.xbm} extension.
+@end deffn
+
+@deffn{User Option} widget-glyph-enable
+If non-@code{nil}, allow glyphs to appear on displays where they are supported.
+@end deffn
+
+
+@menu
+* link::
+* url-link::
+* info-link::
+* push-button::
+* editable-field::
+* text::
+* menu-choice::
+* radio-button-choice::
+* item::
+* choice-item::
+* toggle::
+* checkbox::
+* checklist::
+* editable-list::
+* group::
+@end menu
+
+@node link, url-link, Basic Types, Basic Types
+@comment  node-name,  next,  previous,  up
+@subsection The @code{link} Widget
+@findex link@r{ widget}
+
+Syntax:
+
+@example
+@var{type} ::= (link [@var{keyword} @var{argument}]...  [ @var{value} ])
+@end example
+
+The @var{value}, if present, is used to initialize the @code{:value}
+property.  The value should be a string, which will be inserted in the
+buffer.
+
+By default the link will be shown in brackets.
+
+@defopt widget-link-prefix
+String to prefix links.
+@end defopt
+
+@defopt widget-link-suffix
+String to suffix links.
+@end defopt
+
+@node url-link, info-link, link, Basic Types
+@comment  node-name,  next,  previous,  up
+@subsection The @code{url-link} Widget
+@findex url-link@r{ widget}
+
+Syntax:
+
+@example
+@var{type} ::= (url-link [@var{keyword} @var{argument}]...  @var{url})
+@end example
+
+@findex browse-url-browser-function@r{, and @code{url-link} widget}
+When this link is invoked, the @acronym{WWW} browser specified by
+@code{browse-url-browser-function} will be called with @var{url}.
+
+@node info-link, push-button, url-link, Basic Types
+@comment  node-name,  next,  previous,  up
+@subsection The @code{info-link} Widget
+@findex info-link@r{ widget}
+
+Syntax:
+
+@example
+@var{type} ::= (info-link [@var{keyword} @var{argument}]...  @var{address})
+@end example
+
+When this link is invoked, the built-in Info reader is started on
+@var{address}.
+
+@node  push-button, editable-field, info-link, Basic Types
+@comment  node-name,  next,  previous,  up
+@subsection The @code{push-button} Widget
+@findex push-button@r{ widget}
+
+Syntax:
+
+@example
+@var{type} ::= (push-button [@var{keyword} @var{argument}]...  [ @var{value} ])
+@end example
+
+The @var{value}, if present, is used to initialize the @code{:value}
+property.  The value should be a string, which will be inserted in the
+buffer.
+
+By default the tag will be shown in brackets.
+
+@defopt widget-push-button-prefix
+String to prefix push buttons.
+@end defopt
+
+@defopt widget-push-button-suffix
+String to suffix push buttons.
+@end defopt
+
+@node editable-field, text, push-button, Basic Types
+@comment  node-name,  next,  previous,  up
+@subsection The @code{editable-field} Widget
+@findex editable-field@r{ widget}
+
+Syntax:
+
+@example
+@var{type} ::= (editable-field [@var{keyword} @var{argument}]... [ @var{value} ])
+@end example
+
+The @var{value}, if present, is used to initialize the @code{:value}
+property.  The value should be a string, which will be inserted in the
+field.  This widget will match all string values.
+
+The following extra properties are recognized:
+
+@table @code
+@vindex size@r{ keyword}
+@item :size
+The width of the editable field.@*
+By default the field will reach to the end of the line.
+
+@vindex value-face@r{ keyword}
+@item :value-face
+Face used for highlighting the editable field.  Default is
+@code{widget-field-face}, see @ref{User Interface}.
+
+@vindex secret@r{ keyword}
+@item :secret
+Character used to display the value.  You can set this to e.g.@: @code{?*}
+if the field contains a password or other secret information.  By
+default, this is @code{nil}, and the value is not secret.
+
+@vindex valid-regexp@r{ keyword}
+@item :valid-regexp
+By default the @code{:validate} function will match the content of the
+field with the value of this attribute.  The default value is @code{""}
+which matches everything.
+
+@vindex keymap@r{ keyword}
+@vindex widget-field-keymap
+@item :keymap
+Keymap used in the editable field.  The default value is
+@code{widget-field-keymap}, which allows you to use all the normal
+editing commands, even if the buffer's major mode suppresses some of
+them.  Pressing @key{RET} invokes the function specified by
+@code{:action}.
+@end table
+
+@node text, menu-choice, editable-field, Basic Types
+@comment  node-name,  next,  previous,  up
+@subsection The @code{text} Widget
+@findex text@r{ widget}
+
+@vindex widget-text-keymap
+This is just like @code{editable-field}, but intended for multiline text
+fields.  The default @code{:keymap} is @code{widget-text-keymap}, which
+does not rebind the @key{RET} key.
+
+@node menu-choice, radio-button-choice, text, Basic Types
+@comment  node-name,  next,  previous,  up
+@subsection The @code{menu-choice} Widget
+@findex menu-choice@r{ widget}
+
+Syntax:
+
+@example
+@var{type} ::= (menu-choice [@var{keyword} @var{argument}]... @var{type} ... )
+@end example
+
+The @var{type} argument represents each possible choice.  The widget's
+value will be that of the chosen @var{type} argument.  This widget will
+match any value matching at least one of the specified @var{type}
+arguments.
+
+@table @code
+@vindex void@r{ keyword}
+@item :void
+Widget type used as a fallback when the value does not match any of the
+specified @var{type} arguments.
+
+@vindex case-fold@r{ keyword}
+@item :case-fold
+Set this to @code{nil} if you don't want to ignore case when prompting for a
+choice through the minibuffer.
+
+@vindex children@r{ keyword}
+@item :children
+A list whose @sc{car} is the widget representing the currently chosen
+type in the buffer.
+
+@vindex choice@r{ keyword}
+@item :choice
+The current chosen type.
+
+@vindex args@r{ keyword}
+@item :args
+The list of types.
+@end table
+
+@node radio-button-choice, item, menu-choice, Basic Types
+@comment  node-name,  next,  previous,  up
+@subsection The @code{radio-button-choice} Widget
+@findex radio-button-choice@r{ widget}
+
+Syntax:
+
+@example
+@var{type} ::= (radio-button-choice [@var{keyword} @var{argument}]...  @var{type} ... )
+@end example
+
+The component types specify the choices, with one radio button for
+each.  The widget's value will be that of the chosen @var{type}
+argument.  This widget matches any value that matches at least one of
+the specified @var{type} arguments.
+
+The following extra properties are recognized.
+
+@table @code
+@vindex entry-format@r{ keyword}
+@item :entry-format
+This string will be inserted for each entry in the list.
+The following @samp{%} escapes are available:
+@table @samp
+@item %v
+Replace with the buffer representation of the @var{type} widget.
+@item %b
+Replace with the radio button.
+@item %%
+Insert a literal @samp{%}.
+@end table
+
+@vindex button-args@r{ keyword}
+@item :button-args
+A list of keywords to pass to the radio buttons.  Useful for setting
+e.g.@: the @samp{:help-echo} for each button.
+
+@vindex buttons@r{ keyword}
+@item :buttons
+The widgets representing the radio buttons.
+
+@vindex children@r{ keyword}
+@item :children
+The widgets representing each type.
+
+@vindex choice@r{ keyword}
+@item :choice
+The current chosen type
+
+@vindex args@r{ keyword}
+@item :args
+The list of types.
+@end table
+
+You can add extra radio button items to a @code{radio-button-choice}
+widget after it has been created with the function
+@code{widget-radio-add-item}.
+
+@defun widget-radio-add-item widget type
+Add to @code{radio-button-choice} widget @var{widget} a new radio button
+item of type @var{type}.
+@end defun
+
+Please note that such items added after the @code{radio-button-choice}
+widget has been created will @strong{not} be properly destructed when
+you call @code{widget-delete}.
+
+@node item, choice-item, radio-button-choice, Basic Types
+@comment  node-name,  next,  previous,  up
+@subsection The @code{item} Widget
+@findex item@r{ widget}
+
+Syntax:
+
+@example
+@var{item} ::= (item [@var{keyword} @var{argument}]... @var{value})
+@end example
+
+The @var{value}, if present, is used to initialize the @code{:value}
+property.  The value should be a string, which will be inserted in the
+buffer.  This widget will only match the specified value.
+
+@node choice-item, toggle, item, Basic Types
+@comment  node-name,  next,  previous,  up
+@subsection The @code{choice-item} Widget
+@findex choice-item@r{ widget}
+
+Syntax:
+
+@example
+@var{item} ::= (choice-item [@var{keyword} @var{argument}]... @var{value})
+@end example
+
+The @var{value}, if present, is used to initialize the @code{:value}
+property.  The value should be a string, which will be inserted in the
+buffer as a button.  Activating the button of a @code{choice-item} is
+equivalent to activating the parent widget.  This widget will only match
+the specified value.
+
+@node toggle, checkbox, choice-item, Basic Types
+@comment  node-name,  next,  previous,  up
+@subsection The @code{toggle} Widget
+@findex toggle@r{ widget}
+
+Syntax:
+
+@example
+@var{type} ::= (toggle [@var{keyword} @var{argument}]...)
+@end example
+
+The widget has two possible states, @samp{on} and @samp{off}, which
+correspond to a @code{t} or @code{nil} value, respectively.
+
+The following extra properties are recognized:
+
+@table @code
+@item :on
+A string representing the @samp{on} state.  By default the string
+@samp{on}.
+@item :off
+A string representing the @samp{off} state.  By default the string
+@samp{off}.
+@vindex on-glyph@r{ keyword}
+@item :on-glyph
+Name of a glyph to be used instead of the @samp{:on} text string, on
+emacsen that supports this.
+@vindex off-glyph@r{ keyword}
+@item :off-glyph
+Name of a glyph to be used instead of the @samp{:off} text string, on
+emacsen that supports this.
+@end table
+
+@node checkbox, checklist, toggle, Basic Types
+@comment  node-name,  next,  previous,  up
+@subsection The @code{checkbox} Widget
+@findex checkbox@r{ widget}
+
+This widget has two possible states, @samp{selected} and
+@samp{unselected}, which corresponds to a @code{t} or @code{nil} value.
+
+Syntax:
+
+@example
+@var{type} ::= (checkbox [@var{keyword} @var{argument}]...)
+@end example
+
+@node checklist, editable-list, checkbox, Basic Types
+@comment  node-name,  next,  previous,  up
+@subsection The @code{checklist} Widget
+@findex checklist@r{ widget}
+
+Syntax:
+
+@example
+@var{type} ::= (checklist [@var{keyword} @var{argument}]...  @var{type} ... )
+@end example
+
+The @var{type} arguments represent each checklist item.  The widget's
+value will be a list containing the values of all checked @var{type}
+arguments.  The checklist widget will match a list whose elements all
+match at least one of the specified @var{type} arguments.
+
+The following extra properties are recognized:
+
+@table @code
+@vindex entry-format@r{ keyword}
+@item :entry-format
+This string will be inserted for each entry in the list.
+The following @samp{%} escapes are available:
+@table @samp
+@item %v
+Replaced with the buffer representation of the @var{type} widget.
+@item %b
+Replace with the checkbox.
+@item %%
+Insert a literal @samp{%}.
+@end table
+
+@vindex greedy@r{ keyword}
+@item :greedy
+Usually a checklist will only match if the items are in the exact
+sequence given in the specification.  By setting @code{:greedy} to
+non-@code{nil}, it will allow the items to come in any sequence.
+However, if you extract the value they will be in the sequence given
+in the checklist, i.e.@: the original sequence is forgotten.
+
+@vindex button-args@r{ keyword}
+@item :button-args
+A list of keywords to pass to the checkboxes.  Useful for setting
+e.g.@: the @samp{:help-echo} for each checkbox.
+
+@vindex buttons@r{ keyword}
+@item :buttons
+The widgets representing the checkboxes.
+
+@vindex children@r{ keyword}
+@item :children
+The widgets representing each type.
+
+@vindex args@r{ keyword}
+@item :args
+The list of types.
+@end table
+
+@node editable-list, group, checklist, Basic Types
+@comment  node-name,  next,  previous,  up
+@subsection The @code{editable-list} Widget
+@findex editable-list@r{ widget}
+
+Syntax:
+
+@example
+@var{type} ::= (editable-list [@var{keyword} @var{argument}]... @var{type})
+@end example
+
+The value is a list, where each member represents one widget of type
+@var{type}.
+
+The following extra properties are recognized:
+
+@table @code
+@vindex entry-format@r{ keyword}
+@item :entry-format
+This string will be inserted for each entry in the list.
+The following @samp{%} escapes are available:
+@table @samp
+@item %v
+This will be replaced with the buffer representation of the @var{type}
+widget.
+@item %i
+Insert the @b{[INS]} button.
+@item %d
+Insert the @b{[DEL]} button.
+@item %%
+Insert a literal @samp{%}.
+@end table
+
+@vindex insert-button-args@r{ keyword}
+@item :insert-button-args
+A list of keyword arguments to pass to the insert buttons.
+
+@vindex delete-button-args@r{ keyword}
+@item :delete-button-args
+A list of keyword arguments to pass to the delete buttons.
+
+@vindex append-button-args@r{ keyword}
+@item :append-button-args
+A list of keyword arguments to pass to the trailing insert button.
+
+@vindex buttons@r{ keyword}
+@item :buttons
+The widgets representing the insert and delete buttons.
+
+@vindex children@r{ keyword}
+@item :children
+The widgets representing the elements of the list.
+
+@vindex args@r{ keyword}
+@item :args
+List whose @sc{car} is the type of the list elements.
+@end table
+
+@node group,  , editable-list, Basic Types
+@comment  node-name,  next,  previous,  up
+@subsection The @code{group} Widget
+@findex group@r{ widget}
+
+This widget simply group other widgets together.
+
+Syntax:
+
+@example
+@var{type} ::= (group [@var{keyword} @var{argument}]... @var{type}...)
+@end example
+
+The value is a list, with one member for each @var{type}.
+
+@node Sexp Types, Widget Properties, Basic Types, Top
+@comment
+@section Sexp Types
+@cindex sexp types
+
+A number of widgets for editing @dfn{s-expressions} (Lisp types), sexp
+for short, are also available.  These basically fall in several
+categories described in this section.
+
+@menu
+* constants::
+* generic::
+* atoms::
+* composite::
+@end menu
+
+@node constants, generic, Sexp Types, Sexp Types
+@comment  node-name,  next,  previous,  up
+@subsection The Constant Widgets
+@cindex constant widgets
+
+The @code{const} widget can contain any Lisp expression, but the user is
+prohibited from editing it, which is mainly useful as a component of one
+of the composite widgets.
+
+The syntax for the @code{const} widget is:
+
+@example
+@var{type} ::= (const [@var{keyword} @var{argument}]...  [ @var{value} ])
+@end example
+
+The @var{value}, if present, is used to initialize the @code{:value}
+property and can be any s-expression.
+
+@deffn Widget const
+This will display any valid s-expression in an immutable part of the
+buffer.
+@end deffn
+
+There are two variations of the @code{const} widget, namely
+@code{variable-item} and @code{function-item}.  These should contain a
+symbol with a variable or function binding.  The major difference from
+the @code{const} widget is that they will allow the user to see the
+variable or function documentation for the symbol.
+
+@deffn Widget variable-item
+An immutable symbol that is bound as a variable.
+@end deffn
+
+@deffn Widget function-item
+An immutable symbol that is bound as a function.
+@end deffn
+
+@node generic, atoms, constants, Sexp Types
+@comment  node-name,  next,  previous,  up
+@subsection Generic Sexp Widget
+@cindex generic sexp widget
+
+The @code{sexp} widget can contain any Lisp expression, and allows the
+user to edit it inline in the buffer.
+
+The syntax for the @code{sexp} widget is:
+
+@example
+@var{type} ::= (sexp [@var{keyword} @var{argument}]...  [ @var{value} ])
+@end example
+
+@deffn Widget sexp
+This will allow you to edit any valid s-expression in an editable buffer
+field.
+
+The @code{sexp} widget takes the same keyword arguments as the
+@code{editable-field} widget.  @xref{editable-field}.
+@end deffn
+
+@node atoms, composite, generic, Sexp Types
+@comment  node-name,  next,  previous,  up
+@subsection Atomic Sexp Widgets
+@cindex atomic sexp widget
+
+The atoms are s-expressions that do not consist of other s-expressions.
+For example, a string, a file name, or a symbol are atoms, while a list
+is a composite type.  You can edit the value of an atom with the
+following widgets.
+
+The syntax for all the atoms are:
+
+@example
+@var{type} ::= (@var{construct} [@var{keyword} @var{argument}]...  [ @var{value} ])
+@end example
+
+The @var{value}, if present, is used to initialize the @code{:value}
+property and must be an expression of the same type as the widget.
+That is, the string widget can only be initialized with a string.
+
+All the atom widgets take the same keyword arguments as the
+@code{editable-field} widget.  @xref{editable-field}.
+
+@deffn Widget string
+Allows you to edit a string in an editable field.
+@end deffn
+
+@deffn Widget regexp
+Allows you to edit a regular expression in an editable field.
+@end deffn
+
+@deffn Widget character
+Allows you to enter a character in an editable field.
+@end deffn
+
+@deffn Widget file
+Allows you to edit a file name in an editable field.
+
+Keywords:
+@table @code
+@vindex must-match@r{ keyword}
+@item :must-match
+If this is set to non-@code{nil}, only existing file names will be
+allowed in the minibuffer.
+@end table
+@end deffn
+
+@deffn Widget directory
+Allows you to edit a directory name in an editable field.
+Similar to the @code{file} widget.
+@end deffn
+
+@deffn Widget symbol
+Allows you to edit a Lisp symbol in an editable field.
+@end deffn
+
+@deffn Widget function
+Allows you to edit a lambda expression, or a function name with completion.
+@end deffn
+
+@deffn Widget variable
+Allows you to edit a variable name, with completion.
+@end deffn
+
+@deffn Widget integer
+Allows you to edit an integer in an editable field.
+@end deffn
+
+@deffn Widget number
+Allows you to edit a number in an editable field.
+@end deffn
+
+@deffn Widget boolean
+Allows you to edit a boolean.  In Lisp this means a variable which is
+either @code{nil} meaning false, or non-@code{nil} meaning true.
+@end deffn
+
+
+@node composite,  , atoms, Sexp Types
+@comment  node-name,  next,  previous,  up
+@subsection Composite Sexp Widgets
+@cindex composite sexp widgets
+
+The syntax for the composite widget construct is:
+
+@example
+@var{type} ::= (@var{construct} [@var{keyword} @var{argument}]...  @var{component}...)
+@end example
+
+@noindent
+where each @var{component} must be a widget type.  Each component widget
+will be displayed in the buffer, and will be editable by the user.
+
+@deffn Widget cons
+The value of a @code{cons} widget must be a cons-cell whose @sc{car}
+and @sc{cdr} have two specified types.  It uses this syntax:
+
+@example
+@var{type} ::= (cons [@var{keyword} @var{argument}]...  @var{car-type} @var{cdr-type})
+@end example
+@end deffn
+
+@deffn Widget choice
+The value matched by a @code{choice} widget must have one of a fixed
+set of types.  The widget's syntax is as follows:
+
+@example
+@var{type} ::= (choice [@var{keyword} @var{argument}]...  @var{type} ... )
+@end example
+
+The value of a @code{choice} widget can be anything that matches any of the
+@var{types}.
+@end deffn
+
+@deffn Widget list
+The value of a @code{list} widget must be a list whose element types
+match the specified component types:
+
+@example
+@var{type} ::= (list [@var{keyword} @var{argument}]...  @var{component-type}...)
+@end example
+
+Thus, @code{(list string number)} matches lists of two elements,
+the first being a string and the second being a number.
+@end deffn
+
+@deffn Widget vector
+The @code{vector} widget is like the @code{list} widget but matches
+vectors instead of lists.  Thus, @code{(vector string number)} matches
+vectors of two elements, the first being a string and the second being
+a number.
+@end deffn
+
+The above suffice for specifying fixed size lists and vectors.  To get
+variable length lists and vectors, you can use a @code{choice},
+@code{set}, or @code{repeat} widget together with the @code{:inline}
+keyword.  If any component of a composite widget has the
+@code{:inline} keyword set, its value must be a list which will then
+be spliced into the composite.  For example, to specify a list whose
+first element must be a file name, and whose remaining elements should
+either be the symbol @code{t} or two strings (file names), you can use
+the following widget specification:
+
+@example
+(list file
+      (choice (const t)
+              (list :inline t
+                    :value ("foo" "bar")
+                    string string)))
+@end example
+
+The value of a widget of this type will either have the form
+@code{(file t)} or @code{(file @var{string} @var{string})}.
+
+This concept of @code{:inline} may be hard to understand.  It was
+certainly hard to implement, so instead of confusing you more by
+trying to explain it here, I'll just suggest you meditate over it for
+a while.
+
+@deffn Widget set
+Specifies a type whose values are the lists whose elements all belong
+to a given set.  The order of elements of the list is not significant.
+Here's the syntax:
+
+@example
+@var{type} ::= (set [@var{keyword} @var{argument}]...  @var{permitted-element} ... )
+@end example
+
+Use @code{const} to specify each permitted element, like this:
+@code{(set (const a) (const b))}.
+@end deffn
+
+@deffn Widget repeat
+Specifies a list of any number of elements that fit a certain type.
+
+@example
+@var{type} ::= (repeat [@var{keyword} @var{argument}]...  @var{type})
+@end example
+@end deffn
+
+@node Widget Properties, Defining New Widgets, Sexp Types, Top
+@comment  node-name,  next,  previous,  up
+@section Properties
+@cindex properties of widgets
+@cindex widget properties
+
+You can examine or set the value of a widget by using the widget object
+that was returned by @code{widget-create}.
+
+@defun widget-value widget
+Return the current value contained in @var{widget}.
+It is an error to call this function on an uninitialized widget.
+@end defun
+
+@defun widget-value-set widget value
+Set the value contained in @var{widget} to @var{value}.
+It is an error to call this function with an invalid @var{value}.
+@end defun
+
+@strong{Important:} You @emph{must} call @code{widget-setup} after
+modifying the value of a widget before the user is allowed to edit the
+widget again.  It is enough to call @code{widget-setup} once if you
+modify multiple widgets.  This is currently only necessary if the widget
+contains an editing field, but may be necessary for other widgets in the
+future.
+
+If your application needs to associate some information with the widget
+objects, for example a reference to the item being edited, it can be
+done with @code{widget-put} and @code{widget-get}.  The property names
+must begin with a @samp{:}.
+
+@defun widget-put widget property value
+In @var{widget} set @var{property} to @var{value}.
+@var{property} should be a symbol, while @var{value} can be anything.
+@end defun
+
+@defun widget-get widget property
+In @var{widget} return the value for @var{property}.
+@var{property} should be a symbol, the value is what was last set by
+@code{widget-put} for @var{property}.
+@end defun
+
+@defun widget-member widget property
+Non-@code{nil} if @var{widget} has a value (even @code{nil}) for
+property @var{property}.
+@end defun
+
+Occasionally it can be useful to know which kind of widget you have,
+i.e.@: the name of the widget type you gave when the widget was created.
+
+@defun widget-type widget
+Return the name of @var{widget}, a symbol.
+@end defun
+
+@cindex active widget
+@cindex inactive widget
+@cindex activate a widget
+@cindex deactivate a widget
+Widgets can be in two states: active, which means they are modifiable by
+the user, or inactive, which means they cannot be modified by the user.
+You can query or set the state with the following code:
+
+@lisp
+;; Examine if @var{widget} is active or not.
+(if (widget-apply @var{widget} :active)
+    (message "Widget is active.")
+  (message "Widget is inactive.")
+
+;; Make @var{widget} inactive.
+(widget-apply @var{widget} :deactivate)
+
+;; Make @var{widget} active.
+(widget-apply @var{widget} :activate)
+@end lisp
+
+A widget is inactive if it, or any of its ancestors (found by
+following the @code{:parent} link), have been deactivated.  To make sure
+a widget is really active, you must therefore activate both it and
+all its ancestors.
+
+@lisp
+(while widget
+  (widget-apply widget :activate)
+  (setq widget (widget-get widget :parent)))
+@end lisp
+
+You can check if a widget has been made inactive by examining the value
+of the @code{:inactive} keyword.  If this is non-@code{nil}, the widget itself
+has been deactivated.  This is different from using the @code{:active}
+keyword, in that the latter tells you if the widget @strong{or} any of
+its ancestors have been deactivated.  Do not attempt to set the
+@code{:inactive} keyword directly.  Use the @code{:activate}
+@code{:deactivate} keywords instead.
+
+
+@node Defining New Widgets, Widget Browser, Widget Properties, Top
+@comment  node-name,  next,  previous,  up
+@section Defining New Widgets
+@cindex new widgets
+@cindex defining new widgets
+
+You can define specialized widgets with @code{define-widget}.  It allows
+you to create a shorthand for more complex widgets, including specifying
+component widgets and new default values for the keyword
+arguments.
+
+@defun define-widget name class doc &rest args
+Define a new widget type named @var{name} from @code{class}.
+
+@var{name} and class should both be symbols, @code{class} should be one
+of the existing widget types.
+
+The third argument @var{doc} is a documentation string for the widget.
+
+After the new widget has been defined, the following two calls will
+create identical widgets:
+
+@itemize @bullet
+@item
+@lisp
+(widget-create @var{name})
+@end lisp
+
+@item
+@lisp
+(apply widget-create @var{class} @var{args})
+@end lisp
+@end itemize
+
+@end defun
+
+Using @code{define-widget} just stores the definition of the widget type
+in the @code{widget-type} property of @var{name}, which is what
+@code{widget-create} uses.
+
+If you only want to specify defaults for keywords with no complex
+conversions, you can use @code{identity} as your conversion function.
+
+The following additional keyword arguments are useful when defining new
+widgets:
+@table @code
+@vindex convert-widget@r{ keyword}
+@item :convert-widget
+Function to convert a widget type before creating a widget of that
+type.  It takes a widget type as an argument, and returns the converted
+widget type.  When a widget is created, this function is called for the
+widget type and all the widget's parent types, most derived first.
+
+The following predefined functions can be used here:
+
+@defun widget-types-convert-widget widget
+Convert @code{:args} as widget types in @var{widget}.
+@end defun
+
+@defun widget-value-convert-widget widget
+Initialize @code{:value} from @code{:args} in @var{widget}.
+@end defun
+
+@vindex copy@r{ keyword}
+@item :copy
+Function to deep copy a widget type.  It takes a shallow copy of the
+widget type as an argument (made by @code{copy-sequence}), and returns a
+deep copy.  The purpose of this is to avoid having different instances
+of combined widgets share nested attributes.
+
+The following predefined functions can be used here:
+
+@defun widget-types-copy widget
+Copy @code{:args} as widget types in @var{widget}.
+@end defun
+
+@vindex value-to-internal@r{ keyword}
+@item :value-to-internal
+Function to convert the value to the internal format.  The function
+takes two arguments, a widget and an external value, and returns the
+internal value.  The function is called on the present @code{:value}
+when the widget is created, and on any value set later with
+@code{widget-value-set}.
+
+@vindex value-to-external@r{ keyword}
+@item :value-to-external
+Function to convert the value to the external format.  The function
+takes two arguments, a widget and an internal value, and returns the
+external value.  The function is called on the present @code{:value}
+when the widget is created, and on any value set later with
+@code{widget-value-set}.
+
+@vindex create@r{ keyword}
+@item :create
+Function to create a widget from scratch.  The function takes one
+argument, a widget type, and creates a widget of that type, inserts it
+in the buffer, and returns a widget object.
+
+@vindex delete@r{ keyword}
+@item :delete
+Function to delete a widget.  The function takes one argument, a widget,
+and should remove all traces of the widget from the buffer.
+
+The default value is:
+
+@defun widget-default-delete widget
+Remove @var{widget} from the buffer.
+Delete all @code{:children} and @code{:buttons} in @var{widget}.
+@end defun
+
+In most cases you should not change this value, but instead use
+@code{:value-delete} to make any additional cleanup.
+
+@vindex value-create@r{ keyword}
+@item :value-create
+Function to expand the @samp{%v} escape in the format string.  It will
+be called with the widget as its argument and should insert a
+representation of the widget's value in the buffer.
+
+Nested widgets should be listed in @code{:children} or @code{:buttons}
+to make sure they are automatically deleted.
+
+@vindex value-delete@r{ keyword}
+@item :value-delete
+Should remove the representation of the widget's value from the buffer.
+It will be called with the widget as its argument.  It doesn't have to
+remove the text, but it should release markers and delete nested widgets
+if these are not listed in @code{:children} or @code{:buttons}.
+
+@vindex value-get@r{ keyword}
+@item :value-get
+Function to extract the value of a widget, as it is displayed in the
+buffer.
+
+The following predefined function can be used here:
+
+@defun widget-value-value-get widget
+Return the @code{:value} property of @var{widget}.
+@end defun
+
+@vindex format-handler@r{ keyword}
+@item :format-handler
+Function to handle unknown @samp{%} escapes in the format string.  It
+will be called with the widget and the character that follows the
+@samp{%} as arguments.  You can set this to allow your widget to handle
+non-standard escapes.
+
+@findex widget-default-format-handler
+You should end up calling @code{widget-default-format-handler} to handle
+unknown escape sequences, which will handle the @samp{%h} and any future
+escape sequences, as well as give an error for unknown escapes.
+
+@vindex action@r{ keyword}
+@item :action
+Function to handle user initiated events.  By default, @code{:notify}
+the parent.
+
+The following predefined function can be used here:
+
+@defun widget-parent-action widget &optional event
+Tell @code{:parent} of @var{widget} to handle the @code{:action}.
+Optional @var{event} is the event that triggered the action.
+@end defun
+
+@vindex prompt-value@r{ keyword}
+@item :prompt-value
+Function to prompt for a value in the minibuffer.  The function should
+take four arguments, @var{widget}, @var{prompt}, @var{value}, and
+@var{unbound} and should return a value for widget entered by the user.
+@var{prompt} is the prompt to use.  @var{value} is the default value to
+use, unless @var{unbound} is non-@code{nil}, in which case there is no default
+value.  The function should read the value using the method most natural
+for this widget, and does not have to check that it matches.
+@end table
+
+If you want to define a new widget from scratch, use the @code{default}
+widget as its base.
+
+@deffn Widget default
+Widget used as a base for other widgets.
+
+It provides most of the functionality that is referred to as ``by
+default'' in this text.
+@end deffn
+
+@node Widget Browser, Widget Minor Mode, Defining New Widgets, Top
+@comment  node-name,  next,  previous,  up
+@section Widget Browser
+@cindex widget browser
+
+There is a separate package to browse widgets.  This is intended to help
+programmers who want to examine the content of a widget.  The browser
+shows the value of each keyword, but uses links for certain keywords
+such as @samp{:parent}, which avoids printing cyclic structures.
+
+@deffn Command widget-browse @var{widget}
+Create a widget browser for @var{widget}.
+When called interactively, prompt for @var{widget}.
+@end deffn
+
+@deffn Command widget-browse-other-window @var{widget}
+Create a widget browser for @var{widget} and show it in another window.
+When called interactively, prompt for @var{widget}.
+@end deffn
+
+@deffn Command widget-browse-at @var{pos}
+Create a widget browser for the widget at @var{pos}.
+When called interactively, use the position of point.
+@end deffn
+
+@node  Widget Minor Mode, Utilities, Widget Browser, Top
+@comment  node-name,  next,  previous,  up
+@section Widget Minor Mode
+@cindex widget minor mode
+
+There is a minor mode for manipulating widgets in major modes that
+don't provide any support for widgets themselves.  This is mostly
+intended to be useful for programmers doing experiments.
+
+@deffn Command widget-minor-mode
+Toggle minor mode for traversing widgets.
+With arg, turn widget mode on if and only if arg is positive.
+@end deffn
+
+@defvar widget-minor-mode-keymap
+Keymap used in @code{widget-minor-mode}.
+@end defvar
+
+@node  Utilities, Widget Wishlist, Widget Minor Mode, Top
+@comment  node-name,  next,  previous,  up
+@section Utilities.
+@cindex utility functions for widgets
+
+@defun widget-prompt-value widget prompt [ value unbound ]
+Prompt for a value matching @var{widget}, using @var{prompt}.
+The current value is assumed to be @var{value}, unless @var{unbound} is
+non-@code{nil}.@refill
+@end defun
+
+@defun widget-get-sibling widget
+Get the item which @var{widget} is assumed to toggle.
+This is only meaningful for radio buttons or checkboxes in a list.
+@end defun
+
+@node  Widget Wishlist, GNU Free Documentation License, Utilities, Top
+@comment  node-name,  next,  previous,  up
+@section Wishlist
+@cindex todo
+
+@itemize @bullet
+@item
+It should be possible to add or remove items from a list with @kbd{C-k}
+and @kbd{C-o} (suggested by @sc{rms}).
+
+@item
+The @samp{[INS]} and @samp{[DEL]} buttons should be replaced by a single
+dash (@samp{-}).  The dash should be a button that, when invoked, asks
+whether you want to add or delete an item (@sc{rms} wanted to git rid of
+the ugly buttons, the dash is my idea).
+
+@item
+The @code{menu-choice} tag should be prettier, something like the abbreviated
+menus in Open Look.
+
+@item
+Finish @code{:tab-order}.
+
+@item
+Make indentation work with glyphs and proportional fonts.
+
+@item
+Add commands to show overview of object and class hierarchies to the
+browser.
+
+@item
+Find a way to disable mouse highlight for inactive widgets.
+
+@item
+Find a way to make glyphs look inactive.
+
+@item
+Add @code{property-list} widget.
+
+@item
+Add @code{association-list} widget.
+
+@item
+Add @code{key-binding} widget.
+
+@item
+Add @code{widget} widget for editing widget specifications.
+
+@item
+Find clean way to implement variable length list.
+See @code{TeX-printer-list} for an explanation.
+
+@item
+@kbd{C-h} in @code{widget-prompt-value} should give type specific help.
+
+@item
+Add a @code{mailto} widget.
+@end itemize
+
+@node GNU Free Documentation License, Index, Widget Wishlist, Top
+@appendix GNU Free Documentation License
+@include doclicense.texi
+
+@node Index, , GNU Free Documentation License, Top
+@comment  node-name,  next,  previous,  up
+@unnumbered Index
+
+This is an alphabetical listing of all concepts, functions, commands,
+variables, and widgets described in this manual.
+@printindex cp
+
+@setchapternewpage odd
+@contents
+@bye
+
+@ignore
+   arch-tag: 2b427731-4c61-4e72-85de-5ccec9c623f0
+@end ignore
similarity index 99%
rename from man/woman.texi
rename to doc/misc/woman.texi
index 868bb510f50a3bc583f7bd8bb68da15fb86159b0..3f0f0d43827f86fdf51082d2456287db8bac67b0 100644 (file)
@@ -1,6 +1,6 @@
 \input texinfo   @c -*-texinfo-*-
 @c %**start of header
-@setfilename ../info/woman
+@setfilename ../../info/woman
 @settitle WoMan: Browse Unix Manual Pages ``W.O. (without) Man''
 @c Manual last updated:
 @set UPDATED Time-stamp: <2006-03-25 14:59:03 karl>
index 9a5b277201a1ac9b8cdf49fa371be93953d3493d..9524be4cdee2adf678306aa223e444e3409f7d69 100644 (file)
+2007-10-09  Juanma Barranquero  <lekktu@gmail.com>
+
+       * follow.el: Require easymenu.
+       (follow-mode-hook, follow-mode): Doc fixes.
+       (follow-mode-off-hook): Mark as obsolete.
+
+2007-10-08  Martin Rudalics  <rudalics@gmx.at>
+
+       * window.el (mouse-autoselect-window-cancel): Don't cancel for
+       select-window or select-frame events.
+       (handle-select-window): When autoselecting window set input
+       focus.  Restructure.
+
+       * frame.el (focus-follows-mouse): Moved to frame.c.
+       * cus-start.el (all): Add focus-follows-mouse.
+
+2007-10-08  Juanma Barranquero  <lekktu@gmail.com>
+
+       * bs.el (bs-mode): Make sure global-font-lock-mode doesn't
+       activate font-locking in the *buffer-selection* buffer.
+       (bs-show-sorted): Doc fix.
+
+       * bs.el (bs--get-marked-string, bs--get-modified-string)
+       (bs--get-readonly-string, bs--get-size-string, bs--get-name)
+       (bs--get-mode-name, bs-mode): Fix typos in docstrings.
+       (bs--format-aux): Doc fix.
+
+2007-10-08  Micha\e,Ak\e(Bl Cadilhac  <michael@cadilhac.name>
+
+       * progmodes/gud.el (gud-gud-gdb-command-name): Fix typo in docstring.
+
+2007-10-08  Nick Roberts  <nickrob@snap.net.nz>
+
+       * progmodes/gud.el (gud-gud-gdb-command-name): New option.
+       (gud-gdb): New function for old M-x gdb (text command mode).
+       (gud-gdb-command-name, gdb): Move to...
+
+       * progmodes/gdb-ui.el: ...here and adapt doc string.
+       (gud-gdba-command-name, gdba): Delete.
+
+2007-10-08  Juanma Barranquero  <lekktu@gmail.com>
+
+       * bs.el: Don't defvar `font-lock-verbose'.
+       (bs-config-clear, bs-kill, bs-string-show-normally, bs-sort-functions)
+       (bs--get-file-name): Fix typos in docstrings.
+       (bs--show-header): Use `dolist' instead of `mapcar'.
+       (bs-mode): Set `show-trailing-whitespace' to nil.
+       (bs-buffer-sort-function, bs-mouse-select-other-frame)
+       (bs-visits-non-file, bs-sort-buffer-interns-are-last, bs-show):
+       Doc fixes.
+
+2007-10-08  Adam Hupp  <adam@hupp.org>  (tiny change)
+
+       * progmodes/gdb-ui.el (pdb): Specify file for gud-break.
+
+2007-10-08  Nick Roberts  <nickrob@snap.net.nz>
+
+       * progmodes/gud.el (gdb): Make graphical mode the default and
+       switch to text command mode if appropriate, i.e., reverse previous
+       arrangement.
+       (gud-gdb-marker-filter): Adapt for above change.
+
+       * progmodes/gdb-ui.el (gdb-init-1): Don't set the values
+       gud-minor-mode and gud-marker-filter.
+       (gdb-fullname-regexp): New variable.
+       (gud-gdba-marker-filter): Use it to switch to text command
+       mode if appropriate.
+
+2007-10-08  Nick Roberts  <nickrob@snap.net.nz>
+
+       * progmodes/gud.el (gud-display-line): Find source buffer even when
+       GUD buffer has its own frame.
+
+2007-10-08  Jan Dj\e,Ad\e(Brv  <jan.h.d@swipnet.se>
+
+       * term/x-win.el (icon-map-list): Set to nil for 22.1 compatibility.
+
+2007-10-08  Jan Dj\e,Ad\e(Brv  <jan.h.d@swipnet.se>
+
+       * term/x-win.el (x-gtk-stock-map): Version is 22.2.
+
+2007-10-08  Martin Rudalics  <rudalics@gmx.at>
+
+       * allout.el (allout-before-change-handler): Replace got-char by
+       goto-char.
+
+2007-10-08  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * vc-svn.el (vc-svn-resolve-when-done, vc-svn-find-file-hook): New funs.
+       Used to try and automatically enabled smerge-mode in the presence of
+       conflicts and to call `svn resolved' when the conflicts are gone.
+       (vc-svn-parse-status): Remember the svn-specific status.
+
+2007-10-08  Eli Zaretskii  <eliz@gnu.org>
+
+       * menu-bar.el (menu-bar-search-documentation-menu): Rename from
+       menu-bar-apropos-menu.  All users changed.
+       (menu-bar-help-menu): Change menu symbols to better match the text
+       displayed by the menu.
+
+2007-10-08  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * files.el (file-name-sans-versions): Use [:alnum:] and also allow
+       #, @, : and ^.
+
+2007-10-08  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * pcvs-defs.el (cvs-mode-map): Bind TAB and backtab.
+
+       * log-view.el (log-view-mode-map): Likewise.
+
+       * diff-mode.el (diff-mode-shared-map): Likewise.
+
+2007-10-08  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * files.el (file-name-sans-versions): Also allow `A-Z'.
+
+       * vc.el: Mention all supported VC backends.
+
+2007-10-08  Richard Stallman  <rms@gnu.org>
+
+       * wid-edit.el (widget-specify-button): Don't merge mouse-face with
+       neighbouring buttons.
+
+2007-10-08  Andreas Schwab  <schwab@suse.de>
+
+       * files.el (file-name-sans-versions): Also allow `_'.
+
+2007-10-08  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * files.el (file-name-sans-versions): Allow - and a-z in version names.
+
+       * log-view.el (log-view-mode-map, log-view-mode-menu):
+       Bind log-view-annotate-version.
+       (log-view-beginning-of-defun, log-view-end-of-defun)
+       (log-view-annotate-version): New functions.
+       (log-view-mode): Use log-view-beginning-of-defun and
+       log-view-end-of-defun.
+
+2007-10-08  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * emacs-lisp/easy-mmode.el (define-minor-mode): Fix staging.
+
+2007-10-08  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * wid-edit.el (widget-image-insert): Don't merge mouse-face with
+       neighbouring buttons.
+
+       * progmodes/compile.el (compilation-error-regexp-alist-alist):
+       Recognize gcc's use of "note" for informational messages.
+
+2007-10-08  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * textmodes/css-mode.el (css-electric-keys): electrick->electric.
+       (css-mode): Update correspondingly.
+
+2007-10-08  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * vc-git.el (vc-git-log-view-mode): Add font-lock patterns for
+       Signed-off-by, Acked-by and Merge.
+
+2007-10-08  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * ediff-init.el (ediff-verbose-p): This var is not a constant.
+
+2007-10-08  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * vc-mtn.el: New file.
+
+       * vc-hooks.el (vc-handled-backends): Add Mtn.
+
+2007-10-08  Eli Zaretskii  <eliz@gnu.org>
+
+       * files.el (find-file, find-file-other-window)
+       (find-file-other-frame, find-file-existing, find-file-read-only)
+       (find-file-read-only-other-window)
+       (find-file-read-only-other-frame)
+       (find-alternate-file-other-window, find-alternate-file): Doc fixes.
+
+2007-10-08  Nick Roberts  <nickrob@snap.net.nz>
+
+       * progmodes/gud.el (gdb-ready): New variable.
+       (gdb): Set it to nil.  Set gud-running to nil here...
+       (gud-common-init): ...instead of here.
+
+       * progmodes/gdb-ui.el (gdba, gdb-send, gdb-source-info):
+       Use gdb-ready.  Discard input until GDB is ready to accept it.
+
+2007-10-08  Martin Rudalics  <rudalics@gmx.at>
+
+       * dired.el (dired-warning): Inherit from font-lock-warning-face to
+       make it show up with eight colors.
+
+2007-10-08  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * diff-mode.el (diff-sanity-check-hunk): Fix up the case when unified
+       diffs are concatenated with no intervening line.
+
+2007-10-08  Dave Love  <fx@gnu.org>
+
+       * progmodes/python.el: Merge changes from Dave Love's v2007-Sep-10.
+       (python-font-lock-keywords): Update to the 2.5 version of the language.
+       (python-quote-syntax): Let-bind font-lock-syntactic-keywords to nil.
+       (python-backspace): Only behave funny in code.
+       (python-compilation-regexp-alist): Add PDB stack trace regexp.
+       (inferior-python-mode): Add PDB prompt regexp.
+       (python-fill-paragraph): Refine the fenced-string regexp.
+       (python-find-imports): Handle imports spanning several lines.
+       (python-mode): Add `class' to hideshow support.
+
+2007-10-08  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * pcvs.el (cvs-mode-add-change-log-entry-other-window): Use
+       add-log-buffer-file-name-function rather than bind buffer-file-name,
+       so we dont end up calling change-log-mode in *cvs* when `fi' is the
+       ChangeLog file itself.
+
+       * outline.el (outline-flag-region): Use front-advance.
+
+2007-10-08  Ilya Zakharevich  <ilyaz@cpan.org>
+
+       * progmodes/cperl-mode.el: Merge upstream 5.23.
+       (cperl-where-am-i): Remove function.
+       (cperl-backward-to-noncomment): Don't go too far when skipping POD/HEREs
+       (cperl-sniff-for-indent): De-invert [string] and [comment].
+       When looking for label, skip s:m:y:tr.
+       (cperl-indent-line): Likewise.
+       (cperl-mode): Don't assume `font-lock-multiline' is auto-local.
+       (cperl-windowed-init): Wrong `ps-print' handling.
+       Both thanks to Chong Yidong.
+       (cperl-look-at-leading-count): Could fail with unfinished RExen.
+       (cperl-find-pods-heres): If the second part of s()[] is missing,
+       don't try to highlight delimiters...
+
+2007-10-08  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * progmodes/compile.el (compilation-get-file-structure): Complete last
+       change by also using spec-directory in the puthash.
+
+2007-10-08  Riccardo Murri  <riccardo.murri@gmail.com>
+
+       * vc-bzr.el (vc-bzr-file-name-relative): Use 'when' instead of 'and'.
+       (vc-bzr-status): Fix shadowing of variable 'status'.
+       (vc-bzr-workfile-version): Use correct path to 'last-revision' file.
+       Use `expand-file-name' instead of `concat'.
+       (vc-bzr-annotate-command): Use option name '--long' instead of '-l'.
+       Update annotation line regexp.  Fixes launchpad.net [Bug 137435].
+
+2007-10-08  Jason Rumney  <jasonr@gnu.org>
+
+       * frame.el (focus-follows-mouse): Doc-fix. Change default on w32.
+
+2007-10-08  Richard Stallman  <rms@gnu.org>
+
+       * emacs-lisp/lisp-mode.el (lisp-indent-offset): Make defcustom.
+       Add `safe-local-variable' property.
+       (lisp-body-indent): Likewise.
+
+2007-10-08  Richard Stallman  <rms@gnu.org>
+
+       * files.el (hack-local-variables-confirm): Rename arg VARS to ALL-VARS.
+       Add doc string.
+
+2007-10-08  Martin Rudalics  <rudalics@gmx.at>
+
+       * files.el (backup-buffer-copy): Try to overwrite old backup first.
+
+2007-10-08  Martin Rudalics  <rudalics@gmx.at>
+
+       * repeat.el (repeat): Use last-repeatable-command instead of
+       real-last-command.  Run pre- and post-command hooks for
+       self-insertion.  Update doc-string.
+
+2007-10-08  Alexandre Julliard  <julliard@winehq.org>
+
+       * vc-git.el (vc-git-state): Call git-add --refresh to update the
+       state of the file.
+       (vc-git-workfile-unchanged-p): Delegate implementation to vc-git-state.
+       (vc-git-create-repo): Fix invalid command.
+
+2007-10-08  Richard Stallman  <rms@gnu.org>
+
+       * textmodes/flyspell.el (flyspell-mode):
+       Catch errors in flyspell-mode-on.
+
+2007-10-09  Juanma Barranquero  <lekktu@gmail.com>
+
+       * term/x-win.el (x-alternatives-map): Remove spurious parenthesis.
+
+2007-10-09  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * international/encoded-kb.el (encoded-kbd-setup-display):
+       Use input-decode-map rather than local-key-translation-map.
+
+       * term/rxvt.el (rxvt-alternatives-map): New map.
+       (terminal-init-rxvt): Use it.
+       Bind rxvt-function-map in input-decode-map.
+
+       * term/xterm.el (xterm-alternatives-map): New map.
+       (terminal-init-xterm): Use it.
+       Bind xterm-function-map in input-decode-map.
+
+       * term/x-win.el (x-alternatives-map): New var.
+       (x-setup-function-keys): Use it.
+
+       * help-fns.el (describe-variable): Slightly change the layout of
+       meta-info to separate it better from the docstring.
+       Standardize insertion of extra empty lines in various circumstances.
+
+       * diff-mode.el (diff-hunk-style): New fun.
+       (diff-end-of-hunk): Use it.
+       (diff-context->unified): Use the new `apply' undo element,
+       if applicable, so as to save undo-log space.
+       (diff-fine-change): New face.
+       (diff-fine-highlight-preproc): New function.
+       (diff-fine-highlight): New command.
+       (diff-mode-map, diff-mode-menu): Add diff-fine-highlight.
+
+       * smerge-mode.el (smerge-refine-chopup-region): Add `preproc' argument.
+       (smerge-refine-highlight-change): Add `props' argument.
+       (smerge-refine-subst): New function holding most of smerge-refine.
+       (smerge-refine): Use it.
+
+2007-10-08  Eric S. Raymond  <esr@snark.thyrsus.com>
+
+       * vc.el (vc-default-wash-log): Remove unused code, the
+       log washers all live in the backends now.
+       (vc-default-comment-history): Correct for the fact
+       that wash-log is argumentless in the new API.
+
+2007-10-08  Michael Albinus  <michael.albinus@gmx.de>
+
+       * net/tramp.el (tramp-find-foreign-file-name-handler): Check also host.
+       (tramp-maybe-send-script): Apply `member' but `memq'.
+       (tramp-advice-file-expand-wildcards): Simplify implementation.
+
+2007-10-08  Juanma Barranquero  <lekktu@gmail.com>
+
+       * follow.el (follow-mode): Don't run hooks twice.  Use `when'.
+
+       * mb-depth.el (minibuf-depth-indicator-function): New variable.
+       (minibuf-depth-setup-minibuffer): Use it.
+
+2007-10-07  Glenn Morris  <rgm@gnu.org>
+
+       * simple.el (bad-packages-alist): Clarify Semantic and CEDET
+       version numbers.
+
+2007-10-06  Juri Linkov  <juri@jurta.org>
+
+       * textmodes/fill.el (fill-paragraph-or-region): New function.
+
+       * bindings.el (esc-map): Bind M-q to fill-paragraph-or-region
+       instead of fill-paragraph.
+
+       * tutorial.el (tutorial--default-keys): Replace fill-paragraph
+       with fill-paragraph-or-region.  Suspend command is now the same
+       `suspend-frame' on window systems and on tty.
+
+       * image.el (image-type): Check if image-types is bound to not fail
+       on tty.
+
+       * delsel.el (delete-selection-pre-hook):
+       * emulation/cua-base.el (cua-paste): Check if mouse-region-match
+       is fbound to not fail on mouseless tty.
+
+2007-10-06  Michael Albinus  <michael.albinus@gmx.de>
+
+       * net/tramp.el (top): Move loading of tramp-util.el and
+       tramp-vc.el to tramp-compat.el.
+       (tramp-make-tramp-temp-file): Complete rewrite.  Create remote
+       temporary file if possible, in order to avoid a security hole.
+       (tramp-do-copy-or-rename-file-out-of-band)
+       (tramp-maybe-open-connection): Call `tramp-make-tramp-temp-file'
+       with DONT-CREATE, because the connection is not setup yet.
+       (tramp-handle-process-file): Rewrite temporary file handling.
+       (tramp-completion-mode): New defvar.
+       (tramp-completion-mode-p): Use it.
+
+       * net/tramp-compat.el (top): Load tramp-util.el and tramp-vc.el.
+
+       * net/tramp-fish.el (tramp-fish-handle-process-file):
+       Rewrite temporary file handling.
+
+2007-10-06  Eric S. Raymond  <esr@snark.thyrsus.com>
+
+       * vc.el: Workfile version -> focus version change.  Port various
+       comments from new VC to reduce the noise in the diff.
+       Patch in the new vc-create-repo function to go with the
+       header comment about it already present.
+       There are no changes to existing logic in this patch.
+       (vc-revert-buffer1): Rename to vc-revert-buffer-internal.
+
+2007-10-06  Aaron Hawley  <aaronh@garden.org>
+
+       * autoinsert.el (auto-insert-alist): Add a Texinfo entry.
+
+2007-10-05  Chris Moore  <dooglus@gmail.com>
+
+       * server.el (server-kill-new-buffers): Doc fix.
+
+2007-10-05  John W. Eaton  <jwe@octave.org>
+
+       * progmodes/octave-mod.el (octave-abbrev-table): Add "until".
+       (octave-begin-keywords): Add "do".
+       (octave-end-keywords): Remove "end".
+       (octave-reserved-words): Add "end".  Remove "all_va_args",
+       "gplot", and 'gsplot".
+       (octave-text-functions): Remove "gset", "gshow", "set", and "show".
+       (octave-variables): Remove "IMAGEPATH", "INFO_FILE",
+       "INFO_PROGRAM", "LOADPATH", "__error_text__", "automatic_replot",
+       "default_return_value", "define_all_return_values",
+       "do_fortran_indexing", "empty_list_elements_ok",
+       "gnuplot_has_multiplot", "implicit_str_to_num_ok",
+       "ok_to_lose_imaginary_part", "prefer_column_vectors",
+       "prefer_zero_one_indexing", "propagate_empty_matrices",
+       "resize_on_range_error", "treat_neg_dim_as_zero",
+       "warn_assign_as_truth_value", "warn_comma_in_global_decl",
+       "warn_divide_by_zero", "warn_function_name_clash",
+       "warn_missing_semicolon", "whitespace_in_literal_matrix".
+       Add "DEFAULT_EXEC_PATH", "DEFAULT_LOADPATH", "IMAGE_PATH",
+       "crash_dumps_octave_core", "sighup_dumps_octave_core",
+       "sigterm_dumps_octave_core".
+       (octave-block-match-alist): Remove "end" from block-end keywords.
+       (octave-mode): Update ftp site address.
+
+2007-10-05  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * vc.el: Reorder functions, no code changes.
+
+2007-10-04  Michael Albinus  <michael.albinus@gmx.de>
+
+       * net/tramp.el (tramp-make-temp-file): Move to tramp-compat.el.
+       (tramp-do-copy-or-rename-file-directly): Handle tmpfile only in
+       the cond clauses where needed.
+       (tramp-handle-write-region): Rearrange code for proper handling of
+       tmpfile.
+
+       * net/tramp-compat.el (tramp-compat-make-temp-file): New defsubst.
+
+       * net/tramp.el:
+       * net/tramp-fish.el:
+       * net/tramp-ftp.el:
+       * net/tramp-smb.el: Rename `tramp-make-temp-file' to
+       `tramp-compat-make-temp-file'.
+
+2007-10-04  Juanma Barranquero  <lekktu@gmail.com>
+
+       * image-dired.el (image-dired-image-at-point-p): Fix typo in docstring.
+
+2007-10-03  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * emacs-lisp/copyright.el (copyright-update): Don't update if the file
+       already uses a more recent copyright version than the "current" one.
+
+2007-10-03  Micha\e,Ak\e(Bl Cadilhac  <michael@cadilhac.name>
+
+       * doc-view.el (doc-view-dvi->pdf-sentinel, doc-view-reset-slice)
+       (doc-view-insert-image): Minor aesthetical docstring changes.
+
+2007-10-03  Tassilo Horn  <tassilo@member.fsf.org>
+
+       * doc-view.el (doc-view): Don't ignore pdf and dvi files when
+       completing filename.
+       (doc-view-search-internal): Docstring change.
+
+2007-10-03  Michael Albinus  <michael.albinus@gmx.de>
+
+       * net/tramp.el (top): Add tramp-compat to `tramp-unload-hook'.
+       (tramp-file-name-handler-alist):
+       Add `tramp-handle-insert-file-contents-literally'.  Needed for XEmacs.
+       (tramp-make-temp-file): Use `make-temp-name'.  `make-temp-file',
+       used before, creates the file already, which is not desired.
+       (tramp-do-copy-or-rename-file-directly): Simplify handling of
+       temporary file.
+       (tramp-handle-insert-file-contents): Assign the result in the
+       short track case.
+       (tramp-handle-insert-file-contents-literally): New defun.
+       (tramp-completion-mode-p): Revert change from 2007-09-24.
+       Checking for `return' etc as last character is not sufficient, for
+       example in dired-mode when entering <g> (revert-buffer) or
+       <s> (dired-sort).
+
+       * net/tramp-compat.el (top): Add also compatibility code for loading
+       appropriate timer package.
+       (tramp-compat-copy-tree): Check for `subrp' and `symbol-file' in
+       order to avoid autoloading problems.
+
+       * net/tramp-fish.el:
+       * net/tramp-smb.el: Move further compatibility code to tramp-compat.el.
+
+       * net/tramp-ftp.el (tramp-ftp-file-name-handler): Handle the case
+       where the second parameter of `copy-file' or `rename-file' is a
+       remote file but not via ftp.
+
+2007-10-02  Richard Stallman  <rms@gnu.org>
+
+       * frame.el (cursor-in-non-selected-windows): Doc fix.
+
+2007-10-01  Thien-Thi Nguyen  <ttn@gnuvola.org>
+
+       * play/zone.el (zone): Let-bind show-trailing-whitespace to nil.
+       Suggested by Chris Moore <christopher.ian.moore@gmail.com>.
+
+2007-10-01  Jay Belanger  <jay.p.belanger@gmail.com>
+
+       * calc/calc-math.el (math-largest-emacs-expt): Handle the cases
+       when `expt' doesn't give range errors.
+
+2007-10-01  Markus Triska  <markus.triska@gmx.at>
+
+       * calc/calc-math.el (math-smallest-emacs-expt):
+       Make the computation more robust.
+
+2007-09-30  David Kastrup  <dak@gnu.org>
+
+       * startup.el (argv): Alias for `command-line-args-left' to use as
+       `(pop argv)' inside of --eval command sequences.  Allows for
+       passing shell commands into Emacs verbatim without need for Lisp
+       quoting.
+
+       * autorevert.el (auto-revert-handler): In `auto-revert-tail-mode',
+       check only for changed size.
+       (auto-revert-tail-handler): Get size from caller.  If the file has
+       shrunk, tail the whole file again (the file presumably has been
+       rewritten).
+
+       * woman.el (woman-topic-all-completions, woman-mini-help):
+       Fix fallout from 2007-09-07 introduction of `dolist' when the list
+       actually was being manipulated in the loop.
+       (woman-Cyg-to-Win, woman-pre-process-region)
+       (woman-horizontal-escapes, woman-if-body, woman-unescape)
+       (woman-strings, woman-special-characters, woman1-hc)
+       (woman-change-fonts, woman-find-next-control-line):
+       Use `match-beginning' rather than `match-string' when the result is
+       just used as a flag.
+
+2007-09-30  Michael Albinus  <michael.albinus@gmx.de>
+
+       * net/tramp-compat.el: New file.
+
+       * net/tramp.el:
+       * net/tramp-fish.el:
+       * net/tramp-smb.el:
+       * net/tramp-uu.el:
+       * net/trampver.el: Move compatibility code to tramp-compat.el.
+       Apply `mapc' instead of `mapcar' when the code needs side effects
+       only.  Move utf-8 coding cookie to the second line.
+
+2007-09-30  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * term/x-win.el (x-gtk-stock-map): Add Gnus and MH-E icons.
+       Improve custom type.
+       (icon-map-list): Make it customizable.  Document how to disable
+       stock icons.
+
+2007-09-30  Richard Stallman  <rms@gnu.org>
+
+       * play/zone.el (zone-hiding-modeline): Use mode-line-format.
+
+2007-09-29  Jan Dj\e,Ad\e(Brv  <jan.h.d@swipnet.se>
+
+       * term/x-win.el (x-gtk-stock-map): Version is 22.2.
+
+2007-09-28  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * t-mouse.el (gpm-mouse-mode): Rename from t-mouse-mode.  Rewrite.
+       (t-mouse-mode): New compatibility alias.
+
+2007-09-28  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * server.el (server-delete-client): Only delete the terminal if it
+       is non-nil.
+
+2007-09-28  Michael Albinus  <michael.albinus@gmx.de>
+
+       * net/tramp.el (with-file-property, with-connection-property):
+       Highlight as keyword.
+       (tramp-rfn-eshadow-setup-minibuffer)
+       (tramp-rfn-eshadow-update-overlay, tramp-handle-set-file-times)
+       (tramp-set-file-uid-gid, tramp-do-copy-or-rename-file-via-buffer)
+       (tramp-do-copy-or-rename-file-directly)
+       (tramp-do-copy-or-rename-file-out-of-band)
+       (tramp-handle-shell-command, tramp-get-debug-buffer)
+       (tramp-send-command-and-read, tramp-equal-remote)
+       (tramp-get-local-gid): Pacify byte-compiler.
+       (tramp-handle-file-name-directory): Result shall not be expanded.
+       (tramp-find-foreign-file-name-handler): Rewrite.
+       (tramp-dissect-file-name): Add optional parameter NODEFAULT.
+
+       * net/tramp-cache.el (tramp-cache-print): Pacify byte-compiler.
+
+       * net/tramp-fish.el (tramp-fish-handle-expand-file-name):
+       Apply `tramp-completion-mode-p'.
+       (tramp-fish-handle-set-file-times)
+       (tramp-fish-handle-executable-find)
+       (tramp-fish-handle-process-file, tramp-fish-get-file-entries)
+       (tramp-fish-retrieve-data): Pacify byte-compiler.
+
+       * net/tramp-gw.el (tramp-gw-basic-authentication):
+       Call `tramp-read-passwd' with first parameter `nil'.
+
+2007-09-28  Glenn Morris  <rgm@gnu.org>
+
+       * mail/supercite.el (sc-attribs-filter-namelist): Use mapc rather
+       than mapcar.
+
+       * textmodes/tex-mode.el (tex-suscript-height-ratio)
+       (tex-suscript-height-minimum): New customizable variables.
+       (tex-suscript-height): New function.
+       (superscript, subscript): Set height using tex-suscript-height
+       rather than fixing at 0.8.
+       (tex-fontify-script, tex-font-script-display): Add :version tag.
+
+2007-09-27  Juanma Barranquero  <lekktu@gmail.com>
+
+       * progmodes/python.el (python-eldoc-function): Doc fix.
+
+2007-09-27  Glenn Morris  <rgm@gnu.org>
+
+       * image.el (image-type-auto-detected-p): Doc fix.  Don't detect an
+       image if it is not in image-type-auto-detectable, or is there with
+       a nil value.
+
+2007-09-27  Michael Albinus  <michael.albinus@gmx.de>
+
+       * net/tramp.el (tramp-maybe-open-connection): Make test for alive
+       connection more robust.
+
+2007-09-26  Juanma Barranquero  <lekktu@gmail.com>
+
+       * emacs-lisp/eldoc.el (eldoc-function-argstring-format):
+       Deal with the case that special &keywords are at the beginning or
+       end of the argument list.  Also add some (incomplete) support for
+       non-standard arglists.
+
+2007-09-26  Juanma Barranquero  <lekktu@gmail.com>
+
+       * emacs-lisp/eldoc.el (eldoc-message-commands-table-size)
+       (eldoc-message-commands, eldoc-current-idle-delay)
+       (eldoc-function-argstring-format): Fix typos in docstrings.
+
+2007-09-26  Jay Belanger  <jay.p.belanger@gmail.com>
+
+       * calc/calc-units.el (calc-convert-units)
+       (calc-convert-temperature): Remove unnecessary colons.
+
+2007-09-26  Bastien Guerry  <bzg@altern.org>
+
+       * org-export-latex.el (org-export-latex-tables-verbatim): New function.
+       (org-export-latex-remove-from-headlines): Name changed because of typo.
+       (org-export-latex-quotation-marks-convention): Option removed.
+       (org-export-latex-make-preamble): Handle the DATE option.
+       (org-export-latex-cleaned-string): Now the only cleaning function,
+       synched up with org.el.
+       (org-export-latex-lists, org-export-latex-parse-list)
+       (org-export-list-to-latex): New functions.
+
+2007-09-26  Carsten Dominik  <dominik@science.uva.nl>
+
+       * org.el (org-kill-is-subtree-p): Use `org-outline-regexp'.
+       (org-outline-regexp): New constant.
+       (org-remember-handler): Throw error when the target file is not in
+       org-mode.
+       (org-cleaned-string-for-export): No longer call
+       `org-export-latex-cleaned-string' with an argument.
+       (org-get-tags): Returns now a list, not a string.
+       (org-get-tags-string): New function.
+       (org-archive-subtree): No need to split return of `org-get-tags'.
+       (org-set-tags, org-entry-properties): Call `org-get-tags-string'
+       instead of `org-get-tags'.
+       (org-agenda-format-date): Rename from `org-agenda-date-format'.
+       (org-time-from-absolute, org-agenda-format-date-aligned): New funs.
+       (org-compatible-face): New argument INHERITS.  Inherit from this
+       face if possible.
+       (org-level-1, org-level-2, org-level-3, org-level-4)
+       (org-level-5, org-level-6, org-level-7, org-level-8)
+       (org-special-keyword, org-drawer, org-column, org-warning)
+       (org-archived, org-todo, org-done, org-headline-done, org-table)
+       (org-formula, org-code, org-agenda-structure)
+       (org-scheduled-today, org-scheduled-previously)
+       (org-upcoming-deadline, org-time-grid): Call `org-compatible-face'
+       in the new way.
+       (org-get-heading): New argument NO-TAGS.
+       (org-fast-tag-selection-include-todo): Made defvar instead of
+       defcustom, feature is not deprecated.
+       (org-remember-store-without-prompt): New default value t.
+       (org-todo-log-states): New variable.
+       (org-set-regexps-and-options): #+TODO is an alias for SEQ_TODO.
+       Compute the log states.
+       (org-goto-map): More commands copied from global map.  Also bind
+       `org-occur'.
+       (org-goto): Made into a general lookup command.
+       (org-get-location): Complete rewrite.
+       (org-goto-exit-command): New variable.
+       (org-goto-selected-point): New variable.
+       (org-goto-ret, org-goto-left, org-goto-right, org-goto-quit):
+       Set the new variables.
+       (org-paste-subtree): Whitespace insertion strategy revised.
+       (org-remember-apply-template): Protect v-A from the possibility
+       that v-a might be nil.
+       (org-remember-handler): Insertion rules revised.
+       (org-todo): Respect org-todo-log-states.
+       (org-up-heading-safe): New function.
+       (org-entry-get-with-inheritance): Use `org-up-heading-safe'.
+
+2007-09-26  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * progmodes/cc-cmds.el (c-indent-line-or-region): Only indent the
+       region if in transient-mark-mode.
+
+2007-09-26  Juanma Barranquero  <lekktu@gmail.com>
+
+       * calc/calc-ext.el (calc-init-extensions, calc-reset):
+       * calc/calc-help.el (calc-full-help):
+       * calc/calc-misc.el (another-calc):
+       * calc/calc-store.el (calc-var-name-map):
+       * calc/calc-stuff.el (calc-flush-caches):
+       * calc/calc-units.el (math-build-units-table):
+       * calc/calc.el (calc-digit-map, calc-dispatch-map, calc-mode)
+       (calc-quit):
+       * calendar/icalendar.el (icalendar--format-ical-event)
+       (icalendar--convert-ical-to-diary):
+       * emacs-lisp/authors.el (authors):
+       * emacs-lisp/cust-print.el (custom-print-install)
+       (custom-print-uninstall):
+       * emacs-lisp/disass.el (disassemble-1):
+       * emacs-lisp/easy-mmode.el (easy-mmode-define-syntax):
+       * emacs-lisp/edebug.el (byte-compile-resolve-functions):
+       * emacs-lisp/elint.el (elint-current-buffer, elint-check-defun-form)
+       (elint-check-let-form, elint-check-condition-case-form)
+       (elint-initialize):
+       * emacs-lisp/elp.el (elp-results):
+       * emacs-lisp/generic.el (generic-mode-internal):
+       * emacs-lisp/re-builder.el (reb-delete-overlays):
+       * emacs-lisp/regi.el (regi-interpret):
+       * emacs-lisp/sregex.el (sregex--char-aux):
+       * emulation/cua-rect.el (cua--deactivate-rectangle)
+       (cua--highlight-rectangle, cua--rectangle-post-command):
+       * emulation/viper-keym.el (viper-toggle-key, viper-ESC-key):
+       * emulation/viper-macs.el (viper-describe-kbd-macros)
+       (viper-describe-one-macro):
+       * emulation/viper-util.el (viper-setup-master-buffer):
+       * emulation/viper.el (set-viper-state-in-major-mode):
+       * international/mule-diag.el (describe-current-coding-system):
+       * language/ethio-util.el (ethio-fidel-to-sera-buffer):
+       * mail/emacsbug.el (report-emacs-bug):
+       * net/ange-ftp.el (ange-ftp-call-chmod, ange-ftp-parse-bs2000-listing):
+       * obsolete/hilit19.el (hilit-unhighlight-region)
+       (hilit-set-mode-patterns):
+       * play/solitaire.el (solitaire-check, solitaire-solve):
+       * play/zone.el (zone-pgm-rotate):
+       * progmodes/ada-mode.el (ada-save-exceptions-to-file):
+       * progmodes/ada-prj.el (ada-prj-display-page):
+       * progmodes/delphi.el (delphi-search-directory, delphi-find-unit-file)
+       (delphi-debug-mode-map, delphi-mode-map, delphi-mode):
+       * progmodes/ebrowse.el (ebrowse-tree-mode, ebrowse-view-exit-fn)
+       (ebrowse-member-mode, ebrowse-save-tree-as, ebrowse-save-class):
+       * progmodes/sh-script.el (sh-make-vars-local)
+       (sh-reset-indent-vars-to-global-values):
+       * progmodes/sql.el (top):
+       * progmodes/vhdl-mode.el (vhdl-set-style, vhdl-regress-line):
+       * progmodes/xscheme.el (top):
+       * textmodes/artist.el (artist-mt-get-symbol-from-keyword-sub)
+       (artist-go-retrieve-from-symbol-sub, artist-go-get-symbol-shift-sub)
+       (artist-fc-retrieve-from-symbol-sub, artist-vaporize-line)
+       (artist-vaporize-lines, artist-ellipse-compute-fill-info)
+       (artist-submit-bug-report):
+       * textmodes/flyspell.el (flyspell-delay-commands)
+       (flyspell-deplacement-commands):
+       * textmodes/table.el (table--generate-source-epilogue, table-insert)
+       (table--generate-source-cells-in-a-row, table--make-cell-map)
+       (*table--cell-describe-bindings): Use `mapc' rather than `mapcar'.
+
+2007-09-25  Juanma Barranquero  <lekktu@gmail.com>
+
+       * allout.el (produce-allout-mode-map, allout-process-exposed):
+       * ansi-color.el (ansi-color-make-color-map):
+       * autoinsert.el (auto-insert):
+       * bookmark.el (bookmark-bmenu-list, bookmark-show-all-annotations):
+       * dired-aux.el (dired-create-files):
+       * dired.el (dired-restore-desktop-buffer):
+       * ediff-diff.el (ediff-setup-fine-diff-regions):
+       * ediff-mult.el (ediff-intersect-directories)
+       (ediff-redraw-directory-group-buffer, ediff-dir-diff-copy-file)
+       (ediff-redraw-registry-buffer):
+       * ediff-ptch.el (ediff-fixup-patch-map):
+       * ediff-util.el (ediff-toggle-multiframe, ediff-toggle-use-toolbar)
+       (ediff-really-quit, ediff-clear-diff-vector):
+       * emerge.el (emerge-really-quit):
+       * ffap.el (ffap-replace-file-component):
+       * filecache.el (file-cache-add-directory)
+       (file-cache-add-directory-recursively)
+       (file-cache-add-from-file-cache-buffer, file-cache-delete-file-regexp)
+       (file-cache-delete-directory, file-cache-files-matching-internal)
+       (file-cache-display):
+       * files.el (cd):
+       * find-lisp.el (find-lisp-insert-directory):
+       * finder.el (finder-compile-keywords):
+       * help.el (view-emacs-news):
+       * hi-lock.el (hi-lock-write-interactive-patterns):
+       * ido.el (ido-to-end, ido-set-matches-1):
+       * image-dired.el (image-dired-display-thumbs, image-dired-remove-tag)
+       (image-dired-mark-tagged-files):
+       * jka-cmpr-hook.el (jka-compr-get-compression-info):
+       * printing.el (pr-eval-local-alist, pr-eval-setting-alist):
+       * ps-print.el (ps-background, ps-begin-file)
+       (ps-build-reference-face-lists):
+       * simple.el (clone-buffer):
+       * startup.el (command-line):
+       * tempo.el (tempo-insert-template, tempo-is-user-element)
+       (tempo-forward-mark, tempo-backward-mark):
+       * woman.el (woman-dired-define-keys): Use `mapc' rather than `mapcar'.
+
+2007-09-25  Glenn Morris  <rgm@gnu.org>
+
+       * textmodes/tex-mode.el (tex-font-script-display): Doc fix.
+
+       * view.el (view-search-no-match-lines): Add a doc string.
+       Rewrite to simplify and work better.
+
+2007-09-24  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * progmodes/cc-mode.el (c-mode-base-map):
+       Use c-indent-line-or-region instead of c-indent-line.
+
+       * indent.el (indent-for-tab-command): First check if the region is
+       active.
+
+2007-09-24  Micha\e,Ak\e(Bl Cadilhac  <michael@cadilhac.name>
+
+       * whitespace.el (whitespace-tickle-timer): Don't install the timer if
+       whitespace-rescan-timer-time is 0.
+
+2007-09-24  Karl Berry  <karl@gnu.org>
+
+       * international/mule.el (coding-system-base): Fix doc string grammar.
+
+2007-09-24  Michael Albinus  <michael.albinus@gmx.de>
+
+       * net/tramp.el (tramp-completion-mode-p): Rename from
+       `tramp-completion-mode'.  Revert logic, check `return', `newline'
+       and such alike.  Packages like Icicles tend to use other completion
+       characters but `tab' and `space' only.
+
+2007-09-24  Adam Hupp  <adam@hupp.org>
+
+       * progmodes/python.el (run-python): Import emacs module without
+       waiting; prevents lockup on error.
+
+2007-09-23  Richard Stallman  <rms@gnu.org>
+
+       * mail/sendmail.el (mail-bury): Delete the frame
+       if this frame looks like it was made for this message.
+
+       * completion.el (completion-separator-self-insert-command)
+       (completion-separator-self-insert-autofilling):
+       If `self-insert-command' has been remapped, use the substitute.
+
+       * simple.el (copy-region-as-kill): Doc fix.
+
+       * textmodes/org.el (org-confirm-shell-link-function)
+       (org-confirm-elisp-link-function): Doc fixes.
+
+2007-09-23  Glenn Morris  <rgm@gnu.org>
+
+       * ses.el (ses-calculate-cell): Don't evaluate unsafe formulae.
+
+2007-09-23  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * term/w32-win.el (w32-drag-n-drop): Use mapc instead of mapcar.
+
+       * term/tvi970.el (terminal-init-tvi970): Likewise.
+
+       * term/sun-mouse.el (print-mouse-format): Likewise.
+
+       * term/sun.el (scroll-down-in-place, scroll-up-in-place):
+       Use forward-line instead of previous-line and next-line.
+
+2007-09-22  Juri Linkov  <juri@jurta.org>
+
+       * textmodes/org.el (org-confirm-shell-link-function): Doc fix.
+
+       * tutorial.el (tutorial--default-keys): Update standard bindings:
+       rename `iconify-or-deiconify-frame' to `suspend-frame',
+       and `save-buffers-kill-emacs' to `save-buffers-kill-terminal'.
+
+2007-09-22  Juri Linkov  <juri@jurta.org>
+
+       * startup.el (fancy-startup-text, fancy-about-text, fancy-startup-tail):
+       Add help-echo to external links and to links without description.
+       (fancy-splash-insert): Use help-echo from the 3rd element of the
+       link specification list, or "Follow this link" if it's nil.  Doc fix.
+
+2007-09-22  Juri Linkov  <juri@jurta.org>
+
+       * startup.el (command-line): Rename `inhibit-startup-message' to
+       `inhibit-startup-screen'.
+       (fancy-about-text): Use shorter label for "Ordering Manuals".
+       (fancy-startup-tail): Add optional arg `concise'.  When `concise'
+       is nil, display a line with "To start..." and 3 links to useful
+       tasks.  Display the "Dismiss" button and "Don't show this message
+       again" only when concise is non-nil.
+       (fancy-startup-screen): Call `fancy-startup-tail' with optional
+       arg `concise'.  If CONCISE is non-nil, display a concise version
+       of the splash screen in another window.  Otherwise, switch to the
+       startup buffer in the same window.
+       (startup-echo-area-message): Change displayed binding from
+       C-h C-p (describe-project) to C-h C-a (about-emacs), and change
+       text "about the GNU system and GNU/Linux" to "about GNU Emacs and
+       the GNU system".
+       (display-startup-screen): Fix buffer name from "*About GNU Emacs*"
+       to "*GNU Emacs*".
+       (display-about-screen): Don't check the existence of the buffer
+       "*About GNU Emacs*".
+       (display-splash-screen): Make alias to `display-startup-screen'.
+       (command-line-1): Rename `inhibit-startup-message' to
+       `inhibit-startup-screen'.  Inhibit startup screen when Emacs is
+       started with command line options "-f", "-funcall", "-e", "-eval",
+       "-execute", "-insert", "-find-file", "-file", "-visit".
+       Inhibit startup screen when Emacs is started with a file name only
+       on tty (i.e. don't inhibit it when started with a file name like
+       "emacs FILE..." on a window system).
+       (command-line-1): Simplify logic of displaying the startup screen:
+       if file-count > 0, then display the concise version in another
+       window, otherwise display full version in the same window.
+
+       * help.el (help-map): Bind C-h C-a to about-emacs.
+       (help-for-help-internal): Add C-a description to C-h help text.
+
+2007-09-22  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * emacs-lisp/checkdoc.el (checkdoc-force-docstrings-flag)
+       (checkdoc-permit-comma-termination-flag): Autoload the
+       safe-local-variable setting.
+
+       * bookmark.el (bookmark-xemacsp): Remove.
+       (bookmark-make): Don't use bookmark-xemacsp,
+       use (featurep 'xemacs) instead.
+
+       * speedbar.el (speedbar-frame-mode)
+       (speedbar-frame-reposition-smartly)
+       (speedbar-set-mode-line-format, speedbar-reconfigure-keymaps)
+       (speedbar-check-vc): Remove use of non-existent variable
+       dframe-xemacsp, use (featurep 'xemacs) instead.
+
+       * indent.el (indent-for-tab-command): Indent the region if
+       transient-mark-mode and the region is active.
+
+2007-09-21  Francesco Potort\e,Al\e(B  <pot@gnu.org>
+
+       * progmodes/octave-inf.el (inferior-octave-mode): Use add-hook to
+       add inferior-octave-directory-tracker to the buffer-local value
+       of comint-input-filter-functions.
+
+2007-09-21  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * xt-mouse.el (xterm-mouse-mode): Re-enable suspend-tty-functions.
+
+2007-09-21  Juanma Barranquero  <lekktu@gmail.com>
+
+       * frame.el (suspend-frame): Call `iconify-or-deiconify-frame' also
+       on w32 frames.
+
+2007-09-21  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * startup.el (normal-top-level): Remove DISPLAY from
+       process-environment to let it be computed dynamically in callproc.c.
+
+       * frame.el (frame-initialize, make-frame):
+       * faces.el (tty-set-up-initial-frame-faces):
+       * env.el (setenv): Don't set display-environment-variable.
+
+       * server.el (server-getenv-from): Remove.  Use getenv-internal instead.
+       (server-create-tty-frame): Don't set unused `tty' property.
+       Set `display' instead of display-environment-variable.
+       (server-create-window-system-frame): No display-environment-variable.
+
+2007-09-21  Michael Albinus  <michael.albinus@gmx.de>
+
+       * rfn-eshadow.el (rfn-eshadow-setup-minibuffer-hook)
+       (rfn-eshadow-update-overlay-hook): New defvars.
+       (rfn-eshadow-setup-minibuffer, rfn-eshadow-update-overlay):
+       Run the hooks.
+
+       * net/tramp.el (tramp-rfn-eshadow-overlay): New defvar.
+       (tramp-rfn-eshadow-setup-minibuffer)
+       (tramp-rfn-eshadow-update-overlay): New defuns.  Hook into
+       rfn-eshadow.el.
+
+       * net/tramp-smb.el (tramp-smb-errors): Add error message for call
+       timeout.
+
+2007-09-21  Glenn Morris  <rgm@gnu.org>
+
+       * obsolete/sun-fns.el (emacs-quit-menu): Remove emacstool-related code.
+       * term/sun-mouse.el (suspend-emacstool): Remove.
+       * term/sun.el: Remove emacstool-related code.
+
+       * emacs-lisp/bytecomp.el (byte-compile-warnings)
+       (byte-compile-warnings-safe-p): Add `mapcar'.
+       (byte-compile-warning-types): Add mapcar and make-local.
+       (byte-compile-normal-call): Add option to suppress mapcar warning.
+       (top-level): Use mapc rather than mapcar in eval-when-compile.
+
+       * textmodes/tex-mode.el (tex-validate-region): Handle escaped parens.
+       (tex-next-unmatched-eparen, tex-last-unended-eparen): New functions.
+       (latex-forward-sexp-1, latex-backward-sexp-1): Doc fix.
+       Handle escaped parens.
+       (latex-forward-sexp): Doc fix.
+
+       * eshell/esh-mode.el (eshell-output-filter-functions): Add
+       eshell-postoutput-scroll-to-bottom.
+
+       * loadup.el: Remove termdev.
+
+       * progmodes/fortran.el (fortran-mode-abbrev-table, fortran-line-length):
+       * progmodes/f90.el (f90-mode-abbrev-table): Use mapc rather than mapcar.
+
+2007-09-21  Markus Triska  <markus.triska@gmx.at>
+
+       * emacs-lisp/bytecomp.el (byte-compile-normal-call): Warn when
+       `mapcar' is called for effect.
+
+2007-09-21  Kevin Ryde  <user42@zip.com.au>
+
+       * international/mule.el (sgml-html-meta-auto-coding-function):
+       Bind `case-fold-search' to t.
+
+2007-09-20  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * termdev.el: Remove.
+
+       * frame.el (get-device-terminal): New function.  Moved from termdev.el.
+       (frames-on-display-list): Use it.
+
+       * bindings.el: Bind C-z to suspend-frame instead of suspend-emacs.
+
+       * termdev.el (terminal-id): Ask terminal-live-p before giving up.
+
+2007-09-20  Richard Stallman  <rms@gnu.org>
+
+       * newcomment.el (comment-add): If EXTRA, double `comment-add' value.
+
+2007-09-20  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * add-log.el (add-log-current-defun): Fix thinko w.r.t derived-mode-p.
+
+2007-09-20  Glenn Morris  <rgm@gnu.org>
+
+       * textmodes/tex-mode.el (tex-validate-buffer): Use paragraph
+       motion functions, rather than hard-coding "\n\n".
+       (tex-validate-region): Check for eobp, to speed up.
+       (tex-next-unmatched-end): Doc fix.
+
+2007-09-19  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * files.el (auto-mode-alist): Use archive-mode for .rar files.
+
+       * international/mule.el (auto-coding-alist): Rar archives are binary.
+
+       * arc-mode.el: Add basic support for Rar.
+       (archive-find-type): Recognize Rar's signature.
+       (archive-desummarize): New fun.
+       (archive-summarize): Use it to restore the buffer's data in case
+       someone wants to switch to some other major mode.
+       (archive-resummarize): Use it as well.
+       (archive-rar-summarize, archive-rar-extract): New functions.
+
+       * filesets.el: Remove spurious * in docstrings.
+       (filesets-running-xemacs): Remove.  Use (featurep 'xemacs) instead.
+       (filesets-conditional-sort): Remove unused arg `simply-do-it'.
+       (filesets-ingroup-collect): Remove unused arg `depth'.
+       (filesets-update): Remove unused arg `version'.
+
+       * finder.el (finder-compile-keywords): Fix up comment style.
+       (finder-mouse-face-on-line): previous-line -> forward-line.
+
+       * recentf.el: Remove spurious * in docstrings.
+       (recentf-save-list): Fix up comment style.
+
+       * progmodes/octave-mod.el: Remove spurious * in docstrings.
+       (octave-mode-map): Move init into declaration and remove \t binding.
+       (octave-mode-startup-message): Remove unused var.
+       (octave-scan-blocks): Remove unused arg `from'.
+       (octave-forward-block, octave-down-block, octave-up-block):
+       Update callers.
+
+       * progmodes/meta-mode.el (meta-mode-syntax-table): Move init into decl.
+       (meta-mode-map): Likewise and remove \t binding.
+
+       * net/snmp-mode.el: Remove spurious * in docstrings.
+       (snmp-rfc1155-types, snmp-rfc1213-types, snmp-rfc1902-types)
+       (snmp-rfc1903-types, snmp-rfc1155-access, snmp-rfc1902-access)
+       (snmp-rfc1212-status, snmp-rfc1902-status): Remove list wrappers now
+       that completion accepts lists of strings.
+       (snmp-mode-syntax-table): Move initialization into declaration.
+       (snmp-mode-map): Likewise and remove \t binding.
+       (snmp-common-mode): Set tab-always-indent according to snmp-t-a-i.
+       (snmp-indent-line, snmp-mode-imenu-create-index): Remove unused var.
+       (snmp-indent-command): Remove.
+
+       * emacs-lisp/lisp-mode.el (lisp-mode-shared-map): Use the default TAB
+       binding, so tab-always-indent works right.
+
+2007-09-19  Johannes Weiner  <hannes@saeurebad.de>
+
+       * net/browse-url.el (browse-url-elinks-new-window): New function.
+       (browse-url-elinks): Use browse-url-elinks-new-window.
+       Accept optional second argument `new-window'.  Fix typo in doc-string.
+       (browse-url-elinks-sentinel): Use browse-url-elinks-new-window.
+       Improve error message.
+
+2007-09-19  Micha\e,Ak\e(Bl Cadilhac  <michael@cadilhac.name>
+
+       * net/browse-url.el (browse-url-url-encode-chars): Use the right
+       parameter name in the function body.
+       Reported by Johannes Weiner.
+
+2007-09-19  Glenn Morris  <rgm@gnu.org>
+
+       * net/socks.el (socks-open-network-stream): Signal an explicit
+       error if the port associated with a service string can't be found.
+
+       * textmodes/tex-mode.el (tex-terminate-paragraph):
+       Use backward-paragraph.
+
+2007-09-19  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * server.el (server-running-p): New function.
+
+2007-09-18  Jason Rumney  <jasonr@gnu.org>
+
+       * term/w32-win.el (w32-focus-frame): Make obsolete alias for
+       x-focus-frame.
+
+       * frame.el (select-frame-set-input-focus, select-frame-by-name):
+       Use x-focus-frame for w32.
+
+2007-09-17  David Kastrup  <dak@gnu.org>
+
+       * textmodes/tex-mode.el (tex-verbatim-environments):
+       Eliminate CL dependency.
+
+2007-09-17  Richard Stallman  <rms@gnu.org>
+
+       * newcomment.el (comment-add): New arg EXTRA.
+       (comment-region-default): Pass EXTRA if not indenting lines.
+
+2007-09-17  Micha\e,Ak\e(Bl Cadilhac  <michael@cadilhac.name>
+
+       * net/browse-url.el (browse-url-url-encode-chars): New function.
+       URL-encode some chars in a string.
+       (browse-url-encode-url): Rewrite using the previous function.
+       (browse-url-file-url): Use `browse-url-url-encode-chars'.
+       (browse-url-elinks-sentinel): Fix typo.
+       (browse-url-new-window-flag): Doc change.
+
+2007-09-17  Glenn Morris  <rgm@gnu.org>
+
+       * textmodes/tex-mode.el (tex-compilation-parse-errors): Prefer the
+       filename from `--file-line-error', if it is available.
+
+2007-09-17  Joe Wells  <jbw@macs.hw.ac.uk>  (tiny change)
+
+       * textmodes/tex-mode.el (tex-compilation-parse-errors): Also match
+       TeX `--file-line-error' format.
+
+2007-09-17  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * xt-mouse.el: Delete add-hook calls that were moved to
+       xterm-mouse-mode.
+       (xterm-mouse-mode): Disable resume-tty-functions, explain why it
+       does not work.
+
+2007-09-17  Richard Stallman  <rms@gnu.org>
+
+       * cus-face.el (custom-theme-set-faces): Undo previous change.
+
+       * faces.el (face-spec-set): When FRAME nil, look up each frame in SPEC.
+
+2007-09-17  Glenn Morris  <rgm@gnu.org>
+
+       * textmodes/tex-mode.el (tex-region): Simplify previous change,
+       handling the case where the region is not in `tex-main-file'.
+       (tex-region-1): Delete.
+       (tex-region-header): New function, doing the header part of the
+       old tex-region-1.
+
+2007-09-16  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * simple.el (newline): Simplify use of prefix-numeric-value.
+       (line-move-partial): Remove unused var `ppos'.
+       (line-move-1): Replace 9999 with most-positive-fixnum.
+       (move-end-of-line): Use more efficient single-property search.
+       (move-beginning-of-line): Remove unused var `start'.
+       (blink-matching-open): Restructure in a more functional style.
+
+2007-09-16  Micha\e,Ak\e(Bl Cadilhac  <michael@cadilhac.name>
+
+       * calendar/holidays.el (list-holidays): Remove the cyclic alias.
+
+2007-09-16  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * server.el (server-clients): Only keep procs, no properties any more.
+       (server-client): Remove.
+       (server-client-get, server-client-set): Remove, replace all callers by
+       process-get and process-put resp.
+       (server-clients-with, server-add-client, server-delete-client)
+       (server-create-tty-frame, server-create-window-system-frame)
+       (server-process-filter, server-execute, server-visit-files)
+       (server-buffer-done, server-kill-buffer-query-function)
+       (server-kill-emacs-query-function, server-switch-buffer)
+       (server-save-buffers-kill-terminal): Update accordingly.
+
+       * server.el (server-with-environment): Simplify.
+       (server-select-display, server-unselect-display): Re-add functions that
+       seem to have been lost in the multi-tty merge.
+       (server-eval-and-print, server-create-tty-frame)
+       (server-create-window-system-frame, server-goto-toplevel)
+       (server-execute, server-return-error): New functions extracted from
+       server-process-filter.
+       (server-execute-continuation): New functions.
+       (server-process-filter): Restructure so that all arguments are analysed
+       first and then acted upon in a subsequent stage.  This way
+       server-goto-toplevel can be executed later, when we know if
+       it's necessary.
+       Remove the "-version" and "-version-good" support.
+
+2007-09-16  Drew Adams  <drew.adams@oracle.com>
+
+       * cus-edit (custom-face-edit-activate): Doc fix.
+
+2007-09-16  Glenn Morris  <rgm@gnu.org>
+
+       * calendar/cal-menu.el, calendar/calendar.el, calendar/diary-lib.el:
+       Following cal-bahai renaming, update all instances of
+       list-bahai-diary-entries to diary-bahai-list-entries,
+       mark-bahai-diary-entries to diary-bahai-mark-entries,
+       calendar-goto-bahai-date to calendar-bahai-goto-date,
+       insert-bahai-diary-entry to diary-bahai-insert-entry,
+       insert-monthly-bahai-diary-entry to diary-bahai-insert-monthly-entry,
+       insert-yearly-bahai-diary-entry to diary-bahai-insert-yearly-entry, and
+       calendar-print-bahai-date to calendar-bahai-print-date.
+
+       * textmodes/tex-mode.el (tex-region): Handle the case where the
+       region is not in `tex-main-file'.  Move the old code that applies
+       to both cases...
+       (tex-region-1): ...to this new function.
+
+2007-09-15  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * vc.el (vc-process-sentinel): New function.
+       (vc-exec-after): Use it instead of using ugly hackish analysis and
+       construction of Elisp code.
+       (vc-sentinel-movepoint): New dynamically scoped var.
+       (vc-print-log, vc-annotate): Set it to move the user's point.
+
+       * vc-cvs.el (vc-cvs-annotate-time): Use inhibit-read-only and
+       inhibit-modification-hooks.
+
+       * calendar/cal-bahai.el (mark-bahai-diary-entries): Fix up typo.
+       (calendar-bahai-print-date, calendar-bahai-goto-date)
+       (diary-bahai-list-entries, diary-bahai-insert-entry):
+       New names to clean up the namespace a bit more.
+       (calendar-goto-bahai-date, calendar-print-bahai-date): Compat aliases.
+
+2007-09-15  Glenn Morris  <rgm@gnu.org>
+
+       * calendar/holidays.el (holiday-list): Rename it back to
+       `list-holidays', but leave `holiday-list' as an alias.
+
+       * textmodes/bibtex-style.el (bibtex-style-indent-basic): Specify a
+       custom group.
+
+       * textmodes/css-mode.el (css): New custom group.
+       (css-electrick-keys, css-selector, css-property)
+       (css-indent-offset): Specify custom group.
+
+2007-09-15  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * pcvs.el (cvs-tags-list, cvs-retrieve-revision, cvs-find-modif)
+       (cvs-execute-single-file): Use process-file.
+       (cvs-run-process): Use start-file-process.
+
+2007-09-15  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * xt-mouse.el (xterm-mouse-mode): Add hooks here not at the top
+       level.  Remove the hooks when turning off the mode.
+
+       * term/xterm.el: Require xt-mouse at compile time.
+       (terminal-init-xterm): Turn on xterm mouse tracking for this
+       terminal if xterm-mouse-mode is enabled.
+
+2007-09-14  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * term/xterm.el (xterm-function-map): Replace bindings that were
+       deleted by the merge.
+
+2007-09-14  Ulf Jasper  <ulf.jasper@web.de>
+
+       * play/bubbles.el (bubbles-version): Bump value to "0.5".
+       (bubbles-mode-map): Move define-key statements here.
+       (bubbles-game-theme-menu): Ditto.
+       (bubbles-graphics-theme-menu): Ditto.
+       (bubbles-menu): Ditto.
+       (bubbles-mode): Initialize buffer-undo-list, redisplay.
+       (bubbles--initialize): Reset buffer-undo-list, redisplay.
+       (bubbles-plop): Set buffer-undo-list, redisplay.
+       (bubbles-undo): Reset buffer-undo-list, redisplay.
+       (bubbles--show-images): Take care of missing text properties.
+
+2007-09-14  Glenn Morris  <rgm@gnu.org>
+
+       * startup.el (fancy-startup-text, fancy-about-text): Fix face
+       quoting.
+
+       * calendar/cal-hebrew.el, calendar/cal-menu.el
+       * calendar/calendar.el, calendar/diary-lib.el
+       * calendar/holidays.el: Rename all instances of
+       list-calendar-holidays callers to calendar-list-holidays,
+       list-holidays to holiday-list, check-calendar-holidays to
+       calendar-check-holidays, mark-calendar-holidays to
+       calendar-mark-holidays, and filter-visible-calendar-holidays to
+       holiday-filter-visible-calendar.
+
+2007-09-14  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * term/xterm.el (xterm-function-map): Add C-M- bindings.
+
+2007-09-13  Sascha Wilde  <wilde@sha-bang.de>  (tiny change)
+
+       * play/bubbles.el (bubbles--initialize-images): Fix bug:
+       Use transparent background for empty cells in graphics mode.
+
+2007-09-13  Jari Aalto  <jari.aalto@cante.net>
+
+       * man.el (Man-default-man-entry): At end of line, continue looking
+       to the next line for possible end of hyphenated command.
+
+2007-09-13  Chris Moore  <dooglus@gmail.com>
+
+       * shell.el (shell-resync-dirs): Don't move the cursor relative to
+       the command being edited.
+
+2007-09-12  Jim Meyering  <jim@meyering.net>  (tiny change)
+
+       * emacs-lisp/copyright.el (copyright-names-regexp): Doc fix: typo.
+
+2007-09-12  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * term/xterm.el (xterm-function-map): Add bindings for M-S- and
+       C-M-S- keys.
+
+       * term/rxvt.el (rxvt-function-map): Initialize in the declaration.
+
+2007-09-12  Micha\e,Ak\e(Bl Cadilhac  <michael@cadilhac.name>
+
+       * net/browse-url.el (browse-url-encode-url): Fix an infinite loop.
+       New argument `filename-p' to use one set of confusing chars or another.
+       (browse-url-file-url): Use the argument.
+       Suggested by Johannes Weiner.
+
+2007-09-12  Romain Francoise  <romain@orebokech.com>
+
+       * cus-start.el (all): Revert 2007-09-08 change.
+
+2007-09-12  Aaron Hawley  <aaronh@garden.org>
+
+       * jka-cmpr-hook.el (jka-compr-compression-info-list): Use gzip to
+       extract .Z files, since it is more common than uncompress.
+
+2007-09-12  Glenn Morris  <rgm@gnu.org>
+
+       * textmodes/org-publish.el (org-publish-org-to-html): Remove
+       duplicate function definition.
+
+2007-09-10  Chris Moore  <dooglus@gmail.com>
+
+       * diff-mode.el (diff-sanity-check-hunk):
+       Also accept single-line hunks.
+
+2007-09-10  Chong Yidong  <cyd@stupidchicken.com>
+
+       * startup.el (startup-screen-inhibit-startup-screen)
+       (pure-space-overflow-message): New vars.
+       (fancy-splash-insert): Allow functions for face and link specs.
+       (fancy-splash-head): Remove unused arg.  Move splash text...
+       (fancy-startup-text, fancy-about-text): ...here.
+       (fancy-startup-tail): Rename from fancy-splash-tail.
+       (fancy-startup-screen, fancy-about-screen): Split off from
+       fancy-splash-screens.
+       (display-startup-screen): New function.
+       (display-about-screen): Rename from display-splash-screen.
+       (command-line-1): Use concise startup screen if necessary.
+
+2007-09-10  Thien-Thi Nguyen  <ttn@gnuvola.org>
+
+       * net/browse-url.el (browse-url-encode-url): Use copy-sequence.
+       Reported by Jan Dj\e,Ad\e(Brv <jan.h.d@swipnet.se>.
+
+2007-09-10  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * progmodes/python.el: Merge changes from Dave Love's v2007-Sep-10.
+       (python-font-lock-keywords): Update to the 2.5 version of the language.
+       (python-quote-syntax): Let-bind font-lock-syntactic-keywords to nil.
+       (python-backspace): Only behave funny in code.
+       (python-compilation-regexp-alist): Add PDB stack trace regexp.
+       (inferior-python-mode): Add PDB prompt regexp.
+       (python-fill-paragraph): Refine the fenced-string regexp.
+       (python-find-imports): Handle imports spanning several lines.
+       (python-mode): Add `class' to hideshow support.
+
+2007-09-10  Dave Love  <fx@gnu.org>
+
+       * outline.el (outline-4, outline-5, outline-7):
+       Move font-lock-builtin-face down from 4 to 7 to better keep the
+       progression of color brightness, and to better match Org-mode's faces.
+
+2007-09-10  Micha\e,Ak\e(Bl Cadilhac  <michael@cadilhac.name>
+
+       * progmodes/meta-mode.el (meta-font-lock-keywords)
+       (font-lock-match-meta-declaration-item-and-skip-to-next)
+       (meta-comment-indent, meta-indent-previous-line)
+       (meta-indent-unfinished-line, meta-beginning-of-defun)
+       (meta-end-of-defun, meta-common-initialization): Handle \f.
+       (meta-indent-unfinished-line): Do not handle a `%' in a string as
+       a comment-start.
+
+       * files.el (file-modes-char-to-who, file-modes-char-to-right)
+       (file-modes-rights-to-number): Auxiliary functions for symbolic to
+       numeric notation of file modes.
+       (file-modes-symbolic-to-number): New.  Convert symbolic modes to its
+       numeric value.
+       (read-file-modes): New.  Read either an octal value of a file mode or a
+       symbolic value, and return its numeric value.
+
+       * dired-aux.el (dired-do-chmod): Change to use the built-in
+       `set-file-modes' and the previous symbolic mode parsing functions.
+
+2007-09-10  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * textmodes/texinfo.el: Remove spurious * in docstrings.
+       (texinfo-mode-syntax-table, texinfo-mode-map):
+       Initialize in the declaration.
+
+       * tmm.el: Remove spurious * in docstrings.
+       (tmm-prompt): Use with-current-buffer.
+
+       * vcursor.el: Remove spurious * in docstrings.
+       (vcursor-map): Initialize in the declaration.
+       (vcursor-use-vcursor-map): Use define-minor-mode.
+       (vcursor-toggle-vcursor-map): Keep as an obsolete alias.
+
+       * wid-browse.el (widget-browse-mode-map, widget-minor-mode-map):
+       Initialize in the declaration.
+       (widget-minor-mode): Use define-minor-mode.
+
+       * woman.el (woman-mode-map, woman-syntax-table):
+       Initialize in the declaration.
+
+2007-09-09  Tassilo Horn  <tassilo@member.fsf.org>
+
+       * doc-view.el: New file.
+
+2007-09-09  Juri Linkov  <juri@jurta.org>
+
+       * Makefile.in (update-authors): Add etc/ to AUTHORS.
+
+       * makefile.w32-in (update-authors): Add etc/ to AUTHORS.
+
+       * startup.el (initial-buffer-choice): Rename choice "Splash screen"
+       to "Startup screen".  Fix docstring.
+       (inhibit-startup-screen): Rename from `inhibit-splash-screen'.
+       (inhibit-splash-screen): Make alias to `inhibit-startup-screen'.
+       (inhibit-startup-message): Change alias to `inhibit-startup-screen'.
+       (initial-scratch-message): Fix docstring.
+       (fancy-startup-text): Move link to Emacs Manual below Emacs Guided
+       Tour (which is a kind of tutorial and will be next to Emacs Tutorial).
+       Add link to "Customize Startup" and set interval between links to
+       5 spaces.
+       (fancy-about-text): Add links "Authors" and "Contributing".
+       (fancy-splash-head): Add text "Welcome to " on the startup screen,
+       and "This is " on the about screen.  Add link to
+       "http://www.gnu.org/software/emacs/" for "GNU Emacs".
+       For the about screen move emacs version to the header from
+       `fancy-splash-tail' (as it's done already for normal about screen).
+       (fancy-splash-tail): Insert emacs version only for startup screen.
+       (normal-splash-screen): Remove duplicate empty lines.
+       (normal-about-screen): Add links "Authors" and "Contributing".
+
+       * menu-bar.el (menu-bar-help-menu):
+       Move "About Emacs" and "About GNU" to the end of the Help menu.
+       Move "Emacs Psychotherapist" after "Send Bug Report...".
+       Move "External Packages" after "Find Emacs Packages".
+
+2007-09-09  Michael Albinus  <michael.albinus@gmx.de>
+
+       * net/tramp.el (top): Remove declarations of `tramp-gw-*' symbols,
+       they are useless with the byte compiler.
+       (tramp-make-temp-file, tramp-make-tramp-temp-file): Move up.
+       (tramp-do-copy-or-rename-file-directly): Rearrange let-bindings.
+       (tramp-compute-multi-hops): Mask `tramp-gw-*' symbols.
+       (tramp-file-name-real-host, tramp-file-name-port)
+       (tramp-find-method, tramp-find-user, tramp-find-host): Make them
+       defuns.
+
+       * net/tramp-cache.el (top): Improve error message when
+       `tramp-persistency-file-name' is corrupted.
+
+2007-09-09  Carsten Dominik  <dominik@science.uva.nl>
+
+       * textmodes/org.el (org-re): Also replace the :alpha: class.
+       (org-todo-tag-alist): Variable removed.
+       (org-todo-key-alist, org-todo-key-trigger) New variables.
+       (org-use-fast-todo-selection): New option.
+       (org-log-done): Docstring fixed.
+       (org-deadline-warning-days): New default value 14.
+       (org-edit-timestamp-down-means-later) New option.
+       (org-tag-alist): Docstring fixed.
+       (org-fast-tag-selection-include-todo): New option.
+       (org-export-language-setup): New languages added.
+       (org-set-regexps-and-options): Compute the new variables.
+       (org-paste-subtree): Cleaning up.
+       (org-remember-apply-template): New escape %A.
+       (org-todo): Call fast TODO selection.
+       (org-fast-todo-selection): New function.
+       (org-add-log-note): Allow prefix for abort exit.
+       (org-at-property-p, org-entry-properties)
+       (org-columns-get-autowidth-alist): Use :alpha: class.
+       (org-get-wdays): New function.
+       (org-agenda-remove-date): New variable.
+       (org-agenda-get-deadlines): Use `org-get-wdays'.
+       (org-agenda-get-deadlines): Reverse ee before returning.
+       (org-format-agenda-item): New argument REMOVE-RE.
+       (org-agenda-convert-date): Baha'i calendar added.
+       (org-infile-export-plist): Also find DATE line.
+       (org-get-min-level): New function.
+       (org-export-as-html, org-export-as-ascii): Use the date format.
+       (org-shiftup, org-shiftdown): Use.
+       `org-edit-timestamp-down-means-later'.
+       (org-assign-fast-keys): New function.
+
+2007-09-08  Fredrik Axelsson  <f.axelsson@gmail.com>
+
+       * cus-start.el (all): Add prefer-window-split-horizontally from
+       window.c.
+
+2007-09-08  Eli Zaretskii  <eliz@gnu.org>
+
+       * net/browse-url.el (browse-url-galeon): Fix last change.
+       (top-level): Require cl when compiling.
+
+2007-09-08  Carsten Dominik  <dominik@science.uva.nl>
+
+       * textmodes/org-export-latex.el: arch-tag restored.
+
+       * textmodes/org-publish.el: arch-tag restored.
+
+2007-09-08  Masatake YAMATO  <jet@gyve.org>
+
+       * progmodes/which-func.el (which-func-modes): Add diff-mode.
+
+       * progmodes/cc-langs.el: Support new keywords added to
+       objective-c frontend of gcc.
+       (c-simple-stmt-kwds): Add @throw.
+       (c-block-stmt-2-kwds): Add @synchronized.
+       (c-block-stmt-1-kwds): Add @finally and @try.
+
+2007-09-07  Carsten Dominik  <dominik@science.uva.nl>
+
+       * textmodes/org.el (org-edit-timestamp-down-means-later): New option.
+       (org-agenda-after-show-hook): New variable.
+       (org-columns-compile-format)
+       (org-columns-get-autowidth-alist, org-buffer-property-keys)
+       (org-entry-properties, org-at-property-p): Allow [:alnum:] in
+       property names.
+       (org-get-wdays): New function.
+
+2007-09-07  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * simple.el (normal-erase-is-backspace-setup-frame): Massage.
+
+       * term/xterm.el (xterm-function-map): Initialize in the declaration.
+
+       * vc-arch.el (vc-arch-checkin): Fix typo.
+
+2007-09-07  Johan Bockg\e,Ae\e(Brd  <bojohan@gnu.org>
+
+       * cus-face.el (custom-theme-set-faces): Set face attributes
+       locally for each frame.
+
+2007-09-07  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * progmodes/fortran.el (fortran-mode): Set font-lock-syntactic-keywords
+       via font-lock-defaults.
+
+       * emacs-lisp/bytecomp.el (byte-compile-log-file): Check major-mode via
+       derived-mode-p.
+
+2007-09-07  Thien-Thi Nguyen  <ttn@gnuvola.org>
+
+       * progmodes/autoconf.el (autoconf-definition-regexp):
+       Handle optional square brackets around definition name.
+
+2007-09-07  Johannes Weiner  <hannes@saeurebad.de>
+
+       * net/browse-url.el (browse-url-browser-function): Add elinks.
+       (browse-url-elinks-wrapper): New option.
+       (browse-url-encode-url, browse-url-elinks)
+       (browse-url-elinks-sentinel): New functions.
+       (browse-url-file-url, browse-url-netscape, browse-url-mozilla)
+       (browse-url-firefox, browse-url-galeon, browse-url-epiphany):
+       Use new function browse-url-encode-url.
+
+2007-09-07  Glenn Morris  <rgm@gnu.org>
+
+       * version.el (emacs-version): Revert 2007-08-29 change: no need to
+       say if multi-tty is present.
+
+2007-09-07  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * cus-start.el (split-window-preferred-function): Add custom info.
+
+       * calendar/holidays.el (holiday-list, calendar-check-holidays)
+       (calendar-mark-holidays, calendar-list-holidays)
+       (holiday-filter-visible-calendar): New names to clean up namespace.
+       (filter-visible-calendar-holidays, list-calendar-holidays)
+       (mark-calendar-holidays, check-calendar-holidays, list-holidays):
+       Add compatibility aliases.
+       (calendar-check-holidays, calendar-mark-holidays)
+       (calendar-holiday-list, holiday-filter-visible-calendar): Use dolist.
+       (holiday-sexp): Replace append with list.
+       (holiday-filter-visible-calendar): Replace append with push.
+
+       * woman.el: Remove spurious * in docstrings.
+       (woman-mini-help, woman-non-underline-faces, woman0-rename)
+       (woman-topic-all-completions-merge, woman-file-name-all-completions)
+       (woman-select-symbol-fonts, woman-expand-directory-path): Use dolist.
+       (woman-write-directory-cache, woman-display-extended-fonts)
+       (WoMan-log-begin, WoMan-log-1): Use with-current-buffer.
+       (woman-really-find-file): Use pop-to-buffer if switch-to-buffer fails.
+       (woman-mode): Use inhibit-read-only.
+       (woman-negative-vertical-space): Use dotimes.
+       (woman2-tagged-paragraph, woman-tab-to-tab-stop): Use insert-char.
+
+2007-09-06  Romain Francoise  <romain@orebokech.com>
+
+       * vc-bzr.el (vc-bzr-admin-lastrev): New defconst.
+       (vc-bzr-workfile-version): Use it.
+
+2007-09-06  Sean O'Rourke  <sorourke@cs.ucsd.edu>
+
+       * complete.el (PC-do-completion): Don't try to treat
+       empty string as an abbreviation.
+
+2007-09-06  Johan Bockg\e,Ae\e(Brd  <bojohan@dd.chalmers.se>
+
+       * help-fns.el (describe-variable): Keep doc's text properties.
+
+2007-09-06  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * vc.el (vc-default-diff-tree): Pass a list to the diff vc command
+       instead of a file.
+
+2007-09-06  Glenn Morris  <rgm@gnu.org>
+
+       * emacs-lisp/checkdoc.el (checkdoc-minor-mode-string): New.
+       (checkdoc-minor-mode): Allow user to specify lighter via
+       checkdoc-minor-mode-string.
+
+2007-09-05  Richard Stallman  <rms@gnu.org>
+
+       * startup.el (fancy-startup-text): Rename from fancy-splash-text.
+       Several items removed, simplified, or put on one line.
+       (fancy-about-text): Add substantial contents, part of startup text.
+       (fancy-splash-head): Make "GNU" or "GNU/Linux" a link.
+       (normal-splash-screen): Call normal-mouse-startup-screen,
+       normal-no-mouse-startup-screen, or normal-about-screen.
+       (normal-mouse-startup-screen): New fn, broken out, shortened.
+       (normal-no-mouse-startup-screen): New fn, broken out.
+       (normal-about-screen): New function, contents all new.
+
+2007-09-05  Micha\e,Ak\e(Bl Cadilhac  <michael@cadilhac.name>
+
+       * emacs-lisp/rx.el (rx): Fix typo in docstring.
+
+2007-09-05  Glenn Morris  <rgm@gnu.org>
+
+       * cus-edit.el (custom-buffer-create-internal): Check tool-bar-mode
+       is bound.
+
+2007-09-05  Johan Bockg\e,Ae\e(Brd  <bojohan@dd.chalmers.se>
+
+       * emacs-lisp/advice.el (ad-make-advised-docstring): Highlight note
+       in doc string.
+
+2007-09-04  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * server.el (server-start, server-unload-hook): Undo previous change.
+
+       * xt-mouse.el: Undo previous change.
+
+2007-09-04  Juri Linkov  <juri@jurta.org>
+
+       * startup.el (fancy-about-text): New variable.
+       (fancy-splash-delay, fancy-splash-max-time): Remove user options.
+       (fancy-current-text, fancy-splash-stop-time)
+       (fancy-splash-outer-buffer): Remove variables.
+       (fancy-splash-head, fancy-splash-tail): Add new optional argument
+       `startup' and use it to conditionally display different texts for
+       Startup and About screens.  Don't display Help commands on the About
+       screen.
+       (fancy-splash-screens-1): Remove function and move its content to
+       `fancy-splash-screens' to the part that dislpays the About screen.
+       (exit-splash-screen): Don't treat specially exiting from
+       alternating screens.
+       (fancy-splash-screens): Rename argument `static' to `startup'.
+       Fix docstring.  Remove code for displaying alternating screens.
+       Use arg `startup' in calls to `fancy-splash-head', `fancy-splash-tail'.
+       Remove let-bind for `fancy-splash-outer-buffer' and add let-bind
+       for `inhibit-read-only'.
+       (normal-splash-screen): Rename argument `static' to `startup'.
+       Fix docstring.  Use argument `startup' to conditionally display
+       different texts for Startup and About screens.  Don't display Help
+       commands on the About screen.  Remove `unwind-protect' `sit-for'
+       delay and `kill-buffer' after it.
+       (display-startup-echo-area-message): Remove call to
+       `use-fancy-splash-screens-p' because image.el is preloaded and
+       doesn't display "Loading image... done".
+       (display-splash-screen): Rename argument `static' to `startup'.
+       Fix docstring.
+
+2007-09-04  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * server.el (server-start, server-unload-hook):
+       suspend-tty-functions has been renamed to suspend-tty-hook.
+
+       * xt-mouse.el: Likewise. resume-tty-functions has been renamed to
+       resume-tty-hook.
+
+2007-09-03  Emanuele Giaquinta  <e.giaquinta@glauco.it>  (tiny change)
+
+       * loadup.el: Fix merge problem, only load "button" once.
+
+2007-09-03  Glenn Morris  <rgm@gnu.org>
+
+       * vc-svn.el (vc-svn-print-log): If there is only one file, use
+       "Working file:" as the prefix, for the sake of
+       log-view-current-file.
+
+2007-09-02  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * term/xterm.el (xterm-modify-other-keys-terminal-list): New variable.
+       (xterm-turn-on-modify-other-keys): Only turn on modify-other-keys
+       if the selected frames is in
+       xterm-modify-other-keys-terminal-list.
+       (xterm-turn-off-modify-other-keys): Add an optional frame
+       parameter.  Only turn off modify-other-keys if FRAME is in
+       xterm-modify-other-keys-terminal-list.
+       (xterm-remove-modify-other-keys): New function.
+       (terminal-init-xterm): Use it.  Deal with delete-frame hook.
+       Add the selected frame to xterm-modify-other-keys-terminal-list.
+
+2007-09-02  Jan Dj\e,Ad\e(Brv  <jan.h.d@swipnet.se>
+
+       * term/x-win.el (x-gtk-stock-map): Map diropen to system-file-manager.
+       (icon-map-list): New variable.
+       (x-gtk-map-stock): Use icon-map-list.
+
+2007-09-02  Romain Francoise  <romain@orebokech.com>
+
+       * log-view.el (log-view-current-file): Balance parens.
+
+2007-09-02  Glenn Morris  <rgm@gnu.org>
+
+       * comint.el (comint-mode): Don't set scroll-conservatively.
+
+       * eshell/em-unix.el (eshell/time): Stringify and flatten the
+       non-command arguments.
+
+       * log-view.el (log-view-current-file): Give a more explicit error
+       if log-view-file-re fails to find a match.
+
+2007-09-01  Thien-Thi Nguyen  <ttn@gnuvola.org>
+
+       * emacs-lisp/bytecomp.el (byte-recompile-directory):
+       Fix bug: Don't expand top-level file name more than once.
+       Reported by Dmitry Antipov <dmantipov@yandex.ru>.
+
+2007-09-01  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * server.el (server-process-filter): Don't display the splash screen.
+       It's annoying enough on the initial screen and becomes positively
+       obnoxious here.
+
+2007-08-31  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * emacs-lisp/avl-tree.el: Use defstruct rather than macros.
+       Change naming to use "avl-tree--" for internal functions.
+
+2007-08-31  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * term/x-win.el (x-menu-bar-open): Delete duplicated function from
+       the merge.
+       (global-set-key): Delete f10 mapping, now done in menu-bar.el.
+       (provide): Move to the end of file.
+
+       * vc-svn.el (vc-svn-diff-tree): Pass a list to vc-svn-diff.
+
+2007-08-31  Micha\e,Ak\e(Bl Cadilhac  <michael@cadilhac.name>
+
+       * textmodes/flyspell.el (flyspell-mark-duplications-exceptions):
+       New variable.  List of exceptions for the duplicated word rule.
+       (flyspell-mark-duplications-flag): Mention it.
+       (flyspell-word): Treat it.
+
+       * files.el (create-file-buffer): If the filename sans directory starts
+       with spaces, remove them.
+
+2007-08-31  Jan Dj\e,Ad\e(Brv  <jan.h.d@swipnet.se>
+
+       * term/x-win.el (x-gtk-stock-map): Add etc/images to keys.
+       (x-gtk-map-stock): Use two directory elements when matching
+       file name.
+
+2007-08-31  James Wright  <james@chumsley.org>
+
+       * eshell/em-unix.el (eshell/info): New function.
+
+2007-08-31  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * frame.el (frame-initialize, make-frame):
+       * server.el (server-process-filter):
+       * faces.el (tty-set-up-initial-frame-faces): Don't set
+       term-environment-variable since it's not used any more.
+
+       * env.el (setenv): Don't treat $TERM specially.
+
+       * startup.el (normal-top-level): Set $TERM to `dumb' so that unless
+       stated otherwise, subprocesses do not send back escape sequences
+       corresponding to the terminal from which Emacs was started.
+
+2007-08-31  Thien-Thi Nguyen  <ttn@gnuvola.org>
+
+       * calculator.el: Require cl for compilation.
+
+2007-08-30  Daniel Pfeiffer  <occitan@esperanto.org>
+
+       * outline.el (outline-font-lock-levels): Comment out unused var.
+       (outline-font-lock-face): Wrap around face list to handle any
+       nesting depth gracefully.
+
+2007-08-30  Michael Albinus  <michael.albinus@gmx.de>
+
+       * net/ange-ftp.el: Add ange-ftp property to `set-file-modes' and
+       `set-file-times'.
+
+2007-08-30  Carsten Dominik  <dominik@science.uva.nl>
+
+       * textmodes/org.el (org-export-visible): Fix drawers before export.
+       (org-do-sort): Allow sorting by priority.
+       (org-agenda-files): Ignore non-existing files.
+       (org-agenda-skip-unavailable-files): New variable.
+       (org-ellipsis): All a face as value.
+       (org-mode): Interprete the face value of `org-ellipsis'.
+       (org-archive-save-context-info): New option.
+       (org-archive-subtree): Store context info in archived entry.
+       (org-fast-tag-selection-can-set-todo-state): New variable.
+       (org-fast-tag-selection): Allow setting TODO states through this
+       interface.
+       (org-cycle): Docstring updated.
+       (org-todo-keyword-faces): New option.
+       (org-get-todo-face): New function.
+       (org-set-font-lock-defaults, org-agenda-highlight-todo):
+       Use `org-get-todo-face'.
+       (org-switch-to-buffer-other-window): New function.
+       (org-table-edit-field, org-table-show-reference)
+       (org-table-edit-formulas, org-add-log-note)
+       (org-fast-tag-selection, org-agenda, org-prepare-agenda)
+       (org-timeline): Use `org-switch-to-buffer-other-window' instead of
+       `switch-to-buffer-other-window' to make sure that the temporary
+       windows show up on the current frame.
+       (org-mhe-get-message-real-folder, org-batch-store-agenda-views)
+       (org-get-entries-from-diary, org-replace-region-by-html):
+       Don't allow pop-up frames.
+       (org-agenda-get-deadlines, org-agenda-get-scheduled):
+       Fix problems with time-of-day.
+       (org-export-get-title-from-subtree): New function.
+       (org-agenda-get-scheduled, org-agenda-get-deadlines): Fix problems
+       with listing items that are DONE.
+       (org-change-tag-in-region): New command.
+       (org-agenda-skip-scheduled-if-done)
+       (org-agenda-skip-deadline-if-done): Docstring clarified.
+       (org-mode): Hide drawers on startup.
+       (org-get-todo-face): New function.
+       (org-todo-keyword-faces): New option.
+       (org-set-regexps-and-options): Use `org-remove-keyword-keys'.
+       (org-remove-keyword-keys): New function.
+
+2007-08-30  Jari Aalto  <jari.aalto@cante.net>  (tiny change)
+
+       * progmodes/grep.el (grep-find-ignored-directories):
+       Add monotone _MTN bookkeeping directory in workspaces.
+       Add RCS control directory.  List items in alphabetical order.
+
+       * progmodes/grep.el (grep-files-aliases): Add cc alias.
+       Sort items in alphabetical order.  Fix parens.
+
+2007-08-29  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * vc-hg.el (vc-hg-extra-menu-map): New variable.
+       (vc-hg-extra-menu, vc-hg-outgoing, vc-hg-incoming, vc-hg-push)
+       (vc-hg-pull): New functions.
+       (vc-hg-outgoing-mode, vc-hg-incoming-mode): New derived modes.
+
+       * term/mac-win.el: Don't require url, only autoloaded url
+       functions are used in this file.
+
+2007-08-29  Andreas Schwab  <schwab@suse.de>
+
+       * shell.el (shell): Return correct value from interactive spec.
+
+2007-08-29  Glenn Morris  <rgm@gnu.org>
+
+       * version.el (emacs-version): Increase to 23.0.50.
+
+2007-08-29  Jan Dj\e,Ad\e(Brv  <jan.h.d@swipnet.se>
+
+       * term/x-win.el (x-gtk-stock-map): :version changed to 23.1.
+
+2007-08-29  Juri Linkov  <juri@jurta.org>
+
+       * loadup.el: Add "button" loading after "faces" and move "startup"
+       to load after "button".
+
+2007-08-29  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * loadup.el: Load term/mac-win on a Mac using Carbon.
+
+       * term/mac-win.el: Provide mac-win.
+       (mac-initialized): New variable.
+       (mac-initialize-window-system): New function.  Move global setup here.
+       (handle-args-function-alist, frame-creation-function-alist):
+       (window-system-initialization-alist): Add mac entries.
+       (x-setup-function-keys): New function containing all the
+       top level function key definitions.
+
+       * term/x-win.el (x-menu-bar-open): Use accelerate-menu.
+
+       * env.el (read-envvar-name): Don't consider the environment frame param.
+
+       * env.el (setenv):
+       * frame.el (frame-initialize, make-frame):
+       * faces.el (tty-set-up-initial-frame-faces):
+       * server.el (server-process-filter): Set
+       display-environment-variable and term-environment-variable.
+
+       * server.el (server-process-filter): Set COLORFGBG and COLORTERM.
+
+2007-08-29  Jason Rumney  <jasonr@gnu.org>
+
+       * loadup.el: Only load term/x-win when X is compiled in.
+       Load term/w32-win and dependencies on windows-nt.
+
+       * term/w32-win.el: Reorder to match x-win.el more closely.
+       Provide w32-win.  Don't throw error when global window-system not w32.
+       (internal-face-interactive): Remove obsolete function.
+       (x-setup-function-keys): Use local-function-key-map.
+       (w32-initialized): New variable.
+       (w32-initialize-window-system): Set it.
+       Move more global setup here.
+       (x-setup-function-keys): New function.
+       (w32-initialize-window-system): Move non function key global setup here.
+       (x-cut-buffer-max): Remove.
+       (w32-initialize-window-system): New function.
+       (handle-args-function-alist, frame-creation-function-alist):
+       (window-system-initialization-alist): Add w32 entries.
+
+2007-08-29  David Kastrup  <dak@gnu.org>
+
+       * env.el (getenv): Pass frame to getenv-internal.
+
+2007-08-29  Karoly Lorentey  <lorentey@elte.hu>
+
+       * version.el (emacs-version): Show if multi-tty is present.
+
+       * loadup.el: Delay loading env; mule-conf gets confused by cl
+       during bootstrap.  Also load termdev and term/x-win.
+
+       * bindings.el (mode-line-client): New variable.
+       (help-echo): Add it to the default mode-line format.
+
+       * cus-start.el: Remove bogus window-system reference from GTK test.
+
+       * ebrowse.el (ebrowse-electric-list-mode-map)
+       (ebrowse-electric-position-mode-map):
+       * ebuff-menu.el (electric-buffer-menu-mode-map):
+       * echistory.el (electric-history-map): Bind C-z to `suspend-frame',
+       not `suspend-emacs'.
+
+       * ediff-wind.el (ediff-setup-windows-automatic): New function.
+       (ediff-window-setup-function): Use it as default.
+
+       * files.el (save-buffers-kill-terminal): New function.
+       (ctl-x-map): Change binding of C-x C-c to save-buffers-kill-terminal.
+
+       * font-lock.el (lisp-font-lock-keywords-2): Add `let-environment'
+       and `with-selected-frame'.
+
+       * help-fns.el (describe-variable): Describe frame-local variables
+       correctly.
+
+       * simple.el (normal-erase-is-backspace-mode): Rewrite for multiple
+       display support.
+       (normal-erase-is-backspace-setup-frame): New function.
+
+       * subr.el (with-selected-frame): New function.
+       (read-quoted-char): Use terminal-local binding of
+       local-function-key-map instead of function-key-map.
+
+       * talk.el (talk): New function.
+       (talk-handle-delete-frame): New function.
+       (talk-add-display): Open a new frame only if FRAME was not a frame.
+
+       * termdev.el: New file.
+
+       * menu-bar.el (menu-bar-open): New function.  Bind it to f10.
+       * term/x-win.el: Don't bind f10.
+       * tmm.el: Remove autoload binding for f10.
+
+       * international/encoded-kb.el (encoded-kbd-setup-display): Use
+       `set-input-meta-mode'.  Fix broken condition before set-input-mode.
+       Store the saved input method as a terminal parameter.  Add keymap
+       parameter.  Use it instead of changing key-translation-map directly.
+       (saved-key-translation-map, encoded-kbd-mode, saved-input-mode):
+       Remove.
+       (encoded-kbd-setup-display): New function.
+
+       * international/mule-cmds.el (set-locale-environment): Fix getenv
+       call.  Use save-buffers-kill-terminal.  Ignore window-system; always
+       set the keyboard coding system.  Add DISPLAY parameter.
+       (set-display-table-and-terminal-coding-system): Add DISPLAY
+       parameter.  Pass it to set-terminal-coding-system.
+
+       * international/mule.el (keyboard-coding-system): Test for
+       encoded-kbd-setup-display, not encoded-kbd-mode.
+       (set-terminal-coding-system, set-keyboard-coding-system): Add
+       DISPLAY parameter.
+       (set-keyboard-coding-system): Use encoded-kbd-setup-display.
+
+       * term/README: Update.
+
+       * term/linux.el (terminal-init-linux): Use `set-input-meta-mode'.
+
+       * term/x-win.el (x-setup-function-keys): New function.  Move
+       function-key-map tweaks here.  Protect against multiple calls on
+       the same terminal.  Use terminal-local binding of
+       local-function-key-map instead of function-key-map.
+       (x-initialize-window-system): Make a copy of pure list.  Pass a
+       frame getenv.
+
+       * term/vt200.el, term/vt201.el, term/vt220.el, term/vt240.el:
+       * term/vt300.el, term/vt320.el, term/vt400.el, term/vt420.el:
+       * term/AT386.el, term/internal.el, term/iris-ansi.el, term/lk201.el:
+       * term/mac-win.el, term/news.el, term/rxvt.el, term/sun.el:
+       * term/tvi970.el, term/wyse50.el: Use terminal-local binding of
+       local-function-key-map instead of function-key-map.
+
+       * term/rxvt.el, term/xterm.el: Speed up load time by protecting
+       `substitute-key-definition' and `define-key' calls against
+       multiple execution.  Use terminal-local binding of
+       local-function-key-map instead of function-key-map.  Pass a frame
+       to getenv.
+
+       * edmacro.el (edmacro-format-keys):
+       * emulation/cua-base.el (cua--pre-command-handler):
+       * isearch.el (isearch-other-meta-char):
+       * xt-mouse.el: Use terminal-local binding of
+       local-function-key-map instead of function-key-map.
+
+       * fringe.el (set-fringe-mode): Simplify and fix using
+       `modify-all-frames-parameters'.
+       * scroll-bar.el (set-scroll-bar-mode): Ditto.
+       * tool-bar.el (tool-bar-mode): Ditto.  Remove 'tool-bar-map length
+       check before calling `tool-bar-setup'.
+       (tool-bar-setup): New variable.
+       (tool-bar-setup): Use it to guard against multiple calls.  Add
+       optional frame parameter, and select that frame before adding items.
+       (toggle-tool-bar-mode-from-frame): New function.
+
+       * menu-bar.el (toggle-menu-bar-mode-from-frame): New function.
+       (menu-bar-showhide-menu): Use toggle-menu-bar-mode-from-frame and
+       toggle-tool-bar-mode-from-frame to change "Menu-bar" and
+       "Tool-bar" toggles to reflect the state of the current frame.
+       (menu-bar-mode): Simplify and fix using `modify-all-frames-parameters'.
+
+       * env.el: Require cl for byte compilation (for `block' and `return').
+       (environment, setenv-internal): New functions.
+       (let-environment): New macro.
+       (setenv, getenv): Add optional terminal parameter.  Update docs.
+       (setenv): Use setenv-internal.  Always set process-environment.
+       Handle `local-environment-variables'.
+       (read-envvar-name, setenv, getenv): Use frame parameters
+       to store the local environment, not terminal parameters.  Include
+       `process-environment' as well.
+
+       * faces.el (tty-run-terminal-initialization): New function.
+       (tty-create-frame-with-faces): Use it.  Set up faces and
+       background mode only after the terminal has been initialized.
+       Call terminal-init-*.  Don't load the initialization file more
+       than once.  Call set-locale-environment.
+       (frame-set-background-mode): Handle the 'background-mode terminal
+       parameter.
+       (tty-find-type): New function.
+       (x-create-frame-with-faces): Remove bogus check for
+       first frame.  Call `tool-bar-setup'.  Don't make frame visible
+       until we are done setting up all its parameters.  Call
+       x-setup-function-keys.
+
+       * frame.el (make-frame): Always inherit 'environment and 'client
+       parameters.  Set up the 'environment frame parameter, when needed.
+       Also inherit 'client parameter.  Don't override explicitly
+       specified values with inherited ones.  Add 'terminal frame
+       parameter.  Append window-system-default-frame-alist to parameters
+       before calling frame-creation-function.
+       (frame-initialize): Copy the environment from the initial frame.
+       (window-system-default-frame-alist): Enhance doc string.
+       (frame-notice-user-settings): Don't put 'tool-bar-lines in
+       `default-frame-alist' when initial frame is on a tty.
+       (modify-all-frames-parameters): Simplify using `assq-delete-all'.
+       Remove specified parameters from `window-system-default-frame-alist'.
+       (make-frame-on-tty, framep-on-display, suspend-frame):
+       Extend doc string, update parameter names.
+       (frames-on-display-list): Use terminal-id to get the display id.
+       (frame-notice-user-settings): Extend to apply
+       settings in `window-system-default-frame-alist' as well.
+       (terminal-id, terminal-parameters, terminal-parameter)
+       (set-terminal-parameter, terminal-handle-delete-frame): New functions.
+       (delete-frame-functions): Add to `delete-frame-functions' hook.
+       (blink-cursor-mode): Adapt blink-cursor-mode default
+       value from startup.el.
+       (make-frame-on-display): Protect condition on x-initialized when
+       x-win.el is not loaded.  Update doc.
+       (suspend-frame): Use display-controlling-tty-p to decide between
+       suspend-emacs and suspend-tty.
+       (frames-on-display-list): Update for display ids.
+       (framep-on-display): Ditto.
+       (suspend-frame): Use display-name, not frame-tty-name.
+       (selected-terminal): New function.
+
+       * server.el: Use `device' instead of `display' or `display-id' in
+       variable and client parameter names.
+       (server-select-display): Remove (unused).
+       (server-tty-live-p, server-handle-delete-tty): Remove.
+       (server-unquote-arg, server-quote-arg, server-buffer-clients):
+       Update docs.
+       (server-getenv-from, server-with-environment, server-send-string)
+       (server-save-buffers-kill-terminal): New functions.
+       (server-delete-client): Handle quits in kill-buffer.  Don't kill
+       modified buffers.  Add extra logging.  Delete frames after
+       deleting the tty.  Clear 'client parameter before deleting a frame.
+       Use delete-display, not delete-tty.
+       (server-visit-files): Don't set `server-existing-buffer' if the
+       buffer already has other clients.  Return list of buffers
+       created.  Update doc.  Don't set client-record when nowait.
+       (server-handle-delete-frame): Delete the client if this was its
+       last frame.  Check that the frame is alive.  Remove bogus comment.
+       Add note on possible race condition.  Delete tty clients, if needed.
+       (server-handle-suspend-tty): Use server-send-string.  Kill the
+       client in case of errors from process-send-string.  Use the display
+       parameter.
+       (server-unload-hook): Remove obsolete delete-tty hook.
+       (server-start): Ask before restarting if the old server still has
+       clients.  Add feedback messages.  Remove obsolete delete-tty hook.
+       (server-process-filter): Use server-send-string.  Accept `-dir'
+       command.  Switch to *scratch* immediately after creating the frame,
+       before evaluating any -evals.  Protect `display-splash-screen'
+       call in a condition-case.  Explain why.  Call
+       `display-startup-echo-area-message' before
+       `display-splash-screen'.  Don't display the splash screen when no
+       frame was created.  Show the Emacs splash screen and startup echo
+       area message.  Display the *scratch* buffer by default.  Store the
+       local environment in a frame (not terminal) parameter.  Do not try
+       to decode environment strings.  Fix reference to the 'display
+       frame parameter.  Change syntax of environment variables.  Put
+       environment into terminal parameters, not client parameters.  Use
+       a dummy client with --no-wait's X frames.  In `-position LINE'
+       handler, don't ruin the request string until the line number is
+       extracted.  Log opened files.  Handle -current-frame command.
+       Don't create frames when it is given.  Don't bind X frames to the
+       client when we are in -no-wait mode.  Set locale environment
+       variables from client while creating tty frames.  Disable call to
+       configure-display-for-locale.  When processing -position command,
+       don't change the request string until the parameters are
+       extracted.  Don't try to create an X frame when Emacs does not
+       support it.  Improve logging.  Temporarily set ncurses-related
+       environment variables to those of the client while creating a new
+       tty frame.  Select buffers opened by nowait clients, don't leave
+       them buried under others.  Set the display parameter, and use it
+       when appropriate.
+
+       * startup.el (display-startup-echo-area-message): Handle
+       `inhibit-startup-echo-area-message' here.
+       (command-line-1): Moved from here.
+       (fancy-splash-screens): Use `overriding-local-map' instead of
+       `overriding-terminal-local-map' for now; the latter doesn't work
+       right, it looses keypresses to another terminal.  Use
+       `overriding-terminal-local-map' to set up keymap.  Install a
+       `delete-frame-functions' hook to catch `delete-frame' events.
+       Ignore `select-window' events to cope better with
+       `focus-follows-mouse'.  Don't switch back to the original buffer
+       if the splash frame has been killed.  Restore previous buffer, even
+       if it's *scratch*.
+       (normal-splash-screen): Don't let-bind `mode-line-format'; it
+       changes the global binding - setq it instead.  Use
+       `save-buffers-kill-terminal'.
+       (display-splash-screen): Don't do anything if the splash screen is
+       already displayed elsewhere.
+       (fancy-splash-exit, fancy-splash-delete-frame): New functions.
+       (command-line): Replace duplicated code with a call to
+       tty-run-terminal-initialization.  Don't load the terminal
+       initialization file more than once.  Remove call to nonexistent
+       function `set-locale-translation-file-name'.
+
+       * xt-mouse.el (xterm-mouse-x, xterm-mouse-y): Convert to terminal
+       parameters.
+       (xterm-mouse-position-function, xterm-mouse-event): Update.
+       (xterm-mouse-mode): Don't depend on current value of window-system.
+       (turn-on-xterm-mouse-tracking, turn-off-xterm-mouse-tracking):
+       Update for multi-tty.
+       (turn-on-xterm-mouse-tracking-on-terminal)
+       (turn-off-xterm-mouse-tracking-on-terminal)
+       (xterm-mouse-handle-delete-frame): New functions.
+       (delete-frame-functions, after-make-frame-functions)
+       (suspend-tty-functions, resume-tty-functions): Install extra hooks
+       for multi-tty.
+
 2007-10-10  Vinicius Jose Latorre  <viniciusjl@ig.com.br>
 
        * ps-print.el: Fix the usage of :foreground and :background face
 
 2007-08-28  Michael Albinus  <michael.albinus@gmx.de>
 
-       * net/tramp.el (tramp-handle-set-file-times): Flush the file
-       properties.
+       * net/tramp.el (tramp-handle-set-file-times): Flush the file properties.
        (tramp-set-file-uid-gid, tramp-get-local-uid)
        (tramp-get-local-gid): New defuns.
        (tramp-handle-copy-file): Handle new parameter PRESERVE-UID-GID.
 
 2007-08-28  Glenn Morris  <rgm@gnu.org>
 
-       * progmodes/cc-langs.el (c-constant-kwds): Add java: null, true,
-       false.
+       * progmodes/cc-langs.el (c-constant-kwds): Add java: null, true, false.
 
 2007-08-27  Thien-Thi Nguyen  <ttn@gnuvola.org>
 
 
        * emacs-lisp/avl-tree.el: New file.
 
-2007-08-26  Micha\e,bk\e(Bl Cadilhac  <michael@cadilhac.name>
+2007-08-26  Micha\e,Ak\e(Bl Cadilhac  <michael@cadilhac.name>
 
        * hi-lock.el (hi-lock-unface-buffer): Show a x-menu only if the mouse
        was used.
 
 2007-08-23  Masatake YAMATO  <jet@gyve.org>
 
-       * progmodes/cc-fonts.el (gtkdoc-font-lock-doc-comments):
-       Highlight name of parameters in document body.
+       * progmodes/cc-fonts.el (gtkdoc-font-lock-doc-comments): Highlight
+       name of parameters in document body.
 
 2007-08-23  Stefan Monnier  <monnier@iro.umontreal.ca>
 
        (tex-font-script-display, tex-font-lock-suscript): Change from a cons
        cell to a list of 2 elements to simplify the unfontify code.
 
-2007-08-09  Edward O'Connor  <hober0@gmail.com>  (tiny change)
-
-       * url/url-auth.el (url-basic-auth): When prompting for username
-       and password, default to the username and password in the URL.
-
 2007-08-08  Vinicius Jose Latorre  <viniciusjl@ig.com.br>
 
        * ps-print.el (ps-default-fg, ps-default-bg): Docstring fix.
 
 2007-07-19  Eric S. Raymond  <esr@snark.thyrsus.com>
 
-       * vc-cvs.el: vc-cvs-checkin had some reference problems, now fixed.
+       * vc-cvs.el (vc-cvs-checkin, vc-cvs-diff): Finish transition from
+       having a single file argument to having a list of files as the
+       first argument.
 
 2007-07-19  Stefan Monnier  <monnier@iro.umontreal.ca>
 
 
 2007-07-18  Eric S. Raymond  <esr@snark.thyrsus.com>
 
-       * vc-hooks.el: Generalize stay-local-p to operate on lists of
-       files.  Change two keybindings to point to new function names.
-       * vc-arch.el, vc-bzr.el, vc-cvs.el, vc-hg.el, vc-mcvs.el, vc-rcs.el,
-       vc-sccs.el, vc-svn.el: These now implement the NewVC-fileset.
-       * vc.el: Adapted for NewVC-fileset, but no functional changes yet.
+       * vc.el (revision-granularity, create-repo): Document new vc
+       backend properties.
+       (vc-rollback): Renamed from vc-cancel-version. Update
+       references. Pass a list instead of a file.
+       (vc-revert): Renamed from vc-revert-buffer. Update references.
+       (vc-delistify, vc-expand-dirs): New functions.
+       (vc-do-command): Rename FILE to FILE-OR-LIST and deal with a list
+       of files instead of a single file.
+       (vc-position-context, vc-resync-window, vc-diff-internal)
+       (vc-print-log): Pass a list instead of a file.
+
+       * vc-hooks.el (vc-stay-local-p, vc-backend)
+       (vc-backend-subdirectory-name): Work on a file list, not a single
+       file.
+       (vc-workfile-version): Update docstring.
+       (vc-menu-map): Use vc-rollback instead of vc-cancel-version and
+       vc-revert instead of vc-revert-buffer.
+       (vc-prefix-map): Likewise. Bind vc-update.
+
+       * vc-svn.el (vc-svn-revision-granularity, vc-svn-create-repo)
+       (vc-svn-wash-log): New functions.
+       (vc-svn-register, vc-svn-checkin, vc-svn-print-log)
+       (vc-svn-command): Deal with a list of files, not a single file.
+
+       * vc-rcs.el (vc-rcs-revision-granularity, vc-rcs-create-repo)
+       (vc-rcs-wash-log): New functions.
+       (vc-rcs-register, vc-rcs-checkin, vc-rcs-diff, vc-rcs-print-log):
+       Deal with a list of files, not a single file.
+       (vc-rcs-rollback): Likewise. Rename from vc-rcs-cancel-version.
+
+       * vc-sccs.el (vc-sccs-revision-granularity, vc-sccs-wash-log): New
+       functions.
+       (vc-sccs-register, vc-sccs-checkin, vc-sccs-diff): Deal with a
+       list of files, not a single file.
+
+       * vc-mcvs.el (vc-mcvs-revision-granularity, vc-mcvs-create-repo):
+       New functions.
+       (vc-mcvs-register, vc-mcvs-checkin, vc-mcvs-print-log)
+       (vc-mcvs-diff): Deal with a list of files, not a single file.
+
+       * vc-hg.el (vc-hg-revision-granularity, vc-hg-create-repo): New
+       functions.
+       (vc-hg-print-log): Deal with a list of files, not a single file.
+       (vc-hg-diff-tree): New function, replace defalias with the same
+       name.
+       (vc-hg-register, vc-hg-checkin, vc-hg-command): Rename FILE to
+       FILES to denote that it is a file list, not a single file.
+
+       * vc-cvs.el (vc-cvs-create-repo, vc-cvs-wash-log): New functions.
+       (vc-cvs-register, vc-cvs-checkin): Deal with a list of files, not
+       a single file.
+       (vc-cvs-print-log, vc-cvs-command): Rename FILE to FILES to denote
+       that it is a file list, not a single file.
+       (vc-cvs-diff): Likewise. Simplify.
+
+       * vc-arch.el (vc-arch-register, vc-arch-checkin, vc-arch-diff):
+       Deal with a list of files, not a single file.
+
+       * vc-bzr.el (vc-bzr-register, vc-bzr-command, vc-bzr-checkin)
+       (vc-bzr-print-log): Update FILE parameter name to denote that it
+       is a file list, not a single file.
+       (vc-bzr-diff): Likewise. Use the car of files.
 
 2007-07-18  Juanma Barranquero  <lekktu@gmail.com>
 
 
        * replace.el (match): Use yellow1 instead of yellow.
 
-       * progmodes/gdb-ui.el (breakpoint-enabled): Use red1 instead of red.
+       * progmodes/gdb-ui.el (breakpoint-enabled): Use red1 instead of
+       red.
 
        * pcvs-info.el (cvs-unknown): Likewise.
 
        * net/tramp-util.el:
        * net/tramp-vc.el: Removed.
 
-       * net/ange-ftp.el: Add ange-ftp property to 'start-file-process
+       * net/ange-ftp.el: Add ange-ftp property to 'start-file-process.
        (ange-ftp-file-remote-p): Handle optional parameter CONNECTED.
 
        * net/rcompile.el (remote-compile): Handle Tramp 2.1 arguments.
index 5d2c4766d73e2207ba8b8357e91141ba84c3fc4f..1b6609f1727de6fdc8e824e1f95828ae5c1b75f8 100644 (file)
        * vc-hooks.el (vc-fetch-properties): Don't use
        vc-backend-dispatch, as that is in vc.el.
 
-       * vc.el (vc-register): Inhibit backups for the file's buffer
+       * vc.el (vc-register): Inhibit backups for the file's buffer.
 
        * vc.el (vc-add-triple, vc-lookup-triple, vc-record-rename):
        Use absolute file names to access the SCCS named configuration files
        pgp and forward blocks.
        (ispell-message-end-skip): New variable for block skips, set up for
        pgp and forward blocks.
-       (ispell-message): Added block message skipping.
+       (ispell-message): Added block message skipping.
        (ispell-buffer-local-parsing): Added html-mode.
 
        * mouse.el (mouse-set-region): Bind last-command with this-command.
        the new 'none-value of vc-locking-user.
 
        (vc-consult-rcs-headers): Fixed bug that prevented
-       (not vc-consult-headers) from working
+       (not vc-consult-headers) from working.
 
        (vc-file-not-found-hook): Set the default-directory of the new
        buffer before check-out.
        Use vc-file-clear-masterprops, and adjust those properties
        that are not cleared.
 
-       (vc-resynch-window):  Temporarily remove vc-find-file-hook, so
+       (vc-resynch-window): Temporarily remove vc-find-file-hook, so
        that we don't lose the file properties during check-in/out.
 
        (vc-resynch-window): Do not try to delete the current window if
 
        * winnt.el (null-device): Set to "NUL".
        (grep-regexp-alist): Match entries with drive letters.
-       (save-to-unix-hook,revert-from-unix-hook): Defined.
+       (save-to-unix-hook, revert-from-unix-hook): Defined.
        (using-unix-filesystems): Defined.
        (window-frame): Unaliased.
 
 
 1995-06-14  Johan Vromans  <jv@NL.net>
 
-       * forms.el (forms--mode-menu-edit,forms--mode-menu-ro):
+       * forms.el (forms--mode-menu-edit, forms--mode-menu-ro):
        Set `mouse-major-mode-menu'.
 
 1995-06-14  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
 
 1995-06-13  Per Bothner  <bothner@kalessin.cygnus.com>
 
-       * term.el:  Various optimizations.  The main one is to optimize for
+       * term.el: Various optimizations.  The main one is to optimize for
        simple output at the end of the buffer, with no paging, and in that
        case to defer scrolling while we can.
-       (term-emulate-terminal):  Don't call term-handle-scroll in
+       (term-emulate-terminal): Don't call term-handle-scroll in
        simple cases unless we are either paging or term-scroll-with-delete.
-       (term-down):  Likewise.
-       (term-handle-scroll):  Modify accordingly.
-       (term-emulate-terminal):  Avoid deleting old text in common case.
+       (term-down): Likewise.
+       (term-handle-scroll): Modify accordingly.
+       (term-emulate-terminal): Avoid deleting old text in common case.
        Optimize the simple case of CRLF when we're at buffer end.
        Handle deferred scroll when done processing output.
-       (term-handle-deferred-scroll):  New function.
-       (term-down):  Simplify - no longer take RIGHT argument.  Tune.
-       (term-goto):  Use term-move-columns to compensate for the above.
+       (term-handle-deferred-scroll): New function.
+       (term-down): Simplify - no longer take RIGHT argument.  Tune.
+       (term-goto): Use term-move-columns to compensate for the above.
 
-       * term.el (term-escape-char, term-set-escape-char):  Add doc-string.
-       (term-mouse-paste):  Add xemacs support.
+       * term.el (term-escape-char, term-set-escape-char): Add doc-string.
+       (term-mouse-paste): Add XEmacs support.
 
-       * term.el:  Various speed enhencements:
-       (term-handle-scroll):  Don't clear term-current-row; maybe adjust it.
-       (term-down):  Don't call term-adjust-current-row-cache if we've
+       * term.el: Various speed enhencements:
+       (term-handle-scroll): Don't clear term-current-row; maybe adjust it.
+       (term-down): Don't call term-adjust-current-row-cache if we've
        done term-handle-scroll.
-       (term-emulate-terminal):  Don't call term-adjust-current-row-cache.
-       (term-emulate-terminal):  For TAB, don't nil term-start-line-column.
-       (term-goto):  Possible optimization.
+       (term-emulate-terminal): Don't call term-adjust-current-row-cache.
+       (term-emulate-terminal): For TAB, don't nil term-start-line-column.
+       (term-goto): Possible optimization.
 
 1995-06-13  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
 
        * viper.el (vip-envelop-ESC-key): If an ESC-sequence translates
        into a function key, pretend that this key was the last command event.
 
-       * viper.el (vip-put-back,vip-Put-back): Now emulate Vi's behavior
+       * viper.el (vip-put-back, vip-Put-back): Now emulate Vi's behavior
        more closely.
 
        * viper.el (vip-line): No longer not bombs out.
 
        * viper.el, viper-mous.el, viper-util.el, viper-ex.el:
        Changed vip-*-frame-* to *-frame-*, incorporated overlay strings,
-       unread-command-events, removed support for emacs versions 19.28 and
-       xemacs 19.11 and earlier.
+       unread-command-events, removed support for Emacs versions 19.28 and
+       XEmacs 19.11 and earlier.
        * viper-macs.el, viper-keym.el: Likewise.
 
 1995-06-08  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
 
        * ediff.el (ediff-documentation: New function.
 
-       * ediff-wind.el: Got rid of toolbars in control frame in xemacs
+       * ediff-wind.el: Got rid of toolbars in control frame in XEmacs.
 
-       * ediff-wind.el: Changed window-min-height from 1 to 2
+       * ediff-wind.el: Changed window-min-height from 1 to 2.
 
        * ediff-wind.el (ediff-diff-at-point, ediff-toggle-multiframe):
        Bug fixes.
        (ediff-destroy-control-frame, ediff-window-display-p): New functions.
        * ediff.el, ediff-wind.el, ediff-util.el, ediff-init.el:
-       Converted xemacs *screen* nomenclature to *frame*.
-       Incorporated overlay strings. Ediff no longer runs under emacs
+       Converted XEmacs *screen* nomenclature to *frame*.
+       Incorporated overlay strings.  Ediff no longer runs under Emacs
        19.28 and earlier and XEmacs 19.11 and earlier.
        * ediff.el (ediff-patch-buffer): Now handles buffers that don't
        visit any file.
        (ediff-windows): Renamed to ediff-windows-wordwise, added
        (ediff-windows-linewise): New function.
-       Changed ediff-small/large-regions to ediff-regions-wordwise/linewise
+       Changed ediff-small/large-regions to ediff-regions-wordwise/linewise.
 
        * ediff.el, ediff-wind.el:
        Changed window-system to ediff-window-display.
        (ada-indent-function): Handle "elsif" the same way as "if", added
        "separate" for no indent.
        (ada-get-indent-type): If "type ... is .." is followed by code on
-       the same line, it is a broken statement. Test it.
+       the same line, it is a broken statement.  Test it.
        (ada-check-defun-name): Check for "protected" records.
        (ada-goto-matching-decl-start): Use of ada-ident-re.
        (ada-goto-matching-start): Extend regexp for "protected" record.
-       (ada-in-limit-line): Rename from in-limit-line. Don't use
+       (ada-in-limit-line): Rename from in-limit-line.  Don't use
        count-lines, but test if beginning-of-line/end-of-line puts us
        to bob/eob.
        (ada-goto-previous-nonblank-line): Save a beginning-of-line
        (ada-tabsize): Remove.
        (keymap): Use C-M-a and C-M-e for proc/func movement.
        No keybinding anymore for next/prev-package.
-       (ada-font-lock-keywords-[1|2]): Add protected records. "when" removed
+       (ada-font-lock-keywords-[1|2]): Add protected records.  "when" removed
        from 'reference'-face.
        (initial comments): Update CREDITS list.
        (ada-add-ada-menu): Capitalize menu entries.  Add menu statement
 
        * ada-mode.el: Change all Ada94 to Ada95.
 
-       * ada-mode.el: (ada-xemacs): New function, detect if we are
-       running on XEmacs. Ada keymap definition and menus use it.
+       * ada-mode.el (ada-xemacs): New function, detect if we are
+       running on XEmacs.  Ada keymap definition and menus use it.
        (ada-create-syntax-table): Correct comments explaining use of 2nd
        syntax table.  Added creation of ada-mode-symbol-syntax-table
        with '_' as word constituent.
        (ada-adjust-case): Add test, if symbol is preceeded by a "'".
        If true, change case according to ada-case-attribute.
-       (ada-which-function-are-we-in): New routine. Save name of the current
+       (ada-which-function-are-we-in): New routine.  Save name of the current
        function in the old buffer; we can place cursor now at the same
        function in the new buffer using find-file.
        (ada-make-body): New function.  Generates body stubs if the body
        (ada-krunch-args): Initialized to 0 exploiting the new capability of
        'gnatk8' as of gnat-2.0.
        (ada-make-filename-from-adaname): Remove downcasing and replacement
-       of dots. This is done in external program gnatk8 (gnat-2.0).
+       of dots.  This is done in external program gnatk8 (gnat-2.0).
        (ada-in-open-paren-p): Complete rewrite for speed-up.
        (ada-search-ignore-string-comment): Ignore # as a string terminator
        in all searches.
        (ada-add-ada-menu): Use real variables instead of t for invoking
-       'easymenu'
-       (require 'easymenu).
+       'easymenu'.
        (imenu-create-ada-index): We accept forward definitions again.
        (ada-indent-region): Catch errors, simplified code.
 
 
        * easymenu.el (easy-menu-do-define): Add autoload cookie.
 
-1995-05-19  Kevin Rodgers  <kevinr@ihs.com> (tiny change)
+1995-05-19  Kevin Rodgers  <kevinr@ihs.com>  (tiny change)
 
        * mailalias.el (expand-mail-aliases): Expand aliases in
        From and Reply-to headers as well, plus the Resent- variants.
        * ps-print.el (ps-faces-list): Delete.  Added alias for
        list-faces if face-list isn't fbound.
 
-       * ps-print.el: (ps-print-ensure-fontified) added to make sure
+       * ps-print.el (ps-print-ensure-fontified): Added to make sure
        ps-print works correctly in conjunction with lazy-lock.
 
        * ps-print.el: RMS's changes for Emacs.
 
 1995-05-02  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
 
-       * scribe.el: (scribe-chapter): Change to C-c C-c.
+       * scribe.el (scribe-chapter): Change to C-c C-c.
        (scribe-section): Change to C-c C-t.
        (scribe-subsection): Change to C-c C-s.
        (scribe-insert-environment): Change to C-c C-v.
 
 1995-04-25  Johan Vromans  <jv@squirrel.NL.net>
 
-       * forms.el: (forms--make-format-elt-using-text-properties)
-       forms--make-format): Add `intangible' text property to read-only areas.
+       * forms.el (forms--make-format-elt-using-text-properties)
+       (forms--make-format): Add `intangible' text property to read-only areas.
        (forms-next-field, forms-previous-field):
        Use `inhibit-point-motion-hooks' to allow move between two
        intangible areas.
 1995-04-16  Ethan Bradford  <ethanb@phys.washington.edu>
 
        * ispell.el (ispell-init-ispell): Don't barf if there is a
-       warning message before the version line when Ispell starts up.
+       warning message before the version line when Ispell starts up.
 
 1995-04-16  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
 
 1995-04-08  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
 
        * etags.el (next-file): Handle empty list returned by
-       (tags-table-files).
+       `tags-table-files'.
 
 1995-04-08  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
 
        Added the P tag and modified the s tag accordingly
        (tempo-insert-named): Checks for valid name, insert mark otherwise.
 
-       * tempo.el (tempo-dolist): Changed (cadr ...) to (car (cdr ...))
+       * tempo.el (tempo-dolist): Changed (cadr ...) to (car (cdr ...)).
 
-       * tempo.el (tempo-expand-if-complete): New function
+       * tempo.el (tempo-expand-if-complete): New function.
 
 1995-04-03  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
 
        * unrmail.el (unrmail): Don't make or switch to a summary buffer.
 
        * rmail.el (rmail-displayed-headers): New variable.
-       (rmail-clear-headers): Handle rmail-displayed-headers
+       (rmail-clear-headers): Handle rmail-displayed-headers.
 
 1995-03-31  Michael Ernst  <mernst@research.microsoft.com>
 
 
 1995-03-20  Karl Fogel  <kfogel@floss.cyclic.com>
 
-       * bookmark.el (bookmark-automatically-show-annotations): new var.
-       (bookmark-jump): only show annotation if above var is non-nil.
+       * bookmark.el (bookmark-automatically-show-annotations): New var.
+       (bookmark-jump): Only show annotation if above var is non-nil.
 
 1995-03-20  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
 
 
 1995-03-15  Per Bothner  <bothner@kalessin.cygnus.com>
 
-       * term.el (term-mouse-paste):  Make work for xemacs-19.11.
-       For GNU emacs, don't mouse-set-point, but do
-       run-hooks on mouse-leave-buffer-hook,
+       * term.el (term-mouse-paste): Make work for XEmacs-19.11.
+       For GNU Emacs, don't mouse-set-point, but do
+       run-hooks on mouse-leave-buffer-hook.
 
-       * term.el (term-char-mode):  Fix paren error that caused
-       the arrow keys to not be recognized under xemacs.
-       Also, simplify/fix [(button2)] to [button2] for paste under xemacs.
+       * term.el (term-char-mode): Fix paren error that caused
+       the arrow keys to not be recognized under XEmacs.
+       Also, simplify/fix [(button2)] to [button2] for paste under XEmacs.
 
 1995-03-15  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
 
 
 1995-03-15  Karl Fogel  <kfogel@spiff.gnu.ai.mit.edu>
 
-       * bookmark.el: (bookmark-bmenu-2-window): Go to correct position
+       * bookmark.el (bookmark-bmenu-2-window): Go to correct position
        as well as correct buffer.
        (bookmark-bmenu-other-window): Same.
        (bookmark-bmenu-switch-other-window): Same.
 
 1995-03-07  Per Bothner  <bothner@kalessin.cygnus.com>
 
-       * term.el (term-eol-on-send):  New variable.
-       (term-send-input):  Move point to eol before sending only if
+       * term.el (term-eol-on-send): New variable.
+       (term-send-input): Move point to eol before sending only if
        term-eol-on-send is true.
 
-       * term.el (term-send-input):  Don't move process-mark until
+       * term.el (term-send-input): Don't move process-mark until
        after possible 'history processing.
 
 1995-03-07  Francesco Potorti`  (pot@cnuce.cnr.it)
        * gnus-uu.el (gnus-uu-post-reply-mode): Likewise.
        * icon.el (icon-mode): Likewise.
        * mh-comp.el (mh-letter-mode): Likewise.
-       * mim-mode.el (mim-mode):  Likewise.
-       * modula2.el (modula-2-mode):  Likewise.
-       * nroff-mode.el (nroff-mode):  Likewise.
-       * options.el (Edit-options-mode):  Likewise.
-       * outline.el (outline-mode):  Likewise.
-       * perl-mode.el (perl-mode):  Likewise.
-       * prolog.el (prolog-mode-variables):  Likewise.
-       * rnewspost.el (news-reply-mode):  Likewise.
-       * scheme.el (scheme-mode-variables):  Likewise.
-       * scribe.el (scribe-mode):  Likewise.
-       * sendmail.el (mail-mode):  Likewise.
-       * simula.el (simula-mode):  Likewise.
-       * texinfmt.el (texinfo-format-refill):  Likewise.
-       * texinfo.el (texinfo-mode):  Likewise.
-       * tex-mode.el (tex-common-initialization,latex-mode,slitex-mode):
+       * mim-mode.el (mim-mode): Likewise.
+       * modula2.el (modula-2-mode): Likewise.
+       * nroff-mode.el (nroff-mode): Likewise.
+       * options.el (Edit-options-mode): Likewise.
+       * outline.el (outline-mode): Likewise.
+       * perl-mode.el (perl-mode): Likewise.
+       * prolog.el (prolog-mode-variables): Likewise.
+       * rnewspost.el (news-reply-mode): Likewise.
+       * scheme.el (scheme-mode-variables): Likewise.
+       * scribe.el (scribe-mode): Likewise.
+       * sendmail.el (mail-mode): Likewise.
+       * simula.el (simula-mode): Likewise.
+       * texinfmt.el (texinfo-format-refill): Likewise.
+       * texinfo.el (texinfo-mode): Likewise.
+       * tex-mode.el (tex-common-initialization, latex-mode, slitex-mode):
        Likewise.
-       * text-mode.el (indented-text-mode):  Likewise.
-       * vc.el (vc-comment-to-change-log):  Likewise.
+       * text-mode.el (indented-text-mode): Likewise.
+       * vc.el (vc-comment-to-change-log): Likewise.
 
 1995-03-02  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
 
        inserted line to left-margin.
 
        * paragraphs.el (paragraph-start, paragraph-separate):
-       Default values no longer start with ^. Doc fix.
+       Default values no longer start with ^.  Doc fix.
        (use-hard-newlines): Moved here from cmds.c.  Made buffer-local.
        Doc fix.
        (looking-at-hard): Deleted, not needed.
        (delete-to-left-margin): Use move-to-left-margin.  Doc fix.
        Make arguments optional.
 
-       (set-left-margin): Make region include following spaces and tabs,
+       (set-left-margin): Make region include following spaces and tabs,
        so that later insertions there will inherit new setting.
        Always reindent text to show new setting, not only when auto-fill
        is active; auto-fill controls only whether to re-fill text.
 
 1995-02-04  Per Bothner  <bothner@kalessin.cygnus.com>
 
-       * term.el (term-version):  Increased to 0.95.
-       (term-pager-enabled):  New macro.  Use it a bunch of places.
-       (term-terminal-menu):  Clean up initialization so we don't get
+       * term.el (term-version): Increased to 0.95.
+       (term-pager-enabled): New macro.  Use it a bunch of places.
+       (term-terminal-menu): Clean up initialization so we don't get
        complaints when re-loading term.el.
-       (term-send-raw-meta):  Redo to handle meta-symbols (e.g. meta-delete).
+       (term-send-raw-meta): Redo to handle meta-symbols (e.g. meta-delete).
        More robust checking of parameter to make-string.
-       (term-update-mode-line):  New function.  Call it whenever we change
+       (term-update-mode-line): New function.  Call it whenever we change
        char/line/paging mode.  Now includes "page" in mode-line-process
        if paging is abled.
 
-       * term.el:  Remove causes for byte-compilation to complain:
-       (term-terminal-pos):  Declare x and y in let-binding.
-       (term-send-invisible):  Remove bogus second "iteractive" call.
+       * term.el: Remove causes for byte-compilation to complain:
+       (term-terminal-pos): Declare x and y in let-binding.
+       (term-send-invisible): Remove bogus second "iteractive" call.
        (term-*): Provide defvars for lots of buffer-local variables.
-       (term-mode):  Make comments and initial value setting from
+       (term-mode): Make comments and initial value setting from
        here to the corresponding defvar.
-       (term-line-start-column):  Remove unused variable.
-       (term-erase-in-line):  Fix syntax (incorrect parenthesis) error.
-       (term-erase-in-display):  Fix typo "\?n" -> "?\n".
+       (term-line-start-column): Remove unused variable.
+       (term-erase-in-line): Fix syntax (incorrect parenthesis) error.
+       (term-erase-in-display): Fix typo "\?n" -> "?\n".
 
-       * term.el:  Make Unix "resize" command work:
-       (term-handle-ansi-escape):  On "\e[row;colH", limit row
+       * term.el: Make Unix "resize" command work:
+       (term-handle-ansi-escape): On "\e[row;colH", limit row
        and col to size of window.  (Resize sends "999;999".)
-       (term-handle-ansi-escape):   Implement "\e[6n" "Report cursor
+       (term-handle-ansi-escape): Implement "\e[6n" "Report cursor
        position".  This requires that we pass proc as an extra parameter.
-       (term-scroll-region):  An empty region means extend to window bottom.
+       (term-scroll-region): An empty region means extend to window bottom.
 
 1995-02-05  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
 
 
 1995-01-25  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
 
-       * mouse.el (mouse-save-then-kill): Ignore mouse-selection-click-count if no active mark.
-       (mouse-drag-region): Modify previous change--don't run the ordinary binding
-       in the case of a multiple click.
+       * mouse.el (mouse-save-then-kill): Ignore mouse-selection-click-count
+       if no active mark.
+       (mouse-drag-region): Modify previous change--don't run the ordinary
+       binding in the case of a multiple click.
 
        * tex-mode.el (tex-display-shell): New function.
        (tex-file, tex-region, tex-show-print-queue, tex-bibtex-file):
        * etags.el : Changes to support filenames as tags too and provided
        a drop-in replacement for list-tags.
        (find-tag-noselect): Recognize filenames as valid tags too.
-       (find-tag-file-order): New variable added. This contains the name of
+       (find-tag-file-order): New variable added.  This contains the name of
        the function used to qualify a matched filename.
        (last-tag-file): New variable; stores the filename looked for via
        find-tag fmaily of functions.
        (find-tag-in-order): In case tag searched for is a file, don't do
-       anything fancy to locate position of tag in file. Just seek to
+       anything fancy to locate position of tag in file.  Just seek to
        beginning of file.
        (etags-recognize-tags-table): Added new var find-tag-file-order to
        tags-table-format variables and also set the priority of searching
        (tags-list-functions-in-file): New function which is a backend for
        list-tags function.
        (tags-locate-file-in-tags-table): New function which locates a
-       file in `tags-table-list'. Its used by list-tags.
+       file in `tags-table-list'.  Its used by list-tags.
 
 1995-01-24  Frederic Lepied  <fred@sugix.frmug.fr.net>
 
        Add a newsgroups-update-description menu.
        (gnus-newsgroups-regex, gnus-newsgroups-display, gnus-newsgroups-alist)
        (gnus-newsgroups-hashtb, gnus-newsgroups-showall): New variables.
-       (gnus-group-group-name):  Changed the regexp to avoid  conflict
+       (gnus-group-group-name): Changed the regexp to avoid  conflict
        with descriptions which have a ':' inside.
        (gnus-group-mode): Doc fix.
 
 
 1995-01-23  Espen Skoglund  <espensk@tklab3.cs.uit.no>
 
-       * pascal.el: (pascal-*-completion, pascal-comp-defun)
+       * pascal.el (pascal-*-completion, pascal-comp-defun)
        (pascal-complete-word, pascal-completion-response, pascal-completion)
        (pascal-get-completion-decl): Rename some internal variables
        to start with 'pascal-'.
 
        * tempo.el (tempo-region-start, tempo-region-stop): New variables
        (tempo-insert-template, tempo-insert): Don't affect the
-       mark.  Check for Transient Mark mode
+       mark.  Check for Transient Mark mode.
 
-       * tempo.el (tempo-find-match-string): Removed the stupid 1+ again
+       * tempo.el (tempo-find-match-string): Removed the stupid 1+ again.
 
        * tempo.el (tempo-use-tag-list):
-       Set tempo-match-finder to completion-function
+       Set tempo-match-finder to completion-function.
 
        * tempo.el (tempo-match-finder): Renamed variable from
        tempo-default-match-finder.  Change the value too.
 
 1995-01-21  Per Bothner  <bothner@kalessin.cygnus.com>
 
-       * term.el (term-version):  Increased to 0.94.
-       (term-if-emacs19, term-if-xemacs, term-ifnot-xemacs):  New macros
-       to conditionalize at compile-time for different emacs versions.
-       (various places):  Use them (instead of term-is-XXXX).
-       (term-is-emacs19):  Removed, no longer needed.
+       * term.el (term-version): Increased to 0.94.
+       (term-if-emacs19, term-if-xemacs, term-ifnot-xemacs): New macros
+       to conditionalize at compile-time for different Emacs versions.
+       (various places): Use them (instead of term-is-XXXX).
+       (term-is-emacs19): Removed, no longer needed.
 
-       * term.el:  Change keybindings to not use C-c LETTER, for
+       * term.el: Change keybindings to not use C-c LETTER, for
        term-char-mode, term-line-mode.  Keybindings for term-pager-enable
        and term-pager-disable replaced by one for term-pager-toggle.
-       (term-pager-toggle):  New function.
+       (term-pager-toggle): New function.
 
        * term.el (term-fake-pager-enable, term-fake-pager-disable):
        Define as aliases, so that menubar code will find proper keybindings.
-       (term-char-mode):  Make no-op if already in char mode.
-       (term-line-mode):  Make no-op if already in line mode.
-       (term-mode-map):  Add keybinding for no-op term-line-mode, so
+       (term-char-mode): Make no-op if already in char mode.
+       (term-line-mode): Make no-op if already in line mode.
+       (term-mode-map): Add keybinding for no-op term-line-mode, so
        code to display menubar keybindings doesn't lose it.  (Needed
        as long as char-mode and line-mode share term-terminal-menu.)
-       (term-raw-escape-map):  Likewise for term-char-mode.
-       (term-char-mode, term-line-mode):  Better documentation strings.
+       (term-raw-escape-map): Likewise for term-char-mode.
+       (term-char-mode, term-line-mode): Better documentation strings.
 
-       * term.el:  Added menubar for pager sub-mode.
+       * term.el: Added menubar for pager sub-mode.
 
-       * term.el (term-command-hook):  Disabled the feature that allowed
-       inferior to send a lisp command to emacs - too big a security hole.
+       * term.el (term-command-hook): Disabled the feature that allowed
+       inferior to send a lisp command to Emacs - too big a security hole.
 
 1995-01-21  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
 
        (facemenu-unlisted-faces): Doc fix.
 
        * facemenu.el: Revise keybindings; doc fix.
-       (facemenu-new-faces-at-end): New vbl. (facemenu-add-new-face): Use it.
+       (facemenu-new-faces-at-end): New vbl.
+       (facemenu-add-new-face): Use it.
        (facemenu-set-face, facemenu-set-face-from-menu): Check read-only.
        (facemenu-set-face): Doc fix.
 
        (facemenu-add-new-face): New function.
        (facemenu-update): Don't redo top-level menu;
        nothing should change.  Move menu setup to defvars.
-       Use facemenu-add-new-face. Changed global binding to C-down-mouse-3.
+       Use facemenu-add-new-face.  Changed global binding to C-down-mouse-3.
        (facemenu-menu): "Update" item removed; should
        no longer be needed interactively.
        (facemenu-complete-face-list): Just return faces, not keybindings.
 1995-01-17  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
 
        * gud.el (gud-new-keymap): New function.
-       (gud-xdb-find-file, gud-dbx-find-file, gud-sdb-find-file, gud-gdb-find-file):
-       Use it for keymap inheritance.
+       (gud-xdb-find-file, gud-dbx-find-file, gud-sdb-find-file)
+       (gud-gdb-find-file): Use it for keymap inheritance.
 
 1995-01-17  Dave Love  <d.love@dl.ac.uk>
 
 
        * files.el (revert-buffer): Recompute buffer-file-truename.
 
-       * c-mode.el (indent-c-exp): Handle `{ if (x)\n  foo;\n  bar;' case.
+       * c-mode.el (indent-c-exp): Handle `{ if (x)\n  foo;\n  bar;' case.
        * cplus-md.el (indent-c++-exp): Handle `{ if (x)\n  foo;\n  bar;' case.
 
        * etags.el (etags-goto-tag-location): Add 1 to char positions in TAGS.
        default directory.  Also, mark the *vc* output buffer unmodified.
        (vc-revert-buffer1): Handle font-lock mode correctly.
        (vc-diff, vc-print-log): vc-do-command no longer sets the default
-       directory, but doing so is advantageous for these cases.
-       (file-executable-p-18): Better portability to Emacs 18.
+       directory, but doing so is advantageous for these cases.
+       (file-executable-p-18): Better portability to Emacs 18.
        (vc-directory-exclusion-list, vc-file-tree-walk-internal):
        Implement the new variable vc-directory-exclusion-list to prune
        tree walks.  Initial value tells it to ignore SCCS and RCS
 1994-12-28  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
 
        * etags.el (find-tag-in-order): Don't set buffer-local value of
-        tags-file-name.
+       tags-file-name.
 
 1994-12-27  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
 
 
 1994-12-22  Dave Love  <d.love@dl.ac.uk>
 
-        * gud.el (gdb): Correct tbreak doc string.
-        (gud-mode): Define a Gud menu.
-        (gdb): Set debugger-specific menu entries.
-        (sdb) (dbx) (xdb): Likewise.
+       * gud.el (gdb): Correct tbreak doc string.
+       (gud-mode): Define a Gud menu.
+       (gdb): Set debugger-specific menu entries.
+       (sdb) (dbx) (xdb): Likewise.
 
 1994-12-22  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
 
 
        * imenu.el (imenu-always-use-completion-buffer-p): A value of
        `never' now means never display a completion buffer.
-       (imenu--completion-buffer): implement 'never behaviour.
+       (imenu--completion-buffer): Implement 'never behaviour.
 
 1994-12-21  Stefan Schoef  <schoef@informatik.uni-oldenburg.de>
 
        * bibtex.el: Changed keybinding for bibtex-print-help-message
-        (from \C-ch to \C-c?). Therefore, describe-mode is not longer on
-        \C-c?. Also, changed prefix \C-cn for bibtex-narrow functions to
-        \C-c\C-r.
-        (bibtex-string-files): Changed documentation.
-        (bibtex-mode-map): Inscriptions of menu bar changed from "Entry
-        Types" to "Entry-Types" and "Bibtex Edit" to "BibTeX-Edit".
-        (bibtex-string-files): Changed documentation.
-        (bibtex-mode): If environment variable BIBINPUTS isn't defined,
-        string files are searched in the current directory.
-        (bibtex-completion-candidates): Now buffer-local to allow
-        evaluation of different bibtex-string-files in different buffers.
-        (bibtex-autokey-edit-before-use, bibtex-clean-entry): New variable
-        that determines, if the user is allowed to edit auto-generated
-        reference keys before they are used.
-        (bibtex-generate-autokey, bibtex-clean-entry): New function to
-        generate an autokey if necessary.
-        (bibtex-autokey-names, bibtex-autokey-name-change-strings,
-        bibtex-autokey-name-length, bibtex-autokey-name-separator,
-        bibtex-autokey-year-length, bibtex-autokey-titlewords,
-        bibtex-autokey-title-terminators,
-        bibtex-autokey-titlewords-stretch,
-        bibtex-autokey-titleword-first-ignore,
-        bibtex-autokey-titleword-abbrevs,
-        bibtex-autokey-titleword-change-strings,
-        bibtex-autokey-titleword-length,
-        bibtex-autokey-titleword-separator,
-        bibtex-autokey-name-year-separator,
-        bibtex-autokey-year-title-separator): New variables related to
-        bibtex-generate-autokey.
-        (bibtex-find-entry-location): Optional second parameter maybedup
-        to tell it that entering a duplicate entry isn't to report by an
-        error but by the return value of the function (necessary for
-        bibtex-clean-entry to find the correct position of an entry with
-        an autogenerated key without disturbing the user with unwanted
-        messages).
-        (bibtex-help-message): New variable to avoid printing of help
-        messages in the echo area.
-        (assoc-of-regexp): New function to match an alist of regexps.
-        (bibtex-string-files, bibtex-completion-candidates, bibtex-mode):
-        New variables to allow bibtex-complete-string to work on strings
-        initialized from a variable and from @String definitions in a list
-        of files, too.
-        (bibtex-predefined-strings, bibtex-entry-field-alist): Changed to
-        user options.
-        (bibtex-mode): Changed doc string.
-        (many functions and variables): Changed documentation strings of
-        variables and functions to hold a complete sentence in the first
-        line.
-        (bibtex-print-help-message): Now line dependent and reports if it
-        is called outside a BibTeX field.
-        (validate-bibtex-buffer): Completely rewritten to validate, if
-        buffer is syntactically correct.
-        (find-bibtex-duplicates): Moved into validate-bibtex-buffer.
-        (ispell-abstract, bibtex-ispell-abstract, ispell-bibtex-entry,
-        bibtex-ispell-entry, beginning-of-bibtex-entry,
-        bibtex-beginning-of-entry, end-of-bibtex-entry,
-        bibtex-end-of-entry, hide-bibtex-entry-bodies,
-        bibtex-hide-entry-bodies, narrow-to-bibtex-entry,
-        bibtex-narrow-to-entry, sort-bibtex-entries, bibtex-sort-entries,
-        validate-bibtex-buffer, bibtex-validate-buffer,
-        find-bibtex-entry-location, bibtex-find-entry-location): All
-        interactive functions are renamed, so that any interface function
-        begins with "bibtex-". Mapping:
-        ispell-abstract            --> bibtex-ispell-abstract
-        ispell-bibtex-entry        --> bibtex-ispell-entry
-        beginning-of-bibtex-entry  --> bibtex-beginning-of-entry
-        end-of-bibtex-entry        --> bibtex-end-of-entry
-        hide-bibtex-entry-bodies   --> bibtex-hide-entry-bodies
-        narrow-to-bibtex-entry     --> bibtex-narrow-to-entry
-        sort-bibtex-entries        --> bibtex-sort-entries
-        validate-bibtex-buffer     --> bibtex-validate-buffer
-        find-bibtex-entry-location --> bibtex-find-entry-location
-        (bibtex-maintain-sorted-entries,
-        bibtex-sort-ignore-string-entries): Default is now t.
-        (bibtex-complete-string): String list is built from additional
-        string list bibtex-predefined-string and current strings in file.
-        (string-equalp): Deleted and substituted by string-equal.
-        (assoc-string-equalp): Renamed to assoc-ignore-case.
-        (bibtex-entry): Reference key can be entered with completion. All
-        reference keys that are defined in buffer and all labels that
-        appear in crossreference entries are object to completion.
-        (Entry types): Changed order of entries in menu "entry types".
-        (bibtex-entry-field-alist): Changed order of entries slightly to
-        be more conform with standard BibTeX style layouts.
-        (bibtex-mode-map): Uniform keybindings for \C-c\C-e prefix (often
-        used types on control keys, sometimes used types on normal keys,
-        rarely used types on shift keys, almost never used types on meta
-        keys).
-        (bibtex-mode-map): Function narrow-to-bibtex-entry and counterpart
-        widen and function hide-bibtex-entry-bodies and counterpart
-        show-all bounded to appropriate local keys.
-        (bibtex-abbrev-table): Deleted
-        (bibtex-current-entry-label, put-string-on-kill-ring): Deleted
-        (AUCTeX provides all the functionality needed for citation
-        completion).
-        (bibtex-enclosing-reference, bibtex-pop-previous, bibtex-pop-next,
-        bibtex-clean-entry): Hacked for speed (bibtex-pop-previous and
-        bibtex-pop-next were to slow for larger BibTeX files).
-        (bibtex-pop-previous, bibtex-pop-next): Delimiters from previous
-        or next entry are changed to actual delimters if necessary.
-        (bibtex-entry): Fixed bug (False entry wasn't reported in error
-        message if bibtex-entry was called with undefined reference name).
-        (bibtex-entry-field-alist, bibtex-entry, bibtex-make-field,
-        bibtex-next-field, bibtex-clean-entry): Every reference entry now
-        contains a comment in addition to the name of the reference. This
-        comment appears in the echo area if you start editing that field
-        (after calling bibtex-next-field).
-        (bibtex-include-OPTcrossref, bibtex-entry): Changed
-        bibtex-include-OPTcrossref from single boolean variable to hold a
-        list of reference names which should have a crossref field.
-        (bibtex-complete-word): New function, which completes word
-        fragment before point to the longest prefix of predefined strings
-        in the buffer in the same way that ispell-complete-word operates
-        for words found in the dictionary.
-        (bibtex-reference-head): Start of bibtex-reference-head changed
-        from "^[ \t]*\\(" to "^\\( \\|\t\\)*\\(" (bibtex-pop-previous and
-        bibtex-pop-next didn't work, probably due to a bug in
-        re-search-forward).
-        (several functions): Added support for {} as field delimiters
-        (better than '"' for accented characters.
-        (bibtex-clean-entry): If optional field crossref is empty or
-        missing, former optional fields (if bibtex-include-OPTcrossref was
-        t) are necessary again. bibtex-clean-entry complains if they are
-        empty but not if they are missing, so you can intenionally omit
-        them, e. g. for a pseudo @Journal entry (needed for
-        crossreferences) made out of an @article with missing non-optional
-        fields.
-        Menu bar entries aren't centered anymore.
+       (from \C-ch to \C-c?).  Therefore, describe-mode is not longer on
+       \C-c?.  Also, changed prefix \C-cn for bibtex-narrow functions to
+       \C-c\C-r.
+       (bibtex-string-files): Changed documentation.
+       (bibtex-mode-map): Inscriptions of menu bar changed from "Entry
+       Types" to "Entry-Types" and "Bibtex Edit" to "BibTeX-Edit".
+       (bibtex-string-files): Changed documentation.
+       (bibtex-mode): If environment variable BIBINPUTS isn't defined,
+       string files are searched in the current directory.
+       (bibtex-completion-candidates): Now buffer-local to allow
+       evaluation of different bibtex-string-files in different buffers.
+       (bibtex-autokey-edit-before-use, bibtex-clean-entry): New variable
+       that determines, if the user is allowed to edit auto-generated
+       reference keys before they are used.
+       (bibtex-generate-autokey, bibtex-clean-entry): New function to
+       generate an autokey if necessary.
+       (bibtex-autokey-names, bibtex-autokey-name-change-strings,
+       bibtex-autokey-name-length, bibtex-autokey-name-separator,
+       bibtex-autokey-year-length, bibtex-autokey-titlewords,
+       bibtex-autokey-title-terminators,
+       bibtex-autokey-titlewords-stretch,
+       bibtex-autokey-titleword-first-ignore,
+       bibtex-autokey-titleword-abbrevs,
+       bibtex-autokey-titleword-change-strings,
+       bibtex-autokey-titleword-length,
+       bibtex-autokey-titleword-separator,
+       bibtex-autokey-name-year-separator,
+       bibtex-autokey-year-title-separator): New variables related to
+       bibtex-generate-autokey.
+       (bibtex-find-entry-location): Optional second parameter maybedup
+       to tell it that entering a duplicate entry isn't to report by an
+       error but by the return value of the function (necessary for
+       bibtex-clean-entry to find the correct position of an entry with
+       an autogenerated key without disturbing the user with unwanted
+       messages).
+       (bibtex-help-message): New variable to avoid printing of help
+       messages in the echo area.
+       (assoc-of-regexp): New function to match an alist of regexps.
+       (bibtex-string-files, bibtex-completion-candidates, bibtex-mode):
+       New variables to allow bibtex-complete-string to work on strings
+       initialized from a variable and from @String definitions in a list
+       of files, too.
+       (bibtex-predefined-strings, bibtex-entry-field-alist): Changed to
+       user options.
+       (bibtex-mode): Changed doc string.
+       (many functions and variables): Changed documentation strings of
+       variables and functions to hold a complete sentence in the first
+       line.
+       (bibtex-print-help-message): Now line dependent and reports if it
+       is called outside a BibTeX field.
+       (validate-bibtex-buffer): Completely rewritten to validate, if
+       buffer is syntactically correct.
+       (find-bibtex-duplicates): Moved into validate-bibtex-buffer.
+       (ispell-abstract, bibtex-ispell-abstract, ispell-bibtex-entry,
+       bibtex-ispell-entry, beginning-of-bibtex-entry,
+       bibtex-beginning-of-entry, end-of-bibtex-entry,
+       bibtex-end-of-entry, hide-bibtex-entry-bodies,
+       bibtex-hide-entry-bodies, narrow-to-bibtex-entry,
+       bibtex-narrow-to-entry, sort-bibtex-entries, bibtex-sort-entries,
+       validate-bibtex-buffer, bibtex-validate-buffer,
+       find-bibtex-entry-location, bibtex-find-entry-location): All
+       interactive functions are renamed, so that any interface function
+       begins with "bibtex-".  Mapping:
+       ispell-abstract            --> bibtex-ispell-abstract
+       ispell-bibtex-entry        --> bibtex-ispell-entry
+       beginning-of-bibtex-entry  --> bibtex-beginning-of-entry
+       end-of-bibtex-entry        --> bibtex-end-of-entry
+       hide-bibtex-entry-bodies   --> bibtex-hide-entry-bodies
+       narrow-to-bibtex-entry     --> bibtex-narrow-to-entry
+       sort-bibtex-entries        --> bibtex-sort-entries
+       validate-bibtex-buffer     --> bibtex-validate-buffer
+       find-bibtex-entry-location --> bibtex-find-entry-location
+       (bibtex-maintain-sorted-entries,
+       bibtex-sort-ignore-string-entries): Default is now t.
+       (bibtex-complete-string): String list is built from additional
+       string list bibtex-predefined-string and current strings in file.
+       (string-equalp): Deleted and substituted by string-equal.
+       (assoc-string-equalp): Renamed to assoc-ignore-case.
+       (bibtex-entry): Reference key can be entered with completion.  All
+       reference keys that are defined in buffer and all labels that
+       appear in crossreference entries are object to completion.
+       (Entry types): Changed order of entries in menu "entry types".
+       (bibtex-entry-field-alist): Changed order of entries slightly to
+       be more conform with standard BibTeX style layouts.
+       (bibtex-mode-map): Uniform keybindings for \C-c\C-e prefix (often
+       used types on control keys, sometimes used types on normal keys,
+       rarely used types on shift keys, almost never used types on meta
+       keys).
+       (bibtex-mode-map): Function narrow-to-bibtex-entry and counterpart
+       widen and function hide-bibtex-entry-bodies and counterpart
+       show-all bounded to appropriate local keys.
+       (bibtex-abbrev-table): Deleted
+       (bibtex-current-entry-label, put-string-on-kill-ring): Deleted
+       (AUCTeX provides all the functionality needed for citation
+       completion).
+       (bibtex-enclosing-reference, bibtex-pop-previous, bibtex-pop-next,
+       bibtex-clean-entry): Hacked for speed (bibtex-pop-previous and
+       bibtex-pop-next were to slow for larger BibTeX files).
+       (bibtex-pop-previous, bibtex-pop-next): Delimiters from previous
+       or next entry are changed to actual delimters if necessary.
+       (bibtex-entry): Fixed bug (False entry wasn't reported in error
+       message if bibtex-entry was called with undefined reference name).
+       (bibtex-entry-field-alist, bibtex-entry, bibtex-make-field,
+       bibtex-next-field, bibtex-clean-entry): Every reference entry now
+       contains a comment in addition to the name of the reference.  This
+       comment appears in the echo area if you start editing that field
+       (after calling bibtex-next-field).
+       (bibtex-include-OPTcrossref, bibtex-entry): Changed
+       bibtex-include-OPTcrossref from single boolean variable to hold a
+       list of reference names which should have a crossref field.
+       (bibtex-complete-word): New function, which completes word
+       fragment before point to the longest prefix of predefined strings
+       in the buffer in the same way that ispell-complete-word operates
+       for words found in the dictionary.
+       (bibtex-reference-head): Start of bibtex-reference-head changed
+       from "^[ \t]*\\(" to "^\\( \\|\t\\)*\\(" (bibtex-pop-previous and
+       bibtex-pop-next didn't work, probably due to a bug in
+       re-search-forward).
+       (several functions): Added support for {} as field delimiters
+       (better than '"' for accented characters.
+       (bibtex-clean-entry): If optional field crossref is empty or
+       missing, former optional fields (if bibtex-include-OPTcrossref was
+       t) are necessary again.  bibtex-clean-entry complains if they are
+       empty but not if they are missing, so you can intenionally omit
+       them, e. g. for a pseudo @Journal entry (needed for
+       crossreferences) made out of an @article with missing non-optional
+       fields.
+       Menu bar entries aren't centered anymore.
 
 1994-12-21  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
 
 
 1994-12-21  Dave Love  <d.love@dl.ac.uk>
 
-        * gud.el (gud-irixdbx-marker-filter): Changes for Irix dbx.
-        (dbx): gud-up, gud-down are now special cases for Irix.
+       * gud.el (gud-irixdbx-marker-filter): Changes for Irix dbx.
+       (dbx): gud-up, gud-down are now special cases for Irix.
 
 1994-12-21  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
 
 
 1994-12-21  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
 
-        * tex-mode.el (tex-shell-map,tex-start-shell): Start with
-        shell-mode-map.
+       * tex-mode.el (tex-shell-map, tex-start-shell): Start with
+       shell-mode-map.
 
 1994-12-21  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
 
 
 1994-12-19  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
 
-        * tex-mode.el (tex-start-shell): Use comint prompt and mode-map.
+       * tex-mode.el (tex-start-shell): Use comint prompt and mode-map.
 
 1994-12-18  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
 
        and pass it along to vc-next-action.
 
        * font-lock.el (font-lock-hack-keywords): Turn off undo generation.
-       (font-lock-unfontify-region. font-lock-fontify-region): Likewise.
+       (font-lock-unfontify-region, font-lock-fontify-region): Likewise.
 
        * c-mode.el (indent-c-exp): Don't be fooled by else_ or while_.
        (c-indent-line): Likewise.
        * replace.el (perform-replace):
        Report number of replacements when done.
        (query-replace, query-replace-regexp, replace-string)
-       (map-query-replace-regexp. replace-regexp): No message here.
+       (map-query-replace-regexp, replace-regexp): No message here.
 
 1994-12-13  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
 
 1994-12-09  Ken Stevens  <stevensk@afit.af.mil>
 
        * ispell.el: Added ispell-offset for version consistency.
-       (ispell-dictionary-alist): updated dictionaries & better match defaults
-       (ispell-alternate-dictionary): added /usr/shar path
-       (ispell-menu-map-needed): redo changes that made this incompatible
-        with earlier versions of emacs19.
-       (ispell-required-version): changed to assure version 3.1.12 accessed.
+       (ispell-dictionary-alist): Updated dictionaries & better match defaults
+       (ispell-alternate-dictionary): Added /usr/shar path
+       (ispell-menu-map-needed): Redo changes that made this incompatible
+       with earlier versions of Emacs19.
+       (ispell-required-version): Changed to assure version 3.1.12 accessed.
        (ispell-word): Correctly accept buffer-local information.
-        Does not try to modify read-only buffer on 'm' command.
-       (ispell-command-loop): fixed bug that corrupted buffers.
-        removed scrolling when *Choices* buffer shrinks.
+       Does not try to modify read-only buffer on 'm' command.
+       (ispell-command-loop): Fixed bug that corrupted buffers.
+       removed scrolling when *Choices* buffer shrinks.
        (check-ispell-version): Correctly identifies new version requirements.
        (ispell-region): Interaction updated for version 3.1.12+
        Buffer read-only modification improvement.  Dictionary messages added.
-       (ispell-message-text-end): skips additional shell files.
-       (ispell-buffer-local-parsing): extended-char mode now matches text mode
+       (ispell-message-text-end): Skips additional shell files.
+       (ispell-buffer-local-parsing): extended-char mode now matches text mode.
 
 1994-12-09  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
 
 
 1994-12-08  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
 
-        * cal-mayan.el (calendar-mayan-days-before-absolute-zero): Mention
-        Hochleitner's correlation.
+       * cal-mayan.el (calendar-mayan-days-before-absolute-zero): Mention
+       Hochleitner's correlation.
 
 1994-12-07  Richard Stallman  <rms@green-hill>
 
 1994-11-30  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
 
        * compile.el (compilation-next-error-locus): Parsed column numbers
-        are 1-origin.
+       are 1-origin.
 
 1994-11-29  Richard Stallman  <rms@bethel>
 
 
 1994-11-29  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
 
-        * cal-x.el: New file.
+       * cal-x.el: New file.
 
-        * calendar.el: Mention cal-x.el in comments.
+       * calendar.el: Mention cal-x.el in comments.
 
 1994-11-28  Richard Stallman  <rms@bethel>
 
 
 1994-11-21  Per Bothner  <bothner@kalessin.cygnus.com>
 
-       * term.el (term-termcap-format):  Add cd capability.  Fix ei.
+       * term.el (term-termcap-format): Add cd capability.  Fix ei.
        (term-exec-1): Pass $TERMINFO instead of $TERMCAP if appropriate.
        Pass emacs-version and term-version in $TERM.
        Rewrite to set process-environment.
 1994-11-15  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
 
        * etags.el (tags-query-replace): Use query-replace-read-args in
-        interactive spec.
+       interactive spec.
 
 1994-11-15  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
 
 1994-11-10  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
 
        * compile.el (compile): With prefix arg, prompt even if (not
-        compilation-read-command).
+       compilation-read-command).
        (compilation-error-regexp-alist): Make first regexp match column
        numbers too.  Remove regexp for "prog:file:line: error".  Replace
        GNAT 1.82 regexp with "prog: file:line\(:col\)?: error".
 
 1994-11-07  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
 
-        * solar.el (solar-sunrise-sunset): Check for nil time before
+       * solar.el (solar-sunrise-sunset): Check for nil time before
        trying to adjust it for dst.
 
 1994-11-07  Francesco Potorti`  (pot@cnuce.cnr.it)
 
 1994-10-30  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
 
-        * calendar.el (calendar-mode): Delete to window configuration var.
+       * calendar.el (calendar-mode): Delete to window configuration var.
 
 1994-10-30  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
 
 1994-10-29  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
 
        * calendar.el (calendar, calendar-other-month): Fix use of
-        calendar-read-date.
+       calendar-read-date.
        (calendar-read-date): Fix noday option.
 
        * lunar.el (phases-of-moon): Fix use of calendar-read-date.
        (calendar-latitude, calendar-longitude, calendar-location): Include
        vector form; suggest setting values in site-local.el.
        (solar-sin-degrees, solar-cosine-degrees): Change to macros.
-       (solar-degrees-to-hours, solar-hours-to-days):  Change to defsubst.
+       (solar-degrees-to-hours, solar-hours-to-days): Change to defsubst.
        (solar-sunrise, solar-sunset): Allow use of vector forms of
        latitude/longitude.
        (calendar-latitude, calendar-longitude): New macros to allow use
 
 1994-10-24  Francesco Potorti`  (pot@cnuce.cnr.it)
 
-       * man.el (Man-cleanup-manpage): do all the work if called
+       * man.el (Man-cleanup-manpage): Do all the work if called
        interactively.
 
 1994-10-23  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
 
        * dired.el (dired-mode-map): Add query-replace and search items to
-        operate menu.
+       operate menu.
 
 1994-10-23  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
 
 1994-10-22  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
 
        * dired-aux.el (dired-do-tags-search,
-        dired-do-tags-query-replace): New functions.
+       dired-do-tags-query-replace): New functions.
        * dired.el (dired-mode-map): Bind A to dired-do-tags-search, Q to
        dired-do-tags-query-replace.
 
 
 1994-10-20  Noah Friedman  <friedman@splode.com>
 
-        * timer.el (timer-error, timer-abnormal-termination,
-        timer-filter-error): New error conditions.
-        (timer-process-filter, timer-process-sentinel): Signal an error,
-        don't just print a message.
+       * timer.el (timer-error, timer-abnormal-termination,
+       timer-filter-error): New error conditions.
+       (timer-process-filter, timer-process-sentinel): Signal an error,
+       don't just print a message.
 
 1994-10-20  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
 
 
 1994-10-19  Noah Friedman  <friedman@splode.com>
 
-        * timer.el (timer-program): Make defvar, not defconst.
-        Expand name of timer program in exec-directory here.
-        (run-at-time): Not here.
+       * timer.el (timer-program): Make defvar, not defconst.
+       Expand name of timer program in exec-directory here.
+       (run-at-time): Not here.
 
 1994-10-19  Boris Goldowsky  <boris@cs.rochester.edu>
 
        * facemenu.el (facemenu-add-new-face): New function.
        * facemenu.el (facemenu-update): Don't redo top-level menu;
        nothing should change.  Move menu setup to defvars.  Use
-       facemenu-add-new-face. Changed global binding to C-down-mouse-3.
+       facemenu-add-new-face.  Changed global binding to C-down-mouse-3.
        * facemenu.el (facemenu-menu): "Update" item removed; should
        no longer be needed interactively.
        * facemenu.el (facemenu-complete-face-list): Just return faces,
 
 1994-10-17  Fred Pierresteguy  <F.Pierresteguy@frcl.bull.fr>
 
-        * paths.el (rmail-spool-directory): Add a condition to test
+       * paths.el (rmail-spool-directory): Add a condition to test
        the Bull DPX/2.
 
 1994-10-17  Morten Welinder  <terra@mole.gnu.ai.mit.edu>
 
        * facemenu.el (facemenu-read-color, facemenu-colors): New fn, var.
        (facemenu-set-face, facemenu-set-face-from-menu,
-       facemenu-after-change): Face property can take a list value; add
+       facemenu-after-change): Face property can take a list value; add
        to it rather than completely replacing the property.
        (facemenu-add-face, facemenu-discard-redundant-faces): New functions.
 
 
 1994-10-06  Noah Friedman  <friedman@splode.com>
 
-        * type-break.el: Do not call type-break-mode upon loading.
-        (type-break-time-sum): New function.
-        (type-break-schedule): Use it.  Make function interactive.
-        (type-break-guestimate-keystroke-threshold): Use `N' interactive
-        spec, not `n'.
-        (type-break-demo-boring): Show elapsed time of break, or number of
-        minutes left for good break.
+       * type-break.el: Do not call type-break-mode upon loading.
+       (type-break-time-sum): New function.
+       (type-break-schedule): Use it.  Make function interactive.
+       (type-break-guestimate-keystroke-threshold): Use `N' interactive
+       spec, not `n'.
+       (type-break-demo-boring): Show elapsed time of break, or number of
+       minutes left for good break.
 
 1994-10-06  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
 
 
        * perl-mode.el (perl-font-lock-keywords): New variable.
 
-       * pascal.el (pascal-font-lock-keywords):  New variable.
+       * pascal.el (pascal-font-lock-keywords): New variable.
        (pascal-mode): Set comment-start-skip and comment-end.
 
-       * font-lock.el: (font-lock-mode): Doc fix; use add/remove-hook, not
+       * font-lock.el (font-lock-mode): Doc fix; use add/remove-hook, not
        setq; removed make-local-variable of font-lock-no-comments.
        (font-lock-set-defaults): Do it there, and use:
        (font-lock-defaults-alist): Use it to set font-lock-keywords,
        (turn-on-font-lock): New function.
        (font-lock-fontify-buffer): Made interruptible; deleted messages.
 
-       * font-lock.el: (font-lock-fontify-region): Made syntax state reliable
+       * font-lock.el (font-lock-fontify-region): Made syntax state reliable
        by widening within new restriction; let cstart and cend for speed;
        outputs message.
        (font-lock-after-change-function): Remove spurious goto-char and use
        forward-line, not 1+ end-of-line, for end of fontification region.
        (font-lock-any-properties-p): Removed, use text-property-not-all.
 
-       * font-lock.el (font-lock-*-face): facename values are themselves.
+       * font-lock.el (font-lock-*-face): Facename values are themselves.
        (font-lock-variable-name-face, font-lock-reference-face): New vars.
        (font-lock-doc-string-face): Removed.
        (font-lock-keywords): Extended value syntax.
 
 1994-09-30  Francesco Potorti`  (pot@cnuce.cnr.it)
 
-       * man.el (Man-init-defvars, Man-cleanup-manpage,
-       Man-fontify-manpage): fix previous fix.
+       * man.el (Man-init-defvars, Man-cleanup-manpage)
+       (Man-fontify-manpage): Fix previous fix.
 
 1994-09-30  Michael Ernst  <mernst@research.microsoft.com>
 
 
 1994-09-27  Christopher J. Madsen  <ac608@yfn.ysu.edu>
 
-        * files.el (hack-one-local-variable):
+       * files.el (hack-one-local-variable):
        Support safe-local-variable property.
        (compile-command): Add safe-local-variable property.
 
 1994-09-27  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
 
        * etags.el (etags-tags-completion-table): Allow ? and : in guessed
-        tag names.
+       tag names.
 
 1994-09-26  Joe Ramey  <ramey@csc.ti.com>
 
-        * rmailsum.el (rmail-summary-delete-forward): Regexp for
+       * rmailsum.el (rmail-summary-delete-forward): Regexp for
        recognizing deleted message should not require a space at the
        beginning of the line.
 
 
        * cc-mode.el (c-just-after-func-arglist-p)
        (c-guess-basic-syntax, c-lineup-objc-method-args-2):
-       More objc patches from Lele
+       More objc patches from Lele.
 
        * cc-mode.el (c-indent-command):
        With optional arg, shift-amt had wrong sign.
        recognize empty arglists with close paren on separate line.
 
        * cc-mode.el (c-mode-menu, c-emacs-features, c-mode-map)
-
        (c-common-init): Remove dependency on string "Lucid" in
        emacs-version.  Use features to distinguish.
 
 
        * cc-mode.el (c-offsets-alist-default, c-offsets-alist)
        (c-guess-basic-syntax):
-       Changed syntactic symbol c++-funcdecl-cont to ansi-funcdecl-cont
+       Changed syntactic symbol c++-funcdecl-cont to ansi-funcdecl-cont.
 
        * cc-mode.el (c-offsets-alist, c-read-offset, c-set-offset):
        Accept variable symbols as offsets.
 
 1994-09-23  Jonathan I. Kamens  (jik@gza-client1)
 
-        * files.el (find-alternate-file): Confirm killing buffer
+       * files.el (find-alternate-file): Confirm killing buffer
        only if it is visiting a file.
 
 1994-09-23  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
 
        * rmail.el (rmail-ignored-headers): Add resent-message-id.
 
-        * simple.el (insert-buffer): Default to first other buffer,
-        not first non-visible buffer.
+       * simple.el (insert-buffer): Default to first other buffer,
+       not first non-visible buffer.
 
 1994-09-21  Erik Naggum  <erik@naggum.no>
 
 
 1994-09-19  Francesco Potorti`  <pot@cnuce.cnr.it>
 
-       * man.el (Man-notify-flag): replaces the old Man-notify
+       * man.el (Man-notify-flag): Replaces the old Man-notify
        variable, use the old one if it is bound as initial value.
-       (Man-reuse-okay-flag): replaces Man-reuse-okay.
-       (Man-downcase-section-letters-flag): replaces
+       (Man-reuse-okay-flag): Replaces Man-reuse-okay.
+       (Man-downcase-section-letters-flag): Replaces
        Man-downcase-section-letters.
-       (Man-circular-pages-flag): replaces Man-circular-pages.
-       (Man-auto-section-alist): variable deleted.
-       (Man-section-translations-alist): removed the "3x" translation.
-       (Man-untabify-command, Man-untabify-command-args): new vars.
-       (Man-sed-command, Man-awk-command): new variables.
-       (Man-sysv-sed-script, Man-berkeley-sed-script): new constants.
-       (Man-name-regexp, Man-page-header-regexp): new variable.
-       (Man-heading-regexp): changed default value.
-       (Man-reference-regexp): now refers to previous regexps.
-       (Man-arguments): new buffer-local variable.
-       (Man-page-mode-string): changed default value.
-       (Man-mode-map): changed the meanings of ",", ".", "q".  Added new
+       (Man-circular-pages-flag): Replaces Man-circular-pages.
+       (Man-auto-section-alist): Variable deleted.
+       (Man-section-translations-alist): Removed the "3x" translation.
+       (Man-untabify-command, Man-untabify-command-args): New vars.
+       (Man-sed-command, Man-awk-command): New variables.
+       (Man-sysv-sed-script, Man-berkeley-sed-script): New constants.
+       (Man-name-regexp, Man-page-header-regexp): New variable.
+       (Man-heading-regexp): Changed default value.
+       (Man-reference-regexp): Now refers to previous regexps.
+       (Man-arguments): New buffer-local variable.
+       (Man-page-mode-string): Changed default value.
+       (Man-mode-map): Changed the meanings of ",", ".", "q".  Added new
        keys ">", "<", "k".
-       (Man-page-mode-string): function deleted.
+       (Man-page-mode-string): Function deleted.
        (Man-init-defvars): New function used for initialising the system
        and environment dependent variables Man-fontify-manpage-flag,
        Man-uses-untabify, Man-sed-script, Man-filter-list.
-       (Man-delete-trailing-newlines): function deleted.
-       (Man-make-page-mode-string): new subst.
-       (Man-build-man-command): now subst instead of function.  Modified
+       (Man-delete-trailing-newlines): Function deleted.
+       (Man-make-page-mode-string): New subst.
+       (Man-build-man-command): Now subst instead of function.  Modified
        to comply with the new format of Man-filter-list.
-       (Man-downcase): function deleted.
-       (Man-translate-references): complete rewrite.
-       (Man-linepos): function deleted.
-       (Man-match-substring): new function.
-       (Man-default-man-args): function deleted.
-       (Man-default-man-entry): complete rewrite.
-       (man, manual-entry): function-alias relationship reversed.
-       (man): prompt changed, prompt using interactive, call
+       (Man-downcase): Function deleted.
+       (Man-translate-references): Complete rewrite.
+       (Man-linepos): Function deleted.
+       (Man-match-substring): New function.
+       (Man-default-man-args): Function deleted.
+       (Man-default-man-entry): Complete rewrite.
+       (man, manual-entry): Function-alias relationship reversed.
+       (man): Prompt changed, prompt using interactive, call
        Man-init-defvars, set Man-arguments.
-       (Man-notify-when-ready): manage the 'pushy value.
-       (Man-fontify-manpage): substitute Man-set-fonts.
-       (Man-cleanup-manpage): new function.
-       (Man-bgproc-sentinel): cleanup, call Man-fontify-manpage and
+       (Man-notify-when-ready): Manage the 'pushy value.
+       (Man-fontify-manpage): Substitute Man-set-fonts.
+       (Man-cleanup-manpage): New function.
+       (Man-bgproc-sentinel): Cleanup, call Man-fontify-manpage and
        Man-cleanup-page when necessary.
-       (Man-mode): call Man-strip-page-headers and Man-unindent.
+       (Man-mode): Call Man-strip-page-headers and Man-unindent.
        (Man-build-section-alist, Man-build-references-alist,
        Man-build-page-list): substs instead of functions.
-       (Man-build-references-alist): cleanup.
-       (Man-build-page-list): new algorithm.
-       (Man-strip-page-headers, Man-unindent): new substs.
-       (Man-find-section): assume section names start in column 1.
-       (Man-quit): bury the buffer instead of killing it, delete the
+       (Man-build-references-alist): Cleanup.
+       (Man-build-page-list): New algorithm.
+       (Man-strip-page-headers, Man-unindent): New substs.
+       (Man-find-section): Assume section names start in column 1.
+       (Man-quit): Bury the buffer instead of killing it, delete the
        frame when necessary.
-       (Man-kill): new function.
-       (Man-goto-page): do the right thing when the manpage is not found,
+       (Man-kill): New function.
+       (Man-goto-page): Do the right thing when the manpage is not found,
        do not assume that Man-build-references-alist is broken.
 
 1994-09-21  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
        (describe-display-table): Describe the window border glyph.
        (display-table-len): New constant.
        (make-display-table, standard-display-8bit,
-        standard-display-default, standard-display-ascii,
-        standard-display-g1, standard-display-graphic,
-        standard-display-underline): Use display-table-len, instead of
-        hard-coding the display table length.
+       standard-display-default, standard-display-ascii,
+       standard-display-g1, standard-display-graphic,
+       standard-display-underline): Use display-table-len, instead of
+       hard-coding the display table length.
 
 1994-09-19  Francesco Potorti`  <pot@cnuce.cnr.it>
 
-       * rlogin.el (rlogin): recognise the `-l user' option to rlogin and
+       * rlogin.el (rlogin): Recognise the `-l user' option to rlogin and
        let comint and ange-ftp know about the correct home directory.
 
 1994-09-19  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
        (rmail-find-all-files, rmail-list-to-menu): New functions.
        (rmail-construct-io-menu): New functions.
        (rmail-input-menu): Function deleted.
-       (rmail). Call rmail-construct-io-menu.
+       (rmail): Call rmail-construct-io-menu.
        (rmail-mode-map): 'Input Rmail file (menu)' renamed to
-       'Input Rmail file'. 'Output (Rmail menu)' renamed to
+       'Input Rmail file'.  'Output (Rmail menu)' renamed to
        'Output Rmail file'.
        * rmailout.el (rmail-output-menu): Function deleted.
        * rmailsum.el (rmail-summary-construct-io-menu): New function.
        (rmail-new-summary): Call rmail-summary-construct-io-menu.
        (rmail-summary-mode-map): New menu items 'Input Rmail File' and
        'Output Rmail File'.
-       (rmail-summary-output-to-rmail-file): New arg 'file-name'. If it
+       (rmail-summary-output-to-rmail-file): New arg 'file-name'.  If it
        non-nil, call rmail-output-to-rmail-file.
 
 1994-09-18  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
 
 1994-09-16  Karl Heuer  <kwzh@churchy.gnu.ai.mit.edu>
 
-       * emacsbug.el: (report-emacs-bug): Insert configuration options.
+       * emacsbug.el (report-emacs-bug): Insert configuration options.
 
        * ispell.el (ispell-menu-map): Order menu items by size:
        buffer > region > word.
        (Info-edit-mode): Put them here.  Also enable undo, and call
        Info-edit-mode-hook.
 
-       * time.el: (display-time-24hr-format): Doc fix.
+       * time.el (display-time-24hr-format): Doc fix.
        (display-time-filter): Reenable code that got deleted during a
        mispatch.
 
        expressions to include backup files with version numbers.
 
        * jka-compr.el (jka-compr-insert-file-contents): Run the
-        functions in after-insert-file-functions after the
-        buffer-file-name has been set, not before.
+       functions in after-insert-file-functions after the
+       buffer-file-name has been set, not before.
 
        * jka-compr.el (jka-compr-insert-file-contents): Properly
-        handle the 'replace' argument for compressed files.
+       handle the 'replace' argument for compressed files.
 
 1994-09-15  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
 
 
 1994-09-05  Lawrence R. Dodd  <dodd@roebling.poly.edu>
 
-       * dired-x.el: (dired-omit-expunge): Avoid setting buffer modified
+       * dired-x.el (dired-omit-expunge): Avoid setting buffer modified
        unless it was modified before and some mark is set so `%*' won't
        appear in mode-line of omitted buffers.
 
 
 1994-09-01  Francesco Potorti`  (pot@cnuce.cnr.it)
 
-       * cmacexp.el (c-macro-prompt-flag): set default to t.
+       * cmacexp.el (c-macro-prompt-flag): Set default to t.
        (c-macro-expand): buffer-flush-undo is outdated.
-       (c-macro-expansion): make exit-status a local variable.
+       (c-macro-expansion): Make exit-status a local variable.
 
 1994-09-01  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
 
        * lpr.el (lpr-headers-switches): Don't use -p on dgux, irix.
 
        * edebug.el (edebug-read-and-maybe-wrap-form): Increment
-        max-specpdl-size by 2000.
+       max-specpdl-size by 2000.
 
        * jka-compr.el (jka-compr-insert-file-contents): Run the
        after-insert-file-functions.
 1994-08-13  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
 
        * cmacexp.el (c-macro-expansion): If the CPP output is empty, just
-        show error messages.
+       show error messages.
 
        * mouse.el (mouse-set-mark): Select the window before saving point.
 
        * compile.el (compilation-set-window-height): Add save-excursion.
 
        * rmail.el (rmail-maybe-display-summary): Don't set summary window
-        height if its frame isn't split.
+       height if its frame isn't split.
 
        * subr.el (one-window-p): Doc fix.
 
 
        * imenu.el (imenu, imenu--flatten-index-alist): Add marker support.
        (imenu--cleanup): New function.
-        (imenu-example--name-and-position): Now uses markers.
+       (imenu-example--name-and-position): Now uses markers.
 
-        * imenu.el (imenu-add-to-menubar): New function to add an entry
+       * imenu.el (imenu-add-to-menubar): New function to add an entry
        to the menubar for the buffer's current local keymap.
 
 1994-07-29  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
 
 1994-07-25  Johan Vromans  (jv@squirrel.NL.net)
 
-       * forms.el (forms-read-file-filter): new hook function to
+       * forms.el (forms-read-file-filter): New hook function to
        preprocess file contents before being passed to forms mode.
-       (forms-write-file-filter): new hook function to preprocess file
-       contents before it is being saved to disk. Can be used to undo the
+       (forms-write-file-filter): New hook function to preprocess file
+       contents before it is being saved to disk.  Can be used to undo the
        effects of `forms-read-file-filter'.
        (forms-mode): Supply a default format if no `forms-format-list' was
        specified.
 
 1994-07-24  Erik Naggum  <erik@naggum.no>
 
-       * dired.el (dired-internal-noselect): a zero modtime means
+       * dired.el (dired-internal-noselect): A zero modtime means
        directory is unchanged.
 
 1994-07-23  David Robinson  (drtr@mail.ast.cam.ac.uk)
 
 1994-07-22  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
 
-        * cal-menu.el (calendar-mode-map): Change reference from renamed
-        calendar-current-month to calendar-goto-today.
+       * cal-menu.el (calendar-mode-map): Change reference from renamed
+       calendar-current-month to calendar-goto-today.
 
 1994-07-20  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
 
 
 1994-07-19  Michael Kifer  (kifer@cs.sunysb.edu)
 
-       * ediff.el (ediff-find-file, ediff-files-internal, ediff-patch-file):
+       * ediff.el (ediff-find-file, ediff-files-internal, ediff-patch-file):
        Modified to work with remote and compressed files.
 
        * ediff.el (ediff-read-file-name, ediff-buffers): Better defaults.
        New or modified functions and variables attempting to prohibit
        submission of empty bug reporters.
 
-       * reporter.el: (reporter-prompt-for-summary-p): Default value now nil.
+       * reporter.el (reporter-prompt-for-summary-p): Default value now nil.
 
        * reporter.el (reporter-dump-state): Make sure there's a final
        newline after the setq sexp.
 
 1994-07-13  Noah Friedman  (friedman@splode.com)
 
-        * rsz-mini.el: (resize-minibuffer-setup): Copy post-command-hook
-        when handling minibuffer windows in other frames, not just
-        minibuffer-exclusive frames.
-        Resize the minibuffer window/frame now, in case it has already
-        been initialized with text.
+       * rsz-mini.el (resize-minibuffer-setup): Copy post-command-hook
+       when handling minibuffer windows in other frames, not just
+       minibuffer-exclusive frames.
+       Resize the minibuffer window/frame now, in case it has already
+       been initialized with text.
 
 1994-07-13  Ed Reingold  (reingold@albert.gnu.ai.mit.edu)
 
-        * diary-lib.el: Correct file name on last line of file.
+       * diary-lib.el: Correct file name on last line of file.
 
 1994-07-13  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
 
 
        * indent.el (move-to-tab-stop): Delete spurious multiple definition.
 
-1994-07-11  Kevin Rodgers  <kevinr@ihs.com> (tiny change)
+1994-07-11  Kevin Rodgers  <kevinr@ihs.com>  (tiny change)
 
        * mailabbrev.el (define-mail-abbrev): Don't try to parse empty aliases.
 
        * lisp.el (lisp-complete-symbol): Bind completion-fixup-function.
 
        * mouse.el (mouse-choose-completion): Use mouse-face properties to
-        find string to use.
+       find string to use.
 
        * simple.el (completion-setup-function): Put on mouse-face prop
        even if no window-system.  Call completion-fixup-function if not nil.
 
        * gud.el (gud-mips-p): Check for OSF system on Alpha also.
 
-       * files.el (process-environment, exec-path, load-path,exec-directory):
+       * files.el (process-environment, exec-path, load-path, exec-directory):
        Mark these as risky.
        (hack-one-local-variable): Treat vars ending in -program and -command
        as risky.
 
 1994-07-06  Ed Reingold  (reingold@albert.gnu.ai.mit.edu)
 
-        * diary-lib.el (fancy-diary-display): Consistently turn off selective
+       * diary-lib.el (fancy-diary-display): Consistently turn off selective
        display in diary buffer before doing anything.
 
 1994-07-06  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
 
 1994-07-05  Ed Reingold  (reingold@albert.gnu.ai.mit.edu)
 
-        * calendar.el (generate-calendar-month): Make highlighted text for
-        mouse-2 a one character wide for single-digit dates (this undoes
-        the incorrect fix of May 30, 1994).
+       * calendar.el (generate-calendar-month): Make highlighted text for
+       mouse-2 a one character wide for single-digit dates (this undoes
+       the incorrect fix of May 30, 1994).
 
 1994-07-04  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
 
 1994-07-04  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)
 
        * add-log.el (add-change-log-entry): Apply expand-file-name to
-        FILE-NAME.
+       FILE-NAME.
 
 1994-07-03  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
 
 1994-07-02  Morten Welinder  (terra@diku.dk)
 
        * meese.el: Use add-hook, (provide 'meese).
-       (protect-innocence-hook): compare expanded file names for the sake
+       (protect-innocence-hook): Compare expanded file names for the sake
        of non-unix file systems.  Use expand-file-name instead of concat
        to create "celibacy.1" file name.  Check that the "sex.6" exists.
 
 
        * bytecomp.el (byte-compile-defalias): Fix typo in prev change.
 
-       * bytecomp.el (byte-compile-callargs-warn): Handle function defnition
+       * bytecomp.el (byte-compile-callargs-warn): Handle function definition
        that is not a lambda expression or byte code function.
        (byte-compile-arglist-warn): Likewise.
        (byte-compile-defalias): New function, used to compile defalias.
 
 1994-06-29  Noah Friedman  (friedman@splode.com)
 
-        * comint.el (comint-password-prompt-regexp): New variable.
-        (comint-watch-for-password-prompt): Use it.
+       * comint.el (comint-password-prompt-regexp): New variable.
+       (comint-watch-for-password-prompt): Use it.
 
 1994-06-29  Richard Stallman  (rms@gnu.ai.mit.edu)
 
 
 1994-06-28  Lawrence R. Dodd  (dodd@roebling.poly.edu)
 
-        * dired-x.el (dired-x-hands-off-my-keys): New user-defined variable.
-        (dired-x-bind-find-file): Use it.
-        (dired-x-find-file): New function to substitute find-file.
-        (dired-x-find-file-other-window): New function to substitute
-        find-file-other-window.
+       * dired-x.el (dired-x-hands-off-my-keys): New user-defined variable.
+       (dired-x-bind-find-file): Use it.
+       (dired-x-find-file): New function to substitute find-file.
+       (dired-x-find-file-other-window): New function to substitute
+       find-file-other-window.
 
 1994-06-28  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
 
 
 1994-06-22  Noah Friedman  (friedman@splode.com)
 
-        * rsz-mini.el (resize-minibuffer-window-exactly,
-        resize-minibuffer-frame, resize-minibuffer-frame-exactly): Doc
-        fixes.
-        (resize-minibuffer-frame-exactly): make default t.
-        (resize-minibuffer-frame-original-height): New variable.
-        (resize-minibuffer-setup): Set it locally in the minibuffer.
-        (resize-minibuffer-frame): Use it instead of minibuffer-frame-alist's
-        height.
-        (resize-minibuffer-setup): Append resize-minibuffer-window and
-        resize-minibuffer-frame to the end of post-command-hook, don't
-        insert on the front.
-        (resize-minibuffer-window-restore): New function.
-        (resize-minibuffer-setup): Put it on minibuffer-exit-hook.
+       * rsz-mini.el (resize-minibuffer-window-exactly,
+       resize-minibuffer-frame, resize-minibuffer-frame-exactly): Doc
+       fixes.
+       (resize-minibuffer-frame-exactly): Make default t.
+       (resize-minibuffer-frame-original-height): New variable.
+       (resize-minibuffer-setup): Set it locally in the minibuffer.
+       (resize-minibuffer-frame): Use it instead of minibuffer-frame-alist's
+       height.
+       (resize-minibuffer-setup): Append resize-minibuffer-window and
+       resize-minibuffer-frame to the end of post-command-hook, don't
+       insert on the front.
+       (resize-minibuffer-window-restore): New function.
+       (resize-minibuffer-setup): Put it on minibuffer-exit-hook.
 
 1994-06-22  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
 
        * tpu-extras.el: Require tpu-edt.
        (tpu-extras-revision): Variable deleted.
 
-        * tpu-mapper.el: Change size of selected screen.  Reposition after
+       * tpu-mapper.el: Change size of selected screen.  Reposition after
        printing help.  Null default directory for save.  Produce minibuffer
        key bindings for kp4 and kp5.
        (tpu-kp4, tpu-kp5): New variables.
 
        * faces.el (x-create-frame-with-faces): Set the cursor color last.
 
-1994-06-17  Kevin Rodgers  (kevinr@ihs.com) (tiny change)
+1994-06-17  Kevin Rodgers  (kevinr@ihs.com)  (tiny change)
 
        * mailabbrev.el (build-mail-abbrevs): Pass a recursivep argument in
        recursive call.
 1994-06-17  Roland McGrath  (roland@geech.gnu.ai.mit.edu)
 
        * etags.el (tags-table-computed-list,
-        tags-table-computed-list-for): New variables.
+       tags-table-computed-list-for): New variables.
        (tags-table-list-pointer, tags-table-list-started-at): Doc fixes.
        (tags-table-parent-pointer-list): Variable removed.
        (tags-table-check-computed-list, tags-table-extend-computed-list): New
 
 1994-06-16  Noah Friedman  (friedman@splode.com)
 
-        * rlogin.el (rlogin-password-paranoia): Variable deleted.
-        (rlogin-password): Function deleted.
-        This functionality is handled by comint-watch-for-password-prompt.
+       * rlogin.el (rlogin-password-paranoia): Variable deleted.
+       (rlogin-password): Function deleted.
+       This functionality is handled by comint-watch-for-password-prompt.
 
-        * rlogin.el (rlogin-filter): Function deleted.
-        (rlogin): Do not set the process filter to rlogin-filter.
+       * rlogin.el (rlogin-filter): Function deleted.
+       (rlogin): Do not set the process filter to rlogin-filter.
 
 1994-06-15  Morten Welinder  (terra@diku.dk)
 
 1994-06-14  Ed Reingold  (reingold@albert.gnu.ai.mit.edu)
 
        * cal-menu.el (calendar-mode-map): Change moon menu bar to pop up
-        a menu instead doing it directly.
-        (calendar-mouse-2-date-menu): Remove moon phase.
+       a menu instead doing it directly.
+       (calendar-mouse-2-date-menu): Remove moon phase.
 
 1994-06-14  Richard Stallman  (rms@albert.gnu.ai.mit.edu)
 
        (forms--local-write-file-function): New function to be used as
        `local-write-file-hooks'.
        (forms-mode): Use it.
-       (forms-find-file,forms-find-file-other-window): Locally set
+       (forms-find-file, forms-find-file-other-window): Locally set
        `enable-local-eval' and `enable-local-variables' to t.
        (forms-find-file-other-window): Remove extraneous call to
        `eval-current-buffer'.
 
 1994-06-12  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
 
-       * iso-cvt.el (iso-iso2tex-trans-tab): Add a few characters.
-       (iso-iso2gtex-trans-tab): Likewise.
-       (iso-tex2iso-trans-tab): Recognize TeX accent sequences without braces.
-       (iso-gtex2iso-trans-tab): Likewise.
+       * iso-cvt.el (iso-iso2tex-trans-tab): Add a few characters.
+       (iso-iso2gtex-trans-tab): Likewise.
+       (iso-tex2iso-trans-tab): Recognize TeX accent sequences without braces.
+       (iso-gtex2iso-trans-tab): Likewise.
 
        * info.el (Info-fontify-node): Require some whitespace after *Note.
 
 
 1994-06-07  Morten Welinder  (terra@diku.dk)
 
-       * dos-fns.el (Info-default-directory-list):  Setting this no
+       * dos-fns.el (Info-default-directory-list): Setting this no
        longer needed.
 
 1994-06-07  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
         solar-equinoxes-solstices): Revised to use the rewritten and new fcns.
 
        * calendar.el (solar-holidays): Revised to use the rewritten and
-         new fcns.
+        new fcns.
 
        * lunar.el (lunar-phase): Revised to use the rewritten and new fcns.
 
index a00b482a9437bc1fb54b5c87b2f3f4c97086c469..39d74ce003edc0f1cd9266771e7526827e9a8b29 100644 (file)
@@ -130,7 +130,7 @@ cvs-update: recompile autoloads finder-data custom-deps
 # Update the AUTHORS file.
 
 update-authors:
-       $(emacs) -l authors -f batch-update-authors $(srcdir)/AUTHORS $(srcdir)
+       $(emacs) -l authors -f batch-update-authors $(srcdir)/etc/AUTHORS $(srcdir)
 
 TAGS: $(lisptagsfiles1) $(lisptagsfiles2)
        els=`echo $(lisptagsfiles1) $(lisptagsfiles2) | sed -e "s,$(lisp)/loaddefs[^ ]*,," -e "s,$(lisp)/ldefs-boot[^ ]*,,"`; \
index 4b6b3452a9ec012c247f3a0f03c4ac4ad735a8ac..546f87b4e4d43634f61cbf860a42b31823df4b54 100644 (file)
 
 ;; This facility is documented in the Emacs Manual.
 
+;; Todo:
+
+;; - Find/use/create _MTN/log if there's a _MTN directory.
+;; - Find/use/create ++log.* if there's an {arch} directory.
+;; - Use an open *VC-Log* or *cvs-commit* buffer if it's related to the
+;;   source file.
+;; - Don't add TAB indents (and username?) if inserting entries in those
+;;   special places.
+
 ;;; Code:
 
 (eval-when-compile
@@ -41,7 +50,7 @@
 
 
 (defcustom change-log-default-name nil
-  "*Name of a change log file for \\[add-change-log-entry]."
+  "Name of a change log file for \\[add-change-log-entry]."
   :type '(choice (const :tag "default" nil)
                 string)
   :group 'change-log)
@@ -1007,7 +1016,7 @@ Has a preference of looking backwards."
                ((derived-mode-p 'texinfo-mode)
                 (if (re-search-backward "^@node[ \t]+\\([^,\n]+\\)" nil t)
                     (match-string-no-properties 1)))
-               ((derived-mode-p '(perl-mode cperl-mode))
+               ((derived-mode-p 'perl-mode 'cperl-mode)
                 (if (re-search-backward "^sub[ \t]+\\([^({ \t\n]+\\)" nil t)
                     (match-string-no-properties 1)))
                ;; Emacs's autoconf-mode installs its own
index d243a188812e2a07caab902792ed98b66ab85e51..49dfef2154774462f9b99783df42899714044d0d 100644 (file)
@@ -1130,17 +1130,17 @@ Built on top of optional BASE-MAP, or empty sparse map if none specified.
 See doc string for allout-keybindings-list for format of binding list."
   (let ((map (or base-map (make-sparse-keymap)))
        (pref (list allout-command-prefix)))
-    (mapcar (function
-            (lambda (cell)
-              (let ((add-pref (null (cdr (cdr cell))))
-                    (key-suff (list (car cell))))
-                (apply 'define-key
-                       (list map
-                             (apply 'concat (if add-pref
-                                                (append pref key-suff)
-                                              key-suff))
-                             (car (cdr cell)))))))
-           keymap-list)
+    (mapc (function
+          (lambda (cell)
+           (let ((add-pref (null (cdr (cdr cell))))
+                 (key-suff (list (car cell))))
+             (apply 'define-key
+                    (list map
+                          (apply 'concat (if add-pref
+                                             (append pref key-suff)
+                                           key-suff))
+                          (car (cdr cell)))))))
+         keymap-list)
     map))
 ;;;_  : Menu bar
 (defvar allout-mode-exposure-menu)
@@ -2191,7 +2191,7 @@ See allout-overlay-interior-modification-handler for details."
   (when (and (featurep 'xemacs) (allout-mode-p))
     ;; process all of the pending overlays:
     (save-excursion
-      (got-char beg)
+      (goto-char beg)
       (let ((overlay (allout-get-invisibility-overlay)))
        (allout-overlay-interior-modification-handler
         overlay nil beg end nil)))))
@@ -5463,7 +5463,7 @@ Defaults:
          (progn (set-buffer frombuf)
                 (allout-listify-exposed from to format))))
     (set-buffer tobuf)
-    (mapcar func listified)
+    (mapc func listified)
     (pop-to-buffer tobuf)))
 
 ;;;_  - Copy exposed
index 769b21a38f385a104301971a655801b6ab0bd41b..9b022876ca2e5e831103eeebae43d2aa33cfcbf4 100644 (file)
@@ -557,14 +557,14 @@ The face definitions are based upon the variables
   (let ((ansi-color-map (make-vector 50 nil))
         (index 0))
     ;; miscellaneous attributes
-    (mapcar
+    (mapc
      (function (lambda (e)
                  (aset ansi-color-map index e)
                  (setq index (1+ index)) ))
      ansi-color-faces-vector)
     ;; foreground attributes
     (setq index 30)
-    (mapcar
+    (mapc
      (function (lambda (e)
                  (aset ansi-color-map index
                       (ansi-color-make-face 'foreground e))
@@ -572,7 +572,7 @@ The face definitions are based upon the variables
      ansi-color-names-vector)
     ;; background attributes
     (setq index 40)
-    (mapcar
+    (mapc
      (function (lambda (e)
                  (aset ansi-color-map index
                       (ansi-color-make-face 'background e))
index 20757586aea96b70538f7c3ce07e62203bec7c80..421283da9e0022d349adb3df9f6a56780255d409 100644 (file)
 ;; ARCHIVE TYPES: Currently only the archives below are handled, but the
 ;; structure for handling just about anything is in place.
 ;;
-;;                        Arc     Lzh     Zip     Zoo
-;;                        --------------------------------
-;; View listing           Intern  Intern  Intern  Intern
-;; Extract member         Y       Y       Y       Y
-;; Save changed member    Y       Y       Y       Y
-;; Add new member         N       N       N       N
-;; Delete member          Y       Y       Y       Y
-;; Rename member          Y       Y       N       N
-;; Chmod                  -       Y       Y       -
-;; Chown                  -       Y       -       -
-;; Chgrp                  -       Y       -       -
+;;                     Arc     Lzh     Zip     Zoo      Rar
+;;                     ----------------------------------------
+;; View listing                Intern  Intern  Intern  Intern   Y
+;; Extract member      Y       Y       Y       Y        Y
+;; Save changed member Y       Y       Y       Y        N
+;; Add new member      N       N       N       N        N
+;; Delete member       Y       Y       Y       Y        N
+;; Rename member       Y       Y       N       N        N
+;; Chmod               -       Y       Y       -        N
+;; Chown               -       Y       -       -        N
+;; Chgrp               -       Y       -       -        N
 ;;
 ;; Special thanks to Bill Brodie <wbrodie@panix.com> for very useful tips
 ;; on the first released version of this package.
 ;;; Code:
 
 ;; -------------------------------------------------------------------------
-;; Section: Configuration.
+;;; Section: Configuration.
 
 (defgroup archive nil
   "Simple editing of archives."
@@ -318,7 +318,7 @@ Archive and member name will be added."
                        (string :format "%v")))
   :group 'archive-zoo)
 ;; -------------------------------------------------------------------------
-;; Section: Variables
+;;; Section: Variables
 
 (defvar archive-subtype nil "Symbol describing archive type.")
 (defvar archive-file-list-start nil "Position of first contents line.")
@@ -463,7 +463,7 @@ Each descriptor is a vector of the form
 (make-variable-buffer-local 'archive-files)
 
 ;; -------------------------------------------------------------------------
-;; Section: Support functions.
+;;; Section: Support functions.
 
 (eval-when-compile
   (defsubst byte-after (pos)
@@ -619,7 +619,7 @@ Does not signal an error if optional argument NOERROR is non-nil."
       (if (not noerror)
           (error "Line does not describe a member of the archive")))))
 ;; -------------------------------------------------------------------------
-;; Section: the mode definition
+;;; Section: the mode definition
 
 ;;;###autoload
 (defun archive-mode (&optional force)
@@ -727,8 +727,18 @@ archive.
           ;; Have seen capital "LHA's", and file has lower case "LHa's" too.
           ;; Note this regexp is also in archive-exe-p.
           ((looking-at "MZ\\(.\\|\n\\)\\{34\\}LH[aA]'s SFX ") 'lzh-exe)
+          ((looking-at "Rar!") 'rar)
          (t (error "Buffer format not recognized")))))
 ;; -------------------------------------------------------------------------
+
+(defun archive-desummarize ()
+  (let ((inhibit-read-only t)
+        (modified (buffer-modified-p)))
+    (widen)
+    (delete-region (point-min) archive-proper-file-start)
+    (restore-buffer-modified-p modified)))
+
+
 (defun archive-summarize (&optional shut-up)
   "Parse the contents of the archive file in the current buffer.
 Place a dired-like listing on the front;
@@ -738,6 +748,8 @@ Optional argument SHUT-UP, if non-nil, means don't print messages
 when parsing the archive."
   (widen)
   (let ((inhibit-read-only t))
+    (setq archive-proper-file-start (copy-marker (point-min) t))
+    (set (make-local-variable 'change-major-mode-hook) 'archive-desummarize)
     (or shut-up
        (message "Parsing archive file..."))
     (buffer-disable-undo (current-buffer))
@@ -753,13 +765,9 @@ when parsing the archive."
 
 (defun archive-resummarize ()
   "Recreate the contents listing of an archive."
-  (let ((modified (buffer-modified-p))
-       (no (archive-get-lineno))
-       (inhibit-read-only t))
-    (widen)
-    (delete-region (point-min) archive-proper-file-start)
+  (let ((no (archive-get-lineno)))
+    (archive-desummarize)
     (archive-summarize t)
-    (restore-buffer-modified-p modified)
     (goto-char archive-file-list-start)
     (archive-next-line no)))
 
@@ -796,7 +804,7 @@ This function changes the set of information shown for each files."
   (setq archive-alternate-display (not archive-alternate-display))
   (archive-resummarize))
 ;; -------------------------------------------------------------------------
-;; Section: Local archive copy handling
+;;; Section: Local archive copy handling
 
 (defun archive-unique-fname (fname dir)
   "Make sure a file FNAME can be created uniquely in directory DIR.
@@ -878,7 +886,7 @@ using `make-temp-file', and the generated name is returned."
        (error nil))
       (if (string= name top) (setq again nil)))))
 ;; -------------------------------------------------------------------------
-;; Section: Member extraction
+;;; Section: Member extraction
 
 (defun archive-file-name-handler (op &rest args)
   (or (eq op 'file-exists-p)
@@ -1100,7 +1108,7 @@ using `make-temp-file', and the generated name is returned."
          (funcall func buffer-file-name membuf name))
       (error "Adding a new member is not supported for this archive type"))))
 ;; -------------------------------------------------------------------------
-;; Section: IO stuff
+;;; Section: IO stuff
 
 (defun archive-write-file-member ()
   (save-excursion
@@ -1170,7 +1178,7 @@ using `make-temp-file', and the generated name is returned."
       (set-buffer-modified-p nil))
     t))
 ;; -------------------------------------------------------------------------
-;; Section: Marking and unmarking.
+;;; Section: Marking and unmarking.
 
 (defun archive-flag-deleted (p &optional type)
   "In archive mode, mark this member to be deleted from the archive.
@@ -1235,7 +1243,7 @@ Use \\[archive-unmark-all-files] to remove all marks."
        (and default
             (list (archive-get-descr))))))
 ;; -------------------------------------------------------------------------
-;; Section: Operate
+;;; Section: Operate
 
 (defun archive-next-line (p)
   (interactive "p")
@@ -1353,7 +1361,7 @@ This doesn't recover lost files, it just undoes changes in the buffer itself."
   (let ((inhibit-read-only t))
     (undo)))
 ;; -------------------------------------------------------------------------
-;; Section: Arc Archives
+;;; Section: Arc Archives
 
 (defun archive-arc-summarize ()
   (let ((p 1)
@@ -1423,7 +1431,7 @@ This doesn't recover lost files, it just undoes changes in the buffer itself."
        (delete-char 13)
        (insert-unibyte name)))))
 ;; -------------------------------------------------------------------------
-;; Section: Lzh Archives
+;;; Section: Lzh Archives
 
 (defun archive-lzh-summarize (&optional start)
   (let ((p (or start 1)) ;; 1 for .lzh, something further on for .exe
@@ -1646,7 +1654,7 @@ This doesn't recover lost files, it just undoes changes in the buffer itself."
    files "a unix-style mode" 8))
 
 ;; -------------------------------------------------------------------------
-;; Section: Lzh Self-Extracting .exe Archives
+;;; Section: Lzh Self-Extracting .exe Archives
 ;;
 ;; No support for modifying these files.  It looks like the lha for unix
 ;; program (as of version 1.14i) can't create or retain the DOS exe part.
@@ -1673,7 +1681,7 @@ This doesn't recover lost files, it just undoes changes in the buffer itself."
   "Extract a member from an LZH self-extracting exe, for `archive-mode'.")
 
 ;; -------------------------------------------------------------------------
-;; Section: Zip Archives
+;;; Section: Zip Archives
 
 (defun archive-zip-summarize ()
   (goto-char (- (point-max) (- 22 18)))
@@ -1780,7 +1788,7 @@ This doesn't recover lost files, it just undoes changes in the buffer itself."
                (t (message "Don't know how to change mode for this member"))))
         ))))
 ;; -------------------------------------------------------------------------
-;; Section: Zoo Archives
+;;; Section: Zoo Archives
 
 (defun archive-zoo-summarize ()
   (let ((p (1+ (archive-l-e 25 4)))
@@ -1848,6 +1856,87 @@ This doesn't recover lost files, it just undoes changes in the buffer itself."
 
 (defun archive-zoo-extract (archive name)
   (archive-extract-by-stdout archive name archive-zoo-extract))
+
+;; -------------------------------------------------------------------------
+;;; Section: Rar Archives
+
+(defun archive-rar-summarize ()
+  (let* ((file buffer-file-name)
+         (copy (file-local-copy file))
+         header footer
+         (maxname 10)
+         (maxsize 5)
+         (files ()))
+    (with-temp-buffer
+      (call-process "unrar-free" nil t nil "--list" (or file copy))
+      (if copy (delete-file copy))
+      (goto-char (point-min))
+      (re-search-forward "^-+\n")
+      (setq header
+            (buffer-substring (save-excursion (re-search-backward "^[^ ]"))
+                              (point)))
+      (while (looking-at (concat " \\(.*\\)\n" ;Name.
+                                 ;; Size ; Packed.
+                                 " +\\([0-9]+\\) +[0-9]+"
+                                 ;; Ratio ; Date'
+                                 " +\\([0-9%]+\\) +\\([-0-9]+\\)"
+                                 ;; Time ; Attr.
+                                 " +\\([0-9:]+\\) +......"
+                                 ;; CRC; Meth ; Var.
+                                 " +[0-9A-F]+ +[^ \n]+ +[0-9.]+\n"))
+        (goto-char (match-end 0))
+        (let ((name (match-string 1))
+              (size (match-string 2)))
+          (if (> (length name) maxname) (setq maxname (length name)))
+          (if (> (length size) maxsize) (setq maxsize (length size)))
+          (push (vector name name nil nil
+                        ;; Size, Ratio.
+                        size (match-string 3)
+                        ;; Date, Time.
+                        (match-string 4) (match-string 5))
+                files)))
+      (setq footer (buffer-substring (point) (point-max))))
+    (setq files (nreverse files))
+    (goto-char (point-min))
+    (let* ((format (format " %%s %%s  %%%ds %%5s  %%s" maxsize))
+           (sep (format format "--------" "-----" (make-string maxsize ?-)
+                        "-----" ""))
+           (column (length sep)))
+      (insert (format format "  Date  " "Time " "Size " "Ratio" " Filename") "\n")
+      (insert sep (make-string maxname ?-) "\n")
+      (archive-summarize-files (mapcar (lambda (desc)
+                                         (let ((text
+                                                (format format
+                                                         (aref desc 6)
+                                                         (aref desc 7)
+                                                         (aref desc 4)
+                                                         (aref desc 5)
+                                                         (aref desc 1))))
+                                           (vector text
+                                                   column
+                                                   (length text))))
+                                       files))
+      (insert sep (make-string maxname ?-) "\n")
+      (apply 'vector files))))
+
+(defun archive-rar-extract (archive name)
+  ;; unrar-free seems to have no way to extract to stdout or even to a file.
+  (if (file-name-absolute-p name)
+      ;; The code below assumes the name is relative and may do undesirable
+      ;; things otherwise.
+      (error "Can't extract files with non-relative names")
+    (let ((dest (make-temp-file "arc-rar" 'dir)))
+      (unwind-protect
+          (progn
+            (call-process "unrar-free" nil nil nil
+                          "--extract" archive name dest)
+            (insert-file-contents-literally (expand-file-name name dest)))
+        (delete-file (expand-file-name name dest))
+        (while (file-name-directory name)
+          (setq name (directory-file-name (file-name-directory name)))
+          (delete-directory (expand-file-name name dest)))
+        (delete-directory dest)))))
+
 ;; -------------------------------------------------------------------------
 ;; This line was a mistake; it is kept now for compatibility.
 ;; rms  15 Oct 98
index 91bfb396b0e4616052854769e7cf2c517b83cc1a..5887529ba43597064714bca9e34bdc9d68763fea 100644 (file)
@@ -212,7 +212,88 @@ If this contains a %s, that will be replaced by the matching rule."
 \(provide '"
        (file-name-sans-extension (file-name-nondirectory (buffer-file-name)))
        ")
-\;;; " (file-name-nondirectory (buffer-file-name)) " ends here\n"))
+\;;; " (file-name-nondirectory (buffer-file-name)) " ends here\n")
+    (("\\.texi\\(nfo\\)?\\'" . "Texinfo file skeleton")
+     "Title: "
+     "\\input texinfo   @c -*-texinfo-*-
+@c %**start of header
+@setfilename "
+     (file-name-sans-extension
+      (file-name-nondirectory (buffer-file-name))) ".info\n"
+      "@settitle " str "
+@c %**end of header
+@copying\n"
+      (setq short-description (read-string "Short description: "))
+      ".\n\n"
+      "Copyright @copyright{} " (substring (current-time-string) -4) "  "
+      (getenv "ORGANIZATION") | (progn user-full-name) "
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.1 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, and no Cover Texts.  A copy of the license is
+included in the section entitled ``GNU Free Documentation License.''
+
+A copy of the license is also available from the Free Software
+Foundation Web site at @url{http://www.gnu.org/licenses/fdl.html}.
+
+@end quotation
+
+The document was typeset with
+@uref{http://www.texinfo.org/, GNU Texinfo}.
+
+@end copying
+
+@titlepage
+@title " str "
+@subtitle " short-description "
+@author " (getenv "ORGANIZATION") | (progn user-full-name)
+     " <" (progn user-mail-address) ">
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+@c Output the table of the contents at the beginning.
+@contents
+
+@ifnottex
+@node Top
+@top " str "
+
+@insertcopying
+@end ifnottex
+
+@c Generate the nodes for this menu with `C-c C-u C-m'.
+@menu
+@end menu
+
+@c Update all node entries with `C-c C-u C-n'.
+@c Insert new nodes with `C-c C-c n'.
+@node Chapter One
+@chapter Chapter One
+
+" _ "
+
+@node Copying This Manual
+@appendix Copying This Manual
+
+@menu
+* GNU Free Documentation License::  License for copying this manual.
+@end menu
+
+@c Get fdl.texi from http://www.gnu.org/licenses/fdl.html
+@include fdl.texi
+
+@node Index
+@unnumbered Index
+
+@printindex cp
+
+@bye
+
+@c " (file-name-nondirectory (buffer-file-name)) " ends here\n"))
   "A list specifying text to insert by default into a new file.
 Elements look like (CONDITION . ACTION) or ((CONDITION . DESCRIPTION) . ACTION).
 CONDITION may be a regexp that must match the new file's name, or it may be
@@ -272,7 +353,7 @@ Matches the visited file name against the elements of `auto-insert-alist'."
                          (eq this-command 'auto-insert))
                      (y-or-n-p (format auto-insert-prompt desc)))
                t)
-             (mapcar
+             (mapc
               (lambda (action)
                 (if (stringp action)
                     (if (file-readable-p
index f1e5b146058012320fe9c96bd4df04e0c7882c87..49e83c514a9ce2071443fdbdb1f36442d7a39696 100644 (file)
@@ -416,12 +416,16 @@ will use an up-to-date value of `auto-revert-interval'"
   "Revert current buffer, if appropriate.
 This is an internal function used by Auto-Revert Mode."
   (when (or auto-revert-tail-mode (not (buffer-modified-p)))
-    (let* ((buffer (current-buffer))
+    (let* ((buffer (current-buffer)) size
           (revert
            (or (and buffer-file-name
                     (not (file-remote-p buffer-file-name))
                     (file-readable-p buffer-file-name)
-                    (not (verify-visited-file-modtime buffer)))
+                    (if auto-revert-tail-mode
+                        (/= auto-revert-tail-pos
+                           (setq size
+                                 (nth 7 (file-attributes buffer-file-name))))
+                      (not (verify-visited-file-modtime buffer))))
                (and (or auto-revert-mode
                         global-auto-revert-non-file-buffers)
                     revert-buffer-function
@@ -445,7 +449,7 @@ This is an internal function used by Auto-Revert Mode."
                    (push window eoblist)))
           'no-mini t))
        (if auto-revert-tail-mode
-           (auto-revert-tail-handler)
+           (auto-revert-tail-handler size)
          ;; Bind buffer-read-only in case user has done C-x C-q,
          ;; so as not to forget that.  This gives undesirable results
          ;; when the file's mode changes, but that is less common.
@@ -460,20 +464,22 @@ This is an internal function used by Auto-Revert Mode."
       (when (or revert auto-revert-check-vc-info)
        (vc-find-file-hook)))))
 
-(defun auto-revert-tail-handler ()
-  (let ((size (nth 7 (file-attributes buffer-file-name)))
-       (modified (buffer-modified-p))
+(defun auto-revert-tail-handler (size)  
+  (let ((modified (buffer-modified-p))
        (inhibit-read-only t)           ; Ignore.
        (file buffer-file-name)
        (buffer-file-name nil))         ; Ignore that file has changed.
-    (when (> size auto-revert-tail-pos)
+    (when (/= auto-revert-tail-pos size)
       (run-hooks 'before-revert-hook)
       (undo-boundary)
       (save-restriction
        (widen)
        (save-excursion
          (goto-char (point-max))
-         (insert-file-contents file nil auto-revert-tail-pos size)))
+         (insert-file-contents file nil
+                               (and (< auto-revert-tail-pos size)
+                                    auto-revert-tail-pos)
+                               size)))
       (run-hooks 'after-revert-hook)
       (undo-boundary)
       (setq auto-revert-tail-pos size)
index 9fd4b3b95692ba709569ac867942c07e29e8d394..0e7bd15a494629d7a96715a127f6196adfb9eab2 100644 (file)
@@ -170,6 +170,12 @@ corresponding to the mode line clicked."
       (push (cons eol (cons mnemonic desc)) mode-line-eol-desc-cache)
       desc)))
 
+(defvar mode-line-client
+  `(""
+    (:propertize ("" (:eval (if (frame-parameter nil 'client) "@" "")))
+                help-echo "Emacsclient frame"))
+  "Mode-line control for identifying Emacsclient frames.")
+
 (defvar mode-line-mule-info
   `(""
     (current-input-method
@@ -209,7 +215,7 @@ mnemonics of the following coding systems:
 
 (make-variable-buffer-local 'mode-line-mule-info)
 
-(defvar mode-line-frame-identification '("-%F  ")
+(defvar mode-line-frame-identification '(window-system "  " "-%F  ")
   "Mode-line control to describe the current frame.")
 
 (defvar mode-line-process nil "\
@@ -302,6 +308,7 @@ Keymap to display on minor modes.")
         "%e"
         (propertize "-" 'help-echo help-echo)
         'mode-line-mule-info
+        'mode-line-client
         'mode-line-modified
         'mode-line-remote
         'mode-line-frame-identification
@@ -331,6 +338,7 @@ Keymap to display on minor modes.")
                     'local-map (make-mode-line-mouse-map
                                 'mouse-2 #'mode-line-widen))
         (propertize ")%]--" 'help-echo help-echo)))
+
        (standard-mode-line-position
        `((-3 ,(propertize "%p" 'help-echo help-echo))
          (size-indication-mode
@@ -643,6 +651,10 @@ language you are using."
 (define-key global-map "\e\e\e" 'keyboard-escape-quit)
 (define-key global-map "\C-g" 'keyboard-quit)
 
+;; Used to be in termdev.el: when using several terminals, make C-z
+;; suspend only the relevant terminal.
+(substitute-key-definition 'suspend-emacs 'suspend-frame global-map)
+
 (define-key global-map "\C-j" 'newline-and-indent)
 (define-key global-map "\C-m" 'newline)
 (define-key global-map "\C-o" 'open-line)
@@ -1023,8 +1035,7 @@ language you are using."
 (define-key ctl-x-map "rw" 'window-configuration-to-register)
 (define-key ctl-x-map "rf" 'frame-configuration-to-register)
 
-(define-key esc-map "q" 'fill-paragraph)
-;; (define-key esc-map "g" 'fill-region)
+(define-key esc-map "q" 'fill-paragraph-or-region)
 (define-key ctl-x-map "." 'set-fill-prefix)
 \f
 (define-key esc-map "{" 'backward-paragraph)
index c1904cb0393b53a365bf9089810d5f2901419319..184f9de518cc4597bdc7fe224a707bb8eabbb610 100644 (file)
@@ -207,11 +207,6 @@ following in your `.emacs' file:
 
 ;;; No user-serviceable parts beyond this point.
 
-;; Is it XEmacs?
-(defconst bookmark-xemacsp
-  (string-match "\\(Lucid\\|Xemacs\\)" emacs-version))
-
-
 ;; Added  for lucid emacs  compatibility, db
 (or (fboundp 'defalias)  (fset 'defalias 'fset))
 
@@ -495,7 +490,7 @@ Optional fourth arg INFO-NODE means this bookmark is at info node
 INFO-NODE, so record this fact in the bookmark's entry."
   (bookmark-maybe-load-default-file)
   (let ((stripped-name (copy-sequence name)))
-    (or bookmark-xemacsp
+    (or (featurep 'xemacs)
         ;; XEmacs's `set-text-properties' doesn't work on
         ;; free-standing strings, apparently.
         (set-text-properties 0 (length stripped-name) nil stripped-name))
@@ -1590,7 +1585,7 @@ deletion, or > if it is flagged for displaying."
     (insert "% Bookmark\n- --------\n")
     (add-text-properties (point-min) (point)
                         '(font-lock-face bookmark-menu-heading))
-    (mapcar
+    (mapc
      (lambda (full-record)
        ;; if a bookmark has an annotation, prepend a "*"
        ;; in the list of bookmarks.
@@ -1807,7 +1802,7 @@ if an annotation exists."
   (let ((old-buf (current-buffer)))
     (pop-to-buffer (get-buffer-create "*Bookmark Annotation*") t)
     (delete-region (point-min) (point-max))
-    (mapcar
+    (mapc
      (lambda (full-record)
        (let* ((name (bookmark-name-from-full-record full-record))
               (ann  (bookmark-get-annotation name)))
index 9d89eb17b2dc7f8163830c8894b3fce63866e008..4d13c97c2fd64547702e9766435b8e3bc8307d92 100644 (file)
 
 ;;; Code:
 
-(defvar font-lock-verbose)
-
 ;; ----------------------------------------------------------------------
 ;; Globals for customization
 ;; ----------------------------------------------------------------------
@@ -244,7 +242,8 @@ The function gets one argument - the buffer to test.")
 
 (defvar bs-buffer-sort-function nil
   "Sort function to sort the buffers that appear in Buffer Selection Menu.
-The function gets two arguments - the buffers to compare.")
+The function gets two arguments - the buffers to compare.
+It must return non-nil if the first buffer should sort before the second.")
 
 (defcustom bs-maximal-buffer-name-column 45
   "*Maximum column width for buffer names.
@@ -337,7 +336,7 @@ Must be a string used in `bs-configurations' for naming a configuration."
   :type 'string)
 
 (defcustom bs-string-show-normally  " "
-  "*String added in column 1 indicating a unmarked buffer."
+  "*String added in column 1 indicating an unmarked buffer."
   :group 'bs-appearance
   :type 'string)
 
@@ -393,9 +392,9 @@ A value of `always' means to show buffer regardless of the configuration.")
     ("by nothing"  nil                  nil      nil))
   "*List of all possible sorting aspects for Buffer Selection Menu.
 You can add a new entry with a call to `bs-define-sort-function'.
-Each element is a list of four elements (NAME FUNCTION REGEXP-FOR-SORTING FACE)
+Each element is a list of four elements (NAME FUNCTION REGEXP-FOR-SORTING FACE).
 NAME specifies the sort order defined by function FUNCTION.
-FUNCTION nil means don't sort the buffer list.  Otherwise the functions
+FUNCTION nil means don't sort the buffer list.  Otherwise the function
 must have two parameters - the buffers to compare.
 REGEXP-FOR-SORTING is a regular expression which describes the
 column title to highlight.
@@ -620,7 +619,7 @@ actually the line which begins with character in `bs-string-current' or
 \\<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.
@@ -653,11 +652,14 @@ to show always.
   (use-local-map bs-mode-map)
   (make-local-variable 'font-lock-defaults)
   (make-local-variable 'font-lock-verbose)
+  (make-local-variable 'font-lock-global-modes)
   (buffer-disable-undo)
   (setq major-mode 'bs-mode
        mode-name "Buffer-Selection-Menu"
        buffer-read-only t
        truncate-lines t
+       show-trailing-whitespace nil
+       font-lock-global-modes '(not bs-mode)
        font-lock-defaults '(bs-mode-font-lock-keywords t)
        font-lock-verbose nil)
   (run-mode-hooks 'bs-mode-hook))
@@ -669,7 +671,7 @@ to show always.
     (setq bs--window-config-coming-from nil)))
 
 (defun bs-kill ()
-  "Let buffer disappear and reset window-configuration."
+  "Let buffer disappear and reset window configuration."
   (interactive)
   (bury-buffer (current-buffer))
   (bs--restore-window-config))
@@ -778,7 +780,7 @@ Leave Buffer Selection Menu."
 (defun bs-mouse-select-other-frame (event)
   "Select selected line's buffer in new created frame.
 Leave Buffer Selection Menu.
-EVENT: a mouse click EVENT."
+EVENT: a mouse click event."
   (interactive "e")
   (mouse-set-point event)
   (bs-select-other-frame))
@@ -929,7 +931,7 @@ WHAT is a value of nil, `never', or `always'."
       (bs-up 1))))
 
 (defun bs-show-sorted ()
-  "Show buffer list sorted by buffer name."
+  "Show buffer list sorted by next sort aspect."
   (interactive)
   (setq bs--current-sort-function
        (bs-next-config-aux (car bs--current-sort-function)
@@ -1020,13 +1022,13 @@ If at end of buffer list go to first line."
     (forward-line 1)))
 
 (defun bs-visits-non-file (buffer)
-  "Return t or nil whether BUFFER visits no file.
+  "Return whether BUFFER visits no file.
 A value of t means BUFFER belongs to no file.
 A value of nil means BUFFER belongs to a file."
   (not (buffer-file-name buffer)))
 
 (defun bs-sort-buffer-interns-are-last (b1 b2)
-  "Function for sorting internal buffers B1 and B2 at the end of all buffers."
+  "Function for sorting internal buffers at the end of all buffers."
   (string-match "^\\*" (buffer-name b2)))
 
 ;; ----------------------------------------------------------------------
@@ -1034,7 +1036,7 @@ A value of nil means BUFFER belongs to a file."
 ;; ----------------------------------------------------------------------
 
 (defun bs-config-clear ()
-  "*Reset all variables which specify a configuration.
+  "Reset all variables which specify a configuration.
 These variables are `bs-dont-show-regexp', `bs-must-show-regexp',
 `bs-dont-show-function', `bs-must-show-function' and
 `bs-buffer-sort-function'."
@@ -1274,7 +1276,7 @@ or a string."
 (defun bs--get-marked-string (start-buffer all-buffers)
   "Return a string which describes whether current buffer is marked.
 START-BUFFER is the buffer where we started buffer selection.
-ALL-BUFFERS is the list of buffer appearing in Buffer Selection Menu.
+ALL-BUFFERS is the list of buffers appearing in Buffer Selection Menu.
 The result string is one of `bs-string-current', `bs-string-current-marked',
 `bs-string-marked', `bs-string-show-normally', `bs-string-show-never', or
 `bs-string-show-always'."
@@ -1299,19 +1301,19 @@ The result string is one of `bs-string-current', `bs-string-current-marked',
 (defun bs--get-modified-string (start-buffer all-buffers)
   "Return a string which describes whether current buffer is modified.
 START-BUFFER is the buffer where we started buffer selection.
-ALL-BUFFERS is the list of buffer appearing in Buffer Selection Menu."
+ALL-BUFFERS is the list of buffers appearing in Buffer Selection Menu."
   (if (buffer-modified-p) "*" " "))
 
 (defun bs--get-readonly-string (start-buffer all-buffers)
   "Return a string which describes whether current buffer is read only.
 START-BUFFER is the buffer where we started buffer selection.
-ALL-BUFFERS is the list of buffer appearing in Buffer Selection Menu."
+ALL-BUFFERS is the list of buffers appearing in Buffer Selection Menu."
   (if buffer-read-only "%" " "))
 
 (defun bs--get-size-string (start-buffer all-buffers)
   "Return a string which describes the size of current buffer.
 START-BUFFER is the buffer where we started buffer selection.
-ALL-BUFFERS is the list of buffer appearing in Buffer Selection Menu."
+ALL-BUFFERS is the list of buffers appearing in Buffer Selection Menu."
   (int-to-string (buffer-size)))
 
 (defun bs--get-name (start-buffer all-buffers)
@@ -1319,7 +1321,7 @@ ALL-BUFFERS is the list of buffer appearing in Buffer Selection Menu."
 The name of current buffer gets additional text properties
 for mouse highlighting.
 START-BUFFER is the buffer where we started buffer selection.
-ALL-BUFFERS is the list of buffer appearing in Buffer Selection Menu."
+ALL-BUFFERS is the list of buffers appearing in Buffer Selection Menu."
   (propertize (buffer-name)
               'help-echo "mouse-2: select this buffer, mouse-3: select in other frame"
               'mouse-face 'highlight))
@@ -1327,7 +1329,7 @@ ALL-BUFFERS is the list of buffer appearing in Buffer Selection Menu."
 (defun bs--get-mode-name (start-buffer all-buffers)
   "Return the name of mode of current buffer for Buffer Selection Menu.
 START-BUFFER is the buffer where we started buffer selection.
-ALL-BUFFERS is the list of buffer appearing in Buffer Selection Menu."
+ALL-BUFFERS is the list of buffers appearing in Buffer Selection Menu."
   mode-name)
 
 (defun bs--get-file-name (start-buffer all-buffers)
@@ -1336,7 +1338,7 @@ This is the variable `buffer-file-name' of current buffer.
 If current mode is `dired-mode' or `shell-mode' it returns the
 default directory.
 START-BUFFER is the buffer where we started buffer selection.
-ALL-BUFFERS is the list of buffer appearing in Buffer Selection Menu."
+ALL-BUFFERS is the list of buffers appearing in Buffer Selection Menu."
   (propertize (if (member major-mode '(shell-mode dired-mode))
                   default-directory
                 (or buffer-file-name ""))
@@ -1372,7 +1374,7 @@ normally *buffer-selection*."
     string))
 
 (defun bs--format-aux (string align len)
-  "Generate a string with STRING with alignment ALIGN and length LEN.
+  "Pad STRING to length LEN with alignment ALIGN.
 ALIGN is one of the symbols `left', `middle', or `right'."
   (let* ((width (length string))
          (len (max len width)))
@@ -1383,9 +1385,8 @@ ALIGN is one of the symbols `left', `middle', or `right'."
 
 (defun bs--show-header ()
   "Insert header for Buffer Selection Menu in current buffer."
-  (mapcar '(lambda (string)
-            (insert string "\n"))
-         (bs--create-header)))
+  (dolist (string (bs--create-header))
+    (insert string "\n")))
 
 (defun bs--get-name-length ()
   "Return value of `bs--name-entry-length'."
@@ -1471,7 +1472,7 @@ Otherwise return `bs-alternative-configuration'."
   "Make a menu of buffers so you can manipulate buffers or the buffer list.
 \\<bs-mode-map>
 There are many key commands similar to `Buffer-menu-mode' for
-manipulating buffer list and buffers itself.
+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.
index 3afe930204225a6cb5c7b3f11808f3abe7b3e630..85180a923563ba5ec30647b195441c6104e07361 100644 (file)
@@ -470,5 +470,5 @@ Returns the button found."
 
 (provide 'button)
 
-;;; arch-tag: 5f2c7627-413b-4097-b282-630f89d9c5e9
+;; arch-tag: 5f2c7627-413b-4097-b282-630f89d9c5e9
 ;;; button.el ends here
index 6f3c2a0e5937c0cc2beb93bda8fe54cdf4d8e482..2676bedadba5403bd99b0a098f69f0c90c50a46a 100644 (file)
@@ -5,7 +5,7 @@
 
 ;; Author: Eli Barzilay <eli@barzilay.org>
 ;; Keywords: tools, convenience
-;; Time-stamp: <2006-02-06 13:36:00 ttn>
+;; Time-stamp: <2007-08-31 03:00:11 ttn>
 
 ;; This file is part of GNU Emacs.
 
@@ -47,6 +47,7 @@
 ;;; History:
 ;; I hate history.
 
+(eval-when-compile (require 'cl))
 (eval-and-compile
   (if (fboundp 'defgroup) nil
     (defmacro defgroup (&rest forms) nil)
index e8a6a139db5ac6e0f36ad996bffda8437b951bca..d08b20134264d1c6f1342c665603838bdf4f3642 100644 (file)
@@ -643,9 +643,15 @@ Entry to this mode runs the hooks on `comint-mode-hook'."
   (make-local-variable 'comint-move-point-for-output)
   (make-local-variable 'comint-scroll-show-maximum-output)
   (make-local-variable 'comint-stored-incomplete-input)
+  ;; Following disabled because it seems to break the case when
+  ;; comint-scroll-show-maximum-output is nil, and no-one can remember
+  ;; what the original problem was.  If there are problems with point
+  ;; not going to the end, consider re-enabling this.
+  ;; http://lists.gnu.org/archive/html/emacs-devel/2007-08/msg00827.html
+  ;;
   ;; This makes it really work to keep point at the bottom.
-  (make-local-variable 'scroll-conservatively)
-  (setq scroll-conservatively 10000)
+;;;  (make-local-variable 'scroll-conservatively)
+;;;  (setq scroll-conservatively 10000)
   (add-hook 'pre-command-hook 'comint-preinput-scroll-to-bottom t t)
   (make-local-variable 'comint-ptyp)
   (make-local-variable 'comint-process-echoes)
index 01db126c5f8baa347d05b65eb49e1d6f5fbd765c..bc581052508e196c0b9c1699f5412e5e5f2f7398 100644 (file)
@@ -596,9 +596,10 @@ GOTO-END is non-nil, however, it instead replaces up to END."
           (setq poss (all-completions (if env-on basestr str)
                                      table
                                      pred))
-          (unless poss
+          (unless (or poss (string-equal str ""))
             ;; Try completion as an abbreviation, e.g. "mvb" ->
-            ;; "m-v-b" -> "multiple-value-bind"
+            ;; "m-v-b" -> "multiple-value-bind", but only for
+            ;; non-empty strings.
             (setq origstr str
                   abbreviated t)
             (if filename
index b8bf5bd93b8d785098597a866984b3b97c4ac2bc..c2e9ac9493f74bde012d483949d4e700ca0e9700 100644 (file)
@@ -2231,15 +2231,19 @@ Patched to remove the most recent completion."
 
 (defun completion-separator-self-insert-command (arg)
   (interactive "p")
-  (use-completion-before-separator)
-  (self-insert-command arg))
+  (if (command-remapping 'self-insert-command)
+      (funcall (command-remapping 'self-insert-command) arg)
+    (use-completion-before-separator)
+    (self-insert-command arg)))
 
 (defun completion-separator-self-insert-autofilling (arg)
   (interactive "p")
-  (use-completion-before-separator)
-  (self-insert-command arg)
-  (and auto-fill-function
-       (funcall auto-fill-function)))
+  (if (command-remapping 'self-insert-command)
+      (funcall (command-remapping 'self-insert-command) arg)
+    (use-completion-before-separator)
+    (self-insert-command arg)
+    (and auto-fill-function
+        (funcall auto-fill-function))))
 
 ;;-----------------------------------------------
 ;; Wrapping Macro
index 869533b3c3efdfc65c48c6654570fc0140609a59..8f7ad22dce6cdde3aeb61630fd07133ac3c4e5d3 100644 (file)
@@ -1550,7 +1550,8 @@ possibly because you started Emacs with `-q'.")
     ;; Insert custom command buttons if the toolbar is not in use.
 
     (widget-insert "\n")
-    (when (not (and tool-bar-mode (display-graphic-p)))
+    ;; tool-bar is not dumped in builds without x.
+    (when (not (and (bound-and-true-p tool-bar-mode) (display-graphic-p)))
       (if custom-buffer-verbose-help
          (widget-insert "\n
  Operate on all settings in this buffer that are not marked HIDDEN:\n"))
@@ -3010,7 +3011,7 @@ Also change :reverse-video to :inverse-video."
                    (cons value (cons from (- (point) from))))))))
 
 (defun custom-face-edit-activate (widget)
-  "Make face widget WIDGET inactive for user modifications."
+  "Make face widget WIDGET active for user modifications."
   (let ((inactive (widget-get widget :inactive))
        (inhibit-read-only t)
        (inhibit-modification-hooks t))
index be88b499fef4e300135c51ff0a9529d7966e9fd1..92274dcbe2128b25acd1d78bf7a2e5b417fda894 100644 (file)
     (when (fboundp 'facep)
       (unless (facep face)
        ;; If the user has already created the face, respect that.
-       (let ((value (or (get face 'saved-face) spec)))
+       (let ((value (or (get face 'saved-face) spec))
+             (have-window-system (memq initial-window-system '(x w32))))
          ;; Create global face.
          (make-empty-face face)
          ;; Create frame-local faces
          (dolist (frame (frame-list))
-           (face-spec-set face value frame)))
-       ;; When making a face after frames already exist
-       (if (memq window-system '(x w32 mac))
-           (make-face-x-resource-internal face))))
+           (face-spec-set face value frame)
+           (when (memq (window-system frame) '(x w32 mac))
+             (setq have-window-system t)))
+         ;; When making a face after frames already exist
+         (if have-window-system
+             (make-face-x-resource-internal face)))))
     ;; Don't record SPEC until we see it causes no errors.
     (put face 'face-defface-spec spec)
     (push (cons 'defface face) current-load-list)
@@ -339,16 +342,16 @@ FACE's list property `theme-face' \(using `custom-push-theme')."
                (unless (facep face)
                  (make-empty-face face))
                (put face 'face-comment comment)
-               (face-spec-set face spec))
-           (setq args (cdr args)))
-       ;; Old format, a plist of FACE SPEC pairs.
-       (let ((face (nth 0 args))
-             (spec (nth 1 args)))
-         (if (get face 'face-alias)
-                 (setq face (get face 'face-alias)))
-         (put face 'saved-face spec)
-         (custom-push-theme 'theme-face face theme 'set spec))
-       (setq args (cdr (cdr args))))))))
+               (face-spec-set face spec nil))
+             (setq args (cdr args)))
+         ;; Old format, a plist of FACE SPEC pairs.
+         (let ((face (nth 0 args))
+               (spec (nth 1 args)))
+           (if (get face 'face-alias)
+               (setq face (get face 'face-alias)))
+           (put face 'saved-face spec)
+           (custom-push-theme 'theme-face face theme 'set spec))
+         (setq args (cdr (cdr args))))))))
 
 ;; XEmacs compability function.  In XEmacs, when you reset a Custom
 ;; Theme, you have to specify the theme to reset it to.  We just apply
index 8f5c4e13489d05f9ab9981c9926954d08e679f1a..ee6491a1a79ad3232fe9da27edf14ac29ceba7e3 100644 (file)
@@ -173,6 +173,7 @@ Leaving \"Default\" unchecked is equivalent with specifying a default of
             ;; fns.c
             (use-dialog-box menu boolean "21.1")
             (use-file-dialog menu boolean "22.1")
+            (focus-follows-mouse frames boolean "20.3")
             ;; frame.c
             (default-frame-alist frames
               (repeat (cons :format "%v"
@@ -345,6 +346,15 @@ since it could result in memory overflow and make Emacs crash."
             (even-window-heights windows boolean)
             (next-screen-context-lines windows integer)
             (split-height-threshold windows integer)
+             (split-window-preferred-function
+              windows
+              (choice (const :tag "vertically" split-window)
+                      ;; FIXME: Add `sensibly' which chooses between
+                      ;; vertical or horizontal splits depending on the size
+                      ;; and shape of the window.
+                      (const :tag "horizontally"
+                             (lambda (window)
+                               (split-window window nil 'horiz)))))
             (window-min-height windows integer)
             (window-min-width windows integer)
             (scroll-preserve-screen-position
@@ -425,14 +435,10 @@ since it could result in memory overflow and make Emacs crash."
                       (eq system-type 'ms-dos))
                      ((string-match "\\`w32-" (symbol-name symbol))
                       (eq system-type 'windows-nt))
-                     ((string-match "\\`mac-" (symbol-name symbol))
-                      (eq window-system 'mac))
+                     ((string-match "\\`mac-" (symbol-name symbol))
+                      (or (eq system-type 'mac) (eq system-type 'darwin)))
                      ((string-match "\\`x-.*gtk" (symbol-name symbol))
-                      (or (boundp 'gtk)
-                          (and window-system
-                               (not (eq window-system 'pc))
-                               (not (eq window-system 'mac))
-                               (not (eq system-type 'windows-nt)))))
+                      (featurep 'gtk))
                      ((string-match "\\`x-" (symbol-name symbol))
                       (fboundp 'x-create-frame))
                      ((string-match "selection" (symbol-name symbol))
@@ -471,5 +477,5 @@ since it could result in memory overflow and make Emacs crash."
 (unless purify-flag
   (provide 'cus-start))
 
-;;; arch-tag: 4502730d-bcb3-4f5e-99a3-a86f2d54af60
+;; arch-tag: 4502730d-bcb3-4f5e-99a3-a86f2d54af60
 ;;; cus-start.el ends here
index b4ae7965a3f660bc92aa9b2f8fc630c945541b99..82593985650735403041846c399f4561211fcf0f 100644 (file)
@@ -93,6 +93,7 @@ any selection."
                 ;; That would make yank a no-op.
                 (when (and (string= (buffer-substring-no-properties (point) (mark))
                                     (car kill-ring))
+                           (fboundp 'mouse-region-match)
                            (mouse-region-match))
                   (current-kill 1))
                 (delete-active-region))
index 68f7995a494469cdc8e5be4f274473e458cbd593..609c5ef64904bc50ebd2b6318a99198c5e6d4fc0 100644 (file)
@@ -48,8 +48,6 @@
 ;;   Or maybe just make it into a ".rej to diff3-markers converter".
 ;;   Maybe just use `wiggle' (by Neil Brown) to do it for us.
 ;;
-;; - Refine hunk on a word-by-word basis.
-;; 
 ;; - in diff-apply-hunk, strip context in replace-match to better
 ;;   preserve markers and spacing.
 ;; - Handle `diff -b' output in context->unified.
@@ -112,6 +110,8 @@ when editing big diffs)."
     ("N" . diff-file-next)
     ("p" . diff-hunk-prev)
     ("P" . diff-file-prev)
+    ("\t" . diff-hunk-next)
+    ([backtab] . diff-hunk-prev)
     ("k" . diff-hunk-kill)
     ("K" . diff-file-kill)
     ;; From compilation-minor-mode.
@@ -156,6 +156,7 @@ when editing big diffs)."
     ;; `d' because it duplicates the context :-(  --Stef
     ("\C-c\C-d" . diff-unified->context)
     ("\C-c\C-w" . diff-refine-ignore-spaces-hunk)
+    ("\C-c\C-b" . diff-fine-highlight)  ;No reason for `b' :-(
     ("\C-c\C-f" . next-error-follow-minor-mode))
   "Keymap for `diff-mode'.  See also `diff-mode-shared-map'.")
 
@@ -173,7 +174,8 @@ when editing big diffs)."
     ;;["Fixup Headers"         diff-fixup-modifs       (not buffer-read-only)]
     "-----"
     ["Split hunk"              diff-split-hunk         (diff-splittable-p)]
-    ["Refine hunk"             diff-refine-ignore-spaces-hunk t]
+    ["Ignore whitespace changes" diff-refine-ignore-spaces-hunk t]
+    ["Highlight fine changes"  diff-fine-highlight     t]
     ["Kill current hunk"       diff-hunk-kill          t]
     ["Kill current file's hunks" diff-file-kill        t]
     "-----"
@@ -386,12 +388,15 @@ when editing big diffs)."
 (defconst diff-file-header-re (concat "^\\(--- .+\n\\+\\+\\+ \\|\\*\\*\\* .+\n--- \\|[^-+!<>0-9@* ]\\).+\n" (substring diff-hunk-header-re 1)))
 (defvar diff-narrowed-to nil)
 
-(defun diff-end-of-hunk (&optional style)
+(defun diff-hunk-style (&optional style)
   (when (looking-at diff-hunk-header-re)
-    (unless style
-      ;; Especially important for unified (because headers are ambiguous).
-      (setq style (cdr (assq (char-after) '((?@ . unified) (?* . context))))))
+    (setq style (cdr (assq (char-after) '((?@ . unified) (?* . context)))))
     (goto-char (match-end 0)))
+  style)
+
+(defun diff-end-of-hunk (&optional style)
+  ;; Especially important for unified (because headers are ambiguous).
+  (setq style (diff-hunk-style style))
   (let ((end (and (re-search-forward (case style
                                       ;; A `unified' header is ambiguous.
                                       (unified (concat "^[^-+# \\]\\|"
@@ -843,68 +848,89 @@ With a prefix argument, convert unified format to context format."
       (diff-unified->context start end)
     (unless (markerp end) (setq end (copy-marker end t)))
     (let ( ;;(diff-inhibit-after-change t)
-         (inhibit-read-only t))
+          (inhibit-read-only t))
       (save-excursion
-       (goto-char start)
-       (while (and (re-search-forward "^\\(\\(\\*\\*\\*\\) .+\n\\(---\\) .+\\|\\*\\{15\\}.*\n\\*\\*\\* \\([0-9]+\\),\\(-?[0-9]+\\) \\*\\*\\*\\*\\)$" nil t)
-                   (< (point) end))
-         (combine-after-change-calls
-           (if (match-beginning 2)
-               ;; we matched a file header
-               (progn
-                 ;; use reverse order to make sure the indices are kept valid
-                 (replace-match "+++" t t nil 3)
-                 (replace-match "---" t t nil 2))
-             ;; we matched a hunk header
-             (let ((line1s (match-string 4))
-                   (line1e (match-string 5))
-                   (pt1 (match-beginning 0)))
-               (replace-match "")
-               (unless (re-search-forward
-                        "^--- \\([0-9]+\\),\\(-?[0-9]+\\) ----$" nil t)
-                 (error "Can't find matching `--- n1,n2 ----' line"))
-               (let ((line2s (match-string 1))
-                     (line2e (match-string 2))
-                     (pt2 (progn
-                            (delete-region (progn (beginning-of-line) (point))
-                                           (progn (forward-line 1) (point)))
-                            (point-marker))))
-                 (goto-char pt1)
-                 (forward-line 1)
-                 (while (< (point) pt2)
-                   (case (char-after)
-                     ((?! ?-) (delete-char 2) (insert "-") (forward-line 1))
-                     (?\s     ;merge with the other half of the chunk
-                      (let* ((endline2
-                              (save-excursion
-                                (goto-char pt2) (forward-line 1) (point)))
-                             (c (char-after pt2)))
-                        (case c
-                          ((?! ?+)
-                           (insert "+"
-                                   (prog1 (buffer-substring (+ pt2 2) endline2)
-                                     (delete-region pt2 endline2))))
-                          (?\s         ;FIXME: check consistency
-                           (delete-region pt2 endline2)
-                           (delete-char 1)
-                           (forward-line 1))
-                          (?\\ (forward-line 1))
-                          (t (delete-char 1) (forward-line 1)))))
-                     (t (forward-line 1))))
-                 (while (looking-at "[+! ] ")
-                   (if (/= (char-after) ?!) (forward-char 1)
-                     (delete-char 1) (insert "+"))
-                   (delete-char 1) (forward-line 1))
-                 (save-excursion
-                   (goto-char pt1)
-                   (insert "@@ -" line1s ","
-                           (number-to-string (- (string-to-number line1e)
-                                                (string-to-number line1s)
-                                                -1))
-                           " +" line2s ","
-                           (number-to-string (- (string-to-number line2e)
-                                                (string-to-number line2s)
-                                                -1)) " @@")))))))))))
+        (goto-char start)
+        (while (and (re-search-forward "^\\(\\(\\*\\*\\*\\) .+\n\\(---\\) .+\\|\\*\\{15\\}.*\n\\*\\*\\* \\([0-9]+\\),\\(-?[0-9]+\\) \\*\\*\\*\\*\\)$" nil t)
+                    (< (point) end))
+          (combine-after-change-calls
+            (if (match-beginning 2)
+                ;; we matched a file header
+                (progn
+                  ;; use reverse order to make sure the indices are kept valid
+                  (replace-match "+++" t t nil 3)
+                  (replace-match "---" t t nil 2))
+              ;; we matched a hunk header
+              (let ((line1s (match-string 4))
+                    (line1e (match-string 5))
+                    (pt1 (match-beginning 0))
+                    ;; Variables to use the special undo function.
+                    (old-undo buffer-undo-list)
+                    (old-end (marker-position end))
+                    (reversible t))
+                (replace-match "")
+                (unless (re-search-forward
+                         "^--- \\([0-9]+\\),\\(-?[0-9]+\\) ----$" nil t)
+                  (error "Can't find matching `--- n1,n2 ----' line"))
+                (let ((line2s (match-string 1))
+                      (line2e (match-string 2))
+                      (pt2 (progn
+                             (delete-region (progn (beginning-of-line) (point))
+                                            (progn (forward-line 1) (point)))
+                             (point-marker))))
+                  (goto-char pt1)
+                  (forward-line 1)
+                  (while (< (point) pt2)
+                    (case (char-after)
+                      (?! (delete-char 2) (insert "-") (forward-line 1))
+                      (?- (forward-char 1) (delete-char 1) (forward-line 1))
+                      (?\s           ;merge with the other half of the chunk
+                       (let* ((endline2
+                               (save-excursion
+                                 (goto-char pt2) (forward-line 1) (point))))
+                         (case (char-after pt2)
+                           ((?! ?+)
+                            (insert "+"
+                                    (prog1 (buffer-substring (+ pt2 2) endline2)
+                                      (delete-region pt2 endline2))))
+                           (?\s
+                            (unless (= (- endline2 pt2)
+                                       (- (line-beginning-position 2) (point)))
+                              ;; If the two lines we're merging don't have the
+                              ;; same length (can happen with "diff -b"), then
+                              ;; diff-unified->context will not properly undo
+                              ;; this operation.
+                              (setq reversible nil))
+                            (delete-region pt2 endline2)
+                            (delete-char 1)
+                            (forward-line 1))
+                           (?\\ (forward-line 1))
+                           (t (setq reversible nil)
+                              (delete-char 1) (forward-line 1)))))
+                      (t (setq reversible nil) (forward-line 1))))
+                  (while (looking-at "[+! ] ")
+                    (if (/= (char-after) ?!) (forward-char 1)
+                      (delete-char 1) (insert "+"))
+                    (delete-char 1) (forward-line 1))
+                  (save-excursion
+                    (goto-char pt1)
+                    (insert "@@ -" line1s ","
+                            (number-to-string (- (string-to-number line1e)
+                                                 (string-to-number line1s)
+                                                 -1))
+                            " +" line2s ","
+                            (number-to-string (- (string-to-number line2e)
+                                                 (string-to-number line2s)
+                                                 -1)) " @@"))
+                  (set-marker pt2 nil)
+                  ;; The whole procedure succeeded, let's replace the myriad
+                  ;; of undo elements with just a single special one.
+                  (unless (or (not reversible) (eq buffer-undo-list t))
+                    (setq buffer-undo-list
+                          (cons (list 'apply (- old-end end) pt1 (point)
+                                      'diff-unified->context pt1 (point))
+                                old-undo)))
+                  )))))))))
 
 (defun diff-reverse-direction (start end)
   "Reverse the direction of the diffs.
@@ -1217,31 +1243,44 @@ Only works for unified diffs."
 
        ;; A context diff.
        ((eq (char-after) ?*)
-        (if (not (looking-at "\\*\\{15\\}\\(?: .*\\)?\n\\*\\*\\* \\([0-9]+\\),\\([0-9]+\\) \\*\\*\\*\\*"))
+        (if (not (looking-at "\\*\\{15\\}\\(?: .*\\)?\n\\*\\*\\* \\([0-9]+\\)\\(?:,\\([0-9]+\\)\\)? \\*\\*\\*\\*"))
             (error "Unrecognized context diff first hunk header format")
           (forward-line 2)
           (diff-sanity-check-context-hunk-half
-           (1+ (- (string-to-number (match-string 2))
-                  (string-to-number (match-string 1)))))
-          (if (not (looking-at "--- \\([0-9]+\\),\\([0-9]+\\) ----$"))
+          (if (match-string 2)
+              (1+ (- (string-to-number (match-string 2))
+                     (string-to-number (match-string 1))))
+            1))
+          (if (not (looking-at "--- \\([0-9]+\\)\\(?:,\\([0-9]+\\)\\)? ----$"))
               (error "Unrecognized context diff second hunk header format")
             (forward-line)
             (diff-sanity-check-context-hunk-half
-             (1+ (- (string-to-number (match-string 2))
-                    (string-to-number (match-string 1))))))))
+            (if (match-string 2)
+                (1+ (- (string-to-number (match-string 2))
+                       (string-to-number (match-string 1))))
+              1)))))
 
        ;; A unified diff.
        ((eq (char-after) ?@)
         (if (not (looking-at
-                  "@@ -[0-9]+,\\([0-9]+\\) \\+[0-9]+,\\([0-9]+\\) @@"))
+                  "@@ -[0-9]+\\(?:,\\([0-9]+\\)\\)? \\+[0-9]+\\(?:,\\([0-9]+\\)\\)? @@"))
             (error "Unrecognized unified diff hunk header format")
-          (let ((before (string-to-number (match-string 1)))
-                (after (string-to-number (match-string 2))))
+          (let ((before (if (match-string 1) (string-to-number (match-string 1)) 1))
+                (after (if (match-string 2) (string-to-number (match-string 2)) 1)))
             (forward-line)
             (while
                 (case (char-after)
                   (?\s (decf before) (decf after) t)
-                  (?- (decf before) t)
+                  (?-
+                   (if (and (looking-at diff-file-header-re)
+                            (zerop before) (zerop after))
+                       ;; No need to query: this is a case where two patches
+                       ;; are concatenated and only counting the lines will
+                       ;; give the right result.  Let's just add an empty
+                       ;; line so that our code which doesn't count lines
+                       ;; will not get confused.
+                       (progn (save-excursion (insert "\n")) nil)
+                     (decf before) t))
                   (?+ (decf after) t)
                   (t
                    (cond
@@ -1606,6 +1645,63 @@ For use in `add-log-current-defun-function'."
       (delete-file file1)
       (delete-file file2))))
 
+;;; Fine change highlighting.
+
+(defface diff-fine-change
+  '((t :background "yellow"))
+  "Face used for char-based changes shown by `diff-fine-highlight'.")
+
+(defun diff-fine-highlight-preproc ()
+  (while (re-search-forward "^." nil t)
+    ;; Replace the hunk's leading prefix (+, -, !, <, or >) on each line
+    ;; with something  constant, otherwise it'll be flagged as changes
+    ;; (since it's typically "-" on one side and "+" on the other).
+    ;; Note that we keep the same number of chars: we treat the prefix
+    ;; as part of the texts-to-diff, so that finding the right char
+    ;; afterwards will be easier.  This only makes sense because we make
+    ;; diffs at char-granularity.
+    (replace-match " ")))
+
+(defun diff-fine-highlight ()
+  "Highlight changes of hunk at point at a finer granularity."
+  (interactive)
+  (require 'smerge-mode)
+  (diff-beginning-of-hunk 'try-harder)
+  (let* ((style (diff-hunk-style))      ;Skips the hunk header as well.
+         (beg (point))
+         (props '((diff-mode . fine) (face diff-fine-change)))
+         (end (progn (diff-end-of-hunk) (point))))
+
+    (remove-overlays beg end 'diff-mode 'fine)
+
+    (goto-char beg)
+    (case style
+     (unified
+      (while (re-search-forward "^\\(?:-.*\n\\)+\\(\\)\\(?:\\+.*\n\\)+" end t)
+        (smerge-refine-subst (match-beginning 0) (match-end 1)
+                             (match-end 1) (match-end 0)
+                             props 'diff-fine-highlight-preproc)))
+     (context
+      (let* ((middle (save-excursion (re-search-forward "^---")))
+             (other middle))
+        (while (re-search-forward "^\\(?:!.*\n\\)+" middle t)
+          (smerge-refine-subst (match-beginning 0) (match-end 0)
+                               (save-excursion
+                                 (goto-char other)
+                                 (re-search-forward "^\\(?:!.*\n\\)+" end)
+                                 (setq other (match-end 0))
+                                 (match-beginning 0))
+                               other
+                               props 'diff-fine-highlight-preproc))))
+     (t ;; Normal diffs.
+      (let ((beg1 (1+ (point))))
+        (when (re-search-forward "^---.*\n" end t)
+          ;; It's a combined add&remove, so there's something to do.
+          (smerge-refine-subst beg1 (match-beginning 0)
+                               (match-end 0) end
+                               props 'diff-fine-highlight-preproc)))))))
+
+
 ;; provide the package
 (provide 'diff-mode)
 
index 124c53b44c5aa9f7bee1cce2f93ed9c39e010df1..e0749f375aea382862ee80e8b3f7b536bb99cc65 100644 (file)
@@ -253,9 +253,20 @@ List has a form of (file-name full-file-name (attribute-list))"
 ;;;###autoload
 (defun dired-do-chmod (&optional arg)
   "Change the mode of the marked (or next ARG) files.
-This calls chmod, thus symbolic modes like `g+w' are allowed."
+Symbolic modes like `g+w' are allowed."
   (interactive "P")
-  (dired-do-chxxx "Mode" dired-chmod-program 'chmod arg))
+  (let* ((files (dired-get-marked-files t arg))
+        (modes (dired-mark-read-string
+                "Change mode of %s to: " nil
+                'chmod arg files))
+        (num-modes (if (string-match "^[0-7]+" modes)
+                       (string-to-number modes 8))))
+    (dolist (file files)
+      (set-file-modes
+       file
+       (if num-modes num-modes
+        (file-modes-symbolic-to-number modes (file-modes file)))))
+    (dired-do-redisplay arg)))
 
 ;;;###autoload
 (defun dired-do-chgrp (&optional arg)
@@ -1319,7 +1330,7 @@ Special value `always' suppresses confirmation."
        skipped (success-count 0) (total (length fn-list)))
     (let (to overwrite-query
             overwrite-backup-query)    ; for dired-handle-overwrite
-      (mapcar
+      (mapc
        (function
        (lambda (from)
          (setq to (funcall name-constructor from))
index d263f0b3044d0a5bee3b85879bc0dbfe4174d671..74e6876fd2889e4e28c0bc70082fa7c9263c9947 100644 (file)
@@ -335,7 +335,9 @@ Subexpression 2 must end right before the \\n or \\r.")
   "Face name used for flagged files.")
 
 (defface dired-warning
-  '((t (:inherit font-lock-comment-face)))
+  ;; Inherit from font-lock-warning-face since with min-colors 8
+  ;; font-lock-comment-face is not colored any more.
+  '((t (:inherit font-lock-warning-face)))
   "Face used to highlight a part of a buffer that needs user attention."
   :group 'dired-faces
   :version "22.1")
@@ -3336,7 +3338,7 @@ Ask means pop up a menu for the user to select one of copy, move or link."
           (dired dired-dir)
           ;; The following elements of `desktop-buffer-misc' are the keys
           ;; from `dired-subdir-alist'.
-          (mapcar 'dired-maybe-insert-subdir (cdr desktop-buffer-misc))
+          (mapc 'dired-maybe-insert-subdir (cdr desktop-buffer-misc))
           (current-buffer))
       (message "Desktop: Directory %s no longer exists." dir)
       (when desktop-missing-file-warning (sit-for 1))
diff --git a/lisp/doc-view.el b/lisp/doc-view.el
new file mode 100644 (file)
index 0000000..d7d2bb4
--- /dev/null
@@ -0,0 +1,766 @@
+;;; doc-view.el --- View PDF/PostScript/DVI files in Emacs
+
+;; Copyright (C) 2007 Free Software Foundation, Inc.
+;;
+;; Author: Tassilo Horn <tassilo@member.fsf.org>
+;; Maintainer: Tassilo Horn <tassilo@member.fsf.org>
+;; Keywords: files, pdf, ps, dvi
+;; Version: <2007-10-02 Tue 18:21>
+
+;; 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, 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; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Requirements:
+
+;; doc-view.el requires GNU Emacs 22.1 or newer.  You also need GhostScript,
+;; `dvipdfm' which comes with TeTeX and `pdftotext', which comes with poppler
+;; (http://poppler.freedesktop.org/).
+
+;;; Commentary:
+
+;; DocView is a document viewer for Emacs.  It converts PDF, PS and DVI files
+;; to a set of PNG files, one PNG for each page, and displays the PNG images
+;; inside an Emacs buffer.  This buffer uses `doc-view-mode' which provides
+;; convenient key bindings for browsing the document.
+;;
+;; To use it simply do
+;;
+;;     M-x doc-view RET
+;;
+;; and you'll be queried for a document to open.
+;;
+;; Since conversion may take some time all the PNG images are cached in a
+;; subdirectory of `doc-view-cache-directory' and reused when you want to view
+;; that file again.  This reusing can be omitted if you provide a prefx
+;; argument to `doc-view'.  To delete all cached files use
+;; `doc-view-clear-cache'.  To open the cache with dired, so that you can tidy
+;; it out use `doc-view-dired-cache'.
+;;
+;; When conversion in underway the first page will be displayed as soon as it
+;; is available and the available pages are refreshed every
+;; `doc-view-conversion-refresh-interval' seconds.  If that variable is nil the
+;; pages won't be displayed before conversion of the document finished
+;; completely.
+;;
+;; DocView lets you select a slice of the displayed pages.  This slice will be
+;; remembered and applied to all pages of the current document.  This enables
+;; you to cut away the margins of a document to save some space.  To select a
+;; slice you can use `doc-view-set-slice' (bound to `s s') which will query you
+;; for the coordinates of the slice's top-left corner and its width and height.
+;; A much more convenient way to do the same is offered by the command
+;; `doc-view-set-slice-using-mouse' (bound to `s m').  After invokation you
+;; only have to press mouse-1 at the top-left corner and drag it to the
+;; bottom-right corner of the desired slice.  To reset the slice use
+;; `doc-view-reset-slice' (bound to `s r').
+;;
+;; Dired users should have a look at `doc-view-dired'.
+;;
+;; You can also search within the document.  The command `doc-view-search'
+;; (bound to `C-s') queries for a search regexp and initializes a list of all
+;; matching pages and messages how many match-pages were found.  After that you
+;; can jump to the next page containing a match with
+;; `doc-view-search-next-match' (bound to `C-S-n') or to the previous matching
+;; page with `doc-view-search-previous-match' (bound to `C-S-p').  This works
+;; by searching a plain text representation of the document.  If that doesn't
+;; already exist the first invokation of `doc-view-search' starts the
+;; conversion.  When that finishes and you're still viewing the document
+;; (i.e. you didn't switch to another buffer) you're queried for the regexp
+;; then.
+
+;;; Configuration:
+
+;; Basically doc-view should be quite usable with its standard settings, so
+;; putting
+;;
+;;     (require 'doc-view)
+;;
+;; into your `user-init-file' should be enough.  If the images are too small or
+;; too big you should set the "-rXXX" option in `doc-view-ghostscript-options'
+;; to another value.  (The bigger your screen, the higher the value.)
+;;
+;; This and all other options can be set with the customization interface.
+;; Simply do
+;;
+;;     M-x customize-group RET doc-view RET
+;;
+;; and modify them to your needs.
+
+;;; Code:
+
+(require 'dired)
+(eval-when-compile (require 'cl))
+
+;;;; Customization Options
+
+(defgroup doc-view nil
+  "In-buffer viewer for PDF, PostScript and DVI files."
+  :link '(function-link doc-view)
+  :version "22.2"
+  :group 'applications
+  :group 'multimedia
+  :prefix "doc-view-")
+
+(defcustom doc-view-ghostscript-program "gs"
+  "Program to convert PS and PDF files to PNG."
+  :type '(file)
+  :group 'doc-view)
+
+(defcustom doc-view-ghostscript-options
+  '("-dNOPAUSE" "-sDEVICE=png16m" "-dTextAlphaBits=4"
+    "-dBATCH" "-dGraphicsAlphaBits=4" "-dQUIET"
+    "-r100")
+  "A list of options to give to ghostview."
+  :type '(sexp)
+  :group 'doc-view)
+
+(defcustom doc-view-dvipdfm-program "dvipdfm"
+  "Program to convert DVI files to PDF.
+
+DVI file will be converted to PDF before the resulting PDF is
+converted to PNG."
+  :type '(file)
+  :group 'doc-view)
+
+(defcustom doc-view-ps2pdf-program "ps2pdf"
+  "Program to convert PS files to PDF.
+
+PS files will be converted to PDF before searching is possible."
+  :type '(file)
+  :group 'doc-view)
+
+(defcustom doc-view-pdftotext-program "pdftotext"
+  "Program to convert PDF files to plain text.
+
+Needed for searching."
+  :type '(file)
+  :group 'doc-view)
+
+(defcustom doc-view-cache-directory (concat temporary-file-directory
+                                           "doc-view")
+  "The base directory, where the PNG images will be saved."
+  :type '(directory)
+  :group 'doc-view)
+
+(defcustom doc-view-conversion-buffer "*doc-view conversion output*"
+  "The buffer where messages from the converter programs go to."
+  :type '(string)
+  :group 'doc-view)
+
+(defcustom doc-view-conversion-refresh-interval 3
+  "Every how much seconds the DocView buffer gets refreshed while conversion.
+After such an refresh newly converted pages will be available for
+viewing.  If set to nil there won't be any refreshes and the
+pages won't be displayed before conversion of the whole document
+has finished."
+  :type '(string)
+  :group 'doc-view)
+
+;;;; Internal Variables
+
+(defvar doc-view-current-files nil
+  "Only used internally.")
+
+(defvar doc-view-current-page nil
+  "Only used internally.")
+
+(defvar doc-view-current-doc nil
+  "Only used internally.")
+
+(defvar doc-view-current-converter-process nil
+  "Only used internally.")
+
+(defvar doc-view-current-timer nil
+  "Only used internally.")
+
+(defvar doc-view-current-slice nil
+  "Only used internally.")
+
+(defvar doc-view-current-cache-dir nil
+  "Only used internally.")
+
+(defvar doc-view-current-search-matches nil
+  "Only used internally.")
+
+(defvar doc-view-current-image nil
+  "Only used internally.")
+
+(defvar doc-view-current-info nil
+  "Only used internally.")
+
+;;;; DocView Keymap
+
+(defvar doc-view-mode-map
+  (let ((map (make-sparse-keymap)))
+    ;; Navigation in the document
+    (define-key map (kbd "n")         'doc-view-next-page)
+    (define-key map (kbd "p")         'doc-view-previous-page)
+    (define-key map (kbd "<next>")    'doc-view-next-page)
+    (define-key map (kbd "<prior>")   'doc-view-previous-page)
+    (define-key map (kbd "SPC")       'doc-view-scroll-up-or-next-page)
+    (define-key map (kbd "DEL")       'doc-view-scroll-down-or-previous-page)
+    (define-key map (kbd "M-<")       'doc-view-first-page)
+    (define-key map (kbd "M->")       'doc-view-last-page)
+    (define-key map (kbd "g")         'doc-view-goto-page)
+    ;; Killing/burying the buffer (and the process)
+    (define-key map (kbd "q")         'bury-buffer)
+    (define-key map (kbd "k")         'doc-view-kill-proc-and-buffer)
+    (define-key map (kbd "C-x k")     'doc-view-kill-proc-and-buffer)
+    ;; Slicing the image
+    (define-key map (kbd "s s")       'doc-view-set-slice)
+    (define-key map (kbd "s m")       'doc-view-set-slice-using-mouse)
+    (define-key map (kbd "s r")       'doc-view-reset-slice)
+    ;; Searching
+    (define-key map (kbd "C-s")       'doc-view-search)
+    (define-key map (kbd "<find>")    'doc-view-search)
+    (define-key map (kbd "C-S-n")     'doc-view-search-next-match)
+    (define-key map (kbd "C-S-p")     'doc-view-search-previous-match)
+    ;; Scrolling
+    (define-key map (kbd "C-v")       'scroll-up)
+    (define-key map (kbd "<mouse-4>") 'mwheel-scroll)
+    (define-key map (kbd "<mouse-5>") 'mwheel-scroll)
+    (define-key map (kbd "M-v")       'scroll-down)
+    ;; Show the tooltip
+    (define-key map (kbd "C-t")       'doc-view-show-tooltip)
+    (suppress-keymap map)
+    map)
+  "Keymap used by `doc-view-mode'.")
+
+;;;; Navigation Commands
+
+(defun doc-view-goto-page (page)
+  "View the page given by PAGE."
+  (interactive "nPage: ")
+  (let ((len (length doc-view-current-files)))
+    (if (< page 1)
+       (setq page 1)
+      (when (> page len)
+       (setq page len)))
+    (setq doc-view-current-page page
+         doc-view-current-info
+         (concat
+          (propertize
+           (format "Page %d of %d."
+                   doc-view-current-page
+                   len) 'face 'bold)
+          ;; Tell user if converting isn't finished yet
+          (if doc-view-current-converter-process
+              " (still converting...)\n"
+            "\n")
+          ;; Display context infos if this page matches the last search
+          (when (and doc-view-current-search-matches
+                     (assq doc-view-current-page
+                           doc-view-current-search-matches))
+            (concat (propertize "Search matches:\n" 'face 'bold)
+                    (let ((contexts ""))
+                      (dolist (m (cdr (assq doc-view-current-page
+                                            doc-view-current-search-matches)))
+                        (setq contexts (concat contexts "  - \"" m "\"\n")))
+                      contexts)))))
+    ;; Update the buffer
+    (setq inhibit-read-only t)
+    (erase-buffer)
+    (let ((beg (point)))
+      (doc-view-insert-image (nth (1- page) doc-view-current-files)
+                            :pointer 'arrow)
+      (put-text-property beg (point) 'help-echo doc-view-current-info))
+    (insert "\n" doc-view-current-info)
+    (goto-char (point-min))
+    (forward-char)
+    (setq inhibit-read-only nil)))
+
+(defun doc-view-next-page (&optional arg)
+  "Browse ARG pages forward."
+  (interactive "p")
+  (doc-view-goto-page (+ doc-view-current-page (or arg 1))))
+
+(defun doc-view-previous-page (&optional arg)
+  "Browse ARG pages backward."
+  (interactive "p")
+  (doc-view-goto-page (- doc-view-current-page (or arg 1))))
+
+(defun doc-view-first-page ()
+  "View the first page."
+  (interactive)
+  (doc-view-goto-page 1))
+
+(defun doc-view-last-page ()
+  "View the last page."
+  (interactive)
+  (doc-view-goto-page (length doc-view-current-files)))
+
+(defun doc-view-scroll-up-or-next-page ()
+  "Scroll page up if possible, else goto next page."
+  (interactive)
+  (condition-case nil
+      (scroll-up)
+    (error (doc-view-next-page))))
+
+(defun doc-view-scroll-down-or-previous-page ()
+  "Scroll page down if possible, else goto previous page."
+  (interactive)
+  (condition-case nil
+      (scroll-down)
+    (error (doc-view-previous-page)
+          (goto-char (point-max)))))
+
+(defun doc-view-kill-proc-and-buffer ()
+  "Kill the current converter process and buffer."
+  (interactive)
+  (when (eq major-mode 'doc-view-mode)
+    (when doc-view-current-converter-process
+      (kill-process doc-view-current-converter-process))
+    (when doc-view-current-timer
+      (cancel-timer doc-view-current-timer)
+      (setq doc-view-current-timer nil))
+    (kill-buffer (current-buffer))))
+
+;;;; Conversion Functions
+
+(defun doc-view-file-name-to-directory-name (file)
+  "Return the directory where the png files of FILE should be saved.
+
+It'a a subdirectory of `doc-view-cache-directory'."
+  (if doc-view-current-cache-dir
+      doc-view-current-cache-dir
+    (file-name-as-directory
+     (concat (file-name-as-directory doc-view-cache-directory)
+            (with-temp-buffer
+              (insert-file-contents-literally file)
+              (md5 (current-buffer)))))))
+
+(defun doc-view-dvi->pdf-sentinel (proc event)
+  "If DVI->PDF conversion was successful, convert the PDF to PNG now."
+  (if (not (string-match "finished" event))
+      (message "DocView: dvi->pdf process changed status to %s." event)
+    (set-buffer (process-get proc 'buffer))
+    (setq doc-view-current-converter-process nil)
+    (message "DocView: finished conversion from DVI to PDF!")
+    ;; Now go on converting this PDF to a set of PNG files.
+    (let* ((pdf (process-get proc 'pdf-file))
+          (png (concat (doc-view-file-name-to-directory-name
+                        doc-view-current-doc)
+                       "page-%d.png")))
+      (doc-view-pdf/ps->png pdf png))))
+
+(defun doc-view-dvi->pdf (dvi pdf)
+  "Convert DVI to PDF asynchrounously."
+  (message "DocView: converting DVI to PDF now!")
+  (setq doc-view-current-converter-process
+       (start-process "doc-view-dvi->pdf" doc-view-conversion-buffer
+                      doc-view-dvipdfm-program
+                      "-o" pdf dvi))
+  (set-process-sentinel doc-view-current-converter-process
+                       'doc-view-dvi->pdf-sentinel)
+  (process-put doc-view-current-converter-process 'buffer   (current-buffer))
+  (process-put doc-view-current-converter-process 'pdf-file pdf))
+
+(defun doc-view-pdf/ps->png-sentinel (proc event)
+  "If PDF/PS->PNG conversion was successful, update the display."
+  (if (not (string-match "finished" event))
+      (message "DocView: converter process changed status to %s." event)
+    (set-buffer (process-get proc 'buffer))
+    (setq doc-view-current-converter-process nil)
+    (when doc-view-current-timer
+      (cancel-timer doc-view-current-timer)
+      (setq doc-view-current-timer nil))
+    (message "DocView: finished conversion from PDF/PS to PNG!")
+    ;; Yippie, finished.  Update the display!
+    (doc-view-display doc-view-current-doc)))
+
+(defun doc-view-pdf/ps->png (pdf-ps png)
+  "Convert PDF-PS to PNG asynchrounously."
+  (message "DocView: converting PDF or PS to PNG now!")
+  (setq doc-view-current-converter-process
+       (apply 'start-process
+              (append (list "doc-view-pdf/ps->png" doc-view-conversion-buffer
+                            doc-view-ghostscript-program)
+                      doc-view-ghostscript-options
+                      (list (concat "-sOutputFile=" png))
+                      (list pdf-ps))))
+  (process-put doc-view-current-converter-process
+              'buffer (current-buffer))
+  (set-process-sentinel doc-view-current-converter-process
+                       'doc-view-pdf/ps->png-sentinel)
+  (when doc-view-conversion-refresh-interval
+    (setq doc-view-current-timer
+         (run-at-time "1 secs" doc-view-conversion-refresh-interval
+                      'doc-view-display
+                      doc-view-current-doc))))
+
+(defun doc-view-pdf->txt-sentinel (proc event)
+  (if (not (string-match "finished" event))
+      (message "DocView: converter process changed status to %s." event)
+    (let ((current-buffer (current-buffer))
+         (proc-buffer    (process-get proc 'buffer)))
+      (set-buffer proc-buffer)
+      (setq doc-view-current-converter-process nil)
+      (message "DocView: finished conversion from PDF to TXT!")
+      ;; If the user looks at the DocView buffer where the conversion was
+      ;; performed, search anew.  This time it will be queried for a regexp.
+      (when (eq current-buffer proc-buffer)
+       (doc-view-search)))))
+
+(defun doc-view-pdf->txt (pdf txt)
+  "Convert PDF to TXT asynchrounously."
+  (message "DocView: converting PDF to TXT now!")
+  (setq doc-view-current-converter-process
+       (start-process "doc-view-pdf->txt" doc-view-conversion-buffer
+                      doc-view-pdftotext-program "-raw"
+                      pdf txt))
+  (set-process-sentinel doc-view-current-converter-process
+                       'doc-view-pdf->txt-sentinel)
+  (process-put doc-view-current-converter-process 'buffer (current-buffer)))
+
+(defun doc-view-ps->pdf-sentinel (proc event)
+  (if (not (string-match "finished" event))
+      (message "DocView: converter process changed status to %s." event)
+    (set-buffer (process-get proc 'buffer))
+    (setq doc-view-current-converter-process nil)
+    (message "DocView: finished conversion from PS to PDF!")
+    ;; Now we can transform to plain text.
+    (doc-view-pdf->txt (process-get proc 'pdf-file)
+                      (concat (doc-view-file-name-to-directory-name
+                               doc-view-current-doc)
+                              "doc.txt"))))
+
+(defun doc-view-ps->pdf (ps pdf)
+  "Convert PS to PDF asynchronously."
+  (message "DocView: converting PS to PDF now!")
+  (setq doc-view-current-converter-process
+       (start-process "doc-view-ps->pdf" doc-view-conversion-buffer
+                      doc-view-ps2pdf-program
+                      ps pdf))
+  (set-process-sentinel doc-view-current-converter-process
+                       'doc-view-ps->pdf-sentinel)
+  (process-put doc-view-current-converter-process 'buffer   (current-buffer))
+  (process-put doc-view-current-converter-process 'pdf-file pdf))
+
+(defun doc-view-convert-doc (doc)
+  "Convert DOC to a set of png files, one file per page.
+
+Those files are saved in the directory given by
+`doc-view-file-name-to-directory-name'."
+  (clear-image-cache)
+  (let* ((dir (doc-view-file-name-to-directory-name doc))
+        (png-file (concat (file-name-as-directory dir) "page-%d.png")))
+    (when (file-exists-p dir)
+      (dired-delete-file dir 'always))
+    (make-directory dir t)
+    (if (not (string= (file-name-extension doc) "dvi"))
+       ;; Convert to PNG images.
+       (doc-view-pdf/ps->png doc png-file)
+      ;; DVI files have to be converted to PDF before GhostScript can process
+      ;; it.
+      (doc-view-dvi->pdf doc
+                        (concat (file-name-as-directory dir)
+                                "doc.pdf")))))
+
+;;;; DocView Mode
+
+(define-derived-mode doc-view-mode nil "DocView"
+  "Major mode in DocView buffers.
+
+\\{doc-view-mode-map}"
+  :group 'doc-view
+  (setq buffer-read-only t)
+  (make-local-variable 'doc-view-current-files)
+  (make-local-variable 'doc-view-current-doc)
+  (make-local-variable 'doc-view-current-image)
+  (make-local-variable 'doc-view-current-page)
+  (make-local-variable 'doc-view-current-converter-process)
+  (make-local-variable 'doc-view-current-timer)
+  (make-local-variable 'doc-view-current-slice)
+  (make-local-variable 'doc-view-current-cache-dir)
+  (make-local-variable 'doc-view-current-info)
+  (make-local-variable 'doc-view-current-search-matches))
+
+;;;; Slicing
+
+(defun doc-view-set-slice (x y width height)
+  "Set the slice of the images that should be displayed.
+You can use this function to tell doc-view not to display the
+margins of the document.  It prompts for the top-left corner (X
+and Y) of the slice to display and its WIDTH and HEIGHT.
+
+See `doc-view-set-slice-using-mouse' for a more convenient way to
+do that.  To reset the slice use `doc-view-reset-slice'."
+  (interactive
+   (let* ((size (image-size doc-view-current-image t))
+         (a (read-number (format "Top-left X (0..%d): " (car size))))
+         (b (read-number (format "Top-left Y (0..%d): " (cdr size))))
+         (c (read-number (format "Width (0..%d): " (- (car size) a))))
+         (d (read-number (format "Height (0..%d): " (- (cdr size) b)))))
+     (list a b c d)))
+  (setq doc-view-current-slice (list x y width height))
+  ;; Redisplay
+  (doc-view-goto-page doc-view-current-page))
+
+(defun doc-view-set-slice-using-mouse ()
+  "Set the slice of the images that should be displayed.
+You set the slice by pressing mouse-1 at its top-left corner and
+dragging it to its bottom-right corner.  See also
+`doc-view-set-slice' and `doc-view-reset-slice'."
+  (interactive)
+  (let (x y w h done)
+    (while (not done)
+      (let ((e (read-event
+               (concat "Press mouse-1 at the top-left corner and "
+                       "drag it to the bottom-right corner!"))))
+       (when (eq (car e) 'drag-mouse-1)
+         (setq x (car (posn-object-x-y (event-start e))))
+         (setq y (cdr (posn-object-x-y (event-start e))))
+         (setq w (- (car (posn-object-x-y (event-end e))) x))
+         (setq h (- (cdr (posn-object-x-y (event-end e))) y))
+         (setq done t))))
+    (doc-view-set-slice x y w h)))
+
+(defun doc-view-reset-slice ()
+  "Reset the current slice.
+After calling this function the whole pages will be visible
+again."
+  (interactive)
+  (setq doc-view-current-slice nil)
+  ;; Redisplay
+  (doc-view-goto-page doc-view-current-page))
+
+;;;; Display
+
+(defun doc-view-insert-image (file &rest args)
+  "Insert the given png FILE.
+ARGS is a list of image descriptors."
+  (let ((image (apply 'create-image file 'png nil args)))
+    (setq doc-view-current-image image)
+    (insert-image image (concat "[" file "]") nil doc-view-current-slice)))
+
+(defun doc-view-sort (a b)
+  "Return non-nil if A should be sorted before B.
+Predicate for sorting `doc-view-current-files'."
+  (if (< (length a) (length b))
+      t
+    (if (> (length a) (length b))
+       nil
+      (string< a b))))
+
+(defun doc-view-display (doc)
+  "Start viewing the document DOC."
+  (let ((dir (doc-view-file-name-to-directory-name doc)))
+    (set-buffer (format "*DocView: %s*" doc))
+    (setq doc-view-current-files
+         (sort (directory-files dir t "page-[0-9]+\\.png" t)
+               'doc-view-sort))
+    (when (> (length doc-view-current-files) 0)
+      (doc-view-goto-page doc-view-current-page))))
+
+(defun doc-view-buffer-message ()
+  (setq inhibit-read-only t)
+  (erase-buffer)
+  (insert (propertize "Welcome to DocView!" 'face 'bold)
+         "\n"
+         "
+If you  see this buffer  it means that  the document you  want to
+view gets  converted to PNG now  and the conversion  of the first
+page           hasn't          finished           yet          or
+`doc-view-conversion-refresh-interval' is set to nil.
+
+For now these keys are useful:
+
+`q' : Bury this buffer.  Conversion will go on in background.
+`k' : Kill the conversion process and this buffer.\n")
+  (setq inhibit-read-only nil))
+
+(defun doc-view-show-tooltip ()
+  (interactive)
+  (tooltip-show doc-view-current-info))
+
+;;;; Searching
+
+(defun doc-view-search-internal (regexp file)
+  "Return a list of FILE's pages that contain text matching REGEXP.
+The value is an alist of the form (PAGE CONTEXTS) where PAGE is
+the pagenumber and CONTEXTS are all lines of text containing a match."
+  (with-temp-buffer
+    (insert-file-contents file)
+    (let ((page 1)
+         (lastpage 1)
+         matches)
+      (while (re-search-forward (concat "\\(?:\\([\f]\\)\\|\\("
+                                       regexp "\\)\\)") nil t)
+       (when (match-string 1) (incf page))
+       (when (match-string 2)
+         (if (/= page lastpage)
+             (setq matches (push (cons page
+                                       (list (buffer-substring
+                                              (line-beginning-position)
+                                              (line-end-position))))
+                                 matches))
+           (setq matches (cons
+                          (append
+                           (or
+                            ;; This page already is a match.
+                            (car matches)
+                            ;; This is the first match on page.
+                            (list page))
+                           (list (buffer-substring
+                                  (line-beginning-position)
+                                  (line-end-position))))
+                          (cdr matches))))
+         (setq lastpage page)))
+      (nreverse matches))))
+
+(defun doc-view-search-no-of-matches (list)
+  "Extract the number of matches from the search result LIST."
+  (let ((no 0))
+    (dolist (p list)
+      (setq no (+ no (1- (length p)))))
+    no))
+
+(defun doc-view-search ()
+  "Query for a regexp and search the current document.
+If the current document hasn't been transformed to plain text
+till now do that first.  You should try searching anew when the
+conversion finished."
+  (interactive)
+  ;; New search, so forget the old results.
+  (setq doc-view-current-search-matches nil)
+  (let ((txt (concat (doc-view-file-name-to-directory-name
+                     doc-view-current-doc)
+                    "doc.txt")))
+    (if (file-readable-p txt)
+       (progn
+         (setq doc-view-current-search-matches
+               (doc-view-search-internal
+                (read-from-minibuffer "Regexp: ")
+                txt))
+         (message "DocView: search yielded %d matches."
+                  (doc-view-search-no-of-matches
+                   doc-view-current-search-matches)))
+      ;; We must convert to TXT first!
+      (if doc-view-current-converter-process
+         (message "DocView: please wait till conversion finished.")
+       (let ((ext (file-name-extension doc-view-current-doc)))
+         (cond
+          ((string= ext "pdf")
+           ;; Doc is a PDF, so convert it to TXT
+           (doc-view-pdf->txt doc-view-current-doc txt))
+          ((string= ext "ps")
+           ;; Doc is a PS, so convert it to PDF (which will be converted to
+           ;; TXT thereafter).
+           (doc-view-ps->pdf doc-view-current-doc
+                             (concat (doc-view-file-name-to-directory-name
+                                      doc-view-current-doc)
+                                     "doc.pdf")))
+          ((string= ext "dvi")
+           ;; Doc is a DVI.  This means that a doc.pdf already exists in its
+           ;; cache subdirectory.
+           (doc-view-pdf->txt (concat (doc-view-file-name-to-directory-name
+                                       doc-view-current-doc)
+                                      "doc.pdf")
+                              txt))
+          (t (error "DocView doesn't know what to do"))))))))
+
+(defun doc-view-search-next-match (arg)
+  "Go to the ARGth next matching page."
+  (interactive "p")
+  (let* ((next-pages (remove-if (lambda (i) (<= (car i) doc-view-current-page))
+                               doc-view-current-search-matches))
+        (page (car (nth (1- arg) next-pages))))
+    (if page
+       (doc-view-goto-page page)
+      (when (and
+            doc-view-current-search-matches
+            (y-or-n-p "No more matches after current page.  Wrap to first match? "))
+       (doc-view-goto-page (caar doc-view-current-search-matches))))))
+
+(defun doc-view-search-previous-match (arg)
+  "Go to the ARGth previous matching page."
+  (interactive "p")
+  (let* ((prev-pages (remove-if (lambda (i) (>= (car i) doc-view-current-page))
+                               doc-view-current-search-matches))
+        (page (car (nth (1- arg) (nreverse prev-pages)))))
+    (if page
+       (doc-view-goto-page page)
+      (when (and
+            doc-view-current-search-matches
+            (y-or-n-p "No more matches before current page.  Wrap to last match? "))
+       (doc-view-goto-page (caar (last doc-view-current-search-matches)))))))
+
+;;;; User Interface Commands
+
+;;;###autoload
+(defun doc-view (no-cache &optional file)
+  "Convert FILE to png and start viewing it.
+If no FILE is given, query for on.
+If this FILE is still in the cache, don't convert and use the
+existing page files.  With prefix arg NO-CACHE, don't use the
+cached files and convert anew."
+  (interactive "P")
+  (if (not (and (image-type-available-p 'png)
+               (display-images-p)))
+      (message "DocView: your emacs or display doesn't support png images.")
+    (let* ((doc (or file
+                   (expand-file-name
+                    (let ((completion-ignored-extensions
+                           ;; Don't hide files doc-view can display
+                           (remove-if (lambda (str)
+                                        (string-match "\\.\\(ps\\|pdf\\|dvi\\)$"
+                                                      str))
+                                      completion-ignored-extensions)))
+                      (read-file-name "File: " nil nil t)))))
+          (buffer (get-buffer-create (format "*DocView: %s*" doc)))
+          (dir (doc-view-file-name-to-directory-name doc)))
+      (switch-to-buffer buffer)
+      (doc-view-buffer-message)
+      (doc-view-mode)
+      (setq doc-view-current-doc doc)
+      (setq doc-view-current-page 1)
+      (if (not (and (file-exists-p dir)
+                   (not no-cache)))
+         (progn
+           (setq doc-view-current-cache-dir nil)
+           (doc-view-convert-doc doc-view-current-doc))
+       (message "DocView: using cached files!")
+       (doc-view-display doc-view-current-doc)))))
+
+(defun doc-view-dired (no-cache)
+  "View the current dired file with doc-view.
+NO-CACHE is the same as in `doc-view'.
+
+You might want to bind this command to a dired key, e.g.
+
+    (define-key dired-mode-map (kbd \"C-c d\") 'doc-view-dired)"
+  (interactive "P")
+  (doc-view no-cache (dired-get-file-for-visit)))
+
+(defun doc-view-clear-cache ()
+  "Delete the whole cache (`doc-view-cache-directory')."
+  (interactive)
+  (dired-delete-file doc-view-cache-directory 'always)
+  (make-directory doc-view-cache-directory))
+
+(defun doc-view-dired-cache ()
+  "Open `dired' in `doc-view-cache-directory'."
+  (interactive)
+  (dired doc-view-cache-directory))
+
+(provide 'doc-view)
+
+;; Local Variables:
+;; mode: outline-minor
+;; End:
+
+;; arch-tag: 5d6e5c5e-095f-489e-b4e4-1ca90a7d79be
+;;; doc-view.el ends here
index 0b5cf110fbd64f17b1ead07b7737cdbb607e72a9..39a55744a055ccba0a8fcd7cab1dea8687365183 100644 (file)
@@ -145,11 +145,12 @@ but not `C-u X' or `ESC X' since the X is not the prefix key."
   (if enable-flag
       (progn
        ;; Set up key-translation-map as indicated by `double-map'.
+       ;; XXX I don't think key-translation-map should be made local here. -- Lorentey
        (kill-local-variable 'key-translation-map)
        (make-local-variable 'key-translation-map)
        (setq key-translation-map (if (keymapp key-translation-map)
-                                     (copy-keymap key-translation-map)
-                                   (make-sparse-keymap)))
+                                            (copy-keymap key-translation-map)
+                                          (make-sparse-keymap)))
        (mapcar (function (lambda (entry)
                            (define-key key-translation-map
                              (vector (nth 0 entry))
index 744a7ba461709aa5a754a34b65403f51e95c2d90..3b2b17fe188fd642c557d38b490af72bdcc0df7f 100644 (file)
@@ -175,7 +175,7 @@ Entry to this mode via command `electric-buffer-list' calls the value of
   (let ((map (make-keymap)))
     (fillarray (car (cdr map)) 'Electric-buffer-menu-undefined)
     (define-key map "\e" nil)
-    (define-key map "\C-z" 'suspend-emacs)
+    (define-key map "\C-z" 'suspend-frame)
     (define-key map "v" 'Electric-buffer-menu-mode-view-buffer)
     (define-key map (char-to-string help-char) 'Helper-help)
     (define-key map "?" 'Helper-describe-bindings)
index 8d5b5e2beea90bea4db322d5597743d5c9828008..7468dd0b7fdb8044190e7ed3ff28d9b665d79c83 100644 (file)
@@ -66,7 +66,7 @@ With prefix arg NOCONFIRM, execute current line as-is without editing."
   (define-key electric-history-map "\C-c" nil)
   (define-key electric-history-map "\C-c\C-c" 'Electric-history-quit)
   (define-key electric-history-map "\C-]" 'Electric-history-quit)
-  (define-key electric-history-map "\C-z" 'suspend-emacs)
+  (define-key electric-history-map "\C-z" 'suspend-frame)
   (define-key electric-history-map (char-to-string help-char) 'Helper-help)
   (define-key electric-history-map "?" 'Helper-describe-bindings)
   (define-key electric-history-map "\e>" 'end-of-buffer)
index ec153fde625f7383a5571a8087a1496e0151ad70..451f87e142de3dbaf0beb99810c32aaa6b551394 100644 (file)
@@ -138,7 +138,7 @@ Options `-c', `-u', and `-i' are not allowed. Case sensitivity can be
 toggled interactively using \\[ediff-toggle-ignore-case].
 
 This variable is not for customizing the look of the differences produced by
-the command \\[ediff-show-diff-output]. Use the variable 
+the command \\[ediff-show-diff-output]. Use the variable
 `ediff-custom-diff-options' for that."
   :set 'ediff-reset-diff-options
   :type 'string
@@ -348,20 +348,20 @@ one optional arguments, diff-number to refine.")
     ;; fixup diff-list
     (if diff3-job
        (cond ((not file-A)
-              (mapcar (lambda (elt)
-                        (aset elt 0 nil)
-                        (aset elt 1 nil))
-                      (cdr diff-list)))
+              (mapc (lambda (elt)
+                      (aset elt 0 nil)
+                      (aset elt 1 nil))
+                    (cdr diff-list)))
              ((not file-B)
-              (mapcar (lambda (elt)
-                        (aset elt 2 nil)
-                        (aset elt 3 nil))
-                      (cdr diff-list)))
+              (mapc (lambda (elt)
+                      (aset elt 2 nil)
+                      (aset elt 3 nil))
+                    (cdr diff-list)))
              ((not file-C)
-              (mapcar (lambda (elt)
-                        (aset elt 4 nil)
-                        (aset elt 5 nil))
-                      (cdr diff-list)))
+              (mapc (lambda (elt)
+                      (aset elt 4 nil)
+                      (aset elt 5 nil))
+                    (cdr diff-list)))
          ))
 
     (ediff-convert-fine-diffs-to-overlays diff-list reg-num)
@@ -1533,7 +1533,7 @@ affects only files whose names match the expression."
 
 (defun ediff-set-actual-diff-options ()
   (if ediff-ignore-case
-      (setq ediff-actual-diff-options 
+      (setq ediff-actual-diff-options
            (concat ediff-diff-options " " ediff-ignore-case-option)
            ediff-actual-diff3-options
            (concat ediff-diff3-options " " ediff-ignore-case-option3))
index 21bf73ff76a43e835d9b64cd8ccb7904239dc27b..21e6bf660ee11718dec344c8d8f806a58ef5b7cc 100644 (file)
@@ -1410,7 +1410,7 @@ This property can be toggled interactively."
 ;;; Misc
 
 ;; if nil, this silences some messages
-(defconst ediff-verbose-p t)
+(defvar ediff-verbose-p t)
 
 (defcustom ediff-autostore-merges  'group-jobs-only
   "*Save the results of merge jobs automatically.
index d94e7515932556d31133612dc8a95333d1f13ae9..3696d8ae7760a7246fb90ba10c04834f7a314921 100644 (file)
@@ -370,7 +370,7 @@ buffers."
 (ediff-defvar-local ediff-verbose-help-enabled nil
   "If t, display redundant help in ediff-directories and other meta buffers.
 Toggled by ediff-toggle-verbose-help-meta-buffer" )
-  
+
 ;; Toggle verbose help in meta-buffers
 ;; TODO: Someone who understands all this can make it better.
 (defun ediff-toggle-verbose-help-meta-buffer ()
@@ -641,15 +641,15 @@ behavior."
     ;; If file belongs to dir 1 only, the membership code is 2.
     ;; If it is in dir1 and dir3, then the membership code is 2*5=10;
     ;; if it is in dir1 and dir2, then the membership code is 2*3=6, etc.
-    (mapcar (lambda (elt)
-             (if (member (car elt) lis1)
-                 (setcdr elt (* (cdr elt) ediff-membership-code1)))
-             (if (member (car elt) lis2)
-                 (setcdr elt (* (cdr elt) ediff-membership-code2)))
-             (if (member (car elt) lis3)
-                 (setcdr elt (* (cdr elt) ediff-membership-code3)))
-             )
-           difflist)
+    (mapc (lambda (elt)
+           (if (member (car elt) lis1)
+               (setcdr elt (* (cdr elt) ediff-membership-code1)))
+           (if (member (car elt) lis2)
+               (setcdr elt (* (cdr elt) ediff-membership-code2)))
+           (if (member (car elt) lis3)
+               (setcdr elt (* (cdr elt) ediff-membership-code3)))
+           )
+         difflist)
     (setq difflist (cons
                    ;; diff metalist header
                    (ediff-make-new-meta-list-header regexp
@@ -941,7 +941,7 @@ behavior."
       ;; was redrawn
       (ediff-cond-compile-for-xemacs-or-emacs
        (map-extents 'delete-extent)   ; xemacs
-       (mapcar 'delete-overlay (overlays-in 1 1))  ; emacs
+       (mapc 'delete-overlay (overlays-in 1 1))  ; emacs
        )
 
       (setq regexp (ediff-get-group-regexp meta-list)
@@ -1329,7 +1329,7 @@ Useful commands:
 
     ;; copy file to directories where it doesn't exist, update
     ;; ediff-dir-difference-list and redisplay
-    (mapcar
+    (mapc
      (lambda (otherfile-struct)
        (let ((otherfile (car otherfile-struct))
             (file-mem-code (cdr otherfile-struct)))
@@ -1390,7 +1390,7 @@ Useful commands:
       ;; was redrawn
       (ediff-cond-compile-for-xemacs-or-emacs
        (map-extents 'delete-extent) ; xemacs
-       (mapcar 'delete-overlay (overlays-in 1 1)) ; emacs
+       (mapc 'delete-overlay (overlays-in 1 1)) ; emacs
        )
 
       (insert "This is a registry of all active Ediff sessions.
@@ -1410,11 +1410,11 @@ Useful commands:
 
 ")
       ;; purge registry list from dead buffers
-      (mapcar (lambda (elt)
-               (if (not (ediff-buffer-live-p elt))
-                   (setq ediff-session-registry
-                         (delq elt ediff-session-registry))))
-             ediff-session-registry)
+      (mapc (lambda (elt)
+             (if (not (ediff-buffer-live-p elt))
+                 (setq ediff-session-registry
+                       (delq elt ediff-session-registry))))
+           ediff-session-registry)
 
       (if (null ediff-session-registry)
          (insert "       ******* No active Ediff sessions *******\n"))
index 7a4698792741ca5254fa0f081f3c6e6437aa4430..2efa2ac3012f05dbc5c12ea07bf9b560a136c3fc 100644 (file)
@@ -292,43 +292,43 @@ program."
        )
 
     ;; chop off base-dirs
-    (mapcar (lambda (session-info)
-             (let* ((proposed-file-names
-                     ;; Filename-spec is objA; it is represented as
-                     ;; (file1 . file2). Get it using ediff-get-session-objA.
-                     (ediff-get-session-objA-name session-info))
-                    ;; base-dir1 is  the dir part of the 1st file in the patch
-                    (base-dir1
-                     (or (file-name-directory (car proposed-file-names))
-                         ""))
-                    ;; directory part of the 2nd file in the patch
-                    (base-dir2
-                     (or (file-name-directory (cdr proposed-file-names))
-                         ""))
-                    )
-               ;; If both base-dir1 and base-dir2 are relative and exist,
-               ;; assume that
-               ;; these dirs lead to the actual files starting at the present
-               ;; directory. So, we don't strip these relative dirs from the
-               ;; file names. This is a heuristic intended to improve guessing
-               (let ((default-directory (file-name-directory filename)))
-                 (unless (or (file-name-absolute-p base-dir1)
-                             (file-name-absolute-p base-dir2)
-                             (not (file-exists-p base-dir1))
-                             (not (file-exists-p base-dir2)))
-                   (setq base-dir1 ""
-                         base-dir2 "")))
-               (or (string= (car proposed-file-names) "/dev/null")
-                   (setcar proposed-file-names
-                           (ediff-file-name-sans-prefix
-                            (car proposed-file-names) base-dir1)))
-               (or (string=
-                    (cdr proposed-file-names) "/dev/null")
-                   (setcdr proposed-file-names
-                           (ediff-file-name-sans-prefix
-                            (cdr proposed-file-names) base-dir2)))
-               ))
-           ediff-patch-map)
+    (mapc (lambda (session-info)
+           (let* ((proposed-file-names
+                   ;; Filename-spec is objA; it is represented as
+                   ;; (file1 . file2). Get it using ediff-get-session-objA.
+                   (ediff-get-session-objA-name session-info))
+                  ;; base-dir1 is  the dir part of the 1st file in the patch
+                  (base-dir1
+                   (or (file-name-directory (car proposed-file-names))
+                       ""))
+                  ;; directory part of the 2nd file in the patch
+                  (base-dir2
+                   (or (file-name-directory (cdr proposed-file-names))
+                       ""))
+                  )
+             ;; If both base-dir1 and base-dir2 are relative and exist,
+             ;; assume that
+             ;; these dirs lead to the actual files starting at the present
+             ;; directory. So, we don't strip these relative dirs from the
+             ;; file names. This is a heuristic intended to improve guessing
+             (let ((default-directory (file-name-directory filename)))
+               (unless (or (file-name-absolute-p base-dir1)
+                           (file-name-absolute-p base-dir2)
+                           (not (file-exists-p base-dir1))
+                           (not (file-exists-p base-dir2)))
+                 (setq base-dir1 ""
+                       base-dir2 "")))
+             (or (string= (car proposed-file-names) "/dev/null")
+                 (setcar proposed-file-names
+                         (ediff-file-name-sans-prefix
+                          (car proposed-file-names) base-dir1)))
+             (or (string=
+                  (cdr proposed-file-names) "/dev/null")
+                 (setcdr proposed-file-names
+                         (ediff-file-name-sans-prefix
+                          (cdr proposed-file-names) base-dir2)))
+             ))
+         ediff-patch-map)
 
     ;; take the given file name into account
     (or (file-directory-p filename)
@@ -338,19 +338,19 @@ program."
                      (file-name-nondirectory filename))))
 
     ;; prepend actual-dir
-    (mapcar (lambda (session-info)
-             (let ((proposed-file-names
-                    (ediff-get-session-objA-name session-info)))
-               (if (and (string-match "^/null/" (car proposed-file-names))
-                        (string-match "^/null/" (cdr proposed-file-names)))
-                   ;; couldn't intuit the file name to patch, so
-                   ;; something is amiss
-                   (progn
-                     (with-output-to-temp-buffer ediff-msg-buffer
-                       (ediff-with-current-buffer standard-output
-                         (fundamental-mode))
-                       (princ
-                        (format "
+    (mapc (lambda (session-info)
+           (let ((proposed-file-names
+                  (ediff-get-session-objA-name session-info)))
+             (if (and (string-match "^/null/" (car proposed-file-names))
+                      (string-match "^/null/" (cdr proposed-file-names)))
+                 ;; couldn't intuit the file name to patch, so
+                 ;; something is amiss
+                 (progn
+                   (with-output-to-temp-buffer ediff-msg-buffer
+                     (ediff-with-current-buffer standard-output
+                       (fundamental-mode))
+                     (princ
+                      (format "
 The patch file contains a context diff for
        %s
        %s
@@ -361,31 +361,31 @@ please enter it now.
 If you don't know and still would like to apply patches to
 other files, enter /dev/null
 "
-                                (substring (car proposed-file-names) 6)
-                                (substring (cdr proposed-file-names) 6))))
-                     (let ((directory t)
-                           user-file)
-                       (while directory
-                         (setq user-file
-                               (read-file-name
-                                "Please enter file name: "
-                                actual-dir actual-dir t))
-                         (if (not (file-directory-p user-file))
-                             (setq directory nil)
-                           (setq directory t)
-                           (beep)
-                           (message "%s is a directory" user-file)
-                           (sit-for 2)))
-                       (setcar (ediff-get-session-objA session-info)
-                               (cons user-file user-file))))
-                 (setcar proposed-file-names
-                         (expand-file-name
-                          (concat actual-dir (car proposed-file-names))))
-                 (setcdr proposed-file-names
-                         (expand-file-name
-                          (concat actual-dir (cdr proposed-file-names)))))
-               ))
-           ediff-patch-map)
+                              (substring (car proposed-file-names) 6)
+                              (substring (cdr proposed-file-names) 6))))
+                   (let ((directory t)
+                         user-file)
+                     (while directory
+                       (setq user-file
+                             (read-file-name
+                              "Please enter file name: "
+                              actual-dir actual-dir t))
+                       (if (not (file-directory-p user-file))
+                           (setq directory nil)
+                         (setq directory t)
+                         (beep)
+                         (message "%s is a directory" user-file)
+                         (sit-for 2)))
+                     (setcar (ediff-get-session-objA session-info)
+                             (cons user-file user-file))))
+               (setcar proposed-file-names
+                       (expand-file-name
+                        (concat actual-dir (car proposed-file-names))))
+               (setcdr proposed-file-names
+                       (expand-file-name
+                        (concat actual-dir (cdr proposed-file-names)))))
+             ))
+         ediff-patch-map)
     ;; Check for the existing files in each pair and discard the nonexisting
     ;; ones. If both exist, ask the user.
     (mapcar (lambda (session-info)
index e60faa0a0da30418dd5355a0d38726fa63dcc62a..14b1be963d72722392c3de48910e4b0b792bdfc4 100644 (file)
@@ -122,7 +122,7 @@ Commands:
   ;; modified by minor modes and such. So, run-mode-hooks doesn't do anything
   ;; useful here on top of what run-hooks does.
   ;; Second, changing run-hooks to run-mode-hooks would require an
-  ;; if-statement, since XEmacs doesn't have this. 
+  ;; if-statement, since XEmacs doesn't have this.
   (run-hooks 'ediff-mode-hook))
 
 
@@ -1317,10 +1317,10 @@ which see."
   ;; change default
   (setq-default ediff-window-setup-function window-setup-func)
   ;; change in all active ediff sessions
-  (mapcar (lambda(buf) (ediff-with-current-buffer buf
-                        (setq ediff-window-setup-function window-setup-func
-                              ediff-window-B nil)))
-         ediff-session-registry)
+  (mapc (lambda(buf) (ediff-with-current-buffer buf
+                      (setq ediff-window-setup-function window-setup-func
+                            ediff-window-B nil)))
+       ediff-session-registry)
   (if (ediff-in-control-buffer-p)
       (ediff-recenter 'no-rehighlight))))
 
@@ -1341,12 +1341,12 @@ To change the default, set the variable `ediff-use-toolbar-p', which see."
        ;; do this only after killing the toolbar
        (setq ediff-use-toolbar-p (not ediff-use-toolbar-p))
 
-       (mapcar (lambda(buf)
-                 (ediff-with-current-buffer buf
-                   ;; force redisplay
-                   (setq ediff-window-config-saved "")
-                   ))
-               ediff-session-registry)
+       (mapc (lambda(buf)
+               (ediff-with-current-buffer buf
+                 ;; force redisplay
+                 (setq ediff-window-config-saved "")
+                 ))
+             ediff-session-registry)
        (if (ediff-in-control-buffer-p)
            (ediff-recenter 'no-rehighlight)))))
 
@@ -2439,14 +2439,14 @@ temporarily reverses the meaning of this variable."
 
   ;; Apply selective display to narrow or widen
   (ediff-visible-region)
-  (mapcar (lambda (overl)
-           (if (ediff-overlayp overl)
-               (ediff-delete-overlay overl)))
-         ediff-wide-bounds)
-  (mapcar (lambda (overl)
-           (if (ediff-overlayp overl)
-               (ediff-delete-overlay overl)))
-         ediff-narrow-bounds)
+  (mapc (lambda (overl)
+         (if (ediff-overlayp overl)
+             (ediff-delete-overlay overl)))
+       ediff-wide-bounds)
+  (mapc (lambda (overl)
+         (if (ediff-overlayp overl)
+             (ediff-delete-overlay overl)))
+       ediff-narrow-bounds)
 
   ;; restore buffer mode line id's in buffer-A/B/C
   (let ((control-buffer ediff-control-buffer)
@@ -3747,13 +3747,13 @@ Ediff Control Panel to restore highlighting."
 ;; VEC is either a difference vector or a fine-diff vector
 (defun ediff-clear-diff-vector (vec-var &optional fine-diffs-also)
   (if (vectorp (symbol-value vec-var))
-      (mapcar (lambda (elt)
-               (ediff-delete-overlay
-                (ediff-get-diff-overlay-from-diff-record elt))
-               (if fine-diffs-also
-                   (ediff-clear-fine-diff-vector elt))
-               )
-             (symbol-value vec-var)))
+      (mapc (lambda (elt)
+             (ediff-delete-overlay
+              (ediff-get-diff-overlay-from-diff-record elt))
+             (if fine-diffs-also
+                 (ediff-clear-fine-diff-vector elt))
+             )
+           (symbol-value vec-var)))
   ;; allow them to be garbage collected
   (set vec-var nil))
 
index 897845c182aa44c65dc9fd6b81abf64ecae3ef60..c2c130ac6bbe1f3e6c6c24454b9b164e6629b33f 100644 (file)
   :group 'frames)
 
 
-(defcustom ediff-window-setup-function (if (ediff-window-display-p)
-                                       'ediff-setup-windows-multiframe
-                                     'ediff-setup-windows-plain)
+(defcustom ediff-window-setup-function 'ediff-setup-windows-automatic
   "*Function called to set up windows.
-Ediff provides a choice of two functions: `ediff-setup-windows-plain', for
-doing everything in one frame, and `ediff-setup-windows-multiframe',
-which sets the control panel in a separate frame.  Also, if the latter
-function detects that one of the buffers A/B is seen in some other frame,
-it will try to keep that buffer in that frame.
+Ediff provides a choice of three functions: `ediff-setup-windows-plain', for
+doing everything in one frame, `ediff-setup-windows-multiframe', which sets
+the control panel in a separate frame, and
+`ediff-setup-windows-automatic' (the default), which chooses an appropriate
+behaviour based on the current window system.  If the multiframe function
+detects that one of the buffers A/B is seen in some other frame, it will try
+to keep that buffer in that frame.
 
 If you don't like the two functions provided---write your own one.
 The basic guidelines:
@@ -94,7 +94,8 @@ The basic guidelines:
        Buffer C may not be used in jobs that compare only two buffers.
 If you plan to do something fancy, take a close look at how the two
 provided functions are written."
-  :type '(choice (const :tag "Multi Frame" ediff-setup-windows-multiframe)
+  :type '(choice (const :tag "Automatic" ediff-setup-windows-automatic)
+                (const :tag "Multi Frame" ediff-setup-windows-multiframe)
                 (const :tag "Single Frame" ediff-setup-windows-plain)
                 (function :tag "Other function"))
   :group 'ediff-window)
@@ -335,6 +336,12 @@ into icons, regardless of the window manager."
        buffer-A buffer-B buffer-C control-buffer))
   (run-hooks 'ediff-after-setup-windows-hook))
 
+;; Set up windows using the correct method based on the current window system.
+(defun ediff-setup-windows-automatic (buffer-A buffer-B buffer-C control-buffer)
+  (if (ediff-window-display-p)
+      (ediff-setup-windows-multiframe buffer-A buffer-B buffer-C control-buffer)
+    (ediff-setup-windows-plain buffer-A buffer-B buffer-C control-buffer)))
+
 ;; Just set up 3 windows.
 ;; Usually used without windowing systems
 ;; With windowing, we want to use dedicated frames.
index 6a0b28a4b82ca97fdfb2419ae190aa210f70c301..55138f18bca67705915fb1d93b23f86b25c1afab 100644 (file)
@@ -486,9 +486,9 @@ doubt, use whitespace."
             (fkey nil) tlen tkey
             (bind (or (loop for map in maps for b = (lookup-key map key)
                             thereis (and (not (integerp b)) b))
-                      (and (setq fkey (lookup-key function-key-map rest-mac))
+                      (and (setq fkey (lookup-key local-function-key-map rest-mac))
                            (setq tlen fkey tkey (edmacro-subseq rest-mac 0 tlen)
-                                 fkey (lookup-key function-key-map tkey))
+                                 fkey (lookup-key local-function-key-map tkey))
                            (loop for map in maps
                                  for b = (lookup-key map fkey)
                                  when (and (not (integerp b)) b)
index 447e45f14f3eb72e647134fb18b8b13f4f0a97ca..0c1b3b170cdf57e3f94188e845309a5a0daa24fd 100644 (file)
@@ -1886,13 +1886,13 @@ buffer after this will cause serious problems."
   (emerge-restore-buffer-characteristics)
   ;; null out the difference markers so they don't slow down future editing
   ;; operations
-  (mapcar (function (lambda (d)
-                     (set-marker (aref d 0) nil)
-                     (set-marker (aref d 1) nil)
-                     (set-marker (aref d 2) nil)
-                     (set-marker (aref d 3) nil)
-                     (set-marker (aref d 4) nil)
-                     (set-marker (aref d 5) nil)))
+  (mapc (function (lambda (d)
+                   (set-marker (aref d 0) nil)
+                   (set-marker (aref d 1) nil)
+                   (set-marker (aref d 2) nil)
+                   (set-marker (aref d 3) nil)
+                   (set-marker (aref d 4) nil)
+                   (set-marker (aref d 5) nil)))
          emerge-difference-list)
   ;; allow them to be garbage collected
   (setq emerge-difference-list nil)
index d04df5e48b67e9d3ce7739897907173b49238537..128228be3dbc2d75c165479c7ca6222ba762938d 100644 (file)
@@ -36,6 +36,8 @@
 
 ;;; Code:
 
+(eval-when-compile (require 'cl))
+
 ;; History list for environment variable names.
 (defvar read-envvar-name-history nil)
 
@@ -52,7 +54,9 @@ If it is also not t, RET does not exit if it does non-null completion."
                                        locale-coding-system t)
                                     (substring enventry 0
                                                (string-match "=" enventry)))))
-                          process-environment)
+                          (append process-environment
+                                  nil ;;(frame-parameter (frame-with-environment) 'environment)
+                                  ))
                   nil mustmatch nil 'read-envvar-name-history))
 
 ;; History list for VALUE argument to setenv.
@@ -88,27 +92,70 @@ Use `$$' to insert a single dollar sign."
                   start (+ (match-beginning 0) 1)))))
     string))
 
-;; Fixme: Should `process-environment' be recoded if LC_CTYPE &c is set?
 
-(defun setenv (variable &optional value substitute-env-vars)
+(defun setenv-internal (env variable value keep-empty)
+  "Set VARIABLE to VALUE in ENV, adding empty entries if KEEP-EMPTY.
+Changes ENV by side-effect, and returns its new value."
+  (let ((pattern (concat "\\`" (regexp-quote variable) "\\(=\\|\\'\\)"))
+       (case-fold-search nil)
+       (scan env)
+       prev found)
+    ;; Handle deletions from the beginning of the list specially.
+    (if (and (null value)
+            (not keep-empty)
+            env
+            (stringp (car env))
+            (string-match pattern (car env)))
+       (cdr env)
+      ;; Try to find existing entry for VARIABLE in ENV.
+      (while (and scan (stringp (car scan)))
+       (when (string-match pattern (car scan))
+         (if value
+             (setcar scan (concat variable "=" value))
+           (if keep-empty
+               (setcar scan variable)
+             (setcdr prev (cdr scan))))
+         (setq found t
+               scan nil))
+       (setq prev scan
+             scan (cdr scan)))
+      (if (and (not found) (or value keep-empty))
+         (cons (if value
+                   (concat variable "=" value)
+                 variable)
+               env)
+       env))))
+
+;; Fixme: Should the environment be recoded if LC_CTYPE &c is set?
+
+(defun setenv (variable &optional value substitute-env-vars frame)
   "Set the value of the environment variable named VARIABLE to VALUE.
 VARIABLE should be a string.  VALUE is optional; if not provided or
 nil, the environment variable VARIABLE will be removed.
 
-Interactively, a prefix argument means to unset the variable.
-Interactively, the current value (if any) of the variable
-appears at the front of the history list when you type in the new value.
-Interactively, always replace environment variables in the new value.
+Interactively, a prefix argument means to unset the variable, and
+otherwise the current value (if any) of the variable appears at
+the front of the history list when you type in the new value.
+This function always replaces environment variables in the new
+value when called interactively.
 
 SUBSTITUTE-ENV-VARS, if non-nil, means to substitute environment
 variables in VALUE with `substitute-env-vars', which see.
 This is normally used only for interactive calls.
 
+If optional parameter FRAME is non-nil, this function modifies
+only the frame-local value of VARIABLE on FRAME, ignoring
+`process-environment'.  Note that frames on the same terminal
+device usually share their environment, so calling `setenv' on
+one of them affects the others as well.
+
+If FRAME is nil, `setenv' changes the global value of VARIABLE by
+modifying `process-environment'.  Note that the global value
+overrides any frame-local values.
+
 The return value is the new value of VARIABLE, or nil if
 it was removed from the environment.
 
-This function works by modifying `process-environment'.
-
 As a special case, setting variable `TZ' calls `set-time-zone-rule' as
 a side-effect."
   (interactive
@@ -138,48 +185,130 @@ a side-effect."
   (if (and value (multibyte-string-p value))
       (setq value (encode-coding-string value locale-coding-system)))
   (if (string-match "=" variable)
-      (error "Environment variable name `%s' contains `='" variable)
-    (let ((pattern (concat "\\`" (regexp-quote (concat variable "="))))
-         (case-fold-search nil)
-         (scan process-environment)
-         found)
-      (if (string-equal "TZ" variable)
-         (set-time-zone-rule value))
-      (while scan
-       (cond ((string-match pattern (car scan))
-              (setq found t)
-              (if (eq nil value)
-                  (setq process-environment (delq (car scan)
-                                                  process-environment))
-                (setcar scan (concat variable "=" value)))
-              (setq scan nil)))
-       (setq scan (cdr scan)))
-      (or found
-         (if value
-             (setq process-environment
-                   (cons (concat variable "=" value)
-                         process-environment))))))
+      (error "Environment variable name `%s' contains `='" variable))
+  (if (string-equal "TZ" variable)
+      (set-time-zone-rule value))
+  (if (null frame)
+      (setq process-environment (setenv-internal process-environment
+                                                variable value t))
+    (setq frame (frame-with-environment frame))
+    (setq process-environment (setenv-internal process-environment
+                                               variable value nil)))
   value)
 
-(defun getenv (variable)
+(defun getenv (variable &optional frame)
   "Get the value of environment variable VARIABLE.
 VARIABLE should be a string.  Value is nil if VARIABLE is undefined in
 the environment.  Otherwise, value is a string.
 
-This function consults the variable `process-environment'
-for its value."
+If optional parameter FRAME is non-nil, then it should be a
+frame.  This function will look up VARIABLE in its 'environment
+parameter.
+
+Otherwise, this function searches `process-environment' for
+VARIABLE.  If it is not found there, then it continues the search
+in the environment list of the selected frame."
   (interactive (list (read-envvar-name "Get environment variable: " t)))
   (let ((value (getenv-internal (if (multibyte-string-p variable)
                                    (encode-coding-string
                                     variable locale-coding-system)
-                                 variable))))
+                                 variable)
+                               frame)))
     (if (and enable-multibyte-characters value)
        (setq value (decode-coding-string value locale-coding-system)))
     (when (interactive-p)
       (message "%s" (if value value "Not set")))
     value))
 
+(defun environment (&optional frame)
+  "Return a list of environment variables with their values.
+Each entry in the list is a string of the form NAME=VALUE.
+
+The returned list can not be used to change environment
+variables, only read them.  See `setenv' to do that.
+
+If optional parameter FRAME is non-nil, then it should be a
+frame.  The function returns the environment of that frame.
+
+The list is constructed by concatenating the elements of
+`process-environment' and the 'environment parameter of the
+selected frame, and removing duplicated and empty values.
+
+Non-ASCII characters are encoded according to the initial value of
+`locale-coding-system', i.e. the elements must normally be decoded for use.
+See `setenv' and `getenv'."
+  (let* ((env (append process-environment
+;;                   (frame-parameter (frame-with-environment frame)
+;;                                    'environment)
+                     nil))
+        (scan env)
+        prev seen)
+    ;; Remove unset variables from the beginning of the list.
+    (while (and env
+               (or (not (stringp (car env)))
+                   (not (string-match "=" (car env)))))
+      (or (member (car env) seen)
+         (setq seen (cons (car env) seen)))
+      (setq env (cdr env)
+           scan env))
+    (let (name)
+      (while scan
+       (cond ((or (not (stringp (car scan)))
+                  (not (string-match "=" (car scan))))
+              ;; Unset variable.
+              (or (member (car scan) seen)
+                  (setq seen (cons (car scan) seen)))
+              (setcdr prev (cdr scan)))
+             ((member (setq name (substring (car scan) 0 (string-match "=" (car scan)))) seen)
+              ;; Duplicated variable.
+              (setcdr prev (cdr scan)))
+             (t
+              ;; New variable.
+              (setq seen (cons name seen))))
+       (setq prev scan
+             scan (cdr scan))))
+    env))
+
+(defmacro let-environment (varlist &rest body)
+  "Evaluate BODY with environment variables set according to VARLIST.
+The environment variables are then restored to their previous
+values.
+The value of the last form in BODY is returned.
+
+Each element of VARLIST is either a string (which variable is
+then removed from the environment), or a list (NAME
+VALUEFORM) (which sets NAME to the value of VALUEFORM, a string).
+All the VALUEFORMs are evaluated before any variables are set."
+  (declare (indent 2))
+  (let ((old-env (make-symbol "old-env"))
+       (name (make-symbol "name"))
+       (value (make-symbol "value"))
+       (entry (make-symbol "entry"))
+       (frame (make-symbol "frame")))
+    `(let ((,frame (selected-frame))
+           ,old-env)
+       ;; Evaluate VALUEFORMs and replace them in VARLIST with their values.
+       (dolist (,entry ,varlist)
+        (unless (stringp ,entry)
+          (if (cdr (cdr ,entry))
+              (error "`let-environment' bindings can have only one value-form"))
+          (setcdr ,entry (eval (cadr ,entry)))))
+       ;; Set the variables.
+       (dolist (,entry ,varlist)
+        (let ((,name (if (stringp ,entry) ,entry (car ,entry)))
+              (,value (if (consp ,entry) (cdr ,entry))))
+          (setq ,old-env (cons (cons ,name (getenv ,name)) ,old-env))
+          (setenv ,name ,value)))
+       (unwind-protect
+          (progn ,@body)
+        ;; Restore old values.
+        (with-selected-frame (if (frame-live-p ,frame)
+                                 ,frame
+                               (selected-frame))
+          (dolist (,entry ,old-env)
+            (setenv (car ,entry) (cdr ,entry))))))))
+
 (provide 'env)
 
-;;; arch-tag: b7d6a8f7-bc81-46db-8e39-8d721d4ed0b8
+;; arch-tag: b7d6a8f7-bc81-46db-8e39-8d721d4ed0b8
 ;;; env.el ends here
index 7275100276578bed0247200dffc99d438fe87f96..55be1fad20e3859fa476b449677ca6a2ab84d0fe 100644 (file)
@@ -1002,7 +1002,7 @@ an integer value."
   (let ((valid
          (case attribute
            (:family
-            (if window-system
+            (if (window-system frame)
                 (mapcar #'(lambda (x) (cons (car x) (car x)))
                         (x-font-family-list))
              ;; Only one font on TTYs.
@@ -1011,7 +1011,7 @@ an integer value."
             (mapcar #'(lambda (x) (cons (symbol-name x) x))
                     (internal-lisp-face-attribute-values attribute)))
            ((:underline :overline :strike-through :box)
-            (if window-system
+            (if (window-system frame)
                 (nconc (mapcar #'(lambda (x) (cons (symbol-name x) x))
                                (internal-lisp-face-attribute-values attribute))
                        (mapcar #'(lambda (c) (cons c c))
@@ -1024,7 +1024,7 @@ an integer value."
            ((:height)
             'integerp)
            (:stipple
-            (and (memq window-system '(x w32 mac))
+            (and (memq (window-system frame) '(x w32 mac))
                  (mapcar #'list
                          (apply #'nconc
                                 (mapcar (lambda (dir)
@@ -1142,7 +1142,7 @@ of a global face.  Value is the new attribute value."
               ;; explicitly in VALID, using color approximation code
               ;; in tty-colors.el.
               (when (and (memq attribute '(:foreground :background))
-                         (not (memq window-system '(x w32 mac)))
+                         (not (memq (window-system frame) '(x w32 mac)))
                          (not (member new-value
                                       '("unspecified"
                                         "unspecified-fg" "unspecified-bg"))))
@@ -1439,14 +1439,14 @@ If FRAME is nil, the current FRAME is used."
            req (car conjunct)
            options (cdr conjunct)
            match (cond ((eq req 'type)
-                        (or (memq window-system options)
+                        (or (memq (window-system frame) options)
                             ;; FIXME: This should be revisited to use
                             ;; display-graphic-p, provided that the
                             ;; color selection depends on the number
                             ;; of supported colors, and all defface's
                             ;; are changed to look at number of colors
                             ;; instead of (type graphic) etc.
-                            (and (null window-system)
+                            (and (null (window-system frame))
                                  (memq 'tty options))
                             (and (memq 'motif options)
                                  (featurep 'motif))
@@ -1517,29 +1517,32 @@ If SPEC is nil, return nil."
 FRAME is the frame whose frame-local face is set.  FRAME nil means
 do it on all frames.  See `defface' for information about SPEC.
 If SPEC is nil, do nothing."
-  (let ((attrs (face-spec-choose spec frame)))
-    (when spec
-      (face-spec-reset-face face frame))
-    (while attrs
-      (let ((attribute (car attrs))
-           (value (car (cdr attrs))))
-       ;; Support some old-style attribute names and values.
-       (case attribute
-         (:bold (setq attribute :weight value (if value 'bold 'normal)))
-         (:italic (setq attribute :slant value (if value 'italic 'normal)))
-         ((:foreground :background)
-          ;; Compatibility with 20.x.  Some bogus face specs seem to
-          ;; exist containing things like `:foreground nil'.
-          (if (null value) (setq value 'unspecified)))
-         (t (unless (assq attribute face-x-resources)
-              (setq attribute nil))))
-       (when attribute
-         (set-face-attribute face frame attribute value)))
-      (setq attrs (cdr (cdr attrs)))))
-  ;; When we reset the face based on its spec, then it is unmodified
-  ;; as far as Custom is concerned.
-  (if (null frame)
-      (put (or (get face 'face-alias) face) 'face-modified nil)))
+  (if frame
+      (let ((attrs (face-spec-choose spec frame)))
+       (when spec
+         (face-spec-reset-face face frame))
+       (while attrs
+         (let ((attribute (car attrs))
+               (value (car (cdr attrs))))
+           ;; Support some old-style attribute names and values.
+           (case attribute
+             (:bold (setq attribute :weight value (if value 'bold 'normal)))
+             (:italic (setq attribute :slant value (if value 'italic 'normal)))
+             ((:foreground :background)
+              ;; Compatibility with 20.x.  Some bogus face specs seem to
+              ;; exist containing things like `:foreground nil'.
+              (if (null value) (setq value 'unspecified)))
+             (t (unless (assq attribute face-x-resources)
+                  (setq attribute nil))))
+           (when attribute
+             (set-face-attribute face frame attribute value)))
+         (setq attrs (cdr (cdr attrs)))))
+    ;; When we reset the face based on its spec, then it is unmodified
+    ;; as far as Custom is concerned.
+    (put (or (get face 'face-alias) face) 'face-modified nil)
+    ;; Set each frame according to the rules implied by SPEC.
+    (dolist (frame (frame-list))
+      (face-spec-set face spec frame))))
 
 
 (defun face-attr-match-p (face attrs &optional frame)
@@ -1683,35 +1686,40 @@ variable with `setq'; this won't have the expected effect."
                 (const light)
                 (const :tag "automatic" nil)))
 
-(defvar default-frame-background-mode nil
-  "Internal variable for the default brightness of the background.
-Emacs sets it automatically depending on the terminal type.
-The value `nil' means `dark'.  If Emacs runs in non-windowed
-mode from `xterm' or a similar terminal emulator, the value is
-`light'.  On rxvt terminals, the value depends on the environment
-variable COLORFGBG.")
 
 (defun frame-set-background-mode (frame)
   "Set up display-dependent faces on FRAME.
 Display-dependent faces are those which have different definitions
 according to the `background-mode' and `display-type' frame parameters."
   (let* ((bg-resource
-         (and window-system
+         (and (window-system frame)
               (x-get-resource "backgroundMode" "BackgroundMode")))
         (bg-color (frame-parameter frame 'background-color))
+        (terminal-bg-mode (terminal-parameter frame 'background-mode))
+        (tty-type (tty-type frame))
         (bg-mode
          (cond (frame-background-mode)
                (bg-resource
                 (intern (downcase bg-resource)))
-               ((and (null window-system) (null bg-color))
-                ;; No way to determine this automatically (?).
-                (or default-frame-background-mode 'dark))
-               ;; Unspecified frame background color can only happen
-               ;; on tty's.
-               ((member bg-color '(unspecified "unspecified-bg"))
-                (or default-frame-background-mode 'dark))
+               (terminal-bg-mode)
+               ((and (null (window-system frame))
+                     ;; Unspecified frame background color can only
+                     ;; happen on tty's.
+                     (member bg-color '(nil unspecified "unspecified-bg")))
+                ;; There is no way to determine the background mode
+                ;; automatically, so we make a guess based on the
+                ;; terminal type.
+                (if (and tty-type
+                         (string-match "^\\(xterm\\|rxvt\\|dtterm\\|eterm\\)"
+                                       tty-type))
+                    'light
+                  'dark))
                ((equal bg-color "unspecified-fg") ; inverted colors
-                (if (eq default-frame-background-mode 'light) 'dark 'light))
+                (if (and tty-type
+                         (string-match "^\\(xterm\\|rxvt\\|dtterm\\|eterm\\)"
+                                       tty-type))
+                    'dark
+                  'light))
                ((>= (apply '+ (color-values bg-color frame))
                    ;; Just looking at the screen, colors whose
                    ;; values add up to .6 of the white total
@@ -1720,7 +1728,7 @@ according to the `background-mode' and `display-type' frame parameters."
                 'light)
                (t 'dark)))
         (display-type
-         (cond ((null window-system)
+         (cond ((null (window-system frame))
                 (if (tty-display-color-p frame) 'color 'mono))
                ((display-color-p frame)
                 'color)
@@ -1817,15 +1825,24 @@ the X resource ``reverseVideo'' is present, handle that.
 Value is the new frame created."
   (setq parameters (x-handle-named-frame-geometry parameters))
   (let ((visibility-spec (assq 'visibility parameters))
-       (frame-list (frame-list))
-       (frame (x-create-frame (cons '(visibility . nil) parameters)))
+       (frame (x-create-frame `((visibility . nil) . ,parameters)))
        success)
     (unwind-protect
        (progn
+         (x-setup-function-keys frame)
          (x-handle-reverse-video frame parameters)
          (frame-set-background-mode frame)
          (face-set-after-frame-default frame)
-         (if (or (null frame-list) (null visibility-spec))
+         ;; Arrange for the kill and yank functions to set and check the clipboard.
+         (modify-frame-parameters
+          frame '((interprogram-cut-function . x-select-text)))
+         (modify-frame-parameters
+          frame '((interprogram-paste-function . x-cut-buffer-or-selection-value)))
+         ;; Make sure the tool-bar is ready to be enabled.  The
+         ;; `tool-bar-lines' frame parameter will not take effect
+         ;; without this call.
+         (tool-bar-setup frame)
+         (if (null visibility-spec)
              (make-frame-visible frame)
            (modify-frame-parameters frame (list visibility-spec)))
          (setq success t))
@@ -1884,7 +1901,7 @@ Initialize colors of certain faces from frame parameters."
       (condition-case ()
          (progn
            (face-spec-set face (face-user-default-spec face) frame)
-           (if (memq window-system '(x w32 mac))
+           (if (memq (window-system frame) '(x w32 mac))
                (make-face-x-resource-internal face frame))
            (internal-merge-in-global-face face frame))
        (error nil)))
@@ -1920,8 +1937,15 @@ created."
   (let ((frame (make-terminal-frame parameters))
        success)
     (unwind-protect
-       (progn
+       (with-selected-frame frame
          (tty-handle-reverse-video frame (frame-parameters frame))
+
+         ;; Make sure the kill and yank functions do not touch the X clipboard.
+         (modify-frame-parameters frame '((interprogram-cut-function . nil)))
+         (modify-frame-parameters frame '((interprogram-paste-function . nil)))
+
+         (set-locale-environment nil frame)
+         (tty-run-terminal-initialization frame)
          (frame-set-background-mode frame)
          (face-set-after-frame-default frame)
          (setq success t))
@@ -1929,6 +1953,52 @@ created."
        (delete-frame frame)))
     frame))
 
+(defun tty-find-type (pred type)
+  "Return the longest prefix of TYPE to which PRED returns non-nil.
+TYPE should be a tty type name such as \"xterm-16color\".
+
+The function tries only those prefixes that are followed by a
+dash or underscore in the original type name, like \"xterm\" in
+the above example."
+  (let (hyphend)
+    (while (and type
+               (not (funcall pred type)))
+      ;; Strip off last hyphen and what follows, then try again
+      (setq type
+           (if (setq hyphend (string-match "[-_][^-_]+$" type))
+               (substring type 0 hyphend)
+             nil))))
+  type)
+
+(defun tty-run-terminal-initialization (frame &optional type)
+  "Run the special initialization code for the terminal type of FRAME.
+The optional TYPE parameter may be used to override the autodetected
+terminal type to a different value."
+  (setq type (or type (tty-type frame)))
+  ;; Load library for our terminal type.
+  ;; User init file can set term-file-prefix to nil to prevent this.
+  (with-selected-frame frame
+    (unless (or (null term-file-prefix)
+               ;; Don't reinitialize the terminal each time a new
+               ;; frame is opened on it.
+               (terminal-parameter frame 'terminal-initted))
+      (let* (term-init-func)
+       ;; First, load the terminal initialization file, if it is
+       ;; available and it hasn't been loaded already.
+       (tty-find-type #'(lambda (type)
+                          (let ((file (locate-library (concat term-file-prefix type))))
+                            (and file
+                                 (or (assoc file load-history)
+                                     (load file t t)))))
+                      type)
+       ;; Next, try to find a matching initialization function, and call it.
+       (tty-find-type #'(lambda (type)
+                          (fboundp (setq term-init-func
+                                         (intern (concat "terminal-init-" type)))))
+                      type)
+       (when (fboundp term-init-func)
+         (funcall term-init-func))
+       (set-terminal-parameter frame 'terminal-initted term-init-func)))))
 
 ;; Called from C function init_display to initialize faces of the
 ;; dumped terminal frame on startup.
index 80b94a4d3ba44db6706b58d8218259d1c8e5326b..8c338bd947ab755fbf79b9241112b9f674d20bd5 100644 (file)
@@ -482,7 +482,7 @@ Returned values:
   "In remote FULLNAME, replace path with NAME.  May return nil."
   ;; Use ange-ftp or efs if loaded, but do not load them otherwise.
   (let (found)
-    (mapcar
+    (mapc
      (function (lambda (sym) (and (fboundp sym) (setq found sym))))
      '(
        efs-replace-path-component
index baa171d535a1eb98873f2fc0e811650212524b4d..18c537fed7c45a04cde7e3f9e02d079719504570 100644 (file)
@@ -280,11 +280,11 @@ be added to the cache."
           (dir-files (directory-files dir t regexp))
           )
       ;; Filter out files we don't want to see
-      (mapcar
+      (mapc
        '(lambda (file)
           (if (file-directory-p file)
               (setq dir-files (delq file dir-files))
-           (mapcar
+           (mapc
             '(lambda (regexp)
                (if (string-match regexp file)
                    (setq dir-files (delq file dir-files))))
@@ -386,7 +386,7 @@ in each directory, not to the directory list itself."
     (lambda(file)
       (or (file-directory-p file)
          (let (filtered)
-           (mapcar
+           (mapc
             (function
              (lambda(regexp)
                (and (string-match regexp file)
@@ -402,7 +402,7 @@ in each directory, not to the directory list itself."
 Each entry matches the regular expression `file-cache-buffer-default-regexp'
 or the optional REGEXP argument."
   (set-buffer file-cache-buffer)
-  (mapcar
+  (mapc
    (function (lambda (elt)
               (goto-char (point-min))
               (delete-matching-lines elt)))
@@ -443,10 +443,10 @@ or the optional REGEXP argument."
   "Delete files matching REGEXP from the file cache."
   (interactive "sRegexp: ")
   (let ((delete-list))
-    (mapcar '(lambda (elt)
-              (and (string-match regexp (car elt))
-                   (setq delete-list (cons (car elt) delete-list))))
-           file-cache-alist)
+    (mapc '(lambda (elt)
+            (and (string-match regexp (car elt))
+                 (setq delete-list (cons (car elt) delete-list))))
+         file-cache-alist)
     (file-cache-delete-file-list delete-list)
     (message "Filecache: deleted %d files from file cache"
              (length delete-list))))
@@ -456,7 +456,7 @@ or the optional REGEXP argument."
   (interactive "DDelete directory from file cache: ")
   (let ((dir (expand-file-name directory))
        (result 0))
-    (mapcar
+    (mapc
      '(lambda (entry)
        (if (file-cache-do-delete-directory dir entry)
            (setq result (1+ result))))
@@ -719,7 +719,7 @@ the name is considered already unique; only the second substitution
   "Output a list of files whose names (not including directories)
 match REGEXP."
   (let ((results))
-    (mapcar
+    (mapc
      (function
       (lambda(cache-element)
        (and (string-match regexp
@@ -768,11 +768,11 @@ match REGEXP."
     (with-current-buffer
        (get-buffer-create buf)
       (erase-buffer)
-      (mapcar
+      (mapc
        (function
-      (lambda(item)
-       (insert (nth 1 item) (nth 0 item) "\n")))
-    file-cache-alist)
+       (lambda(item)
+        (insert (nth 1 item) (nth 0 item) "\n")))
+       file-cache-alist)
       (pop-to-buffer buf)
     )))
 
index d50e447aeb7c57a2076f4495c1931bb5b3e86a03..f4881911381cf5790a04961faca1a0522f9c67fd 100644 (file)
@@ -643,7 +643,7 @@ The path separator is colon in GNU and GNU-like systems."
        (let ((trypath (parse-colon-path (getenv "CDPATH"))))
          (setq cd-path (or trypath (list "./")))))
     (if (not (catch 'found
-              (mapcar
+              (mapc
                (function (lambda (x)
                            (let ((f (expand-file-name (concat x dir))))
                              (if (file-directory-p f)
@@ -1107,6 +1107,13 @@ Interactively, the default if you just type RET is the current directory,
 but the visited file name is available through the minibuffer history:
 type M-n to pull it into the minibuffer.
 
+You can visit files on remote machines by specifying something
+like /ssh:SOME_REMOTE_MACHINE:FILE for the file name.  You can
+also visit local files as a different user by specifying
+/sudo::FILE for the file name.
+See the Info node `(tramp)Filename Syntax' in the Tramp Info
+manual, for more about this.
+
 Interactively, or if WILDCARDS is non-nil in a call from Lisp,
 expand wildcards (if any) and visit multiple files.  You can
 suppress wildcard expansion by setting `find-file-wildcards' to nil.
@@ -1123,8 +1130,9 @@ automatically choosing a major mode, use \\[find-file-literally]."
 
 (defun find-file-other-window (filename &optional wildcards)
   "Edit file FILENAME, in another window.
-May create a new window, or reuse an existing one.
-See the function `display-buffer'.
+
+Like \\[find-file] (which see), but creates a new window or reuses
+an existing one.  See the function `display-buffer'.
 
 Interactively, the default if you just type RET is the current directory,
 but the visited file name is available through the minibuffer history:
@@ -1145,8 +1153,9 @@ expand wildcards (if any) and visit multiple files."
 
 (defun find-file-other-frame (filename &optional wildcards)
   "Edit file FILENAME, in another frame.
-May create a new frame, or reuse an existing one.
-See the function `display-buffer'.
+
+Like \\[find-file] (which see), but creates a new frame or reuses
+an existing one.  See the function `display-buffer'.
 
 Interactively, the default if you just type RET is the current directory,
 but the visited file name is available through the minibuffer history:
@@ -1167,7 +1176,7 @@ expand wildcards (if any) and visit multiple files."
 
 (defun find-file-existing (filename)
    "Edit the existing file FILENAME.
-Like \\[find-file] but only allow a file that exists, and do not allow
+Like \\[find-file], but only allow a file that exists, and do not allow
 file names with wildcards."
    (interactive (nbutlast (find-file-read-args "Find existing file: " t)))
    (if (and (not (interactive-p)) (not (file-exists-p filename)))
@@ -1177,7 +1186,7 @@ file names with wildcards."
 
 (defun find-file-read-only (filename &optional wildcards)
   "Edit file FILENAME but don't allow changes.
-Like \\[find-file] but marks buffer as read-only.
+Like \\[find-file], but marks buffer as read-only.
 Use \\[toggle-read-only] to permit editing."
   (interactive
    (find-file-read-args "Find file read-only: "
@@ -1194,7 +1203,7 @@ Use \\[toggle-read-only] to permit editing."
 
 (defun find-file-read-only-other-window (filename &optional wildcards)
   "Edit file FILENAME in another window but don't allow changes.
-Like \\[find-file-other-window] but marks buffer as read-only.
+Like \\[find-file-other-window], but marks buffer as read-only.
 Use \\[toggle-read-only] to permit editing."
   (interactive
    (find-file-read-args "Find file read-only other window: "
@@ -1211,7 +1220,7 @@ Use \\[toggle-read-only] to permit editing."
 
 (defun find-file-read-only-other-frame (filename &optional wildcards)
   "Edit file FILENAME in another frame but don't allow changes.
-Like \\[find-file-other-frame] but marks buffer as read-only.
+Like \\[find-file-other-frame], but marks buffer as read-only.
 Use \\[toggle-read-only] to permit editing."
   (interactive
    (find-file-read-args "Find file read-only other frame: "
@@ -1230,6 +1239,8 @@ Use \\[toggle-read-only] to permit editing."
   "Find file FILENAME as a replacement for the file in the next window.
 This command does not select that window.
 
+See \\[find-file] for the possible forms of the FILENAME argument.
+
 Interactively, or if WILDCARDS is non-nil in a call from Lisp,
 expand wildcards (if any) and replace the file with multiple files."
   (interactive
@@ -1255,6 +1266,8 @@ expand wildcards (if any) and replace the file with multiple files."
 If the current buffer now contains an empty file that you just visited
 \(presumably by mistake), use this command to visit the file you really want.
 
+See \\[find-file] for the possible forms of the FILENAME argument.
+
 Interactively, or if WILDCARDS is non-nil in a call from Lisp,
 expand wildcards (if any) and replace the file with multiple files.
 
@@ -1319,11 +1332,14 @@ killed."
 (defun create-file-buffer (filename)
   "Create a suitably named buffer for visiting FILENAME, and return it.
 FILENAME (sans directory) is used unchanged if that name is free;
-otherwise a string <2> or <3> or ... is appended to get an unused name."
+otherwise a string <2> or <3> or ... is appended to get an unused name.
+Spaces at the start of FILENAME (sans directory) are removed."
   (let ((lastname (file-name-nondirectory filename)))
     (if (string= lastname "")
        (setq lastname filename))
-    (generate-new-buffer lastname)))
+    (save-match-data
+      (string-match "^ *\\(.*\\)" lastname)
+      (generate-new-buffer (match-string 1 lastname)))))
 
 (defun generate-new-buffer (name)
   "Create and return a buffer with a name based on NAME.
@@ -2010,8 +2026,9 @@ since only a single case-insensitive search through the alist is made."
      ("\\.tar\\'" . tar-mode)
      ;; The list of archive file extensions should be in sync with
      ;; `auto-coding-alist' with `no-conversion' coding system.
-     ("\\.\\(arc\\|zip\\|lzh\\|lha\\|zoo\\|[jew]ar\\|xpi\\)\\'" . archive-mode)
-     ("\\.\\(ARC\\|ZIP\\|LZH\\|LHA\\|ZOO\\|[JEW]AR\\|XPI\\)\\'" . archive-mode)
+     ("\\.\\(\
+arc\\|zip\\|lzh\\|lha\\|zoo\\|[jew]ar\\|xpi\\|rar\\|\
+ARC\\|ZIP\\|LZH\\|LHA\\|ZOO\\|[JEW]AR\\|XPI\\|RAR\\)\\'" . archive-mode)
      ("\\.\\(sx[dmicw]\\|odt\\)\\'" . archive-mode)    ; OpenOffice.org
      ;; Mailer puts message to be edited in
      ;; /tmp/Re.... or Message
@@ -2485,6 +2502,7 @@ asking you for confirmation."
        minor-mode-overriding-map-alist
        mode-line-buffer-identification
        mode-line-format
+       mode-line-client
        mode-line-modes
        mode-line-modified
        mode-line-mule-info
@@ -2537,7 +2555,11 @@ asking you for confirmation."
 
 (put 'c-set-style 'safe-local-eval-function t)
 
-(defun hack-local-variables-confirm (vars unsafe-vars risky-vars)
+(defun hack-local-variables-confirm (all-vars unsafe-vars risky-vars)
+  "Get confirmation before setting up local variable values.
+ALL-VARS is the list of all variables to be set up.
+UNSAFE-VARS is the list of those that aren't marked as safe or risky.
+RISKY-VARS is the list of those that are marked as risky."
   (if noninteractive
       nil
     (let ((name (if buffer-file-name
@@ -2568,7 +2590,7 @@ n  -- to ignore the local variables list.")
 !  -- to apply the local variables list, and permanently mark these
       values (*) as safe (in the future, they will be set automatically.)\n\n")
            (insert "\n\n"))
-         (dolist (elt vars)
+         (dolist (elt all-vars)
            (cond ((member elt unsafe-vars)
                   (insert "  * "))
                  ((member elt risky-vars)
@@ -3178,18 +3200,22 @@ BACKUPNAME is the backup file name, which is the old file renamed."
          ;; loosen them later, whereas it's impossible to close the
          ;; time-window of loose permissions otherwise.
          (set-default-file-modes ?\700)
-         (while (condition-case ()
-                    (progn
-                      (and (file-exists-p to-name)
-                           (delete-file to-name))
-                      (copy-file from-name to-name nil t)
-                      nil)
-                  (file-already-exists t))
-           ;; The file was somehow created by someone else between
-           ;; `delete-file' and `copy-file', so let's try again.
-           ;; rms says "I think there is also a possible race
-           ;; condition for making backup files" (emacs-devel 20070821).
-           nil))
+         (when (condition-case nil
+                   ;; Try to overwrite old backup first.
+                   (copy-file from-name to-name t t)
+                 (error t))
+           (while (condition-case nil
+                      (progn
+                        (when (file-exists-p to-name)
+                          (delete-file to-name))
+                        (copy-file from-name to-name nil t)
+                        nil)
+                    (file-already-exists t))
+             ;; The file was somehow created by someone else between
+             ;; `delete-file' and `copy-file', so let's try again.
+             ;; rms says "I think there is also a possible race
+             ;; condition for making backup files" (emacs-devel 20070821).
+             nil)))
       ;; Reset the umask.
       (set-default-file-modes umask)))
   (and modes
@@ -3218,7 +3244,7 @@ we do not remove backup version numbers, only true file version numbers."
                         (length name))
                   (if keep-backup-version
                       (length name)
-                    (or (string-match "\\.~[0-9.]+~\\'" name)
+                    (or (string-match "\\.~[-[:alnum:]:#@^._]+~\\'" name)
                         (string-match "~\\'" name)
                         (length name))))))))
 
@@ -5299,6 +5325,22 @@ With prefix arg, silently save all file-visiting buffers, then kill."
        (or (null confirm-kill-emacs)
           (funcall confirm-kill-emacs "Really exit Emacs? "))
        (kill-emacs)))
+
+(defun save-buffers-kill-terminal (&optional arg)
+  "Offer to save each buffer, then kill the current connection.
+If the current frame has no client, kill Emacs itself.
+
+With prefix arg, 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."
+  (interactive "P")
+  (let ((proc (frame-parameter (selected-frame) 'client))
+       (frame (selected-frame)))
+    (if (null proc)
+       (save-buffers-kill-emacs)
+      (server-save-buffers-kill-terminal proc arg))))
+
 \f
 ;; We use /: as a prefix to "quote" a file name
 ;; so that magic file name handlers will not apply to it.
@@ -5387,6 +5429,98 @@ With prefix arg, silently save all file-visiting buffers, then kill."
          (t
           (apply operation arguments)))))
 \f
+;; Symbolic modes and read-file-modes.
+
+(defun file-modes-char-to-who (char)
+  "Convert CHAR to a who-mask from a symbolic mode notation.
+CHAR is in [ugoa] and represents the users on which rights are applied."
+  (cond ((= char ?u) #o4700)
+       ((= char ?g) #o2070)
+       ((= char ?o) #o1007)
+       ((= char ?a) #o7777)
+       (t (error "%c: bad `who' character" char))))
+
+(defun file-modes-char-to-right (char &optional from)
+  "Convert CHAR to a right-mask from a symbolic mode notation.
+CHAR is in [rwxXstugo] and represents a right.
+If CHAR is in [Xugo], the value is extracted from FROM (or 0 if nil)."
+  (or from (setq from 0))
+  (cond ((= char ?r) #o0444)
+       ((= char ?w) #o0222)
+       ((= char ?x) #o0111)
+       ((= char ?s) #o1000)
+       ((= char ?t) #o6000)
+       ;; Rights relative to the previous file modes.
+       ((= char ?X) (if (= (logand from #o111) 0) 0 #o0111))
+       ((= char ?u) (let ((uright (logand #o4700 from)))
+                      (+ uright (/ uright #o10) (/ uright #o100))))
+       ((= char ?g) (let ((gright (logand #o2070 from)))
+                      (+ gright (/ gright #o10) (* gright #o10))))
+       ((= char ?o) (let ((oright (logand #o1007 from)))
+                      (+ oright (* oright #o10) (* oright #o100))))
+       (t (error "%c: bad right character" char))))
+
+(defun file-modes-rights-to-number (rights who-mask &optional from)
+  "Convert a right string to a right-mask from a symbolic modes notation.
+RIGHTS is the right string, it should match \"([+=-][rwxXstugo]+)+\".
+WHO-MASK is the mask number of the users on which the rights are to be applied.
+FROM (or 0 if nil) is the orginal modes of the file to be chmod'ed."
+  (let* ((num-rights (or from 0))
+        (list-rights (string-to-list rights))
+        (op (pop list-rights)))
+    (while (memq op '(?+ ?- ?=))
+      (let ((num-right 0)
+           char-right)
+       (while (memq (setq char-right (pop list-rights))
+                    '(?r ?w ?x ?X ?s ?t ?u ?g ?o))
+         (setq num-right
+               (logior num-right
+                       (file-modes-char-to-right char-right num-rights))))
+       (setq num-right (logand who-mask num-right)
+             num-rights
+             (cond ((= op ?+) (logior num-rights num-right))
+                   ((= op ?-) (logand num-rights (lognot num-right)))
+                   (t (logior (logand num-rights (lognot who-mask)) num-right)))
+             op char-right)))
+    num-rights))
+
+(defun file-modes-symbolic-to-number (modes &optional from)
+  "Convert symbolic file modes to numeric file modes.
+MODES is the string to convert, it should match
+\"[ugoa]*([+-=][rwxXstugo]+)+,...\".
+See (info \"(coreutils)File permissions\") for more information on this
+notation.
+FROM (or 0 if nil) is the orginal modes of the file to be chmod'ed."
+  (save-match-data
+    (let ((case-fold-search nil)
+         (num-modes (or from 0)))
+      (while (/= (string-to-char modes) 0)
+       (if (string-match "^\\([ugoa]*\\)\\([+=-][rwxXstugo]+\\)+\\(,\\|\\)" modes)
+           (let ((num-who (apply 'logior 0
+                                 (mapcar 'file-modes-char-to-who
+                                         (match-string 1 modes)))))
+             (when (= num-who 0)
+               (setq num-who (default-file-modes)))
+             (setq num-modes
+                   (file-modes-rights-to-number (substring modes (match-end 1))
+                                                num-who num-modes)
+                   modes (substring modes (match-end 3))))
+         (error "Parse error in modes near `%s'" (substring modes 0))))
+      num-modes)))
+
+(defun read-file-modes (&optional prompt orig-file)
+  "Read file modes in octal or symbolic notation.
+PROMPT is used as the prompt, default to `File modes (octal or symbolic): '.
+ORIG-FILE is the original file of which modes will be change."
+  (let* ((modes (or (if orig-file (file-modes orig-file) 0)
+                   (error "File not found")))
+        (value (read-string (or prompt "File modes (octal or symbolic): "))))
+    (save-match-data
+      (if (string-match "^[0-7]+" value)
+         (string-to-number value 8)
+       (file-modes-symbolic-to-number value modes)))))
+
+\f
 (define-key ctl-x-map "\C-f" 'find-file)
 (define-key ctl-x-map "\C-r" 'find-file-read-only)
 (define-key ctl-x-map "\C-v" 'find-alternate-file)
@@ -5396,7 +5530,7 @@ With prefix arg, silently save all file-visiting buffers, then kill."
 (define-key ctl-x-map "i" 'insert-file)
 (define-key esc-map "~" 'not-modified)
 (define-key ctl-x-map "\C-d" 'list-directory)
-(define-key ctl-x-map "\C-c" 'save-buffers-kill-emacs)
+(define-key ctl-x-map "\C-c" 'save-buffers-kill-terminal)
 (define-key ctl-x-map "\C-q" 'toggle-read-only)
 
 (define-key ctl-x-4-map "f" 'find-file-other-window)
index ae605e6806c9d8e0439eae172834ada95de6af8b..e5dde84785371833bb5856c38e14ecbc70e80290 100644 (file)
@@ -92,9 +92,6 @@
 
 
 ;;; Some variables
-(eval-and-compile
-  (defvar filesets-running-xemacs (string-match "XEmacs\\|Lucid" emacs-version)
-    "Non-nil means we are running XEmacs."))
 
 (defvar filesets-menu-cache nil
   "The whole filesets menu.")
 (defvar filesets-updated-buffers nil
   "A list of buffers with updated menu bars.")
 (defvar filesets-menu-use-cached-flag nil
-  "Use cached data. See `filesets-menu-ensure-use-cached' for details.")
+  "Use cached data.  See `filesets-menu-ensure-use-cached' for details.")
 (defvar filesets-update-cache-file-flag nil
   "Non-nil means the cache needs updating.")
 (defvar filesets-ignore-next-set-default nil
-  "A list of custom variables for which the next `set-default' will be
-ignored.")
+  "List of custom variables for which the next `set-default' will be ignored.")
 
 (defvar filesets-output-buffer-flag nil
   "Non-nil means the current buffer is an output buffer created by filesets.
@@ -131,7 +127,7 @@ Is buffer local variable.")
 0 means no messages at all.")
 
 (defvar filesets-menu-ensure-use-cached
-  (and filesets-running-xemacs
+  (and (featurep 'xemacs)
        (if (fboundp 'emacs-version>=)
           (not (emacs-version>= 21 5))))
   "Make sure (X)Emacs uses filesets' cache.
@@ -184,7 +180,7 @@ Like `some', return the first value of FSS-PRED that is non-nil."
 
 (defun filesets-member (fsm-item fsm-lst &rest fsm-keys)
   "Find the first occurrence of FSM-ITEM in FSM-LST.
-It is supposed to work like cl's `member*'. At the moment only the :test
+It is supposed to work like cl's `member*'.  At the moment only the :test
 key is supported."
   (let ((fsm-test (or (plist-get fsm-keys ':test)
                      (function equal))))
@@ -214,11 +210,11 @@ key is supported."
       (file-name-nondirectory (substring this 0 (- (length this) 1))))))
 
 (defun filesets-which-command (cmd)
-  "Calls \"which CMD\"."
+  "Call \"which CMD\"."
   (shell-command-to-string (format "which %s" cmd)))
 
 (defun filesets-which-command-p (cmd)
-  "Calls \"which CMD\" and returns non-nil if the command was found."
+  "Call \"which CMD\" and return non-nil if the command was found."
   (when (string-match (format "\\(/[^/]+\\)?/%s" cmd)
                      (filesets-which-command cmd))
     cmd))
@@ -252,7 +248,7 @@ key is supported."
 ;  (filesets-build-menu))
 
 ;; It seems this is a workaround for the XEmacs issue described in the
-;; doc-string of filesets-menu-ensure-use-cached. Under Emacs this is
+;; doc-string of filesets-menu-ensure-use-cached.  Under Emacs this is
 ;; essentially just `set-default'.
 (defun filesets-set-default (sym val &optional init-flag)
   "Set-default wrapper function used in conjunction with `defcustom'.
@@ -307,55 +303,55 @@ SYM to VAL and return t.  If INIT-FLAG is non-nil, set with
   :version "22.1")
 
 (defcustom filesets-menu-name "Filesets"
-  "*Filesets' menu name."
+  "Filesets' menu name."
   :set (function filesets-set-default)
   :type 'sexp
   :group 'filesets)
 
 (defcustom filesets-menu-path nil
-  "*The menu under which the filesets menu should be inserted.
+  "The menu under which the filesets menu should be inserted.
 See `add-submenu' for documentation."
   :set (function filesets-set-default)
   :type 'sexp
   :group 'filesets)
 
 (defcustom filesets-menu-before "File"
-  "*The name of a menu before which this menu should be added.
+  "The name of a menu before which this menu should be added.
 See `add-submenu' for documentation."
   :set (function filesets-set-default)
   :type 'sexp
   :group 'filesets)
 
 (defcustom filesets-menu-in-menu nil
-  "*Use that instead of `current-menubar' as the menu to change.
+  "Use that instead of `current-menubar' as the menu to change.
 See `add-submenu' for documentation."
   :set (function filesets-set-default)
   :type 'sexp
   :group 'filesets)
 
 (defcustom filesets-menu-shortcuts-flag t
-  "*Non-nil means to prepend menus with hopefully unique shortcuts."
+  "Non-nil means to prepend menus with hopefully unique shortcuts."
   :set (function filesets-set-default!)
   :type 'boolean
   :group 'filesets)
 
 (defcustom filesets-menu-shortcuts-marker "%_"
-  "*String for marking menu shortcuts."
+  "String for marking menu shortcuts."
   :set (function filesets-set-default!)
   :type 'string
   :group 'filesets)
 
-;(defcustom filesets-menu-cnvfp-flag nil
-;  "*Non-nil means show \"Convert :pattern to :files\" entry for :pattern menus."
-;  :set (function filesets-set-default!)
-;  :type 'boolean
-;  :group 'filesets)
+;;(defcustom filesets-menu-cnvfp-flag nil
+;;  "*Non-nil means show \"Convert :pattern to :files\" entry for :pattern menus."
+;;  :set (function filesets-set-default!)
+;;  :type 'boolean
+;;  :group 'filesets)
 
 (defcustom filesets-menu-cache-file
-  (if filesets-running-xemacs
+  (if (featurep 'xemacs)
       "~/.xemacs/filesets-cache.el"
     (concat user-emacs-directory "filesets-cache.el"))
-  "*File to be used for saving the filesets menu between sessions.
+  "File to be used for saving the filesets menu between sessions.
 Set this to \"\", to disable caching of menus.
 Don't forget to check out `filesets-menu-ensure-use-cached'."
   :set (function filesets-set-default)
@@ -368,16 +364,16 @@ Don't forget to check out `filesets-menu-ensure-use-cached'."
     filesets-submenus
     filesets-menu-cache
     filesets-ingroup-cache)
-  "*Stuff we want to save in `filesets-menu-cache-file'.
+  "Stuff we want to save in `filesets-menu-cache-file'.
 
 Possible uses: don't save configuration data in the main startup files
 but in filesets's own cache.  In this case add `filesets-data' to this
 list.
 
-There is a second reason for putting `filesets-data' on this list. If
+There is a second reason for putting `filesets-data' on this list.  If
 you frequently add and remove buffers on the fly to :files filesets, you
 don't need to save your customizations if `filesets-data' is being
-mirrored in the cache file. In this case the version in the cache file
+mirrored in the cache file.  In this case the version in the cache file
 is the current one, and the version in your startup file will be
 silently updated later on.
 
@@ -407,7 +403,7 @@ Don't forget to check out `filesets-menu-ensure-use-cached'."
   :group 'filesets)
 
 (defcustom filesets-cache-fill-content-hooks nil
-  "*Hooks to run when writing the contents of filesets' cache file.
+  "Hooks to run when writing the contents of filesets' cache file.
 
 The hook is called with the cache file as current buffer and the cursor
 at the last position.  I.e. each hook has to make sure that the cursor is
@@ -429,7 +425,7 @@ Don't forget to check out `filesets-menu-ensure-use-cached'."
   :group 'filesets)
 
 (defcustom filesets-cache-hostname-flag nil
-  "*Non-nil means cache the hostname.
+  "Non-nil means cache the hostname.
 If the current name differs from the cached one,
 rebuild the menu and create a new cache file."
   :set (function filesets-set-default)
@@ -437,16 +433,16 @@ rebuild the menu and create a new cache file."
   :group 'filesets)
 
 (defcustom filesets-cache-save-often-flag nil
-  "*Non-nil means save buffer on every change of the filesets menu.
+  "Non-nil means save buffer on every change of the filesets menu.
 If this variable is set to nil and if Emacs crashes, the cache and
-filesets-data could get out of sync. Set this to t if this happens from
+filesets-data could get out of sync.  Set this to t if this happens from
 time to time or if the fileset cache causes troubles."
   :set (function filesets-set-default)
   :type 'boolean
   :group 'filesets)
 
 (defcustom filesets-max-submenu-length 25
-  "*Maximum length of submenus.
+  "Maximum length of submenus.
 Set this value to 0 to turn menu splitting off.  BTW, parts of submenus
 will not be rewrapped if their length exceeds this value."
   :set (function filesets-set-default)
@@ -454,13 +450,13 @@ will not be rewrapped if their length exceeds this value."
   :group 'filesets)
 
 (defcustom filesets-max-entry-length 50
-  "*Truncate names of splitted submenus to this length."
+  "Truncate names of splitted submenus to this length."
   :set (function filesets-set-default)
   :type 'integer
   :group 'filesets)
 
 (defcustom filesets-browse-dir-function 'dired
-  "*A function or command used for browsing directories.
+  "A function or command used for browsing directories.
 When using an external command, \"%s\" will be replaced with the
 directory's name.
 
@@ -478,7 +474,7 @@ Note: You have to manually rebuild the menu if you change this value."
   :group 'filesets)
 
 (defcustom filesets-open-file-function 'filesets-find-or-display-file
-  "*The function used for opening files.
+  "The function used for opening files.
 
 `filesets-find-or-display-file' ... Filesets' default function for
 visiting files.  This function checks if an external viewer is defined
@@ -486,7 +482,7 @@ for a specific file type.  Either this viewer, if defined, or
 `find-file' will be used to visit a file.
 
 `filesets-find-file' ... An alternative function that always uses
-`find-file'. If `filesets-be-docile-flag' is true, a file, which isn't
+`find-file'.  If `filesets-be-docile-flag' is true, a file, which isn't
 readable, will not be opened.
 
 Caveat: Changes will take effect only after rebuilding the menu."
@@ -501,7 +497,7 @@ Caveat: Changes will take effect only after rebuilding the menu."
   :group 'filesets)
 
 (defcustom filesets-save-buffer-function 'save-buffer
-  "*The function used to save a buffer.
+  "The function used to save a buffer.
 Caveat: Changes will take effect after rebuilding the menu."
   :set (function filesets-set-default)
   :type '(choice :tag "Function:"
@@ -512,10 +508,10 @@ Caveat: Changes will take effect after rebuilding the menu."
   :group 'filesets)
 
 (defcustom filesets-find-file-delay
-  (if (and filesets-running-xemacs gutter-buffers-tab-visible-p)
+  (if (and (featurep 'xemacs) gutter-buffers-tab-visible-p)
       0.5
     0)
-  "*Delay before calling find-file.
+  "Delay before calling `find-file'.
 This is for calls via `filesets-find-or-display-file'
 or `filesets-find-file'.
 
@@ -525,7 +521,7 @@ Set this to 0, if you don't use XEmacs' buffer tabs."
   :group 'filesets)
 
 (defcustom filesets-be-docile-flag nil
-  "*Non-nil means don't complain if a file or a directory doesn't exist.
+  "Non-nil means don't complain if a file or a directory doesn't exist.
 This is useful if you want to use the same startup files in different
 computer environments."
   :set (function filesets-set-default)
@@ -533,19 +529,19 @@ computer environments."
   :group 'filesets)
 
 (defcustom filesets-sort-menu-flag t
-  "*Non-nil means sort the filesets menu alphabetically."
+  "Non-nil means sort the filesets menu alphabetically."
   :set (function filesets-set-default)
   :type 'boolean
   :group 'filesets)
 
 (defcustom filesets-sort-case-sensitive-flag t
-  "*Non-nil means sorting of the filesete menu is case sensitive."
+  "Non-nil means sorting of the filesete menu is case sensitive."
   :set (function filesets-set-default)
   :type 'boolean
   :group 'filesets)
 
 (defcustom filesets-tree-max-level 3
-  "*Maximum scan depth for directory trees.
+  "Maximum scan depth for directory trees.
 A :tree fileset is defined by a base directory the contents of which
 will be recursively added to the menu.  `filesets-tree-max-level' tells up
 to which level the directory structure should be scanned/listed,
@@ -579,7 +575,7 @@ including directory trees to the menu can take a lot of memory."
     ("Run Shell Command"
      filesets-cmd-shell-command
      (filesets-cmd-shell-command-getargs)))
-  "*Commands to run on filesets.
+  "Commands to run on filesets.
 An association list of names, functions, and an argument list (or a
 function that returns one) to be run on a filesets' files.
 
@@ -607,16 +603,16 @@ the filename."
 
 (defcustom filesets-external-viewers
   (let
-;      ((ps-cmd  (or (and (boundp 'my-ps-viewer) my-ps-viewer)
-;                  (filesets-select-command "ggv gv")))
-;       (pdf-cmd (or (and (boundp 'my-ps-viewer) my-pdf-viewer)
-;                  (filesets-select-command "xpdf acroread")))
-;       (dvi-cmd (or (and (boundp 'my-ps-viewer) my-dvi-viewer)
-;                  (filesets-select-command "xdvi tkdvi")))
-;       (doc-cmd (or (and (boundp 'my-ps-viewer) my-doc-viewer)
-;                  (filesets-select-command "antiword")))
-;       (pic-cmd (or (and (boundp 'my-ps-viewer) my-pic-viewer)
-;                  (filesets-select-command "gqview ee display"))))
+      ;; ((ps-cmd  (or (and (boundp 'my-ps-viewer) my-ps-viewer)
+      ;;           (filesets-select-command "ggv gv")))
+      ;;  (pdf-cmd (or (and (boundp 'my-ps-viewer) my-pdf-viewer)
+      ;;           (filesets-select-command "xpdf acroread")))
+      ;;  (dvi-cmd (or (and (boundp 'my-ps-viewer) my-dvi-viewer)
+      ;;           (filesets-select-command "xdvi tkdvi")))
+      ;;  (doc-cmd (or (and (boundp 'my-ps-viewer) my-doc-viewer)
+      ;;           (filesets-select-command "antiword")))
+      ;;  (pic-cmd (or (and (boundp 'my-ps-viewer) my-pic-viewer)
+      ;;           (filesets-select-command "gqview ee display"))))
       ((ps-cmd  "ggv")
        (pdf-cmd "xpdf")
        (dvi-cmd "xdvi")
@@ -644,7 +640,7 @@ the filename."
        ((:ignore-on-open-all t)
        (:ignore-on-read-text t)
        (:constraint-flag ,pic-cmd)))))
-  "*Association list of file patterns and external viewers for use with
+  "Association list of file patterns and external viewers for use with
 `filesets-find-or-display-file'.
 
 Has the form ((FILE-PATTERN VIEWER PROPERTIES) ...), VIEWER being either a
@@ -674,21 +670,20 @@ variables my-ps-viewer, my-pdf-viewer, my-dvi-viewer, my-pic-viewer.
 In order to view pdf or rtf files in an Emacs buffer, you could use these:
 
 
-      \(\"^.+\\.pdf$\" \"pdftotext\"
+      \(\"^.+\\\\.pdf\\\\'\" \"pdftotext\"
        \((:capture-output t)
        \(:args (\"%S - | fmt -w \" window-width))
        \(:ignore-on-read-text t)
        \(:constraintp (lambda ()
                        \(and \(filesets-which-command-p \"pdftotext\")
                             \(filesets-which-command-p \"fmt\"))))))
-      \(\"^.+\\.rtf$\" \"rtf2htm\"
+      \(\"^.+\\\\.rtf\\\\'\" \"rtf2htm\"
        \((:capture-output t)
        \(:args (\"%S 2> /dev/null | w3m -dump -T text/html\"))
        \(:ignore-on-read-text t)
        \(:constraintp (lambda ()
                        \(and (filesets-which-command-p \"rtf2htm\")
-                            \(filesets-which-command-p \"w3m\"))))))
-"
+                            \(filesets-which-command-p \"w3m\"))))))"
   :set (function filesets-set-default)
   :type '(repeat :tag "Viewer"
                 (list :tag "Definition"
@@ -814,7 +809,7 @@ In order to view pdf or rtf files in an Emacs buffer, you could use these:
                              emacs-wiki-directories
                            nil))))))))
 
-  "*Inclusion group definitions.
+  "Inclusion group definitions.
 
 Define how to find included file according to a file's mode (being
 defined by a file pattern).
@@ -865,8 +860,8 @@ Stubs:
 
 First, a stub is a file that shows up in the menu but will not be
 included in an ingroup's file listing -- i.e. filesets will never
-operate on this file automatically. Secondly, in opposition to normal
-files stubs are not scanned for new inclusion groups. This is useful if
+operate on this file automatically.  Secondly, in opposition to normal
+files stubs are not scanned for new inclusion groups.  This is useful if
 you want to have quick access to library headers.
 
 In the menu, an asterisk is appended to the stub's name.
@@ -937,9 +932,8 @@ With duplicates removed, it would be:
   :group 'filesets)
 (put 'filesets-ingroup-patterns 'risky-local-variable t)
 
-(defcustom filesets-data
-  nil
-  "*Fileset definitions.
+(defcustom filesets-data nil
+  "Fileset definitions.
 
 A fileset is either a list of files, a file pattern, a base directory
 and a search pattern (for files), or a base file.  Changes to this
@@ -1065,27 +1059,27 @@ defined in `filesets-ingroup-patterns'."
 
 
 (defcustom filesets-query-user-limit 15
-  "*Query the user before opening a fileset with that many files."
+  "Query the user before opening a fileset with that many files."
   :set (function filesets-set-default)
   :type 'integer
   :group 'filesets)
 \f
 ;;; Emacs compatibility
 (eval-and-compile
-  (if filesets-running-xemacs
+  (if (featurep 'xemacs)
       (fset 'filesets-error 'error)
 
     (require 'easymenu)
 
     (defun filesets-error (class &rest args)
       "`error' wrapper."
-      (error (mapconcat 'identity args " ")))
+      (error "%s" (mapconcat 'identity args " ")))
 
     ))
 
 (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."
+  "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 "^\\.+/$" x))
@@ -1093,7 +1087,7 @@ non-nil, remove all directory names."
                                   (not (string-match "[:/\\]$" x))
                                 (string-match "[:/\\]$" x))))))
 
-(defun filesets-conditional-sort (lst &optional access-fn simply-do-it)
+(defun filesets-conditional-sort (lst &optional access-fn)
   "Return a sorted copy of LST, LST being a list of strings.
 If `filesets-sort-menu-flag' is nil, return LST itself.
 
@@ -1116,10 +1110,11 @@ If SIMPLY-DO-IT is non-nil, the list is sorted regardless of
 
 (defun filesets-directory-files (dir &optional
                                     pattern what full-flag match-dirs-flag)
-  "Get WHAT (:files or :dirs) in DIR. If PATTERN is provided return only
-those entries matching this regular expression. If MATCH-DIRS-FLAG is
-non-nil, also match directory entries. Return full path if FULL-FLAG is
-non-nil."
+  "Get WHAT (:files or :dirs) in DIR.
+If PATTERN is provided return only those entries matching this
+regular expression.
+If MATCH-DIRS-FLAG is non-nil, also match directory entries.
+Return full path if FULL-FLAG is non-nil."
   (filesets-message 2 "Filesets: scanning %S" dir)
   (cond
    ((file-exists-p dir)
@@ -1262,7 +1257,7 @@ non-nil."
      filesets-external-viewers)))
 
 (defun filesets-filetype-property (filename event &optional entry)
-  "Returns non-nil if a file of a specific type has special flags/tags.
+  "Return non-nil if a file of a specific type has special flags/tags.
 
 Events (corresponding tag):
 
@@ -1291,7 +1286,7 @@ on-close-all ... not used"
                        nil t)))
 
 (defun filesets-filetype-get-prop (property filename &optional entry)
-  "Returns PROPERTY for filename -- use ENTRY if provided."
+  "Return PROPERTY for filename -- use ENTRY if provided."
   (let ((def (filesets-eviewer-get-props
              (or entry
                  (filesets-get-external-viewer filename)))))
@@ -1411,7 +1406,7 @@ not be opened."
                       name args)))))
 
 (defun filesets-get-fileset-name (something)
-  "Get SOMETHING's name. (Don't ask.)"
+  "Get SOMETHING's name (Don't ask)."
   (cond
    ((listp something)
     (car something))
@@ -1419,11 +1414,11 @@ not be opened."
     something)))
 
 (defun filesets-data-get-name (entry)
-  "Access to `filesets-data'.  Get the entry's name"
+  "Access to `filesets-data'.  Get the entry's name."
   (car entry))
 
 (defun filesets-data-get-data (entry)
-  "Access to `filesets-data'.  Get the entry's data section"
+  "Access to `filesets-data'.  Get the entry's data section."
   (cdr entry))
 
 (defun filesets-alist-get (alist key &optional default carp)
@@ -1534,8 +1529,8 @@ Use FILESET-ENTRY for finding the save function, if provided."
   (filesets-data-get entry ':ingroup nil t))
 
 (defun filesets-file-open (open-function file-name &optional fileset-name)
-  "Open FILE-NAME using OPEN-FUNCTION. If OPEN-FUNCTION is nil, its
-value will be deduced from FILESET-NAME."
+  "Open FILE-NAME using OPEN-FUNCTION.
+If OPEN-FUNCTION is nil, its value will be deduced from FILESET-NAME."
   (let ((open-function (or open-function
                           (filesets-entry-get-open-fn fileset-name))))
     (if (file-readable-p file-name)
@@ -1597,7 +1592,7 @@ SAVE-FUNCTION takes no argument, but works on the current buffer."
   (newline))
 
 (defun filesets-run-cmd--repl-fn (arg &optional format-fn)
-  "Helper function for `filesets-run-cmd'. Apply FORMAT-FN to arg.
+  "Helper function for `filesets-run-cmd'.  Apply FORMAT-FN to arg.
 Replace <file-name> or <<file-name>> with filename."
   (funcall format-fn (cond
                      ((equal arg "<file-name>")
@@ -1787,7 +1782,7 @@ Use LOOKUP-NAME for deducing the save-function, if provided."
       (filesets-error 'error "Filesets: Unknown fileset: " name))))
 
 (defun filesets-add-buffer (&optional name buffer)
-  "Add BUFFER (or current-buffer) to the fileset called NAME.
+  "Add BUFFER (or current buffer) to the fileset called NAME.
 User will be queried, if no fileset name is provided."
   (interactive)
   (let* ((buffer (or buffer
@@ -1822,7 +1817,7 @@ User will be queried, if no fileset name is provided."
            (message "Filesets: Can't add '%s' to fileset '%s'" this name)))))))
 
 (defun filesets-remove-buffer (&optional name buffer)
-  "Remove BUFFER (or current-buffer) to fileset NAME.
+  "Remove BUFFER (or current buffer) to fileset NAME.
 User will be queried, if no fileset name is provided."
   (interactive)
   (let* ((buffer (or buffer
@@ -2014,11 +2009,11 @@ LOOKUP-NAME is used as lookup name for retrieving fileset specific settings."
   "Access to `filesets-ingroup-patterns'.  Extract remove-duplicates-flag."
   (filesets-ingroup-get-data master 1))
 
-(defun filesets-ingroup-collect-finder (patt case-sencitivep)
+(defun filesets-ingroup-collect-finder (patt case-sensitivep)
   "Helper function for `filesets-ingroup-collect'.  Find pattern PATT."
   (let ((cfs case-fold-search)
        (rv  (progn
-              (setq case-fold-search (not case-sencitivep))
+              (setq case-fold-search (not case-sensitivep))
               (re-search-forward patt nil t))))
     (setq case-fold-search cfs)
     rv))
@@ -2107,8 +2102,8 @@ LOOKUP-NAME is used as lookup name for retrieving fileset specific settings."
        (filesets-message 2 "Filesets: no patterns defined for %S" master)))))
 
 (defun filesets-ingroup-collect-build-menu (fs flist &optional other-count)
-  "Helper function for `filesets-ingroup-collect'. Build the menu.
-FS is a fileset's name. FLIST is a list returned by
+  "Helper function for `filesets-ingroup-collect'.  Build the menu.
+FS is a fileset's name.  FLIST is a list returned by
 `filesets-ingroup-collect-files'."
   (if (null flist)
       nil
@@ -2150,7 +2145,7 @@ FS is a fileset's name. FLIST is a list returned by
                               ,@(filesets-get-menu-epilog master ':ingroup fsn)))
                          `([,nm (filesets-file-open nil ',master ',fsn)])))))))))
 
-(defun filesets-ingroup-collect (fs remdupl-flag master &optional depth)
+(defun filesets-ingroup-collect (fs remdupl-flag master)
   "Collect names of included files & build submenu."
   (filesets-ingroup-cache-put master nil)
   (filesets-message 2 "Filesets: parsing %S" master)
@@ -2306,7 +2301,7 @@ Construct a shortcut from COUNT."
                                                lookup-name t)))))))))))
 
 (defun filesets-remove-from-ubl (&optional buffer)
-  "BUFFER or current-buffer require update of the filesets menu."
+  "BUFFER or current buffer require update of the filesets menu."
   (let ((b (or buffer
               (current-buffer))))
     (if (member b filesets-updated-buffers)
@@ -2470,7 +2465,7 @@ We apologize for the inconvenience."))
        (find-file-other-window cf))
       (filesets-error 'error msg))))
 
-(defun filesets-update (version cached-version)
+(defun filesets-update (cached-version)
   "Do some cleanup after updating filesets.el."
   (cond
    ((or (not cached-version)
@@ -2492,7 +2487,7 @@ We apologize for the inconvenience."))
        (progn
          (setq filesets-update-cache-file-flag nil)
          t)
-      (filesets-update filesets-version filesets-cache-version)))
+      (filesets-update filesets-cache-version)))
    (t
     (setq filesets-update-cache-file-flag t)
     nil)))
@@ -2504,7 +2499,7 @@ We apologize for the inconvenience."))
 (defun filesets-init ()
   "Filesets initialization.
 Set up hooks, load the cache file -- if existing -- and build the menu."
-  (add-hook (if filesets-running-xemacs 'activate-menubar-hook 'menu-bar-update-hook)
+  (add-hook (if (featurep 'xemacs) 'activate-menubar-hook 'menu-bar-update-hook)
            (function filesets-build-menu-maybe))
   (add-hook 'kill-buffer-hook (function filesets-remove-from-ubl))
   (add-hook 'first-change-hook (function filesets-reset-filename-on-change))
@@ -2522,9 +2517,9 @@ Set up hooks, load the cache file -- if existing -- and build the menu."
 
 (provide 'filesets)
 
-;;; Local Variables:
-;;; sentence-end-double-space:t
-;;; End:
+;; Local Variables:
+;; sentence-end-double-space:t
+;; End:
 
-;;; arch-tag: 2c03f85f-c3df-4cec-b0a3-b46fd5592d70
+;; arch-tag: 2c03f85f-c3df-4cec-b0a3-b46fd5592d70
 ;;; filesets.el ends here
index 9b1f3275dfc97386392b49e26b5c2bab0e5673a8..4c8d8bea215631cfebde2bc3bb9189f0c617dba3 100644 (file)
@@ -270,7 +270,7 @@ It is a function which takes two arguments, the directory and its parent."
     ;; No analog for find-lisp?
     (insert find-lisp-line-indent "\n")
     ;; Run the find function
-    (mapcar
+    (mapc
      (function
       (lambda(file)
        (find-lisp-find-dired-insert-file
index 26830ae1c3ab4f06dd37f243d28d57f4c1b790cc..d1438dbf17e071fcc2f05e9a886f59bdc5c8da93 100644 (file)
@@ -134,7 +134,7 @@ no arguments compiles from `load-path'."
       (insert ";; Don't edit this file.  It's generated by finder.el\n\n")
       (insert ";;; Code:\n")
       (insert "\n(setq finder-package-info '(\n")
-      (mapcar
+      (mapc
        (lambda (d)
         (when (file-exists-p (directory-file-name d))
           (message "Directory %s" d)
@@ -179,12 +179,12 @@ no arguments compiles from `load-path'."
 \(provide '" (file-name-sans-extension
              (file-name-nondirectory generated-finder-keywords-file)) ")
 
-;;; Local Variables:
-;;; version-control: never
-;;; no-byte-compile: t
-;;; no-update-autoloads: t
-;;; End:
-;;; " (file-name-nondirectory generated-finder-keywords-file) " ends here\n")
+;; Local Variables:
+;; version-control: never
+;; no-byte-compile: t
+;; no-update-autoloads: t
+;; End:
+\;;; " (file-name-nondirectory generated-finder-keywords-file) " ends here\n")
       (kill-buffer "*finder-scratch*")
       (eval-buffer) ;; So we get the new keyword list immediately
       (basic-save-buffer))))
@@ -207,7 +207,7 @@ no arguments compiles from `load-path'."
 (defun finder-mouse-face-on-line ()
   "Put `mouse-face' and `help-echo' properties on the previous line."
   (save-excursion
-    (previous-line 1)
+    (forward-line -1)
     (unless finder-help-echo
       (setq finder-help-echo
            (let* ((keys1 (where-is-internal 'finder-select
@@ -372,5 +372,5 @@ finder directory, \\[finder-exit] = quit, \\[finder-summary] = help")))
 \f
 (provide 'finder)
 
-;;; arch-tag: ec85ff49-8cb8-41f5-a63f-9131d53ce2c5
+;; arch-tag: ec85ff49-8cb8-41f5-a63f-9131d53ce2c5
 ;;; finder.el ends here
index 87663fae9f79796efff220ccb3d10a0a0864e9d3..e6538e5a350b2cae045bd6ae273116e5f074b562 100644 (file)
@@ -35,7 +35,7 @@
 ;; The feeling of a "virtual window" has been accomplished by the use
 ;; of two major techniques:
 ;;
-;; * The windows always displays adjacent sections of the buffer.
+;; * The windows always display adjacent sections of the buffer.
 ;;   This means that whenever one window is moved, all the
 ;;   others will follow.  (Hence the name Follow Mode.)
 ;;
@@ -46,8 +46,8 @@
 ;;
 ;; Follow mode comes to its prime when a large screen and two
 ;; side-by-side window are used.  The user can, with the help of Follow
-;; mode, use two full-height windows as though they would have been
-;; one.  Imagine yourself editing a large function, or section of text,
+;; mode, use two full-height windows as though they are one.
+;; Imagine yourself editing a large function, or section of text,
 ;; and being able to use 144 lines instead of the normal 72... (your
 ;; mileage may vary).
 
@@ -77,7 +77,7 @@
 ;;
 ;;   As you can see, the right-hand window starts at line 73, the line
 ;;   immediately below the end of the left-hand window.  As long as
-;;   `follow-mode' is active, the two windows will follow eachother!
+;;   `follow-mode' is active, the two windows will follow each other!
 ;;
 ;; * Play around and enjoy! Scroll one window and watch the other.
 ;;   Jump to the beginning or end.  Press `Cursor down' at the last
 ;; (global-set-key [f7] 'follow-delete-other-windows-and-split)
 
 
-;; There exists two system variables that controls the appearence of
-;; lines that are wider than the window containing them.  The default
-;; is to truncate long lines whenever a window isn't as wide as the
-;; frame.
+;; There exist two system variables that control the appearence of
+;; lines wider than the window containing them.  The default is to
+;; truncate long lines whenever a window isn't as wide as the frame.
 ;;
 ;; To make sure lines are never truncated, please place the following
 ;; lines in your init file:
 
 
 ;; The correct way to cofigurate Follow mode, or any other mode for
-;; that matter, is to create one (or more) function that does
-;; whatever you would like to do.  The function is then added to
+;; that matter, is to create one or more functions that do
+;; whatever you would like to do.  These functions are then added to
 ;; a hook.
 ;;
 ;; When `Follow' mode is activated, functions stored in the hook
 
 ;; Usage:
 ;;
-;; To activate issue the command "M-x follow-mode"
-;; and press return.  To deactivate, do it again.
+;; To activate, issue the command "M-x follow-mode"
+;; and press Return.  To deactivate, do it again.
 ;;
 ;; The following is a list of commands useful when follow-mode is active.
 ;;
 ;;             Like `follow-scroll-up', but in the other direction.
 ;;
 ;;     follow-delete-other-windows-and-split    C-c . 1
-;;             Maximise the visible area of the current buffer,
+;;             Maximize the visible area of the current buffer,
 ;;             and enter Follow Mode.  This is a very convenient
-;;             way to start Follow Mode, hence it is recomended
-;;             that this command is added to the global keymap.
+;;             way to start Follow Mode, hence we recomend that
+;;             this command be added to the global keymap.
 ;;
 ;;     follow-recenter                          C-c . C-l
 ;;             Place the point in the center of the middle window,
 ;;             in this frame.
 ;;
 ;;     follow-switch-to-buffer-all              C-c . C-b
-;;             Switch buffer in all windows in the active frame.
+;;             Switch buffer in all windows in the selected frame.
 ;;
 ;;     follow-switch-to-current-buffer-all
 ;;             Show the current buffer in all windows on the current
 ;;
 ;; In an ideal world, follow mode would have been implemented in the
 ;; kernel of the display routines, making sure that the windows (using
-;; follow mode) ALWAYS are aligned.  On planet earth, however, we must
+;; follow mode) ALWAYS are aligned.  On planet Earth, however, we must
 ;; accept a solution where we ALMOST ALWAYS can make sure that the
 ;; windows are aligned.
 ;;
 ;; Should someone come up with a better solution, please let me
 ;; know.
 
+(require 'easymenu)
+
 (eval-when-compile
   (if (or (featurep 'bytecomp)
          (featurep 'byte-compile))
   :group 'convenience)
 
 (defcustom follow-mode-hook nil
-  "Hooks to run when Follow mode is turned on."
+  "Normal hook run by `follow-mode'."
   :type 'hook
   :group 'follow)
 
   "Hooks to run when Follow mode is turned off."
   :type 'hook
   :group 'follow)
-
+(make-obsolete-variable 'follow-mode-off-hook 'follow-mode-hook "22.2")
 
 ;;{{{ Keymap/Menu
 
@@ -517,26 +518,23 @@ If the variable `follow-intercept-processes' is non-nil, Follow mode
 will listen to the output of processes and redisplay accordingly.
 \(This is the default.)
 
-When Follow mode is switched on, the hook `follow-mode-hook'
-is called.  When turned off, `follow-mode-off-hook' is called.
+This command runs the normal hook `follow-mode-hook'.
 
 Keys specific to Follow mode:
 \\{follow-mode-map}"
   :keymap follow-mode-map
-  (if (and follow-mode follow-intercept-processes)
-      (follow-intercept-process-output))
+  (when (and follow-mode follow-intercept-processes)
+    (follow-intercept-process-output))
   (cond (follow-mode ; On
          ;; XEmacs: If this is non-nil, the window will scroll before
          ;; the point will have a chance to get into the next window.
-         (if (boundp 'scroll-on-clipped-lines)
-             (setq scroll-on-clipped-lines nil))
+         (when (boundp 'scroll-on-clipped-lines)
+          (setq scroll-on-clipped-lines nil))
          (force-mode-line-update)
-         (add-hook 'post-command-hook 'follow-post-command-hook t)
-         (run-hooks 'follow-mode-hook))
+         (add-hook 'post-command-hook 'follow-post-command-hook t))
 
         ((not follow-mode) ; Off
-         (force-mode-line-update)
-         (run-hooks 'follow-mode-off-hook))))
+         (force-mode-line-update))))
 
 ;;}}}
 ;;{{{ Find file hook
@@ -1968,13 +1966,13 @@ report this using the `report-emacs-bug' function."
   (follow-invalidate-cache)
 
   ;; Normally, if the display has been changed, it is redrawn.  All
-  ;; windows showing only the end of a buffer is unconditionally
-  ;; recentered, we can't prevent it by calling
+  ;; windows showing only the end of a buffer are unconditionally
+  ;; recentered; we can't prevent that by calling
   ;; `follow-avoid-tail-recenter'.
   ;;
-  ;; By performing a redisplay on our own, Emacs need not perform
-  ;; the above described redisplay.  (However, bu performing it when
-  ;; there are input available just seems to make things worse.)
+  ;; We force a redisplay here on our own, so Emacs does need to.
+  ;; (However, redisplaying when there's input available just seems
+  ;; to make things worse, so we exclude that case.)
   (if (and follow-avoid-tail-recenter-p
           (not (input-pending-p)))
       (sit-for 0)))
index e254b040ce7d23a7b63d3d8504114831ecf6d606..d7882d3e988f602fea017896325df1f7c8751044 100644 (file)
@@ -2228,7 +2228,7 @@ other modes in which C preprocessor directives are used. e.g. `asm-mode' and
      `(;; Control structures.  Emacs Lisp forms.
        (,(concat
          "(" (regexp-opt
-              '("cond" "if" "while" "while-no-input" "let" "let*"
+              '("cond" "if" "while" "while-no-input" "let" "let*" "let-environment"
                 "prog" "progn" "progv" "prog1" "prog2" "prog*"
                 "inline" "lambda" "save-restriction" "save-excursion"
                 "save-window-excursion" "save-selected-window"
@@ -2240,7 +2240,7 @@ other modes in which C preprocessor directives are used. e.g. `asm-mode' and
                 "with-current-buffer" "with-electric-help"
                 "with-local-quit" "with-no-warnings"
                 "with-output-to-string" "with-output-to-temp-buffer"
-                "with-selected-window" "with-syntax-table"
+                "with-selected-window" "with-selected-frame" "with-syntax-table"
                 "with-temp-buffer" "with-temp-file" "with-temp-message"
                 "with-timeout" "with-timeout-handler") t)
          "\\>")
index 3246efc31a1db2057fc02d302df197030959d149..d968880426681fd5a0c8aba698d6ed4dc87f8ddf 100644 (file)
 
 ;;; Code:
 
-(defvar frame-creation-function nil
-  "Window-system dependent function to call to create a new frame.
-The window system startup file should set this to its frame creation
-function, which should take an alist of parameters as its argument.")
+(defvar frame-creation-function-alist
+  (list (cons nil
+             (if (fboundp 'tty-create-frame-with-faces)
+                 'tty-create-frame-with-faces
+                (lambda (parameters)
+                  (error "Can't create multiple frames without a window system")))))
+  "Alist of window-system dependent functions to call to create a new frame.
+The window system startup file should add its frame creation
+function to this list, which should take an alist of parameters
+as its argument.")
+
+(defvar window-system-default-frame-alist nil
+  "Alist of window-system dependent default frame parameters.
+You can set this in your `.emacs' file; for example,
+
+    ;; Disable menubar and toolbar on the console, but enable them under X.
+    (setq window-system-default-frame-alist
+          '((x (menu-bar-lines . 1) (tool-bar-lines . 1))
+            (nil (menu-bar-lines . 0) (tool-bar-lines . 0))))
+
+Parameters specified here supersede the values given in `default-frame-alist'.")
 
 ;; The initial value given here used to ask for a minibuffer.
 ;; But that's not necessary, because the default is to have one.
@@ -189,7 +206,9 @@ Pass it BUFFER as first arg, and (cdr ARGS) gives the rest of the args."
 (defun frame-initialize ()
   "Create an initial frame if necessary."
   ;; Are we actually running under a window system at all?
-  (if (and window-system (not noninteractive) (not (eq window-system 'pc)))
+  (if (and initial-window-system
+          (not noninteractive)
+          (not (eq initial-window-system 'pc)))
       (progn
        ;; Turn on special-display processing only if there's a window system.
        (setq special-display-function 'special-display-popup-frame)
@@ -206,6 +225,9 @@ Pass it BUFFER as first arg, and (cdr ARGS) gives the rest of the args."
                  (setq frame-initial-frame-alist
                        (cons '(horizontal-scroll-bars . t)
                              frame-initial-frame-alist)))
+             (setq frame-initial-frame-alist
+                   (cons (cons 'window-system initial-window-system)
+                         frame-initial-frame-alist))
              (setq default-minibuffer-frame
                    (setq frame-initial-frame
                          (make-frame frame-initial-frame-alist)))
@@ -215,20 +237,13 @@ Pass it BUFFER as first arg, and (cdr ARGS) gives the rest of the args."
              ;; because that would override explicit user resizing.
              (setq initial-frame-alist
                    (frame-remove-geometry-params initial-frame-alist))))
+       ;; Copy the environment of the Emacs process into the new frame.
+       (set-frame-parameter frame-initial-frame 'environment
+                            (frame-parameter terminal-frame 'environment))
        ;; At this point, we know that we have a frame open, so we
        ;; can delete the terminal frame.
        (delete-frame terminal-frame)
-       (setq terminal-frame nil))
-
-    ;; No, we're not running a window system.  Use make-terminal-frame if
-    ;; we support that feature, otherwise arrange to cause errors.
-    (or (eq window-system 'pc)
-       (setq frame-creation-function
-             (if (fboundp 'tty-create-frame-with-faces)
-                 'tty-create-frame-with-faces
-                (lambda (parameters)
-                  (error
-                   "Can't create multiple frames without a window system")))))))
+       (setq terminal-frame nil))))
 
 (defvar frame-notice-user-settings t
   "Non-nil means function `frame-notice-user-settings' wasn't run yet.")
@@ -238,7 +253,9 @@ Pass it BUFFER as first arg, and (cdr ARGS) gives the rest of the args."
 ;; information to which we must react; do what needs to be done.
 (defun frame-notice-user-settings ()
   "Act on user's init file settings of frame parameters.
-React to settings of `default-frame-alist', `initial-frame-alist' there."
+React to settings of `initial-frame-alist',
+`window-system-default-frame-alist' and `default-frame-alist'
+there (in decreasing order of priority)."
   ;; Make menu-bar-mode and default-frame-alist consistent.
   (when (boundp 'menu-bar-mode)
     (let ((default (assq 'menu-bar-lines default-frame-alist)))
@@ -253,20 +270,30 @@ React to settings of `default-frame-alist', `initial-frame-alist' there."
   ;; parameter in default-frame-alist in a dumped Emacs, which is not
   ;; what we want.
   (when (and (boundp 'tool-bar-mode)
-            (not noninteractive))
+            (not noninteractive))
     (let ((default (assq 'tool-bar-lines default-frame-alist)))
       (if default
-         (setq tool-bar-mode (not (eq (cdr default) 0)))
-       (setq default-frame-alist
-             (cons (cons 'tool-bar-lines (if tool-bar-mode 1 0))
-                   default-frame-alist)))))
+         (setq tool-bar-mode (not (eq (cdr default) 0)))
+       ;; If Emacs was started on a tty, changing default-frame-alist
+       ;; would disable the toolbar on X frames created later.  We
+       ;; want to keep the default of showing a toolbar under X even
+       ;; in this case.
+       ;;
+       ;; If the user explicitly called `tool-bar-mode' in .emacs,
+       ;; then default-frame-alist is already changed anyway.
+       (when initial-window-system
+         (setq default-frame-alist
+               (cons (cons 'tool-bar-lines (if tool-bar-mode 1 0))
+                     default-frame-alist))))))
 
   ;; Creating and deleting frames may shift the selected frame around,
   ;; and thus the current buffer.  Protect against that.  We don't
   ;; want to use save-excursion here, because that may also try to set
   ;; the buffer of the selected window, which fails when the selected
   ;; window is the minibuffer.
-  (let ((old-buffer (current-buffer)))
+  (let ((old-buffer (current-buffer))
+       (window-system-frame-alist (cdr (assq initial-window-system
+                                             window-system-default-frame-alist))))
 
     (when (and frame-notice-user-settings
               (null frame-initial-frame))
@@ -278,8 +305,9 @@ React to settings of `default-frame-alist', `initial-frame-alist' there."
        ;; Can't modify the minibuffer parameter, so don't try.
        (setq parms (delq (assq 'minibuffer parms) parms))
        (modify-frame-parameters nil
-                                (if (null window-system)
+                                (if (null initial-window-system)
                                     (append initial-frame-alist
+                                            window-system-frame-alist
                                             default-frame-alist
                                             parms
                                             nil)
@@ -287,7 +315,7 @@ React to settings of `default-frame-alist', `initial-frame-alist' there."
                                   ;; default-frame-alist were already
                                   ;; applied in pc-win.el.
                                   parms))
-       (if (null window-system) ;; MS-DOS does this differently in pc-win.el
+       (if (null initial-window-system) ;; MS-DOS does this differently in pc-win.el
            (let ((newparms (frame-parameters))
                  (frame (selected-frame)))
              (tty-handle-reverse-video frame newparms)
@@ -309,6 +337,7 @@ React to settings of `default-frame-alist', `initial-frame-alist' there."
       ;; switch `tool-bar-mode' off.
       (when (display-graphic-p)
        (let ((tool-bar-lines (or (assq 'tool-bar-lines initial-frame-alist)
+                                 (assq 'tool-bar-lines window-system-frame-alist)
                                  (assq 'tool-bar-lines default-frame-alist))))
          (when (and tool-bar-originally-present
                      (or (null tool-bar-lines)
@@ -369,6 +398,7 @@ React to settings of `default-frame-alist', `initial-frame-alist' there."
       ;; create here, so that its new value, gleaned from the user's
       ;; .emacs file, will be applied to the existing screen.
       (if (not (eq (cdr (or (assq 'minibuffer initial-frame-alist)
+                           (assq 'minibuffer window-system-frame-alist)
                            (assq 'minibuffer default-frame-alist)
                            '(minibuffer . t)))
                   t))
@@ -388,6 +418,7 @@ React to settings of `default-frame-alist', `initial-frame-alist' there."
                (setq parms (delq (assq 'name parms) parms)))
 
            (setq parms (append initial-frame-alist
+                               window-system-frame-alist
                                default-frame-alist
                                parms
                                nil))
@@ -463,6 +494,7 @@ React to settings of `default-frame-alist', `initial-frame-alist' there."
        ;; the new parameters.
        (let (newparms allparms tail)
          (setq allparms (append initial-frame-alist
+                                window-system-frame-alist
                                 default-frame-alist nil))
          (if (assq 'height frame-initial-geometry-arguments)
              (setq allparms (assq-delete-all 'height allparms)))
@@ -519,19 +551,25 @@ React to settings of `default-frame-alist', `initial-frame-alist' there."
 (defun modify-all-frames-parameters (alist)
   "Modify all current and future frames' parameters according to ALIST.
 This changes `default-frame-alist' and possibly `initial-frame-alist'.
+Furthermore, this function removes all parameters in ALIST from
+`window-system-default-frame-alist'.
 See help of `modify-frame-parameters' for more information."
-  (let (element)                       ;; temp
-    (dolist (frame (frame-list))
-      (modify-frame-parameters frame alist))
-
-    (dolist (pair alist)               ;; conses to add/replace
-      ;; initial-frame-alist needs setting only when
-      ;; frame-notice-user-settings is true
-      (and frame-notice-user-settings
-          (setq element (assoc (car pair) initial-frame-alist))
-          (setq initial-frame-alist (delq element initial-frame-alist)))
-      (and (setq element (assoc (car pair) default-frame-alist))
-          (setq default-frame-alist (delq element default-frame-alist)))))
+  (dolist (frame (frame-list))
+    (modify-frame-parameters frame alist))
+
+  (dolist (pair alist) ;; conses to add/replace
+    ;; initial-frame-alist needs setting only when
+    ;; frame-notice-user-settings is true.
+    (and frame-notice-user-settings
+        (setq initial-frame-alist
+              (assq-delete-all (car pair) initial-frame-alist)))
+    (setq default-frame-alist
+         (assq-delete-all (car pair) default-frame-alist))
+    ;; Remove any similar settings from the window-system specific
+    ;; parameters---they would override default-frame-alist.
+    (dolist (w window-system-default-frame-alist)
+      (setcdr w (assq-delete-all (car pair) (cdr w)))))
+
   (and frame-notice-user-settings
        (setq initial-frame-alist (append initial-frame-alist alist)))
   (setq default-frame-alist (append default-frame-alist alist)))
@@ -562,12 +600,28 @@ is not considered (see `next-frame')."
   (select-frame-set-input-focus (selected-frame)))
 
 (defun make-frame-on-display (display &optional parameters)
-  "Make a frame on display DISPLAY.
+  "Make a frame on display DISPLAY.
 The optional second argument PARAMETERS specifies additional frame parameters."
   (interactive "sMake frame on display: ")
   (or (string-match "\\`[^:]*:[0-9]+\\(\\.[0-9]+\\)?\\'" display)
       (error "Invalid display, not HOST:SERVER or HOST:SERVER.SCREEN"))
-  (make-frame (cons (cons 'display display) parameters)))
+  (when (and (boundp 'x-initialized) (not x-initialized))
+    (setq x-display-name display)
+    (x-initialize-window-system))
+  (make-frame `((window-system . x) (display . ,display) . ,parameters)))
+
+(defun make-frame-on-tty (tty type &optional parameters)
+  "Make a frame on terminal device TTY.
+TTY should be the file name of the tty device to use.  TYPE
+should be the terminal type string of TTY, for example \"xterm\"
+or \"vt100\".  The optional third argument PARAMETERS specifies
+additional frame parameters."
+  (interactive "fOpen frame on tty device: \nsTerminal type of %s: ")
+  (unless tty
+    (error "Invalid terminal device"))
+  (unless type
+    (error "Invalid terminal type"))
+  (make-frame `((window-system . nil) (tty . ,tty) (tty-type . ,type) . ,parameters)))
 
 (defun close-display-connection (display)
   "Close the connection to a display, deleting all its associated frames.
@@ -636,7 +690,12 @@ You cannot specify either `width' or `height', you must use neither or both.
  (minibuffer . only)   The frame should contain only a minibuffer.
  (minibuffer . WINDOW) The frame should use WINDOW as its minibuffer window.
 
-Before the frame is created (via `frame-creation-function'), functions on the
+ (window-system . nil) The frame should be displayed on a terminal device.
+ (window-system . x)   The frame should be displayed in an X window.
+
+ (terminal . ID)          The frame should use the terminal identified by ID.
+
+Before the frame is created (via `frame-creation-function-alist'), functions on the
 hook `before-make-frame-hook' are run.  After the frame is created, functions
 on `after-make-frame-functions' are run with one arg, the newly created frame.
 
@@ -646,8 +705,33 @@ window system may select the new frame for its own reasons, for
 instance if the frame appears under the mouse pointer and your
 setup is for focus to follow the pointer."
   (interactive)
-  (run-hooks 'before-make-frame-hook)
-  (let ((frame (funcall frame-creation-function parameters)))
+  (let* ((w (cond
+            ((assq 'terminal parameters)
+             (let ((type (terminal-live-p (cdr (assq 'terminal parameters)))))
+               (cond
+                ((eq type t) nil)
+                ((eq type nil) (error "Terminal %s does not exist" (cdr (assq 'terminal parameters))))
+                (t type))))
+            ((assq 'window-system parameters)
+             (cdr (assq 'window-system parameters)))
+            (t window-system)))
+        (frame-creation-function (cdr (assq w frame-creation-function-alist)))
+        (oldframe (selected-frame))
+        frame)
+    (unless frame-creation-function
+      (error "Don't know how to create a frame on window system %s" w))
+    (run-hooks 'before-make-frame-hook)
+    (setq frame (funcall frame-creation-function (append parameters (cdr (assq w window-system-default-frame-alist)))))
+    (normal-erase-is-backspace-setup-frame frame)
+    ;; Inherit the 'environment and 'client parameters.
+    (let ((env (frame-parameter oldframe 'environment))
+         (client (frame-parameter oldframe 'client)))
+      (if (not (framep env))
+         (setq env oldframe))
+      (if (and env (not (assq 'environment parameters)))
+         (set-frame-parameter frame 'environment env))
+      (if (and client (not (assq 'client parameters)))
+         (set-frame-parameter frame 'client client)))
     (run-hook-with-args 'after-make-frame-functions frame)
     frame))
 
@@ -667,23 +751,48 @@ setup is for focus to follow the pointer."
    (lambda (frame)
      (eq frame (window-frame (minibuffer-window frame))))))
 
-(defun frames-on-display-list (&optional display)
-  "Return a list of all frames on DISPLAY.
-DISPLAY is a name of a display, a string of the form HOST:SERVER.SCREEN.
-If DISPLAY is omitted or nil, it defaults to the selected frame's display."
-  (let* ((display (or display (frame-parameter nil 'display)))
+;; Used to be called `terminal-id' in termdev.el.
+(defun get-device-terminal (device)
+  "Return the terminal corresponding to DEVICE.
+DEVICE can be a terminal, a frame, nil (meaning the selected frame's terminal),
+the name of an X display device (HOST.SERVER.SCREEN) or a tty device file."
+  (cond
+   ((or (null device) (framep device))
+    (frame-terminal device))
+   ((stringp device)
+    (let ((f (car (filtered-frame-list
+                   (lambda (frame)
+                     (or (equal (frame-parameter frame 'display) device)
+                         (equal (frame-parameter frame 'tty) device)))))))
+      (or f (error "Display %s does not exist" device))
+      (frame-terminal f)))
+   ((terminal-live-p device) device)
+   (t
+    (error "Invalid argument %s in `get-device-terminal'" device))))
+
+(defun frames-on-display-list (&optional device)
+  "Return a list of all frames on DEVICE.
+
+DEVICE should be a terminal, a frame,
+or a name of an X display or tty (a string of the form
+HOST:SERVER.SCREEN).
+
+If DEVICE is omitted or nil, it defaults to the selected
+frame's terminal device."
+  (let* ((terminal (get-device-terminal device))
         (func #'(lambda (frame)
-                  (equal (frame-parameter frame 'display) display))))
+                  (eq (frame-terminal frame) terminal))))
     (filtered-frame-list func)))
 
-(defun framep-on-display (&optional display)
-  "Return the type of frames on DISPLAY.
-DISPLAY may be a display name or a frame.  If it is a frame, its type is
-returned.
-If DISPLAY is omitted or nil, it defaults to the selected frame's display.
-All frames on a given display are of the same type."
-  (or (framep display)
-      (framep (car (frames-on-display-list display)))))
+(defun framep-on-display (&optional terminal)
+  "Return the type of frames on TERMINAL.
+TERMINAL may be a terminal id, a display name or a frame.  If it
+is a frame, its type is returned.  If TERMINAL is omitted or nil,
+it defaults to the selected frame's terminal device.  All frames
+on a given display are of the same type."
+  (or (terminal-live-p terminal)
+      (framep terminal)
+      (framep (car (frames-on-display-list terminal)))))
 
 (defun frame-remove-geometry-params (param-list)
   "Return the parameter list PARAM-LIST, but with geometry specs removed.
@@ -706,26 +815,13 @@ the user during startup."
        (nreverse frame-initial-geometry-arguments))
   (cdr param-list))
 
-(defcustom focus-follows-mouse (not (eq window-system 'mac))
-  "*Non-nil if window system changes focus when you move the mouse.
-You should set this variable to tell Emacs how your window manager
-handles focus, since there is no way in general for Emacs to find out
-automatically.
-
-This variable does not have any effect on MS-Windows."
-  :type 'boolean
-  :group 'frames
-  :version "20.3")
-
 (defun select-frame-set-input-focus (frame)
   "Select FRAME, raise it, and set input focus, if possible."
     (select-frame frame)
     (raise-frame frame)
     ;; Ensure, if possible, that frame gets input focus.
-    (cond ((memq window-system '(x mac))
-          (x-focus-frame frame))
-         ((eq window-system 'w32)
-          (w32-focus-frame frame)))
+    (cond ((memq (window-system frame) '(x max w32))
+          (x-focus-frame frame)))
     (cond (focus-follows-mouse
           (set-mouse-position (selected-frame) (1- (frame-width)) 0))))
 
@@ -761,6 +857,21 @@ Otherwise, that variable should be nil."
       (iconify-frame)
     (make-frame-visible)))
 
+(defun suspend-frame ()
+  "Do whatever is right to suspend the current frame.
+Calls `suspend-emacs' if invoked from the controlling tty device,
+`suspend-tty' from a secondary tty device, and
+`iconify-or-deiconify-frame' from an X frame."
+  (interactive)
+  (let ((type (framep (selected-frame))))
+    (cond
+     ((memq type '(x w32)) (iconify-or-deiconify-frame))
+     ((eq type t)
+      (if (controlling-tty-p)
+         (suspend-emacs)
+       (suspend-tty)))
+     (t (suspend-emacs)))))
+
 (defun make-frame-names-alist ()
   (let* ((current-frame (selected-frame))
         (falist
@@ -794,10 +905,8 @@ If there is no frame by that name, signal an error."
     (raise-frame frame)
     (select-frame frame)
     ;; Ensure, if possible, that frame gets input focus.
-    (cond ((memq window-system '(x mac))
-          (x-focus-frame frame))
-         ((eq window-system 'w32)
-          (w32-focus-frame frame)))
+    (cond ((memq (window-system frame) '(x w32))
+          (x-focus-frame frame)))
     (when focus-follows-mouse
       (set-mouse-position frame (1- (frame-width frame)) 0))))
 \f
@@ -1006,6 +1115,10 @@ bars (top, bottom, or nil)."
     (cons vert hor)))
 \f
 ;;;; Frame/display capabilities.
+(defun selected-terminal ()
+  "Return the terminal that is now selected."
+  (frame-terminal (selected-frame)))
+
 (defun display-mouse-p (&optional display)
   "Return non-nil if DISPLAY has a mouse available.
 DISPLAY can be a display name, a frame, or nil (meaning the selected
@@ -1183,7 +1296,7 @@ the question is inapplicable to a certain kind of display."
      ((eq frame-type 'pc)
       16)
      (t
-      (tty-display-color-cells)))))
+      (tty-display-color-cells display)))))
 
 (defun display-visual-class (&optional display)
   "Returns the visual class of DISPLAY.
@@ -1377,6 +1490,9 @@ cursor shapes."
 (defcustom cursor-in-non-selected-windows t
   "*Non-nil means show a hollow box cursor in non-selected windows.
 If nil, don't show a cursor except in the selected window.
+If t, display a cursor related to the usual cursor type
+ \(a solid box becomes hollow, a bar becomes a narrower bar).
+You can also specify the cursor type as in the `cursor-type' variable.
 Use Custom to set this variable to get the display updated."
   :tag "Cursor In Non-selected Windows"
   :type 'boolean
index 3160d960ffdd5d65c24789ae18db193fc41198fd..7ea3e8a2b5d1a8027bc9b5f733153ed427ba3b29 100644 (file)
@@ -104,40 +104,13 @@ This is usually invoked when setting `fringe-mode' via customize."
 See `fringe-mode' for possible values and their effect."
   (setq fringe-mode value)
 
-  ;; Apply it to default-frame-alist.
-  (let ((parameter (assq 'left-fringe default-frame-alist)))
-    (if (consp parameter)
-       (setcdr parameter (if (consp fringe-mode)
-                             (car fringe-mode)
-                           fringe-mode))
-      (setq default-frame-alist
-           (cons (cons 'left-fringe (if (consp fringe-mode)
-                                        (car fringe-mode)
-                                      fringe-mode))
-                 default-frame-alist))))
-  (let ((parameter (assq 'right-fringe default-frame-alist)))
-    (if (consp parameter)
-       (setcdr parameter (if (consp fringe-mode)
-                             (cdr fringe-mode)
-                           fringe-mode))
-      (setq default-frame-alist
-           (cons (cons 'right-fringe (if (consp fringe-mode)
-                                         (cdr fringe-mode)
-                                       fringe-mode))
-                 default-frame-alist))))
-
-  ;; Apply it to existing frames.
-  (let ((frames (frame-list)))
-    (while frames
-      (modify-frame-parameters
-       (car frames)
-       (list (cons 'left-fringe (if (consp fringe-mode)
-                                   (car fringe-mode)
-                                 fringe-mode))
-            (cons 'right-fringe (if (consp fringe-mode)
-                                    (cdr fringe-mode)
-                                  fringe-mode))))
-      (setq frames (cdr frames)))))
+  (modify-all-frames-parameters
+   (list (cons 'left-fringe (if (consp fringe-mode)
+                               (car fringe-mode)
+                             fringe-mode))
+        (cons 'right-fringe (if (consp fringe-mode)
+                                (cdr fringe-mode)
+                              fringe-mode)))))
 
 ;; For initialization of fringe-mode, take account of changes
 ;; made explicitly to default-frame-alist.
index 04b359865d429125ebfca540dcd55f14da39d185..25e8ca7ed3bb2359023230d59d22d5634e45f663 100644 (file)
@@ -446,10 +446,11 @@ If ANY-SYMBOL is non-nil, don't insist the symbol be bound."
       0))
 
 ;;;###autoload
-(defun describe-variable (variable &optional buffer)
+(defun describe-variable (variable &optional buffer frame)
   "Display the full documentation of VARIABLE (a symbol).
 Returns the documentation as a string, also.
-If VARIABLE has a buffer-local value in BUFFER (default to the current buffer),
+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."
   (interactive
    (let ((v (variable-at-point))
@@ -468,14 +469,19 @@ it is displayed along with the global value."
      (list (if (equal val "")
               v (intern val)))))
   (unless (buffer-live-p buffer) (setq buffer (current-buffer)))
+  (unless (frame-live-p frame) (setq frame (selected-frame)))
   (if (not (symbolp variable))
       (message "You did not specify a variable")
     (save-excursion
-      (let* ((valvoid (not (with-current-buffer buffer (boundp variable))))
-            ;; Extract the value before setting up the output buffer,
-            ;; in case `buffer' *is* the output buffer.
-            (val (unless valvoid (buffer-local-value variable buffer)))
-            val-start-pos)
+      (let ((valvoid (not (with-current-buffer buffer (boundp variable))))
+           val val-start-pos locus)
+       ;; Extract the value before setting up the output buffer,
+       ;; in case `buffer' *is* the output buffer.
+       (unless valvoid
+         (with-selected-frame frame
+           (with-current-buffer buffer
+             (setq val (symbol-value variable)
+                   locus (variable-binding-locus variable)))))
        (help-setup-xref (list #'describe-variable variable buffer)
                         (interactive-p))
        (with-output-to-temp-buffer (help-buffer)
@@ -537,11 +543,13 @@ it is displayed along with the global value."
                      (delete-region (1- from) from)))))
            (terpri)
 
-           (when (local-variable-p variable)
-             (princ (format "%socal in buffer %s; "
-                            (if (get variable 'permanent-local)
-                                "Permanently l" "L")
-                            (buffer-name)))
+           (when locus
+             (if (bufferp locus)
+                 (princ (format "%socal in buffer %s; "
+                                (if (get variable 'permanent-local)
+                                    "Permanently l" "L")
+                                (buffer-name)))
+               (princ (format "It is a frame-local variable; ")))
              (if (not (default-boundp variable))
                  (princ "globally void")
                (let ((val (default-value variable)))
@@ -558,13 +566,6 @@ it is displayed along with the global value."
                      ;; (help-xref-on-pp from (point))
                      (if (< (point) (+ from 20))
                          (delete-region (1- from) from)))))))
-           ;; Add a note for variables that have been make-var-buffer-local.
-           (when (and (local-variable-if-set-p variable)
-                      (or (not (local-variable-p variable))
-                          (with-temp-buffer
-                            (local-variable-if-set-p variable))))
-             (princ "\nAutomatically becomes buffer-local when set in any fashion.\n"))
-           (terpri)
 
            ;; If the value is large, move it to the end.
            (with-current-buffer standard-output
@@ -589,35 +590,49 @@ it is displayed along with the global value."
                               'follow-link t
                               'help-echo "mouse-2, RET: show value")
                (insert ".\n")))
+            (terpri)
 
-           ;; Mention if it's an alias
             (let* ((alias (condition-case nil
                              (indirect-variable variable)
                            (error variable)))
                    (obsolete (get variable 'byte-obsolete-variable))
                   (safe-var (get variable 'safe-local-variable))
                    (doc (or (documentation-property variable 'variable-documentation)
-                            (documentation-property alias 'variable-documentation))))
+                            (documentation-property alias 'variable-documentation)))
+                   (extra-line nil))
+              ;; Add a note for variables that have been make-var-buffer-local.
+              (when (and (local-variable-if-set-p variable)
+                         (or (not (local-variable-p variable))
+                             (with-temp-buffer
+                               (local-variable-if-set-p variable))))
+                (setq extra-line t)
+                (princ "  Automatically becomes buffer-local when set in any fashion.\n"))
+
+              ;; Mention if it's an alias
               (unless (eq alias variable)
-                (princ (format "\nThis variable is an alias for `%s'.\n" alias)))
-             (if (or obsolete safe-var)
-                 (terpri))
+                (setq extra-line t)
+                (princ (format "  This variable is an alias for `%s'.\n" alias)))
 
               (when obsolete
-                (princ "This variable is obsolete")
+                (setq extra-line t)
+                (princ "  This variable is obsolete")
                 (if (cdr obsolete) (princ (format " since %s" (cdr obsolete))))
                 (princ ";") (terpri)
                 (princ (if (stringp (car obsolete)) (car obsolete)
                          (format "use `%s' instead." (car obsolete))))
                 (terpri))
              (when safe-var
-               (princ "This variable is safe as a file local variable ")
-               (princ "if its value\nsatisfies the predicate ")
+                (setq extra-line t)
+               (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 byte-compiled expression.\n"
                         (format "`%s'.\n" safe-var))))
-             (princ "\nDocumentation:\n")
-              (princ (or doc "Not documented as a variable.")))
+
+              (if extra-line (terpri))
+             (princ "Documentation:\n")
+             (with-current-buffer standard-output
+               (insert (or doc "Not documented as a variable."))))
            ;; Make a link to customize if this variable can be customized.
            (if (custom-variable-p variable)
                (let ((customize-label "customize"))
index 4a94fd35bc7b870c79feb5386dd831cdafc4ace8..b957f88a7e45a8e6df1476c85f83999536bf4134 100644 (file)
@@ -46,6 +46,7 @@
     (define-key map "." 'display-local-help)
     (define-key map "?" 'help-for-help)
 
+    (define-key map "\C-a" 'about-emacs)
     (define-key map "\C-c" 'describe-copying)
     (define-key map "\C-d" 'describe-distribution)
     (define-key map "\C-e" 'view-emacs-problems)
@@ -225,6 +226,7 @@ w  where-is.  Type a command name; it displays which keystrokes
 .  display-local-help.  Display any available local help at point
         in the echo area.
 
+C-a Display information about Emacs.
 C-c Display Emacs copying permission (GNU General Public License).
 C-d Display Emacs ordering information.
 C-e Display info about Emacs problems.
@@ -332,7 +334,7 @@ With argument, display info only for the selected version."
   (when (consp version)
     (let* ((all-versions
            (let (res)
-             (mapcar
+             (mapc
               (lambda (file)
                 (with-temp-buffer
                   (insert-file-contents
index b5e62e7a90947442ce45552820a55526138d4ff2..d65dd01ee1c784bd73a56fe25ca75ffe49b0316b 100644 (file)
@@ -309,7 +309,7 @@ called interactively, are:
   Write active REGEXPs into buffer as comments (if possible).  They may
   be read the next time file is loaded or when the \\[hi-lock-find-patterns] command
   is issued.  The inserted regexps are in the form of font lock keywords.
-  (See `font-lock-keywords'.)  They may be edited and re-loaded with \\[hi-lock-find-patterns], 
+  (See `font-lock-keywords'.)  They may be edited and re-loaded with \\[hi-lock-find-patterns],
   any valid `font-lock-keywords' form is acceptable. When a file is
   loaded the patterns are read if `hi-lock-file-patterns-policy is
   'ask and the user responds y to the prompt, or if
@@ -515,7 +515,7 @@ be found in variable `hi-lock-interactive-patterns'."
   (if (null hi-lock-interactive-patterns)
       (error "There are no interactive patterns"))
   (let ((beg (point)))
-    (mapcar
+    (mapc
      (lambda (pattern)
        (insert (format "%s: (%s)\n"
                       hi-lock-file-patterns-prefix
index ca44e99b594a2e60c75056df7b751faf319ff778..27e9d66e25caa39048f669f57174709ea5649dfa 100644 (file)
@@ -3354,7 +3354,7 @@ for first matching file."
 
 (defun ido-to-end (items)
   ;; Move the elements from ITEMS to the end of `ido-temp-list'
-  (mapcar
+  (mapc
    (lambda (elem)
      (setq ido-temp-list (delq elem ido-temp-list)))
    items)
@@ -3603,7 +3603,7 @@ for first matching file."
         full-matches suffix-matches prefix-matches matches)
     (setq ido-incomplete-regexp nil)
     (condition-case error
-        (mapcar
+        (mapc
          (lambda (item)
            (let ((name (ido-name item)))
             (if (and (or non-prefix-dot
@@ -3648,7 +3648,7 @@ for first matching file."
       (setq re (mapconcat #'regexp-quote (split-string ido-text "") ".*"))
       (if ido-enable-prefix
          (setq re (concat "\\`" re)))
-      (mapcar
+      (mapc
        (lambda (item)
         (let ((name (ido-name item)))
           (if (string-match re name)
index c2c2a1476da5069ee8bcc5ccfbb9b90e0e5adb9f..0353f6eb8813d745aef01f654fd922e314ae5eca 100644 (file)
@@ -820,7 +820,7 @@ thumbnail buffer to be selected."
         (if (not append)
             (erase-buffer)
           (goto-char (point-max)))
-        (mapcar
+        (mapc
          (lambda (curr-file)
            (setq thumb-name (image-dired-thumb-name curr-file))
            (if (and (not (file-exists-p thumb-name))
@@ -918,7 +918,7 @@ is an alist in the following form:
           (if (stringp files)
               (setq files (list files))
             (error "Files must be a string or a list of strings!")))
-      (mapcar
+      (mapc
        (lambda (file)
          (goto-char (point-min))
          (when (search-forward-regexp
@@ -1854,7 +1854,7 @@ With prefix argument ARG, display image in its original size."
   (image-dired-display-image (dired-get-filename) arg))
 
 (defun image-dired-image-at-point-p ()
-  "Return true if there is a image-dired thumbnail at point."
+  "Return true if there is an image-dired thumbnail at point."
   (get-text-property (point) 'image-dired-thumbnail))
 
 (defun image-dired-rotate-thumbnail (degrees)
@@ -2170,7 +2170,7 @@ matching tags will be marked in the dired buffer."
         (setq files (append (list (match-string 1)) files)))
       (kill-buffer buf)
       ;; Mark files
-      (mapcar
+      (mapc
        ;; I tried using `dired-mark-files-regexp' but it was
        ;; waaaay to slow.
        (lambda (curr-file)
index e6c5b2e2d2c63f95c2d92d7ff874fff4a8c5aded..99632b84307934ba08f5b5bbe3f56d07570e9e4d 100644 (file)
@@ -323,7 +323,7 @@ Optional DATA-P non-nil means SOURCE is a string containing image data."
                 (or (image-type-from-file-header source)
                     (image-type-from-file-name source))))
     (or type (error "Cannot determine image type")))
-  (or (memq type image-types)
+  (or (memq type (and (boundp 'image-types) image-types))
       (error "Invalid image type `%s'" type))
   type)
 
@@ -343,10 +343,12 @@ This function is intended to be used from `magic-fallback-mode-alist'.
 
 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'."
+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."
   (let* ((type (image-type-from-buffer))
         (auto (and type (cdr (assq type image-type-auto-detectable)))))
-    (and type
+    (and auto
         (or (eq auto t) (image-type-available-p type)))))
 
 
index b580e3aa3ce54d2cdc61e3c05ad0ab08a3e8f0ca..db8958bd1ca5faae9fabe82aa87679360f127540 100644 (file)
@@ -78,14 +78,20 @@ special; we don't actually use them here."
     (funcall indent-line-function)))
 
 (defun indent-for-tab-command (&optional arg)
-  "Indent line in proper way for current major mode or insert a tab.
+  "Indent line or region in proper way for current major mode or insert a tab.
 Depending on `tab-always-indent', either insert a tab or indent.
 If initial point was within line's indentation, position after
 the indentation.  Else stay at same point in text.
-The function actually called to indent is determined by the value of
+If `transient-mark-mode' is turned on the region is active,
+indent the region.
+The function actually called to indent the line is determined by the value of
 `indent-line-function'."
   (interactive "P")
   (cond
+   ;; The region is active, indent it.
+   ((and transient-mark-mode mark-active
+        (not (eq (region-beginning) (region-end))))
+    (indent-region (region-beginning) (region-end)))
    ((or ;; indent-to-left-margin is only meant for indenting,
        ;; so we force it to always insert a tab here.
        (eq indent-line-function 'indent-to-left-margin)
@@ -97,7 +103,8 @@ The function actually called to indent is determined by the value of
    ;; indenting, so we can't pass them to indent-according-to-mode.
    ((memq indent-line-function '(indent-relative indent-relative-maybe))
     (funcall indent-line-function))
-   (t ;; The normal case.
+   ;; Indent the line.
+   (t
     (indent-according-to-mode))))
 
 (defun insert-tab (&optional arg)
index 3b9218077f341c912f33ef518f93a521562ff822..7dac134fc0e1063710d0c05ca2c606b1c7bdba09 100644 (file)
@@ -1663,7 +1663,7 @@ Isearch mode."
         (keylist (listify-key-sequence key))
          scroll-command isearch-point)
     (cond ((and (= (length key) 1)
-               (let ((lookup (lookup-key function-key-map key)))
+               (let ((lookup (lookup-key local-function-key-map key)))
                  (not (or (null lookup) (integerp lookup)
                           (keymapp lookup)))))
           ;; Handle a function key that translates into something else.
@@ -1677,7 +1677,7 @@ Isearch mode."
                 (isearch-done)
                 (apply 'isearch-unread keylist))
             (setq keylist
-                  (listify-key-sequence (lookup-key function-key-map key)))
+                  (listify-key-sequence (lookup-key local-function-key-map key)))
             (while keylist
               (setq key (car keylist))
               ;; If KEY is a printing char, we handle it here
index fb17fb37f0c8ea34902f9122c9a60ee184dedf69..8c388d0cb34ffb7630375f7f237a6d3e73e1f754 100644 (file)
@@ -97,7 +97,7 @@ The determination as to which compression scheme, if any, to use is
 based on the filename itself and `jka-compr-compression-info-list'."
   (catch 'compression-info
     (let ((case-fold-search nil))
-      (mapcar
+      (mapc
        (function (lambda (x)
                   (and (string-match (jka-compr-info-regexp x) filename)
                        (throw 'compression-info x))))
@@ -186,7 +186,8 @@ options through Custom does this automatically."
   ;; can-append strip-extension-flag file-magic-bytes]
   '(["\\.Z\\(~\\|\\.~[0-9]+~\\)?\\'"
      "compressing"    "compress"     ("-c")
-     "uncompressing"  "uncompress"   ("-c")
+     ;; gzip is more common than uncompress. It can only read, not write.
+     "uncompressing"  "gzip"   ("-c" "-q" "-d")
      nil t "\037\235"]
      ;; Formerly, these had an additional arg "-c", but that fails with
      ;; "Version 0.1pl2, 29-Aug-97." (RedHat 5.1 GNU/Linux) and
index b12fe8800743863df1dc38cd7759c234b2ba14be..3ef40e14987dee4200ab752ee345a8660edb3caa 100644 (file)
@@ -4,7 +4,7 @@
 \f
 ;;;### (autoloads (5x5-crack 5x5-crack-xor-mutate 5x5-crack-mutating-best
 ;;;;;;  5x5-crack-mutating-current 5x5-crack-randomly 5x5) "5x5"
-;;;;;;  "play/5x5.el" (17941 38806))
+;;;;;;  "play/5x5.el" (18104 24760))
 ;;; Generated autoloads from play/5x5.el
 
 (autoload (quote 5x5) "5x5" "\
@@ -63,14 +63,14 @@ should return a grid vector array that is the new solution.
 
 ;;;***
 \f
-;;;### (autoloads nil "abbrev" "abbrev.el" (17905 55681))
+;;;### (autoloads nil "abbrev" "abbrev.el" (18104 24730))
 ;;; Generated autoloads from abbrev.el
 (put 'abbrev-mode 'safe-local-variable 'booleanp)
 
 ;;;***
 \f
 ;;;### (autoloads (list-one-abbrev-table) "abbrevlist" "abbrevlist.el"
-;;;;;;  (17842 58280))
+;;;;;;  (18104 24730))
 ;;; Generated autoloads from abbrevlist.el
 
 (autoload (quote list-one-abbrev-table) "abbrevlist" "\
@@ -81,7 +81,7 @@ Display alphabetical listing of ABBREV-TABLE in buffer OUTPUT-BUFFER.
 ;;;***
 \f
 ;;;### (autoloads (ada-mode ada-add-extensions) "ada-mode" "progmodes/ada-mode.el"
-;;;;;;  (17842 56333))
+;;;;;;  (18104 24762))
 ;;; Generated autoloads from progmodes/ada-mode.el
 
 (autoload (quote ada-add-extensions) "ada-mode" "\
@@ -142,7 +142,7 @@ If you use ada-xref.el:
 ;;;***
 \f
 ;;;### (autoloads (ada-header) "ada-stmt" "progmodes/ada-stmt.el"
-;;;;;;  (17842 56333))
+;;;;;;  (18104 24762))
 ;;; Generated autoloads from progmodes/ada-stmt.el
 
 (autoload (quote ada-header) "ada-stmt" "\
@@ -153,7 +153,7 @@ Insert a descriptive header at the top of the file.
 ;;;***
 \f
 ;;;### (autoloads (ada-find-file) "ada-xref" "progmodes/ada-xref.el"
-;;;;;;  (17842 56333))
+;;;;;;  (18104 24762))
 ;;; Generated autoloads from progmodes/ada-xref.el
 
 (autoload (quote ada-find-file) "ada-xref" "\
@@ -164,22 +164,22 @@ Completion is available.
 
 ;;;***
 \f
-;;;### (autoloads (change-log-redate change-log-merge add-log-current-defun
-;;;;;;  change-log-mode add-change-log-entry-other-window add-change-log-entry
-;;;;;;  find-change-log prompt-for-change-log-name add-log-mailing-address
-;;;;;;  add-log-full-name add-log-current-defun-function) "add-log"
-;;;;;;  "add-log.el" (17851 44469))
+;;;### (autoloads (change-log-merge add-log-current-defun change-log-mode
+;;;;;;  add-change-log-entry-other-window add-change-log-entry find-change-log
+;;;;;;  prompt-for-change-log-name add-log-mailing-address add-log-full-name
+;;;;;;  add-log-current-defun-function) "add-log" "add-log.el" (18104
+;;;;;;  24730))
 ;;; Generated autoloads from add-log.el
 
 (defvar add-log-current-defun-function nil "\
-*If non-nil, function to guess name of surrounding function.
+If non-nil, function to guess name of surrounding function.
 It is used by `add-log-current-defun' in preference to built-in rules.
 Returns function's name as a string, or nil if outside a function.")
 
 (custom-autoload (quote add-log-current-defun-function) "add-log" t)
 
 (defvar add-log-full-name nil "\
-*Full name of user, for inclusion in ChangeLog daily headers.
+Full name of user, for inclusion in ChangeLog daily headers.
 This defaults to the value returned by the function `user-full-name'.")
 
 (custom-autoload (quote add-log-full-name) "add-log" t)
@@ -267,7 +267,7 @@ Runs `change-log-mode-hook'.
 (defvar add-log-c-like-modes (quote (c-mode c++-mode c++-c-mode objc-mode)) "\
 *Modes that look like C to `add-log-current-defun'.")
 
-(defvar add-log-tex-like-modes (quote (TeX-mode plain-TeX-mode LaTeX-mode plain-tex-mode latex-mode)) "\
+(defvar add-log-tex-like-modes (quote (TeX-mode plain-TeX-mode LaTeX-mode tex-mode)) "\
 *Modes that look like TeX to `add-log-current-defun'.")
 
 (autoload (quote add-log-current-defun) "add-log" "\
@@ -297,16 +297,11 @@ old-style time formats for entries are supported.
 
 \(fn OTHER-LOG)" t nil)
 
-(autoload (quote change-log-redate) "add-log" "\
-Fix any old-style date entries in the current log file to default format.
-
-\(fn)" t nil)
-
 ;;;***
 \f
 ;;;### (autoloads (defadvice ad-activate ad-add-advice ad-disable-advice
 ;;;;;;  ad-enable-advice ad-default-compilation-action ad-redefinition-action)
-;;;;;;  "advice" "emacs-lisp/advice.el" (17992 30878))
+;;;;;;  "advice" "emacs-lisp/advice.el" (18104 24745))
 ;;; Generated autoloads from emacs-lisp/advice.el
 
 (defvar ad-redefinition-action (quote warn) "\
@@ -383,7 +378,7 @@ The syntax of `defadvice' is as follows:
 
   (defadvice FUNCTION (CLASS NAME [POSITION] [ARGLIST] FLAG...)
     [DOCSTRING] [INTERACTIVE-FORM]
-    BODY... )
+    BODY...)
 
 FUNCTION ::= Name of the function to be advised.
 CLASS ::= `before' | `around' | `after' | `activation' | `deactivation'.
@@ -434,7 +429,7 @@ See Info node `(elisp)Advising Functions' for comprehensive documentation.
 \f
 ;;;### (autoloads (align-newline-and-indent align-unhighlight-rule
 ;;;;;;  align-highlight-rule align-current align-entire align-regexp
-;;;;;;  align) "align" "align.el" (17842 58280))
+;;;;;;  align) "align" "align.el" (18104 24730))
 ;;; Generated autoloads from align.el
 
 (autoload (quote align) "align" "\
@@ -524,7 +519,7 @@ A replacement function for `newline-and-indent', aligning as it goes.
 ;;;***
 \f
 ;;;### (autoloads (outlineify-sticky allout-mode) "allout" "allout.el"
-;;;;;;  (17892 52945))
+;;;;;;  (18104 24730))
 ;;; Generated autoloads from allout.el
 
 (put (quote allout-show-bodies) (quote safe-local-variable) (if (fboundp (quote booleanp)) (quote booleanp) (quote (lambda (x) (member x (quote (t nil)))))))
@@ -830,7 +825,7 @@ setup for auto-startup.
 ;;;***
 \f
 ;;;### (autoloads (ange-ftp-hook-function ange-ftp-reread-dir) "ange-ftp"
-;;;;;;  "net/ange-ftp.el" (17905 9579))
+;;;;;;  "net/ange-ftp.el" (18104 24759))
 ;;; Generated autoloads from net/ange-ftp.el
 
 (defalias (quote ange-ftp-re-read-dir) (quote ange-ftp-reread-dir))
@@ -852,7 +847,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (animate-birthday-present animate-sequence animate-string)
-;;;;;;  "animate" "play/animate.el" (17941 38806))
+;;;;;;  "animate" "play/animate.el" (18104 24760))
 ;;; Generated autoloads from play/animate.el
 
 (autoload (quote animate-string) "animate" "\
@@ -880,7 +875,7 @@ You can specify the one's name by NAME; the default value is \"Sarah\".
 ;;;***
 \f
 ;;;### (autoloads (ansi-color-process-output ansi-color-for-comint-mode-on)
-;;;;;;  "ansi-color" "ansi-color.el" (17842 58280))
+;;;;;;  "ansi-color" "ansi-color.el" (18104 24730))
 ;;; Generated autoloads from ansi-color.el
 
 (autoload (quote ansi-color-for-comint-mode-on) "ansi-color" "\
@@ -906,7 +901,7 @@ This is a good function to put in `comint-output-filter-functions'.
 ;;;***
 \f
 ;;;### (autoloads (antlr-set-tabs antlr-mode antlr-show-makefile-rules)
-;;;;;;  "antlr-mode" "progmodes/antlr-mode.el" (17833 42928))
+;;;;;;  "antlr-mode" "progmodes/antlr-mode.el" (18104 24763))
 ;;; Generated autoloads from progmodes/antlr-mode.el
 
 (autoload (quote antlr-show-makefile-rules) "antlr-mode" "\
@@ -945,7 +940,7 @@ Used in `antlr-mode'.  Also a useful function in `java-mode-hook'.
 ;;;### (autoloads (appt-activate appt-make-list appt-delete appt-add
 ;;;;;;  appt-display-diary appt-display-duration appt-display-mode-line
 ;;;;;;  appt-msg-window appt-visible appt-audible appt-message-warning-time
-;;;;;;  appt-issue-message) "appt" "calendar/appt.el" (17952 17513))
+;;;;;;  appt-issue-message) "appt" "calendar/appt.el" (18104 24745))
 ;;; Generated autoloads from calendar/appt.el
 
 (defvar appt-issue-message t "\
@@ -1033,7 +1028,7 @@ ARG is positive, otherwise off.
 \f
 ;;;### (autoloads (apropos-documentation apropos-value apropos apropos-documentation-property
 ;;;;;;  apropos-command apropos-variable apropos-read-pattern) "apropos"
-;;;;;;  "apropos.el" (17842 58280))
+;;;;;;  "apropos.el" (18104 24730))
 ;;; Generated autoloads from apropos.el
 
 (autoload (quote apropos-read-pattern) "apropos" "\
@@ -1129,8 +1124,8 @@ Returns list of symbols and documentation found.
 
 ;;;***
 \f
-;;;### (autoloads (archive-mode) "arc-mode" "arc-mode.el" (17960
-;;;;;;  49045))
+;;;### (autoloads (archive-mode) "arc-mode" "arc-mode.el" (18104
+;;;;;;  24730))
 ;;; Generated autoloads from arc-mode.el
 
 (autoload (quote archive-mode) "arc-mode" "\
@@ -1150,7 +1145,7 @@ archive.
 
 ;;;***
 \f
-;;;### (autoloads (array-mode) "array" "array.el" (17842 58280))
+;;;### (autoloads (array-mode) "array" "array.el" (18104 24730))
 ;;; Generated autoloads from array.el
 
 (autoload (quote array-mode) "array" "\
@@ -1221,8 +1216,8 @@ Entering array mode calls the function `array-mode-hook'.
 
 ;;;***
 \f
-;;;### (autoloads (artist-mode) "artist" "textmodes/artist.el" (17842
-;;;;;;  58277))
+;;;### (autoloads (artist-mode) "artist" "textmodes/artist.el" (18104
+;;;;;;  24770))
 ;;; Generated autoloads from textmodes/artist.el
 
 (autoload (quote artist-mode) "artist" "\
@@ -1427,8 +1422,8 @@ Keymap summary
 
 ;;;***
 \f
-;;;### (autoloads (asm-mode) "asm-mode" "progmodes/asm-mode.el" (17842
-;;;;;;  56333))
+;;;### (autoloads (asm-mode) "asm-mode" "progmodes/asm-mode.el" (18104
+;;;;;;  24763))
 ;;; Generated autoloads from progmodes/asm-mode.el
 
 (autoload (quote asm-mode) "asm-mode" "\
@@ -1453,10 +1448,26 @@ Special commands:
 
 \(fn)" t nil)
 
+;;;***
+\f
+;;;### (autoloads (auto-show-mode auto-show-mode) "auto-show" "obsolete/auto-show.el"
+;;;;;;  (17994 6715))
+;;; Generated autoloads from obsolete/auto-show.el
+
+(defvar auto-show-mode nil "\
+Obsolete.")
+
+(custom-autoload (quote auto-show-mode) "auto-show" t)
+
+(autoload (quote auto-show-mode) "auto-show" "\
+This command is obsolete.
+
+\(fn ARG)" t nil)
+
 ;;;***
 \f
 ;;;### (autoloads (autoarg-kp-mode autoarg-mode) "autoarg" "autoarg.el"
-;;;;;;  (17842 58280))
+;;;;;;  (18104 24730))
 ;;; Generated autoloads from autoarg.el
 
 (defvar autoarg-mode nil "\
@@ -1510,7 +1521,7 @@ etc. to supply digit arguments.
 ;;;***
 \f
 ;;;### (autoloads (autoconf-mode) "autoconf" "progmodes/autoconf.el"
-;;;;;;  (17842 56333))
+;;;;;;  (18104 24763))
 ;;; Generated autoloads from progmodes/autoconf.el
 
 (autoload (quote autoconf-mode) "autoconf" "\
@@ -1521,7 +1532,7 @@ Major mode for editing Autoconf configure.in files.
 ;;;***
 \f
 ;;;### (autoloads (auto-insert-mode define-auto-insert auto-insert)
-;;;;;;  "autoinsert" "autoinsert.el" (17842 58280))
+;;;;;;  "autoinsert" "autoinsert.el" (18104 24730))
 ;;; Generated autoloads from autoinsert.el
 
 (autoload (quote auto-insert) "autoinsert" "\
@@ -1560,9 +1571,11 @@ insert a template for the file depending on the mode of the buffer.
 \f
 ;;;### (autoloads (batch-update-autoloads update-directory-autoloads
 ;;;;;;  update-file-autoloads) "autoload" "emacs-lisp/autoload.el"
-;;;;;;  (17860 50557))
+;;;;;;  (18104 24745))
 ;;; Generated autoloads from emacs-lisp/autoload.el
 
+(put (quote generated-autoload-file) (quote safe-local-variable) (quote stringp))
+
 (autoload (quote update-file-autoloads) "autoload" "\
 Update the autoloads for FILE in `generated-autoload-file'
 \(which FILE might bind in its local variables).
@@ -1595,7 +1608,7 @@ Calls `update-directory-autoloads' on the command line arguments.
 \f
 ;;;### (autoloads (global-auto-revert-mode turn-on-auto-revert-tail-mode
 ;;;;;;  auto-revert-tail-mode turn-on-auto-revert-mode auto-revert-mode)
-;;;;;;  "autorevert" "autorevert.el" (17925 15265))
+;;;;;;  "autorevert" "autorevert.el" (18104 24730))
 ;;; Generated autoloads from autorevert.el
 
 (autoload (quote auto-revert-mode) "autorevert" "\
@@ -1664,7 +1677,7 @@ Use `auto-revert-mode' to revert a particular buffer.
 ;;;***
 \f
 ;;;### (autoloads (mouse-avoidance-mode mouse-avoidance-mode) "avoid"
-;;;;;;  "avoid.el" (17842 58280))
+;;;;;;  "avoid.el" (18104 24730))
 ;;; Generated autoloads from avoid.el
 
 (defvar mouse-avoidance-mode nil "\
@@ -1705,7 +1718,7 @@ definition of \"random distance\".)
 ;;;***
 \f
 ;;;### (autoloads (backquote) "backquote" "emacs-lisp/backquote.el"
-;;;;;;  (17842 54152))
+;;;;;;  (18104 24745))
 ;;; Generated autoloads from emacs-lisp/backquote.el
 
 (autoload (quote backquote) "backquote" "\
@@ -1730,7 +1743,7 @@ Vectors work just like lists.  Nested backquotes are permitted.
 ;;;***
 \f
 ;;;### (autoloads (display-battery-mode battery) "battery" "battery.el"
-;;;;;;  (17842 58280))
+;;;;;;  (18104 24730))
 ;;; Generated autoloads from battery.el
  (put 'battery-mode-line-string 'risky-local-variable t)
 
@@ -1762,7 +1775,7 @@ seconds.
 ;;;***
 \f
 ;;;### (autoloads (benchmark benchmark-run-compiled benchmark-run)
-;;;;;;  "benchmark" "emacs-lisp/benchmark.el" (17842 54152))
+;;;;;;  "benchmark" "emacs-lisp/benchmark.el" (18104 24745))
 ;;; Generated autoloads from emacs-lisp/benchmark.el
 
 (autoload (quote benchmark-run) "benchmark" "\
@@ -1794,8 +1807,8 @@ non-interactive use see also `benchmark-run' and
 
 ;;;***
 \f
-;;;### (autoloads (bibtex-mode) "bibtex" "textmodes/bibtex.el" (17956
-;;;;;;  21270))
+;;;### (autoloads (bibtex-mode) "bibtex" "textmodes/bibtex.el" (18104
+;;;;;;  24770))
 ;;; Generated autoloads from textmodes/bibtex.el
 
 (autoload (quote bibtex-mode) "bibtex" "\
@@ -1853,11 +1866,23 @@ if that value is non-nil.
 
 \(fn)" t nil)
 
+;;;***
+\f
+;;;### (autoloads (bibtex-style-mode) "bibtex-style" "textmodes/bibtex-style.el"
+;;;;;;  (18104 24770))
+;;; Generated autoloads from textmodes/bibtex-style.el
+ (add-to-list 'auto-mode-alist '("\\.bst\\'" . bibtex-style-mode))
+
+(autoload (quote bibtex-style-mode) "bibtex-style" "\
+Major mode for editing BibTeX style files.
+
+\(fn)" t nil)
+
 ;;;***
 \f
 ;;;### (autoloads (binhex-decode-region binhex-decode-region-external
 ;;;;;;  binhex-decode-region-internal) "binhex" "gnus/binhex.el"
-;;;;;;  (17842 54741))
+;;;;;;  (18104 24750))
 ;;; Generated autoloads from gnus/binhex.el
 
 (defconst binhex-begin-line "^:...............................................................$")
@@ -1880,8 +1905,8 @@ Binhex decode region between START and END.
 
 ;;;***
 \f
-;;;### (autoloads (blackbox) "blackbox" "play/blackbox.el" (17842
-;;;;;;  55395))
+;;;### (autoloads (blackbox) "blackbox" "play/blackbox.el" (18104
+;;;;;;  24760))
 ;;; Generated autoloads from play/blackbox.el
 
 (autoload (quote blackbox) "blackbox" "\
@@ -2002,8 +2027,9 @@ a reflection.
 \f
 ;;;### (autoloads (bookmark-bmenu-list bookmark-load bookmark-save
 ;;;;;;  bookmark-write bookmark-delete bookmark-insert bookmark-rename
-;;;;;;  bookmark-insert-location bookmark-relocate bookmark-jump
-;;;;;;  bookmark-set) "bookmark" "bookmark.el" (17842 58280))
+;;;;;;  bookmark-insert-location bookmark-relocate bookmark-jump-other-window
+;;;;;;  bookmark-jump bookmark-set) "bookmark" "bookmark.el" (18104
+;;;;;;  24730))
 ;;; Generated autoloads from bookmark.el
  (define-key ctl-x-map "rb" 'bookmark-jump)
  (define-key ctl-x-map "rm" 'bookmark-set)
@@ -2017,12 +2043,13 @@ key of your choice to `bookmark-map'.  All interactive bookmark
 functions have a binding in this keymap.")
  (define-prefix-command 'bookmark-map)
  (define-key bookmark-map "x" 'bookmark-set)
- (define-key bookmark-map "m" 'bookmark-set) ; "m" for "mark"
+ (define-key bookmark-map "m" 'bookmark-set) ;"m"ark
  (define-key bookmark-map "j" 'bookmark-jump)
- (define-key bookmark-map "g" 'bookmark-jump) ; "g" for "go"
+ (define-key bookmark-map "g" 'bookmark-jump) ;"g"o
+ (define-key bookmark-map "o" 'bookmark-jump-other-window)
  (define-key bookmark-map "i" 'bookmark-insert)
  (define-key bookmark-map "e" 'edit-bookmarks)
- (define-key bookmark-map "f" 'bookmark-insert-location) ; "f" for "find"
+ (define-key bookmark-map "f" 'bookmark-insert-location) ;"f"ind
  (define-key bookmark-map "r" 'bookmark-rename)
  (define-key bookmark-map "d" 'bookmark-delete)
  (define-key bookmark-map "l" 'bookmark-load)
@@ -2068,6 +2095,12 @@ of the old one in the permanent bookmark record.
 
 \(fn BOOKMARK)" t nil)
 
+(autoload (quote bookmark-jump-other-window) "bookmark" "\
+Jump to BOOKMARK (a point in some file) in another window.
+See `bookmark-jump'.
+
+\(fn BOOKMARK)" t nil)
+
 (autoload (quote bookmark-relocate) "bookmark" "\
 Relocate BOOKMARK to another file (reading file name with minibuffer).
 This makes an already existing bookmark point to that file, instead of
@@ -2193,7 +2226,7 @@ deletion, or > if it is flagged for displaying.
 ;;;;;;  browse-url browse-url-of-region browse-url-of-dired-file
 ;;;;;;  browse-url-of-buffer browse-url-of-file browse-url-url-at-point
 ;;;;;;  browse-url-galeon-program browse-url-firefox-program browse-url-browser-function)
-;;;;;;  "browse-url" "net/browse-url.el" (17842 55218))
+;;;;;;  "browse-url" "net/browse-url.el" (18104 24759))
 ;;; Generated autoloads from net/browse-url.el
 
 (defvar browse-url-browser-function (cond ((memq system-type (quote (windows-nt ms-dos cygwin))) (quote browse-url-default-windows-browser)) ((memq system-type (quote (darwin))) (quote browse-url-default-macosx-browser)) (t (quote browse-url-default-browser))) "\
@@ -2524,8 +2557,8 @@ Default to the URL around or before point.
 
 ;;;***
 \f
-;;;### (autoloads (snarf-bruces bruce) "bruce" "play/bruce.el" (17842
-;;;;;;  55395))
+;;;### (autoloads (snarf-bruces bruce) "bruce" "play/bruce.el" (18104
+;;;;;;  24760))
 ;;; Generated autoloads from play/bruce.el
 
 (autoload (quote bruce) "bruce" "\
@@ -2541,7 +2574,7 @@ Return a vector containing the lines from `bruce-phrases-file'.
 ;;;***
 \f
 ;;;### (autoloads (bs-show bs-customize bs-cycle-previous bs-cycle-next)
-;;;;;;  "bs" "bs.el" (17842 58280))
+;;;;;;  "bs" "bs.el" (18104 24730))
 ;;; Generated autoloads from bs.el
 
 (autoload (quote bs-cycle-next) "bs" "\
@@ -2582,8 +2615,8 @@ name of buffer configuration.
 ;;;***
 \f
 ;;;### (autoloads (insert-text-button make-text-button insert-button
-;;;;;;  make-button define-button-type) "button" "button.el" (17992
-;;;;;;  30877))
+;;;;;;  make-button define-button-type) "button" "button.el" (18104
+;;;;;;  24730))
 ;;; Generated autoloads from button.el
 
 (defvar button-map (let ((map (make-sparse-keymap))) (define-key map "\r" (quote push-button)) (define-key map [mouse-2] (quote push-button)) map) "\
@@ -2671,7 +2704,7 @@ Also see `make-text-button'.
 ;;;;;;  batch-byte-compile-if-not-done display-call-tree byte-compile
 ;;;;;;  compile-defun byte-compile-file byte-recompile-directory
 ;;;;;;  byte-force-recompile byte-compile-warnings-safe-p) "bytecomp"
-;;;;;;  "emacs-lisp/bytecomp.el" (17949 41467))
+;;;;;;  "emacs-lisp/bytecomp.el" (18104 24746))
 ;;; Generated autoloads from emacs-lisp/bytecomp.el
 (put 'byte-compile-dynamic 'safe-local-variable 'booleanp)
 (put 'byte-compile-disable-print-circle 'safe-local-variable 'booleanp)
@@ -2777,7 +2810,7 @@ and corresponding effects.
 
 ;;;***
 \f
-;;;### (autoloads nil "cal-dst" "calendar/cal-dst.el" (17956 13479))
+;;;### (autoloads nil "cal-dst" "calendar/cal-dst.el" (18104 24745))
 ;;; Generated autoloads from calendar/cal-dst.el
 
 (put (quote calendar-daylight-savings-starts) (quote risky-local-variable) t)
@@ -2787,7 +2820,7 @@ and corresponding effects.
 ;;;***
 \f
 ;;;### (autoloads (list-yahrzeit-dates) "cal-hebrew" "calendar/cal-hebrew.el"
-;;;;;;  (17956 13479))
+;;;;;;  (18104 24745))
 ;;; Generated autoloads from calendar/cal-hebrew.el
 
 (autoload (quote list-yahrzeit-dates) "cal-hebrew" "\
@@ -2802,7 +2835,7 @@ from the cursor position.
 ;;;### (autoloads (defmath calc-embedded-activate calc-embedded calc-grab-rectangle
 ;;;;;;  calc-grab-region full-calc-keypad calc-keypad calc-eval quick-calc
 ;;;;;;  full-calc calc calc-dispatch calc-settings-file) "calc" "calc/calc.el"
-;;;;;;  (17965 11665))
+;;;;;;  (18104 24745))
 ;;; Generated autoloads from calc/calc.el
 
 (defvar calc-settings-file (convert-standard-filename "~/.calc.el") "\
@@ -2880,8 +2913,8 @@ Not documented
 
 ;;;***
 \f
-;;;### (autoloads (calculator) "calculator" "calculator.el" (17870
-;;;;;;  28179))
+;;;### (autoloads (calculator) "calculator" "calculator.el" (18104
+;;;;;;  24730))
 ;;; Generated autoloads from calculator.el
 
 (autoload (quote calculator) "calculator" "\
@@ -2909,7 +2942,7 @@ See the documentation for `calculator-mode' for more information.
 ;;;;;;  mark-holidays-in-calendar view-calendar-holidays-initially
 ;;;;;;  calendar-remove-frame-by-deleting mark-diary-entries-in-calendar
 ;;;;;;  view-diary-entries-initially calendar-offset) "calendar"
-;;;;;;  "calendar/calendar.el" (17956 13479))
+;;;;;;  "calendar/calendar.el" (18104 24745))
 ;;; Generated autoloads from calendar/calendar.el
 
 (defvar calendar-offset 0 "\
@@ -3482,7 +3515,7 @@ movement commands will not work correctly.")
 ;;;***
 \f
 ;;;### (autoloads (canlock-verify canlock-insert-header) "canlock"
-;;;;;;  "gnus/canlock.el" (17842 54741))
+;;;;;;  "gnus/canlock.el" (18104 24750))
 ;;; Generated autoloads from gnus/canlock.el
 
 (autoload (quote canlock-insert-header) "canlock" "\
@@ -3499,15 +3532,15 @@ it fails.
 
 ;;;***
 \f
-;;;### (autoloads nil "cc-compat" "progmodes/cc-compat.el" (17842
-;;;;;;  56333))
+;;;### (autoloads nil "cc-compat" "progmodes/cc-compat.el" (18104
+;;;;;;  24763))
 ;;; Generated autoloads from progmodes/cc-compat.el
 (put 'c-indent-level 'safe-local-variable 'integerp)
 
 ;;;***
 \f
 ;;;### (autoloads (c-guess-basic-syntax) "cc-engine" "progmodes/cc-engine.el"
-;;;;;;  (17942 63381))
+;;;;;;  (18104 24763))
 ;;; Generated autoloads from progmodes/cc-engine.el
 
 (autoload (quote c-guess-basic-syntax) "cc-engine" "\
@@ -3519,7 +3552,7 @@ Return the syntactic context of the current line.
 \f
 ;;;### (autoloads (pike-mode idl-mode java-mode objc-mode c++-mode
 ;;;;;;  c-mode c-initialize-cc-mode) "cc-mode" "progmodes/cc-mode.el"
-;;;;;;  (17992 30878))
+;;;;;;  (18104 24763))
 ;;; Generated autoloads from progmodes/cc-mode.el
 
 (autoload (quote c-initialize-cc-mode) "cc-mode" "\
@@ -3677,7 +3710,7 @@ Key bindings:
 ;;;***
 \f
 ;;;### (autoloads (c-set-offset c-add-style c-set-style) "cc-styles"
-;;;;;;  "progmodes/cc-styles.el" (17842 56333))
+;;;;;;  "progmodes/cc-styles.el" (18104 24764))
 ;;; Generated autoloads from progmodes/cc-styles.el
 
 (autoload (quote c-set-style) "cc-styles" "\
@@ -3728,14 +3761,14 @@ and exists only for compatibility reasons.
 
 ;;;***
 \f
-;;;### (autoloads nil "cc-subword" "progmodes/cc-subword.el" (17949
-;;;;;;  41467))
+;;;### (autoloads nil "cc-subword" "progmodes/cc-subword.el" (18104
+;;;;;;  24764))
 ;;; Generated autoloads from progmodes/cc-subword.el
  (autoload 'c-subword-mode "cc-subword" "Mode enabling subword movement and editing keys." t)
 
 ;;;***
 \f
-;;;### (autoloads nil "cc-vars" "progmodes/cc-vars.el" (17941 38806))
+;;;### (autoloads nil "cc-vars" "progmodes/cc-vars.el" (18104 24764))
 ;;; Generated autoloads from progmodes/cc-vars.el
 (put 'c-basic-offset 'safe-local-variable 'integerp)
 (put 'c-backslash-column 'safe-local-variable 'integerp)
@@ -3745,7 +3778,7 @@ and exists only for compatibility reasons.
 \f
 ;;;### (autoloads (ccl-execute-with-args check-ccl-program define-ccl-program
 ;;;;;;  declare-ccl-program ccl-dump ccl-compile) "ccl" "international/ccl.el"
-;;;;;;  (17842 54888))
+;;;;;;  (18104 24756))
 ;;; Generated autoloads from international/ccl.el
 
 (autoload (quote ccl-compile) "ccl" "\
@@ -4004,7 +4037,7 @@ See the documentation of `define-ccl-program' for the detail of CCL program.
 ;;;***
 \f
 ;;;### (autoloads (cfengine-mode) "cfengine" "progmodes/cfengine.el"
-;;;;;;  (17842 56333))
+;;;;;;  (18104 24764))
 ;;; Generated autoloads from progmodes/cfengine.el
 
 (autoload (quote cfengine-mode) "cfengine" "\
@@ -4026,7 +4059,7 @@ to the action header.
 ;;;;;;  checkdoc-comments checkdoc-continue checkdoc-start checkdoc-current-buffer
 ;;;;;;  checkdoc-eval-current-buffer checkdoc-message-interactive
 ;;;;;;  checkdoc-interactive checkdoc) "checkdoc" "emacs-lisp/checkdoc.el"
-;;;;;;  (17842 54152))
+;;;;;;  (18104 24746))
 ;;; Generated autoloads from emacs-lisp/checkdoc.el
 
 (autoload (quote checkdoc) "checkdoc" "\
@@ -4209,8 +4242,8 @@ checking of documentation strings.
 ;;;***
 \f
 ;;;### (autoloads (encode-hz-buffer encode-hz-region decode-hz-buffer
-;;;;;;  decode-hz-region) "china-util" "language/china-util.el" (17842
-;;;;;;  58278))
+;;;;;;  decode-hz-region) "china-util" "language/china-util.el" (18104
+;;;;;;  24757))
 ;;; Generated autoloads from language/china-util.el
 
 (autoload (quote decode-hz-region) "china-util" "\
@@ -4238,7 +4271,7 @@ Encode the text in the current buffer to HZ.
 ;;;***
 \f
 ;;;### (autoloads (command-history list-command-history repeat-matching-complex-command)
-;;;;;;  "chistory" "chistory.el" (17842 58280))
+;;;;;;  "chistory" "chistory.el" (18104 24730))
 ;;; Generated autoloads from chistory.el
 
 (autoload (quote repeat-matching-complex-command) "chistory" "\
@@ -4277,7 +4310,7 @@ and runs the normal hook `command-history-hook'.
 
 ;;;***
 \f
-;;;### (autoloads nil "cl" "emacs-lisp/cl.el" (17842 54152))
+;;;### (autoloads nil "cl" "emacs-lisp/cl.el" (18104 24747))
 ;;; Generated autoloads from emacs-lisp/cl.el
 
 (defvar custom-print-functions nil "\
@@ -4293,7 +4326,7 @@ a future Emacs interpreter will be able to use it.")
 ;;;***
 \f
 ;;;### (autoloads (common-lisp-indent-function) "cl-indent" "emacs-lisp/cl-indent.el"
-;;;;;;  (17842 54152))
+;;;;;;  (18104 24746))
 ;;; Generated autoloads from emacs-lisp/cl-indent.el
 
 (autoload (quote common-lisp-indent-function) "cl-indent" "\
@@ -4304,7 +4337,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (c-macro-expand) "cmacexp" "progmodes/cmacexp.el"
-;;;;;;  (17842 56333))
+;;;;;;  (18104 24764))
 ;;; Generated autoloads from progmodes/cmacexp.el
 
 (autoload (quote c-macro-expand) "cmacexp" "\
@@ -4324,8 +4357,8 @@ For use inside Lisp programs, see also `c-macro-expansion'.
 
 ;;;***
 \f
-;;;### (autoloads (run-scheme) "cmuscheme" "cmuscheme.el" (17842
-;;;;;;  58280))
+;;;### (autoloads (run-scheme) "cmuscheme" "cmuscheme.el" (18104
+;;;;;;  24730))
 ;;; Generated autoloads from cmuscheme.el
 
 (autoload (quote run-scheme) "cmuscheme" "\
@@ -4348,7 +4381,7 @@ is run).
 \f
 ;;;### (autoloads (codepage-setup cp-supported-codepages cp-offset-for-codepage
 ;;;;;;  cp-language-for-codepage cp-charset-for-codepage cp-make-coding-systems-for-codepage)
-;;;;;;  "codepage" "international/codepage.el" (17842 54888))
+;;;;;;  "codepage" "international/codepage.el" (18104 24756))
 ;;; Generated autoloads from international/codepage.el
 
 (autoload (quote cp-make-coding-systems-for-codepage) "codepage" "\
@@ -4407,7 +4440,7 @@ read/written by MS-DOS software, or for display on the MS-DOS terminal.
 ;;;### (autoloads (comint-redirect-results-list-from-process comint-redirect-results-list
 ;;;;;;  comint-redirect-send-command-to-process comint-redirect-send-command
 ;;;;;;  comint-run make-comint make-comint-in-buffer) "comint" "comint.el"
-;;;;;;  (17937 3189))
+;;;;;;  (18104 24730))
 ;;; Generated autoloads from comint.el
 
 (defvar comint-output-filter-functions (quote (comint-postoutput-scroll-to-bottom comint-watch-for-password-prompt)) "\
@@ -4429,9 +4462,9 @@ either globally or locally.")
 Make a Comint process NAME in BUFFER, running PROGRAM.
 If BUFFER is nil, it defaults to NAME surrounded by `*'s.
 PROGRAM should be either a string denoting an executable program to create
-via `start-process', or a cons pair of the form (HOST . SERVICE) denoting a TCP
-connection to be opened via `open-network-stream'.  If there is already a
-running process in that buffer, it is not restarted.  Optional fourth arg
+via `start-file-process', or a cons pair of the form (HOST . SERVICE) denoting
+a TCP connection to be opened via `open-network-stream'.  If there is already
+running process in that buffer, it is not restarted.  Optional fourth arg
 STARTFILE is the name of a file to send the contents of to the process.
 
 If PROGRAM is a string, any more args are arguments to PROGRAM.
@@ -4442,9 +4475,9 @@ If PROGRAM is a string, any more args are arguments to PROGRAM.
 Make a Comint process NAME in a buffer, running PROGRAM.
 The name of the buffer is made by surrounding NAME with `*'s.
 PROGRAM should be either a string denoting an executable program to create
-via `start-process', or a cons pair of the form (HOST . SERVICE) denoting a TCP
-connection to be opened via `open-network-stream'.  If there is already a
-running process in that buffer, it is not restarted.  Optional third arg
+via `start-file-process', or a cons pair of the form (HOST . SERVICE) denoting
+a TCP connection to be opened via `open-network-stream'.  If there is already
+running process in that buffer, it is not restarted.  Optional third arg
 STARTFILE is the name of a file to send the contents of the process to.
 
 If PROGRAM is a string, any more args are arguments to PROGRAM.
@@ -4497,8 +4530,8 @@ REGEXP-GROUP is the regular expression group in REGEXP to use.
 
 ;;;***
 \f
-;;;### (autoloads (compare-windows) "compare-w" "compare-w.el" (17926
-;;;;;;  45410))
+;;;### (autoloads (compare-windows) "compare-w" "compare-w.el" (18104
+;;;;;;  24730))
 ;;; Generated autoloads from compare-w.el
 
 (autoload (quote compare-windows) "compare-w" "\
@@ -4535,16 +4568,16 @@ on third call it again advances points to the next difference and so on.
 ;;;;;;  compilation-shell-minor-mode compilation-mode compilation-start
 ;;;;;;  compile compilation-disable-input compile-command compilation-search-path
 ;;;;;;  compilation-ask-about-save compilation-window-height compilation-mode-hook)
-;;;;;;  "compile" "progmodes/compile.el" (18006 55797))
+;;;;;;  "compile" "progmodes/compile.el" (18104 24764))
 ;;; Generated autoloads from progmodes/compile.el
 
 (defvar compilation-mode-hook nil "\
-*List of hook functions run by `compilation-mode' (see `run-mode-hooks').")
+List of hook functions run by `compilation-mode' (see `run-mode-hooks').")
 
 (custom-autoload (quote compilation-mode-hook) "compile" t)
 
 (defvar compilation-window-height nil "\
-*Number of lines in a compilation window.  If nil, use Emacs default.")
+Number of lines in a compilation window.  If nil, use Emacs default.")
 
 (custom-autoload (quote compilation-window-height) "compile" t)
 
@@ -4560,7 +4593,7 @@ bound to the compilation buffer and window, respectively.")
 Function to compute the name of a compilation buffer.
 The function receives one argument, the name of the major mode of the
 compilation buffer.  It should return a string.
-nil means compute the name with `(concat \"*\" (downcase major-mode) \"*\")'.")
+If nil, compute the name with `(concat \"*\" (downcase major-mode) \"*\")'.")
 
 (defvar compilation-finish-function nil "\
 Function to call when a compilation process finishes.
@@ -4574,20 +4607,20 @@ and a string describing how the process finished.")
 (put 'compilation-directory 'safe-local-variable 'stringp)
 
 (defvar compilation-ask-about-save t "\
-*Non-nil means \\[compile] asks which buffers to save before compiling.
+Non-nil means \\[compile] asks which buffers to save before compiling.
 Otherwise, it saves all modified buffers without asking.")
 
 (custom-autoload (quote compilation-ask-about-save) "compile" t)
 
 (defvar compilation-search-path (quote (nil)) "\
-*List of directories to search for source files named in error messages.
+List of directories to search for source files named in error messages.
 Elements should be directory names, not file names of directories.
-nil as an element means to try the default directory.")
+The value nil as an element means to try the default directory.")
 
 (custom-autoload (quote compilation-search-path) "compile" t)
 
 (defvar compile-command "make -k " "\
-*Last shell command used to do a compilation; default for next compilation.
+Last shell command used to do a compilation; default for next compilation.
 
 Sometimes it is useful for files to supply local values for this variable.
 You might also use mode hooks to specify it in certain modes, like this:
@@ -4604,7 +4637,7 @@ You might also use mode hooks to specify it in certain modes, like this:
 (put 'compile-command 'safe-local-variable 'stringp)
 
 (defvar compilation-disable-input nil "\
-*If non-nil, send end-of-file as compilation process input.
+If non-nil, send end-of-file as compilation process input.
 This only affects platforms that support asynchronous processes (see
 `start-process'); synchronous compilation processes never accept input.")
 
@@ -4626,11 +4659,13 @@ non-nil; otherwise uses `compile-command'.  With prefix arg, always prompts.
 Additionally, with universal prefix arg, compilation buffer will be in
 comint mode, i.e. interactive.
 
-To run more than one compilation at once, start one and rename
+To run more than one compilation at once, start one then rename
 the `*compilation*' buffer to some other name with
-\\[rename-buffer].  Then start the next one.  On most systems,
-termination of the main compilation process kills its
-subprocesses.
+\\[rename-buffer].  Then _switch buffers_ and start the new compilation.
+It will create a new `*compilation*' buffer.
+
+On most systems, termination of the main compilation process
+kills its subprocesses.
 
 The name used for the buffer is actually whatever is returned by
 the function in `compilation-buffer-name-function', so you can set that
@@ -4645,8 +4680,11 @@ The rest of the arguments are optional; for them, nil means use the default.
 
 MODE is the major mode to set in the compilation buffer.  Mode
 may also be t meaning use `compilation-shell-minor-mode' under `comint-mode'.
+
 If NAME-FUNCTION is non-nil, call it with one argument (the mode name)
-to determine the buffer name.
+to determine the buffer name.  Otherwise, the default is to
+reuses the current buffer if it has the proper major mode,
+else use or create a buffer with name based on the major mode.
 
 If HIGHLIGHT-REGEXP is non-nil, `next-error' will temporarily highlight
 the matching section of the visited source line; the default is to use the
@@ -4698,7 +4736,7 @@ This is the value of `next-error-function' in Compilation buffers.
 ;;;***
 \f
 ;;;### (autoloads (partial-completion-mode) "complete" "complete.el"
-;;;;;;  (17954 15344))
+;;;;;;  (18104 24730))
 ;;; Generated autoloads from complete.el
 
 (defvar partial-completion-mode nil "\
@@ -4740,7 +4778,7 @@ second TAB brings up the `*Completions*' buffer.
 ;;;***
 \f
 ;;;### (autoloads (dynamic-completion-mode) "completion" "completion.el"
-;;;;;;  (17842 58280))
+;;;;;;  (18104 24731))
 ;;; Generated autoloads from completion.el
 
 (defvar dynamic-completion-mode nil "\
@@ -4762,7 +4800,7 @@ Enable dynamic word-completion.
 ;;;### (autoloads (decompose-composite-char compose-last-chars compose-chars-after
 ;;;;;;  find-composition compose-chars decompose-string compose-string
 ;;;;;;  decompose-region compose-region encode-composition-rule)
-;;;;;;  "composite" "composite.el" (17842 58280))
+;;;;;;  "composite" "composite.el" (18104 24731))
 ;;; Generated autoloads from composite.el
 
 (defconst reference-point-alist (quote ((tl . 0) (tc . 1) (tr . 2) (Bl . 3) (Bc . 4) (Br . 5) (bl . 6) (bc . 7) (br . 8) (cl . 9) (cc . 10) (cr . 11) (top-left . 0) (top-center . 1) (top-right . 2) (base-left . 3) (base-center . 4) (base-right . 5) (bottom-left . 6) (bottom-center . 7) (bottom-right . 8) (center-left . 9) (center-center . 10) (center-right . 11) (ml . 3) (mc . 10) (mr . 5) (mid-left . 3) (mid-center . 10) (mid-right . 5))) "\
@@ -4984,7 +5022,7 @@ Optional 3rd arg WITH-COMPOSITION-RULE is ignored.
 ;;;### (autoloads (conf-xdefaults-mode conf-ppd-mode conf-colon-mode
 ;;;;;;  conf-space-keywords conf-space-mode conf-javaprop-mode conf-windows-mode
 ;;;;;;  conf-unix-mode conf-mode) "conf-mode" "textmodes/conf-mode.el"
-;;;;;;  (17842 58277))
+;;;;;;  (18104 24770))
 ;;; Generated autoloads from textmodes/conf-mode.el
 
 (autoload (quote conf-mode) "conf-mode" "\
@@ -5140,7 +5178,7 @@ For details see `conf-mode'.  Example:
 ;;;***
 \f
 ;;;### (autoloads (shuffle-vector cookie-snarf cookie-insert cookie)
-;;;;;;  "cookie1" "play/cookie1.el" (17842 55395))
+;;;;;;  "cookie1" "play/cookie1.el" (18104 24760))
 ;;; Generated autoloads from play/cookie1.el
 
 (autoload (quote cookie) "cookie1" "\
@@ -5172,7 +5210,7 @@ Randomly permute the elements of VECTOR (all permutations equally likely).
 ;;;***
 \f
 ;;;### (autoloads (copyright copyright-fix-years copyright-update)
-;;;;;;  "copyright" "emacs-lisp/copyright.el" (17842 54152))
+;;;;;;  "copyright" "emacs-lisp/copyright.el" (18104 24747))
 ;;; Generated autoloads from emacs-lisp/copyright.el
 
 (autoload (quote copyright-update) "copyright" "\
@@ -5200,7 +5238,7 @@ Insert a copyright by $ORGANIZATION notice at cursor.
 ;;;***
 \f
 ;;;### (autoloads (cperl-perldoc-at-point cperl-perldoc cperl-mode)
-;;;;;;  "cperl-mode" "progmodes/cperl-mode.el" (17955 36604))
+;;;;;;  "cperl-mode" "progmodes/cperl-mode.el" (18104 24764))
 ;;; Generated autoloads from progmodes/cperl-mode.el
 
 (autoload (quote cperl-mode) "cperl-mode" "\
@@ -5391,7 +5429,7 @@ Run a `perldoc' on the word around point.
 ;;;***
 \f
 ;;;### (autoloads (cpp-parse-edit cpp-highlight-buffer) "cpp" "progmodes/cpp.el"
-;;;;;;  (17842 56333))
+;;;;;;  (18104 24764))
 ;;; Generated autoloads from progmodes/cpp.el
 
 (autoload (quote cpp-highlight-buffer) "cpp" "\
@@ -5410,7 +5448,7 @@ Edit display information for cpp conditionals.
 ;;;***
 \f
 ;;;### (autoloads (crisp-mode crisp-mode) "crisp" "emulation/crisp.el"
-;;;;;;  (17842 54264))
+;;;;;;  (18104 24748))
 ;;; Generated autoloads from emulation/crisp.el
 
 (defvar crisp-mode nil "\
@@ -5434,7 +5472,7 @@ With ARG, turn CRiSP mode on if ARG is positive, off otherwise.
 ;;;***
 \f
 ;;;### (autoloads (completing-read-multiple) "crm" "emacs-lisp/crm.el"
-;;;;;;  (17842 54152))
+;;;;;;  (18104 24747))
 ;;; Generated autoloads from emacs-lisp/crm.el
 
 (autoload (quote completing-read-multiple) "crm" "\
@@ -5467,10 +5505,22 @@ INHERIT-INPUT-METHOD.
 
 \(fn PROMPT TABLE &optional PREDICATE REQUIRE-MATCH INITIAL-INPUT HIST DEF INHERIT-INPUT-METHOD)" nil nil)
 
+;;;***
+\f
+;;;### (autoloads (css-mode) "css-mode" "textmodes/css-mode.el" (18104
+;;;;;;  24771))
+;;; Generated autoloads from textmodes/css-mode.el
+ (add-to-list 'auto-mode-alist '("\\.css\\'" . css-mode))
+
+(autoload (quote css-mode) "css-mode" "\
+Major mode to edit Cascading Style Sheets.
+
+\(fn)" t nil)
+
 ;;;***
 \f
 ;;;### (autoloads (cua-selection-mode cua-mode) "cua-base" "emulation/cua-base.el"
-;;;;;;  (17888 45995))
+;;;;;;  (18104 24748))
 ;;; Generated autoloads from emulation/cua-base.el
 
 (defvar cua-mode nil "\
@@ -5538,7 +5588,7 @@ Enable CUA selection mode without the C-z/C-x/C-c/C-v bindings.
 ;;;;;;  customize-mode customize customize-save-variable customize-set-variable
 ;;;;;;  customize-set-value custom-menu-sort-alphabetically custom-buffer-sort-alphabetically
 ;;;;;;  custom-browse-sort-alphabetically) "cus-edit" "cus-edit.el"
-;;;;;;  (17952 11093))
+;;;;;;  (18104 24731))
 ;;; Generated autoloads from cus-edit.el
 
 (defvar custom-browse-sort-alphabetically nil "\
@@ -5622,12 +5672,12 @@ then prompt for the MODE to customize.
 (autoload (quote customize-group) "cus-edit" "\
 Customize GROUP, which must be a customization group.
 
-\(fn GROUP)" t nil)
+\(fn &optional GROUP)" t nil)
 
 (autoload (quote customize-group-other-window) "cus-edit" "\
-Customize GROUP, which must be a customization group.
+Customize GROUP, which must be a customization group, in another window.
 
-\(fn GROUP)" t nil)
+\(fn &optional GROUP)" t nil)
 
 (defalias (quote customize-variable) (quote customize-option))
 
@@ -5836,7 +5886,7 @@ The format is suitable for use with `easy-menu-define'.
 ;;;***
 \f
 ;;;### (autoloads (custom-reset-faces custom-theme-reset-faces custom-set-faces
-;;;;;;  custom-declare-face) "cus-face" "cus-face.el" (17842 58280))
+;;;;;;  custom-declare-face) "cus-face" "cus-face.el" (18104 24732))
 ;;; Generated autoloads from cus-face.el
 
 (autoload (quote custom-declare-face) "cus-face" "\
@@ -5906,7 +5956,7 @@ This means reset FACE to its value in FROM-THEME.
 ;;;***
 \f
 ;;;### (autoloads (customize-create-theme) "cus-theme" "cus-theme.el"
-;;;;;;  (17842 58280))
+;;;;;;  (18104 24732))
 ;;; Generated autoloads from cus-theme.el
 
 (autoload (quote customize-create-theme) "cus-theme" "\
@@ -5917,7 +5967,7 @@ Create a custom theme.
 ;;;***
 \f
 ;;;### (autoloads (cvs-status-mode) "cvs-status" "cvs-status.el"
-;;;;;;  (17842 58280))
+;;;;;;  (18104 24732))
 ;;; Generated autoloads from cvs-status.el
 
 (autoload (quote cvs-status-mode) "cvs-status" "\
@@ -5928,7 +5978,7 @@ Mode used for cvs status output.
 ;;;***
 \f
 ;;;### (autoloads (global-cwarn-mode turn-on-cwarn-mode cwarn-mode)
-;;;;;;  "cwarn" "progmodes/cwarn.el" (17860 50532))
+;;;;;;  "cwarn" "progmodes/cwarn.el" (18104 24764))
 ;;; Generated autoloads from progmodes/cwarn.el
 
 (autoload (quote cwarn-mode) "cwarn" "\
@@ -5971,7 +6021,7 @@ See `cwarn-mode' for more information on Cwarn mode.
 \f
 ;;;### (autoloads (standard-display-cyrillic-translit cyrillic-encode-alternativnyj-char
 ;;;;;;  cyrillic-encode-koi8-r-char) "cyril-util" "language/cyril-util.el"
-;;;;;;  (17842 58278))
+;;;;;;  (18104 24757))
 ;;; Generated autoloads from language/cyril-util.el
 
 (autoload (quote cyrillic-encode-koi8-r-char) "cyril-util" "\
@@ -6000,7 +6050,7 @@ If the argument is nil, we return the display table to its standard state.
 ;;;***
 \f
 ;;;### (autoloads (dabbrev-expand dabbrev-completion) "dabbrev" "dabbrev.el"
-;;;;;;  (18006 55794))
+;;;;;;  (18104 24732))
 ;;; Generated autoloads from dabbrev.el
  (define-key esc-map "/" 'dabbrev-expand)
  (define-key esc-map [?\C-/] 'dabbrev-completion)
@@ -6044,8 +6094,8 @@ See also `dabbrev-abbrev-char-regexp' and \\[dabbrev-completion].
 
 ;;;***
 \f
-;;;### (autoloads (dcl-mode) "dcl-mode" "progmodes/dcl-mode.el" (17949
-;;;;;;  41468))
+;;;### (autoloads (dcl-mode) "dcl-mode" "progmodes/dcl-mode.el" (18104
+;;;;;;  24764))
 ;;; Generated autoloads from progmodes/dcl-mode.el
 
 (autoload (quote dcl-mode) "dcl-mode" "\
@@ -6172,7 +6222,7 @@ There is some minimal font-lock support (see vars
 ;;;***
 \f
 ;;;### (autoloads (cancel-debug-on-entry debug-on-entry debug) "debug"
-;;;;;;  "emacs-lisp/debug.el" (17842 54152))
+;;;;;;  "emacs-lisp/debug.el" (18104 24747))
 ;;; Generated autoloads from emacs-lisp/debug.el
 
 (setq debugger (quote debug))
@@ -6216,7 +6266,7 @@ To specify a nil argument interactively, exit with an empty minibuffer.
 ;;;***
 \f
 ;;;### (autoloads (decipher-mode decipher) "decipher" "play/decipher.el"
-;;;;;;  (17842 55395))
+;;;;;;  (18104 24760))
 ;;; Generated autoloads from play/decipher.el
 
 (autoload (quote decipher) "decipher" "\
@@ -6245,8 +6295,8 @@ The most useful commands are:
 ;;;***
 \f
 ;;;### (autoloads (delimit-columns-rectangle delimit-columns-region
-;;;;;;  delimit-columns-customize) "delim-col" "delim-col.el" (17842
-;;;;;;  58280))
+;;;;;;  delimit-columns-customize) "delim-col" "delim-col.el" (18104
+;;;;;;  24732))
 ;;; Generated autoloads from delim-col.el
 
 (autoload (quote delimit-columns-customize) "delim-col" "\
@@ -6270,8 +6320,8 @@ START and END delimits the corners of text rectangle.
 
 ;;;***
 \f
-;;;### (autoloads (delphi-mode) "delphi" "progmodes/delphi.el" (17842
-;;;;;;  56333))
+;;;### (autoloads (delphi-mode) "delphi" "progmodes/delphi.el" (18104
+;;;;;;  24765))
 ;;; Generated autoloads from progmodes/delphi.el
 
 (autoload (quote delphi-mode) "delphi" "\
@@ -6321,8 +6371,8 @@ no args, if that value is non-nil.
 
 ;;;***
 \f
-;;;### (autoloads (delete-selection-mode) "delsel" "delsel.el" (17842
-;;;;;;  58280))
+;;;### (autoloads (delete-selection-mode) "delsel" "delsel.el" (18104
+;;;;;;  24732))
 ;;; Generated autoloads from delsel.el
 
 (defalias (quote pending-delete-mode) (quote delete-selection-mode))
@@ -6351,7 +6401,7 @@ any selection.
 ;;;***
 \f
 ;;;### (autoloads (derived-mode-init-mode-variables define-derived-mode)
-;;;;;;  "derived" "emacs-lisp/derived.el" (17842 54152))
+;;;;;;  "derived" "emacs-lisp/derived.el" (18104 24747))
 ;;; Generated autoloads from emacs-lisp/derived.el
 
 (autoload (quote define-derived-mode) "derived" "\
@@ -6416,7 +6466,7 @@ the first time the mode is used.
 ;;;***
 \f
 ;;;### (autoloads (describe-char describe-text-properties) "descr-text"
-;;;;;;  "descr-text.el" (17874 62047))
+;;;;;;  "descr-text.el" (18104 24732))
 ;;; Generated autoloads from descr-text.el
 
 (autoload (quote describe-text-properties) "descr-text" "\
@@ -6442,7 +6492,7 @@ as well as widgets, buttons, overlays, and text properties.
 ;;;### (autoloads (desktop-revert desktop-save-in-desktop-dir desktop-change-dir
 ;;;;;;  desktop-load-default desktop-read desktop-remove desktop-save
 ;;;;;;  desktop-clear desktop-locals-to-save desktop-save-mode) "desktop"
-;;;;;;  "desktop.el" (17949 41467))
+;;;;;;  "desktop.el" (18104 24732))
 ;;; Generated autoloads from desktop.el
 
 (defvar desktop-save-mode nil "\
@@ -6576,9 +6626,10 @@ Furthermore, it clears the variables listed in `desktop-globals-to-clear'.
 (autoload (quote desktop-save) "desktop" "\
 Save the desktop in a desktop file.
 Parameter DIRNAME specifies where to save the desktop file.
+Optional parameter RELEASE says whether we're done with this desktop.
 See also `desktop-base-file-name'.
 
-\(fn DIRNAME)" t nil)
+\(fn DIRNAME &optional RELEASE)" t nil)
 
 (autoload (quote desktop-remove) "desktop" "\
 Delete desktop file in `desktop-dirname'.
@@ -6625,7 +6676,7 @@ Revert to the last loaded desktop.
 \f
 ;;;### (autoloads (gnus-article-outlook-deuglify-article gnus-outlook-deuglify-article
 ;;;;;;  gnus-article-outlook-repair-attribution gnus-article-outlook-unwrap-lines)
-;;;;;;  "deuglify" "gnus/deuglify.el" (17842 54741))
+;;;;;;  "deuglify" "gnus/deuglify.el" (18104 24750))
 ;;; Generated autoloads from gnus/deuglify.el
 
 (autoload (quote gnus-article-outlook-unwrap-lines) "deuglify" "\
@@ -6658,7 +6709,7 @@ Deuglify broken Outlook (Express) articles and redisplay.
 ;;;***
 \f
 ;;;### (autoloads (devanagari-post-read-conversion devanagari-compose-region)
-;;;;;;  "devan-util" "language/devan-util.el" (17842 58278))
+;;;;;;  "devan-util" "language/devan-util.el" (18104 24757))
 ;;; Generated autoloads from language/devan-util.el
 
 (defconst devanagari-consonant "[\x51ad5-\x51af9\x51b38-\x51b3f]")
@@ -6676,7 +6727,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (diary-mode diary-mail-entries diary) "diary-lib"
-;;;;;;  "calendar/diary-lib.el" (17958 11887))
+;;;;;;  "calendar/diary-lib.el" (18104 24745))
 ;;; Generated autoloads from calendar/diary-lib.el
 
 (autoload (quote diary) "diary-lib" "\
@@ -6722,7 +6773,7 @@ Major mode for editing the diary file.
 ;;;***
 \f
 ;;;### (autoloads (diff-backup diff diff-command diff-switches) "diff"
-;;;;;;  "diff.el" (17992 30877))
+;;;;;;  "diff.el" (18104 24733))
 ;;; Generated autoloads from diff.el
 
 (defvar diff-switches "-c" "\
@@ -6756,7 +6807,7 @@ With prefix arg, prompt for diff switches.
 ;;;***
 \f
 ;;;### (autoloads (diff-minor-mode diff-mode) "diff-mode" "diff-mode.el"
-;;;;;;  (17992 30877))
+;;;;;;  (18104 24733))
 ;;; Generated autoloads from diff-mode.el
 
 (autoload (quote diff-mode) "diff-mode" "\
@@ -6788,7 +6839,7 @@ Minor mode for viewing/editing context diffs.
 ;;;;;;  dired dired-copy-preserve-time dired-dwim-target dired-keep-marker-symlink
 ;;;;;;  dired-keep-marker-hardlink dired-keep-marker-copy dired-keep-marker-rename
 ;;;;;;  dired-trivial-filenames dired-ls-F-marks-symlinks dired-listing-switches)
-;;;;;;  "dired" "dired.el" (18015 32019))
+;;;;;;  "dired" "dired.el" (18104 24733))
 ;;; Generated autoloads from dired.el
 
 (defvar dired-listing-switches "-al" "\
@@ -6993,7 +7044,7 @@ Keybindings:
 ;;;;;;  dired-run-shell-command dired-do-shell-command dired-clean-directory
 ;;;;;;  dired-do-print dired-do-touch dired-do-chown dired-do-chgrp
 ;;;;;;  dired-do-chmod dired-compare-directories dired-backup-diff
-;;;;;;  dired-diff) "dired-aux" "dired-aux.el" (17859 20444))
+;;;;;;  dired-diff) "dired-aux" "dired-aux.el" (18104 24733))
 ;;; Generated autoloads from dired-aux.el
 
 (autoload (quote dired-diff) "dired-aux" "\
@@ -7408,7 +7459,7 @@ true then the type of the file linked to by FILE is printed instead.
 ;;;***
 \f
 ;;;### (autoloads (dired-do-relsymlink dired-jump) "dired-x" "dired-x.el"
-;;;;;;  (17992 30877))
+;;;;;;  (18104 24733))
 ;;; Generated autoloads from dired-x.el
 
 (autoload (quote dired-jump) "dired-x" "\
@@ -7437,7 +7488,7 @@ For absolute symlinks, use \\[dired-do-symlink].
 
 ;;;***
 \f
-;;;### (autoloads (dirtrack) "dirtrack" "dirtrack.el" (17842 58280))
+;;;### (autoloads (dirtrack) "dirtrack" "dirtrack.el" (18104 24733))
 ;;; Generated autoloads from dirtrack.el
 
 (autoload (quote dirtrack) "dirtrack" "\
@@ -7456,8 +7507,8 @@ You can enable directory tracking by adding this function to
 
 ;;;***
 \f
-;;;### (autoloads (disassemble) "disass" "emacs-lisp/disass.el" (17842
-;;;;;;  54152))
+;;;### (autoloads (disassemble) "disass" "emacs-lisp/disass.el" (18104
+;;;;;;  24747))
 ;;; Generated autoloads from emacs-lisp/disass.el
 
 (autoload (quote disassemble) "disass" "\
@@ -7476,7 +7527,7 @@ redefine OBJECT if it is a symbol.
 ;;;;;;  standard-display-g1 standard-display-ascii standard-display-default
 ;;;;;;  standard-display-8bit describe-current-display-table describe-display-table
 ;;;;;;  set-display-table-slot display-table-slot make-display-table)
-;;;;;;  "disp-table" "disp-table.el" (17874 62056))
+;;;;;;  "disp-table" "disp-table.el" (18104 24734))
 ;;; Generated autoloads from disp-table.el
 
 (autoload (quote make-display-table) "disp-table" "\
@@ -7573,7 +7624,7 @@ with either the `--unibyte' option or the EMACS_UNIBYTE environment
 variable, or else customize `enable-multibyte-characters'.
 
 With prefix argument, this command enables European character display
-if arg is positive, disables it otherwise.  Otherwise, it toggles
+if ARG is positive, disables it otherwise.  Otherwise, it toggles
 European character display.
 
 When this mode is enabled, characters in the range of 160 to 255
@@ -7592,7 +7643,7 @@ for users who call this function in `.emacs'.
 ;;;***
 \f
 ;;;### (autoloads (dissociated-press) "dissociate" "play/dissociate.el"
-;;;;;;  (17941 38806))
+;;;;;;  (18104 24760))
 ;;; Generated autoloads from play/dissociate.el
 
 (autoload (quote dissociated-press) "dissociate" "\
@@ -7608,7 +7659,7 @@ Default is 2.
 
 ;;;***
 \f
-;;;### (autoloads (dnd-protocol-alist) "dnd" "dnd.el" (17949 41467))
+;;;### (autoloads (dnd-protocol-alist) "dnd" "dnd.el" (18104 24734))
 ;;; Generated autoloads from dnd.el
 
 (defvar dnd-protocol-alist (quote (("^file:///" . dnd-open-local-file) ("^file://" . dnd-open-file) ("^file:" . dnd-open-local-file) ("^\\(https?\\|ftp\\|file\\|nfs\\)://" . dnd-open-file))) "\
@@ -7629,7 +7680,7 @@ if some action was made, or nil if the URL is ignored.")
 ;;;***
 \f
 ;;;### (autoloads (dns-mode-soa-increment-serial dns-mode) "dns-mode"
-;;;;;;  "textmodes/dns-mode.el" (17842 58277))
+;;;;;;  "textmodes/dns-mode.el" (18104 24771))
 ;;; Generated autoloads from textmodes/dns-mode.el
 
 (autoload (quote dns-mode) "dns-mode" "\
@@ -7653,7 +7704,7 @@ Locate SOA record and increment the serial field.
 
 ;;;***
 \f
-;;;### (autoloads (doctor) "doctor" "play/doctor.el" (17941 38806))
+;;;### (autoloads (doctor) "doctor" "play/doctor.el" (18104 24760))
 ;;; Generated autoloads from play/doctor.el
 
 (autoload (quote doctor) "doctor" "\
@@ -7664,7 +7715,7 @@ Switch to *doctor* buffer and start giving psychotherapy.
 ;;;***
 \f
 ;;;### (autoloads (double-mode double-mode) "double" "double.el"
-;;;;;;  (17842 58280))
+;;;;;;  (18104 24734))
 ;;; Generated autoloads from double.el
 
 (defvar double-mode nil "\
@@ -7685,7 +7736,7 @@ when pressed twice.  See variable `double-map' for details.
 
 ;;;***
 \f
-;;;### (autoloads (dunnet) "dunnet" "play/dunnet.el" (17842 55395))
+;;;### (autoloads (dunnet) "dunnet" "play/dunnet.el" (18104 24761))
 ;;; Generated autoloads from play/dunnet.el
 
 (autoload (quote dunnet) "dunnet" "\
@@ -7696,7 +7747,7 @@ Switch to *dungeon* buffer and start game.
 ;;;***
 \f
 ;;;### (autoloads (gnus-earcon-display) "earcon" "gnus/earcon.el"
-;;;;;;  (17842 54741))
+;;;;;;  (18104 24750))
 ;;; Generated autoloads from gnus/earcon.el
 
 (autoload (quote gnus-earcon-display) "earcon" "\
@@ -7708,7 +7759,7 @@ Play sounds in message buffers.
 \f
 ;;;### (autoloads (easy-mmode-defsyntax easy-mmode-defmap easy-mmode-define-keymap
 ;;;;;;  define-globalized-minor-mode define-minor-mode) "easy-mmode"
-;;;;;;  "emacs-lisp/easy-mmode.el" (17992 30878))
+;;;;;;  "emacs-lisp/easy-mmode.el" (18104 24747))
 ;;; Generated autoloads from emacs-lisp/easy-mmode.el
 
 (defalias (quote easy-mmode-define-minor-mode) (quote define-minor-mode))
@@ -7730,7 +7781,7 @@ used (see below).
 
 BODY contains code to execute each time the mode is activated or deactivated.
   It is executed after toggling the mode,
-  and before running the hook variable `mode-HOOK'.
+  and before running the hook variable `MODE-hook'.
   Before the actual body code, you can write keyword arguments (alternating
   keywords and values).  These following keyword arguments are supported (other
   keywords will be passed to `defcustom' if the minor mode is global):
@@ -7802,8 +7853,8 @@ CSS contains a list of syntax specifications of the form (CHAR . SYNTAX).
 ;;;***
 \f
 ;;;### (autoloads (easy-menu-change easy-menu-create-menu easy-menu-do-define
-;;;;;;  easy-menu-define) "easymenu" "emacs-lisp/easymenu.el" (17842
-;;;;;;  54152))
+;;;;;;  easy-menu-define) "easymenu" "emacs-lisp/easymenu.el" (18104
+;;;;;;  24747))
 ;;; Generated autoloads from emacs-lisp/easymenu.el
 
 (put (quote easy-menu-define) (quote lisp-indent-function) (quote defun))
@@ -7947,12 +7998,12 @@ To implement dynamic menus, either call this from
 \f
 ;;;### (autoloads (ebnf-pop-style ebnf-push-style ebnf-reset-style
 ;;;;;;  ebnf-apply-style ebnf-merge-style ebnf-delete-style ebnf-insert-style
-;;;;;;  ebnf-setup ebnf-syntax-region ebnf-syntax-buffer ebnf-syntax-file
-;;;;;;  ebnf-syntax-directory ebnf-eps-region ebnf-eps-buffer ebnf-eps-file
-;;;;;;  ebnf-eps-directory ebnf-spool-region ebnf-spool-buffer ebnf-spool-file
-;;;;;;  ebnf-spool-directory ebnf-print-region ebnf-print-buffer
+;;;;;;  ebnf-find-style ebnf-setup ebnf-syntax-region ebnf-syntax-buffer
+;;;;;;  ebnf-syntax-file ebnf-syntax-directory ebnf-eps-region ebnf-eps-buffer
+;;;;;;  ebnf-eps-file ebnf-eps-directory ebnf-spool-region ebnf-spool-buffer
+;;;;;;  ebnf-spool-file ebnf-spool-directory ebnf-print-region ebnf-print-buffer
 ;;;;;;  ebnf-print-file ebnf-print-directory ebnf-customize) "ebnf2ps"
-;;;;;;  "progmodes/ebnf2ps.el" (17952 11093))
+;;;;;;  "progmodes/ebnf2ps.el" (18104 24765))
 ;;; Generated autoloads from progmodes/ebnf2ps.el
 
 (autoload (quote ebnf-customize) "ebnf2ps" "\
@@ -8081,7 +8132,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.
+        files.
 
 \(fn)" t nil)
 
@@ -8103,7 +8154,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.
+        files.
 
 \(fn FROM TO)" t nil)
 
@@ -8137,7 +8188,7 @@ Do a syntactic analysis of the current buffer.
 \(fn)" t nil)
 
 (autoload (quote ebnf-syntax-region) "ebnf2ps" "\
-Do a syntactic analysis of region.
+Do a syntactic analysis of region.
 
 \(fn FROM TO)" t nil)
 
@@ -8146,6 +8197,13 @@ Return the current ebnf2ps setup.
 
 \(fn)" nil nil)
 
+(autoload (quote ebnf-find-style) "ebnf2ps" "\
+Return style definition if NAME is already defined; otherwise, return nil.
+
+See `ebnf-style-database' documentation.
+
+\(fn NAME)" t nil)
+
 (autoload (quote ebnf-insert-style) "ebnf2ps" "\
 Insert a new style NAME with inheritance INHERITS and values VALUES.
 
@@ -8219,8 +8277,8 @@ See `ebnf-style-database' documentation.
 ;;;;;;  ebrowse-tags-find-declaration-other-window ebrowse-tags-find-definition
 ;;;;;;  ebrowse-tags-view-definition ebrowse-tags-find-declaration
 ;;;;;;  ebrowse-tags-view-declaration ebrowse-member-mode ebrowse-electric-choose-tree
-;;;;;;  ebrowse-tree-mode) "ebrowse" "progmodes/ebrowse.el" (17821
-;;;;;;  5918))
+;;;;;;  ebrowse-tree-mode) "ebrowse" "progmodes/ebrowse.el" (18104
+;;;;;;  24765))
 ;;; Generated autoloads from progmodes/ebrowse.el
 
 (autoload (quote ebrowse-tree-mode) "ebrowse" "\
@@ -8371,7 +8429,7 @@ Display statistics for a class tree.
 ;;;***
 \f
 ;;;### (autoloads (electric-buffer-list) "ebuff-menu" "ebuff-menu.el"
-;;;;;;  (17842 58280))
+;;;;;;  (18104 24735))
 ;;; Generated autoloads from ebuff-menu.el
 
 (autoload (quote electric-buffer-list) "ebuff-menu" "\
@@ -8396,7 +8454,7 @@ Run hooks in `electric-buffer-menu-mode-hook' on entry.
 ;;;***
 \f
 ;;;### (autoloads (Electric-command-history-redo-expression) "echistory"
-;;;;;;  "echistory.el" (17842 58280))
+;;;;;;  "echistory.el" (18104 24735))
 ;;; Generated autoloads from echistory.el
 
 (autoload (quote Electric-command-history-redo-expression) "echistory" "\
@@ -8409,7 +8467,7 @@ With prefix arg NOCONFIRM, execute current line as-is without editing.
 \f
 ;;;### (autoloads (edebug-all-forms edebug-all-defs edebug-eval-top-level-form
 ;;;;;;  edebug-basic-spec edebug-all-forms edebug-all-defs) "edebug"
-;;;;;;  "emacs-lisp/edebug.el" (17952 11093))
+;;;;;;  "emacs-lisp/edebug.el" (18104 24747))
 ;;; Generated autoloads from emacs-lisp/edebug.el
 
 (defvar edebug-all-defs nil "\
@@ -8482,7 +8540,7 @@ Toggle edebugging of all forms.
 ;;;;;;  ediff-merge-directory-revisions ediff-merge-directories-with-ancestor
 ;;;;;;  ediff-merge-directories ediff-directories3 ediff-directory-revisions
 ;;;;;;  ediff-directories ediff-buffers3 ediff-buffers ediff-backup
-;;;;;;  ediff-files3 ediff-files) "ediff" "ediff.el" (17846 30361))
+;;;;;;  ediff-files3 ediff-files) "ediff" "ediff.el" (18104 24735))
 ;;; Generated autoloads from ediff.el
 
 (autoload (quote ediff-files) "ediff" "\
@@ -8714,7 +8772,7 @@ With optional NODE, goes to that node.
 ;;;***
 \f
 ;;;### (autoloads (ediff-customize) "ediff-help" "ediff-help.el"
-;;;;;;  (17842 58280))
+;;;;;;  (18104 24735))
 ;;; Generated autoloads from ediff-help.el
 
 (autoload (quote ediff-customize) "ediff-help" "\
@@ -8724,7 +8782,7 @@ Not documented
 
 ;;;***
 \f
-;;;### (autoloads nil "ediff-hook" "ediff-hook.el" (17842 58280))
+;;;### (autoloads nil "ediff-hook" "ediff-hook.el" (18104 24735))
 ;;; Generated autoloads from ediff-hook.el
 
 (defvar ediff-window-setup-function)
@@ -8737,7 +8795,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (ediff-show-registry) "ediff-mult" "ediff-mult.el"
-;;;;;;  (17842 58279))
+;;;;;;  (18104 24735))
 ;;; Generated autoloads from ediff-mult.el
 
 (autoload (quote ediff-show-registry) "ediff-mult" "\
@@ -8750,7 +8808,7 @@ Display Ediff's registry.
 ;;;***
 \f
 ;;;### (autoloads (ediff-toggle-use-toolbar ediff-toggle-multiframe)
-;;;;;;  "ediff-util" "ediff-util.el" (17846 30361))
+;;;;;;  "ediff-util" "ediff-util.el" (18104 24735))
 ;;; Generated autoloads from ediff-util.el
 
 (autoload (quote ediff-toggle-multiframe) "ediff-util" "\
@@ -8771,7 +8829,7 @@ To change the default, set the variable `ediff-use-toolbar-p', which see.
 \f
 ;;;### (autoloads (format-kbd-macro read-kbd-macro edit-named-kbd-macro
 ;;;;;;  edit-last-kbd-macro edit-kbd-macro) "edmacro" "edmacro.el"
-;;;;;;  (17842 58279))
+;;;;;;  (18104 24735))
 ;;; Generated autoloads from edmacro.el
 
 (defvar edmacro-eight-bits nil "\
@@ -8824,7 +8882,7 @@ or nil, use a compact 80-column format.
 ;;;***
 \f
 ;;;### (autoloads (edt-emulation-on edt-set-scroll-margins) "edt"
-;;;;;;  "emulation/edt.el" (17842 54264))
+;;;;;;  "emulation/edt.el" (18104 24748))
 ;;; Generated autoloads from emulation/edt.el
 
 (autoload (quote edt-set-scroll-margins) "edt" "\
@@ -8842,7 +8900,7 @@ Turn on EDT Emulation.
 ;;;***
 \f
 ;;;### (autoloads (electric-helpify with-electric-help) "ehelp" "ehelp.el"
-;;;;;;  (17873 45892))
+;;;;;;  (18104 24735))
 ;;; Generated autoloads from ehelp.el
 
 (autoload (quote with-electric-help) "ehelp" "\
@@ -8879,7 +8937,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (turn-on-eldoc-mode eldoc-mode eldoc-minor-mode-string)
-;;;;;;  "eldoc" "emacs-lisp/eldoc.el" (17992 30878))
+;;;;;;  "eldoc" "emacs-lisp/eldoc.el" (18104 24748))
 ;;; Generated autoloads from emacs-lisp/eldoc.el
 
 (defvar eldoc-minor-mode-string " ElDoc" "\
@@ -8917,8 +8975,8 @@ Emacs Lisp mode) that support Eldoc.")
 
 ;;;***
 \f
-;;;### (autoloads (elide-head) "elide-head" "elide-head.el" (17842
-;;;;;;  58279))
+;;;### (autoloads (elide-head) "elide-head" "elide-head.el" (18104
+;;;;;;  24735))
 ;;; Generated autoloads from elide-head.el
 
 (autoload (quote elide-head) "elide-head" "\
@@ -8934,7 +8992,7 @@ This is suitable as an entry on `find-file-hook' or appropriate mode hooks.
 ;;;***
 \f
 ;;;### (autoloads (elint-initialize) "elint" "emacs-lisp/elint.el"
-;;;;;;  (17842 54152))
+;;;;;;  (18104 24748))
 ;;; Generated autoloads from emacs-lisp/elint.el
 
 (autoload (quote elint-initialize) "elint" "\
@@ -8945,8 +9003,8 @@ Initialize elint.
 ;;;***
 \f
 ;;;### (autoloads (elp-results elp-instrument-package elp-instrument-list
-;;;;;;  elp-instrument-function) "elp" "emacs-lisp/elp.el" (17842
-;;;;;;  54152))
+;;;;;;  elp-instrument-function) "elp" "emacs-lisp/elp.el" (18104
+;;;;;;  24748))
 ;;; Generated autoloads from emacs-lisp/elp.el
 
 (autoload (quote elp-instrument-function) "elp" "\
@@ -8980,7 +9038,7 @@ displayed.
 ;;;***
 \f
 ;;;### (autoloads (report-emacs-bug) "emacsbug" "mail/emacsbug.el"
-;;;;;;  (17907 23437))
+;;;;;;  (18104 24758))
 ;;; Generated autoloads from mail/emacsbug.el
 
 (autoload (quote report-emacs-bug) "emacsbug" "\
@@ -8995,7 +9053,7 @@ Prompts for bug subject.  Leaves you in a mail buffer.
 ;;;;;;  emerge-revisions emerge-files-with-ancestor-remote emerge-files-remote
 ;;;;;;  emerge-files-with-ancestor-command emerge-files-command emerge-buffers-with-ancestor
 ;;;;;;  emerge-buffers emerge-files-with-ancestor emerge-files) "emerge"
-;;;;;;  "emerge.el" (17166 62192))
+;;;;;;  "emerge.el" (17994 6715))
 ;;; Generated autoloads from emerge.el
 
 (defvar menu-bar-emerge-menu (make-sparse-keymap "Emerge"))
@@ -9072,37 +9130,21 @@ Not documented
 
 ;;;***
 \f
-;;;### (autoloads (encoded-kbd-mode) "encoded-kb" "international/encoded-kb.el"
-;;;;;;  (17842 54888))
+;;;### (autoloads (encoded-kbd-setup-display) "encoded-kb" "international/encoded-kb.el"
+;;;;;;  (18104 24756))
 ;;; Generated autoloads from international/encoded-kb.el
 
-(defvar encoded-kbd-mode nil "\
-Non-nil if Encoded-Kbd mode is enabled.
-See the command `encoded-kbd-mode' for a description of this minor mode.
-Setting this variable directly does not take effect;
-either customize it (see the info node `Easy Customization')
-or call the function `encoded-kbd-mode'.")
+(autoload (quote encoded-kbd-setup-display) "encoded-kb" "\
+Set up a `key-translation-map' for `keyboard-coding-system' on DISPLAY.
 
-(custom-autoload (quote encoded-kbd-mode) "encoded-kb" nil)
+DISPLAY may be a display id, a frame, or nil for the selected frame's display.
 
-(autoload (quote encoded-kbd-mode) "encoded-kb" "\
-Toggle Encoded-kbd minor mode.
-With arg, turn Encoded-kbd mode on if and only if arg is positive.
-
-You should not turn this mode on manually, instead use the command
-\\[set-keyboard-coding-system] which turns on or off this mode
-automatically.
-
-In Encoded-kbd mode, a text sent from keyboard is accepted
-as a multilingual text encoded in a coding system set by
-\\[set-keyboard-coding-system].
-
-\(fn &optional ARG)" t nil)
+\(fn DISPLAY)" nil nil)
 
 ;;;***
 \f
 ;;;### (autoloads (enriched-decode enriched-encode enriched-mode)
-;;;;;;  "enriched" "textmodes/enriched.el" (17842 58277))
+;;;;;;  "enriched" "textmodes/enriched.el" (18104 24771))
 ;;; Generated autoloads from textmodes/enriched.el
 
 (autoload (quote enriched-mode) "enriched" "\
@@ -9133,7 +9175,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (erc-handle-irc-url erc erc-select-read-args) "erc"
-;;;;;;  "erc/erc.el" (17935 53318))
+;;;;;;  "erc/erc.el" (18104 24749))
 ;;; Generated autoloads from erc/erc.el
 
 (autoload (quote erc-select-read-args) "erc" "\
@@ -9175,33 +9217,33 @@ Otherwise, connect to HOST:PORT as USER and /join CHANNEL.
 
 ;;;***
 \f
-;;;### (autoloads nil "erc-autoaway" "erc/erc-autoaway.el" (17935
-;;;;;;  53318))
+;;;### (autoloads nil "erc-autoaway" "erc/erc-autoaway.el" (18104
+;;;;;;  24749))
 ;;; Generated autoloads from erc/erc-autoaway.el
  (autoload 'erc-autoaway-mode "erc-autoaway")
 
 ;;;***
 \f
-;;;### (autoloads nil "erc-button" "erc/erc-button.el" (17935 53318))
+;;;### (autoloads nil "erc-button" "erc/erc-button.el" (18104 24749))
 ;;; Generated autoloads from erc/erc-button.el
  (autoload 'erc-button-mode "erc-button" nil t)
 
 ;;;***
 \f
-;;;### (autoloads nil "erc-capab" "erc/erc-capab.el" (17935 53318))
+;;;### (autoloads nil "erc-capab" "erc/erc-capab.el" (18104 24749))
 ;;; Generated autoloads from erc/erc-capab.el
  (autoload 'erc-capab-identify-mode "erc-capab" nil t)
 
 ;;;***
 \f
-;;;### (autoloads nil "erc-compat" "erc/erc-compat.el" (17935 53318))
+;;;### (autoloads nil "erc-compat" "erc/erc-compat.el" (18104 24749))
 ;;; Generated autoloads from erc/erc-compat.el
  (autoload 'erc-define-minor-mode "erc-compat")
 
 ;;;***
 \f
 ;;;### (autoloads (erc-ctcp-query-DCC pcomplete/erc-mode/DCC erc-cmd-DCC)
-;;;;;;  "erc-dcc" "erc/erc-dcc.el" (17842 54344))
+;;;;;;  "erc-dcc" "erc/erc-dcc.el" (18104 24749))
 ;;; Generated autoloads from erc/erc-dcc.el
 
 (autoload (quote erc-cmd-DCC) "erc-dcc" "\
@@ -9233,7 +9275,7 @@ that subcommand.
 ;;;;;;  erc-ezb-add-session erc-ezb-end-of-session-list erc-ezb-init-session-list
 ;;;;;;  erc-ezb-identify erc-ezb-notice-autodetect erc-ezb-lookup-action
 ;;;;;;  erc-ezb-get-login erc-cmd-ezb) "erc-ezbounce" "erc/erc-ezbounce.el"
-;;;;;;  (17842 54344))
+;;;;;;  (18104 24749))
 ;;; Generated autoloads from erc/erc-ezbounce.el
 
 (autoload (quote erc-cmd-ezb) "erc-ezbounce" "\
@@ -9295,8 +9337,8 @@ Add EZBouncer convenience functions to ERC.
 
 ;;;***
 \f
-;;;### (autoloads (erc-fill) "erc-fill" "erc/erc-fill.el" (17935
-;;;;;;  53318))
+;;;### (autoloads (erc-fill) "erc-fill" "erc/erc-fill.el" (18104
+;;;;;;  24749))
 ;;; Generated autoloads from erc/erc-fill.el
  (autoload 'erc-fill-mode "erc-fill" nil t)
 
@@ -9308,15 +9350,15 @@ You can put this on `erc-insert-modify-hook' and/or `erc-send-modify-hook'.
 
 ;;;***
 \f
-;;;### (autoloads nil "erc-hecomplete" "erc/erc-hecomplete.el" (17842
-;;;;;;  54344))
+;;;### (autoloads nil "erc-hecomplete" "erc/erc-hecomplete.el" (18104
+;;;;;;  24749))
 ;;; Generated autoloads from erc/erc-hecomplete.el
  (autoload 'erc-hecomplete-mode "erc-hecomplete" nil t)
 
 ;;;***
 \f
 ;;;### (autoloads (erc-identd-stop erc-identd-start) "erc-identd"
-;;;;;;  "erc/erc-identd.el" (17935 53318))
+;;;;;;  "erc/erc-identd.el" (18104 24749))
 ;;; Generated autoloads from erc/erc-identd.el
  (autoload 'erc-identd-mode "erc-identd")
 
@@ -9338,7 +9380,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (erc-create-imenu-index) "erc-imenu" "erc/erc-imenu.el"
-;;;;;;  (17842 54344))
+;;;;;;  (18104 24749))
 ;;; Generated autoloads from erc/erc-imenu.el
 
 (autoload (quote erc-create-imenu-index) "erc-imenu" "\
@@ -9348,14 +9390,14 @@ Not documented
 
 ;;;***
 \f
-;;;### (autoloads nil "erc-join" "erc/erc-join.el" (17842 54344))
+;;;### (autoloads nil "erc-join" "erc/erc-join.el" (18104 24749))
 ;;; Generated autoloads from erc/erc-join.el
  (autoload 'erc-autojoin-mode "erc-join" nil t)
 
 ;;;***
 \f
 ;;;### (autoloads (erc-save-buffer-in-logs erc-logging-enabled) "erc-log"
-;;;;;;  "erc/erc-log.el" (17935 53318))
+;;;;;;  "erc/erc-log.el" (18104 24749))
 ;;; Generated autoloads from erc/erc-log.el
  (autoload 'erc-log-mode "erc-log" nil t)
 
@@ -9387,7 +9429,7 @@ You can save every individual message by putting this function on
 ;;;### (autoloads (erc-delete-dangerous-host erc-add-dangerous-host
 ;;;;;;  erc-delete-keyword erc-add-keyword erc-delete-fool erc-add-fool
 ;;;;;;  erc-delete-pal erc-add-pal) "erc-match" "erc/erc-match.el"
-;;;;;;  (17935 53318))
+;;;;;;  (18104 24749))
 ;;; Generated autoloads from erc/erc-match.el
  (autoload 'erc-match-mode "erc-match")
 
@@ -9433,14 +9475,14 @@ Delete dangerous-host interactively to `erc-dangerous-hosts'.
 
 ;;;***
 \f
-;;;### (autoloads nil "erc-menu" "erc/erc-menu.el" (17935 53318))
+;;;### (autoloads nil "erc-menu" "erc/erc-menu.el" (18104 24749))
 ;;; Generated autoloads from erc/erc-menu.el
  (autoload 'erc-menu-mode "erc-menu" nil t)
 
 ;;;***
 \f
 ;;;### (autoloads (erc-cmd-WHOLEFT) "erc-netsplit" "erc/erc-netsplit.el"
-;;;;;;  (17935 53318))
+;;;;;;  (18104 24749))
 ;;; Generated autoloads from erc/erc-netsplit.el
  (autoload 'erc-netsplit-mode "erc-netsplit")
 
@@ -9452,7 +9494,7 @@ Show who's gone.
 ;;;***
 \f
 ;;;### (autoloads (erc-server-select erc-determine-network) "erc-networks"
-;;;;;;  "erc/erc-networks.el" (17935 53318))
+;;;;;;  "erc/erc-networks.el" (18104 24749))
 ;;; Generated autoloads from erc/erc-networks.el
 
 (autoload (quote erc-determine-network) "erc-networks" "\
@@ -9470,7 +9512,7 @@ Interactively select a server to connect to using `erc-server-alist'.
 ;;;***
 \f
 ;;;### (autoloads (pcomplete/erc-mode/NOTIFY erc-cmd-NOTIFY) "erc-notify"
-;;;;;;  "erc/erc-notify.el" (17935 53318))
+;;;;;;  "erc/erc-notify.el" (18104 24749))
 ;;; Generated autoloads from erc/erc-notify.el
  (autoload 'erc-notify-mode "erc-notify" nil t)
 
@@ -9488,33 +9530,33 @@ Not documented
 
 ;;;***
 \f
-;;;### (autoloads nil "erc-page" "erc/erc-page.el" (17842 54344))
+;;;### (autoloads nil "erc-page" "erc/erc-page.el" (18104 24749))
 ;;; Generated autoloads from erc/erc-page.el
  (autoload 'erc-page-mode "erc-page")
 
 ;;;***
 \f
-;;;### (autoloads nil "erc-pcomplete" "erc/erc-pcomplete.el" (17935
-;;;;;;  53318))
+;;;### (autoloads nil "erc-pcomplete" "erc/erc-pcomplete.el" (18104
+;;;;;;  24749))
 ;;; Generated autoloads from erc/erc-pcomplete.el
  (autoload 'erc-completion-mode "erc-pcomplete" nil t)
 
 ;;;***
 \f
-;;;### (autoloads nil "erc-replace" "erc/erc-replace.el" (17842 54344))
+;;;### (autoloads nil "erc-replace" "erc/erc-replace.el" (18104 24749))
 ;;; Generated autoloads from erc/erc-replace.el
  (autoload 'erc-replace-mode "erc-replace")
 
 ;;;***
 \f
-;;;### (autoloads nil "erc-ring" "erc/erc-ring.el" (17935 53318))
+;;;### (autoloads nil "erc-ring" "erc/erc-ring.el" (18104 24749))
 ;;; Generated autoloads from erc/erc-ring.el
  (autoload 'erc-ring-mode "erc-ring" nil t)
 
 ;;;***
 \f
 ;;;### (autoloads (erc-nickserv-identify erc-nickserv-identify-mode)
-;;;;;;  "erc-services" "erc/erc-services.el" (17935 53318))
+;;;;;;  "erc-services" "erc/erc-services.el" (18104 24749))
 ;;; Generated autoloads from erc/erc-services.el
  (autoload 'erc-services-mode "erc-services" nil t)
 
@@ -9531,14 +9573,14 @@ When called interactively, read the password using `read-passwd'.
 
 ;;;***
 \f
-;;;### (autoloads nil "erc-sound" "erc/erc-sound.el" (17842 54344))
+;;;### (autoloads nil "erc-sound" "erc/erc-sound.el" (18104 24749))
 ;;; Generated autoloads from erc/erc-sound.el
  (autoload 'erc-sound-mode "erc-sound")
 
 ;;;***
 \f
 ;;;### (autoloads (erc-speedbar-browser) "erc-speedbar" "erc/erc-speedbar.el"
-;;;;;;  (17935 53318))
+;;;;;;  (18104 24749))
 ;;; Generated autoloads from erc/erc-speedbar.el
 
 (autoload (quote erc-speedbar-browser) "erc-speedbar" "\
@@ -9549,21 +9591,21 @@ This will add a speedbar major display mode.
 
 ;;;***
 \f
-;;;### (autoloads nil "erc-spelling" "erc/erc-spelling.el" (17935
-;;;;;;  53318))
+;;;### (autoloads nil "erc-spelling" "erc/erc-spelling.el" (18104
+;;;;;;  24749))
 ;;; Generated autoloads from erc/erc-spelling.el
  (autoload 'erc-spelling-mode "erc-spelling" nil t)
 
 ;;;***
 \f
-;;;### (autoloads nil "erc-stamp" "erc/erc-stamp.el" (17935 53318))
+;;;### (autoloads nil "erc-stamp" "erc/erc-stamp.el" (18104 24749))
 ;;; Generated autoloads from erc/erc-stamp.el
  (autoload 'erc-timestamp-mode "erc-stamp" nil t)
 
 ;;;***
 \f
 ;;;### (autoloads (erc-track-minor-mode) "erc-track" "erc/erc-track.el"
-;;;;;;  (17935 53318))
+;;;;;;  (18104 24749))
 ;;; Generated autoloads from erc/erc-track.el
 
 (defvar erc-track-minor-mode nil "\
@@ -9586,7 +9628,7 @@ module, otherwise the keybindings will not do anything useful.
 ;;;***
 \f
 ;;;### (autoloads (erc-truncate-buffer erc-truncate-buffer-to-size)
-;;;;;;  "erc-truncate" "erc/erc-truncate.el" (17842 54344))
+;;;;;;  "erc-truncate" "erc/erc-truncate.el" (18104 24749))
 ;;; Generated autoloads from erc/erc-truncate.el
  (autoload 'erc-truncate-mode "erc-truncate" nil t)
 
@@ -9606,7 +9648,7 @@ Meant to be used in hooks, like `erc-insert-post-hook'.
 ;;;***
 \f
 ;;;### (autoloads (erc-xdcc-add-file) "erc-xdcc" "erc/erc-xdcc.el"
-;;;;;;  (17842 54344))
+;;;;;;  (18104 24749))
 ;;; Generated autoloads from erc/erc-xdcc.el
 
 (autoload (quote erc-xdcc-add-file) "erc-xdcc" "\
@@ -9616,8 +9658,8 @@ Add a file to `erc-xdcc-files'.
 
 ;;;***
 \f
-;;;### (autoloads (eshell-mode) "esh-mode" "eshell/esh-mode.el" (17914
-;;;;;;  52082))
+;;;### (autoloads (eshell-mode) "esh-mode" "eshell/esh-mode.el" (18104
+;;;;;;  24749))
 ;;; Generated autoloads from eshell/esh-mode.el
 
 (autoload (quote eshell-mode) "esh-mode" "\
@@ -9629,8 +9671,8 @@ Emacs shell interactive mode.
 
 ;;;***
 \f
-;;;### (autoloads (eshell-test) "esh-test" "eshell/esh-test.el" (17842
-;;;;;;  54411))
+;;;### (autoloads (eshell-test) "esh-test" "eshell/esh-test.el" (18104
+;;;;;;  24749))
 ;;; Generated autoloads from eshell/esh-test.el
 
 (autoload (quote eshell-test) "esh-test" "\
@@ -9641,7 +9683,7 @@ Test Eshell to verify that it works as expected.
 ;;;***
 \f
 ;;;### (autoloads (eshell-report-bug eshell-command-result eshell-command
-;;;;;;  eshell) "eshell" "eshell/eshell.el" (17842 54411))
+;;;;;;  eshell) "eshell" "eshell/eshell.el" (18104 24749))
 ;;; Generated autoloads from eshell/eshell.el
 
 (autoload (quote eshell) "eshell" "\
@@ -9687,7 +9729,7 @@ Please include any configuration details that might be involved.
 ;;;;;;  visit-tags-table tags-table-mode find-tag-default-function
 ;;;;;;  find-tag-hook tags-add-tables tags-compression-info-list
 ;;;;;;  tags-table-list tags-case-fold-search) "etags" "progmodes/etags.el"
-;;;;;;  (17842 56333))
+;;;;;;  (18104 24765))
 ;;; Generated autoloads from progmodes/etags.el
 
 (defvar tags-file-name nil "\
@@ -9989,7 +10031,7 @@ for \\[find-tag] (which see).
 ;;;;;;  ethio-fidel-to-sera-buffer ethio-fidel-to-sera-region ethio-sera-to-fidel-marker
 ;;;;;;  ethio-sera-to-fidel-mail ethio-sera-to-fidel-mail-or-marker
 ;;;;;;  ethio-sera-to-fidel-buffer ethio-sera-to-fidel-region setup-ethiopic-environment-internal)
-;;;;;;  "ethio-util" "language/ethio-util.el" (17842 58278))
+;;;;;;  "ethio-util" "language/ethio-util.el" (18104 24757))
 ;;; Generated autoloads from language/ethio-util.el
 
 (autoload (quote setup-ethiopic-environment-internal) "ethio-util" "\
@@ -10184,7 +10226,7 @@ Transcribe Ethiopic characters in ASCII depending on the file extension.
 \f
 ;;;### (autoloads (eudc-load-eudc eudc-query-form eudc-expand-inline
 ;;;;;;  eudc-get-phone eudc-get-email eudc-set-server) "eudc" "net/eudc.el"
-;;;;;;  (17842 55218))
+;;;;;;  (18104 24759))
 ;;; Generated autoloads from net/eudc.el
 
 (autoload (quote eudc-set-server) "eudc" "\
@@ -10240,7 +10282,7 @@ This does nothing except loading eudc by autoload side-effect.
 \f
 ;;;### (autoloads (eudc-display-jpeg-as-button eudc-display-jpeg-inline
 ;;;;;;  eudc-display-sound eudc-display-mail eudc-display-url eudc-display-generic-binary)
-;;;;;;  "eudc-bob" "net/eudc-bob.el" (17842 55218))
+;;;;;;  "eudc-bob" "net/eudc-bob.el" (18104 24759))
 ;;; Generated autoloads from net/eudc-bob.el
 
 (autoload (quote eudc-display-generic-binary) "eudc-bob" "\
@@ -10276,7 +10318,7 @@ Display a button for the JPEG DATA.
 ;;;***
 \f
 ;;;### (autoloads (eudc-try-bbdb-insert eudc-insert-record-at-point-into-bbdb)
-;;;;;;  "eudc-export" "net/eudc-export.el" (17842 55218))
+;;;;;;  "eudc-export" "net/eudc-export.el" (18104 24759))
 ;;; Generated autoloads from net/eudc-export.el
 
 (autoload (quote eudc-insert-record-at-point-into-bbdb) "eudc-export" "\
@@ -10293,7 +10335,7 @@ Call `eudc-insert-record-at-point-into-bbdb' if on a record.
 ;;;***
 \f
 ;;;### (autoloads (eudc-edit-hotlist) "eudc-hotlist" "net/eudc-hotlist.el"
-;;;;;;  (17842 55218))
+;;;;;;  (18104 24759))
 ;;; Generated autoloads from net/eudc-hotlist.el
 
 (autoload (quote eudc-edit-hotlist) "eudc-hotlist" "\
@@ -10303,8 +10345,8 @@ Edit the hotlist of directory servers in a specialized buffer.
 
 ;;;***
 \f
-;;;### (autoloads (ewoc-create) "ewoc" "emacs-lisp/ewoc.el" (17933
-;;;;;;  14283))
+;;;### (autoloads (ewoc-create) "ewoc" "emacs-lisp/ewoc.el" (18104
+;;;;;;  24748))
 ;;; Generated autoloads from emacs-lisp/ewoc.el
 
 (autoload (quote ewoc-create) "ewoc" "\
@@ -10333,7 +10375,7 @@ fourth arg NOSEP non-nil inhibits this.
 ;;;### (autoloads (executable-make-buffer-file-executable-if-script-p
 ;;;;;;  executable-self-display executable-set-magic executable-interpret
 ;;;;;;  executable-command-find-posix-p) "executable" "progmodes/executable.el"
-;;;;;;  (17842 56333))
+;;;;;;  (18104 24765))
 ;;; Generated autoloads from progmodes/executable.el
 
 (autoload (quote executable-command-find-posix-p) "executable" "\
@@ -10376,7 +10418,7 @@ file modes.
 \f
 ;;;### (autoloads (expand-jump-to-next-slot expand-jump-to-previous-slot
 ;;;;;;  expand-abbrev-hook expand-add-abbrevs) "expand" "expand.el"
-;;;;;;  (17925 52793))
+;;;;;;  (18104 24735))
 ;;; Generated autoloads from expand.el
 
 (autoload (quote expand-add-abbrevs) "expand" "\
@@ -10425,7 +10467,7 @@ This is used only in conjunction with `expand-add-abbrevs'.
 
 ;;;***
 \f
-;;;### (autoloads (f90-mode) "f90" "progmodes/f90.el" (17842 56333))
+;;;### (autoloads (f90-mode) "f90" "progmodes/f90.el" (18104 24765))
 ;;; Generated autoloads from progmodes/f90.el
 
 (autoload (quote f90-mode) "f90" "\
@@ -10492,7 +10534,7 @@ with no args, if that value is non-nil.
 ;;;;;;  facemenu-remove-all facemenu-remove-face-props facemenu-set-read-only
 ;;;;;;  facemenu-set-intangible facemenu-set-invisible facemenu-set-face-from-menu
 ;;;;;;  facemenu-set-background facemenu-set-foreground facemenu-set-face)
-;;;;;;  "facemenu" "facemenu.el" (17842 58279))
+;;;;;;  "facemenu" "facemenu.el" (18104 24735))
 ;;; Generated autoloads from facemenu.el
  (define-key global-map "\M-o" 'facemenu-keymap)
  (autoload 'facemenu-keymap "facemenu" "Keymap for face-changing commands." t 'keymap)
@@ -10657,11 +10699,51 @@ argument BUFFER-NAME is nil, it defaults to *Colors*.
 
 \(fn &optional LIST BUFFER-NAME)" t nil)
 
+;;;***
+\f
+;;;### (autoloads (turn-on-fast-lock fast-lock-mode) "fast-lock"
+;;;;;;  "obsolete/fast-lock.el" (18104 24760))
+;;; Generated autoloads from obsolete/fast-lock.el
+
+(autoload (quote fast-lock-mode) "fast-lock" "\
+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'.
+
+\(fn &optional ARG)" t nil)
+
+(autoload (quote turn-on-fast-lock) "fast-lock" "\
+Unconditionally turn on Fast Lock mode.
+
+\(fn)" nil nil)
+
+(when (fboundp (quote add-minor-mode)) (defvar fast-lock-mode nil) (add-minor-mode (quote fast-lock-mode) nil))
+
 ;;;***
 \f
 ;;;### (autoloads (feedmail-queue-reminder feedmail-run-the-queue
 ;;;;;;  feedmail-run-the-queue-global-prompt feedmail-run-the-queue-no-prompts
-;;;;;;  feedmail-send-it) "feedmail" "mail/feedmail.el" (17888 29839))
+;;;;;;  feedmail-send-it) "feedmail" "mail/feedmail.el" (17900 45314))
 ;;; Generated autoloads from mail/feedmail.el
 
 (autoload (quote feedmail-send-it) "feedmail" "\
@@ -10715,7 +10797,7 @@ you can set `feedmail-queue-reminder-alist' to nil.
 ;;;***
 \f
 ;;;### (autoloads (ffap-bindings dired-at-point ffap-at-mouse ffap-menu
-;;;;;;  find-file-at-point ffap-next) "ffap" "ffap.el" (17943 4602))
+;;;;;;  find-file-at-point ffap-next) "ffap" "ffap.el" (18104 24735))
 ;;; Generated autoloads from ffap.el
 
 (autoload (quote ffap-next) "ffap" "\
@@ -10774,7 +10856,7 @@ Evaluate the forms in variable `ffap-bindings'.
 ;;;### (autoloads (file-cache-minibuffer-complete file-cache-add-directory-recursively
 ;;;;;;  file-cache-add-directory-using-locate file-cache-add-directory-using-find
 ;;;;;;  file-cache-add-file file-cache-add-directory-list file-cache-add-directory)
-;;;;;;  "filecache" "filecache.el" (17842 58279))
+;;;;;;  "filecache" "filecache.el" (18104 24735))
 ;;; Generated autoloads from filecache.el
 
 (autoload (quote file-cache-add-directory) "filecache" "\
@@ -10833,8 +10915,8 @@ the name is considered already unique; only the second substitution
 
 ;;;***
 \f
-;;;### (autoloads (filesets-init) "filesets" "filesets.el" (17842
-;;;;;;  58279))
+;;;### (autoloads (filesets-init) "filesets" "filesets.el" (18104
+;;;;;;  24735))
 ;;; Generated autoloads from filesets.el
 
 (autoload (quote filesets-init) "filesets" "\
@@ -10845,7 +10927,7 @@ Set up hooks, load the cache file -- if existing -- and build the menu.
 
 ;;;***
 \f
-;;;### (autoloads nil "fill" "textmodes/fill.el" (18007 39658))
+;;;### (autoloads nil "fill" "textmodes/fill.el" (18104 24771))
 ;;; Generated autoloads from textmodes/fill.el
 (put 'colon-double-space 'safe-local-variable 'booleanp)
 
@@ -10853,7 +10935,7 @@ Set up hooks, load the cache file -- if existing -- and build the menu.
 \f
 ;;;### (autoloads (find-grep-dired find-name-dired find-dired find-grep-options
 ;;;;;;  find-ls-subdir-switches find-ls-option) "find-dired" "find-dired.el"
-;;;;;;  (17992 30877))
+;;;;;;  (18104 24736))
 ;;; Generated autoloads from find-dired.el
 
 (defvar find-ls-option (if (eq system-type (quote berkeley-unix)) (quote ("-ls" . "-gilsb")) (quote ("-exec ls -ld {} \\;" . "-ld"))) "\
@@ -10914,7 +10996,7 @@ Thus ARG can also contain additional grep options.
 \f
 ;;;### (autoloads (ff-mouse-find-other-file-other-window ff-mouse-find-other-file
 ;;;;;;  ff-find-other-file ff-get-other-file) "find-file" "find-file.el"
-;;;;;;  (17842 58279))
+;;;;;;  (18104 24736))
 ;;; Generated autoloads from find-file.el
 
 (defvar ff-special-constructs (quote (("^#\\s *\\(include\\|import\\)\\s +[<\"]\\(.*\\)[>\"]" lambda nil (buffer-substring (match-beginning 2) (match-end 2))))) "\
@@ -11008,7 +11090,7 @@ Visit the file you click on in another window.
 ;;;;;;  find-variable find-variable-noselect find-function-other-frame
 ;;;;;;  find-function-other-window find-function find-function-noselect
 ;;;;;;  find-function-search-for-symbol find-library) "find-func"
-;;;;;;  "emacs-lisp/find-func.el" (17842 54152))
+;;;;;;  "emacs-lisp/find-func.el" (18104 24748))
 ;;; Generated autoloads from emacs-lisp/find-func.el
 
 (autoload (quote find-library) "find-func" "\
@@ -11162,7 +11244,7 @@ Define some key bindings for the find-function family of functions.
 ;;;***
 \f
 ;;;### (autoloads (find-lisp-find-dired-filter find-lisp-find-dired-subdirectories
-;;;;;;  find-lisp-find-dired) "find-lisp" "find-lisp.el" (17893 23802))
+;;;;;;  find-lisp-find-dired) "find-lisp" "find-lisp.el" (18104 24736))
 ;;; Generated autoloads from find-lisp.el
 
 (autoload (quote find-lisp-find-dired) "find-lisp" "\
@@ -11183,7 +11265,7 @@ Change the filter on a find-lisp-find-dired buffer to REGEXP.
 ;;;***
 \f
 ;;;### (autoloads (finder-by-keyword finder-commentary finder-list-keywords)
-;;;;;;  "finder" "finder.el" (17842 58279))
+;;;;;;  "finder" "finder.el" (18104 24736))
 ;;; Generated autoloads from finder.el
 
 (autoload (quote finder-list-keywords) "finder" "\
@@ -11205,7 +11287,7 @@ Find packages matching a given keyword.
 ;;;***
 \f
 ;;;### (autoloads (enable-flow-control-on enable-flow-control) "flow-ctrl"
-;;;;;;  "flow-ctrl.el" (17842 58279))
+;;;;;;  "flow-ctrl.el" (18104 24736))
 ;;; Generated autoloads from flow-ctrl.el
 
 (autoload (quote enable-flow-control) "flow-ctrl" "\
@@ -11227,7 +11309,7 @@ to get the effect of a C-q.
 ;;;***
 \f
 ;;;### (autoloads (fill-flowed fill-flowed-encode) "flow-fill" "gnus/flow-fill.el"
-;;;;;;  (17842 54741))
+;;;;;;  (18104 24750))
 ;;; Generated autoloads from gnus/flow-fill.el
 
 (autoload (quote fill-flowed-encode) "flow-fill" "\
@@ -11243,7 +11325,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (flymake-mode-off flymake-mode-on flymake-mode)
-;;;;;;  "flymake" "progmodes/flymake.el" (17934 27588))
+;;;;;;  "flymake" "progmodes/flymake.el" (18104 24765))
 ;;; Generated autoloads from progmodes/flymake.el
 
 (autoload (quote flymake-mode) "flymake" "\
@@ -11267,7 +11349,7 @@ Turn flymake mode off.
 \f
 ;;;### (autoloads (flyspell-buffer flyspell-region flyspell-mode-off
 ;;;;;;  turn-off-flyspell turn-on-flyspell flyspell-mode flyspell-prog-mode)
-;;;;;;  "flyspell" "textmodes/flyspell.el" (18006 55797))
+;;;;;;  "flyspell" "textmodes/flyspell.el" (18104 24771))
 ;;; Generated autoloads from textmodes/flyspell.el
 
 (autoload (quote flyspell-prog-mode) "flyspell" "\
@@ -11336,18 +11418,18 @@ Flyspell whole buffer.
 \f
 ;;;### (autoloads (follow-delete-other-windows-and-split follow-mode
 ;;;;;;  turn-off-follow-mode turn-on-follow-mode) "follow" "follow.el"
-;;;;;;  (17842 58279))
+;;;;;;  (18104 24736))
 ;;; Generated autoloads from follow.el
 
 (autoload (quote turn-on-follow-mode) "follow" "\
 Turn on Follow mode.  Please see the function `follow-mode'.
 
-\(fn)" t nil)
+\(fn)" nil nil)
 
 (autoload (quote turn-off-follow-mode) "follow" "\
 Turn off Follow mode.  Please see the function `follow-mode'.
 
-\(fn)" t nil)
+\(fn)" nil nil)
 
 (autoload (quote follow-mode) "follow" "\
 Minor mode that combines windows into one tall virtual window.
@@ -11365,16 +11447,16 @@ of two major techniques:
   movement commands.
 
 Follow mode comes to its prime when used on a large screen and two
-side-by-side window are used. The user can, with the help of Follow
+side-by-side windows are used.  The user can, with the help of Follow
 mode, use two full-height windows as though they would have been
-one. Imagine yourself editing a large function, or section of text,
+one.  Imagine yourself editing a large function, or section of text,
 and being able to use 144 lines instead of the normal 72... (your
 mileage may vary).
 
 To split one large window into two side-by-side windows, the commands
 `\\[split-window-horizontally]' or `M-x follow-delete-other-windows-and-split' can be used.
 
-Only windows displayed in the same frame follow each-other.
+Only windows displayed in the same frame follow each other.
 
 If the variable `follow-intercept-processes' is non-nil, Follow mode
 will listen to the output of processes and redisplay accordingly.
@@ -11394,11 +11476,11 @@ Create two side by side windows and enter Follow Mode.
 Execute this command to display as much as possible of the text
 in the selected window.  All other windows, in the current
 frame, are deleted and the selected window is split in two
-side-by-side windows. Follow Mode is activated, hence the
+side-by-side windows.  Follow Mode is activated, hence the
 two windows always will display two successive pages.
 \(If one window is moved, the other one will follow.)
 
-If ARG is positive, the leftmost window is selected.  If it negative,
+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.
 
@@ -11410,8 +11492,8 @@ in your `~/.emacs' file, replacing [f7] by your favourite key:
 
 ;;;***
 \f
-;;;### (autoloads (footnote-mode) "footnote" "mail/footnote.el" (17954
-;;;;;;  24686))
+;;;### (autoloads (footnote-mode) "footnote" "mail/footnote.el" (18104
+;;;;;;  24758))
 ;;; Generated autoloads from mail/footnote.el
 
 (autoload (quote footnote-mode) "footnote" "\
@@ -11432,7 +11514,7 @@ key             binding
 ;;;***
 \f
 ;;;### (autoloads (forms-find-file-other-window forms-find-file forms-mode)
-;;;;;;  "forms" "forms.el" (17842 58279))
+;;;;;;  "forms" "forms.el" (18104 24736))
 ;;; Generated autoloads from forms.el
 
 (autoload (quote forms-mode) "forms" "\
@@ -11468,18 +11550,10 @@ Visit a file in Forms mode in other window.
 
 ;;;***
 \f
-;;;### (autoloads (fortran-mode fortran-tab-mode-default) "fortran"
-;;;;;;  "progmodes/fortran.el" (17842 56333))
+;;;### (autoloads (fortran-mode) "fortran" "progmodes/fortran.el"
+;;;;;;  (18104 24766))
 ;;; Generated autoloads from progmodes/fortran.el
 
-(defvar fortran-tab-mode-default nil "\
-*Default tabbing/carriage control style for empty files in Fortran mode.
-A non-nil value specifies tab-digit style of continuation control.
-A value of nil specifies that continuation lines are marked
-with a character in column 6.")
-
-(custom-autoload (quote fortran-tab-mode-default) "fortran" t)
-
 (autoload (quote fortran-mode) "fortran" "\
 Major mode for editing Fortran code in fixed format.
 For free format code, use `f90-mode'.
@@ -11555,7 +11629,7 @@ with no args, if that value is non-nil.
 ;;;***
 \f
 ;;;### (autoloads (fortune fortune-to-signature fortune-compile fortune-from-region
-;;;;;;  fortune-add-fortune) "fortune" "play/fortune.el" (17842 55395))
+;;;;;;  fortune-add-fortune) "fortune" "play/fortune.el" (18104 24761))
 ;;; Generated autoloads from play/fortune.el
 
 (autoload (quote fortune-add-fortune) "fortune" "\
@@ -11605,7 +11679,7 @@ and choose the directory as the fortune-file.
 ;;;***
 \f
 ;;;### (autoloads (gdb-enable-debug gdba) "gdb-ui" "progmodes/gdb-ui.el"
-;;;;;;  (17941 38806))
+;;;;;;  (18104 24766))
 ;;; Generated autoloads from progmodes/gdb-ui.el
 
 (autoload (quote gdba) "gdb-ui" "\
@@ -11668,8 +11742,8 @@ Non-nil means record the process input and output in `gdb-debug-log'.")
 ;;;***
 \f
 ;;;### (autoloads (generic-make-keywords-list generic-mode generic-mode-internal
-;;;;;;  define-generic-mode) "generic" "emacs-lisp/generic.el" (17842
-;;;;;;  54152))
+;;;;;;  define-generic-mode) "generic" "emacs-lisp/generic.el" (18104
+;;;;;;  24748))
 ;;; Generated autoloads from emacs-lisp/generic.el
 
 (defvar generic-mode-list nil "\
@@ -11744,7 +11818,7 @@ regular expression that can be used as an element of
 ;;;***
 \f
 ;;;### (autoloads (glasses-mode) "glasses" "progmodes/glasses.el"
-;;;;;;  (17842 56333))
+;;;;;;  (18104 24766))
 ;;; Generated autoloads from progmodes/glasses.el
 
 (autoload (quote glasses-mode) "glasses" "\
@@ -11757,7 +11831,7 @@ at places they belong to.
 ;;;***
 \f
 ;;;### (autoloads (gmm-tool-bar-from-list gmm-widget-p gmm-error
-;;;;;;  gmm-message) "gmm-utils" "gnus/gmm-utils.el" (17934 27588))
+;;;;;;  gmm-message) "gmm-utils" "gnus/gmm-utils.el" (18104 24750))
 ;;; Generated autoloads from gnus/gmm-utils.el
 
 (autoload (quote gmm-message) "gmm-utils" "\
@@ -11804,7 +11878,7 @@ DEFAULT-MAP specifies the default key map for ICON-LIST.
 ;;;***
 \f
 ;;;### (autoloads (gnus gnus-other-frame gnus-slave gnus-no-server
-;;;;;;  gnus-slave-no-server) "gnus" "gnus/gnus.el" (17842 54741))
+;;;;;;  gnus-slave-no-server) "gnus" "gnus/gnus.el" (18104 24751))
 ;;; Generated autoloads from gnus/gnus.el
 (when (fboundp 'custom-autoload)
  (custom-autoload 'gnus-select-method "gnus"))
@@ -11857,7 +11931,7 @@ prompt the user for the name of an NNTP server to use.
 ;;;;;;  gnus-agent-get-undownloaded-list gnus-agent-delete-group
 ;;;;;;  gnus-agent-rename-group gnus-agent-possibly-save-gcc gnus-agentize
 ;;;;;;  gnus-slave-unplugged gnus-plugged gnus-unplugged) "gnus-agent"
-;;;;;;  "gnus/gnus-agent.el" (17842 54741))
+;;;;;;  "gnus/gnus-agent.el" (18104 24750))
 ;;; Generated autoloads from gnus/gnus-agent.el
 
 (autoload (quote gnus-unplugged) "gnus-agent" "\
@@ -11948,7 +12022,7 @@ If CLEAN, obsolete (ignore).
 ;;;***
 \f
 ;;;### (autoloads (gnus-article-prepare-display) "gnus-art" "gnus/gnus-art.el"
-;;;;;;  (17960 49045))
+;;;;;;  (18104 24750))
 ;;; Generated autoloads from gnus/gnus-art.el
 
 (autoload (quote gnus-article-prepare-display) "gnus-art" "\
@@ -11959,7 +12033,7 @@ Make the current buffer look like a nice article.
 ;;;***
 \f
 ;;;### (autoloads (gnus-audio-play) "gnus-audio" "gnus/gnus-audio.el"
-;;;;;;  (17842 54741))
+;;;;;;  (18104 24750))
 ;;; Generated autoloads from gnus/gnus-audio.el
 
 (autoload (quote gnus-audio-play) "gnus-audio" "\
@@ -11971,8 +12045,8 @@ Play a sound FILE through the speaker.
 \f
 ;;;### (autoloads (gnus-cache-delete-group gnus-cache-rename-group
 ;;;;;;  gnus-cache-generate-nov-databases gnus-cache-generate-active
-;;;;;;  gnus-jog-cache) "gnus-cache" "gnus/gnus-cache.el" (17842
-;;;;;;  54741))
+;;;;;;  gnus-jog-cache) "gnus-cache" "gnus/gnus-cache.el" (18104
+;;;;;;  24750))
 ;;; Generated autoloads from gnus/gnus-cache.el
 
 (autoload (quote gnus-jog-cache) "gnus-cache" "\
@@ -12014,7 +12088,7 @@ supported.
 ;;;***
 \f
 ;;;### (autoloads (gnus-delay-initialize gnus-delay-send-queue gnus-delay-article)
-;;;;;;  "gnus-delay" "gnus/gnus-delay.el" (17842 54741))
+;;;;;;  "gnus-delay" "gnus/gnus-delay.el" (18104 24750))
 ;;; Generated autoloads from gnus/gnus-delay.el
 
 (autoload (quote gnus-delay-article) "gnus-delay" "\
@@ -12050,7 +12124,7 @@ Checking delayed messages is skipped if optional arg NO-CHECK is non-nil.
 ;;;***
 \f
 ;;;### (autoloads (gnus-user-format-function-D gnus-user-format-function-d)
-;;;;;;  "gnus-diary" "gnus/gnus-diary.el" (17992 30878))
+;;;;;;  "gnus-diary" "gnus/gnus-diary.el" (18104 24750))
 ;;; Generated autoloads from gnus/gnus-diary.el
 
 (autoload (quote gnus-user-format-function-d) "gnus-diary" "\
@@ -12066,7 +12140,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (turn-on-gnus-dired-mode) "gnus-dired" "gnus/gnus-dired.el"
-;;;;;;  (17842 54741))
+;;;;;;  (18104 24750))
 ;;; Generated autoloads from gnus/gnus-dired.el
 
 (autoload (quote turn-on-gnus-dired-mode) "gnus-dired" "\
@@ -12077,7 +12151,7 @@ Convenience method to turn on gnus-dired-mode.
 ;;;***
 \f
 ;;;### (autoloads (gnus-draft-reminder) "gnus-draft" "gnus/gnus-draft.el"
-;;;;;;  (17842 54741))
+;;;;;;  (18104 24750))
 ;;; Generated autoloads from gnus/gnus-draft.el
 
 (autoload (quote gnus-draft-reminder) "gnus-draft" "\
@@ -12089,8 +12163,8 @@ Reminder user if there are unsent drafts.
 \f
 ;;;### (autoloads (gnus-convert-png-to-face gnus-convert-face-to-png
 ;;;;;;  gnus-face-from-file gnus-x-face-from-file gnus-insert-random-x-face-header
-;;;;;;  gnus-random-x-face) "gnus-fun" "gnus/gnus-fun.el" (17842
-;;;;;;  54741))
+;;;;;;  gnus-random-x-face) "gnus-fun" "gnus/gnus-fun.el" (18104
+;;;;;;  24750))
 ;;; Generated autoloads from gnus/gnus-fun.el
 
 (autoload (quote gnus-random-x-face) "gnus-fun" "\
@@ -12129,7 +12203,7 @@ FILE should be a PNG file that's 48x48 and smaller than or equal to
 ;;;***
 \f
 ;;;### (autoloads (gnus-fetch-group-other-frame gnus-fetch-group)
-;;;;;;  "gnus-group" "gnus/gnus-group.el" (17842 54741))
+;;;;;;  "gnus-group" "gnus/gnus-group.el" (18104 24750))
 ;;; Generated autoloads from gnus/gnus-group.el
 
 (autoload (quote gnus-fetch-group) "gnus-group" "\
@@ -12146,7 +12220,7 @@ Pop up a frame and enter GROUP.
 ;;;***
 \f
 ;;;### (autoloads (gnus-batch-score) "gnus-kill" "gnus/gnus-kill.el"
-;;;;;;  (17842 54741))
+;;;;;;  (18104 24750))
 ;;; Generated autoloads from gnus/gnus-kill.el
 
 (defalias (quote gnus-batch-kill) (quote gnus-batch-score))
@@ -12161,7 +12235,7 @@ Usage: emacs -batch -l ~/.emacs -l gnus -f gnus-batch-score
 \f
 ;;;### (autoloads (gnus-mailing-list-mode gnus-mailing-list-insinuate
 ;;;;;;  turn-on-gnus-mailing-list-mode) "gnus-ml" "gnus/gnus-ml.el"
-;;;;;;  (17842 54741))
+;;;;;;  (18104 24750))
 ;;; Generated autoloads from gnus/gnus-ml.el
 
 (autoload (quote turn-on-gnus-mailing-list-mode) "gnus-ml" "\
@@ -12186,7 +12260,7 @@ Minor mode for providing mailing-list commands.
 \f
 ;;;### (autoloads (gnus-group-split-fancy gnus-group-split gnus-group-split-update
 ;;;;;;  gnus-group-split-setup) "gnus-mlspl" "gnus/gnus-mlspl.el"
-;;;;;;  (17842 54741))
+;;;;;;  (18104 24750))
 ;;; Generated autoloads from gnus/gnus-mlspl.el
 
 (autoload (quote gnus-group-split-setup) "gnus-mlspl" "\
@@ -12287,7 +12361,7 @@ Calling (gnus-group-split-fancy nil nil \"mail.others\") returns:
 ;;;***
 \f
 ;;;### (autoloads (gnus-change-server) "gnus-move" "gnus/gnus-move.el"
-;;;;;;  (17842 54741))
+;;;;;;  (18104 24750))
 ;;; Generated autoloads from gnus/gnus-move.el
 
 (autoload (quote gnus-change-server) "gnus-move" "\
@@ -12299,7 +12373,7 @@ Update the .newsrc.eld file to reflect the change of nntp server.
 ;;;***
 \f
 ;;;### (autoloads (gnus-button-reply gnus-button-mailto gnus-msg-mail)
-;;;;;;  "gnus-msg" "gnus/gnus-msg.el" (17949 41467))
+;;;;;;  "gnus-msg" "gnus/gnus-msg.el" (18104 24750))
 ;;; Generated autoloads from gnus/gnus-msg.el
 
 (autoload (quote gnus-msg-mail) "gnus-msg" "\
@@ -12324,7 +12398,7 @@ Like `message-reply'.
 ;;;***
 \f
 ;;;### (autoloads (gnus-nocem-load-cache gnus-nocem-scan-groups)
-;;;;;;  "gnus-nocem" "gnus/gnus-nocem.el" (17842 54741))
+;;;;;;  "gnus-nocem" "gnus/gnus-nocem.el" (18104 24750))
 ;;; Generated autoloads from gnus/gnus-nocem.el
 
 (autoload (quote gnus-nocem-scan-groups) "gnus-nocem" "\
@@ -12341,7 +12415,7 @@ Load the NoCeM cache.
 \f
 ;;;### (autoloads (gnus-treat-newsgroups-picon gnus-treat-mail-picon
 ;;;;;;  gnus-treat-from-picon) "gnus-picon" "gnus/gnus-picon.el"
-;;;;;;  (17842 54741))
+;;;;;;  (18104 24750))
 ;;; Generated autoloads from gnus/gnus-picon.el
 
 (autoload (quote gnus-treat-from-picon) "gnus-picon" "\
@@ -12368,7 +12442,7 @@ If picons are already displayed, remove them.
 ;;;;;;  gnus-sorted-nintersection gnus-sorted-range-intersection
 ;;;;;;  gnus-sorted-intersection gnus-intersection gnus-sorted-complement
 ;;;;;;  gnus-sorted-ndifference gnus-sorted-difference) "gnus-range"
-;;;;;;  "gnus/gnus-range.el" (17842 54741))
+;;;;;;  "gnus/gnus-range.el" (18104 24750))
 ;;; Generated autoloads from gnus/gnus-range.el
 
 (autoload (quote gnus-sorted-difference) "gnus-range" "\
@@ -12436,7 +12510,7 @@ Add NUM into sorted LIST by side effect.
 ;;;***
 \f
 ;;;### (autoloads (gnus-registry-install-hooks gnus-registry-initialize)
-;;;;;;  "gnus-registry" "gnus/gnus-registry.el" (17934 27588))
+;;;;;;  "gnus-registry" "gnus/gnus-registry.el" (18104 24750))
 ;;; Generated autoloads from gnus/gnus-registry.el
 
 (autoload (quote gnus-registry-initialize) "gnus-registry" "\
@@ -12452,8 +12526,8 @@ Install the registry hooks.
 ;;;***
 \f
 ;;;### (autoloads (gnus-sieve-article-add-rule gnus-sieve-generate
-;;;;;;  gnus-sieve-update) "gnus-sieve" "gnus/gnus-sieve.el" (17842
-;;;;;;  54741))
+;;;;;;  gnus-sieve-update) "gnus-sieve" "gnus/gnus-sieve.el" (18104
+;;;;;;  24750))
 ;;; Generated autoloads from gnus/gnus-sieve.el
 
 (autoload (quote gnus-sieve-update) "gnus-sieve" "\
@@ -12481,7 +12555,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (gnus-batch-brew-soup) "gnus-soup" "gnus/gnus-soup.el"
-;;;;;;  (17842 54741))
+;;;;;;  (18104 24750))
 ;;; Generated autoloads from gnus/gnus-soup.el
 
 (autoload (quote gnus-batch-brew-soup) "gnus-soup" "\
@@ -12501,7 +12575,7 @@ Note -- this function hasn't been implemented yet.
 ;;;***
 \f
 ;;;### (autoloads (gnus-update-format) "gnus-spec" "gnus/gnus-spec.el"
-;;;;;;  (17842 54741))
+;;;;;;  (18104 24750))
 ;;; Generated autoloads from gnus/gnus-spec.el
 
 (autoload (quote gnus-update-format) "gnus-spec" "\
@@ -12512,8 +12586,8 @@ Update the format specification near point.
 ;;;***
 \f
 ;;;### (autoloads (gnus-fixup-nnimap-unread-after-getting-new-news
-;;;;;;  gnus-declare-backend) "gnus-start" "gnus/gnus-start.el" (17842
-;;;;;;  54741))
+;;;;;;  gnus-declare-backend) "gnus-start" "gnus/gnus-start.el" (18104
+;;;;;;  24750))
 ;;; Generated autoloads from gnus/gnus-start.el
 
 (autoload (quote gnus-declare-backend) "gnus-start" "\
@@ -12529,7 +12603,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (gnus-add-configuration) "gnus-win" "gnus/gnus-win.el"
-;;;;;;  (17842 54741))
+;;;;;;  (18104 24751))
 ;;; Generated autoloads from gnus/gnus-win.el
 
 (autoload (quote gnus-add-configuration) "gnus-win" "\
@@ -12539,7 +12613,7 @@ Add the window configuration CONF to `gnus-buffer-configuration'.
 
 ;;;***
 \f
-;;;### (autoloads (gomoku) "gomoku" "play/gomoku.el" (17941 38806))
+;;;### (autoloads (gomoku) "gomoku" "play/gomoku.el" (18104 24761))
 ;;; Generated autoloads from play/gomoku.el
 
 (autoload (quote gomoku) "gomoku" "\
@@ -12566,7 +12640,7 @@ Use \\[describe-mode] for more info.
 ;;;***
 \f
 ;;;### (autoloads (goto-address goto-address-at-point) "goto-addr"
-;;;;;;  "net/goto-addr.el" (17842 55218))
+;;;;;;  "net/goto-addr.el" (18104 24759))
 ;;; Generated autoloads from net/goto-addr.el
 
 (define-obsolete-function-alias (quote goto-address-at-mouse) (quote goto-address-at-point) "22.1")
@@ -12596,7 +12670,7 @@ Also fontifies the buffer appropriately (see `goto-address-fontify-p' and
 \f
 ;;;### (autoloads (rgrep lgrep grep-find grep grep-mode grep-compute-defaults
 ;;;;;;  grep-process-setup grep-setup-hook grep-find-command grep-command
-;;;;;;  grep-window-height) "grep" "progmodes/grep.el" (17944 20144))
+;;;;;;  grep-window-height) "grep" "progmodes/grep.el" (18104 24766))
 ;;; Generated autoloads from progmodes/grep.el
 
 (defvar grep-window-height nil "\
@@ -12736,7 +12810,7 @@ This command shares argument histories with \\[lgrep] and \\[grep-find].
 
 ;;;***
 \f
-;;;### (autoloads (gs-load-image) "gs" "gs.el" (17842 58279))
+;;;### (autoloads (gs-load-image) "gs" "gs.el" (18104 24737))
 ;;; Generated autoloads from gs.el
 
 (autoload (quote gs-load-image) "gs" "\
@@ -12750,7 +12824,7 @@ the form \"WINDOW-ID PIXMAP-ID\".  Value is non-nil if successful.
 ;;;***
 \f
 ;;;### (autoloads (gdb-script-mode jdb pdb perldb xdb dbx sdb gdb)
-;;;;;;  "gud" "progmodes/gud.el" (17992 30878))
+;;;;;;  "gud" "progmodes/gud.el" (18104 24766))
 ;;; Generated autoloads from progmodes/gud.el
 
 (autoload (quote gdb) "gud" "\
@@ -12824,7 +12898,7 @@ gud, see `gud-mode'.
 \(fn COMMAND-LINE)" t nil)
  (add-hook 'same-window-regexps "\\*gud-.*\\*\\(\\|<[0-9]+>\\)")
 
-(add-to-list (quote auto-mode-alist) (quote ("/\\.gdbinit" . gdb-script-mode)))
+(add-to-list (quote auto-mode-alist) (quote ("/\\.[a-z0-9-]*gdbinit" . gdb-script-mode)))
 
 (autoload (quote gdb-script-mode) "gud" "\
 Major mode for editing GDB scripts
@@ -12833,8 +12907,8 @@ Major mode for editing GDB scripts
 
 ;;;***
 \f
-;;;### (autoloads (handwrite) "handwrite" "play/handwrite.el" (17842
-;;;;;;  55395))
+;;;### (autoloads (handwrite) "handwrite" "play/handwrite.el" (18104
+;;;;;;  24761))
 ;;; Generated autoloads from play/handwrite.el
 
 (autoload (quote handwrite) "handwrite" "\
@@ -12852,7 +12926,7 @@ Variables: handwrite-linespace     (default 12)
 ;;;***
 \f
 ;;;### (autoloads (hanoi-unix-64 hanoi-unix hanoi) "hanoi" "play/hanoi.el"
-;;;;;;  (17742 40275))
+;;;;;;  (17754 24255))
 ;;; Generated autoloads from play/hanoi.el
 
 (autoload (quote hanoi) "hanoi" "\
@@ -12882,7 +12956,7 @@ to be updated.
 ;;;### (autoloads (scan-buf-previous-region scan-buf-next-region
 ;;;;;;  scan-buf-move-to-region help-at-pt-display-when-idle help-at-pt-set-timer
 ;;;;;;  help-at-pt-cancel-timer display-local-help help-at-pt-kbd-string
-;;;;;;  help-at-pt-string) "help-at-pt" "help-at-pt.el" (17842 58279))
+;;;;;;  help-at-pt-string) "help-at-pt" "help-at-pt.el" (18104 24737))
 ;;; Generated autoloads from help-at-pt.el
 
 (autoload (quote help-at-pt-string) "help-at-pt" "\
@@ -13012,7 +13086,7 @@ different regions.  With numeric argument ARG, behaves like
 ;;;### (autoloads (describe-categories describe-syntax describe-variable
 ;;;;;;  variable-at-point describe-function-1 describe-simplify-lib-file-name
 ;;;;;;  help-C-file-name describe-function) "help-fns" "help-fns.el"
-;;;;;;  (17845 46651))
+;;;;;;  (18104 24737))
 ;;; Generated autoloads from help-fns.el
 
 (autoload (quote describe-function) "help-fns" "\
@@ -13046,10 +13120,11 @@ If ANY-SYMBOL is non-nil, don't insist the symbol be bound.
 (autoload (quote describe-variable) "help-fns" "\
 Display the full documentation of VARIABLE (a symbol).
 Returns the documentation as a string, also.
-If VARIABLE has a buffer-local value in BUFFER (default to the current buffer),
+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)" t nil)
+\(fn VARIABLE &optional BUFFER FRAME)" t nil)
 
 (autoload (quote describe-syntax) "help-fns" "\
 Describe the syntax specifications in the syntax table of BUFFER.
@@ -13069,7 +13144,7 @@ BUFFER should be a buffer or a buffer name.
 ;;;***
 \f
 ;;;### (autoloads (three-step-help) "help-macro" "help-macro.el"
-;;;;;;  (17842 58279))
+;;;;;;  (18104 24737))
 ;;; Generated autoloads from help-macro.el
 
 (defvar three-step-help nil "\
@@ -13085,7 +13160,7 @@ A value of nil means skip the middle step, so that
 \f
 ;;;### (autoloads (help-xref-on-pp help-insert-xref-button help-xref-button
 ;;;;;;  help-make-xrefs help-setup-xref help-mode-finish help-mode-setup
-;;;;;;  help-mode) "help-mode" "help-mode.el" (17842 58279))
+;;;;;;  help-mode) "help-mode" "help-mode.el" (18104 24737))
 ;;; Generated autoloads from help-mode.el
 
 (autoload (quote help-mode) "help-mode" "\
@@ -13168,7 +13243,7 @@ Add xrefs for symbols in `pp's output between FROM and TO.
 ;;;***
 \f
 ;;;### (autoloads (Helper-help Helper-describe-bindings) "helper"
-;;;;;;  "emacs-lisp/helper.el" (17842 54152))
+;;;;;;  "emacs-lisp/helper.el" (18104 24748))
 ;;; Generated autoloads from emacs-lisp/helper.el
 
 (autoload (quote Helper-describe-bindings) "helper" "\
@@ -13184,7 +13259,7 @@ Provide help for current mode.
 ;;;***
 \f
 ;;;### (autoloads (hexlify-buffer hexl-find-file hexl-mode) "hexl"
-;;;;;;  "hexl.el" (17844 53657))
+;;;;;;  "hexl.el" (18104 24737))
 ;;; Generated autoloads from hexl.el
 
 (autoload (quote hexl-mode) "hexl" "\
@@ -13281,7 +13356,7 @@ This discards the buffer's undo information.
 ;;;### (autoloads (hi-lock-write-interactive-patterns hi-lock-unface-buffer
 ;;;;;;  hi-lock-face-phrase-buffer hi-lock-face-buffer hi-lock-line-face-buffer
 ;;;;;;  global-hi-lock-mode hi-lock-mode) "hi-lock" "hi-lock.el"
-;;;;;;  (17992 30877))
+;;;;;;  (18104 24737))
 ;;; Generated autoloads from hi-lock.el
 
 (autoload (quote hi-lock-mode) "hi-lock" "\
@@ -13411,7 +13486,7 @@ be found in variable `hi-lock-interactive-patterns'.
 ;;;***
 \f
 ;;;### (autoloads (hide-ifdef-lines hide-ifdef-read-only hide-ifdef-initially
-;;;;;;  hide-ifdef-mode) "hideif" "progmodes/hideif.el" (17842 56333))
+;;;;;;  hide-ifdef-mode) "hideif" "progmodes/hideif.el" (18104 24766))
 ;;; Generated autoloads from progmodes/hideif.el
 
 (autoload (quote hide-ifdef-mode) "hideif" "\
@@ -13466,7 +13541,7 @@ how the hiding is done:
 ;;;***
 \f
 ;;;### (autoloads (turn-off-hideshow hs-minor-mode) "hideshow" "progmodes/hideshow.el"
-;;;;;;  (17934 43341))
+;;;;;;  (18104 24766))
 ;;; Generated autoloads from progmodes/hideshow.el
 
 (defvar hs-special-modes-alist (quote ((c-mode "{" "}" "/[*/]" nil hs-c-like-adjust-block-beginning) (c++-mode "{" "}" "/[*/]" nil hs-c-like-adjust-block-beginning) (bibtex-mode ("^@\\S(*\\(\\s(\\)" 1)) (java-mode "{" "}" "/[*/]" nil hs-c-like-adjust-block-beginning))) "\
@@ -13529,7 +13604,7 @@ Unconditionally turn off `hs-minor-mode'.
 ;;;;;;  highlight-compare-buffers highlight-changes-rotate-faces
 ;;;;;;  highlight-changes-previous-change highlight-changes-next-change
 ;;;;;;  highlight-changes-mode highlight-changes-remove-highlight)
-;;;;;;  "hilit-chg" "hilit-chg.el" (17842 58279))
+;;;;;;  "hilit-chg" "hilit-chg.el" (18104 24737))
 ;;; Generated autoloads from hilit-chg.el
 
 (autoload (quote highlight-changes-remove-highlight) "hilit-chg" "\
@@ -13659,7 +13734,7 @@ variable `highlight-changes-global-changes-existing-buffers' is non-nil).
 ;;;;;;  hippie-expand-ignore-buffers hippie-expand-max-buffers hippie-expand-no-restriction
 ;;;;;;  hippie-expand-dabbrev-as-symbol hippie-expand-dabbrev-skip-space
 ;;;;;;  hippie-expand-verbose hippie-expand-try-functions-list) "hippie-exp"
-;;;;;;  "hippie-exp.el" (17842 58279))
+;;;;;;  "hippie-exp.el" (18104 24737))
 ;;; Generated autoloads from hippie-exp.el
 
 (defvar hippie-expand-try-functions-list (quote (try-complete-file-name-partially try-complete-file-name try-expand-all-abbrevs try-expand-list try-expand-line try-expand-dabbrev try-expand-dabbrev-all-buffers try-expand-dabbrev-from-kill try-complete-lisp-symbol-partially try-complete-lisp-symbol)) "\
@@ -13732,7 +13807,7 @@ argument VERBOSE non-nil makes the function verbose.
 ;;;***
 \f
 ;;;### (autoloads (global-hl-line-mode hl-line-mode) "hl-line" "hl-line.el"
-;;;;;;  (17842 58279))
+;;;;;;  (18104 24737))
 ;;; Generated autoloads from hl-line.el
 
 (autoload (quote hl-line-mode) "hl-line" "\
@@ -13773,7 +13848,7 @@ Global-Hl-Line mode uses the functions `global-hl-line-unhighlight' and
 ;;;***
 \f
 ;;;### (autoloads (list-holidays holidays) "holidays" "calendar/holidays.el"
-;;;;;;  (17956 13479))
+;;;;;;  (18104 24745))
 ;;; Generated autoloads from calendar/holidays.el
 
 (autoload (quote holidays) "holidays" "\
@@ -13809,8 +13884,8 @@ The optional LABEL is used to label the buffer created.
 
 ;;;***
 \f
-;;;### (autoloads (html2text) "html2text" "gnus/html2text.el" (17842
-;;;;;;  54741))
+;;;### (autoloads (html2text) "html2text" "gnus/html2text.el" (18104
+;;;;;;  24751))
 ;;; Generated autoloads from gnus/html2text.el
 
 (autoload (quote html2text) "html2text" "\
@@ -13842,7 +13917,7 @@ Convert HTML to plain text in the current buffer.
 ;;;;;;  ibuffer-backward-filter-group ibuffer-forward-filter-group
 ;;;;;;  ibuffer-toggle-filter-group ibuffer-mouse-toggle-filter-group
 ;;;;;;  ibuffer-interactive-filter-by-mode ibuffer-mouse-filter-by-mode
-;;;;;;  ibuffer-auto-mode) "ibuf-ext" "ibuf-ext.el" (17842 58279))
+;;;;;;  ibuffer-auto-mode) "ibuf-ext" "ibuf-ext.el" (18104 24737))
 ;;; Generated autoloads from ibuf-ext.el
 
 (autoload (quote ibuffer-auto-mode) "ibuf-ext" "\
@@ -14179,7 +14254,7 @@ Mark buffers whose associated file is compressed.
 \(fn)" t nil)
 
 (autoload (quote ibuffer-mark-old-buffers) "ibuf-ext" "\
-Mark buffers which have not been viewed in `ibuffer-old-time' days.
+Mark buffers which have not been viewed in `ibuffer-old-time' hours.
 
 \(fn)" t nil)
 
@@ -14208,8 +14283,8 @@ defaults to one.
 ;;;***
 \f
 ;;;### (autoloads (define-ibuffer-filter define-ibuffer-op define-ibuffer-sorter
-;;;;;;  define-ibuffer-column) "ibuf-macs" "ibuf-macs.el" (17842
-;;;;;;  58279))
+;;;;;;  define-ibuffer-column) "ibuf-macs" "ibuf-macs.el" (18104
+;;;;;;  24737))
 ;;; Generated autoloads from ibuf-macs.el
 
 (autoload (quote define-ibuffer-column) "ibuf-macs" "\
@@ -14298,7 +14373,7 @@ bound to the current value of the filter.
 ;;;***
 \f
 ;;;### (autoloads (ibuffer ibuffer-other-window ibuffer-list-buffers)
-;;;;;;  "ibuffer" "ibuffer.el" (17842 58279))
+;;;;;;  "ibuffer" "ibuffer.el" (18104 24737))
 ;;; Generated autoloads from ibuffer.el
 
 (autoload (quote ibuffer-list-buffers) "ibuffer" "\
@@ -14339,7 +14414,7 @@ FORMATS is the value to use for `ibuffer-formats'.
 \f
 ;;;### (autoloads (icalendar-import-buffer icalendar-import-file
 ;;;;;;  icalendar-export-region icalendar-export-file) "icalendar"
-;;;;;;  "calendar/icalendar.el" (17921 16827))
+;;;;;;  "calendar/icalendar.el" (18104 24745))
 ;;; Generated autoloads from calendar/icalendar.el
 
 (autoload (quote icalendar-export-file) "icalendar" "\
@@ -14391,8 +14466,8 @@ buffer `*icalendar-errors*'.
 
 ;;;***
 \f
-;;;### (autoloads (icomplete-mode) "icomplete" "icomplete.el" (17907
-;;;;;;  1407))
+;;;### (autoloads (icomplete-mode) "icomplete" "icomplete.el" (18104
+;;;;;;  24737))
 ;;; Generated autoloads from icomplete.el
 
 (defvar icomplete-mode nil "\
@@ -14412,7 +14487,7 @@ With a numeric argument, turn Icomplete mode on iff ARG is positive.
 
 ;;;***
 \f
-;;;### (autoloads (icon-mode) "icon" "progmodes/icon.el" (17842 56333))
+;;;### (autoloads (icon-mode) "icon" "progmodes/icon.el" (18104 24766))
 ;;; Generated autoloads from progmodes/icon.el
 
 (autoload (quote icon-mode) "icon" "\
@@ -14453,7 +14528,7 @@ with no args, if that value is non-nil.
 ;;;***
 \f
 ;;;### (autoloads (idlwave-shell) "idlw-shell" "progmodes/idlw-shell.el"
-;;;;;;  (17965 23638))
+;;;;;;  (18104 24767))
 ;;; Generated autoloads from progmodes/idlw-shell.el
 
 (autoload (quote idlwave-shell) "idlw-shell" "\
@@ -14479,7 +14554,7 @@ See also the variable `idlwave-shell-prompt-pattern'.
 ;;;***
 \f
 ;;;### (autoloads (idlwave-mode) "idlwave" "progmodes/idlwave.el"
-;;;;;;  (17992 30878))
+;;;;;;  (18104 24767))
 ;;; Generated autoloads from progmodes/idlwave.el
 
 (autoload (quote idlwave-mode) "idlwave" "\
@@ -14614,8 +14689,8 @@ The main features of this mode are
 ;;;;;;  ido-find-alternate-file ido-find-file-other-window ido-find-file
 ;;;;;;  ido-find-file-in-dir ido-switch-buffer-other-frame ido-insert-buffer
 ;;;;;;  ido-kill-buffer ido-display-buffer ido-switch-buffer-other-window
-;;;;;;  ido-switch-buffer ido-mode ido-mode) "ido" "ido.el" (17963
-;;;;;;  25911))
+;;;;;;  ido-switch-buffer ido-mode ido-mode) "ido" "ido.el" (18104
+;;;;;;  24737))
 ;;; Generated autoloads from ido.el
 
 (defvar ido-mode nil "\
@@ -14876,7 +14951,7 @@ DEF, if non-nil, is the default value.
 
 ;;;***
 \f
-;;;### (autoloads (ielm) "ielm" "ielm.el" (17842 58279))
+;;;### (autoloads (ielm) "ielm" "ielm.el" (18104 24737))
 ;;; Generated autoloads from ielm.el
  (add-hook 'same-window-buffer-names "*ielm*")
 
@@ -14889,7 +14964,7 @@ Switches to the buffer `*ielm*', or creates it if it does not exist.
 ;;;***
 \f
 ;;;### (autoloads (iimage-mode turn-on-iimage-mode) "iimage" "iimage.el"
-;;;;;;  (17842 58279))
+;;;;;;  (18104 24737))
 ;;; Generated autoloads from iimage.el
 
 (autoload (quote turn-on-iimage-mode) "iimage" "\
@@ -14908,7 +14983,7 @@ Toggle inline image minor mode.
 ;;;;;;  insert-image put-image create-image image-type-auto-detected-p
 ;;;;;;  image-type-available-p image-type image-type-from-file-name
 ;;;;;;  image-type-from-file-header image-type-from-buffer image-type-from-data)
-;;;;;;  "image" "image.el" (17868 42568))
+;;;;;;  "image" "image.el" (18104 24737))
 ;;; Generated autoloads from image.el
 
 (autoload (quote image-type-from-data) "image" "\
@@ -14941,14 +15016,14 @@ be determined.
 
 (autoload (quote image-type) "image" "\
 Determine and return image type.
-FILE-OR-DATA is an image file name or image data.
+SOURCE is an image file name or image data.
 Optional TYPE is a symbol describing the image type.  If TYPE is omitted
 or nil, try to determine the image type from its first few bytes
-of image data.  If that doesn't work, and FILE-OR-DATA is a file name,
+of image data.  If that doesn't work, and SOURCE is a file name,
 use its file extension as image type.
-Optional DATA-P non-nil means FILE-OR-DATA is a string containing image data.
+Optional DATA-P non-nil means SOURCE is a string containing image data.
 
-\(fn FILE-OR-DATA &optional TYPE DATA-P)" nil nil)
+\(fn SOURCE &optional TYPE DATA-P)" nil nil)
 
 (autoload (quote image-type-available-p) "image" "\
 Return non-nil if image type TYPE is available.
@@ -14958,15 +15033,11 @@ Image types are symbols like `xbm' or `jpeg'.
 
 (autoload (quote image-type-auto-detected-p) "image" "\
 Return t iff the current buffer contains an auto-detectable image.
-This function is intended to be used from `magic-mode-alist' (which see).
+This function is intended to be used from `magic-fallback-mode-alist'.
 
-First, compare the beginning of the buffer with `image-type-header-regexps'.
-If an appropriate image type is found, check if that image type can be
-autodetected using the variable `image-type-auto-detectable'.  Finally,
-if `buffer-file-name' is non-nil, check if it matches another major mode
-in `auto-mode-alist' apart from `image-mode'; if there is another match,
-the autodetection is considered to have failed.  Return t if all the above
-steps succeed.
+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'.
 
 \(fn)" nil nil)
 
@@ -15089,7 +15160,7 @@ Example:
 ;;;;;;  image-dired-jump-thumbnail-buffer image-dired-delete-tag
 ;;;;;;  image-dired-tag-files image-dired-show-all-from-dir image-dired-display-thumbs
 ;;;;;;  image-dired-dired-with-window-configuration image-dired-dired-insert-marked-thumbs)
-;;;;;;  "image-dired" "image-dired.el" (17992 30877))
+;;;;;;  "image-dired" "image-dired.el" (18104 24737))
 ;;; Generated autoloads from image-dired.el
 
 (autoload (quote image-dired-dired-insert-marked-thumbs) "image-dired" "\
@@ -15223,7 +15294,7 @@ easy-to-use form.
 \f
 ;;;### (autoloads (auto-image-file-mode insert-image-file image-file-name-regexp
 ;;;;;;  image-file-name-regexps image-file-name-extensions) "image-file"
-;;;;;;  "image-file.el" (17842 58279))
+;;;;;;  "image-file.el" (18104 24737))
 ;;; Generated autoloads from image-file.el
 
 (defvar image-file-name-extensions (quote ("png" "jpeg" "jpg" "gif" "tiff" "tif" "xbm" "xpm" "pbm" "pgm" "ppm" "pnm")) "\
@@ -15285,7 +15356,7 @@ Image files are those whose name has an extension in
 ;;;***
 \f
 ;;;### (autoloads (image-mode-maybe image-minor-mode image-mode)
-;;;;;;  "image-mode" "image-mode.el" (17868 42581))
+;;;;;;  "image-mode" "image-mode.el" (18104 24737))
 ;;; Generated autoloads from image-mode.el
  (push '("\\.jpe?g\\'"    . image-mode) auto-mode-alist)
  (push '("\\.png\\'"      . image-mode) auto-mode-alist)
@@ -15323,7 +15394,7 @@ information on these modes.
 ;;;***
 \f
 ;;;### (autoloads (imenu imenu-add-menubar-index imenu-add-to-menubar
-;;;;;;  imenu-sort-function) "imenu" "imenu.el" (17842 58279))
+;;;;;;  imenu-sort-function) "imenu" "imenu.el" (18104 24737))
 ;;; Generated autoloads from imenu.el
 
 (defvar imenu-sort-function nil "\
@@ -15438,7 +15509,7 @@ for more information.
 \f
 ;;;### (autoloads (indian-char-glyph indian-glyph-char in-is13194-pre-write-conversion
 ;;;;;;  in-is13194-post-read-conversion indian-compose-string indian-compose-region)
-;;;;;;  "ind-util" "language/ind-util.el" (17842 58278))
+;;;;;;  "ind-util" "language/ind-util.el" (18104 24757))
 ;;; Generated autoloads from language/ind-util.el
 
 (autoload (quote indian-compose-region) "ind-util" "\
@@ -15481,7 +15552,7 @@ See also the function `indian-glyph-char'.
 \f
 ;;;### (autoloads (inferior-lisp inferior-lisp-prompt inferior-lisp-load-command
 ;;;;;;  inferior-lisp-program inferior-lisp-filter-regexp) "inf-lisp"
-;;;;;;  "progmodes/inf-lisp.el" (17842 56332))
+;;;;;;  "progmodes/inf-lisp.el" (18104 24767))
 ;;; Generated autoloads from progmodes/inf-lisp.el
 
 (defvar inferior-lisp-filter-regexp "\\`\\s *\\(:\\(\\w\\|\\s_\\)\\)?\\s *\\'" "\
@@ -15548,7 +15619,7 @@ of `inferior-lisp-program').  Runs the hooks from
 ;;;### (autoloads (Info-speedbar-browser Info-goto-emacs-key-command-node
 ;;;;;;  Info-goto-emacs-command-node Info-mode info-apropos Info-index
 ;;;;;;  Info-directory Info-on-current-buffer info-standalone info-emacs-manual
-;;;;;;  info info-other-window) "info" "info.el" (18006 55795))
+;;;;;;  info info-other-window) "info" "info.el" (18104 24737))
 ;;; Generated autoloads from info.el
 
 (autoload (quote info-other-window) "info" "\
@@ -15714,7 +15785,7 @@ This will add a speedbar major display mode.
 \f
 ;;;### (autoloads (info-complete-file info-complete-symbol info-lookup-file
 ;;;;;;  info-lookup-symbol info-lookup-reset) "info-look" "info-look.el"
-;;;;;;  (17878 61008))
+;;;;;;  (18104 24737))
 ;;; Generated autoloads from info-look.el
 
 (autoload (quote info-lookup-reset) "info-look" "\
@@ -15762,7 +15833,7 @@ Perform completion on file preceding point.
 ;;;***
 \f
 ;;;### (autoloads (info-xref-check-all-custom info-xref-check-all
-;;;;;;  info-xref-check) "info-xref" "info-xref.el" (17842 58279))
+;;;;;;  info-xref-check) "info-xref" "info-xref.el" (18104 24737))
 ;;; Generated autoloads from info-xref.el
 
 (autoload (quote info-xref-check) "info-xref" "\
@@ -15789,7 +15860,7 @@ quite a while.
 ;;;***
 \f
 ;;;### (autoloads (batch-info-validate Info-validate Info-split Info-tagify)
-;;;;;;  "informat" "informat.el" (17842 58279))
+;;;;;;  "informat" "informat.el" (18104 24737))
 ;;; Generated autoloads from informat.el
 
 (autoload (quote Info-tagify) "informat" "\
@@ -15830,7 +15901,7 @@ For example, invoke \"emacs -batch -f batch-info-validate $info/ ~/*.info\"
 \f
 ;;;### (autoloads (isearch-process-search-multibyte-characters isearch-toggle-input-method
 ;;;;;;  isearch-toggle-specified-input-method) "isearch-x" "international/isearch-x.el"
-;;;;;;  (17903 2305))
+;;;;;;  (18104 24756))
 ;;; Generated autoloads from international/isearch-x.el
 
 (autoload (quote isearch-toggle-specified-input-method) "isearch-x" "\
@@ -15850,8 +15921,8 @@ Not documented
 
 ;;;***
 \f
-;;;### (autoloads (isearchb-activate) "isearchb" "isearchb.el" (17918
-;;;;;;  44913))
+;;;### (autoloads (isearchb-activate) "isearchb" "isearchb.el" (18104
+;;;;;;  24737))
 ;;; Generated autoloads from isearchb.el
 
 (autoload (quote isearchb-activate) "isearchb" "\
@@ -15862,12 +15933,43 @@ accessed via isearchb.
 
 \(fn)" t nil)
 
+;;;***
+\f
+;;;### (autoloads (iso-accents-mode) "iso-acc" "obsolete/iso-acc.el"
+;;;;;;  (18104 24760))
+;;; Generated autoloads from obsolete/iso-acc.el
+
+(autoload (quote iso-accents-mode) "iso-acc" "\
+Toggle ISO Accents mode, in which accents modify the following letter.
+This permits easy insertion of accented characters according to ISO-8859-1.
+When Iso-accents mode is enabled, accent character keys
+\(`, ', \", ^, / and ~) do not self-insert; instead, they modify the following
+letter key so that it inserts an ISO accented letter.
+
+You can customize ISO Accents mode to a particular language
+with the command `iso-accents-customize'.
+
+Special combinations: ~c gives a c with cedilla,
+~d gives an Icelandic eth (d with dash).
+~t gives an Icelandic thorn.
+\"s gives German sharp s.
+/a gives a with ring.
+/e gives an a-e ligature.
+~< and ~> give guillemots.
+~! gives an inverted exclamation mark.
+~? gives an inverted question mark.
+
+With an argument, a positive argument enables ISO Accents mode,
+and a negative argument disables it.
+
+\(fn &optional ARG)" t nil)
+
 ;;;***
 \f
 ;;;### (autoloads (iso-cvt-define-menu iso-cvt-write-only iso-cvt-read-only
 ;;;;;;  iso-sgml2iso iso-iso2sgml iso-iso2duden iso-iso2gtex iso-gtex2iso
 ;;;;;;  iso-tex2iso iso-iso2tex iso-german iso-spanish) "iso-cvt"
-;;;;;;  "international/iso-cvt.el" (17992 30878))
+;;;;;;  "international/iso-cvt.el" (18104 24756))
 ;;; Generated autoloads from international/iso-cvt.el
 
 (autoload (quote iso-spanish) "iso-cvt" "\
@@ -15951,7 +16053,7 @@ Add submenus to the File menu, to convert to and from various formats.
 ;;;***
 \f
 ;;;### (autoloads nil "iso-transl" "international/iso-transl.el"
-;;;;;;  (17842 54888))
+;;;;;;  (18104 24756))
 ;;; Generated autoloads from international/iso-transl.el
  (or key-translation-map (setq key-translation-map (make-sparse-keymap)))
  (define-key key-translation-map "\C-x8" 'iso-transl-ctl-x-8-map)
@@ -15964,7 +16066,7 @@ Add submenus to the File menu, to convert to and from various formats.
 ;;;;;;  ispell-region ispell-change-dictionary ispell-kill-ispell
 ;;;;;;  ispell-help ispell-pdict-save ispell-word ispell-local-dictionary-alist
 ;;;;;;  ispell-personal-dictionary) "ispell" "textmodes/ispell.el"
-;;;;;;  (18006 55797))
+;;;;;;  (18104 24771))
 ;;; Generated autoloads from textmodes/ispell.el
 (put 'ispell-check-comments 'safe-local-variable (lambda (a) (memq a '(nil t exclusive))))
 
@@ -16251,8 +16353,8 @@ You can bind this to the key C-c i in GNUS or mail by adding to
 
 ;;;***
 \f
-;;;### (autoloads (iswitchb-mode) "iswitchb" "iswitchb.el" (17819
-;;;;;;  9451))
+;;;### (autoloads (iswitchb-mode) "iswitchb" "iswitchb.el" (18104
+;;;;;;  24737))
 ;;; Generated autoloads from iswitchb.el
 
 (defvar iswitchb-mode nil "\
@@ -16277,7 +16379,7 @@ This mode enables switching between buffers using substrings.  See
 ;;;### (autoloads (read-hiragana-string japanese-zenkaku-region japanese-hankaku-region
 ;;;;;;  japanese-hiragana-region japanese-katakana-region japanese-zenkaku
 ;;;;;;  japanese-hankaku japanese-hiragana japanese-katakana setup-japanese-environment-internal)
-;;;;;;  "japan-util" "language/japan-util.el" (17842 58278))
+;;;;;;  "japan-util" "language/japan-util.el" (18104 24757))
 ;;; Generated autoloads from language/japan-util.el
 
 (autoload (quote setup-japanese-environment-internal) "japan-util" "\
@@ -16355,7 +16457,7 @@ If non-nil, second arg INITIAL-INPUT is a string to insert before reading.
 ;;;***
 \f
 ;;;### (autoloads (jka-compr-uninstall jka-compr-handler) "jka-compr"
-;;;;;;  "jka-compr.el" (17853 24893))
+;;;;;;  "jka-compr.el" (18104 24737))
 ;;; Generated autoloads from jka-compr.el
 
 (defvar jka-compr-inhibit nil "\
@@ -16380,7 +16482,7 @@ by `jka-compr-installed'.
 \f
 ;;;### (autoloads (keypad-setup keypad-numlock-shifted-setup keypad-shifted-setup
 ;;;;;;  keypad-numlock-setup keypad-setup) "keypad" "emulation/keypad.el"
-;;;;;;  (17833 41203))
+;;;;;;  (18104 24748))
 ;;; Generated autoloads from emulation/keypad.el
 
 (defvar keypad-setup nil "\
@@ -16436,7 +16538,7 @@ the decimal key on the keypad is mapped to DECIMAL instead of `.'
 ;;;***
 \f
 ;;;### (autoloads (kinsoku) "kinsoku" "international/kinsoku.el"
-;;;;;;  (17842 54888))
+;;;;;;  (18104 24756))
 ;;; Generated autoloads from international/kinsoku.el
 
 (autoload (quote kinsoku) "kinsoku" "\
@@ -16457,8 +16559,8 @@ the context of text formatting.
 
 ;;;***
 \f
-;;;### (autoloads (kkc-region) "kkc" "international/kkc.el" (17842
-;;;;;;  54888))
+;;;### (autoloads (kkc-region) "kkc" "international/kkc.el" (18104
+;;;;;;  24757))
 ;;; Generated autoloads from international/kkc.el
 
 (defvar kkc-after-update-conversion-functions nil "\
@@ -16483,7 +16585,7 @@ and the return value is the length of the conversion.
 ;;;### (autoloads (kmacro-end-call-mouse kmacro-end-and-call-macro
 ;;;;;;  kmacro-end-or-call-macro kmacro-start-macro-or-insert-counter
 ;;;;;;  kmacro-call-macro kmacro-end-macro kmacro-start-macro) "kmacro"
-;;;;;;  "kmacro.el" (17833 41350))
+;;;;;;  "kmacro.el" (18104 24737))
 ;;; Generated autoloads from kmacro.el
  (global-set-key "\C-x(" 'kmacro-start-macro)
  (global-set-key "\C-x)" 'kmacro-end-macro)
@@ -16590,7 +16692,7 @@ If kbd macro currently being defined end it before activating it.
 \f
 ;;;### (autoloads (kannada-post-read-conversion kannada-compose-string
 ;;;;;;  kannada-compose-region) "knd-util" "language/knd-util.el"
-;;;;;;  (17842 58278))
+;;;;;;  (18104 24757))
 ;;; Generated autoloads from language/knd-util.el
 
 (defconst kannada-consonant "[\x51f75-\x51fb9]")
@@ -16613,7 +16715,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (setup-korean-environment-internal) "korea-util"
-;;;;;;  "language/korea-util.el" (17842 58278))
+;;;;;;  "language/korea-util.el" (18104 24757))
 ;;; Generated autoloads from language/korea-util.el
 
 (defvar default-korean-keyboard (if (string-match "3" (or (getenv "HANGUL_KEYBOARD_TYPE") "")) "3" "") "\
@@ -16628,7 +16730,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (lm lm-test-run) "landmark" "play/landmark.el"
-;;;;;;  (17941 38806))
+;;;;;;  (18104 24762))
 ;;; Generated autoloads from play/landmark.el
 
 (defalias (quote landmark-repeat) (quote lm-test-run))
@@ -16662,8 +16764,8 @@ Use \\[describe-mode] for more info.
 \f
 ;;;### (autoloads (lao-compose-region lao-composition-function lao-post-read-conversion
 ;;;;;;  lao-transcribe-roman-to-lao-string lao-transcribe-single-roman-syllable-to-lao
-;;;;;;  lao-compose-string) "lao-util" "language/lao-util.el" (17842
-;;;;;;  58278))
+;;;;;;  lao-compose-string) "lao-util" "language/lao-util.el" (18104
+;;;;;;  24757))
 ;;; Generated autoloads from language/lao-util.el
 
 (autoload (quote lao-compose-string) "lao-util" "\
@@ -16712,7 +16814,7 @@ Not documented
 \f
 ;;;### (autoloads (latexenc-find-file-coding-system latexenc-coding-system-to-inputenc
 ;;;;;;  latexenc-inputenc-to-coding-system latex-inputenc-coding-alist)
-;;;;;;  "latexenc" "international/latexenc.el" (17842 54888))
+;;;;;;  "latexenc" "international/latexenc.el" (18104 24757))
 ;;; Generated autoloads from international/latexenc.el
 
 (defvar latex-inputenc-coding-alist (quote (("ansinew" . windows-1252) ("applemac" . mac-roman) ("ascii" . us-ascii) ("cp1250" . windows-1250) ("cp1252" . windows-1252) ("cp1257" . cp1257) ("cp437de" . cp437) ("cp437" . cp437) ("cp850" . cp850) ("cp852" . cp852) ("cp858" . cp858) ("cp865" . cp865) ("latin1" . iso-8859-1) ("latin2" . iso-8859-2) ("latin3" . iso-8859-3) ("latin4" . iso-8859-4) ("latin5" . iso-8859-5) ("latin9" . iso-8859-15) ("next" . next) ("utf8" . utf-8) ("utf8x" . utf-8))) "\
@@ -16744,7 +16846,7 @@ coding system names is determined from `latex-inputenc-coding-alist'.
 ;;;***
 \f
 ;;;### (autoloads (latin1-display-ucs-per-lynx latin1-display latin1-display)
-;;;;;;  "latin1-disp" "international/latin1-disp.el" (17874 62081))
+;;;;;;  "latin1-disp" "international/latin1-disp.el" (18104 24757))
 ;;; Generated autoloads from international/latin1-disp.el
 
 (defvar latin1-display nil "\
@@ -16785,10 +16887,78 @@ use either \\[customize] or the function `latin1-display'.")
 
 (custom-autoload (quote latin1-display-ucs-per-lynx) "latin1-disp" nil)
 
+;;;***
+\f
+;;;### (autoloads (turn-on-lazy-lock lazy-lock-mode) "lazy-lock"
+;;;;;;  "obsolete/lazy-lock.el" (18104 24760))
+;;; Generated autoloads from obsolete/lazy-lock.el
+
+(autoload (quote lazy-lock-mode) "lazy-lock" "\
+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'.
+
+\(fn &optional ARG)" t nil)
+
+(autoload (quote turn-on-lazy-lock) "lazy-lock" "\
+Unconditionally turn on Lazy Lock mode.
+
+\(fn)" nil nil)
+
 ;;;***
 \f
 ;;;### (autoloads (ld-script-mode) "ld-script" "progmodes/ld-script.el"
-;;;;;;  (17842 56332))
+;;;;;;  (18104 24767))
 ;;; Generated autoloads from progmodes/ld-script.el
 
 (add-to-list (quote auto-mode-alist) (quote ("\\.ld[si]?\\>" . ld-script-mode)))
@@ -16803,7 +16973,7 @@ A major mode to edit GNU ld script files
 ;;;***
 \f
 ;;;### (autoloads (ledit-from-lisp-mode ledit-mode) "ledit" "ledit.el"
-;;;;;;  (17842 58279))
+;;;;;;  (18104 24737))
 ;;; Generated autoloads from ledit.el
 
 (defconst ledit-save-files t "\
@@ -16838,7 +17008,7 @@ Not documented
 
 ;;;***
 \f
-;;;### (autoloads (life) "life" "play/life.el" (17842 55395))
+;;;### (autoloads (life) "life" "play/life.el" (18104 24762))
 ;;; Generated autoloads from play/life.el
 
 (autoload (quote life) "life" "\
@@ -16851,8 +17021,8 @@ generations (this defaults to 1).
 
 ;;;***
 \f
-;;;### (autoloads (unload-feature) "loadhist" "loadhist.el" (17942
-;;;;;;  63381))
+;;;### (autoloads (unload-feature) "loadhist" "loadhist.el" (18104
+;;;;;;  24737))
 ;;; Generated autoloads from loadhist.el
 
 (autoload (quote unload-feature) "loadhist" "\
@@ -16875,7 +17045,7 @@ such as redefining an Emacs function.
 ;;;***
 \f
 ;;;### (autoloads (locate-with-filter locate locate-ls-subdir-switches)
-;;;;;;  "locate" "locate.el" (17992 30877))
+;;;;;;  "locate" "locate.el" (18104 24737))
 ;;; Generated autoloads from locate.el
 
 (defvar locate-ls-subdir-switches "-al" "\
@@ -16926,7 +17096,7 @@ except that FILTER is not optional.
 
 ;;;***
 \f
-;;;### (autoloads (log-edit) "log-edit" "log-edit.el" (18010 5298))
+;;;### (autoloads (log-edit) "log-edit" "log-edit.el" (18104 24738))
 ;;; Generated autoloads from log-edit.el
 
 (autoload (quote log-edit) "log-edit" "\
@@ -16947,8 +17117,8 @@ If BUFFER is non-nil `log-edit' will jump to that buffer, use it to edit the
 
 ;;;***
 \f
-;;;### (autoloads (log-view-mode) "log-view" "log-view.el" (17842
-;;;;;;  58279))
+;;;### (autoloads (log-view-mode) "log-view" "log-view.el" (18104
+;;;;;;  24738))
 ;;; Generated autoloads from log-view.el
 
 (autoload (quote log-view-mode) "log-view" "\
@@ -16958,8 +17128,8 @@ Major mode for browsing CVS log output.
 
 ;;;***
 \f
-;;;### (autoloads (longlines-mode) "longlines" "longlines.el" (17992
-;;;;;;  30877))
+;;;### (autoloads (longlines-mode) "longlines" "longlines.el" (18104
+;;;;;;  24738))
 ;;; Generated autoloads from longlines.el
 
 (autoload (quote longlines-mode) "longlines" "\
@@ -16980,8 +17150,8 @@ are indicated with a symbol.
 ;;;***
 \f
 ;;;### (autoloads (print-region lpr-region print-buffer lpr-buffer
-;;;;;;  lpr-command lpr-switches printer-name) "lpr" "lpr.el" (17842
-;;;;;;  58279))
+;;;;;;  lpr-command lpr-switches printer-name) "lpr" "lpr.el" (18104
+;;;;;;  24738))
 ;;; Generated autoloads from lpr.el
 
 (defvar lpr-windows-system (memq system-type (quote (emx win32 w32 mswindows ms-dos windows-nt))))
@@ -17075,7 +17245,7 @@ for further customization of the printer command.
 ;;;***
 \f
 ;;;### (autoloads (ls-lisp-support-shell-wildcards) "ls-lisp" "ls-lisp.el"
-;;;;;;  (18006 55796))
+;;;;;;  (18104 24738))
 ;;; Generated autoloads from ls-lisp.el
 
 (defvar ls-lisp-support-shell-wildcards t "\
@@ -17086,8 +17256,8 @@ Otherwise they are treated as Emacs regexps (for backward compatibility).")
 
 ;;;***
 \f
-;;;### (autoloads (phases-of-moon) "lunar" "calendar/lunar.el" (17956
-;;;;;;  13479))
+;;;### (autoloads (phases-of-moon) "lunar" "calendar/lunar.el" (18104
+;;;;;;  24745))
 ;;; Generated autoloads from calendar/lunar.el
 
 (autoload (quote phases-of-moon) "lunar" "\
@@ -17100,8 +17270,8 @@ This function is suitable for execution in a .emacs file.
 
 ;;;***
 \f
-;;;### (autoloads (m4-mode) "m4-mode" "progmodes/m4-mode.el" (17923
-;;;;;;  63540))
+;;;### (autoloads (m4-mode) "m4-mode" "progmodes/m4-mode.el" (18104
+;;;;;;  24767))
 ;;; Generated autoloads from progmodes/m4-mode.el
 
 (autoload (quote m4-mode) "m4-mode" "\
@@ -17113,7 +17283,7 @@ A major mode to edit m4 macro files.
 ;;;***
 \f
 ;;;### (autoloads (macroexpand-all) "macroexp" "emacs-lisp/macroexp.el"
-;;;;;;  (17842 54152))
+;;;;;;  (18104 24748))
 ;;; Generated autoloads from emacs-lisp/macroexp.el
 
 (autoload (quote macroexpand-all) "macroexp" "\
@@ -17127,7 +17297,7 @@ definitions to shadow the loaded ones for use in file byte-compilation.
 ;;;***
 \f
 ;;;### (autoloads (apply-macro-to-region-lines kbd-macro-query insert-kbd-macro
-;;;;;;  name-last-kbd-macro) "macros" "macros.el" (17842 58279))
+;;;;;;  name-last-kbd-macro) "macros" "macros.el" (18104 24738))
 ;;; Generated autoloads from macros.el
 
 (autoload (quote name-last-kbd-macro) "macros" "\
@@ -17216,7 +17386,7 @@ and then select the region of un-tablified names and use
 ;;;***
 \f
 ;;;### (autoloads (what-domain mail-extract-address-components) "mail-extr"
-;;;;;;  "mail/mail-extr.el" (17842 55035))
+;;;;;;  "mail/mail-extr.el" (18104 24758))
 ;;; Generated autoloads from mail/mail-extr.el
 
 (autoload (quote mail-extract-address-components) "mail-extr" "\
@@ -17248,7 +17418,7 @@ Convert mail domain DOMAIN to the country it corresponds to.
 \f
 ;;;### (autoloads (mail-hist-put-headers-into-history mail-hist-keep-history
 ;;;;;;  mail-hist-enable mail-hist-define-keys) "mail-hist" "mail/mail-hist.el"
-;;;;;;  (17842 55035))
+;;;;;;  (18104 24758))
 ;;; Generated autoloads from mail/mail-hist.el
 
 (autoload (quote mail-hist-define-keys) "mail-hist" "\
@@ -17279,8 +17449,8 @@ This function normally would be called when the message is sent.
 \f
 ;;;### (autoloads (mail-fetch-field mail-unquote-printable-region
 ;;;;;;  mail-unquote-printable mail-quote-printable mail-file-babyl-p
-;;;;;;  mail-use-rfc822) "mail-utils" "mail/mail-utils.el" (17842
-;;;;;;  55035))
+;;;;;;  mail-use-rfc822) "mail-utils" "mail/mail-utils.el" (18104
+;;;;;;  24758))
 ;;; Generated autoloads from mail/mail-utils.el
 
 (defvar mail-use-rfc822 nil "\
@@ -17332,7 +17502,7 @@ If 4th arg LIST is non-nil, return a list of all such fields.
 ;;;***
 \f
 ;;;### (autoloads (define-mail-abbrev build-mail-abbrevs mail-abbrevs-setup)
-;;;;;;  "mailabbrev" "mail/mailabbrev.el" (17992 30878))
+;;;;;;  "mailabbrev" "mail/mailabbrev.el" (18104 24758))
 ;;; Generated autoloads from mail/mailabbrev.el
 
 (autoload (quote mail-abbrevs-setup) "mailabbrev" "\
@@ -17355,8 +17525,8 @@ If DEFINITION contains multiple addresses, separate them with commas.
 ;;;***
 \f
 ;;;### (autoloads (mail-complete define-mail-alias expand-mail-aliases
-;;;;;;  mail-complete-style) "mailalias" "mail/mailalias.el" (17842
-;;;;;;  55035))
+;;;;;;  mail-complete-style) "mailalias" "mail/mailalias.el" (18104
+;;;;;;  24758))
 ;;; Generated autoloads from mail/mailalias.el
 
 (defvar mail-complete-style (quote angles) "\
@@ -17402,7 +17572,7 @@ current header, calls `mail-complete-function' and passes prefix arg if any.
 ;;;***
 \f
 ;;;### (autoloads (mailclient-send-it) "mailclient" "mail/mailclient.el"
-;;;;;;  (17842 55035))
+;;;;;;  (18104 24758))
 ;;; Generated autoloads from mail/mailclient.el
 
 (autoload (quote mailclient-send-it) "mailclient" "\
@@ -17416,7 +17586,7 @@ The mail client is taken to be the handler of mailto URLs.
 \f
 ;;;### (autoloads (makefile-imake-mode makefile-bsdmake-mode makefile-makepp-mode
 ;;;;;;  makefile-gmake-mode makefile-automake-mode makefile-mode)
-;;;;;;  "make-mode" "progmodes/make-mode.el" (17842 56332))
+;;;;;;  "make-mode" "progmodes/make-mode.el" (18104 24767))
 ;;; Generated autoloads from progmodes/make-mode.el
 
 (autoload (quote makefile-mode) "make-mode" "\
@@ -17533,8 +17703,8 @@ An adapted `makefile-mode' that knows about imake.
 
 ;;;***
 \f
-;;;### (autoloads (make-command-summary) "makesum" "makesum.el" (17842
-;;;;;;  58279))
+;;;### (autoloads (make-command-summary) "makesum" "makesum.el" (18104
+;;;;;;  24738))
 ;;; Generated autoloads from makesum.el
 
 (autoload (quote make-command-summary) "makesum" "\
@@ -17545,7 +17715,7 @@ Previous contents of that buffer are killed first.
 
 ;;;***
 \f
-;;;### (autoloads (man-follow man) "man" "man.el" (17992 30877))
+;;;### (autoloads (man-follow man) "man" "man.el" (18104 24738))
 ;;; Generated autoloads from man.el
 
 (defalias (quote manual-entry) (quote man))
@@ -17572,7 +17742,7 @@ Get a Un*x manual page of the item under point and put it in a buffer.
 
 ;;;***
 \f
-;;;### (autoloads (master-mode) "master" "master.el" (17842 58279))
+;;;### (autoloads (master-mode) "master" "master.el" (18104 24738))
 ;;; Generated autoloads from master.el
 
 (autoload (quote master-mode) "master" "\
@@ -17594,8 +17764,34 @@ yourself the value of `master-of' by calling `master-show-slave'.
 
 ;;;***
 \f
-;;;### (autoloads (menu-bar-mode) "menu-bar" "menu-bar.el" (17942
-;;;;;;  63381))
+;;;### (autoloads (minibuffer-indicate-depth-mode) "mb-depth" "mb-depth.el"
+;;;;;;  (18104 24738))
+;;; Generated autoloads from mb-depth.el
+
+(defvar minibuffer-indicate-depth-mode nil "\
+Non-nil if Minibuffer-Indicate-Depth mode is enabled.
+See the command `minibuffer-indicate-depth-mode' for a description of this minor mode.
+Setting this variable directly does not take effect;
+either customize it (see the info node `Easy Customization')
+or call the function `minibuffer-indicate-depth-mode'.")
+
+(custom-autoload (quote minibuffer-indicate-depth-mode) "mb-depth" nil)
+
+(autoload (quote minibuffer-indicate-depth-mode) "mb-depth" "\
+Toggle Minibuffer Indicate Depth mode.
+When active, any recursive use of the minibuffer will show
+the recursion depth in the minibuffer prompt.  This is only
+useful if `enable-recursive-minibuffers' is non-nil.
+
+With prefix argument ARG, turn on if positive, otherwise off.
+Returns non-nil if the new state is enabled.
+
+\(fn &optional ARG)" t nil)
+
+;;;***
+\f
+;;;### (autoloads (menu-bar-mode) "menu-bar" "menu-bar.el" (18104
+;;;;;;  24738))
 ;;; Generated autoloads from menu-bar.el
 
 (put (quote menu-bar-mode) (quote standard-value) (quote (t)))
@@ -17630,7 +17826,7 @@ turn on menu bars; otherwise, turn off menu bars.
 ;;;;;;  message-cite-function message-yank-prefix message-citation-line-function
 ;;;;;;  message-send-mail-function message-user-organization-file
 ;;;;;;  message-signature-separator message-from-style) "message"
-;;;;;;  "gnus/message.el" (18010 19867))
+;;;;;;  "gnus/message.el" (18104 24751))
 ;;; Generated autoloads from gnus/message.el
 
 (defvar message-from-style (quote default) "\
@@ -17886,7 +18082,7 @@ which specify the range to operate on.
 ;;;***
 \f
 ;;;### (autoloads (metapost-mode metafont-mode) "meta-mode" "progmodes/meta-mode.el"
-;;;;;;  (17842 56332))
+;;;;;;  (18104 24767))
 ;;; Generated autoloads from progmodes/meta-mode.el
 
 (autoload (quote metafont-mode) "meta-mode" "\
@@ -17913,7 +18109,7 @@ Turning on MetaPost mode calls the value of the variable
 \f
 ;;;### (autoloads (metamail-region metamail-buffer metamail-interpret-body
 ;;;;;;  metamail-interpret-header) "metamail" "mail/metamail.el"
-;;;;;;  (17842 55035))
+;;;;;;  (18104 24758))
 ;;; Generated autoloads from mail/metamail.el
 
 (autoload (quote metamail-interpret-header) "metamail" "\
@@ -17958,7 +18154,7 @@ redisplayed as output is inserted.
 \f
 ;;;### (autoloads (mh-fully-kill-draft mh-send-letter mh-user-agent-compose
 ;;;;;;  mh-smail-batch mh-smail-other-window mh-smail) "mh-comp"
-;;;;;;  "mh-e/mh-comp.el" (17842 55144))
+;;;;;;  "mh-e/mh-comp.el" (18104 24759))
 ;;; Generated autoloads from mh-e/mh-comp.el
 
 (autoload (quote mh-smail) "mh-comp" "\
@@ -18045,7 +18241,7 @@ delete the draft message.
 
 ;;;***
 \f
-;;;### (autoloads (mh-version) "mh-e" "mh-e/mh-e.el" (17842 55144))
+;;;### (autoloads (mh-version) "mh-e" "mh-e/mh-e.el" (18104 24759))
 ;;; Generated autoloads from mh-e/mh-e.el
 
 (put (quote mh-progs) (quote risky-local-variable) t)
@@ -18062,7 +18258,7 @@ Display version information about MH-E and the MH mail handling system.
 ;;;***
 \f
 ;;;### (autoloads (mh-folder-mode mh-nmail mh-rmail) "mh-folder"
-;;;;;;  "mh-e/mh-folder.el" (17842 55144))
+;;;;;;  "mh-e/mh-folder.el" (18104 24759))
 ;;; Generated autoloads from mh-e/mh-folder.el
 
 (autoload (quote mh-rmail) "mh-folder" "\
@@ -18144,7 +18340,7 @@ perform the operation on all messages in that region.
 ;;;***
 \f
 ;;;### (autoloads (midnight-delay-set clean-buffer-list) "midnight"
-;;;;;;  "midnight.el" (17842 58279))
+;;;;;;  "midnight.el" (18104 24738))
 ;;; Generated autoloads from midnight.el
 
 (autoload (quote clean-buffer-list) "midnight" "\
@@ -18171,7 +18367,7 @@ to its second argument TM.
 ;;;***
 \f
 ;;;### (autoloads (minibuffer-electric-default-mode) "minibuf-eldef"
-;;;;;;  "minibuf-eldef.el" (17842 58279))
+;;;;;;  "minibuf-eldef.el" (18104 24738))
 ;;; Generated autoloads from minibuf-eldef.el
 
 (defvar minibuffer-electric-default-mode nil "\
@@ -18199,7 +18395,7 @@ Returns non-nil if the new state is enabled.
 ;;;***
 \f
 ;;;### (autoloads (mixal-mode) "mixal-mode" "progmodes/mixal-mode.el"
-;;;;;;  (17842 56332))
+;;;;;;  (18104 24768))
 ;;; Generated autoloads from progmodes/mixal-mode.el
 
 (autoload (quote mixal-mode) "mixal-mode" "\
@@ -18214,7 +18410,7 @@ Major mode for the mixal asm language.
 \f
 ;;;### (autoloads (malayalam-composition-function malayalam-post-read-conversion
 ;;;;;;  malayalam-compose-region) "mlm-util" "language/mlm-util.el"
-;;;;;;  (17842 58278))
+;;;;;;  (18104 24758))
 ;;; Generated autoloads from language/mlm-util.el
 
 (autoload (quote malayalam-compose-region) "mlm-util" "\
@@ -18237,7 +18433,7 @@ PATTERN regexp.
 ;;;***
 \f
 ;;;### (autoloads (mm-inline-external-body mm-extern-cache-contents)
-;;;;;;  "mm-extern" "gnus/mm-extern.el" (17842 54741))
+;;;;;;  "mm-extern" "gnus/mm-extern.el" (18104 24752))
 ;;; Generated autoloads from gnus/mm-extern.el
 
 (autoload (quote mm-extern-cache-contents) "mm-extern" "\
@@ -18256,7 +18452,7 @@ If NO-DISPLAY is nil, display it. Otherwise, do nothing after replacing.
 ;;;***
 \f
 ;;;### (autoloads (mm-inline-partial) "mm-partial" "gnus/mm-partial.el"
-;;;;;;  (17842 54741))
+;;;;;;  (18104 24752))
 ;;; Generated autoloads from gnus/mm-partial.el
 
 (autoload (quote mm-inline-partial) "mm-partial" "\
@@ -18270,7 +18466,7 @@ If NO-DISPLAY is nil, display it. Otherwise, do nothing after replacing.
 ;;;***
 \f
 ;;;### (autoloads (mm-url-insert-file-contents-external mm-url-insert-file-contents)
-;;;;;;  "mm-url" "gnus/mm-url.el" (17842 54741))
+;;;;;;  "mm-url" "gnus/mm-url.el" (18104 24752))
 ;;; Generated autoloads from gnus/mm-url.el
 
 (autoload (quote mm-url-insert-file-contents) "mm-url" "\
@@ -18287,7 +18483,7 @@ Insert file contents of URL using `mm-url-program'.
 ;;;***
 \f
 ;;;### (autoloads (mm-uu-dissect-text-parts mm-uu-dissect) "mm-uu"
-;;;;;;  "gnus/mm-uu.el" (17842 54741))
+;;;;;;  "gnus/mm-uu.el" (18104 24752))
 ;;; Generated autoloads from gnus/mm-uu.el
 
 (autoload (quote mm-uu-dissect) "mm-uu" "\
@@ -18307,7 +18503,7 @@ Assume text has been decoded if DECODED is non-nil.
 ;;;***
 \f
 ;;;### (autoloads (mml1991-sign mml1991-encrypt) "mml1991" "gnus/mml1991.el"
-;;;;;;  (17842 54741))
+;;;;;;  (18104 24752))
 ;;; Generated autoloads from gnus/mml1991.el
 
 (autoload (quote mml1991-encrypt) "mml1991" "\
@@ -18324,7 +18520,7 @@ Not documented
 \f
 ;;;### (autoloads (mml2015-self-encrypt mml2015-sign mml2015-encrypt
 ;;;;;;  mml2015-verify-test mml2015-verify mml2015-decrypt-test mml2015-decrypt)
-;;;;;;  "mml2015" "gnus/mml2015.el" (17842 54741))
+;;;;;;  "mml2015" "gnus/mml2015.el" (18104 24752))
 ;;; Generated autoloads from gnus/mml2015.el
 
 (autoload (quote mml2015-decrypt) "mml2015" "\
@@ -18365,7 +18561,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (modula-2-mode) "modula2" "progmodes/modula2.el"
-;;;;;;  (17276 13069))
+;;;;;;  (17279 21317))
 ;;; Generated autoloads from progmodes/modula2.el
 
 (autoload (quote modula-2-mode) "modula2" "\
@@ -18397,7 +18593,7 @@ followed by the first character of the construct.
 ;;;***
 \f
 ;;;### (autoloads (unmorse-region morse-region) "morse" "play/morse.el"
-;;;;;;  (17842 55395))
+;;;;;;  (18104 24762))
 ;;; Generated autoloads from play/morse.el
 
 (autoload (quote morse-region) "morse" "\
@@ -18412,8 +18608,8 @@ Convert morse coded text in region to ordinary ASCII text.
 
 ;;;***
 \f
-;;;### (autoloads (mouse-sel-mode) "mouse-sel" "mouse-sel.el" (17842
-;;;;;;  58279))
+;;;### (autoloads (mouse-sel-mode) "mouse-sel" "mouse-sel.el" (18104
+;;;;;;  24738))
 ;;; Generated autoloads from mouse-sel.el
 
 (defvar mouse-sel-mode nil "\
@@ -18465,7 +18661,7 @@ primary selection and region.
 
 ;;;***
 \f
-;;;### (autoloads (mpuz) "mpuz" "play/mpuz.el" (17862 6157))
+;;;### (autoloads (mpuz) "mpuz" "play/mpuz.el" (18104 24762))
 ;;; Generated autoloads from play/mpuz.el
 
 (autoload (quote mpuz) "mpuz" "\
@@ -18475,7 +18671,7 @@ Multiplication puzzle with GNU Emacs.
 
 ;;;***
 \f
-;;;### (autoloads (msb-mode) "msb" "msb.el" (18006 55796))
+;;;### (autoloads (msb-mode) "msb" "msb.el" (18104 24738))
 ;;; Generated autoloads from msb.el
 
 (defvar msb-mode nil "\
@@ -18502,7 +18698,7 @@ different buffer menu using the function `msb'.
 ;;;;;;  describe-current-coding-system describe-current-coding-system-briefly
 ;;;;;;  describe-coding-system describe-character-set list-charset-chars
 ;;;;;;  read-charset list-character-sets) "mule-diag" "international/mule-diag.el"
-;;;;;;  (17842 54888))
+;;;;;;  (18104 24757))
 ;;; Generated autoloads from international/mule-diag.el
 
 (defvar non-iso-charset-alist (\` ((mac-roman (ascii latin-iso8859-1 mule-unicode-2500-33ff mule-unicode-0100-24ff mule-unicode-e000-ffff) mac-roman-decoder ((0 255))) (viscii (ascii vietnamese-viscii-lower vietnamese-viscii-upper) viet-viscii-nonascii-translation-table ((0 255))) (vietnamese-tcvn (ascii vietnamese-viscii-lower vietnamese-viscii-upper) viet-tcvn-nonascii-translation-table ((0 255))) (koi8-r (ascii cyrillic-iso8859-5) cyrillic-koi8-r-nonascii-translation-table ((32 255))) (alternativnyj (ascii cyrillic-iso8859-5) cyrillic-alternativnyj-nonascii-translation-table ((32 255))) (koi8-u (ascii cyrillic-iso8859-5 mule-unicode-0100-24ff) cyrillic-koi8-u-nonascii-translation-table ((32 255))) (big5 (ascii chinese-big5-1 chinese-big5-2) decode-big5-char ((32 127) ((161 254) 64 126 161 254))) (sjis (ascii katakana-jisx0201 japanese-jisx0208) decode-sjis-char ((32 127 161 223) ((129 159 224 239) 64 126 128 252))))) "\
@@ -18676,7 +18872,7 @@ system which uses fontsets).
 ;;;;;;  coding-system-translation-table-for-decode coding-system-pre-write-conversion
 ;;;;;;  coding-system-post-read-conversion lookup-nested-alist set-nested-alist
 ;;;;;;  truncate-string-to-width store-substring string-to-sequence)
-;;;;;;  "mule-util" "international/mule-util.el" (17842 54888))
+;;;;;;  "mule-util" "international/mule-util.el" (18104 24757))
 ;;; Generated autoloads from international/mule-util.el
 
 (autoload (quote string-to-sequence) "mule-util" "\
@@ -18805,7 +19001,7 @@ basis, this may not be accurate.
 ;;;***
 \f
 ;;;### (autoloads (mwheel-install mouse-wheel-mode) "mwheel" "mwheel.el"
-;;;;;;  (17842 58279))
+;;;;;;  (18104 24738))
 ;;; Generated autoloads from mwheel.el
 
 (defvar mouse-wheel-mode nil "\
@@ -18834,7 +19030,7 @@ Enable mouse wheel support.
 ;;;### (autoloads (network-connection network-connection-to-service
 ;;;;;;  whois-reverse-lookup whois finger ftp run-dig dns-lookup-host
 ;;;;;;  nslookup nslookup-host route arp netstat ipconfig ping traceroute)
-;;;;;;  "net-utils" "net/net-utils.el" (17891 7215))
+;;;;;;  "net-utils" "net/net-utils.el" (18104 24760))
 ;;; Generated autoloads from net/net-utils.el
 
 (autoload (quote traceroute) "net-utils" "\
@@ -18930,7 +19126,7 @@ Open a network connection to HOST on PORT.
 ;;;;;;  uncomment-region comment-kill comment-set-column comment-indent
 ;;;;;;  comment-indent-default comment-normalize-vars comment-multi-line
 ;;;;;;  comment-padding comment-style comment-column) "newcomment"
-;;;;;;  "newcomment.el" (17992 30877))
+;;;;;;  "newcomment.el" (18104 24738))
 ;;; Generated autoloads from newcomment.el
 
 (defalias (quote indent-for-comment) (quote comment-indent))
@@ -18950,10 +19146,10 @@ Major modes should set this variable.")
 
 (defvar comment-column 32 "\
 Column to indent right-margin comments to.
-Each mode establishes a different default value for this variable; you
+Each mode may establish a different default value for this variable; you
 can set the value for a particular mode using that mode's hook.
-Comments might be indented to a value smaller than this in order
-not to go beyond `comment-fill-column'.")
+Comments might be indented to a different value in order not to go beyond
+`comment-fill-column' or in order to align them with surrounding comments.")
 
 (custom-autoload (quote comment-column) "newcomment" t)
 (put 'comment-column 'safe-local-variable 'integerp)
@@ -19126,7 +19322,7 @@ unless optional argument SOFT is non-nil.
 \f
 ;;;### (autoloads (newsticker-show-news newsticker-start-ticker newsticker-start
 ;;;;;;  newsticker-ticker-running-p newsticker-running-p) "newsticker"
-;;;;;;  "net/newsticker.el" (17873 44590))
+;;;;;;  "net/newsticker.el" (18104 24760))
 ;;; Generated autoloads from net/newsticker.el
 
 (autoload (quote newsticker-running-p) "newsticker" "\
@@ -19168,7 +19364,7 @@ Switch to newsticker buffer.  You may want to bind this to a key.
 ;;;***
 \f
 ;;;### (autoloads (nndiary-generate-nov-databases) "nndiary" "gnus/nndiary.el"
-;;;;;;  (17992 30878))
+;;;;;;  (18104 24753))
 ;;; Generated autoloads from gnus/nndiary.el
 
 (autoload (quote nndiary-generate-nov-databases) "nndiary" "\
@@ -19178,8 +19374,8 @@ Generate NOV databases in all nndiary directories.
 
 ;;;***
 \f
-;;;### (autoloads (nndoc-add-type) "nndoc" "gnus/nndoc.el" (17842
-;;;;;;  54741))
+;;;### (autoloads (nndoc-add-type) "nndoc" "gnus/nndoc.el" (18104
+;;;;;;  24753))
 ;;; Generated autoloads from gnus/nndoc.el
 
 (autoload (quote nndoc-add-type) "nndoc" "\
@@ -19194,7 +19390,7 @@ symbol in the alist.
 ;;;***
 \f
 ;;;### (autoloads (nnfolder-generate-active-file) "nnfolder" "gnus/nnfolder.el"
-;;;;;;  (17842 54741))
+;;;;;;  (18104 24753))
 ;;; Generated autoloads from gnus/nnfolder.el
 
 (autoload (quote nnfolder-generate-active-file) "nnfolder" "\
@@ -19206,7 +19402,7 @@ This command does not work if you use short group names.
 ;;;***
 \f
 ;;;### (autoloads (nnkiboze-generate-groups) "nnkiboze" "gnus/nnkiboze.el"
-;;;;;;  (17842 54741))
+;;;;;;  (18104 24753))
 ;;; Generated autoloads from gnus/nnkiboze.el
 
 (autoload (quote nnkiboze-generate-groups) "nnkiboze" "\
@@ -19218,7 +19414,7 @@ Finds out what articles are to be part of the nnkiboze groups.
 ;;;***
 \f
 ;;;### (autoloads (nnml-generate-nov-databases) "nnml" "gnus/nnml.el"
-;;;;;;  (17842 54741))
+;;;;;;  (18104 24754))
 ;;; Generated autoloads from gnus/nnml.el
 
 (autoload (quote nnml-generate-nov-databases) "nnml" "\
@@ -19229,7 +19425,7 @@ Generate NOV databases in all nnml directories.
 ;;;***
 \f
 ;;;### (autoloads (nnsoup-revert-variables nnsoup-set-variables nnsoup-pack-replies)
-;;;;;;  "nnsoup" "gnus/nnsoup.el" (17842 54741))
+;;;;;;  "nnsoup" "gnus/nnsoup.el" (18104 24754))
 ;;; Generated autoloads from gnus/nnsoup.el
 
 (autoload (quote nnsoup-pack-replies) "nnsoup" "\
@@ -19250,7 +19446,7 @@ Revert posting and mailing methods to the standard Emacs methods.
 ;;;***
 \f
 ;;;### (autoloads (disable-command enable-command disabled-command-function)
-;;;;;;  "novice" "novice.el" (17842 58279))
+;;;;;;  "novice" "novice.el" (18104 24738))
 ;;; Generated autoloads from novice.el
 
 (defvar disabled-command-function (quote disabled-command-function) "\
@@ -19283,7 +19479,7 @@ to future sessions.
 ;;;***
 \f
 ;;;### (autoloads (nroff-mode) "nroff-mode" "textmodes/nroff-mode.el"
-;;;;;;  (17842 58277))
+;;;;;;  (18104 24771))
 ;;; Generated autoloads from textmodes/nroff-mode.el
 
 (autoload (quote nroff-mode) "nroff-mode" "\
@@ -19298,7 +19494,7 @@ closing requests for requests that are used in matched pairs.
 ;;;***
 \f
 ;;;### (autoloads (octave-help) "octave-hlp" "progmodes/octave-hlp.el"
-;;;;;;  (17842 56332))
+;;;;;;  (18104 24768))
 ;;; Generated autoloads from progmodes/octave-hlp.el
 
 (autoload (quote octave-help) "octave-hlp" "\
@@ -19312,7 +19508,7 @@ If KEY is not a string, prompt for it with completion.
 ;;;***
 \f
 ;;;### (autoloads (inferior-octave) "octave-inf" "progmodes/octave-inf.el"
-;;;;;;  (17842 56332))
+;;;;;;  (18104 24768))
 ;;; Generated autoloads from progmodes/octave-inf.el
 
 (autoload (quote inferior-octave) "octave-inf" "\
@@ -19335,7 +19531,7 @@ startup file, `~/.emacs-octave'.
 ;;;***
 \f
 ;;;### (autoloads (octave-mode) "octave-mod" "progmodes/octave-mod.el"
-;;;;;;  (17842 56332))
+;;;;;;  (18104 24768))
 ;;; Generated autoloads from progmodes/octave-mod.el
 
 (autoload (quote octave-mode) "octave-mod" "\
@@ -19431,15 +19627,38 @@ including a reproducible test case and send the message.
 
 \(fn)" t nil)
 
+;;;***
+\f
+;;;### (autoloads (edit-options list-options) "options" "obsolete/options.el"
+;;;;;;  (18104 24760))
+;;; Generated autoloads from obsolete/options.el
+
+(autoload (quote list-options) "options" "\
+Display a list of Emacs user options, with values and documentation.
+It is now better to use Customize instead.
+
+\(fn)" t nil)
+
+(autoload (quote edit-options) "options" "\
+Edit a list of Emacs user option values.
+Selects a buffer containing such a list,
+in which there are commands to set the option values.
+Type \\[describe-mode] in that buffer for a list of commands.
+
+The Custom feature is intended to make this obsolete.
+
+\(fn)" t nil)
+
 ;;;***
 \f
 ;;;### (autoloads (org-export-icalendar-combine-agenda-files org-export-icalendar-all-agenda-files
 ;;;;;;  org-export-icalendar-this-file org-diary org-tags-view org-todo-list
-;;;;;;  org-agenda-list org-cycle-agenda-files org-batch-agenda org-agenda
-;;;;;;  org-remember-handler org-remember org-remember-apply-template
+;;;;;;  org-agenda-list org-cycle-agenda-files org-batch-store-agenda-views
+;;;;;;  org-store-agenda-views org-batch-agenda-csv org-batch-agenda
+;;;;;;  org-agenda org-remember-handler org-remember org-remember-apply-template
 ;;;;;;  org-remember-annotation org-store-link orgtbl-mode turn-on-orgtbl
-;;;;;;  org-global-cycle org-cycle org-mode) "org" "textmodes/org.el"
-;;;;;;  (17922 37459))
+;;;;;;  turn-on-orgstruct orgstruct-mode org-global-cycle org-cycle
+;;;;;;  org-mode) "org" "textmodes/org.el" (18104 24771))
 ;;; Generated autoloads from textmodes/org.el
 
 (autoload (quote org-mode) "org" "\
@@ -19488,7 +19707,7 @@ Visibility cycling for Org-mode.
   `indent-relative', like TAB normally does.  See the option
   `org-cycle-emulate-tab' for details.
 
-- Special case: if point is the the beginning of the buffer and there is
+- Special case: if point is at the beginning of the buffer and there is
   no headline in line 1, this function will act as if called with prefix arg.
 
 \(fn &optional ARG)" t nil)
@@ -19498,6 +19717,36 @@ Cycle the global visibility.  For details see `org-cycle'.
 
 \(fn &optional ARG)" t nil)
 
+(autoload (quote orgstruct-mode) "org" "\
+Toggle the minor more `orgstruct-mode'.
+This mode is for using Org-mode structure commands in other modes.
+The following key behave as if Org-mode was active, if the cursor
+is on a headline, or on a plain list item (both in the definition
+of Org-mode).
+
+M-up        Move entry/item up
+M-down     Move entry/item down
+M-left     Promote
+M-right            Demote
+M-S-up     Move entry/item up
+M-S-down    Move entry/item down
+M-S-left    Promote subtree
+M-S-right   Demote subtree
+M-q        Fill paragraph and items like in Org-mode
+C-c ^      Sort entries
+C-c -      Cycle list bullet
+TAB         Cycle item visibility
+M-RET       Insert new heading/item
+S-M-RET     Insert new TODO heading / Chekbox item
+C-c C-c     Set tags / toggle checkbox
+
+\(fn &optional ARG)" t nil)
+
+(autoload (quote turn-on-orgstruct) "org" "\
+Unconditionally turn on `orgstruct-mode'.
+
+\(fn)" nil nil)
+
 (autoload (quote turn-on-orgtbl) "org" "\
 Unconditionally turn on `orgtbl-mode'.
 
@@ -19588,7 +19837,8 @@ T     Call `org-todo-list' to display the global todo list, select only
 m     Call `org-tags-view' to display headlines with tags matching
       a condition  (the user is prompted for the condition).
 M     Like `m', but select only TODO entries, no ordinary headlines.
-l     Create a timeeline for the current buffer.
+l     Create a timeline for the current buffer.
+e     Export views to associated files.
 
 More commands can be added by configuring the variable
 `org-agenda-custom-commands'.  In particular, specific tags and TODO keyword
@@ -19601,13 +19851,62 @@ next use of \\[org-agenda]) restricted to the current file.
 \(fn ARG)" t nil)
 
 (autoload (quote org-batch-agenda) "org" "\
-Run an agenda command in batch mode, send result to STDOUT.
-CMD-KEY is a string that is also a key in `org-agenda-custom-commands'.
+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
+`org-agenda-custom-commands' and triggers this command.  If it is a
+longer string is is used as a tags/todo match string.
 Paramters are alternating variable names and values that will be bound
 before running the agenda command.
 
 \(fn CMD-KEY &rest PARAMETERS)" nil (quote macro))
 
+(autoload (quote org-batch-agenda-csv) "org" "\
+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
+`org-agenda-custom-commands' and triggers this command.  If it is a
+longer string is is used as a tags/todo match string.
+Paramters are alternating variable names and values that will be bound
+before running the agenda command.
+
+The output gives a line for each selected agenda item.  Each
+item is a list of comma-separated values, like this:
+
+category,head,type,todo,tags,date,time,extra,priority-l,priority-n
+
+category     The category of the item
+head         The headline, without TODO kwd, TAGS and PRIORITY
+type         The type of the agenda entry, can be
+                todo               selected in TODO match
+                tagsmatch          selected in tags match
+                diary              imported from diary
+                deadline           a deadline on given date
+                scheduled          scheduled on given date
+                timestamp          entry has timestamp on given date
+                closed             entry was closed on given date
+                upcoming-deadline  warning about deadline
+                past-scheduled     forwarded scheduled item
+                block              entry has date block including g. date
+todo         The todo keyword, if any
+tags         All tags including inherited ones, separated by colons
+date         The relevant date, like 2007-2-14
+time         The time, like 15:00-16:50
+extra        Sting with extra planning info
+priority-l   The priority letter if any was given
+priority-n   The computed numerical priority
+agenda-day   The day in the agenda where this is listed
+
+\(fn CMD-KEY &rest PARAMETERS)" nil (quote macro))
+
+(autoload (quote org-store-agenda-views) "org" "\
+Not documented
+
+\(fn &rest PARAMETERS)" t nil)
+
+(autoload (quote org-batch-store-agenda-views) "org" "\
+Run all custom agenda commands that have a file argument.
+
+\(fn &rest PARAMETERS)" nil (quote macro))
+
 (autoload (quote 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.
@@ -19635,7 +19934,7 @@ Show all TODO entries from all agenda file in a single list.
 The prefix arg can be used to select a specific TODO keyword and limit
 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'.
+`org-todo-keywords-1'.
 
 \(fn ARG)" t nil)
 
@@ -19656,6 +19955,8 @@ items should be listed.  The following arguments are allowed:
                 date range matching the selected date.  Deadlines will
                 also be listed, on the expiration day.
 
+   :sexp         FIXME
+
    :deadline     List any deadlines past due, or due within
                 `org-deadline-warning-days'.  The listing occurs only
                 in the diary for *today*, not at any other date.  If
@@ -19680,10 +19981,10 @@ all files listed in `org-agenda-files' will be checked automatically:
    &%%(org-diary)
 
 If you don't give any arguments (as in the example above), the default
-arguments (:deadline :scheduled :timestamp) are used.  So the example above may
-also be written as
+arguments (:deadline :scheduled :timestamp :sexp) are used.
+So the example above may also be written as
 
-   &%%(org-diary :deadline :timestamp :scheduled)
+   &%%(org-diary :deadline :timestamp :sexp :scheduled)
 
 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
@@ -19711,10 +20012,40 @@ The file is stored under the name `org-combined-agenda-icalendar-file'.
 
 \(fn)" t nil)
 
+;;;***
+\f
+;;;### (autoloads (org-publish-all org-publish-current-file org-publish-current-project
+;;;;;;  org-publish) "org-publish" "textmodes/org-publish.el" (18104
+;;;;;;  24771))
+;;; Generated autoloads from textmodes/org-publish.el
+
+(autoload (quote org-publish) "org-publish" "\
+Publish the project PROJECT-NAME.
+
+\(fn PROJECT-NAME &optional FORCE)" t nil)
+
+(autoload (quote org-publish-current-project) "org-publish" "\
+Publish the project associated with the current file.
+With prefix argument, force publishing all files in project.
+
+\(fn &optional FORCE)" t nil)
+
+(autoload (quote org-publish-current-file) "org-publish" "\
+Publish the current file.
+With prefix argument, force publish the file.
+
+\(fn &optional FORCE)" t nil)
+
+(autoload (quote org-publish-all) "org-publish" "\
+Publish all projects.
+With prefix argument, force publish all files.
+
+\(fn &optional FORCE)" t nil)
+
 ;;;***
 \f
 ;;;### (autoloads (outline-minor-mode outline-mode) "outline" "outline.el"
-;;;;;;  (17952 11093))
+;;;;;;  (18104 24738))
 ;;; Generated autoloads from outline.el
 (put 'outline-regexp 'safe-local-variable 'string-or-null-p)
 
@@ -19770,8 +20101,8 @@ See the command `outline-mode' for more information on this mode.
 
 ;;;***
 \f
-;;;### (autoloads nil "paragraphs" "textmodes/paragraphs.el" (17842
-;;;;;;  58277))
+;;;### (autoloads nil "paragraphs" "textmodes/paragraphs.el" (18104
+;;;;;;  24772))
 ;;; Generated autoloads from textmodes/paragraphs.el
 (put 'paragraph-start 'safe-local-variable 'stringp)
 (put 'paragraph-separate 'safe-local-variable 'stringp)
@@ -19785,7 +20116,7 @@ See the command `outline-mode' for more information on this mode.
 
 ;;;***
 \f
-;;;### (autoloads (show-paren-mode) "paren" "paren.el" (18016 8765))
+;;;### (autoloads (show-paren-mode) "paren" "paren.el" (18104 24738))
 ;;; Generated autoloads from paren.el
 
 (defvar show-paren-mode nil "\
@@ -19810,7 +20141,7 @@ in `show-paren-style' after `show-paren-delay' seconds of Emacs idle time.
 ;;;***
 \f
 ;;;### (autoloads (parse-time-string) "parse-time" "calendar/parse-time.el"
-;;;;;;  (17957 43164))
+;;;;;;  (18104 24745))
 ;;; Generated autoloads from calendar/parse-time.el
 
 (autoload (quote parse-time-string) "parse-time" "\
@@ -19822,8 +20153,8 @@ unknown are returned as nil.
 
 ;;;***
 \f
-;;;### (autoloads (pascal-mode) "pascal" "progmodes/pascal.el" (17842
-;;;;;;  56332))
+;;;### (autoloads (pascal-mode) "pascal" "progmodes/pascal.el" (18104
+;;;;;;  24768))
 ;;; Generated autoloads from progmodes/pascal.el
 
 (autoload (quote pascal-mode) "pascal" "\
@@ -19876,7 +20207,7 @@ no args, if that value is non-nil.
 ;;;***
 \f
 ;;;### (autoloads (pc-bindings-mode) "pc-mode" "emulation/pc-mode.el"
-;;;;;;  (17842 54264))
+;;;;;;  (18104 24748))
 ;;; Generated autoloads from emulation/pc-mode.el
 
 (autoload (quote pc-bindings-mode) "pc-mode" "\
@@ -19894,7 +20225,7 @@ C-Escape does list-buffers.
 ;;;***
 \f
 ;;;### (autoloads (pc-selection-mode pc-selection-mode) "pc-select"
-;;;;;;  "emulation/pc-select.el" (17842 54264))
+;;;;;;  "emulation/pc-select.el" (18104 24748))
 ;;; Generated autoloads from emulation/pc-select.el
 
 (defvar pc-selection-mode nil "\
@@ -19970,8 +20301,8 @@ you must modify it using \\[customize] or \\[pc-selection-mode].")
 
 ;;;***
 \f
-;;;### (autoloads (pcomplete/cvs) "pcmpl-cvs" "pcmpl-cvs.el" (17842
-;;;;;;  58279))
+;;;### (autoloads (pcomplete/cvs) "pcmpl-cvs" "pcmpl-cvs.el" (18104
+;;;;;;  24738))
 ;;; Generated autoloads from pcmpl-cvs.el
 
 (autoload (quote pcomplete/cvs) "pcmpl-cvs" "\
@@ -19982,7 +20313,7 @@ Completion rules for the `cvs' command.
 ;;;***
 \f
 ;;;### (autoloads (pcomplete/tar pcomplete/make pcomplete/bzip2 pcomplete/gzip)
-;;;;;;  "pcmpl-gnu" "pcmpl-gnu.el" (17842 58279))
+;;;;;;  "pcmpl-gnu" "pcmpl-gnu.el" (18104 24738))
 ;;; Generated autoloads from pcmpl-gnu.el
 
 (autoload (quote pcomplete/gzip) "pcmpl-gnu" "\
@@ -20010,7 +20341,7 @@ Completion for the GNU tar utility.
 ;;;***
 \f
 ;;;### (autoloads (pcomplete/mount pcomplete/umount pcomplete/kill)
-;;;;;;  "pcmpl-linux" "pcmpl-linux.el" (17842 58279))
+;;;;;;  "pcmpl-linux" "pcmpl-linux.el" (18104 24738))
 ;;; Generated autoloads from pcmpl-linux.el
 
 (autoload (quote pcomplete/kill) "pcmpl-linux" "\
@@ -20030,8 +20361,8 @@ Completion for GNU/Linux `mount'.
 
 ;;;***
 \f
-;;;### (autoloads (pcomplete/rpm) "pcmpl-rpm" "pcmpl-rpm.el" (17842
-;;;;;;  58279))
+;;;### (autoloads (pcomplete/rpm) "pcmpl-rpm" "pcmpl-rpm.el" (18104
+;;;;;;  24738))
 ;;; Generated autoloads from pcmpl-rpm.el
 
 (autoload (quote pcomplete/rpm) "pcmpl-rpm" "\
@@ -20047,7 +20378,7 @@ You can use \\[eshell-report-bug] to do so.
 \f
 ;;;### (autoloads (pcomplete/chgrp pcomplete/chown pcomplete/which
 ;;;;;;  pcomplete/xargs pcomplete/rm pcomplete/rmdir pcomplete/cd)
-;;;;;;  "pcmpl-unix" "pcmpl-unix.el" (17842 58279))
+;;;;;;  "pcmpl-unix" "pcmpl-unix.el" (18104 24738))
 ;;; Generated autoloads from pcmpl-unix.el
 
 (autoload (quote pcomplete/cd) "pcmpl-unix" "\
@@ -20093,8 +20424,8 @@ Completion for the `chgrp' command.
 \f
 ;;;### (autoloads (pcomplete-shell-setup pcomplete-comint-setup pcomplete-list
 ;;;;;;  pcomplete-help pcomplete-expand pcomplete-continue pcomplete-expand-and-complete
-;;;;;;  pcomplete-reverse pcomplete) "pcomplete" "pcomplete.el" (17944
-;;;;;;  62194))
+;;;;;;  pcomplete-reverse pcomplete) "pcomplete" "pcomplete.el" (18104
+;;;;;;  24738))
 ;;; Generated autoloads from pcomplete.el
 
 (autoload (quote pcomplete) "pcomplete" "\
@@ -20153,7 +20484,7 @@ Setup shell-mode to use pcomplete.
 \f
 ;;;### (autoloads (cvs-dired-use-hook cvs-dired-action cvs-status
 ;;;;;;  cvs-update cvs-examine cvs-quickdir cvs-checkout) "pcvs"
-;;;;;;  "pcvs.el" (18006 55796))
+;;;;;;  "pcvs.el" (18104 24738))
 ;;; Generated autoloads from pcvs.el
 
 (autoload (quote cvs-checkout) "pcvs" "\
@@ -20230,7 +20561,7 @@ The exact behavior is determined also by `cvs-dired-use-hook'." (when (stringp d
 
 ;;;***
 \f
-;;;### (autoloads nil "pcvs-defs" "pcvs-defs.el" (17842 58279))
+;;;### (autoloads nil "pcvs-defs" "pcvs-defs.el" (18104 24738))
 ;;; Generated autoloads from pcvs-defs.el
 
 (defvar cvs-global-menu (let ((m (make-sparse-keymap "PCL-CVS"))) (define-key m [status] (quote (menu-item "Directory Status" cvs-status :help "A more verbose status of a workarea"))) (define-key m [checkout] (quote (menu-item "Checkout Module" cvs-checkout :help "Check out a module from the repository"))) (define-key m [update] (quote (menu-item "Update Directory" cvs-update :help "Fetch updates from the repository"))) (define-key m [examine] (quote (menu-item "Examine Directory" cvs-examine :help "Examine the current state of a workarea"))) (fset (quote cvs-global-menu) m)))
@@ -20238,7 +20569,7 @@ The exact behavior is determined also by `cvs-dired-use-hook'." (when (stringp d
 ;;;***
 \f
 ;;;### (autoloads (perl-mode) "perl-mode" "progmodes/perl-mode.el"
-;;;;;;  (17962 28280))
+;;;;;;  (18104 24768))
 ;;; Generated autoloads from progmodes/perl-mode.el
 
 (autoload (quote perl-mode) "perl-mode" "\
@@ -20296,7 +20627,7 @@ Turning on Perl mode runs the normal hook `perl-mode-hook'.
 ;;;### (autoloads (pgg-snarf-keys pgg-snarf-keys-region pgg-insert-key
 ;;;;;;  pgg-verify pgg-verify-region pgg-sign pgg-sign-region pgg-decrypt
 ;;;;;;  pgg-decrypt-region pgg-encrypt pgg-encrypt-symmetric pgg-encrypt-symmetric-region
-;;;;;;  pgg-encrypt-region) "pgg" "pgg.el" (17842 58279))
+;;;;;;  pgg-encrypt-region) "pgg" "pgg.el" (18104 24738))
 ;;; Generated autoloads from pgg.el
 
 (autoload (quote pgg-encrypt-region) "pgg" "\
@@ -20367,7 +20698,7 @@ If the optional 3rd argument CLEARTEXT is non-nil, it does not create
 a detached signature.
 
 If this function is called interactively, CLEARTEXT is enabled
-and the the output is displayed.
+and the output is displayed.
 
 If optional PASSPHRASE is not specified, it will be obtained from the
 passphrase cache or user.
@@ -20384,7 +20715,7 @@ If optional arguments START and END are specified, only sign data
 within the region.
 
 If this function is called interactively, CLEARTEXT is enabled
-and the the output is displayed.
+and the output is displayed.
 
 If optional PASSPHRASE is not specified, it will be obtained from the
 passphrase cache or user.
@@ -20430,7 +20761,7 @@ Import public keys in the current buffer.
 ;;;***
 \f
 ;;;### (autoloads (pgg-gpg-symmetric-key-p) "pgg-gpg" "pgg-gpg.el"
-;;;;;;  (17887 33207))
+;;;;;;  (18104 24738))
 ;;; Generated autoloads from pgg-gpg.el
 
 (autoload (quote pgg-gpg-symmetric-key-p) "pgg-gpg" "\
@@ -20441,7 +20772,7 @@ True if decoded armor MESSAGE-KEYS has symmetric encryption indicator.
 ;;;***
 \f
 ;;;### (autoloads (picture-mode) "picture" "textmodes/picture.el"
-;;;;;;  (17842 58277))
+;;;;;;  (18104 24772))
 ;;; Generated autoloads from textmodes/picture.el
 
 (autoload (quote picture-mode) "picture" "\
@@ -20522,7 +20853,7 @@ they are not defaultly assigned to keys.
 ;;;***
 \f
 ;;;### (autoloads (po-find-file-coding-system) "po" "textmodes/po.el"
-;;;;;;  (17842 58277))
+;;;;;;  (18104 24772))
 ;;; Generated autoloads from textmodes/po.el
 
 (autoload (quote po-find-file-coding-system) "po" "\
@@ -20533,7 +20864,7 @@ Called through `file-coding-system-alist', before the file is visited for real.
 
 ;;;***
 \f
-;;;### (autoloads (pong) "pong" "play/pong.el" (17842 55395))
+;;;### (autoloads (pong) "pong" "play/pong.el" (18104 24762))
 ;;; Generated autoloads from play/pong.el
 
 (autoload (quote pong) "pong" "\
@@ -20550,7 +20881,7 @@ pong-mode keybindings:\\<pong-mode-map>
 ;;;***
 \f
 ;;;### (autoloads (pp-eval-last-sexp pp-eval-expression pp pp-buffer
-;;;;;;  pp-to-string) "pp" "emacs-lisp/pp.el" (17852 19612))
+;;;;;;  pp-to-string) "pp" "emacs-lisp/pp.el" (18104 24748))
 ;;; Generated autoloads from emacs-lisp/pp.el
 
 (autoload (quote pp-to-string) "pp" "\
@@ -20606,7 +20937,7 @@ Ignores leading comment characters.
 ;;;;;;  pr-ps-buffer-print pr-ps-buffer-using-ghostscript pr-ps-buffer-preview
 ;;;;;;  pr-ps-directory-ps-print pr-ps-directory-print pr-ps-directory-using-ghostscript
 ;;;;;;  pr-ps-directory-preview pr-interface) "printing" "printing.el"
-;;;;;;  (18006 55796))
+;;;;;;  (18104 24738))
 ;;; Generated autoloads from printing.el
 
 (autoload (quote pr-interface) "printing" "\
@@ -21194,7 +21525,7 @@ are both set to t.
 ;;;***
 \f
 ;;;### (autoloads (switch-to-prolog prolog-mode) "prolog" "progmodes/prolog.el"
-;;;;;;  (17842 56332))
+;;;;;;  (18104 24768))
 ;;; Generated autoloads from progmodes/prolog.el
 
 (autoload (quote prolog-mode) "prolog" "\
@@ -21217,7 +21548,7 @@ With prefix argument \\[universal-prefix], prompt for the program to use.
 
 ;;;***
 \f
-;;;### (autoloads nil "ps-bdf" "ps-bdf.el" (17842 58279))
+;;;### (autoloads nil "ps-bdf" "ps-bdf.el" (18104 24739))
 ;;; Generated autoloads from ps-bdf.el
 
 (defvar bdf-directory-list (if (memq system-type (quote (ms-dos windows-nt))) (list (expand-file-name "fonts/bdf" installation-directory)) (quote ("/usr/local/share/emacs/fonts/bdf"))) "\
@@ -21226,8 +21557,8 @@ The default value is '(\"/usr/local/share/emacs/fonts/bdf\").")
 
 ;;;***
 \f
-;;;### (autoloads (ps-mode) "ps-mode" "progmodes/ps-mode.el" (17842
-;;;;;;  56332))
+;;;### (autoloads (ps-mode) "ps-mode" "progmodes/ps-mode.el" (18104
+;;;;;;  24768))
 ;;; Generated autoloads from progmodes/ps-mode.el
 
 (autoload (quote ps-mode) "ps-mode" "\
@@ -21271,125 +21602,6 @@ Typing \\<ps-run-mode-map>\\[ps-run-goto-error] when the cursor is at the number
 
 \(fn)" t nil)
 
-;;;***
-\f
-;;;### (autoloads (ps-mule-begin-page ps-mule-begin-job ps-mule-encode-header-string
-;;;;;;  ps-mule-initialize ps-mule-plot-composition ps-mule-plot-string
-;;;;;;  ps-mule-set-ascii-font ps-mule-prepare-ascii-font ps-multibyte-buffer)
-;;;;;;  "ps-mule" "ps-mule.el" (17842 58279))
-;;; Generated autoloads from ps-mule.el
-
-(defvar ps-multibyte-buffer nil "\
-*Specifies the multi-byte buffer handling.
-
-Valid values are:
-
-  nil                     This is the value to use the default settings which
-                         is by default for printing buffer with only ASCII
-                         and Latin characters.   The default setting can be
-                         changed by setting the variable
-                         `ps-mule-font-info-database-default' differently.
-                         The initial value of this variable is
-                         `ps-mule-font-info-database-latin' (see
-                         documentation).
-
-  `non-latin-printer'     This is the value to use when you have a Japanese
-                         or Korean PostScript printer and want to print
-                         buffer with ASCII, Latin-1, Japanese (JISX0208 and
-                         JISX0201-Kana) and Korean characters.  At present,
-                         it was not tested the Korean characters printing.
-                         If you have a korean PostScript printer, please,
-                         test it.
-
-  `bdf-font'              This is the value to use when you want to print
-                         buffer with BDF fonts.  BDF fonts include both latin
-                         and non-latin fonts.  BDF (Bitmap Distribution
-                         Format) is a format used for distributing X's font
-                         source file.  BDF fonts are included in
-                         `intlfonts-1.2' which is a collection of X11 fonts
-                         for all characters supported by Emacs.  In order to
-                         use this value, be sure to have installed
-                         `intlfonts-1.2' and set the variable
-                         `bdf-directory-list' appropriately (see ps-bdf.el for
-                         documentation of this variable).
-
-  `bdf-font-except-latin' This is like `bdf-font' except that it is used
-                         PostScript default fonts to print ASCII and Latin-1
-                         characters.  This is convenient when you want or
-                         need to use both latin and non-latin characters on
-                         the same buffer.  See `ps-font-family',
-                         `ps-header-font-family' and `ps-font-info-database'.
-
-Any other value is treated as nil.")
-
-(custom-autoload (quote ps-multibyte-buffer) "ps-mule" t)
-
-(autoload (quote ps-mule-prepare-ascii-font) "ps-mule" "\
-Setup special ASCII font for STRING.
-STRING should contain only ASCII characters.
-
-\(fn STRING)" nil nil)
-
-(autoload (quote ps-mule-set-ascii-font) "ps-mule" "\
-Not documented
-
-\(fn)" nil nil)
-
-(autoload (quote ps-mule-plot-string) "ps-mule" "\
-Generate PostScript code for plotting characters in the region FROM and TO.
-
-It is assumed that all characters in this region belong to the same charset.
-
-Optional argument BG-COLOR specifies background color.
-
-Returns the value:
-
-       (ENDPOS . RUN-WIDTH)
-
-Where ENDPOS is the end position of the sequence and RUN-WIDTH is the width of
-the sequence.
-
-\(fn FROM TO &optional BG-COLOR)" nil nil)
-
-(autoload (quote ps-mule-plot-composition) "ps-mule" "\
-Generate PostScript code for plotting composition in the region FROM and TO.
-
-It is assumed that all characters in this region belong to the same
-composition.
-
-Optional argument BG-COLOR specifies background color.
-
-Returns the value:
-
-       (ENDPOS . RUN-WIDTH)
-
-Where ENDPOS is the end position of the sequence and RUN-WIDTH is the width of
-the sequence.
-
-\(fn FROM TO &optional BG-COLOR)" nil nil)
-
-(autoload (quote ps-mule-initialize) "ps-mule" "\
-Initialize global data for printing multi-byte characters.
-
-\(fn)" nil nil)
-
-(autoload (quote ps-mule-encode-header-string) "ps-mule" "\
-Generate PostScript code for ploting STRING by font FONTTAG.
-FONTTAG should be a string \"/h0\" or \"/h1\".
-
-\(fn STRING FONTTAG)" nil nil)
-
-(autoload (quote ps-mule-begin-job) "ps-mule" "\
-Start printing job for multi-byte chars between FROM and TO.
-This checks if all multi-byte characters in the region are printable or not.
-
-\(fn FROM TO)" nil nil)
-
-(autoload (quote ps-mule-begin-page) "ps-mule" "\
-Not documented
-
-\(fn)" nil nil)
-
 ;;;***
 \f
 ;;;### (autoloads (ps-extend-face ps-extend-face-list ps-setup ps-nb-pages-region
@@ -21397,8 +21609,8 @@ Not documented
 ;;;;;;  ps-spool-region ps-spool-buffer-with-faces ps-spool-buffer
 ;;;;;;  ps-print-region-with-faces ps-print-region ps-print-buffer-with-faces
 ;;;;;;  ps-print-buffer ps-print-customize ps-print-color-p ps-paper-type
-;;;;;;  ps-page-dimensions-database) "ps-print" "ps-print.el" (18006
-;;;;;;  55796))
+;;;;;;  ps-page-dimensions-database) "ps-print" "ps-print.el" (18104
+;;;;;;  24739))
 ;;; Generated autoloads from ps-print.el
 
 (defvar ps-page-dimensions-database (list (list (quote a4) (/ (* 72 21.0) 2.54) (/ (* 72 29.7) 2.54) "A4") (list (quote a3) (/ (* 72 29.7) 2.54) (/ (* 72 42.0) 2.54) "A3") (list (quote letter) (* 72 8.5) (* 72 11.0) "Letter") (list (quote legal) (* 72 8.5) (* 72 14.0) "Legal") (list (quote letter-small) (* 72 7.68) (* 72 10.16) "LetterSmall") (list (quote tabloid) (* 72 11.0) (* 72 17.0) "Tabloid") (list (quote ledger) (* 72 17.0) (* 72 11.0) "Ledger") (list (quote statement) (* 72 5.5) (* 72 8.5) "Statement") (list (quote executive) (* 72 7.5) (* 72 10.0) "Executive") (list (quote a4small) (* 72 7.47) (* 72 10.85) "A4Small") (list (quote b4) (* 72 10.125) (* 72 14.33) "B4") (list (quote b5) (* 72 7.16) (* 72 10.125) "B5")) "\
@@ -21595,7 +21807,7 @@ If EXTENSION is any other symbol, it is ignored.
 ;;;***
 \f
 ;;;### (autoloads (jython-mode python-mode run-python) "python" "progmodes/python.el"
-;;;;;;  (17992 30878))
+;;;;;;  (18104 24768))
 ;;; Generated autoloads from progmodes/python.el
 
 (add-to-list (quote interpreter-mode-alist) (quote ("jython" . jython-mode)))
@@ -21670,7 +21882,7 @@ Runs `jython-mode-hook' after `python-mode-hook'.
 ;;;***
 \f
 ;;;### (autoloads (quoted-printable-decode-region) "qp" "gnus/qp.el"
-;;;;;;  (17842 54741))
+;;;;;;  (18104 24754))
 ;;; Generated autoloads from gnus/qp.el
 
 (autoload (quote quoted-printable-decode-region) "qp" "\
@@ -21693,7 +21905,7 @@ them into characters should be done separately.
 ;;;;;;  quail-defrule quail-install-decode-map quail-install-map
 ;;;;;;  quail-define-rules quail-show-keyboard-layout quail-set-keyboard-layout
 ;;;;;;  quail-define-package quail-use-package quail-title) "quail"
-;;;;;;  "international/quail.el" (17921 16827))
+;;;;;;  "international/quail.el" (18104 24757))
 ;;; Generated autoloads from international/quail.el
 
 (autoload (quote quail-title) "quail" "\
@@ -21924,8 +22136,8 @@ of each directory.
 \f
 ;;;### (autoloads (quickurl-list quickurl-list-mode quickurl-edit-urls
 ;;;;;;  quickurl-browse-url-ask quickurl-browse-url quickurl-add-url
-;;;;;;  quickurl-ask quickurl) "quickurl" "net/quickurl.el" (17842
-;;;;;;  55218))
+;;;;;;  quickurl-ask quickurl) "quickurl" "net/quickurl.el" (18104
+;;;;;;  24760))
 ;;; Generated autoloads from net/quickurl.el
 
 (defconst quickurl-reread-hook-postfix "\n;; Local Variables:\n;; eval: (progn (require 'quickurl) (add-hook 'local-write-file-hooks (lambda () (quickurl-read) nil)))\n;; End:\n" "\
@@ -21997,12 +22209,15 @@ Display `quickurl-list' as a formatted list using `quickurl-list-mode'.
 ;;;***
 \f
 ;;;### (autoloads (rcirc-track-minor-mode rcirc-connect rcirc) "rcirc"
-;;;;;;  "net/rcirc.el" (18006 55797))
+;;;;;;  "net/rcirc.el" (18104 24760))
 ;;; Generated autoloads from net/rcirc.el
 
 (autoload (quote rcirc) "rcirc" "\
-Connect to IRC.
-If ARG is non-nil, prompt for a server to connect to.
+Connect to all servers in `rcirc-server-alist'.
+
+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)
 
@@ -22011,7 +22226,7 @@ If ARG is non-nil, prompt for a server to connect to.
 (autoload (quote rcirc-connect) "rcirc" "\
 Not documented
 
-\(fn &optional SERVER PORT NICK USER-NAME FULL-NAME STARTUP-CHANNELS)" nil nil)
+\(fn SERVER &optional PORT NICK USER-NAME FULL-NAME STARTUP-CHANNELS)" nil nil)
 
 (defvar rcirc-track-minor-mode nil "\
 Non-nil if Rcirc-Track minor mode is enabled.
@@ -22029,8 +22244,8 @@ Global minor mode for tracking activity in rcirc buffers.
 
 ;;;***
 \f
-;;;### (autoloads (remote-compile) "rcompile" "net/rcompile.el" (17842
-;;;;;;  55218))
+;;;### (autoloads (remote-compile) "rcompile" "net/rcompile.el" (18104
+;;;;;;  24760))
 ;;; Generated autoloads from net/rcompile.el
 
 (autoload (quote remote-compile) "rcompile" "\
@@ -22042,7 +22257,7 @@ See \\[compile].
 ;;;***
 \f
 ;;;### (autoloads (re-builder) "re-builder" "emacs-lisp/re-builder.el"
-;;;;;;  (17917 37732))
+;;;;;;  (18104 24748))
 ;;; Generated autoloads from emacs-lisp/re-builder.el
 
 (defalias (quote regexp-builder) (quote re-builder))
@@ -22054,7 +22269,7 @@ Construct a regexp interactively.
 
 ;;;***
 \f
-;;;### (autoloads (recentf-mode) "recentf" "recentf.el" (17930 34071))
+;;;### (autoloads (recentf-mode) "recentf" "recentf.el" (18104 24739))
 ;;; Generated autoloads from recentf.el
 
 (defvar recentf-mode nil "\
@@ -22081,8 +22296,8 @@ that were operated on recently.
 ;;;### (autoloads (clear-rectangle string-insert-rectangle string-rectangle
 ;;;;;;  delete-whitespace-rectangle open-rectangle insert-rectangle
 ;;;;;;  yank-rectangle kill-rectangle extract-rectangle delete-extract-rectangle
-;;;;;;  delete-rectangle move-to-column-force) "rect" "rect.el" (17842
-;;;;;;  58279))
+;;;;;;  delete-rectangle move-to-column-force) "rect" "rect.el" (18104
+;;;;;;  24739))
 ;;; Generated autoloads from rect.el
 
 (autoload (quote move-to-column-force) "rect" "\
@@ -22210,8 +22425,8 @@ rectangle which were empty.
 
 ;;;***
 \f
-;;;### (autoloads (refill-mode) "refill" "textmodes/refill.el" (17842
-;;;;;;  58277))
+;;;### (autoloads (refill-mode) "refill" "textmodes/refill.el" (18104
+;;;;;;  24772))
 ;;; Generated autoloads from textmodes/refill.el
 
 (autoload (quote refill-mode) "refill" "\
@@ -22227,7 +22442,7 @@ refilling if they would cause auto-filling.
 ;;;***
 \f
 ;;;### (autoloads (reftex-reset-scanning-information reftex-mode
-;;;;;;  turn-on-reftex) "reftex" "textmodes/reftex.el" (17923 8784))
+;;;;;;  turn-on-reftex) "reftex" "textmodes/reftex.el" (18104 24772))
 ;;; Generated autoloads from textmodes/reftex.el
 
 (autoload (quote turn-on-reftex) "reftex" "\
@@ -22277,7 +22492,7 @@ This enforces rescanning the buffer on next use.
 ;;;***
 \f
 ;;;### (autoloads (reftex-citation) "reftex-cite" "textmodes/reftex-cite.el"
-;;;;;;  (17923 8784))
+;;;;;;  (18104 24772))
 ;;; Generated autoloads from textmodes/reftex-cite.el
 
 (autoload (quote reftex-citation) "reftex-cite" "\
@@ -22307,7 +22522,7 @@ While entering the regexp, completion on knows citation keys is possible.
 ;;;***
 \f
 ;;;### (autoloads (reftex-isearch-minor-mode) "reftex-global" "textmodes/reftex-global.el"
-;;;;;;  (17923 8784))
+;;;;;;  (18104 24772))
 ;;; Generated autoloads from textmodes/reftex-global.el
 
 (autoload (quote reftex-isearch-minor-mode) "reftex-global" "\
@@ -22324,7 +22539,7 @@ With no argument, this command toggles
 ;;;***
 \f
 ;;;### (autoloads (reftex-index-phrases-mode) "reftex-index" "textmodes/reftex-index.el"
-;;;;;;  (17923 8784))
+;;;;;;  (18104 24772))
 ;;; Generated autoloads from textmodes/reftex-index.el
 
 (autoload (quote reftex-index-phrases-mode) "reftex-index" "\
@@ -22357,7 +22572,7 @@ Here are all local bindings.
 ;;;***
 \f
 ;;;### (autoloads (reftex-all-document-files) "reftex-parse" "textmodes/reftex-parse.el"
-;;;;;;  (17923 8784))
+;;;;;;  (18104 24772))
 ;;; Generated autoloads from textmodes/reftex-parse.el
 
 (autoload (quote reftex-all-document-files) "reftex-parse" "\
@@ -22369,8 +22584,8 @@ of master file.
 
 ;;;***
 \f
-;;;### (autoloads nil "reftex-vars" "textmodes/reftex-vars.el" (17923
-;;;;;;  8784))
+;;;### (autoloads nil "reftex-vars" "textmodes/reftex-vars.el" (18104
+;;;;;;  24772))
 ;;; Generated autoloads from textmodes/reftex-vars.el
 (put 'reftex-vref-is-default 'safe-local-variable (lambda (x) (or (stringp x) (symbolp x))))
 (put 'reftex-fref-is-default 'safe-local-variable (lambda (x) (or (stringp x) (symbolp x))))
@@ -22380,7 +22595,7 @@ of master file.
 ;;;***
 \f
 ;;;### (autoloads (regexp-opt-depth regexp-opt) "regexp-opt" "emacs-lisp/regexp-opt.el"
-;;;;;;  (17842 54152))
+;;;;;;  (18104 24748))
 ;;; Generated autoloads from emacs-lisp/regexp-opt.el
 
 (autoload (quote regexp-opt) "regexp-opt" "\
@@ -22407,7 +22622,7 @@ This means the number of non-shy regexp grouping constructs
 
 ;;;***
 \f
-;;;### (autoloads (repeat) "repeat" "repeat.el" (17842 58279))
+;;;### (autoloads (repeat) "repeat" "repeat.el" (18104 24739))
 ;;; Generated autoloads from repeat.el
 
 (autoload (quote repeat) "repeat" "\
@@ -22425,7 +22640,7 @@ can be modified by the global variable `repeat-on-final-keystroke'.
 ;;;***
 \f
 ;;;### (autoloads (reporter-submit-bug-report) "reporter" "mail/reporter.el"
-;;;;;;  (17842 55035))
+;;;;;;  (18104 24758))
 ;;; Generated autoloads from mail/reporter.el
 
 (autoload (quote reporter-submit-bug-report) "reporter" "\
@@ -22457,7 +22672,7 @@ mail-sending package is used for editing and sending the message.
 ;;;***
 \f
 ;;;### (autoloads (reposition-window) "reposition" "reposition.el"
-;;;;;;  (17842 58279))
+;;;;;;  (18104 24739))
 ;;; Generated autoloads from reposition.el
 
 (autoload (quote reposition-window) "reposition" "\
@@ -22484,8 +22699,8 @@ first comment line visible (if point is in a comment).
 
 ;;;***
 \f
-;;;### (autoloads (resume-suspend-hook) "resume" "resume.el" (17842
-;;;;;;  58279))
+;;;### (autoloads (resume-suspend-hook) "resume" "resume.el" (18104
+;;;;;;  24739))
 ;;; Generated autoloads from resume.el
 
 (autoload (quote resume-suspend-hook) "resume" "\
@@ -22496,7 +22711,7 @@ Clear out the file used for transmitting args when Emacs resumes.
 ;;;***
 \f
 ;;;### (autoloads (global-reveal-mode reveal-mode) "reveal" "reveal.el"
-;;;;;;  (17842 58279))
+;;;;;;  (18104 24739))
 ;;; Generated autoloads from reveal.el
 
 (autoload (quote reveal-mode) "reveal" "\
@@ -22531,7 +22746,7 @@ With zero or negative ARG turn mode off.
 ;;;***
 \f
 ;;;### (autoloads (make-ring ring-p) "ring" "emacs-lisp/ring.el"
-;;;;;;  (17842 54152))
+;;;;;;  (18104 24748))
 ;;; Generated autoloads from emacs-lisp/ring.el
 
 (autoload (quote ring-p) "ring" "\
@@ -22546,7 +22761,7 @@ Make a ring that can contain SIZE elements.
 
 ;;;***
 \f
-;;;### (autoloads (rlogin) "rlogin" "net/rlogin.el" (17842 55218))
+;;;### (autoloads (rlogin) "rlogin" "net/rlogin.el" (18104 24760))
 ;;; Generated autoloads from net/rlogin.el
  (add-hook 'same-window-regexps "^\\*rlogin-.*\\*\\(\\|<[0-9]+>\\)")
 
@@ -22597,8 +22812,8 @@ variable.
 ;;;;;;  rmail-mail-new-frame rmail-primary-inbox-list rmail-delete-after-output
 ;;;;;;  rmail-highlight-face rmail-highlighted-headers rmail-retry-ignored-headers
 ;;;;;;  rmail-displayed-headers rmail-ignored-headers rmail-dont-reply-to-names
-;;;;;;  rmail-movemail-variant-p) "rmail" "mail/rmail.el" (18006
-;;;;;;  55797))
+;;;;;;  rmail-movemail-variant-p) "rmail" "mail/rmail.el" (18104
+;;;;;;  24758))
 ;;; Generated autoloads from mail/rmail.el
 
 (autoload (quote rmail-movemail-variant-p) "rmail" "\
@@ -22863,7 +23078,7 @@ Set PASSWORD to be used for retrieving mail from a POP or IMAP server.
 ;;;***
 \f
 ;;;### (autoloads (rmail-edit-current-message) "rmailedit" "mail/rmailedit.el"
-;;;;;;  (17887 18399))
+;;;;;;  (18104 24758))
 ;;; Generated autoloads from mail/rmailedit.el
 
 (autoload (quote rmail-edit-current-message) "rmailedit" "\
@@ -22875,7 +23090,7 @@ Edit the contents of this message.
 \f
 ;;;### (autoloads (rmail-next-labeled-message rmail-previous-labeled-message
 ;;;;;;  rmail-read-label rmail-kill-label rmail-add-label) "rmailkwd"
-;;;;;;  "mail/rmailkwd.el" (17842 55035))
+;;;;;;  "mail/rmailkwd.el" (18104 24758))
 ;;; Generated autoloads from mail/rmailkwd.el
 
 (autoload (quote rmail-add-label) "rmailkwd" "\
@@ -22914,7 +23129,7 @@ With prefix argument N moves forward N messages with these labels.
 ;;;***
 \f
 ;;;### (autoloads (set-rmail-inbox-list) "rmailmsc" "mail/rmailmsc.el"
-;;;;;;  (17842 55035))
+;;;;;;  (18104 24758))
 ;;; Generated autoloads from mail/rmailmsc.el
 
 (autoload (quote set-rmail-inbox-list) "rmailmsc" "\
@@ -22928,7 +23143,7 @@ If FILE-NAME is empty, remove any existing inbox list.
 \f
 ;;;### (autoloads (rmail-output-body-to-file rmail-output rmail-fields-not-to-output
 ;;;;;;  rmail-output-to-rmail-file rmail-output-file-alist) "rmailout"
-;;;;;;  "mail/rmailout.el" (17842 55035))
+;;;;;;  "mail/rmailout.el" (18104 24758))
 ;;; Generated autoloads from mail/rmailout.el
 
 (defvar rmail-output-file-alist nil "\
@@ -22995,8 +23210,8 @@ FILE-NAME defaults, interactively, from the Subject field of the message.
 \f
 ;;;### (autoloads (rmail-sort-by-labels rmail-sort-by-lines rmail-sort-by-correspondent
 ;;;;;;  rmail-sort-by-recipient rmail-sort-by-author rmail-sort-by-subject
-;;;;;;  rmail-sort-by-date) "rmailsort" "mail/rmailsort.el" (17842
-;;;;;;  55035))
+;;;;;;  rmail-sort-by-date) "rmailsort" "mail/rmailsort.el" (18104
+;;;;;;  24758))
 ;;; Generated autoloads from mail/rmailsort.el
 
 (autoload (quote rmail-sort-by-date) "rmailsort" "\
@@ -23048,7 +23263,7 @@ KEYWORDS is a comma-separated list of labels.
 ;;;;;;  rmail-summary-by-senders rmail-summary-by-topic rmail-summary-by-regexp
 ;;;;;;  rmail-summary-by-recipients rmail-summary-by-labels rmail-summary
 ;;;;;;  rmail-summary-line-count-flag rmail-summary-scroll-between-messages)
-;;;;;;  "rmailsum" "mail/rmailsum.el" (17842 55035))
+;;;;;;  "rmailsum" "mail/rmailsum.el" (18104 24758))
 ;;; Generated autoloads from mail/rmailsum.el
 
 (defvar rmail-summary-scroll-between-messages t "\
@@ -23127,10 +23342,23 @@ Setting this variable has an effect only before reading a mail.")
 
 (custom-autoload (quote rmail-user-mail-address-regexp) "rmailsum" t)
 
+;;;***
+\f
+;;;### (autoloads (news-post-news) "rnewspost" "obsolete/rnewspost.el"
+;;;;;;  (18104 24760))
+;;; Generated autoloads from obsolete/rnewspost.el
+
+(autoload (quote news-post-news) "rnewspost" "\
+Begin editing a new USENET news article to be posted.
+Type \\[describe-mode] once editing the article to get a list of commands.
+If NOQUERY is non-nil, we do not query before doing the work.
+
+\(fn &optional NOQUERY)" t nil)
+
 ;;;***
 \f
 ;;;### (autoloads (toggle-rot13-mode rot13-other-window rot13-region
-;;;;;;  rot13-string rot13) "rot13" "rot13.el" (17842 58279))
+;;;;;;  rot13-string rot13) "rot13" "rot13.el" (18104 24739))
 ;;; Generated autoloads from rot13.el
 
 (autoload (quote rot13) "rot13" "\
@@ -23167,8 +23395,8 @@ Toggle the use of ROT13 encoding for the current window.
 
 ;;;***
 \f
-;;;### (autoloads (ruler-mode) "ruler-mode" "ruler-mode.el" (17833
-;;;;;;  43069))
+;;;### (autoloads (ruler-mode) "ruler-mode" "ruler-mode.el" (18104
+;;;;;;  24739))
 ;;; Generated autoloads from ruler-mode.el
 
 (autoload (quote ruler-mode) "ruler-mode" "\
@@ -23178,8 +23406,8 @@ Display a ruler in the header line if ARG > 0.
 
 ;;;***
 \f
-;;;### (autoloads (rx rx-to-string) "rx" "emacs-lisp/rx.el" (18011
-;;;;;;  44080))
+;;;### (autoloads (rx rx-to-string) "rx" "emacs-lisp/rx.el" (18104
+;;;;;;  24748))
 ;;; Generated autoloads from emacs-lisp/rx.el
 
 (autoload (quote rx-to-string) "rx" "\
@@ -23492,7 +23720,7 @@ enclosed in `(and ...)'.
 ;;;***
 \f
 ;;;### (autoloads (savehist-mode savehist-mode) "savehist" "savehist.el"
-;;;;;;  (17842 58279))
+;;;;;;  (18104 24739))
 ;;; Generated autoloads from savehist.el
 
 (defvar savehist-mode nil "\
@@ -23518,7 +23746,7 @@ which is probably undesirable.
 ;;;***
 \f
 ;;;### (autoloads (dsssl-mode scheme-mode) "scheme" "progmodes/scheme.el"
-;;;;;;  (17842 56332))
+;;;;;;  (18104 24768))
 ;;; Generated autoloads from progmodes/scheme.el
 
 (autoload (quote scheme-mode) "scheme" "\
@@ -23560,7 +23788,7 @@ that variable's value is a string.
 ;;;***
 \f
 ;;;### (autoloads (gnus-score-mode) "score-mode" "gnus/score-mode.el"
-;;;;;;  (17842 54741))
+;;;;;;  (18104 24755))
 ;;; Generated autoloads from gnus/score-mode.el
 
 (autoload (quote gnus-score-mode) "score-mode" "\
@@ -23571,10 +23799,35 @@ This mode is an extended emacs-lisp mode.
 
 \(fn)" t nil)
 
+;;;***
+\f
+;;;### (autoloads (scribe-mode) "scribe" "obsolete/scribe.el" (18104
+;;;;;;  24760))
+;;; Generated autoloads from obsolete/scribe.el
+
+(autoload (quote scribe-mode) "scribe" "\
+Major mode for editing files of Scribe (a text formatter) source.
+Scribe-mode is similar to text-mode, with a few extra commands added.
+\\{scribe-mode-map}
+
+Interesting variables:
+
+`scribe-fancy-paragraphs'
+  Non-nil makes Scribe mode use a different style of paragraph separation.
+
+`scribe-electric-quote'
+  Non-nil makes insert of double quote use `` or '' depending on context.
+
+`scribe-electric-parenthesis'
+  Non-nil makes an open-parenthesis char (one of `([<{')
+  automatically insert its close if typed after an @Command form.
+
+\(fn)" t nil)
+
 ;;;***
 \f
 ;;;### (autoloads (scroll-all-mode) "scroll-all" "scroll-all.el"
-;;;;;;  (17842 58278))
+;;;;;;  (18104 24739))
 ;;; Generated autoloads from scroll-all.el
 
 (defvar scroll-all-mode nil "\
@@ -23597,11 +23850,11 @@ apply to all visible windows in the same frame.
 ;;;***
 \f
 ;;;### (autoloads (scroll-lock-mode) "scroll-lock" "scroll-lock.el"
-;;;;;;  (17842 58278))
+;;;;;;  (18104 24739))
 ;;; Generated autoloads from scroll-lock.el
 
 (autoload (quote scroll-lock-mode) "scroll-lock" "\
-Minor mode for pager-like scrolling.
+Buffer-local minor mode for pager-like scrolling.
 Keys which normally move point by line or paragraph will scroll
 the buffer by the respective amount of lines instead and point
 will be kept vertically fixed relative to window boundaries
@@ -23619,7 +23872,7 @@ during scrolling.
 ;;;;;;  mail-alias-file mail-default-reply-to mail-archive-file-name
 ;;;;;;  mail-header-separator send-mail-function mail-interactive
 ;;;;;;  mail-self-blind mail-specify-envelope-from mail-from-style)
-;;;;;;  "sendmail" "mail/sendmail.el" (17942 63381))
+;;;;;;  "sendmail" "mail/sendmail.el" (18104 24758))
 ;;; Generated autoloads from mail/sendmail.el
 
 (defvar mail-from-style (quote angles) "\
@@ -23919,15 +24172,15 @@ Like `mail' command, but display mail buffer in another frame.
 
 ;;;***
 \f
-;;;### (autoloads (server-mode server-start) "server" "server.el"
-;;;;;;  (17921 16827))
+;;;### (autoloads (server-save-buffers-kill-terminal server-mode
+;;;;;;  server-start) "server" "server.el" (18104 24739))
 ;;; Generated autoloads from server.el
 
 (autoload (quote server-start) "server" "\
 Allow this Emacs process to be a server for client processes.
 This starts a server communications subprocess through which
-client \"editors\" can send your editing commands to this Emacs job.
-To use the server, set up the program `emacsclient' in the
+client \"editors\" can send your editing commands to this Emacs
+job.  To use the server, set up the program `emacsclient' in the
 Emacs distribution as your standard \"editor\".
 
 Optional argument LEAVE-DEAD (interactively, a prefix arg) means just
@@ -23952,9 +24205,19 @@ Server mode runs a process that accepts commands from the
 
 \(fn &optional ARG)" t nil)
 
+(autoload (quote server-save-buffers-kill-terminal) "server" "\
+Offer to save each buffer, then kill PROC.
+
+With prefix arg, 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 PROC &optional ARG)" nil nil)
+
 ;;;***
 \f
-;;;### (autoloads (ses-mode) "ses" "ses.el" (17902 31690))
+;;;### (autoloads (ses-mode) "ses" "ses.el" (18104 24739))
 ;;; Generated autoloads from ses.el
 
 (autoload (quote ses-mode) "ses" "\
@@ -23973,7 +24236,7 @@ These are active only in the minibuffer, when entering or editing a formula:
 ;;;***
 \f
 ;;;### (autoloads (html-mode sgml-mode) "sgml-mode" "textmodes/sgml-mode.el"
-;;;;;;  (18010 58080))
+;;;;;;  (18104 24772))
 ;;; Generated autoloads from textmodes/sgml-mode.el
 
 (autoload (quote sgml-mode) "sgml-mode" "\
@@ -24041,7 +24304,7 @@ To work around that, do:
 ;;;***
 \f
 ;;;### (autoloads (sh-mode) "sh-script" "progmodes/sh-script.el"
-;;;;;;  (17992 30878))
+;;;;;;  (18104 24768))
 ;;; Generated autoloads from progmodes/sh-script.el
 (put 'sh-shell 'safe-local-variable 'symbolp)
 
@@ -24105,7 +24368,7 @@ with your script for an edit-interpret-debug cycle.
 
 ;;;***
 \f
-;;;### (autoloads (sha1) "sha1" "gnus/sha1.el" (17842 54741))
+;;;### (autoloads (sha1) "sha1" "gnus/sha1.el" (18104 24755))
 ;;; Generated autoloads from gnus/sha1.el
 
 (autoload (quote sha1) "sha1" "\
@@ -24120,7 +24383,7 @@ If BINARY is non-nil, return a string in binary form.
 ;;;***
 \f
 ;;;### (autoloads (list-load-path-shadows) "shadow" "emacs-lisp/shadow.el"
-;;;;;;  (17853 57352))
+;;;;;;  (18104 24748))
 ;;; Generated autoloads from emacs-lisp/shadow.el
 
 (autoload (quote list-load-path-shadows) "shadow" "\
@@ -24167,8 +24430,8 @@ buffer called `*Shadows*'.  Shadowings are located by calling the
 ;;;***
 \f
 ;;;### (autoloads (shadow-initialize shadow-define-regexp-group shadow-define-literal-group
-;;;;;;  shadow-define-cluster) "shadowfile" "shadowfile.el" (17842
-;;;;;;  58278))
+;;;;;;  shadow-define-cluster) "shadowfile" "shadowfile.el" (18104
+;;;;;;  24739))
 ;;; Generated autoloads from shadowfile.el
 
 (autoload (quote shadow-define-cluster) "shadowfile" "\
@@ -24207,7 +24470,7 @@ Set up file shadowing.
 ;;;***
 \f
 ;;;### (autoloads (shell shell-dumb-shell-regexp) "shell" "shell.el"
-;;;;;;  (17899 1575))
+;;;;;;  (18104 24739))
 ;;; Generated autoloads from shell.el
 
 (defvar shell-dumb-shell-regexp "cmd\\(proxy\\)?\\.exe" "\
@@ -24254,7 +24517,7 @@ Otherwise, one argument `-i' is passed to the shell.
 ;;;***
 \f
 ;;;### (autoloads (sieve-upload-and-bury sieve-upload sieve-manage)
-;;;;;;  "sieve" "gnus/sieve.el" (17842 54741))
+;;;;;;  "sieve" "gnus/sieve.el" (18104 24755))
 ;;; Generated autoloads from gnus/sieve.el
 
 (autoload (quote sieve-manage) "sieve" "\
@@ -24275,7 +24538,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (sieve-mode) "sieve-mode" "gnus/sieve-mode.el"
-;;;;;;  (17842 54741))
+;;;;;;  (18104 24755))
 ;;; Generated autoloads from gnus/sieve-mode.el
 
 (autoload (quote sieve-mode) "sieve-mode" "\
@@ -24290,14 +24553,14 @@ Turning on Sieve mode runs `sieve-mode-hook'.
 
 ;;;***
 \f
-;;;### (autoloads nil "simple" "simple.el" (18009 38727))
+;;;### (autoloads nil "simple" "simple.el" (18104 24740))
 ;;; Generated autoloads from simple.el
 (put 'fill-prefix 'safe-local-variable 'string-or-null-p)
 
 ;;;***
 \f
-;;;### (autoloads (simula-mode) "simula" "progmodes/simula.el" (17842
-;;;;;;  56332))
+;;;### (autoloads (simula-mode) "simula" "progmodes/simula.el" (18104
+;;;;;;  24769))
 ;;; Generated autoloads from progmodes/simula.el
 
 (autoload (quote simula-mode) "simula" "\
@@ -24346,7 +24609,7 @@ with no arguments, if that value is non-nil.
 ;;;***
 \f
 ;;;### (autoloads (skeleton-pair-insert-maybe skeleton-insert skeleton-proxy-new
-;;;;;;  define-skeleton) "skeleton" "skeleton.el" (17842 58278))
+;;;;;;  define-skeleton) "skeleton" "skeleton.el" (18104 24740))
 ;;; Generated autoloads from skeleton.el
 
 (defvar skeleton-filter-function (quote identity) "\
@@ -24456,7 +24719,7 @@ symmetrical ones, and the same character twice for the others.
 ;;;***
 \f
 ;;;### (autoloads (smerge-mode smerge-ediff) "smerge-mode" "smerge-mode.el"
-;;;;;;  (17904 28230))
+;;;;;;  (18104 24740))
 ;;; Generated autoloads from smerge-mode.el
 
 (autoload (quote smerge-ediff) "smerge-mode" "\
@@ -24475,7 +24738,7 @@ Minor mode to simplify editing output from the diff3 program.
 ;;;***
 \f
 ;;;### (autoloads (smiley-buffer smiley-region) "smiley" "gnus/smiley.el"
-;;;;;;  (17875 18370))
+;;;;;;  (18104 24755))
 ;;; Generated autoloads from gnus/smiley.el
 
 (autoload (quote smiley-region) "smiley" "\
@@ -24493,7 +24756,7 @@ interactively. If there's no argument, do it at the current buffer
 ;;;***
 \f
 ;;;### (autoloads (smtpmail-send-queued-mail smtpmail-send-it) "smtpmail"
-;;;;;;  "mail/smtpmail.el" (17939 50716))
+;;;;;;  "mail/smtpmail.el" (18104 24758))
 ;;; Generated autoloads from mail/smtpmail.el
 
 (autoload (quote smtpmail-send-it) "smtpmail" "\
@@ -24508,7 +24771,7 @@ Send mail that was queued as a result of setting `smtpmail-queue-mail'.
 
 ;;;***
 \f
-;;;### (autoloads (snake) "snake" "play/snake.el" (17842 55395))
+;;;### (autoloads (snake) "snake" "play/snake.el" (18104 24762))
 ;;; Generated autoloads from play/snake.el
 
 (autoload (quote snake) "snake" "\
@@ -24532,7 +24795,7 @@ Snake mode keybindings:
 ;;;***
 \f
 ;;;### (autoloads (snmpv2-mode snmp-mode) "snmp-mode" "net/snmp-mode.el"
-;;;;;;  (17842 55218))
+;;;;;;  (18104 24760))
 ;;; Generated autoloads from net/snmp-mode.el
 
 (autoload (quote snmp-mode) "snmp-mode" "\
@@ -24563,7 +24826,7 @@ then `snmpv2-mode-hook'.
 \f
 ;;;### (autoloads (solar-equinoxes-solstices sunrise-sunset calendar-location-name
 ;;;;;;  calendar-longitude calendar-latitude calendar-time-display-form)
-;;;;;;  "solar" "calendar/solar.el" (17956 13479))
+;;;;;;  "solar" "calendar/solar.el" (18104 24745))
 ;;; Generated autoloads from calendar/solar.el
 
 (defvar calendar-time-display-form (quote (12-hours ":" minutes am-pm (if time-zone " (") time-zone (if time-zone ")"))) "\
@@ -24634,8 +24897,8 @@ Requires floating point.
 
 ;;;***
 \f
-;;;### (autoloads (solitaire) "solitaire" "play/solitaire.el" (17842
-;;;;;;  55395))
+;;;### (autoloads (solitaire) "solitaire" "play/solitaire.el" (18104
+;;;;;;  24762))
 ;;; Generated autoloads from play/solitaire.el
 
 (autoload (quote solitaire) "solitaire" "\
@@ -24712,7 +24975,7 @@ Pick your favourite shortcuts:
 \f
 ;;;### (autoloads (reverse-region sort-columns sort-regexp-fields
 ;;;;;;  sort-fields sort-numeric-fields sort-pages sort-paragraphs
-;;;;;;  sort-lines sort-subr) "sort" "sort.el" (17842 58278))
+;;;;;;  sort-lines sort-subr) "sort" "sort.el" (18104 24740))
 ;;; Generated autoloads from sort.el
 
 (autoload (quote sort-subr) "sort" "\
@@ -24854,8 +25117,8 @@ From a program takes two point or marker arguments, BEG and END.
 
 ;;;***
 \f
-;;;### (autoloads (spam-initialize) "spam" "gnus/spam.el" (17842
-;;;;;;  54741))
+;;;### (autoloads (spam-initialize) "spam" "gnus/spam.el" (18104
+;;;;;;  24755))
 ;;; Generated autoloads from gnus/spam.el
 
 (autoload (quote spam-initialize) "spam" "\
@@ -24867,7 +25130,7 @@ Install the spam.el hooks and do other initialization
 \f
 ;;;### (autoloads (spam-report-deagentize spam-report-agentize spam-report-url-to-file
 ;;;;;;  spam-report-url-ping-mm-url spam-report-process-queue) "spam-report"
-;;;;;;  "gnus/spam-report.el" (17842 54741))
+;;;;;;  "gnus/spam-report.el" (18104 24755))
 ;;; Generated autoloads from gnus/spam-report.el
 
 (autoload (quote spam-report-process-queue) "spam-report" "\
@@ -24910,7 +25173,7 @@ Spam reports will be queued with the method used when
 ;;;***
 \f
 ;;;### (autoloads (speedbar-get-focus speedbar-frame-mode) "speedbar"
-;;;;;;  "speedbar.el" (17881 43027))
+;;;;;;  "speedbar.el" (18104 24740))
 ;;; Generated autoloads from speedbar.el
 
 (defalias (quote speedbar) (quote speedbar-frame-mode))
@@ -24935,7 +25198,7 @@ selected.  If the speedbar frame is active, then select the attached frame.
 ;;;***
 \f
 ;;;### (autoloads (spell-string spell-region spell-word spell-buffer)
-;;;;;;  "spell" "textmodes/spell.el" (17842 58276))
+;;;;;;  "spell" "textmodes/spell.el" (18104 24772))
 ;;; Generated autoloads from textmodes/spell.el
 
 (put (quote spell-filter) (quote risky-local-variable) t)
@@ -24971,8 +25234,8 @@ Check spelling of string supplied as argument.
 
 ;;;***
 \f
-;;;### (autoloads (snarf-spooks spook) "spook" "play/spook.el" (17842
-;;;;;;  55395))
+;;;### (autoloads (snarf-spooks spook) "spook" "play/spook.el" (18104
+;;;;;;  24762))
 ;;; Generated autoloads from play/spook.el
 
 (autoload (quote spook) "spook" "\
@@ -24990,8 +25253,8 @@ Return a vector containing the lines from `spook-phrases-file'.
 ;;;### (autoloads (sql-linter sql-db2 sql-interbase sql-postgres
 ;;;;;;  sql-ms sql-ingres sql-solid sql-mysql sql-sqlite sql-informix
 ;;;;;;  sql-sybase sql-oracle sql-product-interactive sql-mode sql-help
-;;;;;;  sql-add-product-keywords) "sql" "progmodes/sql.el" (17842
-;;;;;;  56332))
+;;;;;;  sql-add-product-keywords) "sql" "progmodes/sql.el" (18104
+;;;;;;  24769))
 ;;; Generated autoloads from progmodes/sql.el
 
 (autoload (quote sql-add-product-keywords) "sql" "\
@@ -25422,8 +25685,8 @@ input.  See `sql-interactive-mode'.
 ;;;;;;  strokes-mode strokes-list-strokes strokes-load-user-strokes
 ;;;;;;  strokes-help strokes-describe-stroke strokes-do-complex-stroke
 ;;;;;;  strokes-do-stroke strokes-read-complex-stroke strokes-read-stroke
-;;;;;;  strokes-global-set-stroke) "strokes" "strokes.el" (17842
-;;;;;;  58278))
+;;;;;;  strokes-global-set-stroke) "strokes" "strokes.el" (18104
+;;;;;;  24740))
 ;;; Generated autoloads from strokes.el
 
 (autoload (quote strokes-global-set-stroke) "strokes" "\
@@ -25533,7 +25796,7 @@ Read a complex stroke and insert its glyph into the current buffer.
 ;;;***
 \f
 ;;;### (autoloads (studlify-buffer studlify-word studlify-region)
-;;;;;;  "studly" "play/studly.el" (16211 27038))
+;;;;;;  "studly" "play/studly.el" (17994 6715))
 ;;; Generated autoloads from play/studly.el
 
 (autoload (quote studlify-region) "studly" "\
@@ -25553,7 +25816,7 @@ Studlify-case the current buffer.
 
 ;;;***
 \f
-;;;### (autoloads (locate-library) "subr" "subr.el" (17964 48351))
+;;;### (autoloads (locate-library) "subr" "subr.el" (18104 24740))
 ;;; Generated autoloads from subr.el
 
 (autoload (quote locate-library) "subr" "\
@@ -25575,7 +25838,7 @@ and the file name is displayed in the echo area.
 ;;;***
 \f
 ;;;### (autoloads (sc-cite-original) "supercite" "mail/supercite.el"
-;;;;;;  (17854 7564))
+;;;;;;  (18104 24758))
 ;;; Generated autoloads from mail/supercite.el
 
 (autoload (quote sc-cite-original) "supercite" "\
@@ -25607,7 +25870,7 @@ before, and `sc-post-hook' is run after the guts of this function.
 
 ;;;***
 \f
-;;;### (autoloads (t-mouse-mode) "t-mouse" "t-mouse.el" (18006 55796))
+;;;### (autoloads (t-mouse-mode) "t-mouse" "t-mouse.el" (18104 24740))
 ;;; Generated autoloads from t-mouse.el
 
 (defvar t-mouse-mode nil "\
@@ -25631,7 +25894,7 @@ It requires the `mev' program, part of the `gpm' utilities.
 
 ;;;***
 \f
-;;;### (autoloads (tabify untabify) "tabify" "tabify.el" (17842 58278))
+;;;### (autoloads (tabify untabify) "tabify" "tabify.el" (18104 24740))
 ;;; Generated autoloads from tabify.el
 
 (autoload (quote untabify) "tabify" "\
@@ -25666,7 +25929,7 @@ The variable `tab-width' controls the spacing of tab stops.
 ;;;;;;  table-recognize table-insert-row-column table-insert-column
 ;;;;;;  table-insert-row table-insert table-point-left-cell-hook
 ;;;;;;  table-point-entered-cell-hook table-load-hook table-cell-map-hook)
-;;;;;;  "table" "textmodes/table.el" (18012 17784))
+;;;;;;  "table" "textmodes/table.el" (18104 24772))
 ;;; Generated autoloads from textmodes/table.el
 
 (defvar table-cell-map-hook nil "\
@@ -26254,7 +26517,7 @@ converts a table into plain text without frames.  It is a companion to
 
 ;;;***
 \f
-;;;### (autoloads (talk-connect) "talk" "talk.el" (17842 58278))
+;;;### (autoloads (talk talk-connect) "talk" "talk.el" (18104 24740))
 ;;; Generated autoloads from talk.el
 
 (autoload (quote talk-connect) "talk" "\
@@ -26262,9 +26525,14 @@ Connect to display DISPLAY for the Emacs talk group.
 
 \(fn DISPLAY)" t nil)
 
+(autoload (quote talk) "talk" "\
+Connect to the Emacs talk group from the current X display or tty frame.
+
+\(fn)" t nil)
+
 ;;;***
 \f
-;;;### (autoloads (tar-mode) "tar-mode" "tar-mode.el" (18010 5426))
+;;;### (autoloads (tar-mode) "tar-mode" "tar-mode.el" (18104 24740))
 ;;; Generated autoloads from tar-mode.el
 
 (autoload (quote tar-mode) "tar-mode" "\
@@ -26288,7 +26556,7 @@ See also: variables `tar-update-datestamp' and `tar-anal-blocksize'.
 ;;;***
 \f
 ;;;### (autoloads (tcl-help-on-word inferior-tcl tcl-mode) "tcl"
-;;;;;;  "progmodes/tcl.el" (17842 56332))
+;;;;;;  "progmodes/tcl.el" (18104 24769))
 ;;; Generated autoloads from progmodes/tcl.el
 
 (autoload (quote tcl-mode) "tcl" "\
@@ -26339,7 +26607,7 @@ Prefix argument means invert sense of `tcl-use-smart-word-finder'.
 
 ;;;***
 \f
-;;;### (autoloads (rsh telnet) "telnet" "net/telnet.el" (17842 55218))
+;;;### (autoloads (rsh telnet) "telnet" "net/telnet.el" (18104 24760))
 ;;; Generated autoloads from net/telnet.el
  (add-hook 'same-window-regexps "\\*telnet-.*\\*\\(\\|<[0-9]+>\\)")
 
@@ -26366,8 +26634,8 @@ Normally input is edited in Emacs and sent a line at a time.
 
 ;;;***
 \f
-;;;### (autoloads (ansi-term term make-term) "term" "term.el" (17952
-;;;;;;  11093))
+;;;### (autoloads (ansi-term term make-term) "term" "term.el" (18104
+;;;;;;  24740))
 ;;; Generated autoloads from term.el
 
 (autoload (quote make-term) "term" "\
@@ -26395,8 +26663,8 @@ Start a terminal-emulator in a new buffer.
 
 ;;;***
 \f
-;;;### (autoloads (terminal-emulator) "terminal" "terminal.el" (17842
-;;;;;;  58278))
+;;;### (autoloads (terminal-emulator) "terminal" "terminal.el" (18104
+;;;;;;  24740))
 ;;; Generated autoloads from terminal.el
 
 (autoload (quote terminal-emulator) "terminal" "\
@@ -26433,7 +26701,7 @@ subprocess started.
 ;;;***
 \f
 ;;;### (autoloads (testcover-this-defun) "testcover" "emacs-lisp/testcover.el"
-;;;;;;  (17925 52793))
+;;;;;;  (18104 24748))
 ;;; Generated autoloads from emacs-lisp/testcover.el
 
 (autoload (quote testcover-this-defun) "testcover" "\
@@ -26443,7 +26711,7 @@ Start coverage on function under point.
 
 ;;;***
 \f
-;;;### (autoloads (tetris) "tetris" "play/tetris.el" (17941 38806))
+;;;### (autoloads (tetris) "tetris" "play/tetris.el" (18104 24762))
 ;;; Generated autoloads from play/tetris.el
 
 (autoload (quote tetris) "tetris" "\
@@ -26474,7 +26742,7 @@ tetris-mode keybindings:
 ;;;;;;  tex-start-commands tex-start-options slitex-run-command latex-run-command
 ;;;;;;  tex-run-command tex-offer-save tex-main-file tex-first-line-header-regexp
 ;;;;;;  tex-directory tex-shell-file-name) "tex-mode" "textmodes/tex-mode.el"
-;;;;;;  (17992 30878))
+;;;;;;  (18104 24772))
 ;;; Generated autoloads from textmodes/tex-mode.el
 
 (defvar tex-shell-file-name nil "\
@@ -26776,7 +27044,7 @@ Major mode to edit DocTeX files.
 ;;;***
 \f
 ;;;### (autoloads (texi2info texinfo-format-region texinfo-format-buffer)
-;;;;;;  "texinfmt" "textmodes/texinfmt.el" (17842 58276))
+;;;;;;  "texinfmt" "textmodes/texinfmt.el" (18104 24773))
 ;;; Generated autoloads from textmodes/texinfmt.el
 
 (autoload (quote texinfo-format-buffer) "texinfmt" "\
@@ -26785,8 +27053,8 @@ The Info file output is generated in a buffer visiting the Info file
 name specified in the @setfilename command.
 
 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.
+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)
 
@@ -26809,14 +27077,14 @@ is automatically removed when the Info file is created.  The original
 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.
+if large.  You can use `Info-split' to do this manually.
 
 \(fn &optional NOSPLIT)" t nil)
 
 ;;;***
 \f
 ;;;### (autoloads (texinfo-mode texinfo-close-quote texinfo-open-quote)
-;;;;;;  "texinfo" "textmodes/texinfo.el" (17842 58276))
+;;;;;;  "texinfo" "textmodes/texinfo.el" (18104 24773))
 ;;; Generated autoloads from textmodes/texinfo.el
 
 (defvar texinfo-open-quote "``" "\
@@ -26903,7 +27171,7 @@ value of `texinfo-mode-hook'.
 ;;;### (autoloads (thai-auto-composition-mode thai-composition-function
 ;;;;;;  thai-post-read-conversion thai-compose-buffer thai-compose-string
 ;;;;;;  thai-compose-region) "thai-util" "language/thai-util.el"
-;;;;;;  (17842 58278))
+;;;;;;  (18104 24758))
 ;;; Generated autoloads from language/thai-util.el
 
 (autoload (quote thai-compose-region) "thai-util" "\
@@ -26947,7 +27215,7 @@ Minor mode for automatically correct Thai character composition.
 \f
 ;;;### (autoloads (list-at-point number-at-point symbol-at-point
 ;;;;;;  sexp-at-point thing-at-point bounds-of-thing-at-point forward-thing)
-;;;;;;  "thingatpt" "thingatpt.el" (17842 58278))
+;;;;;;  "thingatpt" "thingatpt.el" (18104 24740))
 ;;; Generated autoloads from thingatpt.el
 
 (autoload (quote forward-thing) "thingatpt" "\
@@ -26959,7 +27227,7 @@ Move forward to the end of the Nth next THING.
 Determine the start and end buffer locations for the THING at point.
 THING is a symbol which specifies the kind of syntactic entity you want.
 Possibilities include `symbol', `list', `sexp', `defun', `filename', `url',
-`word', `sentence', `whitespace', `line', `page' and others.
+`email', `word', `sentence', `whitespace', `line', `page' and others.
 
 See the file `thingatpt.el' for documentation on how to define
 a symbol as a valid THING.
@@ -26973,7 +27241,7 @@ of the textual entity that was found.
 Return the THING at point.
 THING is a symbol which specifies the kind of syntactic entity you want.
 Possibilities include `symbol', `list', `sexp', `defun', `filename', `url',
-`word', `sentence', `whitespace', `line', `page' and others.
+`email', `word', `sentence', `whitespace', `line', `page' and others.
 
 See the file `thingatpt.el' for documentation on how to define
 a symbol as a valid THING.
@@ -27004,7 +27272,7 @@ Not documented
 \f
 ;;;### (autoloads (thumbs-dired-setroot thumbs-dired-show thumbs-dired-show-marked
 ;;;;;;  thumbs-show-from-dir thumbs-find-thumb) "thumbs" "thumbs.el"
-;;;;;;  (17963 26308))
+;;;;;;  (18104 24740))
 ;;; Generated autoloads from thumbs.el
 
 (autoload (quote thumbs-find-thumb) "thumbs" "\
@@ -27043,7 +27311,7 @@ In dired, call the setroot program on the image at point.
 ;;;;;;  tibetan-composition-function tibetan-decompose-string tibetan-decompose-region
 ;;;;;;  tibetan-compose-region tibetan-compose-string tibetan-transcription-to-tibetan
 ;;;;;;  tibetan-tibetan-to-transcription tibetan-char-p) "tibet-util"
-;;;;;;  "language/tibet-util.el" (17842 58278))
+;;;;;;  "language/tibet-util.el" (18104 24758))
 ;;; Generated autoloads from language/tibet-util.el
 
 (autoload (quote tibetan-char-p) "tibet-util" "\
@@ -27122,7 +27390,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (tildify-buffer tildify-region) "tildify" "textmodes/tildify.el"
-;;;;;;  (17842 58276))
+;;;;;;  (18104 24773))
 ;;; Generated autoloads from textmodes/tildify.el
 
 (autoload (quote tildify-region) "tildify" "\
@@ -27146,7 +27414,7 @@ This function performs no refilling of the changed text.
 ;;;***
 \f
 ;;;### (autoloads (display-time-mode display-time display-time-day-and-date)
-;;;;;;  "time" "time.el" (18006 55796))
+;;;;;;  "time" "time.el" (18104 24740))
 ;;; Generated autoloads from time.el
 
 (defvar display-time-day-and-date nil "\
@@ -27188,8 +27456,8 @@ This runs the normal hook `display-time-hook' after each update.
 ;;;### (autoloads (safe-date-to-time time-to-days time-to-day-in-year
 ;;;;;;  date-leap-year-p days-between date-to-day time-add time-subtract
 ;;;;;;  time-since days-to-time time-less-p seconds-to-time time-to-seconds
-;;;;;;  date-to-time) "time-date" "calendar/time-date.el" (17842
-;;;;;;  53792))
+;;;;;;  date-to-time) "time-date" "calendar/time-date.el" (18104
+;;;;;;  24745))
 ;;; Generated autoloads from calendar/time-date.el
 
 (autoload (quote date-to-time) "time-date" "\
@@ -27275,7 +27543,7 @@ If DATE is malformed, return a time value of zeros.
 ;;;***
 \f
 ;;;### (autoloads (time-stamp-toggle-active time-stamp) "time-stamp"
-;;;;;;  "time-stamp.el" (17842 58278))
+;;;;;;  "time-stamp.el" (18104 24740))
 ;;; Generated autoloads from time-stamp.el
 (put 'time-stamp-format 'safe-local-variable 'stringp)
 (put 'time-stamp-line-limit 'safe-local-variable 'integerp)
@@ -27318,7 +27586,7 @@ With ARG, turn time stamping on if and only if arg is positive.
 ;;;;;;  timeclock-workday-remaining-string timeclock-reread-log timeclock-query-out
 ;;;;;;  timeclock-change timeclock-status-string timeclock-out timeclock-in
 ;;;;;;  timeclock-modeline-display) "timeclock" "calendar/timeclock.el"
-;;;;;;  (17992 30878))
+;;;;;;  (18104 24745))
 ;;; Generated autoloads from calendar/timeclock.el
 
 (autoload (quote timeclock-modeline-display) "timeclock" "\
@@ -27419,7 +27687,7 @@ relative only to the time worked today, and not to past time.
 \f
 ;;;### (autoloads (with-timeout run-with-idle-timer add-timeout run-with-timer
 ;;;;;;  run-at-time cancel-function-timers cancel-timer) "timer"
-;;;;;;  "emacs-lisp/timer.el" (17935 13348))
+;;;;;;  "emacs-lisp/timer.el" (18104 24748))
 ;;; Generated autoloads from emacs-lisp/timer.el
 
 (defalias (quote disable-timeout) (quote cancel-timer))
@@ -27500,7 +27768,7 @@ be detected.
 ;;;***
 \f
 ;;;### (autoloads (batch-titdic-convert titdic-convert) "titdic-cnv"
-;;;;;;  "international/titdic-cnv.el" (17870 32853))
+;;;;;;  "international/titdic-cnv.el" (18104 24757))
 ;;; Generated autoloads from international/titdic-cnv.el
 
 (autoload (quote titdic-convert) "titdic-cnv" "\
@@ -27523,8 +27791,8 @@ To get complete usage, invoke \"emacs -batch -f batch-titdic-convert -h\".
 ;;;***
 \f
 ;;;### (autoloads (tamil-composition-function tamil-post-read-conversion
-;;;;;;  tamil-compose-region) "tml-util" "language/tml-util.el" (17842
-;;;;;;  58278))
+;;;;;;  tamil-compose-region) "tml-util" "language/tml-util.el" (18104
+;;;;;;  24758))
 ;;; Generated autoloads from language/tml-util.el
 
 (autoload (quote tamil-compose-region) "tml-util" "\
@@ -27547,10 +27815,9 @@ PATTERN regexp.
 ;;;***
 \f
 ;;;### (autoloads (tmm-prompt tmm-menubar-mouse tmm-menubar) "tmm"
-;;;;;;  "tmm.el" (17952 58711))
+;;;;;;  "tmm.el" (18104 24740))
 ;;; Generated autoloads from tmm.el
  (define-key global-map "\M-`" 'tmm-menubar)
- (define-key global-map [f10] 'tmm-menubar)
  (define-key global-map [menu-bar mouse-1] 'tmm-menubar-mouse)
 
 (autoload (quote tmm-menubar) "tmm" "\
@@ -27588,7 +27855,7 @@ Its value should be an event that has a binding in MENU.
 \f
 ;;;### (autoloads (todo-show todo-cp todo-mode todo-print todo-top-priorities
 ;;;;;;  todo-insert-item todo-add-item-non-interactively todo-add-category)
-;;;;;;  "todo-mode" "calendar/todo-mode.el" (17962 52848))
+;;;;;;  "todo-mode" "calendar/todo-mode.el" (18104 24745))
 ;;; Generated autoloads from calendar/todo-mode.el
 
 (autoload (quote todo-add-category) "todo-mode" "\
@@ -27648,10 +27915,16 @@ Show TODO list.
 ;;;***
 \f
 ;;;### (autoloads (tool-bar-local-item-from-menu tool-bar-add-item-from-menu
-;;;;;;  tool-bar-local-item tool-bar-add-item) "tool-bar" "tool-bar.el"
-;;;;;;  (17842 58278))
+;;;;;;  tool-bar-local-item tool-bar-add-item toggle-tool-bar-mode-from-frame)
+;;;;;;  "tool-bar" "tool-bar.el" (18104 24740))
 ;;; Generated autoloads from tool-bar.el
 
+(autoload (quote toggle-tool-bar-mode-from-frame) "tool-bar" "\
+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)
+
 (put (quote tool-bar-mode) (quote standard-value) (quote (t)))
 
 (autoload (quote tool-bar-add-item) "tool-bar" "\
@@ -27716,7 +27989,7 @@ holds a keymap.
 ;;;***
 \f
 ;;;### (autoloads (tpu-edt-on tpu-edt-mode) "tpu-edt" "emulation/tpu-edt.el"
-;;;;;;  (18006 55796))
+;;;;;;  (18104 24748))
 ;;; Generated autoloads from emulation/tpu-edt.el
 
 (defvar tpu-edt-mode nil "\
@@ -27743,7 +28016,7 @@ Turn on TPU/edt emulation.
 ;;;***
 \f
 ;;;### (autoloads (tpu-set-cursor-bound tpu-set-cursor-free tpu-set-scroll-margins)
-;;;;;;  "tpu-extras" "emulation/tpu-extras.el" (17842 54264))
+;;;;;;  "tpu-extras" "emulation/tpu-extras.el" (18104 24748))
 ;;; Generated autoloads from emulation/tpu-extras.el
 
 (autoload (quote tpu-set-scroll-margins) "tpu-extras" "\
@@ -27763,7 +28036,7 @@ Constrain the cursor to the flow of the text.
 
 ;;;***
 \f
-;;;### (autoloads (tq-create) "tq" "emacs-lisp/tq.el" (17842 54152))
+;;;### (autoloads (tq-create) "tq" "emacs-lisp/tq.el" (18104 24748))
 ;;; Generated autoloads from emacs-lisp/tq.el
 
 (autoload (quote tq-create) "tq" "\
@@ -27777,7 +28050,7 @@ to a tcp server on another machine.
 ;;;***
 \f
 ;;;### (autoloads (trace-function-background trace-function trace-buffer)
-;;;;;;  "trace" "emacs-lisp/trace.el" (17842 54152))
+;;;;;;  "trace" "emacs-lisp/trace.el" (18104 24748))
 ;;; Generated autoloads from emacs-lisp/trace.el
 
 (defvar trace-buffer "*trace-output*" "\
@@ -27813,32 +28086,43 @@ BUFFER defaults to `trace-buffer'.
 \f
 ;;;### (autoloads (tramp-unload-tramp tramp-completion-handle-file-name-completion
 ;;;;;;  tramp-completion-handle-file-name-all-completions tramp-unload-file-name-handlers
-;;;;;;  tramp-file-name-handler tramp-completion-file-name-regexp
-;;;;;;  tramp-file-name-regexp) "tramp" "net/tramp.el" (17934 45069))
+;;;;;;  tramp-file-name-handler tramp-syntax) "tramp" "net/tramp.el"
+;;;;;;  (18104 24760))
 ;;; Generated autoloads from net/tramp.el
 
-(defvar tramp-unified-filenames (not (featurep (quote xemacs))) "\
-Non-nil means to use unified Ange-FTP/Tramp filename syntax.
-Otherwise, use a separate filename syntax for Tramp.")
+(defvar tramp-syntax (if (featurep (quote xemacs)) (quote sep) (quote ftp)) "\
+Tramp filename syntax to be used.
+
+It can have the following values:
+
+  'ftp -- Ange-FTP respective EFS like syntax (GNU Emacs default)
+  'sep -- Syntax as defined for XEmacs (not available yet for GNU Emacs)
+  'url -- URL-like syntax.")
+
+(custom-autoload (quote tramp-syntax) "tramp" t)
 
 (defconst tramp-file-name-regexp-unified "\\`/[^/:]+:" "\
 Value for `tramp-file-name-regexp' for unified remoting.
 Emacs (not XEmacs) uses a unified filename syntax for Ange-FTP and
-Tramp.  See `tramp-file-name-structure-unified' for more explanations.")
+Tramp.  See `tramp-file-name-structure' for more explanations.")
 
 (defconst tramp-file-name-regexp-separate "\\`/\\[.*\\]" "\
 Value for `tramp-file-name-regexp' for separate remoting.
 XEmacs uses a separate filename syntax for Tramp and EFS.
-See `tramp-file-name-structure-separate' for more explanations.")
+See `tramp-file-name-structure' for more explanations.")
+
+(defconst tramp-file-name-regexp-url "\\`/[^/:]+://" "\
+Value for `tramp-file-name-regexp' for URL-like remoting.
+See `tramp-file-name-structure' for more explanations.")
 
-(defvar tramp-file-name-regexp (if tramp-unified-filenames tramp-file-name-regexp-unified tramp-file-name-regexp-separate) "\
+(defconst tramp-file-name-regexp (cond ((equal tramp-syntax (quote ftp)) tramp-file-name-regexp-unified) ((equal tramp-syntax (quote sep)) tramp-file-name-regexp-separate) ((equal tramp-syntax (quote url)) tramp-file-name-regexp-url) (t (error "Wrong `tramp-syntax' defined"))) "\
 *Regular expression matching file names handled by tramp.
 This regexp should match tramp file names but no other file names.
 \(When tramp.el is loaded, this regular expression is prepended to
 `file-name-handler-alist', and that is searched sequentially.  Thus,
 if the tramp entry appears rather early in the `file-name-handler-alist'
 and is a bit too general, then some files might be considered tramp
-files which are not really tramp files.
+files which are not really Tramp files.
 
 Please note that the entry in `file-name-handler-alist' is made when
 this file (tramp.el) is loaded.  This means that this variable must be set
@@ -27847,19 +28131,21 @@ updated after changing this variable.
 
 Also see `tramp-file-name-structure'.")
 
-(custom-autoload (quote tramp-file-name-regexp) "tramp" t)
-
-(defconst tramp-completion-file-name-regexp-unified "^/$\\|^/[^/:][^/]*$" "\
+(defconst tramp-completion-file-name-regexp-unified (if (memq system-type (quote (cygwin windows-nt))) "^\\([a-zA-Z]:\\)?/$\\|^\\([a-zA-Z]:\\)?/[^/:][^/]*$" "^/$\\|^/[^/:][^/]*$") "\
 Value for `tramp-completion-file-name-regexp' for unified remoting.
 Emacs (not XEmacs) uses a unified filename syntax for Ange-FTP and
-Tramp.  See `tramp-file-name-structure-unified' for more explanations.")
+Tramp.  See `tramp-file-name-structure' for more explanations.")
 
-(defconst tramp-completion-file-name-regexp-separate "^/\\([[][^]]*\\)?$" "\
+(defconst tramp-completion-file-name-regexp-separate (if (memq system-type (quote (cygwin windows-nt))) "^\\([a-zA-Z]:\\)?/\\([[][^]]*\\)?$" "^/\\([[][^]]*\\)?$") "\
 Value for `tramp-completion-file-name-regexp' for separate remoting.
 XEmacs uses a separate filename syntax for Tramp and EFS.
-See `tramp-file-name-structure-separate' for more explanations.")
+See `tramp-file-name-structure' for more explanations.")
+
+(defconst tramp-completion-file-name-regexp-url (if (memq system-type (quote (cygwin windows-nt))) "^\\([a-zA-Z]:\\)?/$\\|^\\([a-zA-Z]:\\)?/[^/:]+\\(:\\(/\\(/[^/]*\\)?\\)?\\)?$" "^/$\\|^/[^/:]+\\(:\\(/\\(/[^/]*\\)?\\)?\\)?$") "\
+Value for `tramp-completion-file-name-regexp' for URL-like remoting.
+See `tramp-file-name-structure' for more explanations.")
 
-(defvar tramp-completion-file-name-regexp (if tramp-unified-filenames tramp-completion-file-name-regexp-unified tramp-completion-file-name-regexp-separate) "\
+(defconst tramp-completion-file-name-regexp (cond ((equal tramp-syntax (quote ftp)) tramp-completion-file-name-regexp-unified) ((equal tramp-syntax (quote sep)) tramp-completion-file-name-regexp-separate) ((equal tramp-syntax (quote url)) tramp-completion-file-name-regexp-url) (t (error "Wrong `tramp-syntax' defined"))) "\
 *Regular expression matching file names handled by tramp completion.
 This regexp should match partial tramp file names only.
 
@@ -27870,8 +28156,6 @@ updated after changing this variable.
 
 Also see `tramp-file-name-structure'.")
 
-(custom-autoload (quote tramp-completion-file-name-regexp) "tramp" t)
-
 (defconst tramp-completion-file-name-handler-alist (quote ((file-name-all-completions . tramp-completion-handle-file-name-all-completions) (file-name-completion . tramp-completion-handle-file-name-completion))) "\
 Alist of completion handler functions.
 Used for file names matching `tramp-file-name-regexp'. Operations not
@@ -27899,11 +28183,11 @@ Invoke tramp file name completion handler.
 Falls back to normal file name handler if no tramp file name handler exists." (let ((fn (assoc operation tramp-completion-file-name-handler-alist))) (if fn (save-match-data (apply (cdr fn) args)) (tramp-completion-run-real-handler operation args))))
 
 (defsubst tramp-register-file-name-handler nil "\
-Add tramp file name handler to `file-name-handler-alist'." (add-to-list (quote file-name-handler-alist) (cons tramp-file-name-regexp (quote tramp-file-name-handler))) (let ((jka (rassoc (quote jka-compr-handler) file-name-handler-alist))) (when jka (setq file-name-handler-alist (cons jka (delete jka file-name-handler-alist))))))
+Add tramp file name handler to `file-name-handler-alist'." (let ((a1 (rassq (quote tramp-file-name-handler) file-name-handler-alist))) (setq file-name-handler-alist (delete a1 file-name-handler-alist))) (add-to-list (quote file-name-handler-alist) (cons tramp-file-name-regexp (quote tramp-file-name-handler))) (let ((jka (rassoc (quote jka-compr-handler) file-name-handler-alist))) (when jka (setq file-name-handler-alist (cons jka (delete jka file-name-handler-alist))))))
+(tramp-register-file-name-handler)
 
 (defsubst tramp-register-completion-file-name-handler nil "\
-Add tramp completion file name handler to `file-name-handler-alist'." (when (or (not (boundp (quote partial-completion-mode))) (symbol-value (quote partial-completion-mode)) (featurep (quote ido))) (add-to-list (quote file-name-handler-alist) (cons tramp-completion-file-name-regexp (quote tramp-completion-file-name-handler))) (put (quote tramp-completion-file-name-handler) (quote safe-magic) t)) (let ((jka (rassoc (quote jka-compr-handler) file-name-handler-alist))) (when jka (setq file-name-handler-alist (cons jka (delete jka file-name-handler-alist))))))
-(tramp-register-file-name-handler)
+Add tramp completion file name handler to `file-name-handler-alist'." (let ((a1 (rassq (quote tramp-completion-file-name-handler) file-name-handler-alist))) (setq file-name-handler-alist (delete a1 file-name-handler-alist))) (when (or (not (boundp (quote partial-completion-mode))) (symbol-value (quote partial-completion-mode)) (featurep (quote ido))) (add-to-list (quote file-name-handler-alist) (cons tramp-completion-file-name-regexp (quote tramp-completion-file-name-handler))) (put (quote tramp-completion-file-name-handler) (quote safe-magic) t)) (let ((jka (rassoc (quote jka-compr-handler) file-name-handler-alist))) (when jka (setq file-name-handler-alist (cons jka (delete jka file-name-handler-alist))))))
 (add-hook
  'after-init-hook
  '(lambda () (tramp-register-completion-file-name-handler)))
@@ -27914,12 +28198,12 @@ Not documented
 \(fn)" nil nil)
 
 (autoload (quote tramp-completion-handle-file-name-all-completions) "tramp" "\
-Like `file-name-all-completions' for partial tramp files.
+Like `file-name-all-completions' for partial Tramp files.
 
 \(fn FILENAME DIRECTORY)" nil nil)
 
 (autoload (quote tramp-completion-handle-file-name-completion) "tramp" "\
-Like `file-name-completion' for tramp files.
+Like `file-name-completion' for Tramp files.
 
 \(fn FILENAME DIRECTORY &optional PREDICATE)" nil nil)
 
@@ -27931,7 +28215,7 @@ Discard Tramp from loading remote files.
 ;;;***
 \f
 ;;;### (autoloads (tramp-ftp-enable-ange-ftp) "tramp-ftp" "net/tramp-ftp.el"
-;;;;;;  (17842 55218))
+;;;;;;  (18104 24760))
 ;;; Generated autoloads from net/tramp-ftp.el
 
 (autoload (quote tramp-ftp-enable-ange-ftp) "tramp-ftp" "\
@@ -27941,8 +28225,8 @@ Not documented
 
 ;;;***
 \f
-;;;### (autoloads (help-with-tutorial) "tutorial" "tutorial.el" (18006
-;;;;;;  55796))
+;;;### (autoloads (help-with-tutorial) "tutorial" "tutorial.el" (18104
+;;;;;;  24740))
 ;;; Generated autoloads from tutorial.el
 
 (autoload (quote help-with-tutorial) "tutorial" "\
@@ -27967,7 +28251,7 @@ resumed later.
 ;;;***
 \f
 ;;;### (autoloads (2C-split 2C-associate-buffer 2C-two-columns) "two-column"
-;;;;;;  "textmodes/two-column.el" (17842 58276))
+;;;;;;  "textmodes/two-column.el" (18104 24773))
 ;;; Generated autoloads from textmodes/two-column.el
  (autoload '2C-command "two-column" () t 'keymap)
  (global-set-key "\C-x6" '2C-command)
@@ -28018,7 +28302,7 @@ First column's text    sSs  Second column's text
 ;;;;;;  type-break type-break-mode type-break-keystroke-threshold
 ;;;;;;  type-break-good-break-interval type-break-good-rest-interval
 ;;;;;;  type-break-interval type-break-mode) "type-break" "type-break.el"
-;;;;;;  (17908 29123))
+;;;;;;  (18104 24740))
 ;;; Generated autoloads from type-break.el
 
 (defvar type-break-mode nil "\
@@ -28201,7 +28485,7 @@ FRAC should be the inverse of the fractional value; for example, a value of
 ;;;***
 \f
 ;;;### (autoloads (ununderline-region underline-region) "underline"
-;;;;;;  "textmodes/underline.el" (17842 58276))
+;;;;;;  "textmodes/underline.el" (18104 24773))
 ;;; Generated autoloads from textmodes/underline.el
 
 (autoload (quote underline-region) "underline" "\
@@ -28222,7 +28506,7 @@ which specify the range to operate on.
 ;;;***
 \f
 ;;;### (autoloads (unforward-rmail-message undigestify-rmail-message)
-;;;;;;  "undigest" "mail/undigest.el" (17842 55035))
+;;;;;;  "undigest" "mail/undigest.el" (18104 24758))
 ;;; Generated autoloads from mail/undigest.el
 
 (autoload (quote undigestify-rmail-message) "undigest" "\
@@ -28241,7 +28525,7 @@ following the containing message.
 ;;;***
 \f
 ;;;### (autoloads (unrmail batch-unrmail) "unrmail" "mail/unrmail.el"
-;;;;;;  (17842 55035))
+;;;;;;  (18104 24758))
 ;;; Generated autoloads from mail/unrmail.el
 
 (autoload (quote batch-unrmail) "unrmail" "\
@@ -28260,8 +28544,8 @@ Convert Rmail file FILE to system inbox format file TO-FILE.
 
 ;;;***
 \f
-;;;### (autoloads (unsafep) "unsafep" "emacs-lisp/unsafep.el" (17842
-;;;;;;  54152))
+;;;### (autoloads (unsafep) "unsafep" "emacs-lisp/unsafep.el" (18104
+;;;;;;  24748))
 ;;; Generated autoloads from emacs-lisp/unsafep.el
 
 (autoload (quote unsafep) "unsafep" "\
@@ -28274,7 +28558,7 @@ of symbols with local bindings.
 ;;;***
 \f
 ;;;### (autoloads (url-retrieve-synchronously url-retrieve) "url"
-;;;;;;  "url/url.el" (17842 56569))
+;;;;;;  "url/url.el" (18104 24773))
 ;;; Generated autoloads from url/url.el
 
 (autoload (quote url-retrieve) "url" "\
@@ -28314,7 +28598,7 @@ no further processing).  URL is either a string or a parsed URL.
 ;;;***
 \f
 ;;;### (autoloads (url-register-auth-scheme url-get-authentication)
-;;;;;;  "url-auth" "url/url-auth.el" (17854 10173))
+;;;;;;  "url-auth" "url/url-auth.el" (18104 24773))
 ;;; Generated autoloads from url/url-auth.el
 
 (autoload (quote url-get-authentication) "url-auth" "\
@@ -28356,8 +28640,8 @@ RATING   a rating between 1 and 10 of the strength of the authentication.
 ;;;***
 \f
 ;;;### (autoloads (url-cache-expired url-cache-extract url-is-cached
-;;;;;;  url-store-in-cache) "url-cache" "url/url-cache.el" (17842
-;;;;;;  56569))
+;;;;;;  url-store-in-cache) "url-cache" "url/url-cache.el" (18104
+;;;;;;  24773))
 ;;; Generated autoloads from url/url-cache.el
 
 (autoload (quote url-store-in-cache) "url-cache" "\
@@ -28382,7 +28666,7 @@ Return t iff a cached file has expired.
 
 ;;;***
 \f
-;;;### (autoloads (url-cid) "url-cid" "url/url-cid.el" (17842 56569))
+;;;### (autoloads (url-cid) "url-cid" "url/url-cid.el" (18104 24773))
 ;;; Generated autoloads from url/url-cid.el
 
 (autoload (quote url-cid) "url-cid" "\
@@ -28393,7 +28677,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (url-dav-vc-registered url-dav-supported-p) "url-dav"
-;;;;;;  "url/url-dav.el" (17842 56569))
+;;;;;;  "url/url-dav.el" (18104 24773))
 ;;; Generated autoloads from url/url-dav.el
 
 (autoload (quote url-dav-supported-p) "url-dav" "\
@@ -28408,8 +28692,8 @@ Not documented
 
 ;;;***
 \f
-;;;### (autoloads (url-file) "url-file" "url/url-file.el" (17842
-;;;;;;  56569))
+;;;### (autoloads (url-file) "url-file" "url/url-file.el" (18104
+;;;;;;  24773))
 ;;; Generated autoloads from url/url-file.el
 
 (autoload (quote url-file) "url-file" "\
@@ -28420,7 +28704,7 @@ Handle file: and ftp: URLs.
 ;;;***
 \f
 ;;;### (autoloads (url-open-stream url-gateway-nslookup-host) "url-gw"
-;;;;;;  "url/url-gw.el" (17842 56569))
+;;;;;;  "url/url-gw.el" (18104 24773))
 ;;; Generated autoloads from url/url-gw.el
 
 (autoload (quote url-gateway-nslookup-host) "url-gw" "\
@@ -28439,8 +28723,8 @@ Might do a non-blocking connection; use `process-status' to check.
 ;;;***
 \f
 ;;;### (autoloads (url-insert-file-contents url-file-local-copy url-copy-file
-;;;;;;  url-handler-mode) "url-handlers" "url/url-handlers.el" (17842
-;;;;;;  56569))
+;;;;;;  url-handler-mode) "url-handlers" "url/url-handlers.el" (18104
+;;;;;;  24773))
 ;;; Generated autoloads from url/url-handlers.el
 
 (defvar url-handler-mode nil "\
@@ -28484,7 +28768,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (url-http-options url-http-file-attributes url-http-file-exists-p
-;;;;;;  url-http) "url-http" "url/url-http.el" (17952 11683))
+;;;;;;  url-http) "url-http" "url/url-http.el" (18104 24773))
 ;;; Generated autoloads from url/url-http.el
 
 (autoload (quote url-http) "url-http" "\
@@ -28549,7 +28833,7 @@ HTTPS retrievals are asynchronous.")
 
 ;;;***
 \f
-;;;### (autoloads (url-irc) "url-irc" "url/url-irc.el" (17842 56569))
+;;;### (autoloads (url-irc) "url-irc" "url/url-irc.el" (18104 24773))
 ;;; Generated autoloads from url/url-irc.el
 
 (autoload (quote url-irc) "url-irc" "\
@@ -28559,8 +28843,8 @@ Not documented
 
 ;;;***
 \f
-;;;### (autoloads (url-ldap) "url-ldap" "url/url-ldap.el" (17842
-;;;;;;  56569))
+;;;### (autoloads (url-ldap) "url-ldap" "url/url-ldap.el" (18104
+;;;;;;  24773))
 ;;; Generated autoloads from url/url-ldap.el
 
 (autoload (quote url-ldap) "url-ldap" "\
@@ -28574,7 +28858,7 @@ URL can be a URL string, or a URL vector of the type returned by
 ;;;***
 \f
 ;;;### (autoloads (url-mailto url-mail) "url-mailto" "url/url-mailto.el"
-;;;;;;  (18012 18089))
+;;;;;;  (18104 24773))
 ;;; Generated autoloads from url/url-mailto.el
 
 (autoload (quote url-mail) "url-mailto" "\
@@ -28590,7 +28874,7 @@ Handle the mailto: URL syntax.
 ;;;***
 \f
 ;;;### (autoloads (url-data url-generic-emulator-loader url-info
-;;;;;;  url-man) "url-misc" "url/url-misc.el" (17842 56569))
+;;;;;;  url-man) "url-misc" "url/url-misc.el" (18104 24773))
 ;;; Generated autoloads from url/url-misc.el
 
 (autoload (quote url-man) "url-misc" "\
@@ -28622,7 +28906,7 @@ Fetch a data URL (RFC 2397).
 ;;;***
 \f
 ;;;### (autoloads (url-snews url-news) "url-news" "url/url-news.el"
-;;;;;;  (17842 56569))
+;;;;;;  (18104 24773))
 ;;; Generated autoloads from url/url-news.el
 
 (autoload (quote url-news) "url-news" "\
@@ -28639,7 +28923,7 @@ Not documented
 \f
 ;;;### (autoloads (url-ns-user-pref url-ns-prefs isInNet isResolvable
 ;;;;;;  dnsResolve dnsDomainIs isPlainHostName) "url-ns" "url/url-ns.el"
-;;;;;;  (17842 56569))
+;;;;;;  (18104 24773))
 ;;; Generated autoloads from url/url-ns.el
 
 (autoload (quote isPlainHostName) "url-ns" "\
@@ -28680,7 +28964,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (url-generic-parse-url url-recreate-url) "url-parse"
-;;;;;;  "url/url-parse.el" (17954 22157))
+;;;;;;  "url/url-parse.el" (18104 24773))
 ;;; Generated autoloads from url/url-parse.el
 
 (autoload (quote url-recreate-url) "url-parse" "\
@@ -28698,7 +28982,7 @@ Format is:
 ;;;***
 \f
 ;;;### (autoloads (url-setup-privacy-info) "url-privacy" "url/url-privacy.el"
-;;;;;;  (17842 56569))
+;;;;;;  (18104 24773))
 ;;; Generated autoloads from url/url-privacy.el
 
 (autoload (quote url-setup-privacy-info) "url-privacy" "\
@@ -28714,7 +28998,7 @@ Setup variables that expose info about you and your system.
 ;;;;;;  url-strip-leading-spaces url-eat-trailing-space url-get-normalized-date
 ;;;;;;  url-lazy-message url-normalize-url url-insert-entities-in-string
 ;;;;;;  url-parse-args url-debug url-debug) "url-util" "url/url-util.el"
-;;;;;;  (17842 56569))
+;;;;;;  (18104 24773))
 ;;; Generated autoloads from url/url-util.el
 
 (defvar url-debug nil "\
@@ -28843,7 +29127,7 @@ This uses `url-current-object', set locally to the buffer.
 ;;;***
 \f
 ;;;### (autoloads (ask-user-about-supersession-threat ask-user-about-lock)
-;;;;;;  "userlock" "userlock.el" (17842 58278))
+;;;;;;  "userlock" "userlock.el" (18104 24740))
 ;;; Generated autoloads from userlock.el
 
 (autoload (quote ask-user-about-lock) "userlock" "\
@@ -28873,7 +29157,7 @@ The buffer in question is current when this function is called.
 \f
 ;;;### (autoloads (uudecode-decode-region uudecode-decode-region-internal
 ;;;;;;  uudecode-decode-region-external) "uudecode" "gnus/uudecode.el"
-;;;;;;  (17855 50203))
+;;;;;;  (18104 24755))
 ;;; Generated autoloads from gnus/uudecode.el
 
 (autoload (quote uudecode-decode-region-external) "uudecode" "\
@@ -28898,12 +29182,12 @@ If FILE-NAME is non-nil, save the result to FILE-NAME.
 ;;;***
 \f
 ;;;### (autoloads (vc-annotate vc-update-change-log vc-rename-file
-;;;;;;  vc-transfer-file vc-switch-backend vc-cancel-version vc-update
-;;;;;;  vc-revert-buffer vc-print-log vc-retrieve-snapshot vc-create-snapshot
+;;;;;;  vc-transfer-file vc-switch-backend vc-rollback vc-update
+;;;;;;  vc-revert vc-print-log vc-retrieve-snapshot vc-create-snapshot
 ;;;;;;  vc-directory vc-merge vc-insert-headers vc-version-other-window
 ;;;;;;  vc-diff vc-register vc-next-action vc-do-command edit-vc-file
 ;;;;;;  with-vc-file vc-branch-part vc-trunk-p vc-before-checkin-hook
-;;;;;;  vc-checkin-hook vc-checkout-hook) "vc" "vc.el" (17992 30877))
+;;;;;;  vc-checkin-hook vc-checkout-hook) "vc" "vc.el" (18104 24741))
 ;;; Generated autoloads from vc.el
 
 (defvar vc-checkout-hook nil "\
@@ -28959,12 +29243,12 @@ already current, set it up properly and erase it.  The command is
 considered successful if its exit status does not exceed OKSTATUS (if
 OKSTATUS is nil, that means to ignore error status, if it is `async', that
 means not to wait for termination of the subprocess; if it is t it means to
-ignore all execution errors).  FILE is the
-name of the working file (may also be nil, to execute commands that
-don't expect a file name).  If an optional list of FLAGS is present,
+ignore all execution errors).  FILE-OR-LIST is the name of a working file;
+it may be a list of files or be nil (to execute commands that don't expect 
+a file name or set of files).  If an optional list of FLAGS is present,
 that is inserted into the command line before the filename.
 
-\(fn BUFFER OKSTATUS COMMAND FILE &rest FLAGS)" nil nil)
+\(fn BUFFER OKSTATUS COMMAND FILE-OR-LIST &rest FLAGS)" nil nil)
 
 (autoload (quote vc-next-action) "vc" "\
 Do the next logical version control operation on the current file.
@@ -29095,7 +29379,7 @@ If FOCUS-REV is non-nil, leave the point at that revision.
 
 \(fn &optional FOCUS-REV)" t nil)
 
-(autoload (quote vc-revert-buffer) "vc" "\
+(autoload (quote vc-revert) "vc" "\
 Revert the current buffer's file to the version it was based on.
 This asks for confirmation if the buffer contents are not identical
 to that version.  This function does not automatically pick up newer
@@ -29112,11 +29396,10 @@ the current branch are merged into the working file.
 
 \(fn)" t nil)
 
-(autoload (quote vc-cancel-version) "vc" "\
+(autoload (quote vc-rollback) "vc" "\
 Get rid of most recently checked in version of this file.
-A prefix argument NOREVERT means do not revert the buffer afterwards.
 
-\(fn NOREVERT)" t nil)
+\(fn)" t nil)
 
 (autoload (quote vc-switch-backend) "vc" "\
 Make BACKEND the current version control system for FILE.
@@ -29191,7 +29474,7 @@ colors. `vc-annotate-background' specifies the background color.
 
 ;;;***
 \f
-;;;### (autoloads nil "vc-arch" "vc-arch.el" (17930 34221))
+;;;### (autoloads nil "vc-arch" "vc-arch.el" (18104 24740))
 ;;; Generated autoloads from vc-arch.el
  (defun vc-arch-registered (file)
   (if (vc-find-root file "{arch}/=tagging-method")
@@ -29201,7 +29484,19 @@ colors. `vc-annotate-background' specifies the background color.
 
 ;;;***
 \f
-;;;### (autoloads nil "vc-cvs" "vc-cvs.el" (17842 58278))
+;;;### (autoloads nil "vc-bzr" "vc-bzr.el" (18104 24740))
+;;; Generated autoloads from vc-bzr.el
+
+(defconst vc-bzr-admin-dirname ".bzr")
+ (defun vc-bzr-registered (file)
+  (if (vc-find-root file vc-bzr-admin-dirname)
+      (progn
+        (load "vc-bzr")
+        (vc-bzr-registered file))))
+
+;;;***
+\f
+;;;### (autoloads nil "vc-cvs" "vc-cvs.el" (18104 24740))
 ;;; Generated autoloads from vc-cvs.el
  (defun vc-cvs-registered (f)
   (when (file-readable-p (expand-file-name
@@ -29211,7 +29506,29 @@ colors. `vc-annotate-background' specifies the background color.
 
 ;;;***
 \f
-;;;### (autoloads nil "vc-mcvs" "vc-mcvs.el" (17842 58278))
+;;;### (autoloads nil "vc-git" "vc-git.el" (18104 24740))
+;;; Generated autoloads from vc-git.el
+ (defun vc-git-registered (file)
+  "Return non-nil if FILE is registered with git."
+  (if (vc-find-root file ".git")       ; short cut
+      (progn
+        (load "vc-git")
+        (vc-git-registered file))))
+
+;;;***
+\f
+;;;### (autoloads nil "vc-hg" "vc-hg.el" (18104 24740))
+;;; Generated autoloads from vc-hg.el
+ (defun vc-hg-registered (file)
+  "Return non-nil if FILE is registered with hg."
+  (if (vc-find-root file ".hg")       ; short cut
+      (progn
+        (load "vc-hg")
+        (vc-hg-registered file))))
+
+;;;***
+\f
+;;;### (autoloads nil "vc-mcvs" "vc-mcvs.el" (18104 24741))
 ;;; Generated autoloads from vc-mcvs.el
  (defun vc-mcvs-registered (file)
   (if (vc-find-root file "MCVS/CVS")
@@ -29222,7 +29539,7 @@ colors. `vc-annotate-background' specifies the background color.
 ;;;***
 \f
 ;;;### (autoloads (vc-rcs-master-templates) "vc-rcs" "vc-rcs.el"
-;;;;;;  (17925 15266))
+;;;;;;  (18104 24741))
 ;;; Generated autoloads from vc-rcs.el
 
 (defvar vc-rcs-master-templates (quote ("%sRCS/%s,v" "%s%s,v" "%sRCS/%s")) "\
@@ -29235,7 +29552,7 @@ For a description of possible values, see `vc-check-master-templates'.")
 ;;;***
 \f
 ;;;### (autoloads (vc-sccs-master-templates) "vc-sccs" "vc-sccs.el"
-;;;;;;  (17842 58278))
+;;;;;;  (18104 24741))
 ;;; Generated autoloads from vc-sccs.el
 
 (defvar vc-sccs-master-templates (quote ("%sSCCS/s.%s" "%ss.%s" vc-sccs-search-project-dir)) "\
@@ -29252,7 +29569,7 @@ find any project directory." (let ((project-dir (getenv "PROJECTDIR")) dirs dir)
 
 ;;;***
 \f
-;;;### (autoloads nil "vc-svn" "vc-svn.el" (17881 64914))
+;;;### (autoloads nil "vc-svn" "vc-svn.el" (18104 24741))
 ;;; Generated autoloads from vc-svn.el
  (defun vc-svn-registered (f)
   (let ((admin-dir (cond ((and (eq system-type 'windows-nt)
@@ -29267,10 +29584,68 @@ find any project directory." (let ((project-dir (getenv "PROJECTDIR")) dirs dir)
 
 (add-to-list (quote completion-ignored-extensions) ".svn/")
 
+;;;***
+\f
+;;;### (autoloads (vera-mode) "vera-mode" "progmodes/vera-mode.el"
+;;;;;;  (18104 24769))
+;;; Generated autoloads from progmodes/vera-mode.el
+ (add-to-list 'auto-mode-alist '("\\.vr[hi]?\\'" . vera-mode))
+
+(autoload (quote vera-mode) "vera-mode" "\
+Major mode for editing Vera code.
+
+Usage:
+------
+
+  INDENTATION:  Typing `TAB' at the beginning of a line indents the line.
+    The amount of indentation is specified by option `vera-basic-offset'.
+    Indentation can be done for an entire region (`M-C-\\') or buffer (menu).
+    `TAB' always indents the line if option `vera-intelligent-tab' is nil.
+
+  WORD/COMMAND COMPLETION:  Typing `TAB' after a (not completed) word looks
+    for a word in the buffer or a Vera keyword that starts alike, inserts it
+    and adjusts case.  Re-typing `TAB' toggles through alternative word
+    completions.
+
+    Typing `TAB' after a non-word character inserts a tabulator stop (if not
+    at the beginning of a line).  `M-TAB' always inserts a tabulator stop.
+
+  COMMENTS:  `C-c C-c' comments out a region if not commented out, and
+    uncomments a region if already commented out.
+
+  HIGHLIGHTING (fontification):  Vera keywords, predefined types and
+    constants, function names, declaration names, directives, as well as
+    comments and strings are highlighted using different colors.
+
+  VERA VERSION:  OpenVera 1.4 and Vera version 6.2.8.
+
+
+Maintenance:
+------------
+
+To submit a bug report, use the corresponding menu entry within Vera Mode.
+Add a description of the problem and include a reproducible test case.
+
+Feel free to send questions and enhancement requests to <reto@gnu.org>.
+
+Official distribution is at
+<http://www.iis.ee.ethz.ch/~zimmi/emacs/vera-mode.html>.
+
+
+                                                  The Vera Mode Maintainer
+                                               Reto Zimmermann <reto@gnu.org>
+
+Key bindings:
+-------------
+
+\\{vera-mode-map}
+
+\(fn)" t nil)
+
 ;;;***
 \f
 ;;;### (autoloads (vhdl-mode) "vhdl-mode" "progmodes/vhdl-mode.el"
-;;;;;;  (17962 27361))
+;;;;;;  (18104 24769))
 ;;; Generated autoloads from progmodes/vhdl-mode.el
 
 (autoload (quote vhdl-mode) "vhdl-mode" "\
@@ -29811,7 +30186,7 @@ Key bindings:
 
 ;;;***
 \f
-;;;### (autoloads (vi-mode) "vi" "emulation/vi.el" (17788 40208))
+;;;### (autoloads (vi-mode) "vi" "emulation/vi.el" (17821 5856))
 ;;; Generated autoloads from emulation/vi.el
 
 (autoload (quote vi-mode) "vi" "\
@@ -29866,7 +30241,7 @@ Syntax table and abbrevs while in vi mode remain as they were in Emacs.
 ;;;### (autoloads (viqr-pre-write-conversion viqr-post-read-conversion
 ;;;;;;  viet-encode-viqr-buffer viet-encode-viqr-region viet-decode-viqr-buffer
 ;;;;;;  viet-decode-viqr-region viet-encode-viscii-char) "viet-util"
-;;;;;;  "language/viet-util.el" (17842 58278))
+;;;;;;  "language/viet-util.el" (18104 24758))
 ;;; Generated autoloads from language/viet-util.el
 
 (autoload (quote viet-encode-viscii-char) "viet-util" "\
@@ -29912,8 +30287,8 @@ Not documented
 \f
 ;;;### (autoloads (View-exit-and-edit view-mode-enter view-mode view-buffer-other-frame
 ;;;;;;  view-buffer-other-window view-buffer view-file-other-frame
-;;;;;;  view-file-other-window view-file) "view" "view.el" (18006
-;;;;;;  55796))
+;;;;;;  view-file-other-window view-file) "view" "view.el" (18104
+;;;;;;  24741))
 ;;; Generated autoloads from view.el
 
 (defvar view-mode nil "\
@@ -30122,8 +30497,8 @@ Exit View mode and make the current buffer editable.
 
 ;;;***
 \f
-;;;### (autoloads (vip-mode vip-setup) "vip" "emulation/vip.el" (17842
-;;;;;;  54264))
+;;;### (autoloads (vip-mode vip-setup) "vip" "emulation/vip.el" (18104
+;;;;;;  24748))
 ;;; Generated autoloads from emulation/vip.el
 
 (autoload (quote vip-setup) "vip" "\
@@ -30139,7 +30514,7 @@ Turn on VIP emulation of VI.
 ;;;***
 \f
 ;;;### (autoloads (viper-mode toggle-viper-mode) "viper" "emulation/viper.el"
-;;;;;;  (17921 23052))
+;;;;;;  (18104 24748))
 ;;; Generated autoloads from emulation/viper.el
 
 (autoload (quote toggle-viper-mode) "viper" "\
@@ -30156,7 +30531,7 @@ Turn on Viper emulation of Vi in Emacs. See Info node `(viper)Top'.
 ;;;***
 \f
 ;;;### (autoloads (warn lwarn display-warning) "warnings" "emacs-lisp/warnings.el"
-;;;;;;  (17935 13348))
+;;;;;;  (18104 24748))
 ;;; Generated autoloads from emacs-lisp/warnings.el
 
 (defvar warning-prefix-function nil "\
@@ -30246,7 +30621,7 @@ this is equivalent to `display-warning', using
 ;;;***
 \f
 ;;;### (autoloads (wdired-change-to-wdired-mode) "wdired" "wdired.el"
-;;;;;;  (17842 58278))
+;;;;;;  (18104 24742))
 ;;; Generated autoloads from wdired.el
 
 (autoload (quote wdired-change-to-wdired-mode) "wdired" "\
@@ -30262,7 +30637,7 @@ See `wdired-mode'.
 
 ;;;***
 \f
-;;;### (autoloads (webjump) "webjump" "net/webjump.el" (17842 55218))
+;;;### (autoloads (webjump) "webjump" "net/webjump.el" (18104 24760))
 ;;; Generated autoloads from net/webjump.el
 
 (autoload (quote webjump) "webjump" "\
@@ -30279,7 +30654,7 @@ Please submit bug reports and other feedback to the author, Neil W. Van Dyke
 ;;;***
 \f
 ;;;### (autoloads (which-function-mode) "which-func" "progmodes/which-func.el"
-;;;;;;  (17842 56332))
+;;;;;;  (18104 24769))
 ;;; Generated autoloads from progmodes/which-func.el
  (put 'which-func-format 'risky-local-variable t)
  (put 'which-func-current 'risky-local-variable t)
@@ -30312,7 +30687,7 @@ and off otherwise.
 ;;;;;;  whitespace-buffer whitespace-toggle-ateol-check whitespace-toggle-spacetab-check
 ;;;;;;  whitespace-toggle-indent-check whitespace-toggle-trailing-check
 ;;;;;;  whitespace-toggle-leading-check) "whitespace" "whitespace.el"
-;;;;;;  (17925 15266))
+;;;;;;  (18104 24742))
 ;;; Generated autoloads from whitespace.el
 
 (autoload (quote whitespace-toggle-leading-check) "whitespace" "\
@@ -30403,7 +30778,7 @@ This is meant to be added buffer-locally to `write-file-functions'.
 ;;;***
 \f
 ;;;### (autoloads (widget-minor-mode widget-browse-other-window widget-browse
-;;;;;;  widget-browse-at) "wid-browse" "wid-browse.el" (17842 58278))
+;;;;;;  widget-browse-at) "wid-browse" "wid-browse.el" (18104 24742))
 ;;; Generated autoloads from wid-browse.el
 
 (autoload (quote widget-browse-at) "wid-browse" "\
@@ -30430,8 +30805,8 @@ With arg, turn widget mode on if and only if arg is positive.
 ;;;***
 \f
 ;;;### (autoloads (widget-setup widget-insert widget-delete widget-create
-;;;;;;  widget-prompt-value widgetp) "wid-edit" "wid-edit.el" (17952
-;;;;;;  11093))
+;;;;;;  widget-prompt-value widgetp) "wid-edit" "wid-edit.el" (18104
+;;;;;;  24742))
 ;;; Generated autoloads from wid-edit.el
 
 (autoload (quote widgetp) "wid-edit" "\
@@ -30475,8 +30850,8 @@ Setup current buffer so editing string widgets works.
 ;;;***
 \f
 ;;;### (autoloads (windmove-default-keybindings windmove-down windmove-right
-;;;;;;  windmove-up windmove-left) "windmove" "windmove.el" (17842
-;;;;;;  58278))
+;;;;;;  windmove-up windmove-left) "windmove" "windmove.el" (18104
+;;;;;;  24742))
 ;;; Generated autoloads from windmove.el
 
 (autoload (quote windmove-left) "windmove" "\
@@ -30529,7 +30904,7 @@ Default MODIFIER is 'shift.
 ;;;***
 \f
 ;;;### (autoloads (winner-mode winner-mode) "winner" "winner.el"
-;;;;;;  (17842 58278))
+;;;;;;  (18104 24743))
 ;;; Generated autoloads from winner.el
 
 (defvar winner-mode nil "\
@@ -30548,7 +30923,7 @@ With arg, turn Winner mode on if and only if arg is positive.
 ;;;***
 \f
 ;;;### (autoloads (woman-find-file woman-dired-find-file woman) "woman"
-;;;;;;  "woman.el" (17949 41467))
+;;;;;;  "woman.el" (18104 24743))
 ;;; Generated autoloads from woman.el
 
 (autoload (quote woman) "woman" "\
@@ -30584,7 +30959,7 @@ decompress the file if appropriate.  See the documentation for the
 ;;;***
 \f
 ;;;### (autoloads (wordstar-mode) "ws-mode" "emulation/ws-mode.el"
-;;;;;;  (17842 54264))
+;;;;;;  (18104 24748))
 ;;; Generated autoloads from emulation/ws-mode.el
 
 (autoload (quote wordstar-mode) "ws-mode" "\
@@ -30697,7 +31072,7 @@ The key bindings are:
 ;;;***
 \f
 ;;;### (autoloads (xml-parse-region xml-parse-file) "xml" "xml.el"
-;;;;;;  (17916 14776))
+;;;;;;  (18104 24743))
 ;;; Generated autoloads from xml.el
 
 (autoload (quote xml-parse-file) "xml" "\
@@ -30722,8 +31097,8 @@ If PARSE-NS is non-nil, then QNAMES are expanded.
 
 ;;;***
 \f
-;;;### (autoloads (xterm-mouse-mode) "xt-mouse" "xt-mouse.el" (18007
-;;;;;;  39657))
+;;;### (autoloads (xterm-mouse-mode) "xt-mouse" "xt-mouse.el" (18104
+;;;;;;  24743))
 ;;; Generated autoloads from xt-mouse.el
 
 (defvar xterm-mouse-mode nil "\
@@ -30751,7 +31126,7 @@ down the SHIFT key while pressing the mouse button.
 ;;;***
 \f
 ;;;### (autoloads (yenc-extract-filename yenc-decode-region) "yenc"
-;;;;;;  "gnus/yenc.el" (17842 54741))
+;;;;;;  "gnus/yenc.el" (18104 24756))
 ;;; Generated autoloads from gnus/yenc.el
 
 (autoload (quote yenc-decode-region) "yenc" "\
@@ -30767,7 +31142,7 @@ Extract file name from an yenc header.
 ;;;***
 \f
 ;;;### (autoloads (psychoanalyze-pinhead apropos-zippy insert-zippyism
-;;;;;;  yow) "yow" "play/yow.el" (17842 55395))
+;;;;;;  yow) "yow" "play/yow.el" (18104 24762))
 ;;; Generated autoloads from play/yow.el
 
 (autoload (quote yow) "yow" "\
@@ -30793,7 +31168,7 @@ Zippy goes to the analyst.
 
 ;;;***
 \f
-;;;### (autoloads (zone) "zone" "play/zone.el" (17941 38806))
+;;;### (autoloads (zone) "zone" "play/zone.el" (18104 24762))
 ;;; Generated autoloads from play/zone.el
 
 (autoload (quote zone) "zone" "\
@@ -30827,32 +31202,32 @@ Zone out, completely.
 ;;;;;;  "ediff-init.el" "ediff-merg.el" "ediff-ptch.el" "ediff-vers.el"
 ;;;;;;  "ediff-wind.el" "electric.el" "emacs-lisp/assoc.el" "emacs-lisp/authors.el"
 ;;;;;;  "emacs-lisp/bindat.el" "emacs-lisp/byte-opt.el" "emacs-lisp/byte-run.el"
-;;;;;;  "emacs-lisp/cl-compat.el" "emacs-lisp/cl-extra.el" "emacs-lisp/cl-macs.el"
-;;;;;;  "emacs-lisp/cl-seq.el" "emacs-lisp/cl-specs.el" "emacs-lisp/cust-print.el"
-;;;;;;  "emacs-lisp/find-gc.el" "emacs-lisp/float-sup.el" "emacs-lisp/gulp.el"
-;;;;;;  "emacs-lisp/levents.el" "emacs-lisp/lisp-mnt.el" "emacs-lisp/lisp-mode.el"
-;;;;;;  "emacs-lisp/lisp.el" "emacs-lisp/lmenu.el" "emacs-lisp/lselect.el"
-;;;;;;  "emacs-lisp/lucid.el" "emacs-lisp/map-ynp.el" "emacs-lisp/regi.el"
-;;;;;;  "emacs-lisp/sregex.el" "emacs-lisp/syntax.el" "emacs-lisp/tcover-ses.el"
-;;;;;;  "emacs-lisp/tcover-unsafep.el" "emacs-lock.el" "emulation/cua-gmrk.el"
-;;;;;;  "emulation/cua-rect.el" "emulation/edt-lk201.el" "emulation/edt-mapper.el"
-;;;;;;  "emulation/edt-pc.el" "emulation/edt-vt100.el" "emulation/tpu-mapper.el"
-;;;;;;  "emulation/viper-cmd.el" "emulation/viper-ex.el" "emulation/viper-init.el"
-;;;;;;  "emulation/viper-keym.el" "emulation/viper-macs.el" "emulation/viper-mous.el"
-;;;;;;  "emulation/viper-util.el" "env.el" "erc/erc-backend.el" "erc/erc-goodies.el"
-;;;;;;  "erc/erc-ibuffer.el" "erc/erc-lang.el" "erc/erc-nicklist.el"
-;;;;;;  "eshell/em-alias.el" "eshell/em-banner.el" "eshell/em-basic.el"
-;;;;;;  "eshell/em-cmpl.el" "eshell/em-dirs.el" "eshell/em-glob.el"
-;;;;;;  "eshell/em-hist.el" "eshell/em-ls.el" "eshell/em-pred.el"
-;;;;;;  "eshell/em-prompt.el" "eshell/em-rebind.el" "eshell/em-script.el"
-;;;;;;  "eshell/em-smart.el" "eshell/em-term.el" "eshell/em-unix.el"
-;;;;;;  "eshell/em-xtra.el" "eshell/esh-arg.el" "eshell/esh-cmd.el"
-;;;;;;  "eshell/esh-ext.el" "eshell/esh-groups.el" "eshell/esh-io.el"
-;;;;;;  "eshell/esh-maint.el" "eshell/esh-module.el" "eshell/esh-opt.el"
-;;;;;;  "eshell/esh-proc.el" "eshell/esh-util.el" "eshell/esh-var.el"
-;;;;;;  "ezimage.el" "faces.el" "files.el" "finder-inf.el" "foldout.el"
-;;;;;;  "font-core.el" "font-lock.el" "format.el" "forms-d2.el" "forms-pass.el"
-;;;;;;  "frame.el" "fringe.el" "generic-x.el" "gnus/compface.el"
+;;;;;;  "emacs-lisp/cl-compat.el" "emacs-lisp/cl-extra.el" "emacs-lisp/cl-loaddefs.el"
+;;;;;;  "emacs-lisp/cl-macs.el" "emacs-lisp/cl-seq.el" "emacs-lisp/cl-specs.el"
+;;;;;;  "emacs-lisp/cust-print.el" "emacs-lisp/find-gc.el" "emacs-lisp/float-sup.el"
+;;;;;;  "emacs-lisp/gulp.el" "emacs-lisp/levents.el" "emacs-lisp/lisp-mnt.el"
+;;;;;;  "emacs-lisp/lisp-mode.el" "emacs-lisp/lisp.el" "emacs-lisp/lmenu.el"
+;;;;;;  "emacs-lisp/lselect.el" "emacs-lisp/lucid.el" "emacs-lisp/map-ynp.el"
+;;;;;;  "emacs-lisp/regi.el" "emacs-lisp/sregex.el" "emacs-lisp/syntax.el"
+;;;;;;  "emacs-lisp/tcover-ses.el" "emacs-lisp/tcover-unsafep.el"
+;;;;;;  "emacs-lock.el" "emulation/cua-gmrk.el" "emulation/cua-rect.el"
+;;;;;;  "emulation/edt-lk201.el" "emulation/edt-mapper.el" "emulation/edt-pc.el"
+;;;;;;  "emulation/edt-vt100.el" "emulation/tpu-mapper.el" "emulation/viper-cmd.el"
+;;;;;;  "emulation/viper-ex.el" "emulation/viper-init.el" "emulation/viper-keym.el"
+;;;;;;  "emulation/viper-macs.el" "emulation/viper-mous.el" "emulation/viper-util.el"
+;;;;;;  "env.el" "erc/erc-backend.el" "erc/erc-goodies.el" "erc/erc-ibuffer.el"
+;;;;;;  "erc/erc-lang.el" "eshell/em-alias.el" "eshell/em-banner.el"
+;;;;;;  "eshell/em-basic.el" "eshell/em-cmpl.el" "eshell/em-dirs.el"
+;;;;;;  "eshell/em-glob.el" "eshell/em-hist.el" "eshell/em-ls.el"
+;;;;;;  "eshell/em-pred.el" "eshell/em-prompt.el" "eshell/em-rebind.el"
+;;;;;;  "eshell/em-script.el" "eshell/em-smart.el" "eshell/em-term.el"
+;;;;;;  "eshell/em-unix.el" "eshell/em-xtra.el" "eshell/esh-arg.el"
+;;;;;;  "eshell/esh-cmd.el" "eshell/esh-ext.el" "eshell/esh-groups.el"
+;;;;;;  "eshell/esh-io.el" "eshell/esh-maint.el" "eshell/esh-module.el"
+;;;;;;  "eshell/esh-opt.el" "eshell/esh-proc.el" "eshell/esh-util.el"
+;;;;;;  "eshell/esh-var.el" "ezimage.el" "faces.el" "files.el" "finder-inf.el"
+;;;;;;  "foldout.el" "font-core.el" "font-lock.el" "format.el" "forms-d2.el"
+;;;;;;  "forms-pass.el" "frame.el" "fringe.el" "generic-x.el" "gnus/compface.el"
 ;;;;;;  "gnus/dig.el" "gnus/dns.el" "gnus/format-spec.el" "gnus/gnus-async.el"
 ;;;;;;  "gnus/gnus-bcklg.el" "gnus/gnus-cite.el" "gnus/gnus-cus.el"
 ;;;;;;  "gnus/gnus-demon.el" "gnus/gnus-dup.el" "gnus/gnus-eform.el"
@@ -30900,17 +31275,17 @@ Zone out, completely.
 ;;;;;;  "mh-e/mh-acros.el" "mh-e/mh-alias.el" "mh-e/mh-buffers.el"
 ;;;;;;  "mh-e/mh-compat.el" "mh-e/mh-funcs.el" "mh-e/mh-gnus.el"
 ;;;;;;  "mh-e/mh-identity.el" "mh-e/mh-inc.el" "mh-e/mh-junk.el"
-;;;;;;  "mh-e/mh-letter.el" "mh-e/mh-limit.el" "mh-e/mh-loaddefs.el"
-;;;;;;  "mh-e/mh-mime.el" "mh-e/mh-print.el" "mh-e/mh-scan.el" "mh-e/mh-search.el"
+;;;;;;  "mh-e/mh-letter.el" "mh-e/mh-limit.el" "mh-e/mh-mime.el"
+;;;;;;  "mh-e/mh-print.el" "mh-e/mh-scan.el" "mh-e/mh-search.el"
 ;;;;;;  "mh-e/mh-seq.el" "mh-e/mh-show.el" "mh-e/mh-speed.el" "mh-e/mh-thread.el"
 ;;;;;;  "mh-e/mh-tool-bar.el" "mh-e/mh-utils.el" "mh-e/mh-xface.el"
 ;;;;;;  "misc.el" "mouse-copy.el" "mouse-drag.el" "mouse.el" "net/eudc-vars.el"
 ;;;;;;  "net/eudcb-bbdb.el" "net/eudcb-ldap.el" "net/eudcb-mab.el"
-;;;;;;  "net/eudcb-ph.el" "net/ldap.el" "net/netrc.el" "net/tls.el"
-;;;;;;  "net/tramp-smb.el" "net/tramp-util.el" "net/tramp-uu.el"
-;;;;;;  "net/tramp-vc.el" "net/trampver.el" "patcomp.el" "paths.el"
-;;;;;;  "pcvs-info.el" "pcvs-parse.el" "pcvs-util.el" "pgg-def.el"
-;;;;;;  "pgg-parse.el" "pgg-pgp.el" "pgg-pgp5.el" "play/gamegrid.el"
+;;;;;;  "net/eudcb-ph.el" "net/ldap.el" "net/netrc.el" "net/socks.el"
+;;;;;;  "net/tls.el" "net/tramp-cache.el" "net/tramp-fish.el" "net/tramp-gw.el"
+;;;;;;  "net/tramp-smb.el" "net/tramp-uu.el" "net/trampver.el" "patcomp.el"
+;;;;;;  "paths.el" "pcvs-info.el" "pcvs-parse.el" "pcvs-util.el"
+;;;;;;  "pgg-def.el" "pgg-parse.el" "pgg-pgp.el" "pgg-pgp5.el" "play/gamegrid.el"
 ;;;;;;  "play/gametree.el" "play/meese.el" "progmodes/ada-prj.el"
 ;;;;;;  "progmodes/cc-align.el" "progmodes/cc-awk.el" "progmodes/cc-bytecomp.el"
 ;;;;;;  "progmodes/cc-cmds.el" "progmodes/cc-defs.el" "progmodes/cc-fonts.el"
@@ -30919,21 +31294,21 @@ Zone out, completely.
 ;;;;;;  "progmodes/ebnf-iso.el" "progmodes/ebnf-otz.el" "progmodes/ebnf-yac.el"
 ;;;;;;  "progmodes/idlw-complete-structtag.el" "progmodes/idlw-help.el"
 ;;;;;;  "progmodes/idlw-toolbar.el" "progmodes/mantemp.el" "progmodes/xscheme.el"
-;;;;;;  "register.el" "replace.el" "rfn-eshadow.el" "s-region.el"
-;;;;;;  "saveplace.el" "sb-image.el" "scroll-bar.el" "select.el"
-;;;;;;  "soundex.el" "startup.el" "subdirs.el" "tempo.el" "textmodes/bib-mode.el"
-;;;;;;  "textmodes/makeinfo.el" "textmodes/page-ext.el" "textmodes/page.el"
-;;;;;;  "textmodes/refbib.el" "textmodes/refer.el" "textmodes/reftex-auc.el"
-;;;;;;  "textmodes/reftex-dcr.el" "textmodes/reftex-ref.el" "textmodes/reftex-sel.el"
-;;;;;;  "textmodes/reftex-toc.el" "textmodes/texnfo-upd.el" "textmodes/text-mode.el"
-;;;;;;  "timezone.el" "tooltip.el" "tree-widget.el" "uniquify.el"
-;;;;;;  "url/url-about.el" "url/url-cookie.el" "url/url-dired.el"
-;;;;;;  "url/url-expand.el" "url/url-ftp.el" "url/url-history.el"
-;;;;;;  "url/url-imap.el" "url/url-methods.el" "url/url-nfs.el" "url/url-proxy.el"
-;;;;;;  "url/url-vars.el" "url/vc-dav.el" "vc-hooks.el" "vcursor.el"
-;;;;;;  "version.el" "vms-patch.el" "vmsproc.el" "vt-control.el"
-;;;;;;  "vt100-led.el" "w32-fns.el" "w32-vars.el" "widget.el" "window.el"
-;;;;;;  "x-dnd.el") (18016 62249 573562))
+;;;;;;  "ps-mule.el" "register.el" "replace.el" "rfn-eshadow.el"
+;;;;;;  "s-region.el" "saveplace.el" "sb-image.el" "scroll-bar.el"
+;;;;;;  "select.el" "soundex.el" "startup.el" "subdirs.el" "tempo.el"
+;;;;;;  "termdev.el" "textmodes/bib-mode.el" "textmodes/makeinfo.el"
+;;;;;;  "textmodes/page-ext.el" "textmodes/page.el" "textmodes/refbib.el"
+;;;;;;  "textmodes/refer.el" "textmodes/reftex-auc.el" "textmodes/reftex-dcr.el"
+;;;;;;  "textmodes/reftex-ref.el" "textmodes/reftex-sel.el" "textmodes/reftex-toc.el"
+;;;;;;  "textmodes/texnfo-upd.el" "textmodes/text-mode.el" "timezone.el"
+;;;;;;  "tooltip.el" "tree-widget.el" "uniquify.el" "url/url-about.el"
+;;;;;;  "url/url-cookie.el" "url/url-dired.el" "url/url-expand.el"
+;;;;;;  "url/url-ftp.el" "url/url-history.el" "url/url-imap.el" "url/url-methods.el"
+;;;;;;  "url/url-nfs.el" "url/url-proxy.el" "url/url-vars.el" "url/vc-dav.el"
+;;;;;;  "vc-hooks.el" "vcursor.el" "version.el" "vms-patch.el" "vmsproc.el"
+;;;;;;  "vt-control.el" "vt100-led.el" "w32-fns.el" "w32-vars.el"
+;;;;;;  "widget.el" "window.el" "x-dnd.el") (18104 28510 272741))
 
 ;;;***
 \f
index 17ff7a423baa79b7d18791b0725a5b86665c25cf..8789c6db37182c8e019384547a55a1abf0c5d7bd 100644 (file)
 (load "widget")
 (load "custom")
 (load "emacs-lisp/map-ynp")
-(load "env")
 (load "cus-start")
 (load "international/mule")
 (load "international/mule-conf.el") ;Don't get confused if someone compiled this by mistake.
+(load "env")
 (load "format")
 (load "bindings")
 (setq load-source-file-function 'load-with-code-conversion)
@@ -74,6 +74,9 @@
 (load "cus-face")
 (load "faces")  ; after here, `defface' may be used.
 
+(load "button")
+(load "startup")
+
 (message "Lists of integers (garbage collection statistics) are normal output")
 (message "while building Emacs; they do not indicate a problem.")
 (message "%s" (garbage-collect))
@@ -81,7 +84,6 @@
 (message "%s" (garbage-collect))
 (load "simple")
 
-(load "button")
 (load "help")
 
 (load "jka-cmpr-hook")
 (message "%s" (garbage-collect))
 (load "menu-bar")
 (load "paths.el")  ;Don't get confused if someone compiled paths by mistake.
-(load "startup")
 (load "emacs-lisp/lisp")
 (load "textmodes/page")
 (load "register")
       (load "mwheel")
       (load "tool-bar")))
 (if (featurep 'x)
-    (load "x-dnd"))
+    (progn
+      (load "x-dnd")
+      (load "term/x-win")))
+      
 (message "%s" (garbage-collect))
 
 (if (eq system-type 'vax-vms)
       (load "vms-patch")))
 (if (eq system-type 'windows-nt)
     (progn
+      (load "international/ccl")
+      (load "international/code-pages")
+      (load "term/w32-win")
       (load "ls-lisp")
       (load "disp-table") ; needed to setup ibm-pc char set, see internal.el
       (load "dos-w32")
 (if (eq system-type 'macos)
     (progn
       (load "ls-lisp")))
+(if (featurep 'mac-carbon)
+    (progn
+      (load "term/mac-win")))
 (if (fboundp 'atan)    ; preload some constants and
     (progn             ; floating pt. functions if we have float support.
       (load "emacs-lisp/float-sup")))
index a904a0355ddf6b00722dfde9c888da55e31bb453..b215917a559155efacf9fe25c3ca6b87dc4fc503 100644 (file)
     ("m" . log-view-toggle-mark-entry)
     ;; ("e" . cvs-mode-edit-log)
     ("d" . log-view-diff)
+    ("a" . log-view-annotate-version)
     ("f" . log-view-find-version)
     ("n" . log-view-msg-next)
     ("p" . log-view-msg-prev)
+    ("\t" . log-view-msg-next)
+    ([backtab] . log-view-msg-prev)
     ("N" . log-view-file-next)
     ("P" . log-view-file-prev)
     ("\M-n" . log-view-file-next)
     ["Mark Log Entry for Diff"  set-mark-command]
     ["Diff Revisions"  log-view-diff]
     ["Visit Version"  log-view-find-version]
+    ["Annotate Version"  log-view-annotate-version]
     ["Next Log Entry"  log-view-msg-next]
     ["Previous Log Entry"  log-view-msg-prev]
     ["Next File"  log-view-file-next]
@@ -187,6 +191,10 @@ The match group number 1 should match the revision number itself.")
   "Major mode for browsing CVS log output."
   (setq buffer-read-only t)
   (set (make-local-variable 'font-lock-defaults) log-view-font-lock-defaults)
+  (set (make-local-variable 'beginning-of-defun-function) 
+       'log-view-beginning-of-defun)
+  (set (make-local-variable 'end-of-defun-function) 
+       'log-view-end-of-defun)
   (set (make-local-variable 'cvs-minor-wrap-function) 'log-view-minor-wrap))
 
 ;;;;
@@ -214,7 +222,8 @@ The match group number 1 should match the revision number itself.")
   (save-excursion
     (forward-line 1)
     (or (re-search-backward log-view-file-re nil t)
-       (re-search-forward log-view-file-re))
+       (re-search-forward log-view-file-re nil t)
+       (error "Unable to determine the current file"))
     (let* ((file (match-string 1))
           (cvsdir (and (re-search-backward log-view-dir-re nil t)
                        (match-string 1)))
@@ -280,6 +289,51 @@ log entries."
          (setq pos (overlay-end ov))))
       marked-list)))
 
+(defun log-view-beginning-of-defun ()
+  ;; This assumes that a log entry starts with a line matching
+  ;; `log-view-message-re'.  Modes that derive from `log-view-mode'
+  ;; for which this assumption is not valid will have to provide
+  ;; another implementation of this function.  `log-view-msg-prev'
+  ;; does a similar job to this function, we can't use it here
+  ;; directly because it prints messages that are not appropriate in
+  ;; this context and it does not move to the beginning of the buffer
+  ;; when the point is before the first log entry.
+
+  ;; `log-view-beginning-of-defun' and `log-view-end-of-defun' have
+  ;; been checked to work with logs produced by RCS, CVS, git,
+  ;; mercurial and subversion.
+
+  (re-search-backward log-view-message-re nil 'move))
+
+(defun log-view-end-of-defun ()
+  ;; The idea in this function is to search for the beginning of the
+  ;; next log entry using `log-view-message-re' and then go back one
+  ;; line when finding it.  Modes that derive from `log-view-mode' for
+  ;; which this assumption is not valid will have to provide another
+  ;; implementation of this function.
+
+  ;; Look back and if there is no entry there it means we are before
+  ;; the first log entry, so go forward until finding one.
+  (unless (save-excursion (re-search-backward log-view-message-re nil t))
+    (re-search-forward log-view-message-re nil t))
+
+  ;; In case we are at the end of log entry going forward a line will
+  ;; make us find the next entry when searching. If we are inside of
+  ;; an entry going forward a line will still keep the point inside
+  ;; the same entry.
+  (forward-line 1)
+
+  ;; In case we are at the beginning of an entry, move past it.
+  (when (looking-at log-view-message-re)
+    (goto-char (match-end 0))
+    (forward-line 1))
+
+  ;; Search for the start of the next log entry.  Go to the end of the
+  ;; buffer if we could not find a next entry.
+  (when (re-search-forward log-view-message-re nil 'move)
+    (goto-char (match-beginning 0))
+    (forward-line -1)))
+
 (defvar cvs-minor-current-files)
 (defvar cvs-branch-prefix)
 (defvar cvs-secondary-branch-prefix)
@@ -319,6 +373,14 @@ log entries."
     (switch-to-buffer (vc-find-version (log-view-current-file)
                                        (log-view-current-tag)))))
 
+(defun log-view-annotate-version (pos)
+  "Annotate the version at point."
+  (interactive "d")
+  (save-excursion
+    (goto-char pos)
+    (switch-to-buffer (vc-annotate (log-view-current-file)
+                                  (log-view-current-tag)))))
+
 ;;
 ;; diff
 ;;
index fbecb2ee593aed2924e93c0816a4d39f39f992ea..96d69dc0bb7aeb857124490a7a96139c953eae3f 100644 (file)
@@ -189,7 +189,7 @@ cvs-update: recompile autoloads finder-data custom-deps
 # Update the AUTHORS file.
 
 update-authors:
-       $(emacs) -l authors -f batch-update-authors $(srcdir)/AUTHORS $(srcdir)
+       $(emacs) -l authors -f batch-update-authors $(srcdir)/etc/AUTHORS $(srcdir)
 
 TAGS: $(lisptagsfiles1) $(lisptagsfiles2)
        $(ETAGS) $(lisptagsfiles1) $(lisptagsfiles2)
index c7593e88dda20027dcd1c6ded084c84591a2fb01..fc84f32727169ae13b40418c4de99264ca942438 100644 (file)
@@ -652,7 +652,13 @@ If POS is nil, the current point is used."
       (skip-chars-backward "-a-zA-Z0-9._+:")
       (let ((start (point)))
        (skip-chars-forward "-a-zA-Z0-9._+:")
-       (setq word (buffer-substring-no-properties start (point))))
+       ;; If there is a continuation at the end of line, check the
+       ;; following line too, eg:
+       ;;     see this-
+       ;;     command-here(1)
+       (setq word (buffer-substring-no-properties start (point)))
+       (if (looking-at "[ \t\r\n]+\\([-a-zA-Z0-9._+:]+\\)([0-9])")
+           (setq word (concat word (match-string 1)))))
       (if (string-match "[._]+$" word)
          (setq word (substring word 0 (match-beginning 0))))
       ;; If looking at something like *strcat(... , remove the '*'
index 1d125e45d9564ae44e29fe5ba80aeb96ac20e159..c1fd0780730ff0cf70ef2bb55d19b17a9458dc9a 100644 (file)
 
 ;;; Code:
 
+(defvar minibuf-depth-indicator-function nil
+  "If non-nil, function to set up the minibuffer depth indicator.
+It is called with one argument, the minibuffer depth,
+and must return a string.")
+
 ;; An overlay covering the prompt.  This is a buffer-local variable in
 ;; each affected minibuffer.
 ;;
@@ -45,8 +50,9 @@ The prompt should already have been inserted."
   (when (> (minibuffer-depth) 1)
     (setq minibuf-depth-overlay (make-overlay (point-min) (1+ (point-min))))
     (overlay-put minibuf-depth-overlay 'before-string
-                (propertize (format "[%d]" (minibuffer-depth))
-                            'face 'highlight))
+                (if minibuf-depth-indicator-function
+                    (funcall minibuf-depth-indicator-function (minibuffer-depth))
+                  (propertize (format "[%d]" (minibuffer-depth)) 'face 'highlight)))
     (overlay-put minibuf-depth-overlay 'evaporate t)))
 
 ;;;###autoload
index 148e59160974c4af619891a5fb69f983a5dc5bf9..d0da787b8a90b5204b99b2543281de9f7c5b7948 100644 (file)
@@ -929,15 +929,15 @@ mail status in mode line"))
        :button `(:toggle . tooltip-mode)))
 
 (define-key menu-bar-showhide-menu [menu-bar-mode]
-  '(menu-item "Menu-bar" menu-bar-mode
+  '(menu-item "Menu-bar" toggle-menu-bar-mode-from-frame
              :help "Turn menu-bar on/off"
-             :button (:toggle . menu-bar-mode)))
+             :button (:toggle . (> (frame-parameter nil 'menu-bar-lines) 0))))
 
 (define-key menu-bar-showhide-menu [showhide-tool-bar]
-  (list 'menu-item "Tool-bar" 'tool-bar-mode
-       :help "Turn tool-bar on/off"
+  (list 'menu-item "Tool-bar" 'toggle-tool-bar-mode-from-frame
+       :help "Toggle tool-bar on/off"
        :visible `(display-graphic-p)
-       :button `(:toggle . tool-bar-mode)))
+       :button `(:toggle . (> (frame-parameter nil 'tool-bar-lines) 0))))
 
 (define-key menu-bar-options-menu [showhide]
   (list 'menu-item "Show/Hide" menu-bar-showhide-menu))
@@ -1253,7 +1253,8 @@ key, a click, or a menu-item"))
   '(menu-item "Describe Buffer Modes" describe-mode
              :help "Describe this buffer's major and minor mode"))
 
-(defvar menu-bar-apropos-menu (make-sparse-keymap "Apropos"))
+(defvar menu-bar-search-documentation-menu
+  (make-sparse-keymap "Search Documentation"))
 (defun menu-bar-read-lispref ()
   "Display the Emacs Lisp Reference manual in Info mode."
   (interactive)
@@ -1281,37 +1282,37 @@ key, a click, or a menu-item"))
   (info "elisp")
   (Info-index topic))
 
-(define-key menu-bar-apropos-menu [apropos-documentation]
+(define-key menu-bar-search-documentation-menu [search-documentation-strings]
   '(menu-item "Search Documentation Strings..." apropos-documentation
               :help
              "Find functions and variables whose doc strings match a regexp"))
-(define-key menu-bar-apropos-menu [apropos]
+(define-key menu-bar-search-documentation-menu [find-any-object-by-name]
   '(menu-item "Find Any Object by Name..."  apropos
               :help "Find symbols of any kind whose names match a regexp"))
-(define-key menu-bar-apropos-menu [apropos-value]
+(define-key menu-bar-search-documentation-menu [find-option-by-value]
   '(menu-item "Find Options by Value..." apropos-value
               :help "Find variables whose values match a regexp"))
-(define-key menu-bar-apropos-menu [apropos-variables]
+(define-key menu-bar-search-documentation-menu [find-options-by-name]
   '(menu-item "Find Options by Name..." apropos-variable
              :help "Find variables whose names match a regexp"))
-(define-key menu-bar-apropos-menu [apropos-commands]
+(define-key menu-bar-search-documentation-menu [find-commands-by-name]
   '(menu-item "Find Commands by Name..." apropos-command
              :help "Find commands whose names match a regexp"))
-(define-key menu-bar-apropos-menu [sep1]
+(define-key menu-bar-search-documentation-menu [sep1]
   '("--"))
-(define-key menu-bar-apropos-menu [emacs-command-node]
+(define-key menu-bar-search-documentation-menu [lookup-command-in-manual]
   '(menu-item "Look Up Command in User Manual..." Info-goto-emacs-command-node
              :help "Display manual section that describes a command"))
-(define-key menu-bar-apropos-menu [emacs-key-command-node]
+(define-key menu-bar-search-documentation-menu [lookup-key-in-manual]
   '(menu-item "Look Up Key in User Manual..." Info-goto-emacs-key-command-node
              :help "Display manual section that describes a key"))
-(define-key menu-bar-apropos-menu [elisp-index-search]
+(define-key menu-bar-search-documentation-menu [lookup-subject-in-elisp-manual]
   '(menu-item "Look Up Subject in ELisp Manual..." elisp-index-search
              :help "Find description of a subject in Emacs Lisp manual"))
-(define-key menu-bar-apropos-menu [emacs-index-search]
+(define-key menu-bar-search-documentation-menu [lookup-subject-in-emacs-manual]
   '(menu-item "Look Up Subject in User Manual..." emacs-index-search
              :help "Find description of a subject in Emacs User manual"))
-(define-key menu-bar-apropos-menu [emacs-glossary]
+(define-key menu-bar-search-documentation-menu [emacs-terminology]
   '(menu-item "Emacs Terminology" search-emacs-glossary
              :help "Display the Glossary section of the Emacs manual"))
 
@@ -1325,22 +1326,25 @@ key, a click, or a menu-item"))
 (define-key menu-bar-manuals-menu [order-emacs-manuals]
   '(menu-item "Ordering Manuals" view-order-manuals
              :help "How to order manuals from the Free Software Foundation"))
-(define-key menu-bar-manuals-menu [info-apropos]
+(define-key menu-bar-manuals-menu [lookup-subject-in-all-manuals]
   '(menu-item "Lookup Subject in all manuals..." info-apropos
              :help "Find description of a subject in all installed manuals"))
-(define-key menu-bar-manuals-menu [info]
+(define-key menu-bar-manuals-menu [other-manuals]
   '(menu-item "All Other Manuals (Info)" Info-directory
              :help "Read any of the installed manuals"))
-(define-key menu-bar-manuals-menu [info-elisp]
+(define-key menu-bar-manuals-menu [emacs-lisp-reference]
   '(menu-item "Emacs Lisp Reference" menu-bar-read-lispref
              :help "Read the Emacs Lisp Reference manual"))
-(define-key menu-bar-manuals-menu [info-elintro]
+(define-key menu-bar-manuals-menu [emac-lisp-intro]
   '(menu-item "Introduction to Emacs Lisp" menu-bar-read-lispintro
              :help "Read the Introduction to Emacs Lisp Programming"))
 
-(define-key menu-bar-help-menu [eliza]
-  '(menu-item "Emacs Psychotherapist" doctor
-             :help "Our doctor will help you feel better"))
+(define-key menu-bar-help-menu [describe-project]
+  '(menu-item "About GNU" describe-project
+             :help "About the GNU System, GNU Project, and GNU/Linux"))
+(define-key menu-bar-help-menu [about]
+  '(menu-item "About Emacs" about-emacs
+             :help "Display version number, copyright info, and basic help"))
 (define-key menu-bar-help-menu [sep4]
   '("--"))
 (define-key menu-bar-help-menu [describe-no-warranty]
@@ -1349,15 +1353,9 @@ key, a click, or a menu-item"))
 (define-key menu-bar-help-menu [describe-copying]
   '(menu-item "Copying Conditions" describe-copying
              :help "Show the Emacs license (GPL)"))
-(define-key menu-bar-help-menu [describe-project]
-  '(menu-item "About GNU" describe-project
-             :help "About the GNU System, GNU Project, and GNU/Linux"))
 (define-key menu-bar-help-menu [describe-distribution]
   '(menu-item "Getting New Versions" describe-distribution
              :help "How to get latest versions of Emacs"))
-(define-key menu-bar-help-menu [more]
-  '(menu-item "External Packages" menu-bar-help-extra-packages
-             :help "Lisp packages distributed separately for use in Emacs"))
 (defun menu-bar-help-extra-packages ()
   "Display help about some additional packages available for Emacs."
   (interactive)
@@ -1365,29 +1363,32 @@ key, a click, or a menu-item"))
     (view-file (expand-file-name "MORE.STUFF"
                                 data-directory))
     (goto-address)))
-(define-key menu-bar-help-menu [about]
-  '(menu-item "About Emacs" about-emacs
-             :help "Display version number, copyright info, and basic help"))
 (define-key menu-bar-help-menu [sep2]
   '("--"))
+(define-key menu-bar-help-menu [more]
+  '(menu-item "External Packages" menu-bar-help-extra-packages
+             :help "Lisp packages distributed separately for use in Emacs"))
 (define-key menu-bar-help-menu [finder-by-keyword]
   '(menu-item "Find Emacs Packages" finder-by-keyword
              :help "Find packages and features by keyword"))
-(define-key menu-bar-help-menu [manuals]
+(define-key menu-bar-help-menu [more-manuals]
   (list 'menu-item "More Manuals" menu-bar-manuals-menu))
 (define-key menu-bar-help-menu [emacs-manual]
   '(menu-item "Read the Emacs Manual" info-emacs-manual
              :help "Full documentation of Emacs features"))
 (define-key menu-bar-help-menu [describe]
   (list 'menu-item "Describe" menu-bar-describe-menu))
-(define-key menu-bar-help-menu [apropos]
-  (list 'menu-item "Search Documentation" menu-bar-apropos-menu))
+(define-key menu-bar-help-menu [search-documentation]
+  (list 'menu-item "Search Documentation" menu-bar-search-documentation-menu))
 (define-key menu-bar-help-menu [sep1]
   '("--"))
+(define-key menu-bar-help-menu [eliza]
+  '(menu-item "Emacs Psychotherapist" doctor
+             :help "Our doctor will help you feel better"))
 (define-key menu-bar-help-menu [report-emacs-bug]
   '(menu-item "Send Bug Report..." report-emacs-bug
              :help "Send e-mail to Emacs maintainers"))
-(define-key menu-bar-help-menu [emacs-problems]
+(define-key menu-bar-help-menu [emacs-known-problems]
   '(menu-item "Emacs Known Problems" view-emacs-problems
              :help "Read about known problems with Emacs"))
 (define-key menu-bar-help-menu [emacs-news]
@@ -1749,18 +1750,10 @@ turn on menu bars; otherwise, turn off menu bars."
   :init-value nil
   :global t
   :group 'frames
+
   ;; Make menu-bar-mode and default-frame-alist consistent.
-  (let ((lines (if menu-bar-mode 1 0)))
-    ;; Alter existing frames...
-    (mapc (lambda (frame)
-           (modify-frame-parameters frame
-                                    (list (cons 'menu-bar-lines lines))))
-         (frame-list))
-    ;; ...and future ones.
-    (let ((elt (assq 'menu-bar-lines default-frame-alist)))
-      (if elt
-         (setcdr elt lines)
-       (add-to-list 'default-frame-alist (cons 'menu-bar-lines lines)))))
+  (modify-all-frames-parameters (list (cons 'menu-bar-lines
+                                           (if menu-bar-mode 1 0))))
 
   ;; Make the message appear when Emacs is idle.  We can not call message
   ;; directly.  The minor-mode message "Menu-bar mode disabled" comes
@@ -1770,6 +1763,30 @@ turn on menu bars; otherwise, turn off menu bars."
                         "Menu-bar mode disabled.  Use M-x menu-bar-mode to make the menu bar appear."))
   menu-bar-mode)
 
+(defun toggle-menu-bar-mode-from-frame (&optional arg)
+  "Toggle menu bar on or off, based on the status of the current frame.
+See `menu-bar-mode' for more information."
+  (interactive (list (or current-prefix-arg 'toggle)))
+  (if (eq arg 'toggle)
+      (menu-bar-mode (if (> (frame-parameter nil 'menu-bar-lines) 0) 0 1))
+    (menu-bar-mode arg)))
+
+(defun menu-bar-open (&optional frame)
+  "Start key navigation of the menu bar in FRAME.
+
+This function decides which method to use to access the menu
+depending on FRAME's terminal device.  On X displays, it calls
+`x-menu-bar-open'; otherwise it calls `tmm-menubar'.
+
+If FRAME is nil or not given, use the selected frame."
+  (interactive)
+  (if (eq window-system 'x)
+      (x-menu-bar-open frame)
+    (with-selected-frame (or frame (selected-frame))
+      (tmm-menubar))))
+
+(global-set-key [f10] 'menu-bar-open)
+
 (provide 'menu-bar)
 
 ;;; arch-tag: 6e6a3c22-4ec4-4d3d-8190-583f8ef94ced
index 71522cd128550fa8ffdf8400b26ff5a899398ce4..6b0589da43d45e2be638851f00f74c9b7c5d0068 100644 (file)
@@ -194,7 +194,7 @@ two semi-colons.")
     (extra-line        . (t nil t t))
     (box       . (nil t t t))
     (box-multi . (t t t t)))
-  "Possible comment styles of the form (STYLE . (MULTI ALIGN EXTRA INDENT)).
+  "Comment region styles of the form (STYLE . (MULTI ALIGN EXTRA INDENT)).
 STYLE should be a mnemonic symbol.
 MULTI specifies that comments are allowed to span multiple lines.
 ALIGN specifies that the `comment-end' markers should be aligned.
@@ -208,7 +208,8 @@ INDENT specifies that the `comment-start' markers should not be put at the
   "Style to be used for `comment-region'.
 See `comment-styles' for a list of available styles."
   :type (if (boundp 'comment-styles)
-           `(choice ,@(mapcar (lambda (s) `(const ,(car s))) comment-styles))
+           `(choice ,@(mapcar (lambda (s) `(const ,(car s)))
+                              comment-styles))
          'symbol)
   :group 'comment)
 
@@ -938,9 +939,14 @@ indentation to be kept as it was before narrowing."
                   (delete-char n)
                   (setq ,bindent (- ,bindent n)))))))))))
 
-(defun comment-add (arg)
+;; Compute the number of extra semicolons to add to the comment starter
+;; in Lisp mode, extra stars in C mode, etc.
+;; If ARG is non-nil, just follow ARG.
+;; If the comment-starter is multi-char, just follow ARG.
+;; Otherwise obey comment-add, and double it if EXTRA is non-nil.
+(defun comment-add (arg &optional extra)
   (if (and (null arg) (= (string-match "[ \t]*\\'" comment-start) 1))
-      comment-add
+      (* comment-add (if extra 2 1))
     (1- (prefix-numeric-value arg))))
 
 (defun comment-region-internal (beg end cs ce
@@ -1051,7 +1057,8 @@ The strings used as comment starts are built from
         (lines (nth 2 style))
         (block (nth 1 style))
         (multi (nth 0 style)))
-    ;; we use `chars' instead of `syntax' because `\n' might be
+
+    ;; We use `chars' instead of `syntax' because `\n' might be
     ;; of end-comment syntax rather than of whitespace syntax.
     ;; sanitize BEG and END
     (goto-char beg) (skip-chars-forward " \t\n\r") (beginning-of-line)
@@ -1079,7 +1086,10 @@ The strings used as comment starts are built from
      ((consp arg) (uncomment-region beg end))
      ((< numarg 0) (uncomment-region beg end (- numarg)))
      (t
-      (setq numarg (comment-add arg))
+      ;; Add an extra semicolon in Lisp and similar modes.
+      ;; If STYLE doesn't specify indenting the comments,
+      ;; then double the value of `comment-add'.
+      (setq numarg (comment-add arg (null (nth 3 style))))
       (comment-region-internal
        beg end
        (let ((s (comment-padright comment-start numarg)))
index 6eabd8f3d0252ad49f427628553a90bf7ed04cc2..a1ed3d44f7f35f8aa75a506f2717c432f861c6ca 100644 (file)
@@ -187,12 +187,12 @@ in the file it applies to."
   :group 'outlines)
 
 (defface outline-4
-  '((t :inherit font-lock-builtin-face))
+  '((t :inherit font-lock-comment-face))
   "Level 4."
   :group 'outlines)
 
 (defface outline-5
-  '((t :inherit font-lock-comment-face))
+  '((t :inherit font-lock-type-face))
   "Level 5."
   :group 'outlines)
 
@@ -202,7 +202,7 @@ in the file it applies to."
   :group 'outlines)
 
 (defface outline-7
-  '((t :inherit font-lock-type-face))
+  '((t :inherit font-lock-builtin-face))
   "Level 7."
   :group 'outlines)
 
@@ -215,8 +215,8 @@ in the file it applies to."
   [outline-1 outline-2 outline-3 outline-4
    outline-5 outline-6 outline-7 outline-8])
 
-(defvar outline-font-lock-levels nil)
-(make-variable-buffer-local 'outline-font-lock-levels)
+;; (defvar outline-font-lock-levels nil)
+;; (make-variable-buffer-local 'outline-font-lock-levels)
 
 (defun outline-font-lock-face ()
   ;; (save-excursion
@@ -241,9 +241,7 @@ in the file it applies to."
   (save-excursion
     (goto-char (match-beginning 0))
     (looking-at outline-regexp)
-    (condition-case nil
-       (aref outline-font-lock-faces (1- (funcall outline-level)))
-      (error font-lock-warning-face))))
+    (aref outline-font-lock-faces (% (1- (funcall outline-level)) (length outline-font-lock-faces)))))
 
 (defvar outline-view-change-hook nil
   "Normal hook to be run after outline visibility changes.")
@@ -712,7 +710,10 @@ If nil, `show-entry' is called to reveal the invisible text.")
 If FLAG is nil then text is shown, while if FLAG is t the text is hidden."
   (remove-overlays from to 'invisible 'outline)
   (when flag
-    (let ((o (make-overlay from to)))
+    ;; We use `front-advance' here because the invisible text begins at the
+    ;; very end of the heading, before the newline, so text inserted at FROM
+    ;; belongs to the heading rather than to the entry.
+    (let ((o (make-overlay from to nil 'front-advance)))
       (overlay-put o 'invisible 'outline)
       (overlay-put o 'isearch-open-invisible
                   (or outline-isearch-open-invisible-function
index 5798be4b14dc6bdbbee4b0cee9bba5e26210c8f1..87f543eac3600dd253597baffb1ff861bb71ae58 100644 (file)
@@ -347,6 +347,8 @@ This variable is buffer local and only used in the *cvs* buffer.")
     (" " .     cvs-mode-next-line)
     ("n" .     cvs-mode-next-line)
     ("p" .     cvs-mode-previous-line)
+    ("\t" .    cvs-mode-next-line)
+    ([backtab] . cvs-mode-previous-line)
     ;; M- keys are usually those that operate on modules
     ;;("\M-C". cvs-mode-rcs2log) ; i.e. "Create a ChangeLog"
     ;;("\M-t". cvs-rtag)
index 6f205772249a45203994444e0a8167656750307a..1e45fe6974b6e7aff6c7ec84db99c9e112a8dcb0 100644 (file)
     (list* '("BASE") '("HEAD")
           (when marked
             (with-temp-buffer
-              (call-process cvs-program
+              (process-file cvs-program
                             nil        ;no input
                             t          ;output to current-buffer
                             nil        ;don't update display while running
@@ -564,7 +564,7 @@ If non-nil, NEW means to create a new buffer no matter what."
               (process
                ;; the process will be run in the selected dir
                (let ((default-directory (cvs-expand-dir-name dir)))
-                 (apply 'start-process "cvs" procbuf cvs-program args))))
+                 (apply 'start-file-process "cvs" procbuf cvs-program args))))
          ;; setup the process.
          (process-put process 'cvs-buffer cvs-buffer)
          (with-current-buffer cvs-buffer (cvs-update-header msg 'add))
@@ -635,6 +635,9 @@ If non-nil, NEW means to create a new buffer no matter what."
           (if (not (string-match "." str)) (setq str "\n"))
           (setq str (concat "-- Running " cmd " ...\n" str)))
       (if (not (string-match
+                ;; FIXME:  If `cmd' is large, this will bump into the
+                ;; compiled-regexp size limit.  We could drop the "^" anchor
+                ;; and use search-forward to circumvent the problem.
                (concat "^-- Running " (regexp-quote cmd) " \\.\\.\\.\n") str))
          (error "Internal PCL-CVS error while removing message")
        (setq str (replace-match "" t t str))
@@ -1733,7 +1736,7 @@ Signal an error if there is no backup file."
          ;; problem when stdout and stderr are the same.
          (let ((res
                  (let ((coding-system-for-read 'binary))
-                   (apply 'call-process cvs-program nil '(t nil) nil
+                   (apply 'process-file cvs-program nil '(t nil) nil
                           "-q" "update" "-p"
                           ;; If `rev' is HEAD, don't pass it at all:
                           ;; the default behavior is to get the head
@@ -2003,7 +2006,7 @@ to hear about anymore."
 
 (defun cvs-find-modif (fi)
   (with-temp-buffer
-    (call-process cvs-program nil (current-buffer) nil
+    (process-file cvs-program nil (current-buffer) nil
                  "-f" "diff" (cvs-fileinfo->file fi))
     (goto-char (point-min))
     (if (re-search-forward "^\\([0-9]+\\)" nil t)
@@ -2210,13 +2213,21 @@ With prefix argument, prompt for cvs flags."
 (defun-cvs-mode cvs-mode-add-change-log-entry-other-window ()
   "Add a ChangeLog entry in the ChangeLog of the current directory."
   (interactive)
+  ;; Require `add-log' explicitly, because if it gets autoloaded when we call
+  ;; add-change-log-entry-other-window below, the
+  ;; add-log-buffer-file-name-function ends up unbound when we leave the `let'.
+  (require 'add-log)
   (dolist (fi (cvs-mode-marked nil nil))
     (let* ((default-directory (cvs-expand-dir-name (cvs-fileinfo->dir fi)))
-          (buffer-file-name (expand-file-name (cvs-fileinfo->file fi))))
-      (if (file-directory-p buffer-file-name)
-          ;; Be careful to use a directory name, otherwise add-log starts
-          ;; looking for a ChangeLog file in the parent dir.
-          (setq buffer-file-name (file-name-as-directory buffer-file-name)))
+          (add-log-buffer-file-name-function
+            (lambda ()
+              (let ((file (expand-file-name (cvs-fileinfo->file fi))))
+                (if (file-directory-p file)
+                    ;; Be careful to use a directory name, otherwise add-log
+                    ;; starts looking for a ChangeLog file in the
+                    ;; parent dir.
+                    (file-name-as-directory file)
+                  file)))))
       (kill-local-variable 'change-log-default-name)
       (save-excursion (add-change-log-entry-other-window)))))
 
@@ -2257,7 +2268,7 @@ With prefix argument, prompt for cvs flags."
                        program (split-string-and-unquote args)))
 
        ;; FIXME: return the exit status?
-       (apply 'call-process program nil t t args)
+       (apply 'process-file program nil t t args)
        (goto-char (point-max))))))
 
 ;; FIXME: make this run in the background ala cvs-run-process...
index a4b4c4217edb392483069b9dfcd3bcfe5d9e189b..0f58956408308fb8d2fe959bc77cb51cf4d19589 100644 (file)
@@ -5311,15 +5311,15 @@ If menu binding was not done, calls `pr-menu-bind'."
 
 (defun pr-eval-local-alist (alist)
   (let (local-list)
-    (mapcar #'(lambda (option)
-               (let ((var-sym (car option))
-                     (value   (cdr option)))
-                 (setq local-list
-                       (if (eq var-sym 'inherits-from:)
-                           (nconc (pr-eval-setting-alist value) local-list)
-                         (set (make-local-variable var-sym) (eval value))
-                         (cons var-sym local-list)))))
-           alist)
+    (mapc #'(lambda (option)
+             (let ((var-sym (car option))
+                   (value   (cdr option)))
+               (setq local-list
+                     (if (eq var-sym 'inherits-from:)
+                         (nconc (pr-eval-setting-alist value) local-list)
+                       (set (make-local-variable var-sym) (eval value))
+                       (cons var-sym local-list)))))
+         alist)
     local-list))
 
 
@@ -5341,7 +5341,7 @@ If menu binding was not done, calls `pr-menu-bind'."
                  (setq local-list
                        (pr-eval-setting-alist inherits global
                                               (cons inherits old)))))
-          (mapcar
+          (mapc
            (cond ((not local)          ; global settings
                   #'(lambda (option)
                       (let ((var-sym (car option)))
index 85f00b2bc5f3734a56f1d8b879c29da97501ef6a..ce342d876398b948d15b64ba5b4c574aa778fb12 100644 (file)
@@ -63,14 +63,14 @@ You should define the options of your own filters in this group."
   :group 'recentf)
 
 (defcustom recentf-max-saved-items 20
-  "*Maximum number of items of the recent list that will be saved.
+  "Maximum number of items of the recent list that will be saved.
 A nil value means to save the whole list.
 See the command `recentf-save-list'."
   :group 'recentf
   :type 'integer)
 
 (defcustom recentf-save-file "~/.recentf"
-  "*File to save the recent list into."
+  "File to save the recent list into."
   :group 'recentf
   :type 'file
   :initialize 'custom-initialize-default
@@ -91,7 +91,7 @@ file.  See also the function `set-file-modes'."
           integer))
 
 (defcustom recentf-exclude nil
-  "*List of regexps and predicates for filenames excluded from the recent list.
+  "List of regexps and predicates for filenames excluded from the recent list.
 When a filename matches any of the regexps or satisfies any of the
 predicates it is excluded from the recent list.
 A predicate is a function that is passed a filename to check and that
@@ -109,7 +109,7 @@ It handles the case of remote files as well."
 
 (defcustom recentf-keep
   '(recentf-keep-default-predicate)
-  "*List of regexps and predicates for filenames kept in the recent list.
+  "List of regexps and predicates for filenames kept in the recent list.
 Regexps and predicates are tried in the specified order.
 When nil all filenames are kept in the recent list.
 When a filename matches any of the regexps or satisfies any of the
@@ -135,13 +135,13 @@ Set VARIABLE with VALUE, and force a rebuild of the recentf menu."
     (set-default variable value)))
 
 (defcustom recentf-menu-title "Open Recent"
-  "*Name of the recentf menu."
+  "Name of the recentf menu."
   :group 'recentf
   :type 'string
   :set 'recentf-menu-customization-changed)
 
 (defcustom recentf-menu-path '("File")
-  "*Path where to add the recentf menu.
+  "Path where to add the recentf menu.
 If nil add it at top level (see also `easy-menu-add-item')."
   :group 'recentf
   :type '(choice (const :tag "Top Level" nil)
@@ -149,7 +149,7 @@ If nil add it at top level (see also `easy-menu-add-item')."
   :set 'recentf-menu-customization-changed)
 
 (defcustom recentf-menu-before "Open File..."
-  "*Name of the menu before which the recentf menu will be added.
+  "Name of the menu before which the recentf menu will be added.
 If nil add it at end of menu (see also `easy-menu-add-item')."
   :group 'recentf
   :type '(choice (string :tag "Name")
@@ -157,18 +157,18 @@ If nil add it at end of menu (see also `easy-menu-add-item')."
   :set 'recentf-menu-customization-changed)
 
 (defcustom recentf-menu-action 'find-file
-  "*Function to invoke with a filename item of the recentf menu.
+  "Function to invoke with a filename item of the recentf menu.
 The default is to call `find-file' to edit the selected file."
   :group 'recentf
   :type 'function)
 
 (defcustom recentf-max-menu-items 10
-  "*Maximum number of items in the recentf menu."
+  "Maximum number of items in the recentf menu."
   :group 'recentf
   :type 'integer)
 
 (defcustom recentf-menu-filter nil
-  "*Function used to filter files displayed in the recentf menu.
+  "Function used to filter files displayed in the recentf menu.
 A nil value means no filter.  The following functions are predefined:
 
 - `recentf-sort-ascending'
@@ -222,13 +222,13 @@ elements (see `recentf-make-menu-element' for menu element form)."
                 function))
 
 (defcustom recentf-menu-open-all-flag nil
-  "*Non-nil means to show an \"All...\" item in the menu.
+  "Non-nil means to show an \"All...\" item in the menu.
 This item will replace the \"More...\" item."
   :group 'recentf
   :type 'boolean)
 
 (defcustom recentf-menu-append-commands-flag t
-  "*Non-nil means to append command items to the menu."
+  "Non-nil means to append command items to the menu."
   :group 'recentf
   :type 'boolean)
 
@@ -237,7 +237,7 @@ This item will replace the \"More...\" item."
                                 "22.1")
 
 (defcustom recentf-auto-cleanup 'mode
-  "*Define when to automatically cleanup the recent list.
+  "Define when to automatically cleanup the recent list.
 The following values can be set:
 
 - `mode'
@@ -270,13 +270,13 @@ cleanup the list."
            (recentf-auto-cleanup))))
 
 (defcustom recentf-initialize-file-name-history t
-  "*Non-nil means to initialize `file-name-history' with the recent list.
+  "Non-nil means to initialize `file-name-history' with the recent list.
 If `file-name-history' is not empty, do nothing."
   :group 'recentf
   :type  'boolean)
 
 (defcustom recentf-load-hook nil
-   "*Normal hook run at end of loading the `recentf' package."
+   "Normal hook run at end of loading the `recentf' package."
   :group 'recentf
   :type 'hook)
 
@@ -777,7 +777,7 @@ Filenames are relative to the `default-directory'."
     ("Java files (%d)"  ".\\.java\\'")
     ("C/C++ files (%d)" "c\\(pp\\)?\\'")
     )
-  "*List of rules used by `recentf-arrange-by-rule' to build sub-menus.
+  "List of rules used by `recentf-arrange-by-rule' to build sub-menus.
 A rule is a pair (SUB-MENU-TITLE . MATCHER).  SUB-MENU-TITLE is the
 displayed title of the sub-menu where a '%d' `format' pattern is
 replaced by the number of items in the sub-menu.  MATCHER is a regexp
@@ -793,7 +793,7 @@ may have been modified to match another rule."
                        (repeat regexp))))
 
 (defcustom recentf-arrange-by-rule-others "Other files (%d)"
-  "*Title of the `recentf-arrange-by-rule' sub-menu.
+  "Title of the `recentf-arrange-by-rule' sub-menu.
 This is for the menu where items that don't match any
 `recentf-arrange-rules' are displayed.  If nil these items are
 displayed in the main recent files menu.  A '%d' `format' pattern in
@@ -803,7 +803,7 @@ the title is replaced by the number of items in the sub-menu."
                  (string :tag "Title")))
 
 (defcustom recentf-arrange-by-rules-min-items 0
-  "*Minimum number of items in a `recentf-arrange-by-rule' sub-menu.
+  "Minimum number of items in a `recentf-arrange-by-rule' sub-menu.
 If the number of items in a sub-menu is less than this value the
 corresponding sub-menu items are displayed in the main recent files
 menu or in the `recentf-arrange-by-rule-others' sub-menu if
@@ -812,7 +812,7 @@ defined."
   :type 'number)
 
 (defcustom recentf-arrange-by-rule-subfilter nil
-  "*Function called by a rule based filter to filter sub-menu elements.
+  "Function called by a rule based filter to filter sub-menu elements.
 A nil value means no filter.  See also `recentf-menu-filter'.
 You can't use another rule based filter here."
   :group 'recentf-filters
@@ -966,7 +966,7 @@ duplicates.  It is used by `recentf-arrange-by-dir' as its
     (recentf-arrange-by-dir  . "Grouped by Directory")
     (recentf-arrange-by-rule . "Grouped by Custom Rules")
     )
-  "*List of filters managed by `recentf-filter-changer'.
+  "List of filters managed by `recentf-filter-changer'.
 Each filter is defined by a pair (FUNCTION . LABEL), where FUNCTION is
 the filter function, and LABEL is the menu item displayed to select
 that filter."
@@ -1280,9 +1280,9 @@ Write data into the file specified by `recentf-save-file'."
         (insert (format recentf-save-file-header (current-time-string)))
         (recentf-dump-variable 'recentf-list recentf-max-saved-items)
         (recentf-dump-variable 'recentf-filter-changer-current)
-        (insert "\n\f\n;;; Local Variables:\n"
-                (format ";;; coding: %s\n" recentf-save-file-coding-system)
-                ";;; End:\n")
+        (insert "\n\f\n;; Local Variables:\n"
+                (format ";; coding: %s\n" recentf-save-file-coding-system)
+                ";; End:\n")
         (write-file (expand-file-name recentf-save-file))
         (when recentf-save-file-modes
           (set-file-modes recentf-save-file recentf-save-file-modes))
index ad8c4d818f8237fc737c583ce826f270d09aedac..1a1d081b06e3fcbd546537710056ffd58d0ef684 100644 (file)
@@ -152,6 +152,11 @@ member of that sequence.  If this variable is nil, no re-execution occurs."
 ;; with auto-filling.  Most problems are eliminated by remembering what we're
 ;; self-inserting, so we only need to get it from the undo information once.
 
+;; With Emacs 22.2 the variable `last-repeatable-command' stores the
+;; most recently executed command that was not bound to an input event.
+;; `repeat' now repeats that command instead of `real-last-command' to
+;; avoid a "... must be bound to an event with parameters" error.
+
 (defvar repeat-last-self-insert nil
   "If last repeated command was `self-insert-command', it inserted this.")
 
@@ -198,13 +203,18 @@ this function is always whether the value of `this-command' would've been
 ;;;###autoload
 (defun repeat (repeat-arg)
   "Repeat most recently executed command.
-With prefix arg, apply new prefix arg to that command; otherwise, use
-the prefix arg that was used before (if any).
+With prefix arg, apply new prefix arg to that command; otherwise,
+use the prefix arg that was used before (if any).
 This command is like the `.' command in the vi editor.
 
-If this command is invoked by a multi-character key sequence, it can then
-be repeated by repeating the final character of that sequence.  This behavior
-can be modified by the global variable `repeat-on-final-keystroke'."
+If this command is invoked by a multi-character key sequence, it
+can then be repeated by repeating the final character of that
+sequence.  This behavior can be modified by the global variable
+`repeat-on-final-keystroke'.
+
+`repeat' ignores commands bound to input events.  Hence the term
+\"most recently executed command\" shall be read as \"most
+recently executed command not bound to an input event\"."
   ;; The most recently executed command could be anything, so surprises could
   ;; result if it were re-executed in a context where new dynamically
   ;; localized variables were shadowing global variables in a `let' clause in
@@ -214,17 +224,19 @@ can be modified by the global variable `repeat-on-final-keystroke'."
   ;; "repeat-" prefix, reserved by this package, for *local* variables that
   ;; might be visible to re-executed commands, including this function's arg.
   (interactive "P")
-  (when (eq real-last-command 'repeat)
-    (setq real-last-command repeat-previous-repeated-command))
-  (when (null real-last-command)
+  (when (eq last-repeatable-command 'repeat)
+    (setq last-repeatable-command repeat-previous-repeated-command))
+  (cond
+   ((null last-repeatable-command)
     (error "There is nothing to repeat"))
-  (when (eq real-last-command 'mode-exit)
-    (error "real-last-command is mode-exit & can't be repeated"))
-  (when (memq real-last-command repeat-too-dangerous)
-    (error "Command %S too dangerous to repeat automatically" real-last-command))
-  (setq this-command                      real-last-command
-        repeat-num-input-keys-at-repeat   num-input-keys)
-  (setq repeat-previous-repeated-command this-command)
+   ((eq last-repeatable-command 'mode-exit)
+    (error "last-repeatable-command is mode-exit & can't be repeated"))
+   ((memq last-repeatable-command repeat-too-dangerous)
+    (error "Command %S too dangerous to repeat automatically"
+          last-repeatable-command)))
+  (setq this-command last-repeatable-command
+       repeat-previous-repeated-command last-repeatable-command
+        repeat-num-input-keys-at-repeat num-input-keys)
   (when (null repeat-arg)
     (setq repeat-arg last-prefix-arg))
   ;; Now determine whether to loop on repeated taps of the final character
@@ -234,25 +246,29 @@ can be modified by the global variable `repeat-on-final-keystroke'."
   ;; needs to be saved.
   (let ((repeat-repeat-char
          (if (eq repeat-on-final-keystroke t)
-             ;; allow any final input event that was a character
-             (when (eq last-command-char
-                       last-command-event)
-               last-command-char)
+            ;; The following commented out since it's equivalent to
+            ;; last-comment-char (martin 2007-08-29).
+;;;              ;; allow any final input event that was a character
+;;;              (when (eq last-command-char
+;;;                        last-command-event)
+;;;                last-command-char)
+            last-command-char
            ;; allow only specified final keystrokes
            (car (memq last-command-char
                       (listify-key-sequence
                        repeat-on-final-keystroke))))))
-    (if (memq real-last-command '(exit-minibuffer
-                                 minibuffer-complete-and-exit
-                                 self-insert-and-exit))
+    (if (memq last-repeatable-command '(exit-minibuffer
+                                       minibuffer-complete-and-exit
+                                       self-insert-and-exit))
         (let ((repeat-command (car command-history)))
           (repeat-message "Repeating %S" repeat-command)
           (eval repeat-command))
       (if (null repeat-arg)
-          (repeat-message "Repeating command %S" real-last-command)
-        (setq current-prefix-arg                   repeat-arg)
-        (repeat-message "Repeating command %S %S" repeat-arg real-last-command))
-      (if (eq real-last-command 'self-insert-command)
+          (repeat-message "Repeating command %S" last-repeatable-command)
+        (setq current-prefix-arg repeat-arg)
+        (repeat-message
+        "Repeating command %S %S" repeat-arg last-repeatable-command))
+      (if (eq last-repeatable-command 'self-insert-command)
           (let ((insertion
                  (if (<= (- num-input-keys
                             repeat-num-input-keys-at-self-insert)
@@ -275,18 +291,22 @@ can be modified by the global variable `repeat-on-final-keystroke'."
            (setq insertion (substring insertion -1))
            (let ((count (prefix-numeric-value repeat-arg))
                  (i 0))
+             ;; Run pre- and post-command hooks for self-insertion too.
+             (run-hooks 'pre-command-hook)
              (while (< i count)
                (repeat-self-insert insertion)
-               (setq i (1+ i)))))
-       (let ((indirect (indirect-function real-last-command)))
+               (setq i (1+ i)))
+             (run-hooks 'post-command-hook)))
+       (let ((indirect (indirect-function last-repeatable-command)))
          (if (or (stringp indirect)
                  (vectorp indirect))
-             ;; Bind real-last-command so that executing the macro
-             ;; does not alter it.
-             (let ((real-last-command real-last-command))
-               (execute-kbd-macro real-last-command))
+             ;; Bind real-last-command so that executing the macro does
+             ;; not alter it.  Do the same for last-repeatable-command.
+             (let ((real-last-command real-last-command)
+                   (last-repeatable-command last-repeatable-command))
+               (execute-kbd-macro last-repeatable-command))
             (run-hooks 'pre-command-hook)
-           (call-interactively real-last-command)
+           (call-interactively last-repeatable-command)
             (run-hooks 'post-command-hook)))))
     (when repeat-repeat-char
       ;; A simple recursion here gets into trouble with max-lisp-eval-depth
@@ -295,6 +315,7 @@ can be modified by the global variable `repeat-on-final-keystroke'."
       ;; max-lisp-eval-depth), but if I now locally disable the repeat char I
       ;; can iterate indefinitely here around a single level of recursion.
       (let (repeat-on-final-keystroke)
+       (setq real-last-command 'repeat)
         (while (eq (read-event) repeat-repeat-char)
          ;; Make each repetition undo separately.
          (undo-boundary)
index daa66118b38e29c4910bddd91b9b2b98c17b725d..ced5ed3f36870940a6ea6d2ec590ad6be6204f2e 100644 (file)
@@ -119,6 +119,12 @@ system, `file-name-shadow-properties' is used instead."
   :group 'minibuffer
   :version "22.1")
 
+(defvar rfn-eshadow-setup-minibuffer-hook nil
+  "Minibuffer setup functions from other packages.")
+
+(defvar rfn-eshadow-update-overlay-hook nil
+  "Customer overlay functions from other packages")
+
 \f
 ;;; Internal variables
 
@@ -153,7 +159,9 @@ The prompt and initial input should already have been inserted."
     (overlay-put rfn-eshadow-overlay 'evaporate t)
     ;; Add our post-command hook, and make sure can remove it later.
     (add-to-list 'rfn-eshadow-frobbed-minibufs (current-buffer))
-    (add-hook 'post-command-hook #'rfn-eshadow-update-overlay nil t)))
+    (add-hook 'post-command-hook #'rfn-eshadow-update-overlay nil t)
+    ;; Run custom hook
+    (run-hooks 'rfn-eshadow-setup-minibuffer-hook)))
 
 (defsubst rfn-eshadow-sifn-equal (goal pos)
   (equal goal (condition-case nil
@@ -193,7 +201,9 @@ been set up by `rfn-eshadow-setup-minibuffer'."
             (if (rfn-eshadow-sifn-equal goal mid)
                 (setq start mid)
               (setq end mid)))
-          (move-overlay rfn-eshadow-overlay (minibuffer-prompt-end) start)))
+          (move-overlay rfn-eshadow-overlay (minibuffer-prompt-end) start))
+       ;; Run custom hook
+       (run-hooks 'rfn-eshadow-update-overlay-hook))
     ;; `substitute-in-file-name' can fail on partial input.
     (error nil)))
 \f
index 770e01ccbca930cbdcd2028b16faa7f16c7ec9da..0a373058f667d48a2ddba213c06a5e714eb20003 100644 (file)
@@ -92,21 +92,8 @@ This is nil while loading `scroll-bar.el', and t afterward.")
   (setq scroll-bar-mode value)
 
   (when scroll-bar-mode-explicit
-    ;; Apply it to default-frame-alist.
-    (let ((parameter (assq 'vertical-scroll-bars default-frame-alist)))
-      (if (consp parameter)
-         (setcdr parameter scroll-bar-mode)
-       (setq default-frame-alist
-             (cons (cons 'vertical-scroll-bars scroll-bar-mode)
-                   default-frame-alist))))
-
-    ;; Apply it to existing frames.
-    (let ((frames (frame-list)))
-      (while frames
-       (modify-frame-parameters
-        (car frames)
-        (list (cons 'vertical-scroll-bars scroll-bar-mode)))
-       (setq frames (cdr frames))))))
+    (modify-all-frames-parameters (list (cons 'vertical-scroll-bars
+                                             scroll-bar-mode)))))
 
 (defcustom scroll-bar-mode default-frame-scroll-bars
   "*Specify whether to have vertical scroll bars, and on which side.
index 89756fd0eca6bb53abba71531a81390c1535979e..02190a97c6f0d91a7c917fb332d5e6cc13d0377d 100644 (file)
@@ -8,6 +8,7 @@
 ;; Keywords: processes
 
 ;; Changes by peck@sun.com and by rms.
+;; Overhaul by Karoly Lorentey <lorentey@elte.hu> for multi-tty support.
 
 ;; This file is part of GNU Emacs.
 
@@ -41,7 +42,7 @@
 ;; This program transmits the file names to Emacs through
 ;; the server subprocess, and Emacs visits them and lets you edit them.
 
-;; Note that any number of clients may dispatch files to emacs to be edited.
+;; Note that any number of clients may dispatch files to Emacs to be edited.
 
 ;; When you finish editing a Server buffer, again call server-edit
 ;; to mark that buffer as done for the client and switch to the next
 ;; The global variable "server-clients" lists all the waiting clients,
 ;; and which files are yet to be edited for each.
 
+;; Todo:
+
+;; - handle command-line-args-left.
+;; - move most of the args processing and decision making from emacsclient.c
+;;   to here.
+;; - fix up handling of the client's environment (place it in the terminal?).
+
 ;;; Code:
 
 (eval-when-compile (require 'cl))
@@ -138,12 +146,10 @@ If set, the server accepts remote connections; otherwise it is local."
 
 (defvar server-clients nil
   "List of current server clients.
-Each element is (CLIENTID BUFFERS...) where CLIENTID is a string
-that can be given to the server process to identify a client.
-When a buffer is marked as \"done\", it is removed from this list.")
+Each element is a process.")
 
 (defvar server-buffer-clients nil
-  "List of client ids for clients requesting editing of current buffer.")
+  "List of client processes requesting editing of current buffer.")
 (make-variable-buffer-local 'server-buffer-clients)
 ;; Changing major modes should not erase this local.
 (put 'server-buffer-clients 'permanent-local t)
@@ -178,10 +184,10 @@ invoke the Emacs server."
 (defcustom server-kill-new-buffers t
   "Whether to kill buffers when done with them.
 If non-nil, kill a buffer unless it already existed before editing
-it with Emacs server.  If nil, kill only buffers as specified by
+it with the Emacs server.  If nil, kill only buffers as specified by
 `server-temp-file-regexp'.
-Please note that only buffers are killed that still have a client,
-i.e. buffers visited which \"emacsclient --no-wait\" are never killed in
+Please note that only buffers that still have a client are killed,
+i.e. buffers visited with \"emacsclient --no-wait\" are never killed in
 this way."
   :group 'server
   :type 'boolean
@@ -198,34 +204,111 @@ are done with it in the server.")
 
 (defvar server-name "server")
 
-(defvar server-socket-dir
-  (format "/tmp/emacs%d" (user-uid)))
+(defvar server-socket-dir nil
+  "The directory in which to place the server socket.
+Initialized by `server-start'.")
+
+(defun server-clients-with (property value)
+  "Return a list of clients with PROPERTY set to VALUE."
+  (let (result)
+    (dolist (proc server-clients result)
+      (when (equal value (process-get proc property))
+       (push proc result)))))
+
+(defun server-add-client (proc)
+  "Create a client for process PROC, if it doesn't already have one.
+New clients have no properties."
+  (add-to-list 'server-clients proc))
+
+(defmacro server-with-environment (env vars &rest body)
+  "Evaluate BODY with environment variables VARS set to those in ENV.
+The environment variables are then restored to their previous values.
+
+VARS should be a list of strings.
+ENV should be in the same format as `process-environment'."
+  (declare (indent 2))
+  (let ((var (make-symbol "var"))
+       (value (make-symbol "value")))
+    `(let ((process-environment process-environment))
+       (dolist (,var ,vars)
+         (let ((,value (getenv-internal ,var ,env)))
+           (push (if (null ,value)
+                     ,var
+                   (concat ,var "=" ,value))
+                 process-environment)))
+       (progn ,@body))))
+
+(defun server-delete-client (proc &optional noframe)
+  "Delete CLIENT, including its buffers, terminals and frames.
+If NOFRAME is non-nil, let the frames live.  (To be used from
+`delete-frame-functions'.)"
+  (server-log (concat "server-delete-client" (if noframe " noframe"))
+             proc)
+  ;; Force a new lookup of client (prevents infinite recursion).
+  (when (memq proc server-clients)
+    (let ((buffers (process-get proc 'buffers)))
+
+      ;; Kill the client's buffers.
+      (dolist (buf buffers)
+       (when (buffer-live-p buf)
+         (with-current-buffer buf
+           ;; Kill the buffer if necessary.
+           (when (and (equal server-buffer-clients
+                             (list proc))
+                      (or (and server-kill-new-buffers
+                               (not server-existing-buffer))
+                          (server-temp-file-p))
+                      (not (buffer-modified-p)))
+             (let (flag)
+               (unwind-protect
+                   (progn (setq server-buffer-clients nil)
+                          (kill-buffer (current-buffer))
+                          (setq flag t))
+                 (unless flag
+                   ;; Restore clients if user pressed C-g in `kill-buffer'.
+                   (setq server-buffer-clients (list proc)))))))))
+
+      ;; Delete the client's frames.
+      (unless noframe
+       (dolist (frame (frame-list))
+         (when (and (frame-live-p frame)
+                    (equal proc (frame-parameter frame 'client)))
+           ;; Prevent `server-handle-delete-frame' from calling us
+           ;; recursively.
+           (set-frame-parameter frame 'client nil)
+           (delete-frame frame))))
+
+      (setq server-clients (delq proc server-clients))
+
+      ;; Delete the client's tty.
+      (let ((terminal (process-get proc 'terminal)))
+       ;; Only delete the terminal if it is non-nil.
+       (when (and terminal (eq (terminal-live-p terminal) t))
+         (delete-terminal terminal)))
+
+      ;; Delete the client's process.
+      (if (eq (process-status proc) 'open)
+         (delete-process proc))
+
+      (server-log "Deleted" proc))))
 
 (defun server-log (string &optional client)
-  "If a *server* buffer exists, write STRING to it for logging purposes."
+  "If a *server* buffer exists, write STRING to it for logging purposes.
+If CLIENT is non-nil, add a description of it to the logged
+message."
   (when (get-buffer "*server*")
     (with-current-buffer "*server*"
       (goto-char (point-max))
       (insert (current-time-string)
-             (if client (format " %s:" client) " ")
+             (cond
+              ((null client) " ")
+              ((listp client) (format " %s: " (car client)))
+              (t (format " %s: " client)))
              string)
       (or (bolp) (newline)))))
 
 (defun server-sentinel (proc msg)
-  (let ((client (assq proc server-clients)))
-    ;; Remove PROC from the list of clients.
-    (when client
-      (setq server-clients (delq client server-clients))
-      (dolist (buf (cdr client))
-       (with-current-buffer buf
-         ;; Remove PROC from the clients of each buffer.
-         (setq server-buffer-clients (delq proc server-buffer-clients))
-         ;; Kill the buffer if necessary.
-         (when (and (null server-buffer-clients)
-                    (or (and server-kill-new-buffers
-                             (not server-existing-buffer))
-                        (server-temp-file-p)))
-           (kill-buffer (current-buffer)))))))
+  "The process sentinel for Emacs server connections."
   ;; If this is a new client process, set the query-on-exit flag to nil
   ;; for this process (it isn't inherited from the server process).
   (when (and (eq (process-status proc) 'open)
@@ -237,7 +320,8 @@ are done with it in the server.")
   ;; (and (process-contact proc :server)
   ;;      (eq (process-status proc) 'closed)
   ;;      (ignore-errors (delete-file (process-get proc :server-file))))
-  (server-log (format "Status changed to %s" (process-status proc)) proc))
+  (server-log (format "Status changed to %s: %s" (process-status proc) msg) proc)
+  (server-delete-client proc))
 
 (defun server-select-display (display)
   ;; If the current frame is on `display' we're all set.
@@ -259,25 +343,52 @@ are done with it in the server.")
                        ;; unobtrusive as possible.
                        (visibility . nil)))))
         (select-frame frame)
-        (set-window-buffer (selected-window) buffer)))))
+        (set-window-buffer (selected-window) buffer)
+        frame))))
 
 (defun server-unselect-display (frame)
-  ;; If the temporary frame is in use (displays something real), make it
-  ;; visible.  If not (which can happen if the user's customizations call
-  ;; pop-to-buffer etc.), delete it to avoid preserving the connection after
-  ;; the last real frame is deleted.
-  (if (and (eq (frame-first-window frame)
-               (next-window (frame-first-window frame) 'nomini))
-           (eq (window-buffer (frame-first-window frame))
-               (frame-parameter frame 'server-dummy-buffer)))
-      ;; The temp frame still only shows one buffer, and that is the
-      ;; internal temp buffer.
-      (delete-frame frame)
-    (set-frame-parameter frame 'visibility t))
-  (kill-buffer (frame-parameter frame 'server-dummy-buffer))
-  (set-frame-parameter frame 'server-dummy-buffer nil))
+  (when (frame-live-p frame)
+    ;; If the temporary frame is in use (displays something real), make it
+    ;; visible.  If not (which can happen if the user's customizations call
+    ;; pop-to-buffer etc.), delete it to avoid preserving the connection after
+    ;; the last real frame is deleted.
+    (if (and (eq (frame-first-window frame)
+                 (next-window (frame-first-window frame) 'nomini))
+             (eq (window-buffer (frame-first-window frame))
+                 (frame-parameter frame 'server-dummy-buffer)))
+        ;; The temp frame still only shows one buffer, and that is the
+        ;; internal temp buffer.
+        (delete-frame frame)
+      (set-frame-parameter frame 'visibility t))
+    (kill-buffer (frame-parameter frame 'server-dummy-buffer))
+    (set-frame-parameter frame 'server-dummy-buffer nil)))
+
+(defun server-handle-delete-frame (frame)
+  "Delete the client connection when the emacsclient frame is deleted."
+  (let ((proc (frame-parameter frame 'client)))
+    (when (and (frame-live-p frame)
+              proc
+              ;; See if this is the last frame for this client.
+              (>= 1 (let ((frame-num 0))
+                     (dolist (f (frame-list))
+                       (when (eq proc (frame-parameter f 'client))
+                         (setq frame-num (1+ frame-num))))
+                     frame-num)))
+      (server-log (format "server-handle-delete-frame, frame %s" frame) proc)
+      (server-delete-client proc 'noframe)))) ; Let delete-frame delete the frame later.
+
+(defun server-handle-suspend-tty (terminal)
+  "Notify the emacsclient process to suspend itself when its tty device is suspended."
+  (dolist (proc (server-clients-with 'terminal terminal))
+    (server-log (format "server-handle-suspend-tty, terminal %s" terminal) proc)
+    (condition-case err
+       (server-send-string proc "-suspend \n")
+      (file-error                       ;The pipe/socket was closed.
+       (ignore-errors (server-delete-client proc))))))
 
 (defun server-unquote-arg (arg)
+  "Remove &-quotation from ARG.
+See `server-quote-arg' and `server-process-filter'."
   (replace-regexp-in-string
    "&." (lambda (s)
          (case (aref s 1)
@@ -287,6 +398,26 @@ are done with it in the server.")
            (t " ")))
    arg t t))
 
+(defun server-quote-arg (arg)
+  "In ARG, insert a & before each &, each space, each newline, and -.
+Change spaces to underscores, too, so that the return value never
+contains a space.
+
+See `server-unquote-arg' and `server-process-filter'."
+  (replace-regexp-in-string
+   "[-&\n ]" (lambda (s)
+              (case (aref s 0)
+                (?& "&&")
+                (?- "&-")
+                (?\n "&n")
+                (?\s "&_")))
+   arg t t))
+
+(defun server-send-string (proc string)
+  "A wrapper around `proc-send-string' for logging."
+  (server-log (concat "Sent " string) proc)
+  (process-send-string proc string))
+
 (defun server-ensure-safe-dir (dir)
   "Make sure DIR is a directory with no race-condition issues.
 Creates the directory if necessary and makes sure:
@@ -308,68 +439,100 @@ Creates the directory if necessary and makes sure:
 (defun server-start (&optional leave-dead)
   "Allow this Emacs process to be a server for client processes.
 This starts a server communications subprocess through which
-client \"editors\" can send your editing commands to this Emacs job.
-To use the server, set up the program `emacsclient' in the
+client \"editors\" can send your editing commands to this Emacs
+job.  To use the server, set up the program `emacsclient' in the
 Emacs distribution as your standard \"editor\".
 
 Optional argument LEAVE-DEAD (interactively, a prefix arg) means just
 kill any existing server communications subprocess."
   (interactive "P")
-  (when server-process
-    ;; kill it dead!
-    (ignore-errors (delete-process server-process)))
-  ;; If this Emacs already had a server, clear out associated status.
-  (while server-clients
-    (let ((buffer (nth 1 (car server-clients))))
-      (server-buffer-done buffer)))
-  ;; Now any previous server is properly stopped.
-  (unless leave-dead
-    (let* ((server-dir (if server-use-tcp server-auth-dir server-socket-dir))
-           (server-file (expand-file-name server-name server-dir)))
-      ;; Make sure there is a safe directory in which to place the socket.
-      (server-ensure-safe-dir server-dir)
-      ;; Remove any leftover socket or authentication file.
-      (ignore-errors (delete-file server-file))
-      (when server-process
-        (server-log (message "Restarting server")))
-      (letf (((default-file-modes) ?\700))
-        (setq server-process
-              (apply #'make-network-process
-                     :name server-name
-                     :server t
-                     :noquery t
-                     :sentinel 'server-sentinel
-                     :filter 'server-process-filter
-                     ;; We must receive file names without being decoded.
-                     ;; Those are decoded by server-process-filter according
-                     ;; to file-name-coding-system.
-                     :coding 'raw-text
-                     ;; The rest of the args depends on the kind of socket used.
-                     (if server-use-tcp
-                         (list :family nil
-                               :service t
-                               :host (or server-host 'local)
-                               :plist '(:authenticated nil))
-                       (list :family 'local
-                             :service server-file
-                             :plist '(:authenticated t)))))
-        (unless server-process (error "Could not start server process"))
-        (when server-use-tcp
-          (let ((auth-key
-                 (loop
-                    ;; The auth key is a 64-byte string of random chars in the
-                    ;; range `!'..`~'.
-                    for i below 64
-                    collect (+ 33 (random 94)) into auth
-                    finally return (concat auth))))
-            (process-put server-process :auth-key auth-key)
-            (with-temp-file server-file
-              (set-buffer-multibyte nil)
-              (setq buffer-file-coding-system 'no-conversion)
-              (insert (format-network-address
-                       (process-contact server-process :local))
-                      " " (int-to-string (emacs-pid))
-                      "\n" auth-key))))))))
+  (when (or
+        (not server-clients)
+        (yes-or-no-p
+         "The current server still has clients; delete them? "))
+    ;; It is safe to get the user id now.
+    (setq server-socket-dir (or server-socket-dir
+                               (format "/tmp/emacs%d" (user-uid))))
+    (when server-process
+      ;; kill it dead!
+      (ignore-errors (delete-process server-process)))
+    ;; Delete the socket files made by previous server invocations.
+    (condition-case ()
+       (delete-file (expand-file-name server-name server-socket-dir))
+      (error nil))
+    ;; If this Emacs already had a server, clear out associated status.
+    (while server-clients
+      (server-delete-client (car server-clients)))
+    ;; Now any previous server is properly stopped.
+    (if leave-dead
+       (progn
+         (server-log (message "Server stopped"))
+         (setq server-process nil))
+      (let* ((server-dir (if server-use-tcp server-auth-dir server-socket-dir))
+            (server-file (expand-file-name server-name server-dir)))
+       ;; Make sure there is a safe directory in which to place the socket.
+       (server-ensure-safe-dir server-dir)
+       ;; Remove any leftover socket or authentication file.
+       (ignore-errors (delete-file server-file))
+       (when server-process
+         (server-log (message "Restarting server")))
+       (letf (((default-file-modes) ?\700))
+         (add-hook 'suspend-tty-functions 'server-handle-suspend-tty)
+         (add-hook 'delete-frame-functions 'server-handle-delete-frame)
+         (add-hook 'kill-buffer-query-functions 'server-kill-buffer-query-function)
+         (add-hook 'kill-emacs-query-functions 'server-kill-emacs-query-function)
+         (setq server-process
+               (apply #'make-network-process
+                      :name server-name
+                      :server t
+                      :noquery t
+                      :sentinel 'server-sentinel
+                      :filter 'server-process-filter
+                      ;; We must receive file names without being decoded.
+                      ;; Those are decoded by server-process-filter according
+                      ;; to file-name-coding-system.
+                      :coding 'raw-text
+                      ;; The rest of the args depends on the kind of socket used.
+                      (if server-use-tcp
+                          (list :family nil
+                                :service t
+                                :host (or server-host 'local)
+                                :plist '(:authenticated nil))
+                        (list :family 'local
+                              :service server-file
+                              :plist '(:authenticated t)))))
+         (unless server-process (error "Could not start server process"))
+         (when server-use-tcp
+           (let ((auth-key
+                  (loop
+                   ;; The auth key is a 64-byte string of random chars in the
+                   ;; range `!'..`~'.
+                   for i below 64
+                   collect (+ 33 (random 94)) into auth
+                   finally return (concat auth))))
+             (process-put server-process :auth-key auth-key)
+             (with-temp-file server-file
+               (set-buffer-multibyte nil)
+               (setq buffer-file-coding-system 'no-conversion)
+               (insert (format-network-address
+                        (process-contact server-process :local))
+                       " " (int-to-string (emacs-pid))
+                       "\n" auth-key)))))))))
+
+(defun server-running-p (&optional name)
+  "Test whether server NAME is running."
+  (interactive
+   (list (if current-prefix-arg
+            (read-string "Server name: " nil nil server-name))))
+  (unless name (setq name server-name))
+  (condition-case nil
+      (progn
+       (delete-process
+        (make-network-process
+         :name "server-client-test" :family 'local :server nil :noquery t
+         :service (expand-file-name name server-socket-dir)))
+       t)
+    (file-error nil)))
 
 ;;;###autoload
 (define-minor-mode server-mode
@@ -384,143 +547,459 @@ Server mode runs a process that accepts commands from the
   ;; nothing if there is one (for multiple Emacs sessions)?
   (server-start (not server-mode)))
 \f
+(defun server-eval-and-print (expr proc)
+  "Eval EXPR and send the result back to client PROC."
+  (let ((v (eval (car (read-from-string expr)))))
+    (when (and v proc)
+      (with-temp-buffer
+        (let ((standard-output (current-buffer)))
+          (pp v)
+          (let ((text (buffer-substring-no-properties
+                       (point-min) (point-max))))
+            (server-send-string
+             proc (format "-print %s\n"
+                          (server-quote-arg text)))))))))
+
+(defun server-create-tty-frame (tty type proc)
+  (let ((frame
+         (server-with-environment (process-get proc 'env)
+             '("LANG" "LC_CTYPE" "LC_ALL"
+               ;; For tgetent(3); list according to ncurses(3).
+               "BAUDRATE" "COLUMNS" "ESCDELAY" "HOME" "LINES"
+               "NCURSES_ASSUMED_COLORS" "NCURSES_NO_PADDING"
+               "NCURSES_NO_SETBUF" "TERM" "TERMCAP" "TERMINFO"
+               "TERMINFO_DIRS" "TERMPATH" 
+               ;; rxvt wants these
+               "COLORFGBG" "COLORTERM")
+           (make-frame-on-tty tty type
+                              ;; Ignore nowait here; we always need to
+                              ;; clean up opened ttys when the client dies.
+                              `((client . ,proc)
+                                (environment . ,(process-get proc 'env)))))))
+  
+    ;; ttys don't use the `display' parameter, but callproc.c does to set
+    ;; the DISPLAY environment on subprocesses.
+    (set-frame-parameter frame 'display
+                         (getenv-internal "DISPLAY" (process-get proc 'env)))
+    (select-frame frame)
+    (process-put proc 'frame frame)
+    (process-put proc 'terminal (frame-terminal frame))
+
+    ;; Display *scratch* by default.
+    (switch-to-buffer (get-buffer-create "*scratch*") 'norecord)
+
+    ;; Reply with our pid.
+    (server-send-string proc (concat "-emacs-pid "
+                                     (number-to-string (emacs-pid)) "\n"))
+    frame))
+
+(defun server-create-window-system-frame (display nowait proc)
+  (if (not (fboundp 'make-frame-on-display))
+      (progn
+        ;; This emacs does not support X.
+        (server-log "Window system unsupported" proc)
+        (server-send-string proc "-window-system-unsupported \n")
+        nil)
+    ;; Flag frame as client-created, but use a dummy client.
+    ;; This will prevent the frame from being deleted when
+    ;; emacsclient quits while also preventing
+    ;; `server-save-buffers-kill-terminal' from unexpectedly
+    ;; killing emacs on that frame.
+    (let* ((params `((client . ,(if nowait 'nowait proc))
+                     (environment . ,(process-get proc 'env))))
+           (frame (make-frame-on-display
+                   (or display
+                       (frame-parameter nil 'display)
+                       (getenv "DISPLAY")
+                       (error "Please specify display"))
+                   params)))
+      (server-log (format "%s created" frame) proc)
+      ;; XXX We need to ensure the parameters are
+      ;; really set because Emacs forgets unhandled
+      ;; initialization parameters for X frames at
+      ;; the moment.
+      (modify-frame-parameters frame params)
+      (select-frame frame)
+      (process-put proc 'frame frame)
+      (process-put proc 'terminal (frame-terminal frame))
+
+      ;; Display *scratch* by default.
+      (switch-to-buffer (get-buffer-create "*scratch*") 'norecord)
+      frame)))
+
+
+(defun server-goto-toplevel (proc)
+  (condition-case nil
+      ;; If we're running isearch, we must abort it to allow Emacs to
+      ;; display the buffer and switch to it.
+      (dolist (buffer (buffer-list))
+        (with-current-buffer buffer
+          (when (bound-and-true-p isearch-mode)
+            (isearch-cancel))))
+    ;; Signaled by isearch-cancel.
+    (quit (message nil)))
+  (when (> (recursion-depth) 0)
+    ;; We're inside a minibuffer already, so if the emacs-client is trying
+    ;; to open a frame on a new display, we might end up with an unusable
+    ;; frame because input from that display will be blocked (until exiting
+    ;; the minibuffer).  Better exit this minibuffer right away.
+    ;; Similarly with recursive-edits such as the splash screen.
+    (run-with-timer 0 nil (lexical-let ((proc proc))
+                           (lambda () (server-execute-continuation proc))))
+    (top-level)))
+
+;; We use various special properties on process objects:
+;; - `env' stores the info about the environment of the emacsclient process.
+;; - `continuation' is a no-arg function that we need to execute.  It contains
+;;   commands we wanted to execute in some earlier invocation of the process
+;;   filter but that we somehow were unable to process at that time
+;;   (e.g. because we first need to throw to the toplevel).
+
+(defun server-execute-continuation (proc)
+  (let ((continuation (process-get proc 'continuation)))
+    (process-put proc 'continuation nil)
+    (if continuation (ignore-errors (funcall continuation)))))
+
 (defun* server-process-filter (proc string)
   "Process a request from the server to edit some files.
-PROC is the server process.  Format of STRING is \"PATH PATH PATH... \\n\"."
+PROC is the server process.  STRING consists of a sequence of
+commands prefixed by a dash.  Some commands have arguments; these
+are &-quoted and need to be decoded by `server-unquote-arg'.  The
+filter parses and executes these commands.
+
+To illustrate the protocol, here is an example command that
+emacsclient sends to create a new X frame (note that the whole
+sequence is sent on a single line):
+
+       -env HOME /home/lorentey
+       -env DISPLAY :0.0
+       ... lots of other -env commands
+       -display :0.0
+       -window-system
+
+The following commands are accepted by the server:
+
+`-auth AUTH-STRING'
+  Authenticate the client using the secret authentication string
+  AUTH-STRING.
+
+`-env NAME=VALUE'
+  An environment variable on the client side.
+
+`-dir DIRNAME'
+  The current working directory of the client process.
+
+`-current-frame'
+  Forbid the creation of new frames.
+
+`-nowait'
+  Request that the next frame created should not be
+  associated with this client.
+
+`-display DISPLAY'
+  Set the display name to open X frames on.
+
+`-position LINE[:COLUMN]'
+  Go to the given line and column number
+  in the next file opened.
+
+`-file FILENAME'
+  Load the given file in the current frame.
+
+`-eval EXPR'
+  Evaluate EXPR as a Lisp expression and return the
+  result in -print commands.
+
+`-window-system'
+  Open a new X frame.
+
+`-tty DEVICENAME TYPE'
+  Open a new tty frame at the client.
+
+`-suspend'
+  Suspend this tty frame.  The client sends this string in
+  response to SIGTSTP and SIGTTOU.  The server must cease all I/O
+  on this tty until it gets a -resume command.
+
+`-resume'
+  Resume this tty frame. The client sends this string when it
+  gets the SIGCONT signal and it is the foreground process on its
+  controlling tty.
+
+`-ignore COMMENT'
+  Do nothing, but put the comment in the server
+  log.  Useful for debugging.
+
+
+The following commands are accepted by the client:
+
+`-emacs-pid PID'
+  Describes the process id of the Emacs process;
+  used to forward window change signals to it.
+
+`-window-system-unsupported'
+  Signals that the server does not
+  support creating X frames; the client must try again with a tty
+  frame.
+
+`-print STRING'
+  Print STRING on stdout.  Used to send values
+  returned by -eval.
+
+`-error DESCRIPTION'
+  Signal an error (but continue processing).
+
+`-suspend'
+  Suspend this terminal, i.e., stop the client process.  Sent
+  when the user presses C-z."
+  (server-log (concat "Received " string) proc)
   ;; First things first: let's check the authentication
   (unless (process-get proc :authenticated)
     (if (and (string-match "-auth \\(.*?\\)\n" string)
-             (equal (match-string 1 string) (process-get proc :auth-key)))
-        (progn
-          (setq string (substring string (match-end 0)))
-          (process-put proc :authenticated t)
-          (server-log "Authentication successful" proc))
+            (equal (match-string 1 string) (process-get proc :auth-key)))
+       (progn
+         (setq string (substring string (match-end 0)))
+         (process-put proc :authenticated t)
+         (server-log "Authentication successful" proc))
       (server-log "Authentication failed" proc)
-      (process-send-string proc "Authentication failed")
+      (server-send-string
+       proc (concat "-error " (server-quote-arg "Authentication failed")))
       (delete-process proc)
       ;; We return immediately
       (return-from server-process-filter)))
-  (server-log string proc)
-  (let ((prev (process-get proc :previous-string)))
+  (let ((prev (process-get proc 'previous-string)))
     (when prev
       (setq string (concat prev string))
-      (process-put proc :previous-string nil)))
-  (when (> (recursion-depth) 0)
-    ;; We're inside a minibuffer already, so if the emacs-client is trying
-    ;; to open a frame on a new display, we might end up with an unusable
-    ;; frame because input from that display will be blocked (until exiting
-    ;; the minibuffer).  Better exit this minibuffer right away.
-    ;; Similarly with recursive-edits such as the splash screen.
-    (process-put proc :previous-string string)
-    (run-with-timer 0 nil (lexical-let ((proc proc))
-                            (lambda () (server-process-filter proc ""))))
-    (top-level))
-  (condition-case nil
-      ;; If we're running isearch, we must abort it to allow Emacs to
-      ;; display the buffer and switch to it.
-      (mapc #'(lambda (buffer)
-               (with-current-buffer buffer
-                 (when (bound-and-true-p isearch-mode)
-                   (isearch-cancel))))
-           (buffer-list))
-    ;; Signaled by isearch-cancel
-    (quit (message nil)))
-  ;; If the input is multiple lines,
-  ;; process each line individually.
-  (while (string-match "\n" string)
-    (let ((request (substring string 0 (match-beginning 0)))
-         (coding-system (and default-enable-multibyte-characters
-                             (or file-name-coding-system
-                                 default-file-name-coding-system)))
-         client nowait eval
-         (files nil)
-         (lineno 1)
-         (tmp-frame nil) ;; Sometimes used to embody the selected display.
-         (columnno 0))
-      ;; Remove this line from STRING.
-      (setq string (substring string (match-end 0)))
-      (setq client (cons proc nil))
-      (while (string-match "[^ ]* " request)
-       (let ((arg (substring request (match-beginning 0) (1- (match-end 0)))))
-         (setq request (substring request (match-end 0)))
-         (cond
-            ((equal "-nowait" arg) (setq nowait t))
-            ((equal "-eval" arg) (setq eval t))
-            ((and (equal "-display" arg) (string-match "\\([^ ]*\\) " request))
-             (let ((display (server-unquote-arg (match-string 1 request))))
-               (setq request (substring request (match-end 0)))
-               (condition-case err
-                   (setq tmp-frame (server-select-display display))
-                 (error (process-send-string proc (nth 1 err))
-                        (setq request "")))))
-            ;; ARG is a line number option.
-            ((string-match "\\`\\+[0-9]+\\'" arg)
-             (setq lineno (string-to-number (substring arg 1))))
-            ;; ARG is line number:column option.
-            ((string-match "\\`+\\([0-9]+\\):\\([0-9]+\\)\\'" arg)
-             (setq lineno (string-to-number (match-string 1 arg))
-                   columnno (string-to-number (match-string 2 arg))))
-            (t
-             ;; Undo the quoting that emacsclient does
-             ;; for certain special characters.
-             (setq arg (server-unquote-arg arg))
-             ;; Now decode the file name if necessary.
-             (when coding-system
-               (setq arg (decode-coding-string arg coding-system)))
-             (if eval
-                 (let* (errorp
-                        (v (condition-case errobj
-                               (eval (car (read-from-string arg)))
-                             (error (setq errorp t) errobj))))
-                   (when v
-                     (with-temp-buffer
-                       (let ((standard-output (current-buffer)))
-                         (when errorp (princ "error: "))
-                         (pp v)
-                         (ignore-errors
-                           (process-send-region proc (point-min) (point-max)))
-                         ))))
-               ;; ARG is a file name.
-               ;; Collapse multiple slashes to single slashes.
-               (setq arg (command-line-normalize-file-name arg))
-               (push (list arg lineno columnno) files))
-             (setq lineno 1)
-             (setq columnno 0)))))
-      (when files
-       (run-hooks 'pre-command-hook)
-       (server-visit-files files client nowait)
-       (run-hooks 'post-command-hook))
-      ;; CLIENT is now a list (CLIENTNUM BUFFERS...)
-      (if (null (cdr client))
-         ;; This client is empty; get rid of it immediately.
-         (progn
-           (delete-process proc)
-           (server-log "Close empty client" proc))
-       ;; We visited some buffer for this client.
-       (or nowait (push client server-clients))
-       (unless (or isearch-mode (minibufferp))
-         (server-switch-buffer (nth 1 client))
-         (run-hooks 'server-switch-hook)
-         (unless nowait
-           (message "%s" (substitute-command-keys
+      (process-put proc 'previous-string nil)))
+  (condition-case err
+      (progn
+       (server-add-client proc)
+       (if (not (string-match "\n" string))
+            ;; Save for later any partial line that remains.
+            (when (> (length string) 0)
+              (process-put proc 'previous-string string))
+            
+          ;; In earlier versions of server.el (where we used an `emacsserver'
+          ;; process), there could be multiple lines.  Nowadays this is not
+          ;; supported any more.
+          (assert (eq (match-end 0) (length string)))
+         (let ((request (substring string 0 (match-beginning 0)))
+               (coding-system (and default-enable-multibyte-characters
+                                   (or file-name-coding-system
+                                       default-file-name-coding-system)))
+               nowait ; t if emacsclient does not want to wait for us.
+               frame ; The frame that was opened for the client (if any).
+               display              ; Open the frame on this display.
+               dontkill       ; t if the client should not be killed.
+                (commands ())
+               dir
+                (tty-name nil)       ;nil, `window-system', or the tty name.
+                tty-type             ;string.
+               (files nil)
+               (lineno 1)
+               (columnno 0))
+           ;; Remove this line from STRING.
+           (setq string (substring string (match-end 0)))
+           (while (string-match " *[^ ]* " request)
+             (let ((arg (substring request (match-beginning 0)
+                                    (1- (match-end 0)))))
+               (setq request (substring request (match-end 0)))
+               (cond
+                ;; -version CLIENT-VERSION: obsolete at birth.
+                ((and (equal "-version" arg) (string-match "[^ ]+ " request))
+                  (setq request (substring request (match-end 0))))
+
+                ;; -nowait:  Emacsclient won't wait for a result.
+                ((equal "-nowait" arg) (setq nowait t))
+
+                ;; -current-frame:  Don't create frames.
+                ((equal "-current-frame" arg) (setq tty-name nil))
+
+                ;; -display DISPLAY:
+                ;; Open X frames on the given display instead of the default.
+                ((and (equal "-display" arg)
+                       (string-match "\\([^ ]*\\) " request))
+                 (setq display (match-string 1 request)
+                       request (substring request (match-end 0))))
+
+                ;; -window-system:  Open a new X frame.
+                ((equal "-window-system" arg)
+                  (setq dontkill t)
+                  (setq tty-name 'window-system))
+
+                ;; -resume:  Resume a suspended tty frame.
+                ((equal "-resume" arg)
+                 (lexical-let ((terminal (process-get proc 'terminal)))
+                   (setq dontkill t)
+                    (push (lambda ()
+                            (when (eq (terminal-live-p terminal) t)
+                              (resume-tty terminal)))
+                          commands)))
+
+                ;; -suspend:  Suspend the client's frame.  (In case we
+                ;; get out of sync, and a C-z sends a SIGTSTP to
+                ;; emacsclient.)
+                ((equal "-suspend" arg)
+                 (lexical-let ((terminal (process-get proc 'terminal)))
+                   (setq dontkill t)
+                    (push (lambda ()
+                            (when (eq (terminal-live-p terminal) t)
+                              (suspend-tty terminal)))
+                          commands)))
+
+                ;; -ignore COMMENT:  Noop; useful for debugging emacsclient.
+                ;; (The given comment appears in the server log.)
+                ((and (equal "-ignore" arg) (string-match "[^ ]* " request))
+                 (setq dontkill t
+                       request (substring request (match-end 0))))
+
+                ;; -tty DEVICE-NAME TYPE:  Open a new tty frame at the client.
+                ((and (equal "-tty" arg)
+                       (string-match "\\([^ ]*\\) \\([^ ]*\\) " request))
+                  (setq tty-name (match-string 1 request))
+                  (setq tty-type (match-string 2 request))
+                  (setq dontkill t)
+                  (setq request (substring request (match-end 0))))
+
+                ;; -position LINE[:COLUMN]:  Set point to the given
+                ;;  position in the next file.
+                ((and (equal "-position" arg)
+                       (string-match "\\+\\([0-9]+\\)\\(?::\\([0-9]+\\)\\)? "
+                                     request))
+                 (setq lineno (string-to-number (match-string 1 request))
+                       columnno (if (null (match-end 2)) 0
+                                   (string-to-number (match-string 2 request)))
+                       request (substring request (match-end 0))))
+
+                ;; -file FILENAME:  Load the given file.
+                ((and (equal "-file" arg)
+                       (string-match "\\([^ ]+\\) " request))
+                 (let ((file (server-unquote-arg (match-string 1 request))))
+                   (setq request (substring request (match-end 0)))
+                   (if coding-system
+                       (setq file (decode-coding-string file coding-system)))
+                   (setq file (command-line-normalize-file-name file))
+                   (push (list file lineno columnno) files)
+                   (server-log (format "New file: %s (%d:%d)"
+                                        file lineno columnno) proc))
+                 (setq lineno 1
+                       columnno 0))
+
+                ;; -eval EXPR:  Evaluate a Lisp expression.
+                ((and (equal "-eval" arg)
+                       (string-match "\\([^ ]+\\) " request))
+                 (lexical-let ((expr (server-unquote-arg
+                                       (match-string 1 request))))
+                   (setq request (substring request (match-end 0)))
+                   (if coding-system
+                       (setq expr (decode-coding-string expr coding-system)))
+                    (push (lambda () (server-eval-and-print expr proc))
+                          commands)
+                   (setq lineno 1
+                         columnno 0)))
+
+                ;; -env NAME=VALUE:  An environment variable.
+                ((and (equal "-env" arg) (string-match "\\([^ ]+\\) " request))
+                 (let ((var (server-unquote-arg (match-string 1 request))))
+                   ;; XXX Variables should be encoded as in getenv/setenv.
+                   (setq request (substring request (match-end 0)))
+                    (process-put proc 'env
+                                 (cons var (process-get proc 'env)))))
+
+                ;; -dir DIRNAME:  The cwd of the emacsclient process.
+                ((and (equal "-dir" arg) (string-match "\\([^ ]+\\) " request))
+                 (setq dir (server-unquote-arg (match-string 1 request)))
+                 (setq request (substring request (match-end 0)))
+                 (if coding-system
+                     (setq dir (decode-coding-string dir coding-system)))
+                 (setq dir (command-line-normalize-file-name dir)))
+
+                ;; Unknown command.
+                (t (error "Unknown command: %s" arg)))))
+            
+            (setq frame
+                  (case tty-name
+                    ((nil) (if display (server-select-display display)))
+                    ((window-system)
+                     (server-create-window-system-frame display nowait proc))
+                    (t (server-create-tty-frame tty-name tty-type proc))))
+
+            (process-put proc 'continuation
+                         (lexical-let ((proc proc)
+                                       (files files)
+                                       (nowait nowait)
+                                       (commands commands)
+                                       (dontkill dontkill)
+                                       (frame frame)
+                                       (tty-name tty-name))
+                           (lambda ()
+                             (server-execute proc files nowait commands
+                                             dontkill frame tty-name))))
+
+            (when (or frame files)
+              (server-goto-toplevel proc))
+
+            (server-execute-continuation proc))))
+    ;; condition-case
+    (error (server-return-error proc err))))
+
+(defun server-execute (proc files nowait commands dontkill frame tty-name)
+  (condition-case err
+      (let* ((buffers
+              (when files
+                (run-hooks 'pre-command-hook)
+                (prog1 (server-visit-files files proc nowait)
+                  (run-hooks 'post-command-hook)))))
+
+        (mapc 'funcall (nreverse commands))
+              
+        ;; Delete the client if necessary.
+        (cond
+         (nowait
+          ;; Client requested nowait; return immediately.
+          (server-log "Close nowait client" proc)
+          (server-delete-client proc))
+         ((and (not dontkill) (null buffers))
+          ;; This client is empty; get rid of it immediately.
+          (server-log "Close empty client" proc)
+          (server-delete-client proc)))
+        (cond
+         ((or isearch-mode (minibufferp))
+          nil)
+         ((and frame (null buffers))
+          (message "%s" (substitute-command-keys
+                         "When done with this frame, type \\[delete-frame]")))
+         ((not (null buffers))
+          (server-switch-buffer (car buffers))
+          (run-hooks 'server-switch-hook)
+          (unless nowait
+            (message "%s" (substitute-command-keys
                            "When done with a buffer, type \\[server-edit]")))))
-      (when (frame-live-p tmp-frame)
-        ;; Delete tmp-frame or make it visible depending on whether it's
-        ;; been used or not.
-        (server-unselect-display tmp-frame))))
-  ;; Save for later any partial line that remains.
-  (when (> (length string) 0)
-    (process-put proc :previous-string string)))
+        (when (and frame (null tty-name))
+          (server-unselect-display frame)))
+    (error (server-return-error proc err))))
+
+(defun server-return-error (proc err)
+  (ignore-errors
+    (server-send-string
+     proc (concat "-error " (server-quote-arg
+                             (error-message-string err))))
+    (server-log (error-message-string err) proc)
+    (delete-process proc)))
 
 (defun server-goto-line-column (file-line-col)
+  "Move point to the position indicated in FILE-LINE-COL.
+FILE-LINE-COL should be a three-element list as described in
+`server-visit-files'."
   (goto-line (nth 1 file-line-col))
   (let ((column-number (nth 2 file-line-col)))
-    (when (> column-number 0)
-      (move-to-column (1- column-number)))))
+    (if (> column-number 0)
+       (move-to-column (1- column-number)))))
 
-(defun server-visit-files (files client &optional nowait)
-  "Find FILES and return the list CLIENT with the buffers nconc'd.
+(defun server-visit-files (files proc &optional nowait)
+  "Find FILES and return a list of buffers created.
 FILES is an alist whose elements are (FILENAME LINENUMBER COLUMNNUMBER).
+PROC is the client that requested this operation.
 NOWAIT non-nil means this client is not waiting for the results,
 so don't mark these buffers specially, just visit them normally."
   ;; Bind last-nonmenu-event to force use of keyboard, not mouse, for queries.
@@ -534,7 +1013,7 @@ so don't mark these buffers specially, just visit them normally."
        ;; modified, revert it.  If there is an existing buffer with
        ;; deleted file, offer to write it.
        (let* ((minibuffer-auto-raise (or server-raise-frame
-                                          minibuffer-auto-raise))
+                                         minibuffer-auto-raise))
               (filen (car file))
               (obuf (get-file-buffer filen)))
          (add-to-history 'file-name-history filen)
@@ -542,14 +1021,14 @@ so don't mark these buffers specially, just visit them normally."
              (progn
                (cond ((file-exists-p filen)
                       (when (not (verify-visited-file-modtime obuf))
-                         (revert-buffer t nil)))
+                        (revert-buffer t nil)))
                      (t
                       (when (y-or-n-p
-                              (concat "File no longer exists: "
-                                      filen
-                                      ", write buffer to file? "))
-                         (write-file filen))))
-               (setq server-existing-buffer t)
+                             (concat "File no longer exists: " filen
+                                     ", write buffer to file? "))
+                        (write-file filen))))
+               (unless server-buffer-clients
+                 (setq server-existing-buffer t))
                (server-goto-line-column file))
            (set-buffer (find-file-noselect filen))
            (server-goto-line-column file)
@@ -557,9 +1036,12 @@ so don't mark these buffers specially, just visit them normally."
        (unless nowait
          ;; When the buffer is killed, inform the clients.
          (add-hook 'kill-buffer-hook 'server-kill-buffer nil t)
-         (push (car client) server-buffer-clients))
+         (push proc server-buffer-clients))
        (push (current-buffer) client-record)))
-    (nconc client client-record)))
+    (unless nowait
+      (process-put proc 'buffers
+                   (nconc (process-get proc 'buffers) client-record)))
+    client-record))
 \f
 (defun server-buffer-done (buffer &optional for-killing)
   "Mark BUFFER as \"done\" for its client(s).
@@ -569,27 +1051,24 @@ or nil.  KILLED is t if we killed BUFFER (typically, because it was visiting
 a temp file).
 FOR-KILLING if non-nil indicates that we are called from `kill-buffer'."
   (let ((next-buffer nil)
-       (killed nil)
-       (old-clients server-clients))
-    (while old-clients
-      (let ((client (car old-clients)))
+       (killed nil))
+    (dolist (proc server-clients)
+      (let ((buffers (process-get proc 'buffers)))
        (or next-buffer
-           (setq next-buffer (nth 1 (memq buffer client))))
-       (delq buffer client)
-       ;; Delete all dead buffers from CLIENT.
-       (let ((tail client))
-         (while tail
-           (and (bufferp (car tail))
-                (null (buffer-name (car tail)))
-                (delq (car tail) client))
-           (setq tail (cdr tail))))
-       ;; If client now has no pending buffers,
-       ;; tell it that it is done, and forget it entirely.
-       (unless (cdr client)
-         (delete-process (car client))
-         (server-log "Close" (car client))
-         (setq server-clients (delq client server-clients))))
-      (setq old-clients (cdr old-clients)))
+           (setq next-buffer (nth 1 (memq buffer buffers))))
+       (when buffers                   ; Ignore bufferless clients.
+         (setq buffers (delq buffer buffers))
+         ;; Delete all dead buffers from PROC.
+         (dolist (b buffers)
+           (and (bufferp b)
+                (not (buffer-live-p b))
+                (setq buffers (delq b buffers))))
+         (process-put proc 'buffers buffers)
+         ;; If client now has no pending buffers,
+         ;; tell it that it is done, and forget it entirely.
+         (unless buffers
+           (server-log "Close" proc)
+           (server-delete-client proc)))))
     (when (and (bufferp buffer) (buffer-name buffer))
       ;; We may or may not kill this buffer;
       ;; if we do, do not call server-buffer-done recursively
@@ -654,30 +1133,32 @@ specifically for the clients and did not exist before their request for it."
 ;; but I think that is dangerous--the client would proceed
 ;; using whatever is on disk in that file. -- rms.
 (defun server-kill-buffer-query-function ()
+  "Ask before killing a server buffer."
   (or (not server-buffer-clients)
+      (let ((res t))
+       (dolist (proc server-buffer-clients res)
+          (when (and (memq proc server-clients)
+                     (eq (process-status proc) 'open))
+            (setq res nil))))
       (yes-or-no-p (format "Buffer `%s' still has clients; kill it? "
                           (buffer-name (current-buffer))))))
 
-(add-hook 'kill-buffer-query-functions
-         'server-kill-buffer-query-function)
-
 (defun server-kill-emacs-query-function ()
-  (let (live-client
-       (tail server-clients))
-    ;; See if any clients have any buffers that are still alive.
-    (while tail
-      (when (memq t (mapcar 'stringp (mapcar 'buffer-name (cdr (car tail)))))
-       (setq live-client t))
-      (setq tail (cdr tail)))
-    (or (not live-client)
-       (yes-or-no-p "Server buffers still have clients; exit anyway? "))))
-
-(add-hook 'kill-emacs-query-functions 'server-kill-emacs-query-function)
+  "Ask before exiting Emacs it has live clients."
+  (or (not server-clients)
+      (let (live-client)
+       (dolist (proc server-clients live-client)
+         (when (memq t (mapcar 'buffer-live-p (process-get
+                                               proc 'buffers)))
+           (setq live-client t))))
+      (yes-or-no-p "This Emacs session has clients; exit anyway? ")))
 
 (defvar server-kill-buffer-running nil
   "Non-nil while `server-kill-buffer' or `server-buffer-done' is running.")
 
 (defun server-kill-buffer ()
+  "Remove the current buffer from its clients' buffer list.
+Designed to be added to `kill-buffer-hook'."
   ;; Prevent infinite recursion if user has made server-done-hook
   ;; call kill-buffer.
   (or server-kill-buffer-running
@@ -711,18 +1192,26 @@ starts server process and that is all.  Invoked by \\[server-edit]."
 
 (defun server-switch-buffer (&optional next-buffer killed-one)
   "Switch to another buffer, preferably one that has a client.
-Arg NEXT-BUFFER is a suggestion; if it is a live buffer, use it."
-  ;; KILLED-ONE is t in a recursive call
-  ;; if we have already killed one temp-file server buffer.
-  ;; This means we should avoid the final "switch to some other buffer"
-  ;; since we've already effectively done that.
+Arg NEXT-BUFFER is a suggestion; if it is a live buffer, use it.
+
+KILLED-ONE is t in a recursive call if we have already killed one
+temp-file server buffer.  This means we should avoid the final
+\"switch to some other buffer\" since we've already effectively
+done that."
   (if (null next-buffer)
-      (if server-clients
-         (server-switch-buffer (nth 1 (car server-clients)) killed-one)
-       (unless (or killed-one (window-dedicated-p (selected-window)))
-         (switch-to-buffer (other-buffer))
+      (progn
+       (let ((rest server-clients))
+         (while (and rest (not next-buffer))
+           (let ((proc (car rest)))
+             ;; Only look at frameless clients.
+             (when (not (process-get proc 'frame))
+               (setq next-buffer (car (process-get proc 'buffers))))
+             (setq rest (cdr rest)))))
+       (and next-buffer (server-switch-buffer next-buffer killed-one))
+       (unless (or next-buffer killed-one (window-dedicated-p (selected-window)))
+         ;; (switch-to-buffer (other-buffer))
          (message "No server buffers remain to edit")))
-    (if (not (buffer-name next-buffer))
+    (if (not (buffer-live-p next-buffer))
        ;; If NEXT-BUFFER is a dead buffer, remove the server records for it
        ;; and try the next surviving server buffer.
        (apply 'server-switch-buffer (server-buffer-done next-buffer))
@@ -750,8 +1239,8 @@ Arg NEXT-BUFFER is a suggestion; if it is a live buffer, use it."
               (get-window-with-predicate
                (lambda (w)
                  (and (not (window-dedicated-p w))
-                      (equal (frame-parameter (window-frame w) 'display)
-                             (frame-parameter (selected-frame) 'display))))
+                      (equal (frame-terminal (window-frame w))
+                             (frame-terminal (selected-frame)))))
                'nomini 'visible (selected-window))))
            (condition-case nil
                (switch-to-buffer next-buffer)
@@ -761,10 +1250,31 @@ Arg NEXT-BUFFER is a suggestion; if it is a live buffer, use it."
     (when server-raise-frame
       (select-frame-set-input-focus (window-frame (selected-window))))))
 
+;;;###autoload
+(defun server-save-buffers-kill-terminal (proc &optional arg)
+  "Offer to save each buffer, then kill PROC.
+
+With prefix arg, 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."
+  (let ((buffers (process-get proc 'buffers)))
+    ;; If client is bufferless, emulate a normal Emacs session
+    ;; exit and offer to save all buffers.  Otherwise, offer to
+    ;; save only the buffers belonging to the client.
+    (save-some-buffers arg
+                      (if buffers
+                          (lambda () (memq (current-buffer) buffers))
+                        t))
+    (server-delete-client proc)))
+
 (define-key ctl-x-map "#" 'server-edit)
 
 (defun server-unload-hook ()
+  "Unload the server library."
   (server-mode -1)
+  (remove-hook 'suspend-tty-functions 'server-handle-suspend-tty)
+  (remove-hook 'delete-frame-functions 'server-handle-delete-frame)
   (remove-hook 'kill-buffer-query-functions 'server-kill-buffer-query-function)
   (remove-hook 'kill-emacs-query-functions 'server-kill-emacs-query-function)
   (remove-hook 'kill-buffer-hook 'server-kill-buffer))
index e19b177ef421e5f7bf7777d8805a178504e004ed..3f904fde0d21150c2230193257247ccf781ee947 100644 (file)
@@ -628,8 +628,9 @@ the old and FORCE is nil."
     (let ((oldval  (ses-cell-value   cell))
          (formula (ses-cell-formula cell))
          newval)
-      (if (eq (car-safe formula) 'ses-safe-formula)
-         (ses-set-cell row col 'formula (ses-safe-formula (cadr formula))))
+      (when (eq (car-safe formula) 'ses-safe-formula)
+       (setq formula (ses-safe-formula (cadr formula)))
+       (ses-set-cell row col 'formula formula))
       (condition-case sig
          (setq newval (eval formula))
        (error
index 6c09654a0e57db602444a617ced3e6750ad28a76..a8daf8b76d2415fc1761c8579e18982329e31baf 100644 (file)
@@ -542,15 +542,16 @@ Otherwise, one argument `-i' is passed to the shell.
   (interactive
    (list
     (and current-prefix-arg
-        (read-buffer "Shell buffer: "
-                     (generate-new-buffer-name "*shell*"))
-        (file-remote-p default-directory)
-        ;; It must be possible to declare a local default-directory.
-        (setq default-directory
-              (expand-file-name
-               (read-file-name
-                "Default directory: " default-directory default-directory
-                t nil 'file-directory-p))))))
+        (prog1
+            (read-buffer "Shell buffer: "
+                         (generate-new-buffer-name "*shell*"))
+          (if (file-remote-p default-directory)
+              ;; It must be possible to declare a local default-directory.
+              (setq default-directory
+                    (expand-file-name
+                     (read-file-name
+                      "Default directory: " default-directory default-directory
+                      t nil 'file-directory-p))))))))
   (setq buffer (get-buffer-create (or buffer "*shell*")))
   ;; Pop to buffer, so that the buffer's window will be correctly set
   ;; when we call comint (so that comint sets the COLUMNS env var properly).
@@ -807,51 +808,54 @@ new directory stack -- you lose.  If this happens, just do the
 command again."
   (interactive)
   (let* ((proc (get-buffer-process (current-buffer)))
-        (pmark (process-mark proc)))
-    (goto-char pmark)
-    ;; If the process echoes commands, don't insert a fake command in
-    ;; the buffer or it will appear twice.
-    (unless comint-process-echoes
-      (insert shell-dirstack-query) (insert "\n"))
-    (sit-for 0) ; force redisplay
-    (comint-send-string proc shell-dirstack-query)
-    (comint-send-string proc "\n")
-    (set-marker pmark (point))
-    (let ((pt (point))
-         (regexp
-          (concat
-           (if comint-process-echoes
-               ;; Skip command echo if the process echoes
-               (concat "\\(" (regexp-quote shell-dirstack-query) "\n\\)")
-             "\\(\\)")
-           "\\(.+\n\\)")))
-      ;; This extra newline prevents the user's pending input from spoofing us.
-      (insert "\n") (backward-char 1)
-      ;; Wait for one line.
-      (while (not (looking-at regexp))
-       (accept-process-output proc)
-       (goto-char pt)))
-    (goto-char pmark) (delete-char 1) ; remove the extra newline
-    ;; That's the dirlist. grab it & parse it.
-    (let* ((dl (buffer-substring (match-beginning 2) (1- (match-end 2))))
-          (dl-len (length dl))
-          (ds '())                     ; new dir stack
-          (i 0))
-      (while (< i dl-len)
-       ;; regexp = optional whitespace, (non-whitespace), optional whitespace
-       (string-match "\\s *\\(\\S +\\)\\s *" dl i) ; pick off next dir
-       (setq ds (cons (concat comint-file-name-prefix
-                              (substring dl (match-beginning 1)
-                                         (match-end 1)))
-                      ds))
-       (setq i (match-end 0)))
-      (let ((ds (nreverse ds)))
-       (condition-case nil
-           (progn (shell-cd (car ds))
-                  (setq shell-dirstack (cdr ds)
-                        shell-last-dir (car shell-dirstack))
-                  (shell-dirstack-message))
-         (error (message "Couldn't cd")))))))
+        (pmark (process-mark proc))
+        (started-at-pmark (= (point) (marker-position pmark))))
+    (save-excursion
+      (goto-char pmark)
+      ;; If the process echoes commands, don't insert a fake command in
+      ;; the buffer or it will appear twice.
+      (unless comint-process-echoes
+       (insert shell-dirstack-query) (insert "\n"))
+      (sit-for 0)                      ; force redisplay
+      (comint-send-string proc shell-dirstack-query)
+      (comint-send-string proc "\n")
+      (set-marker pmark (point))
+      (let ((pt (point))
+           (regexp
+            (concat
+             (if comint-process-echoes
+                 ;; Skip command echo if the process echoes
+                 (concat "\\(" (regexp-quote shell-dirstack-query) "\n\\)")
+               "\\(\\)")
+             "\\(.+\n\\)")))
+       ;; This extra newline prevents the user's pending input from spoofing us.
+       (insert "\n") (backward-char 1)
+       ;; Wait for one line.
+       (while (not (looking-at regexp))
+         (accept-process-output proc)
+         (goto-char pt)))
+      (goto-char pmark) (delete-char 1) ; remove the extra newline
+      ;; That's the dirlist. grab it & parse it.
+      (let* ((dl (buffer-substring (match-beginning 2) (1- (match-end 2))))
+            (dl-len (length dl))
+            (ds '())                   ; new dir stack
+            (i 0))
+       (while (< i dl-len)
+         ;; regexp = optional whitespace, (non-whitespace), optional whitespace
+         (string-match "\\s *\\(\\S +\\)\\s *" dl i) ; pick off next dir
+         (setq ds (cons (concat comint-file-name-prefix
+                                (substring dl (match-beginning 1)
+                                           (match-end 1)))
+                        ds))
+         (setq i (match-end 0)))
+       (let ((ds (nreverse ds)))
+         (condition-case nil
+             (progn (shell-cd (car ds))
+                    (setq shell-dirstack (cdr ds)
+                          shell-last-dir (car shell-dirstack))
+                    (shell-dirstack-message))
+           (error (message "Couldn't cd"))))))
+    (if started-at-pmark (goto-char (marker-position pmark)))))
 
 ;; For your typing convenience:
 (defalias 'dirs 'shell-resync-dirs)
index 27d7abfc8e75d8c798f37a6a851a4ccf9e464525..f2055faf385801a75435b673a13b07b89b3a154e 100644 (file)
@@ -85,34 +85,22 @@ If the optional third argument FRAME is non-nil, use that frame's
 buffer list instead of the selected frame's buffer list.
 If no other buffer exists, the buffer `*scratch*' is returned."
   (setq frame (or frame (selected-frame)))
-  (or (get-next-valid-buffer (frame-parameter frame 'buried-buffer-list)
-                            buffer visible-ok frame)
-      (get-next-valid-buffer (nreverse (buffer-list frame))
-                            buffer visible-ok frame)
+  (or (get-next-valid-buffer (nreverse (buffer-list frame))
+                            buffer visible-ok frame)
       (progn
        (set-buffer-major-mode (get-buffer-create "*scratch*"))
        (get-buffer "*scratch*"))))
-
 (defun next-buffer ()
   "Switch to the next buffer in cyclic order."
   (interactive)
-  (let ((buffer (current-buffer))
-       (bbl (frame-parameter nil 'buried-buffer-list)))
+  (let ((buffer (current-buffer)))
     (switch-to-buffer (other-buffer buffer t))
-    (bury-buffer buffer)
-    (set-frame-parameter nil 'buried-buffer-list
-                        (cons buffer (delq buffer bbl)))))
+    (bury-buffer buffer)))
 
 (defun previous-buffer ()
   "Switch to the previous buffer in cyclic order."
   (interactive)
-  (let ((buffer (last-buffer (current-buffer) t))
-       (bbl (frame-parameter nil 'buried-buffer-list)))
-    (switch-to-buffer buffer)
-    ;; Clean up buried-buffer-list up to and including the chosen buffer.
-    (while (and bbl (not (eq (car bbl) buffer)))
-      (setq bbl (cdr bbl)))
-    (set-frame-parameter nil 'buried-buffer-list bbl)))
+  (switch-to-buffer (last-buffer (current-buffer) t)))
 
 \f
 ;;; next-error support framework
@@ -469,7 +457,7 @@ than the value of `fill-column' and ARG is nil."
     ;; Mark the newline(s) `hard'.
     (if use-hard-newlines
        (set-hard-newline-properties
-        (- (point) (if arg (prefix-numeric-value arg) 1)) (point)))
+        (- (point) (prefix-numeric-value arg)) (point)))
     ;; If the newline leaves the previous line blank,
     ;; and we have a left margin, delete that from the blank line.
     (or flag
@@ -1055,7 +1043,7 @@ display the result of expression evaluation."
                (if (boundp 'edebug-active) edebug-active)))
       (let ((char-string
              (if (or (if (boundp 'edebug-active) edebug-active)
-                     (memq this-command '(eval-last-sexp eval-print-last-sexp)))
+                    (memq this-command '(eval-last-sexp eval-print-last-sexp)))
                  (prin1-char value))))
         (if char-string
             (format " (#o%o, #x%x, %s)" value value char-string)
@@ -2557,6 +2545,8 @@ the text which should be made available.
 The second, optional, argument PUSH, has the same meaning as the
 similar argument to `x-set-cut-buffer', which see.")
 
+(make-variable-frame-local 'interprogram-cut-function)
+
 (defvar interprogram-paste-function nil
   "Function to call to get text cut from other programs.
 
@@ -2577,6 +2567,8 @@ most recent string, the function should return nil.  If it is
 difficult to tell whether Emacs or some other program provided the
 current string, it is probably good enough to return nil if the string
 is equal (according to `string=') to the last text Emacs provided.")
+
+(make-variable-frame-local 'interprogram-paste-function)
 \f
 
 
@@ -2753,7 +2745,9 @@ text.  See `insert-for-yank'."
   "Save the region as if killed, but don't kill it.
 In Transient Mark mode, deactivate the mark.
 If `interprogram-cut-function' is non-nil, also save the text for a window
-system cut and paste."
+system cut and paste.
+
+This command's old key binding has been given to `kill-ring-save'."
   (interactive "r")
   (if (eq last-command 'kill-region)
       (kill-append (filter-buffer-substring beg end) (< end beg))
@@ -2823,7 +2817,7 @@ The argument is used for internal purposes; do not supply one."
 (defcustom yank-excluded-properties
   '(read-only invisible intangible field mouse-face help-echo local-map keymap
     yank-handler follow-link fontified)
-  "*Text properties to discard when yanking.
+  "Text properties to discard when yanking.
 The value should be a list of text properties to discard or t,
 which means to discard all text properties."
   :type '(choice (const :tag "All" t) (repeat symbol))
@@ -3631,7 +3625,7 @@ The beginning of a blank line does not count as the end of a line."
   "Current goal column for vertical motion.
 It is the column where point was
 at the start of current run of vertical motion commands.
-When the `track-eol' feature is doing its job, the value is 9999.")
+When the `track-eol' feature is doing its job, the value is `most-positive-fixnum'.")
 
 (defcustom line-move-ignore-invisible t
   "*Non-nil means \\[next-line] and \\[previous-line] ignore invisible lines.
@@ -3653,7 +3647,7 @@ Outline mode sets this."
           (vpos (nth 1 lh))
           (ypos (nth 2 lh))
           (rbot (nth 3 lh))
-          ppos py vs)
+          py vs)
       (when (or (null lh)
                (>= rbot (frame-char-height))
                (<= ypos (- (frame-char-height))))
@@ -3730,11 +3724,11 @@ Outline mode sets this."
                             ;; Don't count beg of empty line as end of line
                             ;; unless we just did explicit end-of-line.
                             (or (not (bolp)) (eq last-command 'move-end-of-line)))
-                       9999
+                       most-positive-fixnum
                      (current-column))))
 
-         (if (and (not (integerp selective-display))
-                  (not line-move-ignore-invisible))
+         (if (not (or (integerp selective-display)
+                       line-move-ignore-invisible))
              ;; Use just newline characters.
              ;; Set ARG to 0 if we move as many lines as requested.
              (or (if (> arg 0)
@@ -3973,7 +3967,8 @@ To ignore intangibility, bind `inhibit-point-motion-hooks' to t."
                      (not (bobp))
                      (progn
                        (while (and (not (bobp)) (invisible-p (1- (point))))
-                         (goto-char (previous-char-property-change (point))))
+                         (goto-char (previous-single-char-property-change
+                                      (point) 'invisible)))
                        (backward-char 1)))
                 (point)))))
        (goto-char newpos)
@@ -4000,7 +3995,7 @@ To ignore intangibility, bind `inhibit-point-motion-hooks' to t."
   (or arg (setq arg 1))
 
   (let ((orig (point))
-       start first-vis first-vis-field-value)
+       first-vis first-vis-field-value)
 
     ;; Move by lines, if ARG is not 1 (the default).
     (if (/= arg 1)
@@ -4011,7 +4006,6 @@ To ignore intangibility, bind `inhibit-point-motion-hooks' to t."
     (while (and (not (bobp)) (invisible-p (1- (point))))
       (goto-char (previous-char-property-change (point)))
       (skip-chars-backward "^\n"))
-    (setq start (point))
 
     ;; Now find first visible char in the line
     (while (and (not (eobp)) (invisible-p (point)))
@@ -4662,86 +4656,82 @@ it skips the contents of comments that end before point."
                                 (skip-syntax-backward "/\\")
                                 (point))))))
     (let* ((oldpos (point))
-          blinkpos
-          message-log-max  ; Don't log messages about paren matching.
-          matching-paren
-          open-paren-line-string)
-      (save-excursion
-       (save-restriction
-         (if blink-matching-paren-distance
-             (narrow-to-region (max (minibuffer-prompt-end)
-                                    (- (point) blink-matching-paren-distance))
-                               oldpos))
-         (condition-case ()
-             (let ((parse-sexp-ignore-comments
-                    (and parse-sexp-ignore-comments
-                         (not blink-matching-paren-dont-ignore-comments))))
-               (setq blinkpos (scan-sexps oldpos -1)))
-           (error nil)))
-       (and blinkpos
-            ;; Not syntax '$'.
-            (not (eq (syntax-class (syntax-after blinkpos)) 8))
-            (setq matching-paren
-                  (let ((syntax (syntax-after blinkpos)))
-                    (and (consp syntax)
-                         (eq (syntax-class syntax) 4)
-                         (cdr syntax)))))
-       (cond
-        ((not (or (eq matching-paren (char-before oldpos))
-                   ;; The cdr might hold a new paren-class info rather than
-                   ;; a matching-char info, in which case the two CDRs
-                   ;; should match.
-                   (eq matching-paren (cdr (syntax-after (1- oldpos))))))
-         (message "Mismatched parentheses"))
-        ((not blinkpos)
-         (if (not blink-matching-paren-distance)
-             (message "Unmatched parenthesis")))
-        ((pos-visible-in-window-p blinkpos)
-         ;; Matching open within window, temporarily move to blinkpos but only
-         ;; if `blink-matching-paren-on-screen' is non-nil.
-         (and blink-matching-paren-on-screen
-              (not show-paren-mode)
-              (save-excursion
-                (goto-char blinkpos)
-                (sit-for blink-matching-delay))))
-        (t
-         (save-excursion
-           (goto-char blinkpos)
-           (setq open-paren-line-string
-                 ;; Show what precedes the open in its line, if anything.
-                 (if (save-excursion
-                       (skip-chars-backward " \t")
-                       (not (bolp)))
-                     (buffer-substring (line-beginning-position)
-                                       (1+ blinkpos))
-                   ;; Show what follows the open in its line, if anything.
-                   (if (save-excursion
-                         (forward-char 1)
-                         (skip-chars-forward " \t")
-                         (not (eolp)))
-                       (buffer-substring blinkpos
-                                         (line-end-position))
-                     ;; Otherwise show the previous nonblank line,
-                     ;; if there is one.
-                     (if (save-excursion
-                           (skip-chars-backward "\n \t")
-                           (not (bobp)))
-                         (concat
-                          (buffer-substring (progn
-                                              (skip-chars-backward "\n \t")
-                                              (line-beginning-position))
-                                            (progn (end-of-line)
-                                                   (skip-chars-backward " \t")
-                                                   (point)))
-                          ;; Replace the newline and other whitespace with `...'.
-                          "..."
-                          (buffer-substring blinkpos (1+ blinkpos)))
-                       ;; There is nothing to show except the char itself.
-                       (buffer-substring blinkpos (1+ blinkpos)))))))
-         (message "Matches %s"
-                  (substring-no-properties open-paren-line-string))))))))
-
-;Turned off because it makes dbx bomb out.
+          (message-log-max nil)  ; Don't log messages about paren matching.
+          (blinkpos
+            (save-excursion
+              (save-restriction
+                (if blink-matching-paren-distance
+                    (narrow-to-region
+                     (max (minibuffer-prompt-end) ;(point-min) unless minibuf.
+                          (- (point) blink-matching-paren-distance))
+                     oldpos))
+                (let ((parse-sexp-ignore-comments
+                       (and parse-sexp-ignore-comments
+                            (not blink-matching-paren-dont-ignore-comments))))
+                  (condition-case ()
+                      (scan-sexps oldpos -1)
+                    (error nil))))))
+          (matching-paren
+            (and blinkpos
+                 ;; Not syntax '$'.
+                 (not (eq (syntax-class (syntax-after blinkpos)) 8))
+                 (let ((syntax (syntax-after blinkpos)))
+                   (and (consp syntax)
+                        (eq (syntax-class syntax) 4)
+                        (cdr syntax))))))
+      (cond
+       ((not (or (eq matching-paren (char-before oldpos))
+                 ;; The cdr might hold a new paren-class info rather than
+                 ;; a matching-char info, in which case the two CDRs
+                 ;; should match.
+                 (eq matching-paren (cdr (syntax-after (1- oldpos))))))
+        (message "Mismatched parentheses"))
+       ((not blinkpos)
+        (if (not blink-matching-paren-distance)
+            (message "Unmatched parenthesis")))
+       ((pos-visible-in-window-p blinkpos)
+        ;; Matching open within window, temporarily move to blinkpos but only
+        ;; if `blink-matching-paren-on-screen' is non-nil.
+        (and blink-matching-paren-on-screen
+             (not show-paren-mode)
+             (save-excursion
+               (goto-char blinkpos)
+               (sit-for blink-matching-delay))))
+       (t
+        (save-excursion
+          (goto-char blinkpos)
+          (let ((open-paren-line-string
+                 ;; Show what precedes the open in its line, if anything.
+                 (cond
+                  ((save-excursion (skip-chars-backward " \t") (not (bolp)))
+                   (buffer-substring (line-beginning-position)
+                                     (1+ blinkpos)))
+                  ;; Show what follows the open in its line, if anything.
+                  ((save-excursion
+                     (forward-char 1)
+                     (skip-chars-forward " \t")
+                     (not (eolp)))
+                   (buffer-substring blinkpos
+                                     (line-end-position)))
+                  ;; Otherwise show the previous nonblank line,
+                  ;; if there is one.
+                  ((save-excursion (skip-chars-backward "\n \t") (not (bobp)))
+                   (concat
+                    (buffer-substring (progn
+                                        (skip-chars-backward "\n \t")
+                                        (line-beginning-position))
+                                      (progn (end-of-line)
+                                             (skip-chars-backward " \t")
+                                             (point)))
+                    ;; Replace the newline and other whitespace with `...'.
+                    "..."
+                    (buffer-substring blinkpos (1+ blinkpos))))
+                  ;; There is nothing to show except the char itself.
+                  (t (buffer-substring blinkpos (1+ blinkpos))))))
+            (message "Matches %s"
+                     (substring-no-properties open-paren-line-string)))))))))
+
+;; Turned off because it makes dbx bomb out.
 (setq blink-paren-function 'blink-matching-open)
 \f
 ;; This executes C-g typed while Emacs is waiting for a command.
@@ -5558,13 +5548,13 @@ after it has been set up properly in other respects."
       (funcall mode)
 
       ;; Set up other local variables.
-      (mapcar (lambda (v)
-               (condition-case ()      ;in case var is read-only
-                   (if (symbolp v)
-                       (makunbound v)
-                     (set (make-local-variable (car v)) (cdr v)))
-                 (error nil)))
-             lvars)
+      (mapc (lambda (v)
+             (condition-case ()        ;in case var is read-only
+                 (if (symbolp v)
+                     (makunbound v)
+                   (set (make-local-variable (car v)) (cdr v)))
+               (error nil)))
+           lvars)
 
       ;; Run any hooks (typically set up by the major mode
       ;; for cloning to work properly).
@@ -5626,36 +5616,33 @@ front of the list of recently selected ones."
 \f
 ;;; Handling of Backspace and Delete keys.
 
-(defcustom normal-erase-is-backspace
-  (and (not noninteractive)
-       (or (memq system-type '(ms-dos windows-nt))
-          (eq window-system 'mac)
-          (and (memq window-system '(x))
-               (fboundp 'x-backspace-delete-keys-p)
-               (x-backspace-delete-keys-p))
-          ;; If the terminal Emacs is running on has erase char
-          ;; set to ^H, use the Backspace key for deleting
-          ;; backward and, and the Delete key for deleting forward.
-          (and (null window-system)
-               (eq tty-erase-char ?\^H))))
-  "If non-nil, Delete key deletes forward and Backspace key deletes backward.
-
-On window systems, the default value of this option is chosen
-according to the keyboard used.  If the keyboard has both a Backspace
-key and a Delete key, and both are mapped to their usual meanings, the
-option's default value is set to t, so that Backspace can be used to
-delete backward, and Delete can be used to delete forward.
-
-If not running under a window system, customizing 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
-the F1 key.  You should probably not use this setting if you don't
-have both Backspace, Delete and F1 keys.
+(defcustom normal-erase-is-backspace 'maybe
+  "Set the default behaviour of the Delete and Backspace keys.
+
+If set to t, Delete key deletes forward and Backspace key deletes
+backward.
+
+If set to nil, both Delete and Backspace keys delete backward.
+
+If set to 'maybe (which is the default), Emacs automatically
+selects a behaviour.  On window systems, the behaviour depends on
+the keyboard used.  If the keyboard has both a Backspace key and
+a Delete key, and both are mapped to their usual meanings, the
+option's default value is set to t, so that Backspace can be used
+to delete backward, and Delete can be used to delete forward.
+
+If not running under a window system, customizing 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 the F1 key.  You should probably not use this
+setting if you don't have both Backspace, Delete and F1 keys.
 
 Setting this variable with setq doesn't take effect.  Programmatically,
 call `normal-erase-is-backspace-mode' (which see) instead."
-  :type 'boolean
+  :type '(choice (const :tag "Off" nil)
+                (const :tag "Maybe" maybe)
+                (other :tag "On" t))
   :group 'editing-basics
   :version "21.1"
   :set (lambda (symbol value)
@@ -5665,17 +5652,37 @@ call `normal-erase-is-backspace-mode' (which see) instead."
             (normal-erase-is-backspace-mode (or value 0))
           (set-default symbol value))))
 
+(defun normal-erase-is-backspace-setup-frame (&optional frame)
+  "Set up `normal-erase-is-backspace-mode' on FRAME, if necessary."
+  (unless frame (setq frame (selected-frame)))
+  (with-selected-frame frame
+    (unless (terminal-parameter nil 'normal-erase-is-backspace)
+      (normal-erase-is-backspace-mode
+       (if (if (eq normal-erase-is-backspace 'maybe)
+               (and (not noninteractive)
+                    (or (memq system-type '(ms-dos windows-nt))
+                        (eq window-system 'mac)
+                        (and (memq window-system '(x))
+                             (fboundp 'x-backspace-delete-keys-p)
+                             (x-backspace-delete-keys-p))
+                        ;; If the terminal Emacs is running on has erase char
+                        ;; set to ^H, use the Backspace key for deleting
+                        ;; backward, and the Delete key for deleting forward.
+                        (and (null window-system)
+                             (eq tty-erase-char ?\^H))))
+             normal-erase-is-backspace)
+           1 0)))))
 
 (defun normal-erase-is-backspace-mode (&optional arg)
   "Toggle the Erase and Delete mode of the Backspace and Delete keys.
 
 With numeric arg, turn the mode on if and only if ARG is positive.
 
-On window systems, when this mode is on, Delete is mapped to C-d and
-Backspace is mapped to DEL; when this mode is off, both Delete and
-Backspace are mapped to DEL.  (The remapping goes via
-`function-key-map', so binding Delete or Backspace in the global or
-local keymap will override that.)
+On window systems, when this mode is on, Delete is mapped to C-d
+and Backspace is mapped to DEL; when this mode is off, both
+Delete and Backspace are mapped to DEL.  (The remapping goes via
+`local-function-key-map', so binding Delete or Backspace in the
+global or local keymap will override that.)
 
 In addition, on window systems, the bindings of C-Delete, M-Delete,
 C-M-Delete, C-Backspace, M-Backspace, and C-M-Backspace are changed in
@@ -5697,54 +5704,57 @@ have both Backspace, Delete and F1 keys.
 
 See also `normal-erase-is-backspace'."
   (interactive "P")
-  (setq normal-erase-is-backspace
-       (if arg
-           (> (prefix-numeric-value arg) 0)
-         (not normal-erase-is-backspace)))
-
-  (cond ((or (memq window-system '(x w32 mac pc))
-            (memq system-type '(ms-dos windows-nt)))
-        (let ((bindings
-               `(([C-delete] [C-backspace])
-                 ([M-delete] [M-backspace])
-                 ([C-M-delete] [C-M-backspace])
-                 (,esc-map
-                  [C-delete] [C-backspace])))
-              (old-state (lookup-key function-key-map [delete])))
-
-          (if normal-erase-is-backspace
+  (let ((enabled (or (and arg (> (prefix-numeric-value arg) 0))
+                    (and (not arg)
+                         (not (eq 1 (terminal-parameter
+                                     nil 'normal-erase-is-backspace)))))))
+    (set-terminal-parameter nil 'normal-erase-is-backspace
+                           (if enabled 1 0))
+
+    (cond ((or (memq window-system '(x w32 mac pc))
+              (memq system-type '(ms-dos windows-nt)))
+          (let* ((bindings
+                  `(([C-delete] [C-backspace])
+                    ([M-delete] [M-backspace])
+                    ([C-M-delete] [C-M-backspace])
+                    (,esc-map
+                     [C-delete] [C-backspace])))
+                 (old-state (lookup-key local-function-key-map [delete])))
+
+            (if enabled
+                (progn
+                  (define-key local-function-key-map [delete] [?\C-d])
+                  (define-key local-function-key-map [kp-delete] [?\C-d])
+                  (define-key local-function-key-map [backspace] [?\C-?]))
+              (define-key local-function-key-map [delete] [?\C-?])
+              (define-key local-function-key-map [kp-delete] [?\C-?])
+              (define-key local-function-key-map [backspace] [?\C-?]))
+
+            ;; Maybe swap bindings of C-delete and C-backspace, etc.
+            (unless (equal old-state (lookup-key local-function-key-map [delete]))
+              (dolist (binding bindings)
+                (let ((map global-map))
+                  (when (keymapp (car binding))
+                    (setq map (car binding) binding (cdr binding)))
+                  (let* ((key1 (nth 0 binding))
+                         (key2 (nth 1 binding))
+                         (binding1 (lookup-key map key1))
+                         (binding2 (lookup-key map key2)))
+                    (define-key map key1 binding2)
+                    (define-key map key2 binding1)))))))
+         (t
+          (if enabled
               (progn
-                (define-key function-key-map [delete] [?\C-d])
-                (define-key function-key-map [kp-delete] [?\C-d])
-                (define-key function-key-map [backspace] [?\C-?]))
-            (define-key function-key-map [delete] [?\C-?])
-            (define-key function-key-map [kp-delete] [?\C-?])
-            (define-key function-key-map [backspace] [?\C-?]))
-
-          ;; Maybe swap bindings of C-delete and C-backspace, etc.
-          (unless (equal old-state (lookup-key function-key-map [delete]))
-            (dolist (binding bindings)
-              (let ((map global-map))
-                (when (keymapp (car binding))
-                  (setq map (car binding) binding (cdr binding)))
-                (let* ((key1 (nth 0 binding))
-                       (key2 (nth 1 binding))
-                       (binding1 (lookup-key map key1))
-                       (binding2 (lookup-key map key2)))
-                  (define-key map key1 binding2)
-                  (define-key map key2 binding1)))))))
-        (t
-         (if normal-erase-is-backspace
-             (progn
-               (keyboard-translate ?\C-h ?\C-?)
-               (keyboard-translate ?\C-? ?\C-d))
-           (keyboard-translate ?\C-h ?\C-h)
-           (keyboard-translate ?\C-? ?\C-?))))
-
-  (run-hooks 'normal-erase-is-backspace-hook)
-  (if (interactive-p)
-      (message "Delete key deletes %s"
-              (if normal-erase-is-backspace "forward" "backward"))))
+                (keyboard-translate ?\C-h ?\C-?)
+                (keyboard-translate ?\C-? ?\C-d))
+            (keyboard-translate ?\C-h ?\C-h)
+            (keyboard-translate ?\C-? ?\C-?))))
+
+    (run-hooks 'normal-erase-is-backspace-hook)
+    (if (interactive-p)
+       (message "Delete key deletes %s"
+                (if (terminal-parameter nil 'normal-erase-is-backspace)
+                    "forward" "backward")))))
 \f
 (defvar vis-mode-saved-buffer-invisibility-spec nil
   "Saved value of `buffer-invisibility-spec' when Visible mode is on.")
@@ -5800,7 +5810,8 @@ works by saving the value of `buffer-invisibility-spec' and setting it to nil."
   ;; Definitely 2.0pre3, probably all 2.0pre's before this.
   '((semantic semantic-version "2\\.0pre[1-3]"
               "The version of `semantic' loaded does not work in Emacs 22.
-It can cause constant high CPU load.  Upgrade to at least 2.0pre4.")
+It can cause constant high CPU load.
+Upgrade to at least Semantic 2.0pre4 (distributed with CEDET 1.0pre4).")
     ;; CUA-mode does not work with GNU Emacs version 22.1 and newer.
     ;; Except for version 1.2, all of the 1.x and 2.x version of cua-mode
     ;; provided the `CUA-mode' feature.  Since this is no longer true,
index e3484bb0a4871179837c48467ba1d179a05e053f..5d4400958d6d09180de136df9559257c5d7a553d 100644 (file)
@@ -645,8 +645,12 @@ Point is moved to the end of the conflict."
         (error nil)))
     found))
 
-(defun smerge-refine-chopup-region (beg end file)
-  "Chopup the region into small elements, one per line."
+(defun smerge-refine-chopup-region (beg end file &optional preproc)
+  "Chopup the region into small elements, one per line.
+Save the result into FILE.
+If non-nil, PREPROC is called with no argument in a buffer that contains
+a copy of the text, just before chopping it up.  It can be used to replace
+chars to try and eliminate some spurious differences."
   ;; ediff chops up into words, where the definition of a word is
   ;; customizable.  Instead we here keep only one char per line.
   ;; The advantages are that there's nothing to configure, that we get very
@@ -661,14 +665,18 @@ Point is moved to the end of the conflict."
   (let ((buf (current-buffer)))
     (with-temp-buffer
       (insert-buffer-substring buf beg end)
+      (when preproc (goto-char (point-min)) (funcall preproc))
       (goto-char (point-min))
       (while (not (eobp))
         (forward-char 1)
+        ;; We add \n after each char except after \n, so we get one line per
+        ;; text char, where each line contains just one char, except for \n
+        ;; chars which are represented by the empty line.
         (unless (eq (char-before) ?\n) (insert ?\n)))
       (let ((coding-system-for-write 'emacs-mule))
         (write-region (point-min) (point-max) file nil 'nomessage)))))
 
-(defun smerge-refine-highlight-change (buf beg match-num1 match-num2)
+(defun smerge-refine-highlight-change (buf beg match-num1 match-num2 props)
   (let* ((startline (string-to-number (match-string match-num1)))
          (ol (make-overlay
               (+ beg startline -1)
@@ -676,30 +684,25 @@ Point is moved to the end of the conflict."
                          (string-to-number (match-string match-num2))
                        startline))
               buf
+              ;; Make them tend to shrink rather than spread when editing.
               'front-advance nil)))
-    (overlay-put ol 'smerge 'refine)
     (overlay-put ol 'evaporate t)
-    (overlay-put ol 'face 'smerge-refined-change)))
-
-
-(defun smerge-refine ()
-  "Highlight the parts of the conflict that are different."
-  (interactive)
-  ;; FIXME: make it work with 3-way conflicts.
-  (smerge-match-conflict)
-  (remove-overlays (match-beginning 0) (match-end 0) 'smerge 'refine)
-  (smerge-ensure-match 1)
-  (smerge-ensure-match 3)
-  (let ((buf (current-buffer))
-        ;; Read them before the match-data gets clobbered.
-       (beg1 (match-beginning 1)) (end1 (match-end 1))
-       (beg2 (match-beginning 3)) (end2 (match-end 3))
-       (file1 (make-temp-file "smerge1"))
-       (file2 (make-temp-file "smerge2")))
+    (dolist (x props)
+      (overlay-put ol (car x) (cdr x)))))
+
+(defun smerge-refine-subst (beg1 end1 beg2 end2 props &optional preproc)
+  "Show fine differences in the two regions BEG1..END1 and BEG2..END2.
+PROPS is an alist of properties to put (via overlays) on the changes.
+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."
+  (let* ((buf (current-buffer))
+         (file1 (make-temp-file "diff1"))
+         (file2 (make-temp-file "diff2")))
 
     ;; Chop up regions into smaller elements and save into files.
-    (smerge-refine-chopup-region beg1 end1 file1)
-    (smerge-refine-chopup-region beg2 end2 file2)
+    (smerge-refine-chopup-region beg1 end1 file1 preproc)
+    (smerge-refine-chopup-region beg2 end2 file2 preproc)
 
     ;; Call diff on those files.
     (unwind-protect
@@ -716,15 +719,28 @@ Point is moved to the end of the conflict."
                        (buffer-substring (point) (line-end-position)))
               (let ((op (char-after (match-beginning 3))))
                 (when (memq op '(?d ?c))
-                  (smerge-refine-highlight-change buf beg1 1 2))
+                  (smerge-refine-highlight-change buf beg1 1 2 props))
                 (when (memq op '(?a ?c))
-                  (smerge-refine-highlight-change buf beg2 4 5)))
+                  (smerge-refine-highlight-change buf beg2 4 5 props)))
               (forward-line 1)                            ;Skip hunk header.
               (and (re-search-forward "^[0-9]" nil 'move) ;Skip hunk body.
                    (goto-char (match-beginning 0))))))
       (delete-file file1)
       (delete-file file2))))
 
+(defun smerge-refine ()
+  "Highlight the parts of the conflict that are different."
+  (interactive)
+  ;; FIXME: make it work with 3-way conflicts.
+  (smerge-match-conflict)
+  (remove-overlays (match-beginning 0) (match-end 0) 'smerge 'refine)
+  (smerge-ensure-match 1)
+  (smerge-ensure-match 3)
+  (smerge-refine-subst (match-beginning 1) (match-end 1)
+                       (match-beginning 3) (match-end 3)
+                       '((smerge . refine)
+                         (face . smerge-refined-change))))
+
 (defun smerge-diff (n1 n2)
   (smerge-match-conflict)
   (smerge-ensure-match n1)
index c51d2ef9a8093dda35ca00994b6f4ae97760e37a..6861615d468416e4c69eae5cb6d8528323c8c071 100644 (file)
@@ -994,7 +994,7 @@ supported at a time.
                     'speedbar-buffer
                     "Speedbar"
                     #'speedbar-frame-mode
-                    (if dframe-xemacsp
+                    (if (featurep 'xemacs)
                         (append speedbar-frame-plist
                                 ;; This is a hack to get speedbar to iconfiy
                                 ;; with the selected frame.
@@ -1020,7 +1020,7 @@ supported at a time.
 
 (defun speedbar-frame-reposition-smartly ()
   "Reposition the speedbar frame to be next to the attached frame."
-  (cond ((and dframe-xemacsp
+  (cond ((and (featurep 'xemacs)
              (or (member 'left speedbar-frame-plist)
                  (member 'top speedbar-frame-plist)))
         (dframe-reposition-frame
@@ -1029,7 +1029,7 @@ supported at a time.
          (cons (car (cdr (member 'left speedbar-frame-plist)))
                (car (cdr (member 'top speedbar-frame-plist)))))
         )
-       ((and (not dframe-xemacsp)
+       ((and (not (featurep 'xemacs))
              (or (assoc 'left speedbar-frame-parameters)
                  (assoc 'top speedbar-frame-parameters)))
         ;; if left/top were specified in the parameters, pass them
@@ -1164,7 +1164,7 @@ return true without a query."
 This gives visual indications of what is up.  It EXPECTS the speedbar
 frame and window to be the currently active frame and window."
   (if (and (frame-live-p (speedbar-current-frame))
-          (or (not dframe-xemacsp)
+          (or (not (featurep 'xemacs))
               (with-no-warnings
                 (specifier-instance has-modeline-p)))
           speedbar-buffer)
@@ -1252,7 +1252,7 @@ and the existence of packages."
       (if speedbar-previous-menu (easy-menu-remove speedbar-previous-menu))
       (setq speedbar-previous-menu md)
       ;; Now add the new menu
-      (if (not dframe-xemacsp)
+      (if (not (featurep 'xemacs))
          (easy-menu-define speedbar-menu-map (current-local-map)
                            "Speedbar menu" md)
        (easy-menu-add md (current-local-map))
@@ -2915,7 +2915,7 @@ to add more types of version control systems."
             (not (or (and (featurep 'ange-ftp)
                           (string-match
                            (car (symbol-value
-                                 (if dframe-xemacsp
+                                 (if (featurep 'xemacs)
                                      'ange-ftp-directory-format
                                    'ange-ftp-name-format)))
                            (expand-file-name default-directory)))
index 3dcf65cc46127bccc39438bfdc0053a5461e92f9..947fc0da57a6ff3109a82dc406e8ac81f1f68737 100644 (file)
 (defvar command-line-processed nil
   "Non-nil once command line has been processed.")
 
+(defvar window-system initial-window-system
+  "Name of window system the selected frame is displaying through.
+The value is a symbol--for instance, `x' for X windows.
+The value is nil if the selected frame is on a text-only-terminal.")
+
+(make-variable-frame-local 'window-system)
+
 (defgroup initialization nil
   "Emacs start-up procedure."
   :group 'environment)
 
 (defcustom initial-buffer-choice nil
   "Buffer to show after starting Emacs.
-If the value is nil and `inhibit-splash-screen' is nil, show the
+If the value is nil and `inhibit-startup-screen' is nil, show the
 startup screen.  If the value is string, visit the specified file or
 directory using `find-file'.  If t, open the `*scratch*' buffer."
   :type '(choice
-         (const     :tag "Splash screen" nil)
+         (const     :tag "Startup screen" nil)
          (directory :tag "Directory" :value "~/")
          (file      :tag "File" :value "~/file.txt")
          (const     :tag "Lisp scratch buffer" t))
   :version "23.1"
   :group 'initialization)
 
-(defcustom inhibit-splash-screen nil
+(defcustom inhibit-startup-screen nil
   "Non-nil inhibits the startup screen.
 It also inhibits display of the initial message in the `*scratch*' buffer.
 
@@ -62,7 +69,10 @@ you are familiar with the contents of the startup screen."
   :type 'boolean
   :group 'initialization)
 
-(defvaralias 'inhibit-startup-message 'inhibit-splash-screen)
+(defvaralias 'inhibit-splash-screen 'inhibit-startup-screen)
+(defvaralias 'inhibit-startup-message 'inhibit-startup-screen)
+
+(defvar startup-screen-inhibit-startup-screen nil)
 
 (defcustom inhibit-startup-echo-area-message nil
   "*Non-nil inhibits the initial startup echo area message.
@@ -97,6 +107,12 @@ the remaining command-line args are in the variable `command-line-args-left'.")
 (defvar command-line-args-left nil
   "List of command-line args not yet processed.")
 
+(defvaralias 'argv 'command-line-args-left
+  "List of command-line args not yet processed.
+This is a convenience alias, so that one can write \(pop argv\)
+inside of --eval command line arguments in order to access
+following arguments.")
+
 (defvar command-line-functions nil    ;; lrs 7/31/89
   "List of functions to process unrecognized command-line arguments.
 Each function should access the dynamically bound variables
@@ -308,6 +324,10 @@ from being initialized."
 (defvar pure-space-overflow nil
   "Non-nil if building Emacs overflowed pure space.")
 
+(defvar pure-space-overflow-message "\
+Warning Warning!!!  Pure space overflow    !!!Warning Warning
+\(See the node Pure Storage in the Lisp manual for details.)\n")
+
 (defvar tutorial-directory nil
   "Directory containing the Emacs TUTORIAL files.")
 
@@ -458,36 +478,19 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
        ;; for instance due to a dense colormap.
        (when (or frame-initial-frame
                  ;; If frame-initial-frame has no meaning, do this anyway.
-                 (not (and window-system
+                 (not (and initial-window-system
                            (not noninteractive)
-                           (not (eq window-system 'pc)))))
+                           (not (eq initial-window-system 'pc)))))
          ;; Modify the initial frame based on what .emacs puts into
          ;; ...-frame-alist.
          (if (fboundp 'frame-notice-user-settings)
              (frame-notice-user-settings))
+         ;; Set the faces for the initial background mode even if
+         ;; frame-notice-user-settings didn't (such as on a tty).
+         ;; frame-set-background-mode is idempotent, so it won't
+         ;; cause any harm if it's already been done.
          (if (fboundp 'frame-set-background-mode)
-             ;; Set the faces for the initial background mode even if
-             ;; frame-notice-user-settings didn't (such as on a tty).
-             ;; frame-set-background-mode is idempotent, so it won't
-             ;; cause any harm if it's already been done.
-             (let ((frame (selected-frame))
-                   term)
-               (when (and (null window-system)
-                          ;; Don't override default set by files in lisp/term.
-                          (null default-frame-background-mode)
-                          (let ((bg (frame-parameter frame 'background-color)))
-                            (or (null bg)
-                                (member bg '(unspecified "unspecified-bg"
-                                                         "unspecified-fg")))))
-
-                 (setq term (getenv "TERM"))
-                 ;; Some files in lisp/term do a better job with the
-                 ;; background mode, but we leave this here anyway, in
-                 ;; case they remove those files.
-                 (if (string-match "^\\(xterm\\|rxvt\\|dtterm\\|eterm\\)"
-                                   term)
-                     (setq default-frame-background-mode 'light)))
-               (frame-set-background-mode (selected-frame)))))
+             (frame-set-background-mode (selected-frame))))
 
        ;; Now we know the user's default font, so add it to the menu.
        (if (fboundp 'font-menu-add-default)
@@ -496,7 +499,25 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
             (run-hooks 'window-setup-hook))
        (or menubar-bindings-done
            (if (display-popup-menus-p)
-               (precompute-menubar-bindings)))))))
+               (precompute-menubar-bindings)))))
+    ;; Subprocesses of Emacs do not have direct access to the terminal, so
+    ;; unless told otherwise they should only assume a dumb terminal.
+    ;; We are careful to do it late (after term-setup-hook), although the
+    ;; new multi-tty code does not use $TERM any more there anyway.
+    (setenv "TERM" "dumb")
+    ;; Remove DISPLAY from the process-environment as well.  This allows
+    ;; `callproc.c' to give it a useful adaptive default which is either
+    ;; the value of the `display' frame-parameter or the DISPLAY value
+    ;; from initial-environment.
+    (let ((display (frame-parameter nil 'display)))
+      ;; Be careful which DISPLAY to remove from process-environment: follow
+      ;; the logic of `callproc.c'.
+      (if (stringp display) (setq display (concat "DISPLAY=" display))
+        (dolist (varval initial-environment)
+          (if (string-match "\\`DISPLAY=" varval)
+              (setq display varval))))
+      (when display
+        (delete display process-environment)))))
 
 ;; Precompute the keyboard equivalents in the menu bar items.
 (defun precompute-menubar-bindings ()
@@ -528,6 +549,20 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
 (defvar tool-bar-originally-present nil
   "Non-nil if tool-bars are present before user and site init files are read.")
 
+(defvar handle-args-function-alist '((nil . tty-handle-args))
+  "Functions for processing window-system dependent command-line arguments.
+Window system startup files should add their own function to this
+alist, which should parse the command line arguments.  Those
+pertaining to the window system should be processed and removed
+from the returned command line.")
+
+(defvar window-system-initialization-alist '((nil . ignore))
+  "Alist of window-system initialization functions.
+Window-system startup files should add their own initialization
+function to this list.  The function should take no arguments,
+and initialize the window system environment to prepare for
+opening the first frame (e.g. open a connection to an X server).")
+
 ;; Handle the X-like command-line arguments "-fg", "-bg", "-name", etc.
 (defun tty-handle-args (args)
   (let (rest)
@@ -632,16 +667,22 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
     (setq eol-mnemonic-dos  "(DOS)"
           eol-mnemonic-mac  "(Mac)")))
 
-  ;; Read window system's init file if using a window system.
+  ;; Make sure window system's init file was loaded in loadup.el if using a window system.
   (condition-case error
-      (if (and window-system (not noninteractive))
-         (load (concat term-file-prefix
-                       (symbol-name window-system)
-                       "-win")
-               ;; Every window system should have a startup file;
-               ;; barf if we can't find it.
-               nil t))
-    ;; If we can't read it, print the error message and exit.
+    (unless noninteractive
+      (if (and initial-window-system
+              (not (featurep
+                    (intern (concat (symbol-name initial-window-system) "-win")))))
+         (error "Unsupported window system `%s'" initial-window-system))
+      ;; Process window-system specific command line parameters.
+      (setq command-line-args
+           (funcall (or (cdr (assq initial-window-system handle-args-function-alist))
+                        (error "Unsupported window system `%s'" initial-window-system))
+                    command-line-args))
+      ;; Initialize the window system. (Open connection, etc.)
+      (funcall (or (cdr (assq initial-window-system window-system-initialization-alist))
+                  (error "Unsupported window system `%s'" initial-window-system))))
+    ;; If there was an error, print the error message and exit.
     (error
      (princ
       (if (eq (car error) 'error)
@@ -657,13 +698,9 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
                              (cdr error) ", "))))
       'external-debugging-output)
      (terpri 'external-debugging-output)
-     (setq window-system nil)
+     (setq initial-window-system nil)
      (kill-emacs)))
 
-  ;; Windowed displays do this inside their *-win.el.
-  (unless (or (display-graphic-p) noninteractive)
-    (setq command-line-args (tty-handle-args command-line-args)))
-
   (set-locale-environment nil)
 
   ;; Convert preloaded file names in load-history to absolute.
@@ -786,7 +823,7 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
   ;; If frame was created with a menu bar, set menu-bar-mode on.
   (unless (or noninteractive
              emacs-basic-display
-              (and (memq window-system '(x w32))
+              (and (memq initial-window-system '(x w32))
                    (<= (frame-parameter nil 'menu-bar-lines) 0)))
     (menu-bar-mode 1))
 
@@ -800,7 +837,6 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
   ;; Can't do this init in defcustom because the relevant variables
   ;; are not set.
   (custom-reevaluate-setting 'blink-cursor-mode)
-  (custom-reevaluate-setting 'normal-erase-is-backspace)
   (custom-reevaluate-setting 'tooltip-mode)
   (custom-reevaluate-setting 'global-font-lock-mode)
   (custom-reevaluate-setting 'mouse-wheel-down-event)
@@ -810,13 +846,15 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
   (custom-reevaluate-setting 'focus-follows-mouse)
   (custom-reevaluate-setting 'global-auto-composition-mode)
 
+  (normal-erase-is-backspace-setup-frame)
+
   ;; Register default TTY colors for the case the terminal hasn't a
-  ;; terminal init file.
-  (unless (memq window-system '(x w32 mac))
-    ;; We do this regardles of whether the terminal supports colors
-    ;; or not, since they can switch that support on or off in
-    ;; mid-session by setting the tty-color-mode frame parameter.
-    (tty-register-default-colors))
+  ;; terminal init file.  We do this regardles of whether the terminal
+  ;; supports colors or not and regardless the current display type,
+  ;; since users can connect to color-capable terminals and also
+  ;; switch color support on or off in mid-session by setting the
+  ;; tty-color-mode frame parameter.
+  (tty-register-default-colors)
 
   ;; Record whether the tool-bar is present before the user and site
   ;; init files are processed.  frame-notice-user-settings uses this
@@ -841,8 +879,8 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
        (load site-run-file t t))
 
     ;; Sites should not disable this.  Only individuals should disable
-    ;; the startup message.
-    (setq inhibit-startup-message nil)
+    ;; the startup screen.
+    (setq inhibit-startup-screen nil)
 
     ;; Warn for invalid user name.
     (when init-file-user
@@ -936,7 +974,7 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
                            (setq user-init-file source))))
 
                      (unless inhibit-default-init
-                        (let ((inhibit-startup-message nil))
+                        (let ((inhibit-startup-screen nil))
                           ;; Users are supposed to be told their rights.
                           ;; (Plus how to get help and how to undo.)
                           ;; Don't you dare turn this off for anyone
@@ -1001,11 +1039,11 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
        ;; buffers (probably *scratch*, *Messages*, *Minibuff-0*).
        ;; Arguably this should only be done if they're free of
        ;; multibyte characters.
-       (mapcar (lambda (buffer)
-                 (with-current-buffer buffer
-                   (if enable-multibyte-characters
-                       (set-buffer-multibyte nil))))
-               (buffer-list))
+       (mapc (lambda (buffer)
+               (with-current-buffer buffer
+                 (if enable-multibyte-characters
+                     (set-buffer-multibyte nil))))
+             (buffer-list))
        ;; Also re-set the language environment in case it was
        ;; originally done before unibyte was set and is sensitive to
        ;; unibyte (display table, terminal coding system &c).
@@ -1082,31 +1120,8 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
   ;; Load library for our terminal type.
   ;; User init file can set term-file-prefix to nil to prevent this.
   (unless (or noninteractive
-              window-system
-              (null term-file-prefix))
-    (let* ((TERM (getenv "TERM"))
-           (term TERM)
-          hyphend)
-      (while (and term
-                  (not (load (concat term-file-prefix term) t t)))
-        ;; Strip off last hyphen and what follows, then try again
-        (setq term
-              (if (setq hyphend (string-match "[-_][^-_]+\\'" term))
-                  (substring term 0 hyphend)
-                nil)))
-      (setq term TERM)
-      ;; The terminal file has been loaded, now call the terminal specific
-      ;; initialization function.
-      (while term
-       (let ((term-init-func (intern-soft (concat "terminal-init-" term))))
-         (if (not (fboundp term-init-func))
-              ;; Strip off last hyphen and what follows, then try again
-              (setq term
-                    (if (setq hyphend (string-match "[-_][^-_]+\\'" term))
-                        (substring term 0 hyphend)
-                      nil))
-            (setq term nil)
-           (funcall term-init-func))))))
+              initial-window-system)
+    (tty-run-terminal-initialization (selected-frame)))
 
   ;; Update the out-of-memory error message based on user's key bindings
   ;; for save-some-buffers.
@@ -1135,7 +1150,7 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
 ")
   "Initial message displayed in *scratch* buffer at startup.
 If this is nil, no message will be displayed.
-If `inhibit-splash-screen' is non-nil, then no message is displayed,
+If `inhibit-startup-screen' is non-nil, then no message is displayed,
 regardless of the value of this variable."
   :type '(choice (text :tag "Message")
                 (const :tag "none" nil))
@@ -1146,90 +1161,151 @@ regardless of the value of this variable."
 ;;; Fancy splash screen
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-(defvar fancy-splash-text
-  '((:face (variable-pitch :weight bold)
-          "Important Help menu items:\n"
-          :face variable-pitch
-          :link ("Emacs Tutorial" (lambda (button) (help-with-tutorial)))
-          "\tLearn how to use Emacs efficiently"
-           (lambda ()
-             (let* ((en "TUTORIAL")
-                    (tut (or (get-language-info current-language-environment
-                                                'tutorial)
-                             en))
-                    (title (with-temp-buffer
-                             (insert-file-contents
-                              (expand-file-name tut tutorial-directory)
-                              nil 0 256)
-                             (search-forward ".")
-                             (buffer-substring (point-min) (1- (point))))))
-               ;; If there is a specific tutorial for the current language
-               ;; environment and it is not English, append its title.
-               (if (string= en tut)
-                   ""
-                 (concat " (" title ")"))))
-          "\n"
-          :face variable-pitch
-          :link ("Emacs FAQ" (lambda (button) (view-emacs-FAQ)))
-          "\tFrequently asked questions and answers\n"
-          :link ("View Emacs Manual" (lambda (button) (info-emacs-manual)))
-          "\tView the Emacs manual using Info\n"
-          :link ("Absence of Warranty" (lambda (button) (describe-no-warranty)))
-          "\tGNU Emacs comes with "
-          :face (variable-pitch :slant oblique)
-          "ABSOLUTELY NO WARRANTY\n"
-          :face variable-pitch
-          :link ("Copying Conditions" (lambda (button) (describe-copying)))
-          "\tConditions for redistributing and changing Emacs\n"
-          :link ("Getting New Versions" (lambda (button) (describe-distribution)))
-          "\tHow to obtain the latest version of Emacs\n"
-          :link ("More Manuals / Ordering Manuals" (lambda (button) (view-order-manuals)))
-          "  Buying printed manuals from the FSF\n")
-  (:face (variable-pitch :weight bold)
-        "Useful tasks:\n"
-        :face variable-pitch
-        :link ("Visit New File"
-               (lambda (button) (call-interactively 'find-file)))
-        "\tSpecify a new file's name, to edit the file\n"
-        :link ("Open Home Directory"
-               (lambda (button) (dired "~")))
-        "\tOpen your home directory, to operate on its files\n"
-        :link ("Open *scratch* buffer"
-               (lambda (button) (switch-to-buffer (get-buffer-create "*scratch*"))))
-        "\tOpen buffer for notes you don't want to save\n"
-        :link ("Customize Startup"
-               (lambda (button) (customize-group 'initialization)))
-        "\tChange initialization settings including this screen\n"
-
-        "\nEmacs Guided Tour\tSee "
-        :link ("http://www.gnu.org/software/emacs/tour/"
-               (lambda (button) (browse-url "http://www.gnu.org/software/emacs/tour/")))
-
-        ))
+(defvar fancy-startup-text
+  '((:face (variable-pitch :foreground "red")
+     "Welcome to "
+     :link ("GNU Emacs"
+           (lambda (button) (browse-url "http://www.gnu.org/software/emacs/"))
+           "Browse http://www.gnu.org/software/emacs/")
+     ", one component of the "
+     :link
+     (lambda ()
+       (if (eq system-type 'gnu/linux)
+          '("GNU/Linux"
+            (lambda (button) (browse-url "http://www.gnu.org/gnu/linux-and-gnu.html"))
+            "Browse http://www.gnu.org/gnu/linux-and-gnu.html")
+        '("GNU" (lambda (button) (describe-project))
+          "Display info on the GNU project")))
+     " operating system.\n"
+     :face variable-pitch "To quit a partially entered command, type "
+     :face default "Control-g"
+     :face variable-pitch ".\n\n"
+     :link ("Emacs Tutorial" (lambda (button) (help-with-tutorial)))
+     "\tLearn basic keystroke commands"
+     (lambda ()
+       (let* ((en "TUTORIAL")
+             (tut (or (get-language-info current-language-environment
+                                         'tutorial)
+                      en))
+             (title (with-temp-buffer
+                      (insert-file-contents
+                       (expand-file-name tut tutorial-directory)
+                       nil 0 256)
+                      (search-forward ".")
+                      (buffer-substring (point-min) (1- (point))))))
+        ;; If there is a specific tutorial for the current language
+        ;; environment and it is not English, append its title.
+        (if (string= en tut)
+            ""
+          (concat " (" title ")"))))
+     "\n"
+     :face variable-pitch
+     :link ("Emacs Guided Tour"
+           (lambda (button) (browse-url "http://www.gnu.org/software/emacs/tour/"))
+           "Browse http://www.gnu.org/software/emacs/tour/")
+     "\tOverview of Emacs features\n"
+     :link ("View Emacs Manual" (lambda (button) (info-emacs-manual)))
+     "\tView the Emacs manual using Info\n"
+     :link ("Absence of Warranty" (lambda (button) (describe-no-warranty)))
+     "\tGNU Emacs comes with "
+     :face (variable-pitch :slant oblique)
+     "ABSOLUTELY NO WARRANTY\n"
+     :face variable-pitch
+     :link ("Copying Conditions" (lambda (button) (describe-copying)))
+     "\tConditions for redistributing and changing Emacs\n"
+     :link ("Ordering Manuals" (lambda (button) (view-order-manuals)))
+     "\tPurchasing printed copies of manuals\n"
+     "\n"))
   "A list of texts to show in the middle part of splash screens.
 Each element in the list should be a list of strings or pairs
 `:face FACE', like `fancy-splash-insert' accepts them.")
 
+(defvar fancy-about-text
+  '((:face (variable-pitch :foreground "red")
+     "This is "
+     :link ("GNU Emacs"
+           (lambda (button) (browse-url "http://www.gnu.org/software/emacs/"))
+           "Browse http://www.gnu.org/software/emacs/")
+     ", one component of the "
+     :link
+     (lambda ()
+       (if (eq system-type 'gnu/linux)
+          '("GNU/Linux"
+            (lambda (button) (browse-url "http://www.gnu.org/gnu/linux-and-gnu.html"))
+            "Browse http://www.gnu.org/gnu/linux-and-gnu.html")
+        '("GNU" (lambda (button) (describe-project))
+          "Display info on the GNU project.")))
+     " operating system.\n"
+     :face (lambda ()
+            (list 'variable-pitch :foreground
+                  (if (eq (frame-parameter nil 'background-mode) 'dark)
+                      "cyan" "darkblue")))
+     "\n"
+     (lambda () (emacs-version))
+     "\n"
+     :face (variable-pitch :height 0.5)
+     (lambda () emacs-copyright)
+     "\n\n"
+     :face variable-pitch
+     :link ("Authors"
+           (lambda (button)
+             (view-file (expand-file-name "AUTHORS" data-directory))
+             (goto-char (point-min))))
+     "\tMany people have contributed code included in GNU Emacs\n"
+     :link ("Contributing"
+           (lambda (button)
+             (view-file (expand-file-name "CONTRIBUTE" data-directory))
+             (goto-char (point-min))))
+     "\tHow to contribute improvements to Emacs\n"
+     "\n"
+     :link ("GNU and Freedom" (lambda (button) (describe-project)))
+     "\tWhy we developed GNU Emacs, and the GNU operating system\n"
+     :link ("Absence of Warranty" (lambda (button) (describe-no-warranty)))
+     "\tGNU Emacs comes with "
+     :face (variable-pitch :slant oblique)
+     "ABSOLUTELY NO WARRANTY\n"
+     :face variable-pitch
+     :link ("Copying Conditions" (lambda (button) (describe-copying)))
+     "\tConditions for redistributing and changing Emacs\n"
+     :link ("Getting New Versions" (lambda (button) (describe-distribution)))
+     "\tHow to obtain the latest version of Emacs\n"
+     :link ("Ordering Manuals" (lambda (button) (view-order-manuals)))
+     "\tBuying printed manuals from the FSF\n"
+     "\n"
+     :link ("Emacs Tutorial" (lambda (button) (help-with-tutorial)))
+     "\tLearn basic Emacs keystroke commands"
+     (lambda ()
+       (let* ((en "TUTORIAL")
+             (tut (or (get-language-info current-language-environment
+                                         'tutorial)
+                      en))
+             (title (with-temp-buffer
+                      (insert-file-contents
+                       (expand-file-name tut tutorial-directory)
+                       nil 0 256)
+                      (search-forward ".")
+                      (buffer-substring (point-min) (1- (point))))))
+        ;; If there is a specific tutorial for the current language
+        ;; environment and it is not English, append its title.
+        (if (string= en tut)
+            ""
+          (concat " (" title ")"))))
+     "\n"
+     :link ("Emacs Guided Tour"
+           (lambda (button) (browse-url "http://www.gnu.org/software/emacs/tour/"))
+           "Browse http://www.gnu.org/software/emacs/tour/")
+     "\tSee an overview of the many facilities of GNU Emacs"
+     ))
+  "A list of texts to show in the middle part of the About screen.
+Each element in the list should be a list of strings or pairs
+`:face FACE', like `fancy-splash-insert' accepts them.")
+
 
 (defgroup fancy-splash-screen ()
   "Fancy splash screen when Emacs starts."
   :version "21.1"
   :group 'initialization)
 
-
-(defcustom fancy-splash-delay 7
-  "*Delay in seconds between splash screens."
-  :group 'fancy-splash-screen
-  :type 'integer)
-
-
-(defcustom fancy-splash-max-time 30
-  "*Show splash screens for at most this number of seconds.
-Values less than twice `fancy-splash-delay' are ignored."
-  :group 'fancy-splash-screen
-  :type 'integer)
-
-
 (defcustom fancy-splash-image nil
   "*The image to show in the splash screens, or nil for defaults."
   :group 'fancy-splash-screen
@@ -1249,27 +1325,35 @@ Values less than twice `fancy-splash-delay' are ignored."
 
 ;; These are temporary storage areas for the splash screen display.
 
-(defvar fancy-current-text nil)
 (defvar fancy-splash-help-echo nil)
-(defvar fancy-splash-stop-time nil)
-(defvar fancy-splash-outer-buffer nil)
 
 (defun fancy-splash-insert (&rest args)
   "Insert text into the current buffer, with faces.
-Arguments from ARGS should be either strings, functions called
-with no args that return a string, or pairs `:face FACE',
-where FACE is a valid face specification, as it can be used with
-`put-text-property'."
+Arguments from ARGS should be either strings; functions called
+with no args that return a string; pairs `:face FACE', where FACE
+is a face specification usable with `put-text-property'; or pairs
+`:link LINK' where LINK is a list of arguments to pass to
+`insert-button', of the form (LABEL ACTION [HELP-ECHO]), which
+specifies the button's label, `action' property and help-echo string.
+FACE and LINK can also be functions, which are evaluated to obtain
+a face or button specification."
   (let ((current-face nil))
     (while args
       (cond ((eq (car args) :face)
-            (setq args (cdr args) current-face (car args)))
+            (setq args (cdr args) current-face (car args))
+            (if (functionp current-face)
+                (setq current-face (funcall current-face))))
            ((eq (car args) :link)
             (setq args (cdr args))
             (let ((spec (car args)))
+              (if (functionp spec)
+                  (setq spec (funcall spec)))
               (insert-button (car spec)
                              'face (list 'link current-face)
                              'action (cadr spec)
+                             'help-echo (concat "mouse-2, RET: "
+                                                (or (nth 2 spec)
+                                                    "Follow this link"))
                              'follow-link t)))
            (t (insert (propertize (let ((it (car args)))
                                     (if (functionp it)
@@ -1309,49 +1393,38 @@ where FACE is a valid face specification, as it can be used with
        ;; Insert the image with a help-echo and a link.
        (make-button (prog1 (point) (insert-image img)) (point)
                     'face 'default
-                    'help-echo "mouse-2: browse http://www.gnu.org/"
+                    'help-echo "mouse-2, RET: Browse http://www.gnu.org/"
                     'action (lambda (button) (browse-url "http://www.gnu.org/"))
                     'follow-link t)
-       (insert "\n"))))
-  (fancy-splash-insert
-   :face '(variable-pitch :background "red")
-   "\n!! This version is ALPHA status.  It may lose your data!!\n\n")
-  (fancy-splash-insert
-   :face '(variable-pitch :foreground "red")
-   (if (eq system-type 'gnu/linux)
-       "GNU Emacs is one component of the GNU/Linux operating system."
-     "GNU Emacs is one component of the GNU operating system."))
-  (insert "\n")
-  (fancy-splash-insert
-   :face 'variable-pitch
-   "You can do basic editing with the menu bar and scroll bar \
-using the mouse.\n"
-   :face 'variable-pitch
-   "To quit a partially entered command, type "
-   :face 'default
-   "Control-g"
-   :face 'variable-pitch
-   "."
-   "\n\n")
-  (when fancy-splash-outer-buffer
-    (fancy-splash-insert
-     :face 'variable-pitch
-     "Type "
-     :face 'default
-     "`q'"
-     :face 'variable-pitch
-     " to exit from this screen.\n")))
-
-(defun fancy-splash-tail ()
+       (insert "\n\n")))))
+
+(defun fancy-startup-tail (&optional concise)
   "Insert the tail part of the splash screen into the current buffer."
   (let ((fg (if (eq (frame-parameter nil 'background-mode) 'dark)
                "cyan" "darkblue")))
+    (unless concise
+      (fancy-splash-insert
+       :face 'variable-pitch
+       "\nTo start...     "
+       :link '("Open a File"
+              (lambda (button) (call-interactively 'find-file))
+              "Specify a new file's name, to edit the file")
+       "     "
+       :link '("Open Home Directory"
+              (lambda (button) (dired "~"))
+              "Open your home directory, to operate on its files")
+       "     "
+       :link '("Customize Startup"
+              (lambda (button) (customize-group 'initialization))
+              "Change initialization settings including this screen")
+       "\n"))
     (fancy-splash-insert :face `(variable-pitch :foreground ,fg)
                         "\nThis is "
                         (emacs-version)
                         "\n"
                         :face '(variable-pitch :height 0.5)
-                        emacs-copyright)
+                        emacs-copyright
+                        "\n")
     (and auto-save-list-file-prefix
         ;; Don't signal an error if the
         ;; directory for auto-save-list files
@@ -1366,104 +1439,111 @@ using the mouse.\n"
                                 auto-save-list-file-prefix)))
          t)
         (fancy-splash-insert :face '(variable-pitch :foreground "red")
-                             "\n\nIf an Emacs session crashed recently, "
+                             "\nIf an Emacs session crashed recently, "
                              "type "
                              :face '(fixed-pitch :foreground "red")
                              "Meta-x recover-session RET"
                              :face '(variable-pitch :foreground "red")
                              "\nto recover"
-                             " the files you were editing.\n"))))
-
-(defun fancy-splash-screens-1 (buffer)
-  "Timer function displaying a splash screen."
-  (when (> (float-time) fancy-splash-stop-time)
-    (throw 'stop-splashing nil))
-  (unless fancy-current-text
-    (setq fancy-current-text fancy-splash-text))
-  (let ((text (car fancy-current-text))
-       (inhibit-read-only t))
-    (set-buffer buffer)
-    (erase-buffer)
-    (if pure-space-overflow
-       (insert "\
-Warning Warning!!!  Pure space overflow    !!!Warning Warning
-\(See the node Pure Storage in the Lisp manual for details.)\n"))
-    (fancy-splash-head)
-    (apply #'fancy-splash-insert text)
-    (fancy-splash-tail)
-    (unless (current-message)
-      (message fancy-splash-help-echo))
-    (set-buffer-modified-p nil)
-    (goto-char (point-min))
-    (force-mode-line-update)
-    (setq fancy-current-text (cdr fancy-current-text))))
+                             " the files you were editing."))
+
+    (when concise
+      (fancy-splash-insert
+       :face 'variable-pitch "\n\n"
+       :link '("Dismiss" (lambda (button)
+                          (when startup-screen-inhibit-startup-screen
+                            (customize-set-variable 'inhibit-startup-screen t)
+                            (customize-mark-to-save 'inhibit-startup-screen)
+                            (custom-save-all))
+                          (let ((w (get-buffer-window "*GNU Emacs*")))
+                            (and w (not (one-window-p)) (delete-window w)))
+                          (kill-buffer "*GNU Emacs*")))
+       "  ")
+      (when (or user-init-file custom-file)
+       (let ((checked (create-image "\300\300\141\143\067\076\034\030"
+                                    'xbm t :width 8 :height 8 :background "grey75"
+                                    :foreground "black" :relief -2 :ascent 'center))
+             (unchecked (create-image (make-string 8 0)
+                                      'xbm t :width 8 :height 8 :background "grey75"
+                                      :foreground "black" :relief -2 :ascent 'center)))
+         (insert-button
+          " " :on-glyph checked :off-glyph unchecked 'checked nil
+          'display unchecked 'follow-link t
+          'action (lambda (button)
+                    (if (overlay-get button 'checked)
+                        (progn (overlay-put button 'checked nil)
+                               (overlay-put button 'display (overlay-get button :off-glyph))
+                               (setq startup-screen-inhibit-startup-screen nil))
+                      (overlay-put button 'checked t)
+                      (overlay-put button 'display (overlay-get button :on-glyph))
+                      (setq startup-screen-inhibit-startup-screen t)))))
+       (fancy-splash-insert :face '(variable-pitch :height 0.9)
+                            " Don't show this message again.")))))
 
 (defun exit-splash-screen ()
   "Stop displaying the splash screen buffer."
   (interactive)
-  (if fancy-splash-outer-buffer
-      (throw 'exit nil)
-    (quit-window t)))
-
-(defun fancy-splash-screens (&optional static)
-  "Display fancy splash screens when Emacs starts."
-  (if (not static)
-      (let ((old-hourglass display-hourglass)
-           (fancy-splash-outer-buffer (current-buffer))
-           splash-buffer
-           (frame (fancy-splash-frame))
-           timer)
-       (save-selected-window
-         (select-frame frame)
-         (switch-to-buffer "*About GNU Emacs*")
-         (make-local-variable 'cursor-type)
-         (setq splash-buffer (current-buffer))
-         (catch 'stop-splashing
-           (unwind-protect
-               (let ((cursor-type nil))
-                 (setq display-hourglass nil
-                       buffer-undo-list t
-                       mode-line-format (propertize "---- %b %-"
-                                                    'face 'mode-line-buffer-id)
-                       fancy-splash-stop-time (+ (float-time)
-                                                 fancy-splash-max-time)
-                       timer (run-with-timer 0 fancy-splash-delay
-                                             #'fancy-splash-screens-1
-                                             splash-buffer))
-                 (use-local-map splash-screen-keymap)
-                 (setq tab-width 22)
-                 (message "%s" (startup-echo-area-message))
-                 (setq buffer-read-only t)
-                 (recursive-edit))
-             (cancel-timer timer)
-             (setq display-hourglass old-hourglass)
-             (kill-buffer splash-buffer)))))
-    ;; If static is non-nil, don't show fancy splash screen.
-    (if (or (window-minibuffer-p)
-           (window-dedicated-p (selected-window)))
-       (pop-to-buffer (current-buffer))
-      (switch-to-buffer "*GNU Emacs*"))
-    (setq buffer-read-only nil)
-    (erase-buffer)
-    (if pure-space-overflow
-       (insert "\
-Warning Warning!!!  Pure space overflow    !!!Warning Warning
-\(See the node Pure Storage in the Lisp manual for details.)\n"))
-    (let (fancy-splash-outer-buffer)
-      (fancy-splash-head)
-      (dolist (text fancy-splash-text)
+  (quit-window t))
+
+(defun fancy-startup-screen (&optional concise)
+  "Display fancy startup screen.
+If CONCISE is non-nil, display a concise version of the
+splash screen in another window."
+  (with-current-buffer (get-buffer-create "*GNU Emacs*")
+    (let ((inhibit-read-only t))
+      (erase-buffer)
+      (make-local-variable 'startup-screen-inhibit-startup-screen)
+      (if pure-space-overflow
+         (insert pure-space-overflow-message))
+      (unless concise
+       (fancy-splash-head))
+      (dolist (text fancy-startup-text)
        (apply #'fancy-splash-insert text)
        (insert "\n"))
       (skip-chars-backward "\n")
       (delete-region (point) (point-max))
       (insert "\n")
-      (fancy-splash-tail)
+      (fancy-startup-tail concise))
+    (use-local-map splash-screen-keymap)
+    (setq tab-width 22)
+    (set-buffer-modified-p nil)
+    (setq buffer-read-only t)
+    (if (and view-read-only (not view-mode))
+       (view-mode-enter nil 'kill-buffer))
+    (goto-char (point-min)))
+  (if (or (window-minibuffer-p)
+         (window-dedicated-p (selected-window)))
+      (pop-to-buffer (current-buffer)))
+  (if concise
+      (display-buffer (get-buffer "*GNU Emacs*"))
+    (switch-to-buffer "*GNU Emacs*")))
+
+(defun fancy-about-screen ()
+  "Display fancy About screen."
+  (let ((frame (fancy-splash-frame)))
+    (save-selected-window
+      (select-frame frame)
+      (switch-to-buffer "*About GNU Emacs*")
+      (setq buffer-undo-list t
+           mode-line-format (propertize "---- %b %-"
+                                        'face 'mode-line-buffer-id))
+      (let ((inhibit-read-only t))
+       (erase-buffer)
+       (if pure-space-overflow
+           (insert pure-space-overflow-message))
+       (fancy-splash-head)
+       (dolist (text fancy-about-text)
+         (apply #'fancy-splash-insert text)
+         (insert "\n"))
+       (unless (current-message)
+         (message fancy-splash-help-echo))
+       (set-buffer-modified-p nil)
+       (goto-char (point-min))
+       (force-mode-line-update))
       (use-local-map splash-screen-keymap)
       (setq tab-width 22)
-      (set-buffer-modified-p nil)
+      (message "%s" (startup-echo-area-message))
       (setq buffer-read-only t)
-      (if (and view-read-only (not view-mode))
-         (view-mode-enter nil 'kill-buffer))
       (goto-char (point-min)))))
 
 (defun fancy-splash-frame ()
@@ -1498,356 +1578,376 @@ we put it on this frame."
          (> frame-height (+ image-height 19)))))))
 
 
-(defun normal-splash-screen (&optional static)
-  "Display splash screen when Emacs starts."
+(defun normal-splash-screen (&optional startup)
+  "Display non-graphic splash screen.
+If optional argument STARTUP is non-nil, display the startup screen
+after Emacs starts.  If STARTUP is nil, display the About screen."
   (let ((prev-buffer (current-buffer)))
-    (unwind-protect
-       (with-current-buffer (get-buffer-create "*About GNU Emacs*")
-         (setq buffer-read-only nil)
-         (erase-buffer)
-         (set (make-local-variable 'tab-width) 8)
-         (if (not static)
-             (set (make-local-variable 'mode-line-format)
-                  (propertize "---- %b %-" 'face 'mode-line-buffer-id)))
-
-          (if pure-space-overflow
-              (insert "\
-Warning Warning!!!  Pure space overflow    !!!Warning Warning
-\(See the node Pure Storage in the Lisp manual for details.)\n"))
-
-          ;; The convention for this piece of code is that
-          ;; each piece of output starts with one or two newlines
-          ;; and does not end with any newlines.
-          (insert "Welcome to GNU Emacs")
-          (insert
-           (if (eq system-type 'gnu/linux)
-               ", one component of the GNU/Linux operating system.\n"
-             ", a part of the GNU operating system.\n"))
-
-         (if (not static)
-             (insert (substitute-command-keys
-                      (concat
-                       "\nType \\[recenter] to quit from this screen.\n"))))
-
-          (if (display-mouse-p)
-              ;; The user can use the mouse to activate menus
-              ;; so give help in terms of menu items.
-              (progn
-                (insert "\
+    (with-current-buffer (get-buffer-create "*About GNU Emacs*")
+      (setq buffer-read-only nil)
+      (erase-buffer)
+      (set (make-local-variable 'tab-width) 8)
+      (if (not startup)
+         (set (make-local-variable 'mode-line-format)
+              (propertize "---- %b %-" 'face 'mode-line-buffer-id)))
+
+      (if pure-space-overflow
+         (insert pure-space-overflow-message))
+
+      ;; The convention for this piece of code is that
+      ;; each piece of output starts with one or two newlines
+      ;; and does not end with any newlines.
+      (insert (if startup "Welcome to GNU Emacs" "This is GNU Emacs"))
+      (insert
+       (if (eq system-type 'gnu/linux)
+          ", one component of the GNU/Linux operating system.\n"
+        ", a part of the GNU operating system.\n"))
+
+      (if startup
+         (if (display-mouse-p)
+             ;; The user can use the mouse to activate menus
+             ;; so give help in terms of menu items.
+             (normal-mouse-startup-screen)
+
+           ;; No mouse menus, so give help using kbd commands.
+           (normal-no-mouse-startup-screen))
+
+       (normal-about-screen))
+
+      ;; The rest of the startup screen is the same on all
+      ;; kinds of terminals.
+
+      ;; Give information on recovering, if there was a crash.
+      (and startup
+          auto-save-list-file-prefix
+          ;; Don't signal an error if the
+          ;; directory for auto-save-list files
+          ;; does not yet exist.
+          (file-directory-p (file-name-directory
+                             auto-save-list-file-prefix))
+          (directory-files
+           (file-name-directory auto-save-list-file-prefix)
+           nil
+           (concat "\\`"
+                   (regexp-quote (file-name-nondirectory
+                                  auto-save-list-file-prefix)))
+           t)
+          (insert "\n\nIf an Emacs session crashed recently, "
+                  "type Meta-x recover-session RET\nto recover"
+                  " the files you were editing.\n"))
+
+      (use-local-map splash-screen-keymap)
+
+      ;; Display the input that we set up in the buffer.
+      (set-buffer-modified-p nil)
+      (setq buffer-read-only t)
+      (if (and view-read-only (not view-mode))
+         (view-mode-enter nil 'kill-buffer))
+      (switch-to-buffer "*About GNU Emacs*")
+      (if startup (rename-buffer "*GNU Emacs*" t))
+      (goto-char (point-min)))))
+
+(defun normal-mouse-startup-screen ()
+  ;; The user can use the mouse to activate menus
+  ;; so give help in terms of menu items.
+  (insert "\
 You can do basic editing with the menu bar and scroll bar using the mouse.
 To quit a partially entered command, type Control-g.\n")
 
-               (insert "\nImportant Help menu items:\n")
-               (insert-button "Emacs Tutorial"
-                              'action (lambda (button) (help-with-tutorial))
-                              'follow-link t)
-               (insert "\t\tLearn how to use Emacs efficiently\n")
-               (insert-button "Emacs FAQ"
-                              'action (lambda (button) (view-emacs-FAQ))
-                              'follow-link t)
-               (insert "\t\tFrequently asked questions and answers\n")
-               (insert-button "Read the Emacs Manual"
-                              'action (lambda (button) (info-emacs-manual))
-                              'follow-link t)
-               (insert "\tView the Emacs manual using Info\n")
-               (insert-button "\(Non)Warranty"
-                              'action (lambda (button) (describe-no-warranty))
-                              'follow-link t)
-               (insert "\t\tGNU Emacs comes with ABSOLUTELY NO WARRANTY\n")
-               (insert-button "Copying Conditions"
-                              'action (lambda (button) (describe-copying))
-                              'follow-link t)
-               (insert "\tConditions for redistributing and changing Emacs\n")
-               (insert-button "Getting New Versions"
-                              'action (lambda (button) (describe-distribution))
-                              'follow-link t)
-               (insert "\tHow to obtain the latest version of Emacs\n")
-               (insert-button "More Manuals / Ordering Manuals"
-                              'action (lambda (button) (view-order-manuals))
-                              'follow-link t)
-               (insert "  How to order printed manuals from the FSF\n")
-
-               (insert "\nUseful tasks:\n")
-               (insert-button "Visit New File"
-                              'action (lambda (button) (call-interactively 'find-file))
-                              'follow-link t)
-               (insert "\t\tSpecify a new file's name, to edit the file\n")
-               (insert-button "Open Home Directory"
-                              'action (lambda (button) (dired "~"))
-                              'follow-link t)
-               (insert "\tOpen your home directory, to operate on its files\n")
-               (insert-button "Open *scratch* buffer"
-                              'action (lambda (button) (switch-to-buffer
-                                                        (get-buffer-create "*scratch*")))
-                              'follow-link t)
-               (insert "\tOpen buffer for notes you don't want to save\n")
-               (insert-button "Customize Startup"
-                              'action (lambda (button) (customize-group 'initialization))
-                              'follow-link t)
-               (insert "\tChange initialization settings including this screen\n")
-
-                (insert "\n" (emacs-version)
-                        "\n" emacs-copyright))
-
-            ;; No mouse menus, so give help using kbd commands.
-
-            ;; If keys have their default meanings,
-            ;; use precomputed string to save lots of time.
-            (if (and (eq (key-binding "\C-h") 'help-command)
-                     (eq (key-binding "\C-xu") 'advertised-undo)
-                     (eq (key-binding "\C-x\C-c") 'save-buffers-kill-emacs)
-                     (eq (key-binding "\C-ht") 'help-with-tutorial)
-                     (eq (key-binding "\C-hi") 'info)
-                     (eq (key-binding "\C-hr") 'info-emacs-manual)
-                     (eq (key-binding "\C-h\C-n") 'view-emacs-news))
-                (progn
-                 (insert "
-Get help          C-h  (Hold down CTRL and press h)
+  (insert "\nImportant Help menu items:\n")
+  (insert-button "Emacs Tutorial"
+                'action (lambda (button) (help-with-tutorial))
+                'follow-link t)
+  (insert "\t\tLearn basic Emacs keystroke commands\n")
+  (insert-button "Read the Emacs Manual"
+                'action (lambda (button) (info-emacs-manual))
+                'follow-link t)
+  (insert "\tView the Emacs manual using Info\n")
+  (insert-button "\(Non)Warranty"
+                'action (lambda (button) (describe-no-warranty))
+                'follow-link t)
+  (insert "\t\tGNU Emacs comes with ABSOLUTELY NO WARRANTY\n")
+  (insert-button "Copying Conditions"
+                'action (lambda (button) (describe-copying))
+                'follow-link t)
+  (insert "\tConditions for redistributing and changing Emacs\n")
+  (insert-button "More Manuals / Ordering Manuals"
+                'action (lambda (button) (view-order-manuals))
+                'follow-link t)
+  (insert "  How to order printed manuals from the FSF\n")
+
+  (insert "\nUseful tasks:\n")
+  (insert-button "Visit New File"
+                'action (lambda (button) (call-interactively 'find-file))
+                'follow-link t)
+  (insert "\t\tSpecify a new file's name, to edit the file\n")
+  (insert-button "Open Home Directory"
+                'action (lambda (button) (dired "~"))
+                'follow-link t)
+  (insert "\tOpen your home directory, to operate on its files\n")
+  (insert-button "Customize Startup"
+                'action (lambda (button) (customize-group 'initialization))
+                'follow-link t)
+  (insert "\tChange initialization settings including this screen\n")
+
+  (insert "\n" (emacs-version)
+         "\n" emacs-copyright))
+
+;; No mouse menus, so give help using kbd commands.
+(defun normal-no-mouse-startup-screen ()
+
+  ;; If keys have their default meanings,
+  ;; use precomputed string to save lots of time.
+  (if (and (eq (key-binding "\C-h") 'help-command)
+          (eq (key-binding "\C-xu") 'advertised-undo)
+          (eq (key-binding "\C-x\C-c") 'save-buffers-kill-terminal)
+          (eq (key-binding "\C-ht") 'help-with-tutorial)
+          (eq (key-binding "\C-hi") 'info)
+          (eq (key-binding "\C-hr") 'info-emacs-manual)
+          (eq (key-binding "\C-h\C-n") 'view-emacs-news))
+      (progn
+       (insert "
+Get help\t   C-h  (Hold down CTRL and press h)
 ")
-                 (insert-button "Emacs manual"
-                                'action (lambda (button) (info-emacs-manual))
-                                'follow-link t)
-                 (insert "        C-h r\t")
-                 (insert-button "Browse manuals"
-                                'action (lambda (button) (Info-directory))
-                                'follow-link t)
-                 (insert "\t   C-h i
+       (insert-button "Emacs manual"
+                      'action (lambda (button) (info-emacs-manual))
+                      'follow-link t)
+       (insert "          C-h r\t")
+       (insert-button "Browse manuals"
+                      'action (lambda (button) (Info-directory))
+                      'follow-link t)
+       (insert "\t   C-h i
 ")
-                 (insert-button "Emacs tutorial"
-                                'action (lambda (button) (help-with-tutorial))
-                                'follow-link t)
-                 (insert "        C-h t\tUndo changes\t   C-x u
+       (insert-button "Emacs tutorial"
+                      'action (lambda (button) (help-with-tutorial))
+                      'follow-link t)
+       (insert "          C-h t\tUndo changes\t   C-x u
 ")
-                 (insert-button "Buy manuals"
-                                'action (lambda (button) (view-order-manuals))
-                                'follow-link t)
-                 (insert "\t   C-h C-m\tExit Emacs\t   C-x C-c"))
+       (insert-button "Buy manuals"
+                      'action (lambda (button) (view-order-manuals))
+                      'follow-link t)
+       (insert "\t   C-h C-m\tExit Emacs\t   C-x C-c"))
 
-             (insert (format "
-Get help          %s
+    (insert (format "
+Get help\t   %s
 "
-                             (let ((where (where-is-internal
-                                           'help-command nil t)))
-                               (if where
-                                   (key-description where)
-                                 "M-x help"))))
-             (insert-button "Emacs manual"
-                            'action (lambda (button) (info-emacs-manual))
-                            'follow-link t)
-             (insert (substitute-command-keys"    \\[info-emacs-manual]\t"))
-             (insert-button "Browse manuals"
-                            'action (lambda (button) (Info-directory))
-                            'follow-link t)
-             (insert (substitute-command-keys "\t   \\[info]
+                   (let ((where (where-is-internal
+                                 'help-command nil t)))
+                     (if where
+                         (key-description where)
+                       "M-x help"))))
+    (insert-button "Emacs manual"
+                  'action (lambda (button) (info-emacs-manual))
+                  'follow-link t)
+    (insert (substitute-command-keys"\t   \\[info-emacs-manual]\t"))
+    (insert-button "Browse manuals"
+                  'action (lambda (button) (Info-directory))
+                  'follow-link t)
+    (insert (substitute-command-keys "\t   \\[info]
 "))
-             (insert-button "Emacs tutorial"
-                            'action (lambda (button) (help-with-tutorial))
-                            'follow-link t)
-             (insert (substitute-command-keys
-                      "           \\[help-with-tutorial]\tUndo changes\t   \\[advertised-undo]
+    (insert-button "Emacs tutorial"
+                  'action (lambda (button) (help-with-tutorial))
+                  'follow-link t)
+    (insert (substitute-command-keys
+            "\t   \\[help-with-tutorial]\tUndo changes\t   \\[advertised-undo]
 "))
-             (insert-button "Buy manuals"
-                            'action (lambda (button) (view-order-manuals))
-                            'follow-link t)
-             (insert (substitute-command-keys
-                      "\t   \\[view-order-manuals]\tExit Emacs\t   \\[save-buffers-kill-emacs]")))
-
-            ;; Say how to use the menu bar with the keyboard.
-           (insert "\n")
-           (insert-button "Activate menubar"
-                          'action (lambda (button) (tmm-menubar))
-                          'follow-link t)
-            (if (and (eq (key-binding "\M-`") 'tmm-menubar)
-                     (eq (key-binding [f10]) 'tmm-menubar))
-                (insert "   F10  or  ESC `  or   M-`")
-              (insert (substitute-command-keys "     \\[tmm-menubar]")))
-
-            ;; Many users seem to have problems with these.
-            (insert "
+    (insert-button "Buy manuals"
+                  'action (lambda (button) (view-order-manuals))
+                  'follow-link t)
+    (insert (substitute-command-keys
+            "\t   \\[view-order-manuals]\tExit Emacs\t   \\[save-buffers-kill-terminal]")))
+
+  ;; Say how to use the menu bar with the keyboard.
+  (insert "\n")
+  (insert-button "Activate menubar"
+                'action (lambda (button) (tmm-menubar))
+                'follow-link t)
+  (if (and (eq (key-binding "\M-`") 'tmm-menubar)
+          (eq (key-binding [f10]) 'tmm-menubar))
+      (insert "   F10  or  ESC `  or   M-`")
+    (insert (substitute-command-keys "   \\[tmm-menubar]")))
+
+  ;; Many users seem to have problems with these.
+  (insert "
 \(`C-' means use the CTRL key.  `M-' means use the Meta (or Alt) key.
 If you have no Meta key, you may instead type ESC followed by the character.)")
 
-           ;; Insert links to useful tasks
-           (insert "\nUseful tasks:\n")
-
-           (insert-button "Visit New File"
-                          'action (lambda (button) (call-interactively 'find-file))
-                          'follow-link t)
-           (insert "\t\t\t")
-           (insert-button "Open Home Directory"
-                          'action (lambda (button) (dired "~"))
-                          'follow-link t)
-           (insert "\n")
-
-           (insert-button "Customize Startup"
-                          'action (lambda (button) (customize-group 'initialization))
-                          'follow-link t)
-           (insert "\t\t")
-           (insert-button "Open *scratch* buffer"
-                          'action (lambda (button) (switch-to-buffer
-                                                    (get-buffer-create "*scratch*")))
-                          'follow-link t)
-           (insert "\n")
-
-            (insert "\n" (emacs-version)
-                    "\n" emacs-copyright)
-
-            (if (and (eq (key-binding "\C-h\C-c") 'describe-copying)
-                     (eq (key-binding "\C-h\C-d") 'describe-distribution)
-                     (eq (key-binding "\C-h\C-w") 'describe-no-warranty))
-                (progn
-                 (insert
-                  "\n
+  ;; Insert links to useful tasks
+  (insert "\nUseful tasks:\n")
+
+  (insert-button "Visit New File"
+                'action (lambda (button) (call-interactively 'find-file))
+                'follow-link t)
+  (insert "\t\t\t")
+  (insert-button "Open Home Directory"
+                'action (lambda (button) (dired "~"))
+                'follow-link t)
+  (insert "\n")
+
+  (insert-button "Customize Startup"
+                'action (lambda (button) (customize-group 'initialization))
+                'follow-link t)
+  (insert "\t\t")
+  (insert-button "Open *scratch* buffer"
+                'action (lambda (button) (switch-to-buffer
+                                          (get-buffer-create "*scratch*")))
+                'follow-link t)
+  (insert "\n")
+  (insert "\n" (emacs-version) "\n" emacs-copyright "\n")
+
+  (if (and (eq (key-binding "\C-h\C-c") 'describe-copying)
+          (eq (key-binding "\C-h\C-d") 'describe-distribution)
+          (eq (key-binding "\C-h\C-w") 'describe-no-warranty))
+      (progn
+       (insert
+        "
 GNU Emacs comes with ABSOLUTELY NO WARRANTY; type C-h C-w for ")
-                 (insert-button "full details"
-                                'action (lambda (button) (describe-no-warranty))
-                                'follow-link t)
-                 (insert ".
+       (insert-button "full details"
+                      'action (lambda (button) (describe-no-warranty))
+                      'follow-link t)
+       (insert ".
 Emacs is Free Software--Free as in Freedom--so you can redistribute copies
 of Emacs and modify it; type C-h C-c to see ")
-                 (insert-button "the conditions"
-                                'action (lambda (button) (describe-copying))
-                                'follow-link t)
-                 (insert ".
+       (insert-button "the conditions"
+                      'action (lambda (button) (describe-copying))
+                      'follow-link t)
+       (insert ".
 Type C-h C-d for information on ")
-                 (insert-button "getting the latest version"
-                                'action (lambda (button) (describe-distribution))
-                                'follow-link t)
-                 (insert "."))
-              (insert (substitute-command-keys
-                       "\n
+       (insert-button "getting the latest version"
+                      'action (lambda (button) (describe-distribution))
+                      'follow-link t)
+       (insert "."))
+    (insert (substitute-command-keys
+            "
 GNU Emacs comes with ABSOLUTELY NO WARRANTY; type \\[describe-no-warranty] for "))
-             (insert-button "full details"
-                            'action (lambda (button) (describe-no-warranty))
-                            'follow-link t)
-             (insert (substitute-command-keys ".
+    (insert-button "full details"
+                  'action (lambda (button) (describe-no-warranty))
+                  'follow-link t)
+    (insert (substitute-command-keys ".
 Emacs is Free Software--Free as in Freedom--so you can redistribute copies
 of Emacs and modify it; type \\[describe-copying] to see "))
-             (insert-button "the conditions"
-                            'action (lambda (button) (describe-copying))
-                            'follow-link t)
-             (insert (substitute-command-keys".
+    (insert-button "the conditions"
+                  'action (lambda (button) (describe-copying))
+                  'follow-link t)
+    (insert (substitute-command-keys".
 Type \\[describe-distribution] for information on "))
-             (insert-button "getting the latest version"
-                            'action (lambda (button) (describe-distribution))
-                            'follow-link t)
-             (insert ".")))
-
-          ;; The rest of the startup screen is the same on all
-          ;; kinds of terminals.
-
-          ;; Give information on recovering, if there was a crash.
-          (and auto-save-list-file-prefix
-               ;; Don't signal an error if the
-               ;; directory for auto-save-list files
-               ;; does not yet exist.
-               (file-directory-p (file-name-directory
-                                  auto-save-list-file-prefix))
-               (directory-files
-                (file-name-directory auto-save-list-file-prefix)
-                nil
-                (concat "\\`"
-                        (regexp-quote (file-name-nondirectory
-                                       auto-save-list-file-prefix)))
-                t)
-               (insert "\n\nIf an Emacs session crashed recently, "
-                       "type Meta-x recover-session RET\nto recover"
-                       " the files you were editing.\n"))
-
-         (use-local-map splash-screen-keymap)
-
-          ;; Display the input that we set up in the buffer.
-          (set-buffer-modified-p nil)
-         (setq buffer-read-only t)
-         (if (and view-read-only (not view-mode))
-             (view-mode-enter nil 'kill-buffer))
-          (goto-char (point-min))
-          (if (not static)
-              (if (or (window-minibuffer-p)
-                      (window-dedicated-p (selected-window)))
-                  ;; If static is nil, creating a new frame will
-                  ;; generate enough events that the subsequent `sit-for'
-                  ;; will immediately return anyway.
-                  nil ;; (pop-to-buffer (current-buffer))
-               (save-window-excursion
-                  (switch-to-buffer (current-buffer))
-                 (sit-for 120)))
-          (condition-case nil
-              (switch-to-buffer (current-buffer))
-            ;; In case the window is dedicated or something.
-            (error (pop-to-buffer (current-buffer))))))
-      ;; Unwind ... ensure splash buffer is killed
-      (if (not static)
-         (kill-buffer "*About GNU Emacs*")
-       (switch-to-buffer "*About GNU Emacs*")
-       (rename-buffer "*GNU Emacs*" t)))))
-
+    (insert-button "getting the latest version"
+                  'action (lambda (button) (describe-distribution))
+                  'follow-link t)
+    (insert ".")))
+
+(defun normal-about-screen ()
+  (insert "\n" (emacs-version) "\n" emacs-copyright "\n\n")
+
+  (insert "To follow a link, click Mouse-1 on it, or move to it and type RET.\n\n")
+
+  (insert-button "Authors"
+                'action
+                (lambda (button)
+                  (view-file (expand-file-name "AUTHORS" data-directory))
+                  (goto-char (point-min)))
+                'follow-link t)
+  (insert "\t\tMany people have contributed code included in GNU Emacs\n")
+
+  (insert-button "Contributing"
+                'action
+                (lambda (button)
+                  (view-file (expand-file-name "CONTRIBUTE" data-directory))
+                  (goto-char (point-min)))
+                'follow-link t)
+  (insert "\tHow to contribute improvements to Emacs\n\n")
+
+  (insert-button "GNU and Freedom"
+                'action (lambda (button) (describe-project))
+                'follow-link t)
+  (insert "\t\tWhy we developed GNU Emacs and the GNU system\n")
+
+  (insert-button "Absence of Warranty"
+                'action (lambda (button) (describe-no-warranty))
+                'follow-link t)
+  (insert "\tGNU Emacs comes with ABSOLUTELY NO WARRANTY\n")
+
+  (insert-button "Copying Conditions"
+                'action (lambda (button) (describe-copying))
+                'follow-link t)
+  (insert "\tConditions for redistributing and changing Emacs\n")
+
+  (insert-button "Getting New Versions"
+                'action (lambda (button) (describe-distribution))
+                'follow-link t)
+  (insert "\tHow to get the latest version of GNU Emacs\n")
+
+  (insert-button "More Manuals / Ordering Manuals"
+                'action (lambda (button) (view-order-manuals))
+                'follow-link t)
+  (insert "\tBuying printed manuals from the FSF\n"))
 
 (defun startup-echo-area-message ()
   (if (eq (key-binding "\C-h\C-p") 'describe-project)
-      "For information about the GNU system and GNU/Linux, type C-h C-p."
+      "For information about GNU Emacs and the GNU system, type C-h C-a."
     (substitute-command-keys
-     "For information about the GNU system and GNU/Linux, type \
-\\[describe-project].")))
+     "For information about GNU Emacs and the GNU system, type \
+\\[about-emacs].")))
 
 
 (defun display-startup-echo-area-message ()
   (let ((resize-mini-windows t))
-    (message "%s" (startup-echo-area-message))))
-
-
-(defun display-splash-screen (&optional static)
-  "Display splash screen according to display.
-Fancy splash screens are used on graphic displays,
-normal otherwise.
-With a prefix argument, any user input hides the splash screen."
-  (interactive "P")
+    (or noninteractive ;(input-pending-p) init-file-had-error
+       ;; t if the init file says to inhibit the echo area startup message.
+       (and inhibit-startup-echo-area-message
+            user-init-file
+            (or (and (get 'inhibit-startup-echo-area-message 'saved-value)
+                     (equal inhibit-startup-echo-area-message
+                            (if (equal init-file-user "")
+                                (user-login-name)
+                              init-file-user)))
+                ;; Wasn't set with custom; see if .emacs has a setq.
+                (let ((buffer (get-buffer-create " *temp*")))
+                  (prog1
+                      (condition-case nil
+                          (save-excursion
+                            (set-buffer buffer)
+                            (insert-file-contents user-init-file)
+                            (re-search-forward
+                             (concat
+                              "([ \t\n]*setq[ \t\n]+"
+                              "inhibit-startup-echo-area-message[ \t\n]+"
+                              (regexp-quote
+                               (prin1-to-string
+                                (if (equal init-file-user "")
+                                    (user-login-name)
+                                  init-file-user)))
+                              "[ \t\n]*)")
+                             nil t))
+                        (error nil))
+                    (kill-buffer buffer)))))
+       (message "%s" (startup-echo-area-message)))))
+
+(defun display-startup-screen (&optional concise)
+  "Display startup screen according to display.
+A fancy display is used on graphic displays, normal otherwise.
+
+If CONCISE is non-nil, display a concise version of the startup
+screen."
+  ;; Prevent recursive calls from server-process-filter.
+  (if (not (get-buffer "*GNU Emacs*"))
+      (if (use-fancy-splash-screens-p)
+         (fancy-startup-screen concise)
+       (normal-splash-screen t))))
+
+(defun display-about-screen ()
+  "Display the *About GNU Emacs* buffer.
+A fancy display is used on graphic displays, normal otherwise."
+  (interactive)
   (if (use-fancy-splash-screens-p)
-      (fancy-splash-screens static)
-    (normal-splash-screen static)))
+      (fancy-about-screen)
+    (normal-splash-screen nil)))
 
-(defalias 'about-emacs 'display-splash-screen)
+(defalias 'about-emacs 'display-about-screen)
+(defalias 'display-splash-screen 'display-startup-screen)
 
 (defun command-line-1 (command-line-args-left)
-  (or noninteractive (input-pending-p) init-file-had-error
-      ;; t if the init file says to inhibit the echo area startup message.
-      (and inhibit-startup-echo-area-message
-          user-init-file
-          (or (and (get 'inhibit-startup-echo-area-message 'saved-value)
-                   (equal inhibit-startup-echo-area-message
-                          (if (equal init-file-user "")
-                              (user-login-name)
-                            init-file-user)))
-              ;; Wasn't set with custom; see if .emacs has a setq.
-              (let ((buffer (get-buffer-create " *temp*")))
-                (prog1
-                    (condition-case nil
-                        (save-excursion
-                          (set-buffer buffer)
-                          (insert-file-contents user-init-file)
-                          (re-search-forward
-                           (concat
-                            "([ \t\n]*setq[ \t\n]+"
-                            "inhibit-startup-echo-area-message[ \t\n]+"
-                            (regexp-quote
-                             (prin1-to-string
-                              (if (equal init-file-user "")
-                                  (user-login-name)
-                                init-file-user)))
-                            "[ \t\n]*)")
-                           nil t))
-                      (error nil))
-                  (kill-buffer buffer)))))
-      ;; display-splash-screen at the end of command-line-1 calls
-      ;; use-fancy-splash-screens-p. This can cause image.el to be
-      ;; loaded, putting "Loading image... done" in the echo area.
-      ;; This hides startup-echo-area-message. So
-      ;; use-fancy-splash-screens-p is called here simply to get the
-      ;; loading of image.el (if needed) out of the way before
-      ;; display-startup-echo-area-message runs.
-      (progn
-        (use-fancy-splash-screens-p)
-        (display-startup-echo-area-message)))
+  (display-startup-echo-area-message)
 
   ;; Delay 2 seconds after an init file error message
   ;; was displayed, so user can read it.
@@ -1861,267 +1961,271 @@ With a prefix argument, any user input hides the splash screen."
      "Building Emacs overflowed pure space.  (See the node Pure Storage in the Lisp manual for details.)"
      :warning))
 
-  (when command-line-args-left
-    ;; We have command args; process them.
-    (let ((dir command-line-default-directory)
-          (file-count 0)
-          first-file-buffer
-          tem
-          ;; This approach loses for "-batch -L DIR --eval "(require foo)",
-          ;; if foo is intended to be found in DIR.
-          ;;
-          ;; ;; The directories listed in --directory/-L options will *appear*
-          ;; ;; at the front of `load-path' in the order they appear on the
-          ;; ;; command-line.  We cannot do this by *placing* them at the front
-          ;; ;; in the order they appear, so we need this variable to hold them,
-          ;; ;; temporarily.
-          ;; extra-load-path
-          ;;
-          ;; To DTRT we keep track of the splice point and modify `load-path'
-          ;; straight away upon any --directory/-L option.
-          splice
-          just-files ;; t if this follows the magic -- option.
-          ;; This includes our standard options' long versions
-          ;; and long versions of what's on command-switch-alist.
-          (longopts
-           (append '(("--funcall") ("--load") ("--insert") ("--kill")
-                     ("--directory") ("--eval") ("--execute") ("--no-splash")
-                     ("--find-file") ("--visit") ("--file") ("--no-desktop"))
-                   (mapcar (lambda (elt)
-                             (list (concat "-" (car elt))))
-                           command-switch-alist)))
-          (line 0)
-          (column 0))
-
-      ;; Add the long X options to longopts.
-      (dolist (tem command-line-x-option-alist)
-        (if (string-match "^--" (car tem))
-            (push (list (car tem)) longopts)))
-
-      ;; Loop, processing options.
-      (while command-line-args-left
-        (let* ((argi (car command-line-args-left))
-               (orig-argi argi)
-               argval completion)
-          (setq command-line-args-left (cdr command-line-args-left))
-
-          ;; Do preliminary decoding of the option.
-          (if just-files
-              ;; After --, don't look for options; treat all args as files.
-              (setq argi "")
-            ;; Convert long options to ordinary options
-            ;; and separate out an attached option argument into argval.
-            (when (string-match "^\\(--[^=]*\\)=" argi)
-              (setq argval (substring argi (match-end 0))
-                    argi (match-string 1 argi)))
-            (if (equal argi "--")
-                (setq completion nil)
-              (setq completion (try-completion argi longopts)))
-            (if (eq completion t)
-                (setq argi (substring argi 1))
-              (if (stringp completion)
-                  (let ((elt (assoc completion longopts)))
-                    (or elt
-                        (error "Option `%s' is ambiguous" argi))
-                    (setq argi (substring (car elt) 1)))
-                (setq argval nil
-                      argi orig-argi))))
-
-          ;; Execute the option.
-          (cond ((setq tem (assoc argi command-switch-alist))
-                 (if argval
-                     (let ((command-line-args-left
-                            (cons argval command-line-args-left)))
-                       (funcall (cdr tem) argi))
-                   (funcall (cdr tem) argi)))
-
-                ((equal argi "-no-splash")
-                 (setq inhibit-startup-message t))
-
-                ((member argi '("-f"   ; what the manual claims
-                                "-funcall"
-                                "-e"))  ; what the source used to say
-                 (setq tem (intern (or argval (pop command-line-args-left))))
-                 (if (commandp tem)
-                     (command-execute tem)
-                   (funcall tem)))
-
-                ((member argi '("-eval" "-execute"))
-                 (eval (read (or argval (pop command-line-args-left)))))
-
-                ((member argi '("-L" "-directory"))
-                 (setq tem (expand-file-name
-                            (command-line-normalize-file-name
-                             (or argval (pop command-line-args-left)))))
-                 (cond (splice (setcdr splice (cons tem (cdr splice)))
-                               (setq splice (cdr splice)))
-                       (t (setq load-path (cons tem load-path)
-                                splice load-path))))
-
-                ((member argi '("-l" "-load"))
-                 (let* ((file (command-line-normalize-file-name
-                               (or argval (pop command-line-args-left))))
-                        ;; Take file from default dir if it exists there;
-                        ;; otherwise let `load' search for it.
-                        (file-ex (expand-file-name file)))
-                   (when (file-exists-p file-ex)
-                     (setq file file-ex))
-                   (load file nil t)))
-
-               ;; This is used to handle -script.  It's not clear
-               ;; we need to document it.
-                ((member argi '("-scriptload"))
-                 (let* ((file (command-line-normalize-file-name
-                               (or argval (pop command-line-args-left))))
-                        ;; Take file from default dir.
-                        (file-ex (expand-file-name file)))
-                   (load file-ex nil t t)))
-
-                ((equal argi "-insert")
-                 (setq tem (or argval (pop command-line-args-left)))
-                 (or (stringp tem)
-                     (error "File name omitted from `-insert' option"))
-                 (insert-file-contents (command-line-normalize-file-name tem)))
-
-                ((equal argi "-kill")
-                 (kill-emacs t))
-
-               ;; This is for when they use --no-desktop with -q, or
-               ;; don't load Desktop in their .emacs.  If desktop.el
-               ;; _is_ loaded, it will handle this switch, and we
-               ;; won't see it by the time we get here.
-               ((equal argi "-no-desktop")
-                (message "\"--no-desktop\" ignored because the Desktop package is not loaded"))
-
-                ((string-match "^\\+[0-9]+\\'" argi)
-                 (setq line (string-to-number argi)))
-
-                ((string-match "^\\+\\([0-9]+\\):\\([0-9]+\\)\\'" argi)
-                 (setq line (string-to-number (match-string 1 argi))
-                       column (string-to-number (match-string 2 argi))))
-
-                ((setq tem (assoc argi command-line-x-option-alist))
-                 ;; Ignore X-windows options and their args if not using X.
-                 (setq command-line-args-left
-                       (nthcdr (nth 1 tem) command-line-args-left)))
-
-                ((member argi '("-find-file" "-file" "-visit"))
-                 ;; An explicit option to specify visiting a file.
-                 (setq tem (or argval (pop command-line-args-left)))
-                 (unless (stringp tem)
-                   (error "File name omitted from `%s' option" argi))
-                 (setq file-count (1+ file-count))
-                 (let ((file (expand-file-name
-                              (command-line-normalize-file-name tem) dir)))
-                   (if (= file-count 1)
-                       (setq first-file-buffer (find-file file))
-                     (find-file-other-window file)))
-                 (or (zerop line)
-                     (goto-line line))
-                 (setq line 0)
-                 (unless (< column 1)
-                   (move-to-column (1- column)))
-                 (setq column 0))
-
-                ((equal argi "--")
-                 (setq just-files t))
-                (t
-                 ;; We have almost exhausted our options. See if the
-                 ;; user has made any other command-line options available
-                 (let ((hooks command-line-functions) ;; lrs 7/31/89
-                       (did-hook nil))
-                   (while (and hooks
-                               (not (setq did-hook (funcall (car hooks)))))
-                     (setq hooks (cdr hooks)))
-                   (if (not did-hook)
-                       ;; Presume that the argument is a file name.
-                       (progn
-                         (if (string-match "\\`-" argi)
-                             (error "Unknown option `%s'" argi))
-                         (setq file-count (1+ file-count))
-                         (let ((file
-                                (expand-file-name
-                                 (command-line-normalize-file-name orig-argi)
-                                 dir)))
-                           (if (= file-count 1)
-                               (setq first-file-buffer (find-file file))
-                             (find-file-other-window file)))
-                         (or (zerop line)
-                             (goto-line line))
-                         (setq line 0)
-                         (unless (< column 1)
-                           (move-to-column (1- column)))
-                         (setq column 0))))))
-         ;; In unusual circumstances, the execution of Lisp code due
-         ;; to command-line options can cause the last visible frame
-         ;; to be deleted.  In this case, kill emacs to avoid an
-         ;; abort later.
-         (unless (frame-live-p (selected-frame)) (kill-emacs nil))))
-
-      ;; If 3 or more files visited, and not all visible,
-      ;; show user what they all are.  But leave the last one current.
-      (and (> file-count 2)
-           (not noninteractive)
-           (not inhibit-startup-buffer-menu)
-           (or (get-buffer-window first-file-buffer)
-               (list-buffers)))))
-
-  (when initial-buffer-choice
-    (cond ((eq initial-buffer-choice t)
-          (switch-to-buffer (get-buffer-create "*scratch*")))
-         ((stringp initial-buffer-choice)
-          (find-file initial-buffer-choice))))
-
-  ;; Maybe display a startup screen.
-  (unless (or inhibit-startup-message
-             initial-buffer-choice
-             noninteractive
-             emacs-quick-startup)
-    ;; Display a startup screen, after some preparations.
-
-    ;; If there are no switches to process, we might as well
-    ;; run this hook now, and there may be some need to do it
-    ;; before doing any output.
-    (run-hooks 'emacs-startup-hook)
-    (and term-setup-hook
-        (run-hooks 'term-setup-hook))
-    (setq inhibit-startup-hooks t)
-
-    ;; It's important to notice the user settings before we
-    ;; display the startup message; otherwise, the settings
-    ;; won't take effect until the user gives the first
-    ;; keystroke, and that's distracting.
-    (when (fboundp 'frame-notice-user-settings)
-      (frame-notice-user-settings))
-
-    ;; If there are no switches to process, we might as well
-    ;; run this hook now, and there may be some need to do it
-    ;; before doing any output.
-    (when window-setup-hook
-      (run-hooks 'window-setup-hook)
-      ;; Don't let the hook be run twice.
-      (setq window-setup-hook nil))
-
-    ;; Do this now to avoid an annoying delay if the user
-    ;; clicks the menu bar during the sit-for.
-    (when (display-popup-menus-p)
-      (precompute-menubar-bindings))
-    (with-no-warnings
-     (setq menubar-bindings-done t))
-
-    ;; If *scratch* exists and is empty, insert initial-scratch-message.
-    (and initial-scratch-message
-         (get-buffer "*scratch*")
-         (with-current-buffer "*scratch*"
-           (when (zerop (buffer-size))
-             (insert initial-scratch-message)
-             (set-buffer-modified-p nil))))
-
-    ;; If user typed input during all that work,
-    ;; abort the startup screen.  Otherwise, display it now.
-    (unless (input-pending-p)
-      (display-splash-screen t))))
-
+  (let ((file-count 0)
+       first-file-buffer)
+    (when command-line-args-left
+      ;; We have command args; process them.
+      (let ((dir command-line-default-directory)
+           tem
+           ;; This approach loses for "-batch -L DIR --eval "(require foo)",
+           ;; if foo is intended to be found in DIR.
+           ;;
+           ;; ;; The directories listed in --directory/-L options will *appear*
+           ;; ;; at the front of `load-path' in the order they appear on the
+           ;; ;; command-line.  We cannot do this by *placing* them at the front
+           ;; ;; in the order they appear, so we need this variable to hold them,
+           ;; ;; temporarily.
+           ;; extra-load-path
+           ;;
+           ;; To DTRT we keep track of the splice point and modify `load-path'
+           ;; straight away upon any --directory/-L option.
+           splice
+           just-files ;; t if this follows the magic -- option.
+           ;; This includes our standard options' long versions
+           ;; and long versions of what's on command-switch-alist.
+           (longopts
+            (append '(("--funcall") ("--load") ("--insert") ("--kill")
+                      ("--directory") ("--eval") ("--execute") ("--no-splash")
+                      ("--find-file") ("--visit") ("--file") ("--no-desktop"))
+                    (mapcar (lambda (elt)
+                              (list (concat "-" (car elt))))
+                            command-switch-alist)))
+           (line 0)
+           (column 0))
+
+       ;; Add the long X options to longopts.
+       (dolist (tem command-line-x-option-alist)
+         (if (string-match "^--" (car tem))
+             (push (list (car tem)) longopts)))
+
+       ;; Loop, processing options.
+       (while command-line-args-left
+         (let* ((argi (car command-line-args-left))
+                (orig-argi argi)
+                argval completion)
+           (setq command-line-args-left (cdr command-line-args-left))
+
+           ;; Do preliminary decoding of the option.
+           (if just-files
+               ;; After --, don't look for options; treat all args as files.
+               (setq argi "")
+             ;; Convert long options to ordinary options
+             ;; and separate out an attached option argument into argval.
+             (when (string-match "^\\(--[^=]*\\)=" argi)
+               (setq argval (substring argi (match-end 0))
+                     argi (match-string 1 argi)))
+             (if (equal argi "--")
+                 (setq completion nil)
+               (setq completion (try-completion argi longopts)))
+             (if (eq completion t)
+                 (setq argi (substring argi 1))
+               (if (stringp completion)
+                   (let ((elt (assoc completion longopts)))
+                     (or elt
+                         (error "Option `%s' is ambiguous" argi))
+                     (setq argi (substring (car elt) 1)))
+                 (setq argval nil
+                       argi orig-argi))))
+
+           ;; Execute the option.
+           (cond ((setq tem (assoc argi command-switch-alist))
+                  (if argval
+                      (let ((command-line-args-left
+                             (cons argval command-line-args-left)))
+                        (funcall (cdr tem) argi))
+                    (funcall (cdr tem) argi)))
+
+                 ((equal argi "-no-splash")
+                  (setq inhibit-startup-screen t))
+
+                 ((member argi '("-f"  ; what the manual claims
+                                 "-funcall"
+                                 "-e"))  ; what the source used to say
+                  (setq inhibit-startup-screen t)
+                  (setq tem (intern (or argval (pop command-line-args-left))))
+                  (if (commandp tem)
+                      (command-execute tem)
+                    (funcall tem)))
+
+                 ((member argi '("-eval" "-execute"))
+                  (setq inhibit-startup-screen t)
+                  (eval (read (or argval (pop command-line-args-left)))))
+
+                 ((member argi '("-L" "-directory"))
+                  (setq tem (expand-file-name
+                             (command-line-normalize-file-name
+                              (or argval (pop command-line-args-left)))))
+                  (cond (splice (setcdr splice (cons tem (cdr splice)))
+                                (setq splice (cdr splice)))
+                        (t (setq load-path (cons tem load-path)
+                                 splice load-path))))
+
+                 ((member argi '("-l" "-load"))
+                  (let* ((file (command-line-normalize-file-name
+                                (or argval (pop command-line-args-left))))
+                         ;; Take file from default dir if it exists there;
+                         ;; otherwise let `load' search for it.
+                         (file-ex (expand-file-name file)))
+                    (when (file-exists-p file-ex)
+                      (setq file file-ex))
+                    (load file nil t)))
+
+                 ;; This is used to handle -script.  It's not clear
+                 ;; we need to document it.
+                 ((member argi '("-scriptload"))
+                  (let* ((file (command-line-normalize-file-name
+                                (or argval (pop command-line-args-left))))
+                         ;; Take file from default dir.
+                         (file-ex (expand-file-name file)))
+                    (load file-ex nil t t)))
+
+                 ((equal argi "-insert")
+                  (setq inhibit-startup-screen t)
+                  (setq tem (or argval (pop command-line-args-left)))
+                  (or (stringp tem)
+                      (error "File name omitted from `-insert' option"))
+                  (insert-file-contents (command-line-normalize-file-name tem)))
+
+                 ((equal argi "-kill")
+                  (kill-emacs t))
+
+                 ;; This is for when they use --no-desktop with -q, or
+                 ;; don't load Desktop in their .emacs.  If desktop.el
+                 ;; _is_ loaded, it will handle this switch, and we
+                 ;; won't see it by the time we get here.
+                 ((equal argi "-no-desktop")
+                  (message "\"--no-desktop\" ignored because the Desktop package is not loaded"))
+
+                 ((string-match "^\\+[0-9]+\\'" argi)
+                  (setq line (string-to-number argi)))
+
+                 ((string-match "^\\+\\([0-9]+\\):\\([0-9]+\\)\\'" argi)
+                  (setq line (string-to-number (match-string 1 argi))
+                        column (string-to-number (match-string 2 argi))))
+
+                 ((setq tem (assoc argi command-line-x-option-alist))
+                  ;; Ignore X-windows options and their args if not using X.
+                  (setq command-line-args-left
+                        (nthcdr (nth 1 tem) command-line-args-left)))
+
+                 ((member argi '("-find-file" "-file" "-visit"))
+                  (setq inhibit-startup-screen t)
+                  ;; An explicit option to specify visiting a file.
+                  (setq tem (or argval (pop command-line-args-left)))
+                  (unless (stringp tem)
+                    (error "File name omitted from `%s' option" argi))
+                  (setq file-count (1+ file-count))
+                  (let ((file (expand-file-name
+                               (command-line-normalize-file-name tem) dir)))
+                    (if (= file-count 1)
+                        (setq first-file-buffer (find-file file))
+                      (find-file-other-window file)))
+                  (or (zerop line)
+                      (goto-line line))
+                  (setq line 0)
+                  (unless (< column 1)
+                    (move-to-column (1- column)))
+                  (setq column 0))
+
+                 ((equal argi "--")
+                  (setq just-files t))
+                 (t
+                  ;; We have almost exhausted our options. See if the
+                  ;; user has made any other command-line options available
+                  (let ((hooks command-line-functions)
+                        (did-hook nil))
+                    (while (and hooks
+                                (not (setq did-hook (funcall (car hooks)))))
+                      (setq hooks (cdr hooks)))
+                    (if (not did-hook)
+                        ;; Presume that the argument is a file name.
+                        (progn
+                          (if (string-match "\\`-" argi)
+                              (error "Unknown option `%s'" argi))
+                          (unless initial-window-system
+                            (setq inhibit-startup-screen t))
+                          (setq file-count (1+ file-count))
+                          (let ((file
+                                 (expand-file-name
+                                  (command-line-normalize-file-name orig-argi)
+                                  dir)))
+                            (if (= file-count 1)
+                                (setq first-file-buffer (find-file file))
+                              (find-file-other-window file)))
+                          (or (zerop line)
+                              (goto-line line))
+                          (setq line 0)
+                          (unless (< column 1)
+                            (move-to-column (1- column)))
+                          (setq column 0))))))
+           ;; In unusual circumstances, the execution of Lisp code due
+           ;; to command-line options can cause the last visible frame
+           ;; to be deleted.  In this case, kill emacs to avoid an
+           ;; abort later.
+           (unless (frame-live-p (selected-frame)) (kill-emacs nil))))))
+
+    (when initial-buffer-choice
+      (cond ((eq initial-buffer-choice t)
+            (switch-to-buffer (get-buffer-create "*scratch*")))
+           ((stringp initial-buffer-choice)
+            (find-file initial-buffer-choice))))
+
+    (if (or inhibit-startup-screen
+           initial-buffer-choice
+           noninteractive
+           emacs-quick-startup)
+
+       ;; Not displaying a startup screen.  If 3 or more files
+       ;; visited, and not all visible, show user what they all are.
+       (and (> file-count 2)
+            (not noninteractive)
+            (not inhibit-startup-buffer-menu)
+            (or (get-buffer-window first-file-buffer)
+                (list-buffers)))
+
+      ;; Display a startup screen, after some preparations.
+
+      ;; If there are no switches to process, we might as well
+      ;; run this hook now, and there may be some need to do it
+      ;; before doing any output.
+      (run-hooks 'emacs-startup-hook)
+      (and term-setup-hook
+          (run-hooks 'term-setup-hook))
+      (setq inhibit-startup-hooks t)
+
+      ;; It's important to notice the user settings before we
+      ;; display the startup message; otherwise, the settings
+      ;; won't take effect until the user gives the first
+      ;; keystroke, and that's distracting.
+      (when (fboundp 'frame-notice-user-settings)
+       (frame-notice-user-settings))
+
+      ;; If there are no switches to process, we might as well
+      ;; run this hook now, and there may be some need to do it
+      ;; before doing any output.
+      (when window-setup-hook
+       (run-hooks 'window-setup-hook)
+       ;; Don't let the hook be run twice.
+       (setq window-setup-hook nil))
+
+      ;; Do this now to avoid an annoying delay if the user
+      ;; clicks the menu bar during the sit-for.
+      (when (display-popup-menus-p)
+       (precompute-menubar-bindings))
+      (with-no-warnings
+       (setq menubar-bindings-done t))
+
+      ;; If *scratch* exists and is empty, insert initial-scratch-message.
+      (and initial-scratch-message
+          (get-buffer "*scratch*")
+          (with-current-buffer "*scratch*"
+            (when (zerop (buffer-size))
+              (insert initial-scratch-message)
+              (set-buffer-modified-p nil))))
+
+      (if (> file-count 0)
+         (display-startup-screen t)
+       (display-startup-screen nil)))))
 
 (defun command-line-normalize-file-name (file)
   "Collapse multiple slashes to one, to handle non-Emacs file names."
index a74b6828dd5c5771dd5da3ddb3bbc47c01fdc870..89328826eefd57c510d81e52e33983026b5b1428 100644 (file)
@@ -1629,7 +1629,7 @@ any other non-digit terminates the character code and is then used as input."))
       ;; or C-q C-x might not return immediately since ESC or C-x might be
       ;; bound to some prefix in function-key-map or key-translation-map.
       (setq translated char)
-      (let ((translation (lookup-key function-key-map (vector char))))
+      (let ((translation (lookup-key local-function-key-map (vector char))))
        (if (arrayp translation)
            (setq translated (aref translation 0))))
       (cond ((null translated))
@@ -2408,6 +2408,23 @@ See also `with-temp-buffer'."
         (if (window-live-p save-selected-window-window)
             (select-window save-selected-window-window 'norecord))))))
 
+(defmacro with-selected-frame (frame &rest body)
+  "Execute the forms in BODY with FRAME as the selected frame.
+The value returned is the value of the last form in BODY.
+See also `with-temp-buffer'."
+  (declare (indent 1) (debug t))
+  (let ((old-frame (make-symbol "old-frame"))
+       (old-buffer (make-symbol "old-buffer")))
+    `(let ((,old-frame (selected-frame))
+          (,old-buffer (current-buffer)))
+       (unwind-protect
+          (progn (select-frame ,frame)
+                 ,@body)
+        (if (frame-live-p ,old-frame)
+            (select-frame ,old-frame))
+        (if (buffer-live-p ,old-buffer)
+            (set-buffer ,old-buffer))))))
+
 (defmacro with-temp-file (file &rest body)
   "Create a new buffer, evaluate BODY there, and write the buffer to FILE.
 The value returned is the value of the last form in BODY.
index 821bad4e819380cbf030b11b95d35996db59db66..e88067b7fe511322f083583238532f0cc2a480f7 100644 (file)
 ;;; Code:
 
 ;;;###autoload
-(define-minor-mode t-mouse-mode
-  "Toggle t-mouse mode to use the mouse in Linux consoles.
-With prefix arg, turn t-mouse mode on if arg is positive, otherwise turn it
-off.
+(define-obsolete-function-alias 't-mouse-mode 'gpm-mouse-mode "23.1")
+;;;###autoload
+(define-minor-mode gpm-mouse-mode
+  "Toggle gpm-mouse mode to use the mouse in GNU/Linux consoles.
+With prefix arg, turn gpm-mouse mode on if arg is positive,
+otherwise turn it off.
 
-This allows the use of the mouse when operating on a Linux console, in the
-same way as you can use the mouse under X11.
-It requires the `mev' program, part of the `gpm' utilities."
+This allows the use of the mouse when operating on a GNU/Linux console,
+in the same way as you can use the mouse under X11.
+It relies on the `gpm' daemon being activated."
   :global t :group 'mouse
-  (if window-system
-      (error "t-mouse only works in the console on GNU/Linux")
-    (if t-mouse-mode
-       (progn
-         (unless (fboundp 'term-open-connection)
-           (progn
-             (setq t-mouse-mode nil)
-             (error "Emacs must be built with Gpm to use this mode")))
-         (unless (term-open-connection)
-           (progn
-             (setq t-mouse-mode nil)
-             (error "Can't open mouse connection"))))
-      ;; Turn it off
-      (term-close-connection))))
+  (let ((activated nil))
+    (unwind-protect
+        (progn
+          (unless (fboundp 'gpm-mouse-start)
+            (error "Emacs must be built with Gpm to use this mode"))
+          (when gpm-mouse-mode
+            (gpm-mouse-start)
+            (setq activated t)))
+      ;; If the user asked to turn it off do that.
+      ;; If something failed to turn it on, try to turn it off as well,
+      ;; just in case.
+      (when (and (fboundp 'gpm-mouse-stop) (not activated))
+        (setq gpm-mouse-mode nil)
+        (gpm-mouse-stop)))))
 
 (provide 't-mouse)
 
index 8af1577ac379e057aeda077b6a5d84aa798db7ac..a46eadc745c029f7346bc5a67c4587c2828d52d3 100644 (file)
@@ -46,17 +46,44 @@ Each element has the form (DISPLAY FRAME BUFFER).")
   ;; Add the new buffers to all talk frames.
   (talk-update-buffers))
 
-(defun talk-add-display (display)
-  (let* ((elt (assoc display talk-display-alist))
-        (name (concat "*talk-" display "*"))
-        buffer frame)
-    (if (not (and elt (frame-live-p (setq frame (nth 1 elt)))))
-       (setq frame (make-frame-on-display display (list (cons 'name name)))))
+;;;###autoload
+(defun talk ()
+  "Connect to the Emacs talk group from the current X display or tty frame."
+  (interactive)
+  (let ((type (frame-live-p (selected-frame)))
+       (display (frame-terminal (selected-frame))))
+    (cond
+     ((eq type t)
+      (talk-add-display (selected-frame)))
+     ((eq type 'x)
+      (talk-add-display (frame-terminal (selected-frame))))
+     (t
+      (error "Unknown frame type"))))
+  (talk-update-buffers))
+
+(defun talk-add-display (frame)
+  (let* ((display (if (frame-live-p frame)
+                     (frame-terminal frame)
+                   frame))
+        (elt (assoc display talk-display-alist))
+        (name (concat "*talk-" (terminal-name display) "*"))
+        buffer)
+    (unless (frame-live-p frame)
+      (setq frame (make-frame-on-display display (list (cons 'name name)))))
+    (if (and elt (frame-live-p (nth 1 elt)))
+       (setq frame (nth 1 elt)))
     (if (not (and elt (buffer-name (get-buffer (setq buffer (nth 2 elt))))))
        (setq buffer (get-buffer-create name)))
+    (add-to-list 'delete-frame-functions 'talk-handle-delete-frame)
     (setq talk-display-alist
          (cons (list display frame buffer) (delq elt talk-display-alist)))))
 
+(defun talk-handle-delete-frame (frame)
+  (dolist (d talk-display-alist)
+    (when (eq (nth 1 d) frame)
+      (setq talk-display-alist (delq d talk-display-alist))
+      (talk-update-buffers))))
+
 (defun talk-disconnect ()
   "Disconnect this display from the Emacs talk group."
   (interactive)
index 261dac71818f9307d41cd864a667abda5bde6aa8..383dcd40d24c7fba75452f967bac02efe9b841cb 100644 (file)
@@ -315,9 +315,9 @@ mode, ON-REGION is ignored and assumed true if the region is active."
            (goto-char tempo-region-start))
        (save-excursion
          (tempo-insert-mark (point-marker))
-         (mapcar (function (lambda (elt)
-                             (tempo-insert elt on-region)))
-                 (symbol-value template))
+         (mapc (function (lambda (elt)
+                           (tempo-insert elt on-region)))
+               (symbol-value template))
          (tempo-insert-mark (point-marker)))
        (tempo-forward-mark))
     (tempo-forget-insertions)
@@ -460,10 +460,10 @@ never prompted."
   "Tries all the user-defined element handlers in `tempo-user-elements'."
   ;; Sigh... I need (some list)
   (catch 'found
-    (mapcar (function (lambda (handler)
-                       (let ((result (funcall handler element)))
-                         (if result (throw 'found result)))))
-           tempo-user-elements)
+    (mapc (function (lambda (handler)
+                     (let ((result (funcall handler element)))
+                       (if result (throw 'found result)))))
+         tempo-user-elements)
     (throw 'found nil)))
 
 ;;;
@@ -556,7 +556,7 @@ and insert the results."
   "Jump to the next mark in `tempo-forward-mark-list'."
   (interactive)
   (let ((next-mark (catch 'found
-                    (mapcar
+                    (mapc
                      (function
                       (lambda (mark)
                         (if (< (point) mark)
@@ -575,7 +575,7 @@ and insert the results."
   (interactive)
   (let ((prev-mark (catch 'found
                     (let (last)
-                      (mapcar
+                      (mapc
                        (function
                         (lambda (mark)
                           (if (<= (point) mark)
index 274de28e6a05a95867bd946d1b70ae742463c442..bc0434e151ac9c360fdd0b9e98d3e52e16ec7efc 100644 (file)
@@ -1562,7 +1562,7 @@ The returned value is suitable for the `x-popup-menu' function."
 (defun artist-mt-get-symbol-from-keyword-sub (table kwd)
   "Search TABLE for keyword KWD and return its symbol."
   (catch 'found
-    (mapcar
+    (mapc
      (lambda (element)
        (let ((element-tag (artist-mt-get-tag element)))
         (cond ((eq element-tag 'graphics-operation)
@@ -1611,7 +1611,7 @@ info-variant-part."
 Calls RETRIEVE-FN to retrieve information from that symbol's
 info-variant-part."
   (catch 'found
-    (mapcar
+    (mapc
      (lambda (element)
        (let ((element-tag (artist-mt-get-tag element)))
         (cond ((eq element-tag 'graphics-operation)
@@ -1700,7 +1700,7 @@ otherwise the shifted symbol."
 If IS-SHIFTED is non-nil, return the shifted symbol,
 otherwise the shifted symbol."
   (catch 'found
-    (mapcar
+    (mapc
      (lambda (element)
        (let ((element-tag (artist-mt-get-tag element)))
         (cond ((eq element-tag 'graphics-operation)
@@ -1737,7 +1737,7 @@ info-variant-part."
 Calls RETRIEVE-FN to retrieve information from that symbol's
 info-variant-part."
   (catch 'found
-    (mapcar
+    (mapc
      (lambda (element)
        (let ((element-tag (artist-mt-get-tag element)))
         (cond ((eq element-tag 'function-call)
@@ -3160,7 +3160,7 @@ Do this by replacing the characters that forms the line with
 `artist-erase-char'.  Output is a list of endpoints for lines
 through X1, Y1. An endpoint is a cons pair, (ENDPOINT-X . ENDPOINT-Y)."
   (let ((endpoints (artist-vap-find-endpoints x1 y1)))
-    (mapcar
+    (mapc
      (lambda (endpoints)
        (let ((ep1 (car endpoints))
             (ep2 (car (cdr endpoints))))
@@ -3213,14 +3213,14 @@ through X1, Y1. An endpoint is a cons pair, (ENDPOINT-X . ENDPOINT-Y)."
 (defun artist-vaporize-lines (x1 y1)
   "Vaporize lines reachable from point X1, Y1."
   (let ((ep-stack nil))
-    (mapcar
+    (mapc
      (lambda (ep) (push ep ep-stack))
      (artist-vap-find-endpoints x1 y1))
     (while (not (null ep-stack))
       (let* ((vaporize-point (pop ep-stack))
             (new-endpoints (artist-vaporize-line (car vaporize-point)
                                                  (cdr vaporize-point))))
-       (mapcar
+       (mapc
         (lambda (endpoint) (push endpoint ep-stack))
         new-endpoints)))))
 
@@ -3340,7 +3340,7 @@ The POINT-LIST is expected to cover the first quadrant."
 
     ;; Create first half (the lower one (since y grows downwards)) from
     ;; the first quadrant.
-    (mapcar
+    (mapc
      (lambda (coord)
        (let* ((x         (artist-coord-get-x coord))
              (y         (artist-coord-get-y coord))
@@ -3359,7 +3359,7 @@ The POINT-LIST is expected to cover the first quadrant."
     ;; Create the other half by mirroring the first half.
     (setq both-halves
          (append first-half
-                 (mapcar
+                 (mapc
                   (lambda (i)
                     (artist-new-fill-item (artist-fill-item-get-x i)
                                           (- (artist-fill-item-get-y i))
@@ -5361,7 +5361,7 @@ The event, EV, is the mouse event."
                    artist-arrow-point-1
                    artist-arrow-point-2)))
        ;; Remove those variables from vars that are not bound
-       (mapcar
+       (mapc
         (function
          (lambda (x)
            (if (not (and (boundp x) (symbol-value x)))
index 99c2f92cab0abda9a752aed94f72c86caeb0b349..ee1a4f7d6593a28911d46ba6a655dff1a2c4b20a 100644 (file)
@@ -95,7 +95,8 @@
 
 (defcustom bibtex-style-indent-basic 2
   "Basic amount of indentation to use in BibTeX Style mode."
-  :type 'integer)
+  :type 'integer
+  :group 'bibtex)
 
 (defun bibtex-style-calculate-indentation (&optional virt)
   (or
index b00fc356cce342a82ff5bf7544d5c6efe4abf11b..079c362b5046395aed99224f85d476577db92785 100644 (file)
 
 ;;; Code:
 
+(defgroup css nil
+  "Cascading Style Sheets (CSS) editing mode."
+  :group 'languages)
+
 (defun css-extract-keyword-list (res)
   (with-temp-buffer
     (url-insert-file-contents "http://www.w3.org/TR/REC-CSS2/css2.txt")
     "word-spacing" "z-index")
   "Identifiers for properties.")
 
-(defcustom css-electrick-keys '(?\} ?\;) ;; '()
+(defcustom css-electric-keys '(?\} ?\;) ;; '()
   "Self inserting keys which should trigger re-indentation."
   :type '(repeat character)
-  :options '((?\} ?\;)))
+  :options '((?\} ?\;))
+  :group 'css)
 
 (defvar css-mode-syntax-table
   (let ((st (make-syntax-table)))
 (defconst css-name-re (concat css-nmchar-re "+"))
 
 (defface css-selector '((t :inherit font-lock-function-name-face))
-  "Face to use for selectors.")
+  "Face to use for selectors."
+  :group 'css)
 (defface css-property '((t :inherit font-lock-variable-name-face))
-  "Face to use for properties.")
+  "Face to use for properties."
+  :group 'css)
 
 (defvar css-font-lock-keywords
   `(("!\\s-*important" . font-lock-builtin-face)
   (set (make-local-variable 'indent-line-function) 'css-indent-line)
   (set (make-local-variable 'fill-paragraph-function)
        'css-fill-paragraph)
-  (when css-electrick-keys
+  (when css-electric-keys
     (let ((fc (make-char-table 'auto-fill-chars)))
       (set-char-table-parent fc auto-fill-chars)
-      (dolist (c css-electrick-keys)
+      (dolist (c css-electric-keys)
         (aset fc c 'indent-according-to-mode))
       (set (make-local-variable 'auto-fill-chars) fc))))
 
 
 (defcustom css-indent-offset 4
   "Basic size of one indentation step."
-  :type 'integer)
+  :type 'integer
+  :group 'css)
 
 (defun css-indent-calculate ()
   (let ((ppss (syntax-ppss))
index 48bb176e44caf9354da0f9d28678ddaf14af14cc..e0f80b1b11822a40a6b74a525684b252e5bf8557 100644 (file)
@@ -1012,6 +1012,18 @@ space does not end a sentence, so don't break a line there."
          (goto-char end))))
     fill-pfx))
 
+(defun fill-paragraph-or-region (arg)
+  "Fill the active region or current paragraph.
+In Transient Mark mode, when the mark is active, it calls `fill-region'
+on the active region.  Otherwise, it calls `fill-paragraph'."
+  (interactive (progn
+                (barf-if-buffer-read-only)
+                (list (if current-prefix-arg 'full))))
+  (if (and transient-mark-mode mark-active
+          (not (eq (region-beginning) (region-end))))
+      (fill-region (region-beginning) (region-end) arg)
+    (fill-paragraph arg)))
+
 \f
 (defcustom default-justification 'left
   "*Method of justifying text not otherwise specified.
index 0b5dfa4cc54ba30fc93648de75a6e926a615a470..69d8c814f462c238eca3377dd7c083df45d89795 100644 (file)
@@ -67,11 +67,21 @@ Non-nil means use highlight, nil means use minibuffer messages."
 
 (defcustom flyspell-mark-duplications-flag t
   "Non-nil means Flyspell reports a repeated word as an error.
+See `flyspell-mark-duplications-exceptions' to add exceptions to this rule.
 Detection of repeated words is not implemented in
 \"large\" regions; see `flyspell-large-region'."
   :group 'flyspell
   :type 'boolean)
 
+(defcustom flyspell-mark-duplications-exceptions
+  '(("francais" . ("nous" "vous")))
+  "A list of exceptions for duplicated words.
+It should be a list of (LANGUAGE . EXCEPTION-LIST).  LANGUAGE is matched
+against the current dictionary and EXCEPTION-LIST is a list of strings.
+The duplicated word is downcased before it is compared with the exceptions."
+  :group 'flyspell
+  :type '(alist :key-type string :value-type (repeat string)))
+
 (defcustom flyspell-sort-corrections nil
   "Non-nil means, sort the corrections alphabetically before popping them."
   :group 'flyspell
@@ -485,7 +495,10 @@ in your .emacs file.
   :keymap flyspell-mode-map
   :group 'flyspell
   (if flyspell-mode
-      (flyspell-mode-on)
+      (condition-case ()
+         (flyspell-mode-on)
+       (error (message "Enabling Flyspell mode gave an error")
+              (flyspell-mode -1)))
     (flyspell-mode-off)))
 
 ;;;###autoload
@@ -611,7 +624,7 @@ in your .emacs file.
 ;;*---------------------------------------------------------------------*/
 (defun flyspell-delay-commands ()
   "Install the standard set of Flyspell delayed commands."
-  (mapcar 'flyspell-delay-command flyspell-default-delayed-commands)
+  (mapc 'flyspell-delay-command flyspell-default-delayed-commands)
   (mapcar 'flyspell-delay-command flyspell-delayed-commands))
 
 ;;*---------------------------------------------------------------------*/
@@ -630,7 +643,7 @@ It will be checked only after `flyspell-delay' seconds."
 ;;*---------------------------------------------------------------------*/
 (defun flyspell-deplacement-commands ()
   "Install the standard set of Flyspell deplacement commands."
-  (mapcar 'flyspell-deplacement-command flyspell-default-deplacement-commands)
+  (mapc 'flyspell-deplacement-command flyspell-default-deplacement-commands)
   (mapcar 'flyspell-deplacement-command flyspell-deplacement-commands))
 
 ;;*---------------------------------------------------------------------*/
@@ -1022,6 +1035,13 @@ Mostly we check word delimiters."
                     (and (> start (point-min))
                          (not (memq (char-after (1- start)) '(?\} ?\\)))))
                 flyspell-mark-duplications-flag
+                (not (catch 'exception
+                       (dolist (except flyspell-mark-duplications-exceptions)
+                         (and (string= (or ispell-local-dictionary
+                                           ispell-dictionary)
+                                       (car except))
+                              (member (downcase word) (cdr except))
+                              (throw 'exception t)))))
                 (save-excursion
                   (goto-char start)
                   (let* ((bound
index f014870598b6fc8d828480ee7cdbeee9aa326482..9aedae9461b8267ef3f0c86a9f488526eb864ead 100644 (file)
@@ -3,27 +3,29 @@
 ;;
 ;; Author: Bastien Guerry <bzg AT altern DOT org>
 ;; Keywords: org organizer latex export convert
-;; X-URL: <http://www.cognition.ens.fr/~guerry/u/org-export-latex.el>
+;; Homepage: http://www.cognition.ens.fr/~guerry/u/org-export-latex.el
+;; Version: 5.09
 ;;
 ;; This file is part of GNU Emacs.
 ;;
-;; This program 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 2, or (at your option)
-;; any later version.
+;; 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, or (at your option) any
+;; later version.
 ;;
-;; This program 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.
+;; 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; see the file COPYING. If not, write to the Free Software
+;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
 ;;
-;; You should have received a copy of the GNU General Public License
-;; along with this program; if not, write to the Free Software
-;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
 ;;; Commentary:
-
-;; This library is a LaTeX exporter for org-mode.
+;;
+;; This library implements a LaTeX exporter for org-mode.
 ;; 
 ;; Put this file into your load-path and the following into your ~/.emacs:
 ;;   (require 'org-export-latex)
 ;; M-x `org-export-as-latex-to-buffer'
 ;; M-x `org-export-region-as-latex'
 ;; M-x `org-replace-region-by-latex'
-
-;;; History:
-;; 
-;; I started this piece of code in may 2007. Special thanks to Carsten
-;; Dominik for helping me on this.
-;; 
-
+;;
 ;;; Code:
 
-(require 'org)
+(eval-when-compile
+  (require 'cl))
+
 (require 'footnote)
+(require 'org)
 
+;;; Variables:
 (defvar org-latex-options-plist nil)
 (defvar org-latex-todo-keywords-1 nil)
 (defvar org-latex-all-targets-regexp nil)
 (defvar org-latex-add-level 0)
 (defvar org-latex-sectioning-depth 0)
+(defvar org-export-latex-list-beginning-re
+  "^\\([ \t]*\\)\\([-+]\\|[0-9]+\\(?:\\.\\|)\\)\\) *?")
 
 (defvar org-latex-special-string-regexps
   '(org-ts-regexp
     org-clock-string)
   "A list of regexps to convert as special keywords.")
 
+(defvar latexp)    ; dynamically scoped from org.el
+(defvar re-quote)  ; dynamically scoped from org.el
+(defvar commentsp) ; dynamically scoped from org.el
+
+;;; Custom variables:
 (defcustom org-export-latex-sectioning-alist
   '((1 "\\section{%s}" "\\section*{%s}")
     (2 "\\subsection{%s}" "\\subsection*{%s}")
@@ -94,11 +101,17 @@ The %s formatter will be replaced by the title of the section."
   :group 'org-export-latex
   :type 'string)
 
-(defcustom org-export-latex-date-format nil
+(defcustom org-export-latex-date-format 
+  "%d %B %Y"
   "Format string for \\date{...}."
   :group 'org-export-latex
   :type 'string)
 
+(defcustom org-export-latex-tables-verbatim nil
+  "When non-nil, export tables as verbatim."
+  :group 'org-export-latex
+  :type 'boolean)
+
 (defcustom org-export-latex-packages-alist nil
   "Alist of packages to be inserted in the preamble.
 Each cell is of the forma \( option . package \).
@@ -121,7 +134,7 @@ headline is mandatory)."
                 (symbol :tag "Convert as descriptive list" description)
                 (string :tag "Use a section string" :value "\\subparagraph{%s}")))
 
-(defcustom org-export-latex-remove-from-headines
+(defcustom org-export-latex-remove-from-headlines
   '(:todo t :priority t :tags t)
   "A plist of keywords to remove from headlines.
 Non-nil means remove this keyword type from the headline.
@@ -130,13 +143,6 @@ Don't remove the keys, just change their values."
   :type 'plist
   :group 'org-export-latex)
 
-(defcustom org-export-latex-quotation-marks-convention "en"
-  "Convention for conversion of the quotation marks.
-This value is overriden by any infile language setup."
-  :group 'org-export-latex
-  :type '(choice (string :tag "english" "en")
-                (string :tag "french" "fr")))
-
 (defcustom org-export-latex-image-default-option "width=10em"
   "Default option for images."
   :group 'org-export-latex
@@ -150,6 +156,7 @@ This value is overriden by any infile language setup."
 ;; FIXME Do we want this one?
 ;; (defun org-export-as-latex-and-open (arg) ...)
 
+;;; Autoload functions:
 ;;;###autoload
 (defun org-export-as-latex-batch ()
   "Call `org-export-as-latex', may be used in batch processing as
@@ -273,16 +280,16 @@ in a window.  A non-interactive call will only retunr the buffer."
                  (if region-p (region-beginning) (point-min))
                  (if region-p (region-end) (point-max))))
         (string-for-export
-         ;; FIXME Use org-cleaned-string-for-export instead, only when
-         ;; everyone uses Org >5.04
-         (org-latex-cleaned-string-for-export
-          region :for-html nil
-                 :comments nil
+         (org-cleaned-string-for-export
+          region :emph-multiline t
                  :for-LaTeX t
-                 :skip-before-1st-heading nil
+                 :comments nil
+                 :add-text text
+                 :skip-before-1st-heading skip
                  :LaTeX-fragments nil)))
     (set-buffer buffer)
     (erase-buffer)
+
     (unless body-only (insert preamble))
     (when text (insert (org-export-latex-content text) "\n\n"))
     (unless skip (insert first-lines))
@@ -303,9 +310,9 @@ in a window.  A non-interactive call will only retunr the buffer."
         (setq org-latex-add-level
               (if odd (1- (/ (1+ asters) 2)) (1- asters)))
         (org-export-latex-parse-global level odd))))
-
+    
     (unless body-only (insert "\n\\end{document}"))
-    (or to-buffer (write-file filename))
+    (or to-buffer (save-buffer))
     (goto-char (point-min))
     (message "Exporting to LaTeX...done")
     (if (eq to-buffer 'string)
@@ -313,88 +320,7 @@ in a window.  A non-interactive call will only retunr the buffer."
          (kill-buffer (current-buffer)))
       (current-buffer))))
 
-(defun org-export-latex-set-initial-vars (ext-plist)
-  "Store org local variables required for LaTeX export.
-EXT-PLIST is an optional additional plist."
-  (setq org-latex-todo-keywords-1 org-todo-keywords-1
-       org-latex-all-targets-regexp
-       (org-make-target-link-regexp (org-all-targets))
-       org-latex-options-plist
-       (org-combine-plists (org-default-export-plist) ext-plist
-                           (org-infile-export-plist))
-       org-latex-sectioning-depth
-       (let ((hl-levels (plist-get org-latex-options-plist :headline-levels))
-             (sec-depth (length org-export-latex-sectioning-alist)))
-             ;; Fall back on org-export-latex-sectioning-alist length if
-             ;; headline-levels goes beyond it
-         (if (> hl-levels sec-depth) sec-depth hl-levels))))
-
-(defun org-export-latex-make-preamble (opt-plist)
-  "Make the LaTeX preamble and return it as a string.
-Argument OPT-PLIST is the options plist for current buffer."
-  (let ((toc (plist-get opt-plist :table-of-contents)))
-    (format (concat org-export-latex-preamble
-     "
-%s
-
-\\begin{document}
-
-\\title{%s}
-%s
-%s
-\\maketitle
-%s
-%s
-")
-           (if org-export-latex-packages-alist
-               (mapconcat (lambda(p)
-                            (if (equal "" (car p))
-                                (format "\\usepackage{%s}" (cadr p))
-                              (format "\\usepackage[%s]{%s}"
-                                      (car p) (cadr p))))
-                          org-export-latex-packages-alist "\n") "")
-           (or (plist-get opt-plist :title)
-               (and (not
-                     (plist-get opt-plist :skip-before-1st-heading))
-                    (org-export-grab-title-from-buffer))
-               (and buffer-file-name
-                    (file-name-sans-extension
-                     (file-name-nondirectory buffer-file-name)))
-               "UNTITLED")
-           (if (plist-get opt-plist :author-info)
-               (format "\\author{%s}" 
-                       (or (plist-get opt-plist :author) user-full-name))
-             (format "%%\\author{%s}"
-                     (or (plist-get opt-plist :author) user-full-name)))
-           (if (plist-get opt-plist :timestamps)
-               (format "\\date{%s}"
-                       (format-time-string (or org-export-latex-date-format
-                                               (car org-time-stamp-formats))))
-             "%\\date{}")
-           (if (and (plist-get opt-plist :section-numbers) toc)
-               (format "\\setcounter{tocdepth}{%s}"
-                       (plist-get opt-plist :headline-levels)) "")
-           (if (and (plist-get opt-plist :section-numbers) toc)
-               "\\tableofcontents" ""))))
-
-(defun org-export-latex-first-lines (&optional comments)
-  "Export the first lines before first headline.
-COMMENTS is either nil to replace them with the empty string or a
-formatting string like %%%%s if we want to comment them out."
-  (save-excursion
-    (goto-char (point-min))
-    (let* ((end (if (re-search-forward "^\\*" nil t)
-                   (goto-char (match-beginning 0))
-                 (goto-char (point-max)))))
-      (org-export-latex-content
-       (org-latex-cleaned-string-for-export
-       (buffer-substring (point-min) end)
-       :for-html nil
-       :for-LaTeX t
-       :comments nil
-       :skip-before-1st-heading nil
-       :LaTeX-fragments nil)))))
-
+;;; Parsing functions:
 (defun org-export-latex-parse-global (level odd)
   "Parse the current buffer recursively, starting at LEVEL.
 If ODD is non-nil, assume the buffer only contains odd sections.
@@ -444,6 +370,52 @@ Return A list reflecting the document structure."
          (widen)))
       (list output))))
 
+(defun org-export-latex-parse-list (&optional delete)
+  "Parse the list at point.
+Return a list containing first level items as strings and
+sublevels as list of strings."
+  (let ((start (point))
+       ;; Find the end of the list
+       (end (save-excursion 
+              (catch 'exit
+                (while (or (looking-at org-export-latex-list-beginning-re)
+                           (looking-at "^[ \t]+\\|^$"))
+                  (if (eq (point) (point-max))
+                      (throw 'exit (point-max)))
+                  (forward-line 1))) (point)))
+       output itemsep)
+    (while (re-search-forward org-export-latex-list-beginning-re end t)
+      (setq itemsep (if (save-match-data
+                         (string-match "^[0-9]" (match-string 2)))
+                       "[0-9]+\\(?:\\.\\|)\\)" "[-+]"))
+      (let* ((indent1 (match-string 1))
+            (nextitem (save-excursion 
+                        (save-match-data
+                          (or (and (re-search-forward 
+                                    (concat "^" indent1 itemsep " *?") end t)
+                                   (match-beginning 0)) end))))
+            (item (buffer-substring
+                   (point)
+                   (or (and (re-search-forward 
+                             org-export-latex-list-beginning-re end t)
+                            (goto-char (match-beginning 0)))
+                       (goto-char end))))
+            (nextindent (match-string 1))
+            (item (org-trim item))
+            (item (if (string-match "^\\[.+\\]" item)
+                      (replace-match "\\\\texttt{\\&}"
+                                     t nil item) item)))
+       (push item output)
+       (when (> (length nextindent)
+                (length indent1))
+         (narrow-to-region (point) nextitem)
+         (push (org-export-latex-parse-list) output)
+         (widen))))
+    (when delete (delete-region start end))
+    (setq output (nreverse output))
+    (push (if (string-match "^\\[0" itemsep)
+             'ordered 'unordered) output)))
+
 (defun org-export-latex-parse-content ()
   "Extract the content of a section."
   (let ((beg (point))
@@ -463,6 +435,7 @@ If ODD Is non-nil, assume subcontent only contains odd sections."
       nil ; subcontent is nil
     (org-export-latex-parse-global (+ (if odd 2 1) level) odd)))
 
+;;; Rendering functions:
 (defun org-export-latex-global (content)
   "Export CONTENT to LaTeX.
 CONTENT is an element of the list produced by
@@ -475,9 +448,10 @@ CONTENT is an element of the list produced by
   "Export the list SUBCONTENT to LaTeX.
 SUBCONTENT is an alist containing information about the headline
 and its content."
-  (mapc (lambda(x) (org-export-latex-subcontent x)) subcontent))
+  (let ((num (plist-get org-latex-options-plist :section-numbers)))
+    (mapc (lambda(x) (org-export-latex-subcontent x num)) subcontent)))
 
-(defun org-export-latex-subcontent (subcontent)
+(defun org-export-latex-subcontent (subcontent num)
   "Export each cell of SUBCONTENT to LaTeX."
   (let ((heading (org-export-latex-fontify-headline
                  (cdr (assoc 'heading subcontent))))
@@ -485,8 +459,7 @@ and its content."
                  org-latex-add-level))
        (occur (number-to-string (cdr (assoc 'occur subcontent))))
        (content (cdr (assoc 'content subcontent)))
-       (subcontent (cadr (assoc 'subcontent subcontent)))
-       (num (plist-get org-latex-options-plist :section-numbers)))
+       (subcontent (cadr (assoc 'subcontent subcontent))))
     (cond 
      ;; Normal conversion
      ((<= level org-latex-sectioning-depth)
@@ -509,7 +482,111 @@ and its content."
             (cond ((stringp subcontent) (insert subcontent))
                   ((listp subcontent) (org-export-latex-sub subcontent)))))))))
 
-(defun org-export-latex-special-keywords-maybe (remove-list)
+
+;;; Exporting internals:
+(defun org-latex-protect (string)
+  (add-text-properties 0 (length string) '(org-protected t) string) string)
+
+(defun org-export-latex-protect-char-in-string (char-list string)
+  "Add org-protected text-property to char from CHAR-LIST in STRING."
+  (with-temp-buffer
+    (save-match-data
+      (insert string)
+      (goto-char (point-min))
+      (while (re-search-forward (regexp-opt char-list) nil t)
+       (add-text-properties (match-beginning 0)
+                            (match-end 0) '(org-protected t)))
+      (buffer-string))))
+
+(defun org-export-latex-set-initial-vars (ext-plist)
+  "Store org local variables required for LaTeX export.
+EXT-PLIST is an optional additional plist."
+  (setq org-latex-todo-keywords-1 org-todo-keywords-1
+       org-latex-all-targets-regexp
+       (org-make-target-link-regexp (org-all-targets))
+       org-latex-options-plist
+       (org-combine-plists (org-default-export-plist) ext-plist
+                           (org-infile-export-plist))
+       org-latex-sectioning-depth
+       (let ((hl-levels (plist-get org-latex-options-plist :headline-levels))
+             (sec-depth (length org-export-latex-sectioning-alist)))
+             ;; Fall back on org-export-latex-sectioning-alist length if
+             ;; headline-levels goes beyond it
+         (if (> hl-levels sec-depth) sec-depth hl-levels))))
+
+(defun org-export-latex-make-preamble (opt-plist)
+  "Make the LaTeX preamble and return it as a string.
+Argument OPT-PLIST is the options plist for current buffer."
+  (let ((toc (plist-get opt-plist :table-of-contents)))
+    (concat (if (plist-get opt-plist :time-stamp-file)
+               (format-time-string "% Created %Y-%m-%d %a %H:%M\n"))
+
+            ;; LaTeX custom preamble
+            org-export-latex-preamble "\n"
+
+            ;; LaTeX packages
+            (if org-export-latex-packages-alist
+                (mapconcat (lambda(p)
+                             (if (equal "" (car p))
+                                 (format "\\usepackage{%s}" (cadr p))
+                               (format "\\usepackage[%s]{%s}"
+                                       (car p) (cadr p))))
+                           org-export-latex-packages-alist "\n") "")
+            "\n\\begin{document}\n\n"
+
+            ;; title
+            (format 
+             "\\title{%s}\n"
+             (or (plist-get opt-plist :title)
+                 (and (not
+                       (plist-get opt-plist :skip-before-1st-heading))
+                      (org-export-grab-title-from-buffer))
+                 (and buffer-file-name
+                      (file-name-sans-extension
+                       (file-name-nondirectory buffer-file-name)))
+                 "UNTITLED"))
+
+            ;; author info
+            (if (plist-get opt-plist :author-info)
+                (format "\\author{%s}\n" 
+                        (or (plist-get opt-plist :author) user-full-name))
+              (format "%%\\author{%s}\n"
+                      (or (plist-get opt-plist :author) user-full-name)))
+            
+            ;; date
+            (format "\\date{%s}\n"
+                    (format-time-string 
+                     (or (plist-get opt-plist :date)
+                         org-export-latex-date-format)))
+
+            "\\maketitle\n\n"
+            ;; table of contents
+            (if (and (plist-get opt-plist :section-numbers) toc)
+                (format "\\setcounter{tocdepth}{%s}\n"
+                        (plist-get opt-plist :headline-levels)) "")
+            (if (and (plist-get opt-plist :section-numbers) toc)
+                "\\tableofcontents\n" "\n"))))
+
+(defun org-export-latex-first-lines (&optional comments)
+  "Export the first lines before first headline.
+COMMENTS is either nil to replace them with the empty string or a
+formatting string like %%%%s if we want to comment them out."
+  (save-excursion
+    (goto-char (point-min))
+    (let* ((end (if (re-search-forward "^\\*" nil t)
+                   (goto-char (match-beginning 0))
+                 (goto-char (point-max)))))
+      (org-export-latex-content
+       (org-cleaned-string-for-export
+       (buffer-substring (point-min) end)
+       :for-LaTeX t
+       :emph-multiline t
+       :add-text nil
+       :comments nil
+       :skip-before-1st-heading nil
+       :LaTeX-fragments nil)))))
+
+(defun org-export-latex-keywords-maybe (remove-list)
   "Maybe remove keywords depending on rules in REMOVE-LIST."
   (goto-char (point-min))
   (let ((re-todo (mapconcat 'identity org-latex-todo-keywords-1 "\\|")))
@@ -525,7 +602,8 @@ and its content."
        (replace-match (format "\\texttt{%s}" (match-string 0)) t t)))
     ;; convert tags
     (when (re-search-forward "\\(:[a-zA-Z0-9]+\\)+:" nil t)
-      (if (plist-get remove-list :tags)
+      (if (or (not org-export-with-tags)
+             (plist-get remove-list :tags))
          (replace-match "")
        (replace-match (format "\\texttt{%s}" (match-string 0)) t t)))))
 
@@ -536,11 +614,12 @@ and its content."
     ;; the beginning of the buffer - inserting "\n" is safe here though.
     (insert "\n" headline)
     (goto-char (point-min))
-    (org-export-latex-fontify)
+    (when (plist-get org-latex-options-plist :emphasize)
+      (org-export-latex-fontify))
     (org-export-latex-special-chars
      (plist-get org-latex-options-plist :sub-superscript))
-    (org-export-latex-special-keywords-maybe
-     org-export-latex-remove-from-headines)
+    (org-export-latex-keywords-maybe
+     org-export-latex-remove-from-headlines)
     (org-export-latex-links)
     (org-trim (buffer-substring-no-properties (point-min) (point-max)))))
 
@@ -554,29 +633,21 @@ and its content."
    (org-export-latex-special-chars
     (plist-get org-latex-options-plist :sub-superscript))
    (org-export-latex-links)
-   (org-export-latex-special-keywords)
-   (org-export-latex-itemize)
-   (org-export-latex-enumerate)
+   (org-export-latex-keywords
+    (plist-get org-latex-options-plist :timestamps))
+   (org-export-latex-lists)
    (org-export-latex-tables
     (plist-get org-latex-options-plist :tables))
    (org-export-latex-fixed-width
     (plist-get org-latex-options-plist :fixed-width))
-   (org-export-fix-invisible-strings)
    (buffer-substring (point-min) (point-max))))
 
-(defun org-export-fix-invisible-strings ()
-  "Comment out (INVISIBLE) warnings."
-  (goto-char (point-min))
-  (while (re-search-forward "(INVISIBLE)" nil t)
-    (replace-match "%\\&")))
-
 (defun org-export-latex-quotation-marks ()
   "Export question marks depending on language conventions.
 Local definition of the language overrides
 `org-export-latex-quotation-marks-convention' which overrides
 `org-export-default-language'."
-  (let* ((lang (or (plist-get org-latex-options-plist :language)
-                   org-export-latex-quotation-marks-convention))
+  (let* ((lang (plist-get org-latex-options-plist :language))
         (quote-rpl (if (equal lang "fr")
                        '(("\\(\\s-\\)\"" "«~")
                          ("\\(\\S-\\)\"" "~»")
@@ -594,7 +665,7 @@ Local definition of the language overrides
 ;; | chars/string in Org   | normal environment    | math environment      |
 ;; |-----------------------+-----------------------+-----------------------|
 ;; | & # % $               | \& \# \% \$           | \& \# \% \$           |
-;; | { } _ ^ \             | \ { \ } \_ \^ \\      | {  }  _  ^ \          |
+;; | { } _ ^ \             | \{ \} \_ \^ \\        | {  }  _  ^ \          |
 ;; |-----------------------+-----------------------+-----------------------|
 ;; | a_b and a^b           | $a_b$ and $a^b$       | a_b and a^b           |
 ;; | a_abc and a_{abc}     | $a_a$bc and $a_{abc}$ | a_abc and a_{abc}     |
@@ -628,11 +699,12 @@ See the `org-export-latex.el' code for a complete conversion table."
                      (replace-match (concat (match-string 1) "\\"
                                             (match-string 2)) t t)))
                   ((equal (match-string 2) "~")
-                   (unless (get-text-property 0 'org-protected (match-string 2))
-                     (if (equal (match-string 1) "\\") nil
-                       (replace-match 
-                        (org-latex-protect
-                         (concat (match-string 1) "\\textasciitilde{}")) t t))))
+                     (cond ((equal (match-string 1) "\\") nil)
+                           ((eq 'org-link (get-text-property 0 'face (match-string 2)))
+                            (replace-match (concat (match-string 1) "\\~") t t))
+                           (t (replace-match 
+                               (org-latex-protect
+                                (concat (match-string 1) "\\~{}")) t t))))
                   ((member (match-string 2) '("{" "}"))
                    (unless (save-match-data (org-inside-LaTeX-fragment-p))
                      (if (equal (match-string 1) "\\")
@@ -653,8 +725,8 @@ See the `org-export-latex.el' code for a complete conversion table."
                                            (match-string 2)
                                            (match-string 3))) "") t t)))))))
        '("^\\([^\n$]*?\\|^\\)\\(\\\\?\\$\\)\\([^\n$]*\\)$"
-         "\\([a-za-z0-9]+\\|[ \t\n]\\|\\\\\\)\\(_\\|\\^\\)\\([a-za-z0-9]+\\|[ \t\n]\\|[:punct:]\\|{[a-za-z0-9]+}\\|([a-za-z0-9]+)\\)"
-         "\\(.\\|^\\)\\(\\\\\\)\\([ \t\n]\\|[a-za-z&#%{}]+\\)"
+         "\\([a-za-z0-9]+\\|[ \t\n]\\|\\b\\|\\\\\\)\\(_\\|\\^\\)\\([a-za-z0-9]+\\|[ \t\n]\\|[:punct:]\\|{[a-za-z0-9]+}\\|([a-za-z0-9]+)\\)"
+         "\\(.\\|^\\)\\(\\\\\\)\\([ \t\n]\\|[a-zA-Z&#%{}\"]+\\)"
          "\\(.\\|^\\)\\(&\\)"
          "\\(.\\|^\\)\\(#\\)"
          "\\(.\\|^\\)\\(%\\)"
@@ -672,7 +744,7 @@ Convert CHAR depending on STRING-BEFORE and STRING-AFTER."
        ;; this is part of a math formula
        ((and (string-match "\\S-+" string-before)
              (string-match "\\S-+" string-after))
-        (cond ((get-text-property 0 'org-protected char)
+        (cond ((eq 'org-link (get-text-property 0 'face char))
                (concat string-before "\\" char string-after))
               ((save-match-data (org-inside-LaTeX-fragment-p))
                (if subsup
@@ -681,14 +753,16 @@ Convert CHAR depending on STRING-BEFORE and STRING-AFTER."
                          ((string-match "[({]?\\([^)}]+\\)[)}]?" string-after)
                           (format "%s%s{%s}" string-before char 
                                   (match-string 1 string-after))))))
-              ((and subsup 
+              ((and subsup
                     (> (length string-after) 1)
                     (string-match "[({]?\\([^)}]+\\)[)}]?" string-after))
                (format "$%s%s{%s}$" string-before char
                        (match-string 1 string-after)))
-         (subsup (concat "$" string-before char string-after "$"))
-         (t (concat string-before char string-after))))
-       (t (concat string-before "\\" char string-after))))
+              (subsup (concat "$" string-before char string-after "$"))
+              (t (org-latex-protect
+                  (concat string-before "\\" char "{}" string-after)))))
+       (t (org-latex-protect
+           (concat string-before "\\" char "{}" string-after)))))
 
 (defun org-export-latex-treat-backslash-char (string-before string-after)
   "Convert the \"$\" special character to LaTeX.
@@ -699,7 +773,7 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER."
                 (or (cdar (member (list string-after) org-html-entities))
                     string-after) "$"))
        ((and (not (string-match "^[ \n\t]" string-after))
-             (not (string-match "[ \n\t]\\'" string-before)))
+             (not (string-match "[ \t]\\'\\|^" string-before)))
         ;; backslash is inside a word
         (concat string-before "$\\backslash$" string-after))
        ((not (or (equal string-after "")
@@ -713,6 +787,17 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER."
         (concat string-before "$\\backslash$" string-after))
        (t (concat string-before "$\\backslash$" string-after))))
 
+(defun org-export-latex-keywords (timestamps)
+  "Convert special keywords to LaTeX.
+Regexps are those from `org-latex-special-string-regexps'."
+  (let ((rg org-latex-special-string-regexps) r)
+    (while (setq r (pop rg))
+      (goto-char (point-min))
+      (while (re-search-forward (eval r) nil t)
+       (if (not timestamps)
+           (replace-match (format "\\\\texttt{%s}" (match-string 0)) t)
+         (replace-match ""))))))
+  
 (defun org-export-latex-fixed-width (opt)
   "When OPT is non-nil convert fixed-width sections to LaTeX."
   (goto-char (point-min))
@@ -731,12 +816,79 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER."
                                      (match-string 2)) t t)
               (forward-line))))))
 
+;; FIXME Use org-export-highlight-first-table-line ?
+(defun org-export-latex-lists ()
+  "Convert lists to LaTeX."
+  (goto-char (point-min))
+  (while (re-search-forward org-export-latex-list-beginning-re nil t)
+    (beginning-of-line)
+    (org-export-list-to-latex
+     (org-export-latex-parse-list t))))
+
+(defun org-export-list-to-generic (list params)
+  "Convert a LIST parsed through `org-export-latex-parse-list' to other formats.
+  
+Valid parameters are
+
+:ustart     String to start an unordered list
+:uend       String to end an unordered list
+
+:ostart     String to start an ordered list
+:oend       String to end an ordered list
+
+:splice     When set to t, return only list body lines, don't wrap
+            them into :[u/o]start and :[u/o]end.  Default is nil.
+
+:istart     String to start a list item
+:iend       String to end a list item
+:isep       String to separate items
+:lsep       String to separate sublists"
+  (interactive)
+  (let* ((p params) sublist
+        (splicep (plist-get p :splice))
+        (ostart  (plist-get p :ostart))
+        (oend  (plist-get p :oend))
+        (ustart  (plist-get p :ustart))
+        (uend  (plist-get p :uend))
+        (istart  (plist-get p :istart))
+        (iend  (plist-get p :iend))
+        (isep  (plist-get p :isep))
+        (lsep  (plist-get p :lsep)))
+    (let ((wrapper
+          (cond ((eq (car list) 'ordered)
+                 (concat ostart "\n%s" oend "\n"))
+                ((eq (car list) 'unordered)
+                 (concat ustart "\n%s" uend "\n"))))
+         rtn)
+      (while (setq sublist (pop list))
+       (cond ((symbolp sublist) nil)
+             ((stringp sublist)
+              (setq rtn (concat rtn istart sublist iend isep)))
+             (t 
+              (setq rtn (concat rtn   ;; previous list
+                                lsep  ;; list separator
+                                (org-export-list-to-generic sublist p)
+                                lsep  ;; list separator
+                                )))))
+      (format wrapper rtn))))
+
+(defun org-export-list-to-latex (list)
+  "Convert LIST into a LaTeX list."
+  (insert 
+   (org-export-list-to-generic
+    list '(:splicep nil :ostart "\\begin{enumerate}" :oend "\\end{enumerate}"
+                       :ustart "\\begin{itemize}" :uend "\\end{itemize}"
+                        :istart "\\item " :iend ""
+                       :isep "\n" :lsep "\n"))
+   ;; Add a trailing \n after list conversion
+   "\n"))
+
 (defun org-export-latex-tables (opt)
   "When OPT is non-nil convert tables to LaTeX."
   (goto-char (point-min))
   (while (re-search-forward "^\\([ \t]*\\)|" nil t)
     ;; Re-align the table to update org-table-last-alignment
-    (save-excursion (save-match-data (org-table-align)))
+    ;;     (save-excursion (save-match-data (org-table-align)))
     (let (tbl-list
          (beg (match-beginning 0))
          (end (save-excursion
@@ -744,73 +896,22 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER."
                  (concat "^" (regexp-quote (match-string 1))
                          "[^|]\\|\\'") nil t) (match-beginning 0))))
       (beginning-of-line)
-      (while (not (eq end (point)))
-       (if (looking-at "[ \t]*|\\([^-|].+\\)|[ \t]*$")
-           (push (split-string (org-trim (match-string 1)) "|") tbl-list)
-         (push 'hline tbl-list))
-       (forward-line))
-      ;; comment region out instead of deleting it ?
-      (apply 'delete-region (list beg end))
-      (when opt (insert (orgtbl-to-latex (nreverse tbl-list) 
-                                        nil) "\n\n")))))
-
-(defun org-export-latex-special-keywords ()
-  "Convert special keywords to LaTeX.
-Regexps are those from `org-latex-special-string-regexps'."
-  (let ((rg org-latex-special-string-regexps) r)
-    (while (setq r (pop rg))
-      (goto-char (point-min))
-      (while (re-search-forward (eval r) nil t)
-       (replace-match (format "\\\\texttt{%s}" (match-string 0)) t)))))
-
-;; FIXME - we need better implementation for nested lists
-(defun org-export-latex-list (srch0 srch1 srch2 rpl0 rpl1)
-  "Convert lists to LaTeX."
-  (goto-char (point-min))
-  (while (re-search-forward srch0 nil t)
-    (let* ((beg (match-beginning 0))
-          (prefix (regexp-quote (match-string 1)))
-          (end-string (when (re-search-forward srch1 nil t)
-                        (match-string 0))))
-      (goto-char beg) (insert rpl0)
-      (while (re-search-forward
-             (concat "^" prefix srch2)
-             (if (not end-string)
-                 (point-max)
-               (save-match-data
-                 (save-excursion
-                   (re-search-forward
-                    (regexp-quote end-string) nil t)))) t)
-       (replace-match 
-        (concat "\\item " 
-                (if (match-string 1) 
-                    (format "\\texttt{%s}" (match-string 1))))
-        t t))
-      (goto-char (if end-string
-                    (progn (re-search-forward
-                            (regexp-quote end-string) nil t)
-                           (match-beginning 0))
-                  (point-max)))
-      (skip-chars-backward "\n") (forward-line 2)
-      (insert rpl1))))
-
-(defun org-export-latex-itemize ()
-  "Convert item list to LaTeX."
-  (org-export-latex-list
-   "^\\([ \t]*\\)-"
-   "^[^ \n\t-]+.*$"
-   "- ?\\(\\[.+\\]\\)?"
-   "\\begin{itemize}\n"
-   "\\end{itemize}\n"))
-
-(defun org-export-latex-enumerate ()
-  "Convert numeric list to LaTeX."
-  (org-export-latex-list
-   "^\\([ \t]*\\)[0-9]+[\.)] \\(\\[.+\\]\\)? ?"
-   "^[^ \n\t0-9]+.*$"
-   "[0-9]+[\.)] ?\\(\\[.+\\]\\)?"
-   "\\begin{enumerate}\n"
-   "\\end{enumerate}\n"))
+      (if org-export-latex-tables-verbatim
+         (let* ((raw-table (buffer-substring beg end))
+                (tbl (concat "\\begin{verbatim}\n" raw-table 
+                             "\\end{verbatim}\n")))
+           (apply 'delete-region (list beg end))
+           (insert tbl))
+       (progn 
+         (while (not (eq end (point)))
+           (if (looking-at "[ \t]*|\\([^-|].+\\)|[ \t]*$")
+               (push (split-string (org-trim (match-string 1)) "|") tbl-list)
+             (push 'hline tbl-list))
+           (forward-line))
+         ;; comment region out instead of deleting it ?
+         (apply 'delete-region (list beg end))
+         (when opt (insert (orgtbl-to-latex (nreverse tbl-list) 
+                                            nil) "\n\n")))))))
 
 (defun org-export-latex-fontify ()
   "Convert fontification to LaTeX."
@@ -829,17 +930,6 @@ Regexps are those from `org-latex-special-string-regexps'."
               (match-string 5)) t t)
       (backward-char))))
 
-(defun org-export-latex-protect-char-in-string (char-list string)
-  "Add org-protected text-property to char from CHAR-LIST in STRING."
-  (with-temp-buffer
-    (save-match-data
-      (insert string)
-      (goto-char (point-min))
-      (while (re-search-forward (regexp-opt char-list) nil t)
-       (add-text-properties (match-beginning 0)
-                            (match-end 0) '(org-protected t)))
-      (buffer-string))))
-
 (defun org-export-latex-links ()
   ;; Make sure to use the LaTeX hyperref and graphicx package
   ;; or send some warnings.
@@ -887,251 +977,57 @@ Regexps are those from `org-latex-special-string-regexps'."
             (path (insert (format "\\href{%s}{%s}" path desc)))
             (t (insert "\\texttt{" desc "}")))))))
 
-
-(defun org-latex-cleaned-string-for-export (string &rest parameters)
-  "Cleanup a buffer STRING so that links can be created safely."
-  (interactive)
-  (let* ((re-radio (and org-target-link-regexp
-                       (concat "\\([^<]\\)\\(" org-target-link-regexp "\\)")))
-        (re-plain-link (concat "\\([^[<]\\)" org-plain-link-re))
-        (re-angle-link (concat "\\([^[]\\)" org-angle-link-re))
-        (re-archive (concat ":" org-archive-tag ":"))
-        (re-quote (concat "^\\*+[ \t]+" org-quote-string "\\>"))
-        (htmlp (plist-get parameters :for-html))
-        (latexp (plist-get parameters :for-LaTeX))
-        (commentsp (plist-get parameters :comments))
-        (inhibit-read-only t)
-        (outline-regexp "\\*+ ")
-        a b xx
-        rtn p)
-    (save-excursion
-      (set-buffer (get-buffer-create " org-mode-tmp"))
-      (erase-buffer)
-      (insert string)
-      ;; Remove license-to-kill stuff
-      (while (setq p (text-property-any (point-min) (point-max)
-                                       :org-license-to-kill t))
-       (delete-region p (next-single-property-change p :org-license-to-kill)))
-
-      (let ((org-inhibit-startup t)) (org-mode))
-      (untabify (point-min) (point-max))
-
-      ;; Get the correct stuff before the first headline
-      (when (plist-get parameters :skip-before-1st-heading)
-       (goto-char (point-min))
-       (when (re-search-forward "^\\*+[ \t]" nil t)
-         (delete-region (point-min) (match-beginning 0))
-         (goto-char (point-min))
-         (insert "\n")))
-      (when (plist-get parameters :add-text)
-       (goto-char (point-min))
-       (insert (plist-get parameters :add-text) "\n"))
-
-      ;; Get rid of archived trees
-      (when (not (eq org-export-with-archived-trees t))
-       (goto-char (point-min))
-       (while (re-search-forward re-archive nil t)
-         (if (not (org-on-heading-p t))
-             (org-end-of-subtree t)
-           (beginning-of-line 1)
-           (setq a (if org-export-with-archived-trees
-                       (1+ (point-at-eol)) (point))
-                 b (org-end-of-subtree t))
-           (if (> b a) (delete-region a b)))))
-
-      ;; Get rid of property drawers
-      (unless org-export-with-property-drawer
-       (goto-char (point-min))
-       (while (re-search-forward "^[ \t]*:PROPERTIES:[ \t]*\n\\([^@]*?\n\\)?[ \t]*:END:[ \t]*\n" nil t)
-         (replace-match "")))
-
-      ;; Find targets in comments and move them out of comments,
-      ;; but mark them as targets that should be invisible
-      (goto-char (point-min))
-      (while (re-search-forward "^#.*?\\(<<<?[^>\r\n]+>>>?\\).*" nil t)
-       (replace-match "\\1(INVISIBLE)"))
-
-      ;; Specific LaTeX cleaning
-      (when latexp
-       (require 'org-export-latex nil t)
-       (org-export-latex-cleaned-string))
-
-      ;; Protect stuff from HTML processing
-      (goto-char (point-min))
-      (let ((formatters `((,htmlp "HTML" "BEGIN_HTML" "END_HTML"))) fmt)
-       (while (re-search-forward "^[ \t]*:.*\\(\n[ \t]*:.*\\)*" nil t)
-         (add-text-properties (match-beginning 0) (match-end 0)
-                              '(org-protected t)))
-       (while formatters
-         (setq fmt (pop formatters))
-         (when (car fmt)
-           (goto-char (point-min))
-           (while (re-search-forward (concat "^#\\+" (cadr fmt) 
-                                             ":[ \t]*\\(.*\\)") nil t)
-             (replace-match "\\1" t)
-             (add-text-properties
-              (point-at-bol) (min (1+ (point-at-eol)) (point-max))
-              '(org-protected t))))
-         (goto-char (point-min))
-         (while (re-search-forward
-                 (concat "^#\\+" 
-                         (caddr fmt) "\\>.*\\(\\(\n.*\\)*?\n\\)#\\+"
-                         (cadddr fmt) "\\>.*\n?") nil t)
-           (if (car fmt)
-               (add-text-properties (match-beginning 1) (1+ (match-end 1))
-                                    '(org-protected t))
-             (delete-region (match-beginning 0) (match-end 0))))
-         (goto-char (point-min))
-         (while (re-search-forward re-quote nil t)
-           (goto-char (match-beginning 0))
-           (end-of-line 1)
-           (add-text-properties (point) (org-end-of-subtree t)
-                                '(org-protected t)))))
-
-      ;; Remove or replace comments
-      ;; If :comments is set, use this char for commenting out comments and
-      ;; protect them. otherwise delete them
-      (goto-char (point-min))
-      (while (re-search-forward "^#\\(.*\n?\\)" nil t)
-       (if commentsp
-           (progn (add-text-properties
-                   (match-beginning 0) (match-end 0) '(org-protected t))
-                  (replace-match (format commentsp (match-string 1)) t t))
-         (replace-match "")))
-
-      ;; Find matches for radio targets and turn them into internal links
-      (goto-char (point-min))
-      (when re-radio
-       (while (re-search-forward re-radio nil t)
-         (org-if-unprotected
-          (replace-match "\\1[[\\2]]"))))
-
-      ;; Find all links that contain a newline and put them into a single line
-      (goto-char (point-min))
-      (while (re-search-forward "\\(\\(\\[\\|\\]\\)\\[[^]]*?\\)[ \t]*\n[ \t]*\\([^]]*\\]\\(\\[\\|\\]\\)\\)" nil t)
-       (org-if-unprotected
-        (replace-match "\\1 \\3")
-        (goto-char (match-beginning 0))))
-
-      ;; Convert LaTeX fragments to images
-      (when (plist-get parameters :LaTeX-fragments)
-       (org-format-latex
-        (concat "ltxpng/" (file-name-sans-extension
-                           (file-name-nondirectory
-                            org-current-export-file)))
-        org-current-export-dir nil "Creating LaTeX image %s"))
-      (message "Exporting...")
-
-      ;; Normalize links: Convert angle and plain links into bracket links
-      ;; Expand link abbreviations
-      (goto-char (point-min))
-      (while (re-search-forward re-plain-link nil t)
-       (goto-char (1- (match-end 0)))
-       (org-if-unprotected
-        (let* ((s (concat (match-string 1) "[[" (match-string 2)
-                          ":" (match-string 3) "]]")))
-          ;; added 'org-protected property to links
-          (add-text-properties 0 (length s) '(org-protected t) s)
-          (replace-match s t t))))
-      (goto-char (point-min))
-      (while (re-search-forward re-angle-link nil t)
-       (goto-char (1- (match-end 0)))
-       (org-if-unprotected
-        (let* ((s (concat (match-string 1) "[[" (match-string 2)
-                          ":" (match-string 3) "]]")))
-          (add-text-properties 0 (length s) '(org-protected t) s)
-          (replace-match s t t))))
-      (goto-char (point-min))
-      (while (re-search-forward org-bracket-link-regexp nil t)
-       (org-if-unprotected
-        (let* ((s (concat "[[" (setq xx (save-match-data
-                                          (org-link-expand-abbrev (match-string 1))))
-                          "]"
-                          (if (match-end 3)
-                              (match-string 2)
-                            (concat "[" xx "]"))
-                          "]")))
-          (add-text-properties 0 (length s) '(org-protected t) s)
-          (replace-match s t t))))
-
-      ;; Find multiline emphasis and put them into single line
-      (when (plist-get  parameters :emph-multiline)
-       (goto-char (point-min))
-       (while (re-search-forward org-emph-re nil t)
-         (if (not (= (char-after (match-beginning 3))
-                     (char-after (match-beginning 4))))
-             (org-if-unprotected
-              (subst-char-in-region (match-beginning 0) (match-end 0)
-                                    ?\n ?\  t)
-              (goto-char (1- (match-end 0))))
-           (goto-char (1+ (match-beginning 0))))))
-
-      (setq rtn (buffer-string)))
-    (kill-buffer " org-mode-tmp")
-    rtn))
-
-(defsubst org-latex-protect (string)
-  (add-text-properties 0 (length string) '(org-protected t) string)
-  string)
-
-(defun org-export-latex-cleaned-string ()
+(defun org-export-latex-cleaned-string 
+  ;; FIXME remove commentsp call in org.el and here
+  (&optional commentsp)
   "Clean stuff in the LaTeX export."
 
-  ;; preserve line breaks
+  ;; align all tables
+  (goto-char (point-min))
+  (while (re-search-forward "^\\([ \t]*\\)|" nil t)
+    ;; Re-align the table to update org-table-last-alignment
+    (org-table-align))
+
+  ;; Preserve line breaks
   (goto-char (point-min))
   (while (re-search-forward "\\\\\\\\" nil t)
     (add-text-properties (match-beginning 0) (match-end 0)
                         '(org-protected t)))
 
-  ;; convert LaTeX to @LaTeX{}
+  ;; Convert LaTeX to \LaTeX{}
   (goto-char (point-min))
   (let ((case-fold-search nil) rpl)
     (while (re-search-forward "\\([^+_]\\)LaTeX" nil t)
     (replace-match (org-latex-protect 
                    (concat (match-string 1) "\\LaTeX{}")) t t)))
 
-  ;; convert horizontal rules
+  ;; Convert horizontal rules
   (goto-char (point-min))
   (while (re-search-forward "^----+.$" nil t)
     (replace-match (org-latex-protect "\\hrule") t t))
 
-  ;; Remove COMMENT subtrees
-  ;; What about QUOTE subtrees?
+  ;; Protect LaTeX \commands{...}
   (goto-char (point-min))
-  (while (re-search-forward 
-         (concat "^\\*+ \\(" org-comment-string "\\)") 
-         nil t)
-    (beginning-of-line)
-    (org-cut-subtree))
-  
-  ;; protect LaTeX \commands{...}
-  (goto-char (point-min))
-  (while (re-search-forward "\\\\[a-z]+{.+}" nil t)
+  (while (re-search-forward "\\\\[a-zA-Z]+\\(?:\\[.*\\]\\)?{.*}" nil t)
     (add-text-properties (match-beginning 0) (match-end 0)
                         '(org-protected t)))
-  
+
   ;; Replace radio links
   (goto-char (point-min))
-  (let ((search (concat "<<<?" org-latex-all-targets-regexp ">?>>")))
-    (while (re-search-forward search nil t)
-      (replace-match 
-       (org-latex-protect (format "\\label{%s}" (match-string 1))) t t)))
-  
-  ;; delete @<br /> cookies
+  (while (re-search-forward
+         (concat "<<<?" org-latex-all-targets-regexp 
+                 ">>>?\\((INVISIBLE)\\)?") nil t)
+    (replace-match
+     (org-latex-protect 
+      (format "\\label{%s}%s"(match-string 1)
+             (if (match-string 2) "" (match-string 1)))) t t))
+
+  ;; Delete @<...> constructs
   (goto-char (point-min))
-  (while (re-search-forward "@<[^<>\n]*>" nil t)
+  ;; Thanks to Daniel Clemente for this regexp
+  (while (re-search-forward "@<\\(?:[^\"\n]\\|\".*\"\\)*?>" nil t)
     (replace-match ""))
-  
-  ;; add #+BEGIN_LaTeX before any \begin{...}
-  (goto-char (point-min))
-  (while (re-search-forward "^ *\\\\begin{" nil t)
-    (replace-match "#+BEGIN_LaTeX:\n\\&" t))
-  
-  ;; add #+END_LaTeX after any \end{...}
-  (goto-char (point-min))
-  (while (re-search-forward "^ *\\\\end{.+}.*$" nil t)
-    (replace-match "\\&\n#+END_LaTeX" t))
-  
+
   ;; When converting to LaTeX, replace footnotes
   ;; FIXME: don't protect footnotes from conversion
   (when (plist-get org-latex-options-plist :footnotes)
@@ -1149,18 +1045,18 @@ Regexps are those from `org-latex-special-string-regexps'."
            (let ((end (save-excursion
                         (if (re-search-forward "^$\\|\\[[0-9]+\\]" nil t)
                             (match-beginning 0) (point-max)))))
-             (setq footnote (concat 
-                             (org-trim (buffer-substring (point) end)) 
-                             ;; FIXME stupid workaround for cases where 
-                             ;; `org-bracket-link-analytic-regexp' matches
-                             ;; }. as part of the link.
-                             " "))
+             (setq footnote
+                   (concat 
+                    (org-trim (buffer-substring (point) end)) 
+                    ;; FIXME stupid workaround for cases where
+                    ;; `org-bracket-link-analytic-regexp' matches
+                    ;; }. as part of the link.
+                    " "))
              (delete-region (point) end)))
          (goto-char foot-beg)
          (delete-region foot-beg foot-end)
          (setq footnote-rpl (format "\\footnote{%s}" footnote))
-         (add-text-properties 0 1 '(org-protected t) footnote-rpl)
-         (add-text-properties 9 10 '(org-protected t) footnote-rpl)
+         (add-text-properties 0 10 '(org-protected t) footnote-rpl)
          (add-text-properties (1- (length footnote-rpl))
                               (length footnote-rpl)
                               '(org-protected t) footnote-rpl)
@@ -1170,41 +1066,7 @@ Regexps are those from `org-latex-special-string-regexps'."
     (goto-char (point-min))
     (while (re-search-forward 
            (concat "^" footnote-section-tag-regexp) nil t)
-      (replace-match "")))
-  
-  ;; Protect stuff from LaTeX processing. 
-  ;; We will get rid on this once org.el integrate org-export-latex.el
-  ;; FIXME: #+LaTeX should be aware of the preceeding indentation in lists
-  (goto-char (point-min))
-  (let ((formatters `((,latexp "LaTeX" "BEGIN_LaTeX" "END_LaTeX"))) fmt)
-    (while (re-search-forward "^[ \t]*:.*\\(\n[ \t]*:.*\\)*" nil t)
-      (add-text-properties (match-beginning 0) (match-end 0)
-                          '(org-protected t)))
-    (while formatters
-      (setq fmt (pop formatters))
-      (when (car fmt)
-       (goto-char (point-min))
-       (while (re-search-forward (concat "^#\\+" (cadr fmt) 
-                                         ":[ \t]*\\(.*\\)") nil t)
-         (replace-match "\\1" t)
-         (add-text-properties
-          (point-at-bol) (min (1+ (point-at-eol)) (point-max))
-          '(org-protected t))))
-      (goto-char (point-min))
-      (while (re-search-forward
-             (concat "^#\\+" 
-                     (caddr fmt) "\\>.*\\(\\(\n.*\\)*?\n\\)#\\+"
-                     (cadddr fmt) "\\>.*\n?") nil t)
-       (if (car fmt)
-           (add-text-properties (match-beginning 1) (1+ (match-end 1))
-                                '(org-protected t))
-         (delete-region (match-beginning 0) (match-end 0))))
-      (goto-char (point-min))
-      (while (re-search-forward re-quote nil t)
-       (goto-char (match-beginning 0))
-       (end-of-line 1)
-       (add-text-properties (point) (org-end-of-subtree t)
-                            '(org-protected t))))))
+      (replace-match ""))))
 
 (provide 'org-export-latex)
 
index 2404fe54e53eceb66d5e6bcea59e5363665082c9..a72b477d0b2e34d020effdf9eaf50c20dda80166 100644 (file)
@@ -8,7 +8,7 @@
 
 ;; This file 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 2, or (at your option)
+;; the Free Software Foundation; either version 3, or (at your option)
 ;; any later version.
 
 ;; This file is distributed in the hope that it will be useful,
index 629a847d8ebf69e17d04bf8412c73a46f0a2d8a8..f4746b48f6bc759fa82409d98b22aece613968da 100644 (file)
@@ -2,16 +2,16 @@
 ;; Carstens outline-mode for keeping track of everything.
 ;; Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
 ;;
-;; Author: Carsten Dominik <dominik at science dot uva dot nl>
+;; Author: Carsten Dominik <carsten at orgmode dot org>
 ;; Keywords: outlines, hypermedia, calendar, wp
-;; Homepage: http://www.astro.uva.nl/~dominik/Tools/org/
-;; Version: 5.05
+;; Homepage: http://orgmode.org
+;; Version: 5.08
 ;;
 ;; 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 2, or (at your option)
+;; the Free Software Foundation; either version 3, or (at your option)
 ;; any later version.
 
 ;; GNU Emacs is distributed in the hope that it will be useful,
@@ -49,7 +49,7 @@
 ;; ---------------------------
 ;; See the corresponding sections in the manual at
 ;;
-;;   http://staff.science.uva.nl/~dominik/Tools/org/org.html#Installation
+;;   http://orgmode.org/org.html#Installation
 ;;
 ;; Documentation
 ;; -------------
@@ -60,7 +60,7 @@
 ;; in the etc/ directory of Emacs 22.
 ;;
 ;; A list of recent changes can be found at
-;; http://www.astro.uva.nl/~dominik/Tools/org/Changes
+;; http://orgmode.org/Changes.html
 ;;
 ;;; Code:
 
@@ -83,7 +83,7 @@
 
 ;;; Version
 
-(defconst org-version "5.05"
+(defconst org-version "5.09"
   "The version number of the file org.el.")
 (defun org-version ()
   (interactive)
        (save-match-data
          (while (string-match "\\[:alnum:\\]" ss)
            (setq ss (replace-match "a-zA-Z0-9" t t ss)))
+         (while (string-match "\\[:alpha:\\]" ss)
+           (setq ss (replace-match "a-zA-Z" t t ss)))
          ss))
     s))
 
@@ -236,11 +238,13 @@ Or return the original if not disputed."
 (defcustom org-ellipsis nil
   "The ellipsis to use in the Org-mode outline.
 When nil, just use the standard three dots.  When a string, use that instead,
-and just in Org-mode (which will then use its own display table).
+When a face, use the standart 3 dots, but with the specified face.
+The change affects only Org-mode (which will then use its own display table).
 Changing this requires executing `M-x org-mode' in a buffer to become
 effective."
   :group 'org-startup
   :type '(choice (const :tag "Default" nil)
+                (face :tag "Face" :value org-warning)
                 (string :tag "String" :value "...#")))
 
 (defvar org-display-table nil
@@ -274,11 +278,6 @@ Changes become only effective after restarting Emacs."
   :group 'org-keywords
   :type 'string)
 
-(defcustom org-archived-string "ARCHIVED:"
-  "String used as the prefix for timestamps logging archiving a TODO entry."
-  :group 'org-keywords
-  :type 'string)
-
 (defcustom org-clock-string "CLOCK:"
   "String used as prefix for timestamps clocking work hours on an item."
   :group 'org-keywords
@@ -428,7 +427,7 @@ the property API."
   :group 'org-structure
   :type '(repeat (string :tag "Drawer Name")))
 
-(defcustom org-cycle-global-at-bob t
+(defcustom org-cycle-global-at-bob nil
   "Cycle globally if cursor is at beginning of buffer and not at a headline.
 This makes it possible to do global cycling without having to use S-TAB or
 C-u TAB.  For this special case to work, the first line of the buffer
@@ -489,19 +488,24 @@ the values `folded', `children', or `subtree'."
   :tag "Org Edit Structure"
   :group 'org-structure)
 
-
 (defcustom org-special-ctrl-a/e nil
   "Non-nil means `C-a' and `C-e' behave specially in headlines and items.
-When set, `C-a' will bring back the cursor to the beginning of the
+When t, `C-a' will bring back the cursor to the beginning of the
 headline text, i.e. after the stars and after a possible TODO keyword.
 In an item, this will be the position after the bullet.
 When the cursor is already at that position, another `C-a' will bring
 it to the beginning of the line.
 `C-e' will jump to the end of the headline, ignoring the presence of tags
 in the headline.  A second `C-e' will then jump to the true end of the
-line, after any tags."
+line, after any tags.
+When set to the symbol `reversed', the first `C-a' or `C-e' works normally,
+and only a directly following, identical keypress will bring the cursor
+to the special positions."
   :group 'org-edit-structure
-  :type 'boolean)
+  :type '(choice
+         (const :tag "off" nil)
+         (const :tag "after bullet first" t)
+         (const :tag "border first" reversed)))
 
 (if (fboundp 'defvaralias)
     (defvaralias 'org-special-ctrl-a 'org-special-ctrl-a/e))
@@ -714,6 +718,32 @@ use the first keyword in its list that means done."
   :group 'org-archive
   :type 'boolean)
 
+(defcustom org-archive-save-context-info '(time file category todo itags)
+  "Parts of context info that should be stored as properties when archiving.
+When a subtree is moved to an archive file, it looses information given by
+context, like inherited tags, the category, and possibly also the TODO
+state (depending on the variable `org-archive-mark-done').
+This variable can be a list of any of the following symbols:
+
+time       The time of archiving.
+file       The file where the entry originates.
+itags      The local tags, in the headline of the subtree.
+ltags      The tags the subtree inherits from further up the hierarchy.
+todo       The pre-archive TODO state.
+category   The category, taken from file name or #+CATEGORY lines.
+
+For each symbol present in the list, a property will be created in
+the archived entry, with a prefix \"PRE_ARCHIVE_\", to remember this
+information."
+  :group 'org-archive
+  :type '(set
+         (const :tag "File" file)
+         (const :tag "Category" category)
+         (const :tag "TODO state" todo)
+         (const :tag "TODO state" priority)
+         (const :tag "Inherited tags" itags)
+         (const :tag "Local tags" ltags)))
+
 (defgroup org-table nil
   "Options concerning tables in Org-mode."
   :tag "Org Table"
@@ -1342,7 +1372,7 @@ You can set this on a per-template basis with the variable
          (const :tag "Default from remember-data-file" nil)
          file))
 
-(defcustom org-remember-store-without-prompt nil
+(defcustom org-remember-store-without-prompt t
   "Non-nil means, `C-c C-c' stores remember note without further promts.
 In this case, you need `C-u C-c C-c' to get the prompts for
 note file and headline.
@@ -1490,8 +1520,14 @@ taken from the (otherwise obsolete) variable `org-todo-interpretation'."
 (make-variable-buffer-local 'org-todo-heads)
 (defvar org-todo-sets nil)
 (make-variable-buffer-local 'org-todo-sets)
+(defvar org-todo-log-states nil)
+(make-variable-buffer-local 'org-todo-log-states)
 (defvar org-todo-kwd-alist nil)
 (make-variable-buffer-local 'org-todo-kwd-alist)
+(defvar org-todo-key-alist nil)
+(make-variable-buffer-local 'org-todo-key-alist)
+(defvar org-todo-key-trigger nil)
+(make-variable-buffer-local 'org-todo-key-trigger)
 
 (defcustom org-todo-interpretation 'sequence
   "Controls how TODO keywords are interpreted.
@@ -1504,6 +1540,30 @@ more information."
   :type '(choice (const sequence)
                 (const type)))
 
+(defcustom org-use-fast-todo-selection 'prefix
+  "Non-nil means, use the fast todo selection scheme with C-c C-t.
+This variable describes if and under what circumstances the cycling
+mechanism for TODO keywords will be replaced by a single-key, direct
+selection scheme.
+
+When nil, fast selection is never used.
+
+When the symbol `prefix', it will be used when `org-todo' is called with
+a prefix argument,  i.e. `C-u C-c C-t' in an Org-mode buffer, and `C-u t'
+in an agenda buffer.
+
+When t, fast selection is used by default.  In this case, the prefix
+argument forces cycling instead.
+
+In all cases, the special interface is only used if access keys have actually
+been assigned by the user, i.e. if keywords in the configuration are followed
+by a letter in parenthesis, like TODO(t)."
+  :group 'org-todo
+  :type '(choice
+         (const :tag "Never" nil)
+         (const :tag "By default" t)
+         (const :tag "Only with C-u C-c C-t" prefix)))
+
 (defcustom org-after-todo-state-change-hook nil
   "Hook which is run after the state of a TODO item was changed.
 The new state (a string with a TODO keyword, or nil) is available in the
@@ -1513,8 +1573,8 @@ Lisp variable `state'."
 
 (defcustom org-log-done nil
   "When set, insert a (non-active) time stamp when TODO entry is marked DONE.
-When the state of an entry is changed from nothing to TODO, remove a previous
-closing date.
+When the state of an entry is changed from nothing or a DONE state to
+a not-done TODO state, remove a previous closing date.
 
 This can also be a list of symbols indicating under which conditions
 the time stamp recording the action should be annotated with a short note.
@@ -1683,9 +1743,11 @@ end of the second format."
        (concat "[" (substring f 1 -1) "]")
       f)))
 
-(defcustom org-deadline-warning-days 30
+(defcustom org-deadline-warning-days 14
   "No. of days before expiration during which a deadline becomes active.
-This variable governs the display in sparse trees and in the agenda."
+This variable governs the display in sparse trees and in the agenda.
+When negative, it means use this number (the absolute value of it)
+even if a deadline has a different individual lead time specified."
   :group 'org-time
   :type 'number)
 
@@ -1697,6 +1759,12 @@ When nil, only the minibuffer will be available."
   :group 'org-time
   :type 'boolean)
 
+(defcustom org-edit-timestamp-down-means-later nil
+  "Non-nil means, S-down will increase the time in a time stamp.
+When nil, S-up will increase."
+  :group 'org-time
+  :type 'boolean)
+
 (defcustom org-calendar-follow-timestamp-change t
   "Non-nil means, make the calendar window follow timestamp changes.
 When a timestamp is modified and the calendar window is visible, it will be
@@ -1713,9 +1781,10 @@ moved to the new date."
   "List of tags allowed in Org-mode files.
 When this list is nil, Org-mode will base TAG input on what is already in the
 buffer.
-The value of this variable is an alist, the car may be (and should) be a
-character that is used to select that tag through the fast-tag-selection
-interface.  See the manual for details."
+The value of this variable is an alist, the car of each entry must be a
+keyword as a string, the cdr may be a character that is used to select
+that tag through the fast-tag-selection interface.
+See the manual for details."
   :group 'org-tags
   :type '(repeat
          (choice
@@ -1751,6 +1820,10 @@ displaying the tags menu is not even shown, until you press C-c again."
          (const :tag "Yes" t)
          (const :tag "Expert" expert)))
 
+(defvar org-fast-tag-selection-include-todo nil
+  "Non-nil means, fast tags selection interface will also offer TODO states.
+This is an undocumented feature, you should not rely on it.")
+
 (defcustom org-tags-column 48
   "The column to which tags should be indented in a headline.
 If this number is positive, it specifies the column.  If it is negative,
@@ -1794,6 +1867,8 @@ make sure all corresponding TODO items find their way into the list."
   "History of minibuffer reads for tags.")
 (defvar org-last-tags-completion-table nil
   "The last used completion table for tags.")
+(defvar org-after-tags-change-hook nil
+  "Hook that is run after the tags in a line have changed.")
 
 (defgroup org-properties nil
   "Options concerning properties in Org-mode."
@@ -1863,6 +1938,11 @@ agenda file per line."
          (repeat :tag "List of files" file)
          (file :tag "Store list in a file\n" :value "~/.agenda_files")))
 
+(defcustom org-agenda-skip-unavailable-files nil
+  "t means to just skip non-reachable files in `org-agenda-files'.
+Nil means to remove them, after a query, from the list."
+  :group 'org-agenda
+  :type 'boolean)
 
 (defcustom org-agenda-confirm-kill 1
   "When set, remote killing from the agenda buffer needs confirmation.
@@ -2111,15 +2191,19 @@ The idea behind this is that such items will appear in the agenda anyway."
 
 (defcustom org-agenda-skip-scheduled-if-done nil
   "Non-nil means don't show scheduled items in agenda when they are done.
-This is relevant for the daily/weekly agenda, not for the TODO list."
+This is relevant for the daily/weekly agenda, not for the TODO list.  And
+it applied only to the actualy date of the scheduling.  Warnings about
+an item with a past scheduling dates are always turned off when the item
+is DONE."
   :group 'org-agenda-skip
   :type 'boolean)
 
 (defcustom org-agenda-skip-deadline-if-done nil
   "Non-nil means don't show deadines when the corresponding item is done.
 When nil, the deadline is still shown and should give you a happy feeling.
-
-This is relevant for the daily/weekly agenda."
+This is relevant for the daily/weekly agenda.  And it applied only to the
+actualy date of the deadline.  Warnings about approching and past-due
+deadlines are always turned off when the item is DONE."
   :group 'org-agenda-skip
   :type 'boolean)
 
@@ -2232,13 +2316,25 @@ When nil, only the days which actually have entries are shown."
   :group 'org-agenda-daily/weekly
   :type 'boolean)
 
-(defcustom org-agenda-date-format "%A %d %B %Y"
+(defcustom org-agenda-format-date 'org-agenda-format-date-aligned
   "Format string for displaying dates in the agenda.
 Used by the daily/weekly agenda and by the timeline.  This should be
-a format string understood by `format-time-string'.
-FIXME: Not used currently, because of timezone problem."
+a format string understood by `format-time-string', or a function returning
+the formatted date as a string.  The function must take a single argument,
+a calendar-style date list like (month day year)."
   :group 'org-agenda-daily/weekly
-  :type 'string)
+  :type '(choice
+         (string :tag "Format string")
+         (function :tag "Function")))
+
+(defun org-agenda-format-date-aligned (date)
+  "Format a date string for display in the daily/weekly agenda, or timeline.
+This function makes sure that dates are aligned for easy reading."
+  (format "%-9s %2d %s %4d"
+         (calendar-day-name date)
+         (extract-calendar-day date)
+         (calendar-month-name (extract-calendar-month date))
+         (extract-calendar-year date)))
 
 (defcustom org-agenda-include-diary nil
   "If non-nil, include in the agenda entries from the Emacs Calendar's diary."
@@ -2544,16 +2640,17 @@ This is a property list with the following properties:
 This path may be relative to the directory where the Org-mode file lives.
 The default is to put them into the same directory as the Org-mode file.
 The variable may also be an alist with export types `:html', `:ascii',
-`:ical', or `:xoxo' and the corresponding directories.  If a directory path
-is relative, it is interpreted relative to the directory where the exported
-Org-mode files lives."
+`:ical', `:LaTeX', or `:xoxo' and the corresponding directories.
+If a directory path is relative, it is interpreted relative to the
+directory where the exported Org-mode files lives."
   :group 'org-export-general
   :type '(choice
          (directory)
          (repeat
           (cons
            (choice :tag "Type"
-                   (const :html) (const :ascii) (const :ical) (const :xoxo))
+                   (const :html) (const :LaTeX) 
+                   (const :ascii) (const :ical) (const :xoxo))
            (directory)))))
 
 (defcustom org-export-language-setup
@@ -2561,8 +2658,8 @@ Org-mode files lives."
     ("cs"  "Autor"           "Datum" "Obsah")
     ("da"  "Ophavsmand"      "Dato"  "Indhold")
     ("de"  "Autor"           "Datum" "Inhaltsverzeichnis")
-    ("es"  "Autor"           "Fecha" "\xccndice")
-    ("fr"  "Auteur"          "Date"  "Table des Mati\xe8res")
+    ("es"  "Autor"           "Fecha" "\xcdndice")
+    ("fr"  "Auteur"          "Date"  "Table des mati\xe8res")
     ("it"  "Autore"          "Data"  "Indice")
     ("nl"  "Auteur"          "Datum" "Inhoudsopgave")
     ("nn"  "Forfattar"       "Dato"  "Innhold")  ;; nn = Norsk (nynorsk)
@@ -3157,7 +3254,7 @@ Use customize to modify this, or restart Emacs after changing it."
   '(("*" bold "<b>" "</b>")
     ("/" italic "<i>" "</i>")
     ("_" underline "<u>" "</u>")
-    ("=" shadow "<code>" "</code>")
+    ("=" org-code "<code>" "</code>")
     ("+" (:strike-through t) "<del>" "</del>")
     )
 "Special syntax for emphasized text.
@@ -3186,26 +3283,36 @@ Use customize to modify this, or restart Emacs after changing it."
 
 ;; FIXME: convert that into a macro?  Not critical, because this
 ;;        is only executed a few times at load time.
-(defun org-compatible-face (specs)
+(defun org-compatible-face (inherits specs)
   "Make a compatible face specification.
+If INHERITS is an existing face and if the Emacs version supports it,
+just inherit the face.  If not, use SPECS to define the face.
 XEmacs and Emacs 21 do not know about the `min-colors' attribute.
 For them we convert a (min-colors 8) entry to a `tty' entry and move it
 to the top of the list.  The `min-colors' attribute will be removed from
 any other entries, and any resulting duplicates will be removed entirely."
-  (if (or (featurep 'xemacs) (< emacs-major-version 22))
-      (let (r e a)
-       (while (setq e (pop specs))
-         (cond
-          ((memq (car e) '(t default)) (push e r))
-          ((setq a (member '(min-colors 8) (car e)))
-           (nconc r (list (cons (cons '(type tty) (delq (car a) (car e)))
-                                (cdr e)))))
-          ((setq a (assq 'min-colors (car e)))
-           (setq e (cons (delq a (car e)) (cdr e)))
-           (or (assoc (car e) r) (push e r)))
-          (t (or (assoc (car e) r) (push e r)))))
-       (nreverse r))
-    specs))
+  (cond
+   ((and inherits (facep inherits)
+        (not (featurep 'xemacs)) (> emacs-major-version 22))
+    ;; In Emacs 23, we use inheritance where possible.
+    ;; We only do this in Emacs 23, because only there the outline
+    ;; faces have been changed to the original org-mode-level-faces.
+    (list (list t :inherit inherits)))
+   ((or (featurep 'xemacs) (< emacs-major-version 22))
+    ;; These do not understand the `min-colors' attribute.
+    (let (r e a)
+      (while (setq e (pop specs))
+       (cond
+        ((memq (car e) '(t default)) (push e r))
+        ((setq a (member '(min-colors 8) (car e)))
+         (nconc r (list (cons (cons '(type tty) (delq (car a) (car e)))
+                              (cdr e)))))
+        ((setq a (assq 'min-colors (car e)))
+         (setq e (cons (delq a (car e)) (cdr e)))
+         (or (assoc (car e) r) (push e r)))
+        (t (or (assoc (car e) r) (push e r)))))
+      (nreverse r)))
+   (t specs)))
 
 (defface org-hide
   '((((background light)) (:foreground "white"))
@@ -3217,6 +3324,7 @@ color of the frame."
 
 (defface org-level-1 ;; font-lock-function-name-face
   (org-compatible-face
+   'outline-1
    '((((class color) (min-colors 88) (background light)) (:foreground "Blue1"))
      (((class color) (min-colors 88) (background dark)) (:foreground "LightSkyBlue"))
      (((class color) (min-colors 16) (background light)) (:foreground "Blue"))
@@ -3228,6 +3336,7 @@ color of the frame."
 
 (defface org-level-2 ;; font-lock-variable-name-face
   (org-compatible-face
+   'outline-2
    '((((class color) (min-colors 16) (background light)) (:foreground "DarkGoldenrod"))
      (((class color) (min-colors 16) (background dark))  (:foreground "LightGoldenrod"))
      (((class color) (min-colors 8)  (background light)) (:foreground "yellow"))
@@ -3238,6 +3347,7 @@ color of the frame."
 
 (defface org-level-3 ;; font-lock-keyword-face
   (org-compatible-face
+   'outline-3
    '((((class color) (min-colors 88) (background light)) (:foreground "Purple"))
      (((class color) (min-colors 88) (background dark))  (:foreground "Cyan1"))
      (((class color) (min-colors 16) (background light)) (:foreground "Purple"))
@@ -3250,6 +3360,7 @@ color of the frame."
 
 (defface org-level-4   ;; font-lock-comment-face
   (org-compatible-face
+   'outline-4
    '((((class color) (min-colors 88) (background light)) (:foreground "Firebrick"))
      (((class color) (min-colors 88) (background dark))  (:foreground "chocolate1"))
      (((class color) (min-colors 16) (background light)) (:foreground "red"))
@@ -3262,6 +3373,7 @@ color of the frame."
 
 (defface org-level-5 ;; font-lock-type-face
   (org-compatible-face
+   'outline-5
    '((((class color) (min-colors 16) (background light)) (:foreground "ForestGreen"))
      (((class color) (min-colors 16) (background dark)) (:foreground "PaleGreen"))
      (((class color) (min-colors 8)) (:foreground "green"))))
@@ -3270,6 +3382,7 @@ color of the frame."
 
 (defface org-level-6 ;; font-lock-constant-face
   (org-compatible-face
+   'outline-6
    '((((class color) (min-colors 16) (background light)) (:foreground "CadetBlue"))
      (((class color) (min-colors 16) (background dark)) (:foreground "Aquamarine"))
      (((class color) (min-colors 8)) (:foreground "magenta"))))
@@ -3278,6 +3391,7 @@ color of the frame."
 
 (defface org-level-7 ;; font-lock-builtin-face
   (org-compatible-face
+   'outline-7
    '((((class color) (min-colors 16) (background light)) (:foreground "Orchid"))
      (((class color) (min-colors 16) (background dark)) (:foreground "LightSteelBlue"))
      (((class color) (min-colors 8)) (:foreground "blue"))))
@@ -3286,6 +3400,7 @@ color of the frame."
 
 (defface org-level-8 ;; font-lock-string-face
   (org-compatible-face
+   'outline-8
    '((((class color) (min-colors 16) (background light)) (:foreground "RosyBrown"))
      (((class color) (min-colors 16) (background dark)) (:foreground "LightSalmon"))
      (((class color) (min-colors 8)) (:foreground "green"))))
@@ -3294,6 +3409,7 @@ color of the frame."
 
 (defface org-special-keyword ;; font-lock-string-face
   (org-compatible-face
+   nil
    '((((class color) (min-colors 16) (background light)) (:foreground "RosyBrown"))
      (((class color) (min-colors 16) (background dark)) (:foreground "LightSalmon"))
      (t (:italic t))))
@@ -3302,6 +3418,7 @@ color of the frame."
 
 (defface org-drawer ;; font-lock-function-name-face
   (org-compatible-face
+   nil
    '((((class color) (min-colors 88) (background light)) (:foreground "Blue1"))
      (((class color) (min-colors 88) (background dark)) (:foreground "LightSkyBlue"))
      (((class color) (min-colors 16) (background light)) (:foreground "Blue"))
@@ -3317,6 +3434,7 @@ color of the frame."
 
 (defface org-column
   (org-compatible-face
+   nil
    '((((class color) (min-colors 16) (background light))
       (:background "grey90"))
      (((class color) (min-colors 16) (background dark))
@@ -3333,8 +3451,9 @@ color of the frame."
                      :height (face-attribute 'default :height)
                      :family (face-attribute 'default :family)))  
 
-(defface org-warning ;; font-lock-warning-face
+(defface org-warning
   (org-compatible-face
+   'font-lock-warning-face
    '((((class color) (min-colors 16) (background light)) (:foreground "Red1" :bold t))
      (((class color) (min-colors 16) (background dark))  (:foreground "Pink" :bold t))
      (((class color) (min-colors 8)  (background light)) (:foreground "red"  :bold t))
@@ -3345,6 +3464,7 @@ color of the frame."
 
 (defface org-archived    ; similar to shadow
   (org-compatible-face
+   'shadow
    '((((class color grayscale) (min-colors 88) (background light))
       (:foreground "grey50"))
      (((class color grayscale) (min-colors 88) (background dark))
@@ -3389,8 +3509,9 @@ color of the frame."
   "Face for tags."
   :group 'org-faces)
 
-(defface org-todo ;; font-lock-warning-face
+(defface org-todo ; font-lock-warning-face
   (org-compatible-face
+   nil
    '((((class color) (min-colors 16) (background light)) (:foreground "Red1" :bold t))
      (((class color) (min-colors 16) (background dark))  (:foreground "Pink" :bold t))
      (((class color) (min-colors 8)  (background light)) (:foreground "red"  :bold t))
@@ -3401,6 +3522,7 @@ color of the frame."
 
 (defface org-done ;; font-lock-type-face
   (org-compatible-face
+   nil
    '((((class color) (min-colors 16) (background light)) (:foreground "ForestGreen" :bold t))
      (((class color) (min-colors 16) (background dark)) (:foreground "PaleGreen" :bold t))
      (((class color) (min-colors 8)) (:foreground "green"))
@@ -3410,6 +3532,7 @@ color of the frame."
 
 (defface org-headline-done ;; font-lock-string-face
   (org-compatible-face
+   nil
    '((((class color) (min-colors 16) (background light)) (:foreground "RosyBrown"))
      (((class color) (min-colors 16) (background dark)) (:foreground "LightSalmon"))
      (((class color) (min-colors 8)  (background light)) (:bold nil))))
@@ -3418,8 +3541,21 @@ This face is only used if `org-fontify-done-headline' is set.  If applies
 to the part of the headline after the DONE keyword."
   :group 'org-faces)
 
+(defcustom org-todo-keyword-faces nil
+  "Faces for specific TODO keywords.
+This is a list of cons cells, with TODO keywords in the car
+and faces in the cdr.  The face can be a symbol, or a property
+list of attributes, like (:foreground \"blue\" :weight bold :underline t)."
+  :group 'org-faces
+  :group 'org-todo
+  :type '(repeat
+         (cons
+          (string :tag "keyword")
+          (sexp :tag "face"))))
+
 (defface org-table ;; font-lock-function-name-face
   (org-compatible-face
+   nil
    '((((class color) (min-colors 88) (background light)) (:foreground "Blue1"))
      (((class color) (min-colors 88) (background dark)) (:foreground "LightSkyBlue"))
      (((class color) (min-colors 16) (background light)) (:foreground "Blue"))
@@ -3431,6 +3567,7 @@ to the part of the headline after the DONE keyword."
 
 (defface org-formula
   (org-compatible-face
+   nil
    '((((class color) (min-colors 88) (background light)) (:foreground "Firebrick"))
      (((class color) (min-colors 88) (background dark)) (:foreground "chocolate1"))
      (((class color) (min-colors 8)  (background light)) (:foreground "red"))
@@ -3439,8 +3576,24 @@ to the part of the headline after the DONE keyword."
   "Face for formulas."
   :group 'org-faces)
 
+(defface org-code
+  (org-compatible-face
+   nil
+   '((((class color grayscale) (min-colors 88) (background light))
+      (:foreground "grey50"))
+     (((class color grayscale) (min-colors 88) (background dark))
+      (:foreground "grey70"))
+     (((class color) (min-colors 8) (background light))
+      (:foreground "green"))
+     (((class color) (min-colors 8) (background dark))
+      (:foreground "yellow"))))
+   "Face for fixed-with text like code snippets."
+   :group 'org-faces
+   :version "22.1")
+
 (defface org-agenda-structure ;; font-lock-function-name-face
   (org-compatible-face
+   nil
    '((((class color) (min-colors 88) (background light)) (:foreground "Blue1"))
      (((class color) (min-colors 88) (background dark)) (:foreground "LightSkyBlue"))
      (((class color) (min-colors 16) (background light)) (:foreground "Blue"))
@@ -3452,6 +3605,7 @@ to the part of the headline after the DONE keyword."
 
 (defface org-scheduled-today
   (org-compatible-face
+   nil
    '((((class color) (min-colors 88) (background light)) (:foreground "DarkGreen"))
      (((class color) (min-colors 88) (background dark)) (:foreground "PaleGreen"))
      (((class color) (min-colors 8)) (:foreground "green"))
@@ -3461,6 +3615,7 @@ to the part of the headline after the DONE keyword."
 
 (defface org-scheduled-previously
   (org-compatible-face
+   nil
    '((((class color) (min-colors 88) (background light)) (:foreground "Firebrick"))
      (((class color) (min-colors 88) (background dark)) (:foreground "chocolate1"))
      (((class color) (min-colors 8)  (background light)) (:foreground "red"))
@@ -3471,6 +3626,7 @@ to the part of the headline after the DONE keyword."
 
 (defface org-upcoming-deadline
   (org-compatible-face
+   nil
    '((((class color) (min-colors 88) (background light)) (:foreground "Firebrick"))
      (((class color) (min-colors 88) (background dark)) (:foreground "chocolate1"))
      (((class color) (min-colors 8)  (background light)) (:foreground "red"))
@@ -3506,6 +3662,7 @@ month and 365.24 days for a year)."
 
 (defface org-time-grid ;; font-lock-variable-name-face
   (org-compatible-face
+   nil
    '((((class color) (min-colors 16) (background light)) (:foreground "DarkGoldenrod"))
      (((class color) (min-colors 16) (background dark)) (:foreground "LightGoldenrod"))
      (((class color) (min-colors 8)) (:foreground "yellow" :weight light))))
@@ -3664,17 +3821,21 @@ means to push this value onto the list in the variable.")
   "Precompute regular expressions for current buffer."
   (when (org-mode-p)
     (org-set-local 'org-todo-kwd-alist nil)
+    (org-set-local 'org-todo-key-alist nil)
+    (org-set-local 'org-todo-key-trigger nil)
     (org-set-local 'org-todo-keywords-1 nil)
     (org-set-local 'org-done-keywords nil)
     (org-set-local 'org-todo-heads nil)
     (org-set-local 'org-todo-sets nil)
+    (org-set-local 'org-todo-log-states nil)
     (let ((re (org-make-options-regexp
-              '("CATEGORY" "SEQ_TODO" "PRI_TODO" "TYP_TODO" "COLUMNS"
+              '("CATEGORY" "SEQ_TODO" "TYP_TODO" "TODO" "COLUMNS"
                 "STARTUP" "ARCHIVE" "TAGS" "LINK" "PRIORITIES"
                 "CONSTANTS" "PROPERTY")))
          (splitre "[ \t]+")
-         kwds key value cat arch tags const links hw dws tail sep kws1 prio
-         props)
+         kwds kws0 kwsa key value cat arch tags const links hw dws
+         tail sep kws1 prio props
+         ex log note)
       (save-excursion
        (save-restriction
          (widen)
@@ -3686,7 +3847,7 @@ means to push this value onto the list in the variable.")
              (if (string-match "[ \t]+$" value)
                  (setq value (replace-match "" t t value)))
              (setq cat (intern value)))
-            ((equal key "SEQ_TODO")
+            ((member key '("SEQ_TODO" "TODO"))
              (push (cons 'sequence (org-split-string value splitre)) kwds))
             ((equal key "TYP_TODO")
              (push (cons 'type (org-split-string value splitre)) kwds))
@@ -3744,20 +3905,41 @@ means to push this value onto the list in the variable.")
                                   (default-value 'org-todo-keywords)))))
        (setq kwds (reverse kwds)))
       (setq kwds (nreverse kwds))
-      (let (inter kws)
+      (let (inter kws kw)
        (while (setq kws (pop kwds))
          (setq inter (pop kws) sep (member "|" kws)
-               kws1 (delete "|" (copy-sequence kws))
+               kws0 (delete "|" (copy-sequence kws))
+               kwsa nil
+               kws1 (mapcar
+                     (lambda (x)
+                       (if (string-match "^\\(.*?\\)\\(?:(\\(..?\\))\\)?$" x)
+                           (progn
+                             (setq kw (match-string 1 x)
+                                   ex (and (match-end 2) (match-string 2 x))
+                                   log (and ex (string-match "@" ex))
+                                   key (and ex (substring ex 0 1)))
+                             (if (equal key "@") (setq key nil))
+                             (push (cons kw (and key (string-to-char key))) kwsa)
+                             (and log (push kw org-todo-log-states))
+                             kw)
+                         (error "Invalid TODO keyword %s" x)))
+                     kws0)
+               kwsa (if kwsa (append '((:startgroup))
+                                     (nreverse kwsa)
+                                     '((:endgroup))))
                hw (car kws1)
-               dws (if sep (cdr sep) (last kws1))
+               dws (if sep (org-remove-keyword-keys (cdr sep)) (last kws1))
                tail (list inter hw (car dws) (org-last dws)))
          (add-to-list 'org-todo-heads hw 'append)
          (push kws1 org-todo-sets)
          (setq org-done-keywords (append org-done-keywords dws nil))
+         (setq org-todo-key-alist (append org-todo-key-alist kwsa))
          (mapc (lambda (x) (push (cons x tail) org-todo-kwd-alist)) kws1)
          (setq org-todo-keywords-1 (append org-todo-keywords-1 kws1 nil)))
        (setq org-todo-sets (nreverse org-todo-sets)
-             org-todo-kwd-alist (nreverse org-todo-kwd-alist)))
+             org-todo-kwd-alist (nreverse org-todo-kwd-alist)
+             org-todo-key-trigger (delq nil (mapcar 'cdr org-todo-key-alist))
+             org-todo-key-alist (org-assign-fast-keys org-todo-key-alist)))
       ;; Process the constants
       (when const
        (let (e cst)
@@ -3834,32 +4016,35 @@ means to push this value onto the list in the variable.")
          (concat "\\<\\(" org-scheduled-string
                  "\\|" org-deadline-string
                  "\\|" org-closed-string
-                 "\\|" org-archived-string
                  "\\|" org-clock-string "\\)"
                  " *[[<]\\([^]>]+\\)[]>]")
          org-keyword-time-not-clock-regexp
          (concat "\\<\\(" org-scheduled-string
                  "\\|" org-deadline-string
                  "\\|" org-closed-string
-                 "\\|" org-archived-string
                  "\\)"
                  " *[[<]\\([^]>]+\\)[]>]")
          org-maybe-keyword-time-regexp
          (concat "\\(\\<\\(" org-scheduled-string
                  "\\|" org-deadline-string
                  "\\|" org-closed-string
-                 "\\|" org-archived-string
                  "\\|" org-clock-string "\\)\\)?"
                  " *\\([[<][0-9]\\{4\\}-[0-9]\\{2\\}-[0-9]\\{2\\} [^]\r\n>]*?[]>]\\|<%%([^\r\n>]*>\\)")
          org-planning-or-clock-line-re
          (concat "\\(?:^[ \t]*\\(" org-scheduled-string
                  "\\|" org-deadline-string
                  "\\|" org-closed-string "\\|" org-clock-string
-                 "\\|" org-archived-string "\\)\\>\\)")
+                 "\\)\\>\\)")
          )
 
     (org-set-font-lock-defaults)))
 
+(defun org-remove-keyword-keys (list)
+  (mapcar (lambda (x)
+           (if (string-match "(..?)$" x)
+               (substring x 0 (match-beginning 0))
+             x))
+         list))
 
 ;;; Some variables ujsed in various places
 
@@ -3922,6 +4107,7 @@ This is for getting out of special buffers like remember.")
 
 ;; Defined somewhere in this file, but used before definition.
 (defvar orgtbl-mode-menu) ; defined when orgtbl mode get initialized
+(defvar org-agenda-buffer-name)
 (defvar org-agenda-undo-list)
 (defvar org-agenda-pending-undo-list)
 (defvar org-agenda-overriding-header)
@@ -4064,7 +4250,7 @@ This variable is set by `org-before-change-function'.
 (defvar org-inhibit-startup nil)        ; Dynamically-scoped param.
 (defvar org-agenda-keep-modes nil)      ; Dynamically-scoped param.
 (defvar org-table-buffer-is-an nil)
-
+(defconst org-outline-regexp "\\*+ ")
 
 ;;;###autoload
 (define-derived-mode org-mode outline-mode "Org"
@@ -4107,14 +4293,19 @@ The following commands are available:
   (org-add-to-invisibility-spec '(org-cwidth))
   (when (featurep 'xemacs)
     (org-set-local 'line-move-ignore-invisible t))
-  (org-set-local 'outline-regexp "\\*+ ")
-  (setq outline-level 'org-outline-level)
-  (when (and org-ellipsis (stringp org-ellipsis)
-             (fboundp 'set-display-table-slot) (boundp 'buffer-display-table))
+  (org-set-local 'outline-regexp org-outline-regexp)
+  (org-set-local 'outline-level 'org-outline-level)
+  (when (and org-ellipsis
+             (fboundp 'set-display-table-slot) (boundp 'buffer-display-table)
+            (fboundp 'make-glyph-code))
     (unless org-display-table
       (setq org-display-table (make-display-table)))
-    (set-display-table-slot org-display-table
-                           4 (string-to-vector org-ellipsis))
+    (set-display-table-slot
+     org-display-table 4
+     (vconcat (mapcar
+              (lambda (c) (make-glyph-code c (and (not (stringp org-ellipsis))
+                                                  org-ellipsis)))
+              (if (stringp org-ellipsis) org-ellipsis "..."))))
     (setq buffer-display-table org-display-table))
   (org-set-regexps-and-options)
   ;; Calc embedded
@@ -4159,6 +4350,7 @@ The following commands are available:
       (let ((bmp (buffer-modified-p)))
        (org-table-map-tables 'org-table-align)
        (set-buffer-modified-p bmp)))
+    (org-cycle-hide-drawers 'all)
     (cond
      ((eq org-startup-folded t)
       (org-cycle '(4)))
@@ -4553,17 +4745,18 @@ between words."
 
 (defvar org-font-lock-keywords nil)
 
-(defconst org-property-re "^[ \t]*\\(:\\([a-zA-Z_0-9]+\\):\\)[ \t]*\\(\\S-.*\\)"
+(defconst org-property-re (org-re "^[ \t]*\\(:\\([[:alnum:]_]+\\):\\)[ \t]*\\(\\S-.*\\)")
   "Regular expression matching a property line.")
 
 (defun org-set-font-lock-defaults ()
   (let* ((em org-fontify-emphasized-text)
         (lk org-activate-links)
         (org-font-lock-extra-keywords
-         ;; Headlines
          (list
+          ;; Headlines
           '("^\\(\\**\\)\\(\\* \\)\\(.*\\)" (1 (org-get-level-face 1))
             (2 (org-get-level-face 2)) (3 (org-get-level-face 3)))
+          ;; Table lines
           '("^[ \t]*\\(\\(|\\|\\+-[-+]\\).*\\S-\\)"
             (1 'org-table))
           ;; Links
@@ -4576,15 +4769,21 @@ between words."
           '("^&?%%(.*\\|<%%([^>\n]*?>" (0 'org-sexp-date t))
           '(org-hide-wide-columns (0 nil append))
           ;; TODO lines
-          (list (concat "^\\*+[ \t]+" org-not-done-regexp)
-                '(1 'org-todo t))
+          (list (concat "^\\*+[ \t]+" org-todo-regexp)
+                '(1 (org-get-todo-face 1) t))
+          ;; DONE
+          (if org-fontify-done-headline
+              (list (concat "^[*]+ +\\<\\("
+                            (mapconcat 'regexp-quote org-done-keywords "\\|")
+                            "\\)\\(.*\\)")
+                    '(2 'org-headline-done t))
+            nil)
           ;; Priorities
           (list (concat "\\[#[A-Z0-9]\\]") '(0 'org-special-keyword t))
           ;; Special keywords
           (list (concat "\\<" org-deadline-string) '(0 'org-special-keyword t))
           (list (concat "\\<" org-scheduled-string) '(0 'org-special-keyword t))
           (list (concat "\\<" org-closed-string) '(0 'org-special-keyword t))
-          (list (concat "\\<" org-archived-string) '(0 'org-special-keyword t))
           (list (concat "\\<" org-clock-string) '(0 'org-special-keyword t))
           ;; Emphasis
           (if em
@@ -4602,25 +4801,13 @@ between words."
                         "\\|" org-quote-string "\\)\\>")
                 '(1 'org-special-keyword t))
           '("^#.*" (0 'font-lock-comment-face t))
-          ;; DONE
-          (if org-fontify-done-headline
-              (list (concat "^[*]+ +\\<\\("
-                            (mapconcat 'regexp-quote org-done-keywords "\\|")
-                            "\\)\\(.*\\)")
-                    '(1 'org-done t) '(2 'org-headline-done t))
-            (list (concat "^[*]+ +\\<\\("
-                          (mapconcat 'regexp-quote org-done-keywords "\\|")
-                          "\\)\\>")
-                  '(1 'org-done t)))
-          ;; Table stuff
-          '("^[ \t]*\\(:.*\\)" (1 'org-table t))
+          ;; Code
+          '("^[ \t]*\\(:.*\\)" (1 'org-code t))
+          ;; Table internals
           '("| *\\(:?=[^|\n]*\\)" (1 'org-formula t))
-;         '("^[ \t]*| *\\([#!$*_^/]\\) *|" (1 'org-formula t))
           '("^[ \t]*| *\\([#*]\\) *|" (1 'org-formula t))
           '("^[ \t]*|\\( *\\([$!_^/]\\) *|.*\\)|" (1 'org-formula t))
           ;; Drawers
-;         (list org-drawer-regexp '(0 'org-drawer t))
-;         (list "^[ \t]*:END:" '(0 'org-drawer t))
           (list org-drawer-regexp '(0 'org-special-keyword t))
           (list "^[ \t]*:END:" '(0 'org-special-keyword t))
           ;; Properties
@@ -4651,6 +4838,14 @@ between words."
    ((eq n 2) org-f)
    (t (if org-level-color-stars-only nil org-f))))
 
+(defun org-get-todo-face (kwd)
+  "Get the right face for a TODO keyword KWD.
+If KWD is a number, get the corresponding match group."
+  (if (numberp kwd) (setq kwd (match-string kwd)))
+  (or (cdr (assoc kwd org-todo-keyword-faces))
+      (and (member kwd org-done-keywords) 'org-done)
+      'org-todo))
+
 (defun org-unfontify-region (beg end &optional maybe_loudly)
   "Remove fontification and activation overlays from links."
   (font-lock-default-unfontify-region beg end)
@@ -4699,7 +4894,8 @@ between words."
   `org-cycle-emulate-tab' for details.
 
 - Special case: if point is at the beginning of the buffer and there is
-  no headline in line 1, this function will act as if called with prefix arg."
+  no headline in line 1, this function will act as if called with prefix arg.
+  But only if also the variable `org-cycle-global-at-bob' is t."
   (interactive "P")
   (let* ((outline-regexp
          (if (and (org-mode-p) org-cycle-include-plain-lists)
@@ -4756,7 +4952,7 @@ between words."
        (setq org-cycle-global-status 'overview)
        (run-hook-with-args 'org-cycle-hook 'overview))))
 
-     ((and org-drawers
+     ((and org-drawers org-drawer-regexp
           (save-excursion
             (beginning-of-line 1)
             (looking-at org-drawer-regexp)))
@@ -4977,7 +5173,7 @@ Optional argument N means, put the headline into the Nth line of the window."
 (defvar org-goto-marker nil)
 (defvar org-goto-map
   (let ((map (make-sparse-keymap)))
-    (let ((cmds '(isearch-forward isearch-backward)) cmd)
+    (let ((cmds '(isearch-forward isearch-backward kill-ring-save set-mark-command mouse-drag-region universal-argument org-occur)) cmd)
       (while (setq cmd (pop cmds))
        (substitute-key-definition cmd cmd map global-map)))
     (org-defkey map "\C-m"     'org-goto-ret)
@@ -4994,6 +5190,7 @@ Optional argument N means, put the headline into the Nth line of the window."
     (org-defkey map "f" 'outline-forward-same-level)
     (org-defkey map "b" 'outline-backward-same-level)
     (org-defkey map "u" 'outline-up-heading)
+    (org-defkey map "/" 'org-occur)
     (org-defkey map "\C-c\C-n" 'outline-next-visible-heading)
     (org-defkey map "\C-c\C-p" 'outline-previous-visible-heading)
     (org-defkey map "\C-c\C-f" 'outline-forward-same-level)
@@ -5005,55 +5202,63 @@ Optional argument N means, put the headline into the Nth line of the window."
     map))
 
 (defconst org-goto-help
-"Select a location to jump to, press RET
-\[Up]/[Down]=next/prev headline   TAB=cycle visibility   RET=select   [Q]uit")
+"Browse copy of buffer to find location or copy text.
+RET=jump to location             [Q]uit and return to previous location
+\[Up]/[Down]=next/prev headline   TAB=cycle visibility   [/] org-occur"
+)
 
 (defun org-goto ()
-  "Go to a different location of the document, keeping current visibility.
+  "Look up a different location in the current file, keeping current visibility.
 
-When you want to go to a different location in a document, the fastest way
-is often to fold the entire buffer and then dive into the tree.  This
-method has the disadvantage, that the previous location will be folded,
+When you want look-up or go to a different location in a document, the
+fastest way is often to fold the entire buffer and then dive into the tree.
+This method has the disadvantage, that the previous location will be folded,
 which may not be what you want.
 
-This command works around this by showing a copy of the current buffer in
-overview mode.  You can dive into the tree in that copy, to find the
-location you want to reach.  When pressing RET, the command returns to the
-original buffer in which the visibility is still unchanged.  It then jumps
-to the new location, making it and the headline hierarchy above it visible."
+This command works around this by showing a copy of the current buffer
+in an indirect buffer, in overview mode.  You can dive into the tree in
+that copy, use org-occur and incremental search to find a location.
+When pressing RET or `Q', the command returns to the original buffer in
+which the visibility is still unchanged.  After RET is will also jump to
+the location selected in the indirect buffer and expose the
+the headline hierarchy above."
   (interactive)
   (let* ((org-goto-start-pos (point))
         (selected-point
-         (org-get-location (current-buffer) org-goto-help)))
+         (car (org-get-location (current-buffer) org-goto-help))))
     (if selected-point
        (progn
          (org-mark-ring-push org-goto-start-pos)
          (goto-char selected-point)
          (if (or (org-invisible-p) (org-invisible-p2))
              (org-show-context 'org-goto)))
-      (error "Quit"))))
+      (message "Quit"))))
 
-(defvar org-selected-point nil) ; dynamically scoped parameter
+(defvar org-goto-selected-point nil) ; dynamically scoped parameter
+(defvar org-goto-exit-command nil) ; dynamically scoped parameter
 
 (defun org-get-location (buf help)
   "Let the user select a location in the Org-mode buffer BUF.
 This function uses a recursive edit.  It returns the selected position
 or nil."
-  (let (org-selected-point)
+  (let (org-goto-selected-point org-goto-exit-command)
     (save-excursion
       (save-window-excursion
        (delete-other-windows)
-       (switch-to-buffer (get-buffer-create "*org-goto*"))
+       (and (get-buffer "*org-goto*") (kill-buffer "*org-goto*"))
+       (switch-to-buffer
+        (condition-case nil
+            (make-indirect-buffer (current-buffer) "*org-goto*")
+          (error (make-indirect-buffer (current-buffer) "*org-goto*"))))
        (with-output-to-temp-buffer "*Help*"
          (princ help))
        (shrink-window-if-larger-than-buffer (get-buffer-window "*Help*"))
        (setq buffer-read-only nil)
-       (erase-buffer)
-       (insert-buffer-substring buf)
        (let ((org-startup-truncated t)
-             (org-startup-folded t)
+             (org-startup-folded nil)
              (org-startup-align-all-tables nil))
-         (org-mode))
+         (org-mode)
+         (org-overview))
        (setq buffer-read-only t)
        (if (and (boundp 'org-goto-start-pos)
                 (integer-or-marker-p org-goto-start-pos))
@@ -5067,21 +5272,24 @@ or nil."
        (message "Select location and press RET")
        ;; now we make sure that during selection, ony very few keys work
        ;; and that it is impossible to switch to another window.
-       (let ((gm (current-global-map))
-             (overriding-local-map org-goto-map))
-         (unwind-protect
-             (progn
-               (use-global-map org-goto-map)
-               (recursive-edit))
-           (use-global-map gm)))))
+;      (let ((gm (current-global-map))
+;            (overriding-local-map org-goto-map))
+;        (unwind-protect
+;            (progn
+;              (use-global-map org-goto-map)
+;              (recursive-edit))
+;          (use-global-map gm)))
+       (use-local-map org-goto-map)
+       (recursive-edit)
+       ))
     (kill-buffer "*org-goto*")
-    org-selected-point))
+    (cons org-goto-selected-point org-goto-exit-command)))
 
 (defun org-goto-ret (&optional arg)
   "Finish `org-goto' by going to the new location."
   (interactive "P")
-  (setq org-selected-point (point)
-       current-prefix-arg arg)
+  (setq org-goto-selected-point (point)
+       org-goto-exit-command 'return)
   (throw 'exit nil))
 
 (defun org-goto-left ()
@@ -5090,8 +5298,8 @@ or nil."
   (if (org-on-heading-p)
       (progn
        (beginning-of-line 1)
-       (setq org-selected-point (point)
-             current-prefix-arg (- (match-end 0) (match-beginning 0)))
+       (setq org-goto-selected-point (point)
+             org-goto-exit-command 'left)
        (throw 'exit nil))
     (error "Not on a heading")))
 
@@ -5100,17 +5308,16 @@ or nil."
   (interactive)
   (if (org-on-heading-p)
       (progn
-       (outline-end-of-subtree)
-       (or (eobp) (forward-char 1))
-       (setq org-selected-point (point)
-             current-prefix-arg (- (match-end 0) (match-beginning 0)))
+       (setq org-goto-selected-point (point)
+             org-goto-exit-command 'right)
        (throw 'exit nil))
     (error "Not on a heading")))
 
 (defun org-goto-quit ()
   "Finish `org-goto' without cursor motion."
   (interactive)
-  (setq org-selected-point nil)
+  (setq org-goto-selected-point nil)
+  (setq org-goto-exit-command 'quit)
   (throw 'exit nil))
 
 ;;; Indirect buffer display of subtrees
@@ -5599,33 +5806,26 @@ If optional TREE is given, use this text instead of the kill ring."
         (func (if (> shift 0) 'org-demote 'org-promote))
         (org-odd-levels-only nil)
         beg end)
-    ;; Remove the forces level indicator
+    ;; Remove the forced level indicator
     (if force-level
        (delete-region (point-at-bol) (point)))
-    ;; Make sure we start at the beginning of an empty line
-    (if (not (bolp)) (insert "\n"))
-    (if (not (looking-at "[ \t]*$"))
-       (progn (insert "\n") (backward-char 1)))
     ;; Paste
+    (beginning-of-line 1)
     (setq beg (point))
-    (if (string-match "[ \t\r\n]+\\'" txt)
-       (setq txt (replace-match "\n" t t txt)))
     (insert txt)
+    (unless (string-match "\n[ \t]*\\'" txt) (insert "\n"))
     (setq end (point))
-    (if (looking-at "[ \t\r\n]+")
-       (replace-match "\n"))
     (goto-char beg)
     ;; Shift if necessary
-    (if (= shift 0)
-       (message "Pasted at level %d, without shift" new-level)
+    (unless (= shift 0)
       (save-restriction
        (narrow-to-region beg end)
        (while (not (= shift 0))
          (org-map-region func (point-min) (point-max))
          (setq shift (+ delta shift)))
-       (goto-char (point-min))
-       (message "Pasted at level %d, with shift by %d levels"
-                new-level shift1)))
+       (goto-char (point-min))))
+    (when (interactive-p)
+      (message "Clipboard pasted as level %d subtree" new-level))
     (if (and kill-ring
             (eq org-subtree-clip (current-kill 0))
             org-subtree-clip-folded)
@@ -5641,16 +5841,17 @@ which is OK for `org-paste-subtree'.
 If optional TXT is given, check this string instead of the current kill."
   (let* ((kill (or txt (and kill-ring (current-kill 0)) ""))
         (start-level (and kill
-                          (string-match (concat "\\`" outline-regexp) kill)
-                          (- (match-end 0) (match-beginning 0))))
-        (re (concat "^" outline-regexp))
+                          (string-match (concat "\\`" org-outline-regexp) kill)
+                          (- (match-end 0) (match-beginning 0) 1)))
+        (re (concat "^" org-outline-regexp))
         (start 1))
     (if (not start-level)
-       nil  ;; does not even start with a heading
+       (progn
+         nil)  ;; does not even start with a heading
       (catch 'exit
        (while (setq start (string-match re kill (1+ start)))
-         (if (< (- (match-end 0) (match-beginning 0)) start-level)
-             (throw 'exit nil)))
+         (when (< (- (match-end 0) (match-beginning 0) 1) start-level)
+           (throw 'exit nil)))
        t))))
 
 (defun org-narrow-to-subtree ()
@@ -5752,6 +5953,8 @@ WITH-CASE, the sorting considers case as well.  With two prefix arguments
             nentries
             (if unique (format ", %d duplicates removed" nremoved) ""))))
 
+(defvar org-priority-regexp) ; defined later in the file
+
 (defun org-do-sort (table what &optional with-case sorting-type)
   "Sort TABLE of WHAT according to SORTING-TYPE.
 The user will be prompted for the SORTING-TYPE if the call to this
@@ -5761,7 +5964,7 @@ the car of the elements of the table.
 If WITH-CASE is non-nil, the sorting will be case-sensitive."
   (unless sorting-type
     (message
-     "Sort %s: [a]lphabetically [n]umerically [t]ime. A/N/T means reversed:"
+     "Sort %s: [a]lphabetic. [n]umeric. [t]ime  [p]riority.  A/N/T/P means reversed:"
      what)
     (setq sorting-type (read-char-exclusive)))
   (let ((dcst (downcase sorting-type))
@@ -5785,6 +5988,13 @@ If WITH-CASE is non-nil, the sorting will be case-sensitive."
                   (org-time-string-to-time (match-string 0 x)))
                0))
            comparefun (if (= dcst sorting-type) '< '>)))
+     ((= dcst ?p)
+      (setq extractfun
+           (lambda (x)
+             (if (string-match org-priority-regexp x)
+                 (string-to-char (match-string 2 x))
+               org-default-priority))
+           comparefun (if (= dcst sorting-type) '< '>)))                 
      (t (error "Invalid sorting type `%c'" sorting-type)))
 
     (sort (mapcar (lambda (x) (cons (funcall extractfun (car x)) (cdr x)))
@@ -6590,7 +6800,12 @@ this heading."
          (this-buffer (current-buffer))
          (org-archive-location org-archive-location)
          (re "^#\\+ARCHIVE:[ \t]+\\(\\S-.*\\S-\\)[ \t]*$")
-         file heading buffer level newfile-p)
+         (file (abbreviate-file-name (buffer-file-name)))
+         (time (format-time-string
+                (substring (cdr org-time-stamp-formats) 1 -1)
+                (current-time)))
+         afile heading buffer level newfile-p
+         category todo priority ltags itags)
 
       ;; Try to find a local archive location
       (save-excursion
@@ -6601,21 +6816,32 @@ this heading."
 
       (if (string-match "\\(.*\\)::\\(.*\\)" org-archive-location)
          (progn
-           (setq file (format (match-string 1 org-archive-location)
+           (setq afile (format (match-string 1 org-archive-location)
                               (file-name-nondirectory buffer-file-name))
                  heading (match-string 2 org-archive-location)))
        (error "Invalid `org-archive-location'"))
-      (if (> (length file) 0)
-         (setq newfile-p (not (file-exists-p file))
-               buffer (find-file-noselect file))
+      (if (> (length afile) 0)
+         (setq newfile-p (not (file-exists-p afile))
+               buffer (find-file-noselect afile))
        (setq buffer (current-buffer)))
       (unless buffer
-       (error "Cannot access file \"%s\"" file))
+       (error "Cannot access file \"%s\"" afile))
       (if (and (> (length heading) 0)
               (string-match "^\\*+" heading))
          (setq level (match-end 0))
        (setq heading nil level 0))
       (save-excursion
+       (org-back-to-heading t)
+       ;; Get context information that will be lost by moving the tree
+       (setq org-category-table (org-get-category-table)
+             category (org-get-category)
+             todo (and (looking-at org-todo-line-regexp)
+                       (match-string 2))
+             priority (org-get-priority (if (match-end 3) (match-string 3) ""))
+             ltags (org-get-tags)
+             itags (org-delete-all ltags (org-get-tags-at)))
+       (setq ltags (mapconcat 'identity ltags " ")
+             itags (mapconcat 'identity itags " "))
        ;; We first only copy, in case something goes wrong
        ;; we need to protect this-command, to avoid kill-region sets it,
        ;; which would lead to duplication of subtrees
@@ -6676,9 +6902,15 @@ this heading."
               (car (or (member org-archive-mark-done org-done-keywords)
                        org-done-keywords)))))
 
-         ;; Move cursor to right after the TODO keyword
-         (when org-archive-stamp-time
-           (org-add-planning-info 'archived (org-current-time)))
+         ;; Add the context info
+         (when org-archive-save-context-info
+           (let ((l org-archive-save-context-info) e n v)
+             (while (setq e (pop l))
+               (when (and (setq v (symbol-value e))
+                          (stringp v) (string-match "\\S-" v))
+                 (setq n (concat "ARCHIVE_" (upcase (symbol-name e))))
+                 (org-entry-put (point) n v)))))
+
          ;; Save the buffer, if it is not the same buffer.
          (if (not (eq this-buffer buffer)) (save-buffer))))
       ;; Here we are back in the original buffer.  Everything seems to have
@@ -6688,7 +6920,7 @@ this heading."
       (message "Subtree archived %s"
               (if (eq this-buffer buffer)
                   (concat "under heading: " heading)
-                (concat "in file: " (abbreviate-file-name file)))))))
+                (concat "in file: " (abbreviate-file-name afile)))))))
 
 (defun org-archive-all-done (&optional tag)
   "Archive sublevels of the current tree without open TODO items.
@@ -6735,7 +6967,8 @@ When TAG is non-nil, don't move trees, but mark them with the ARCHIVE tag."
 
 (defun org-cycle-hide-drawers (state)
   "Re-hide all drawers after a visibility state change."
-  (when (not (memq state '(overview folded)))
+  (when (and (org-mode-p)
+            (not (memq state '(overview folded))))
     (save-excursion
       (let* ((globalp (memq state '(contents all)))
              (beg (if globalp (point-min) (point)))
@@ -6812,8 +7045,9 @@ If ONOFF is `on' or `off', don't toggle but set to this state."
       (end-of-line 1)
       (when current
        (insert " :" (mapconcat 'identity (nreverse current) ":") ":"))
-      (org-set-tags nil t))
-    res))
+      (org-set-tags nil t)
+    res)
+    (run-hooks 'org-after-tags-change-hook)))
 
 (defun org-toggle-archive-tag (&optional arg)
   "Toggle the archive tag for the current headline.
@@ -8127,7 +8361,7 @@ it can be edited in place."
          (field (org-table-get-field))
          (cw (current-window-configuration))
          p)
-      (switch-to-buffer-other-window "*Org tmp*")
+      (org-switch-to-buffer-other-window "*Org tmp*")
       (erase-buffer)
       (insert "#\n# Edit field and finish with C-c C-c\n#\n")
       (let ((org-inhibit-startup t)) (org-mode))
@@ -9223,7 +9457,7 @@ Parameters get priority."
                  (field . "# Field Formulas\n")
                  (named . "# Named Field Formulas\n")))
        entry s type title)
-    (switch-to-buffer-other-window "*Edit Formulas*")
+    (org-switch-to-buffer-other-window "*Edit Formulas*")
     (erase-buffer)
     ;; Keep global-font-lock-mode from turning on font-lock-mode
     (let ((font-lock-global-modes '(not fundamental-mode)))
@@ -9578,7 +9812,7 @@ With prefix ARG, apply the new formulas to the table."
       (if (and (markerp pos) (marker-buffer pos))
          (if (get-buffer-window (marker-buffer pos))
              (select-window (get-buffer-window (marker-buffer pos)))
-           (switch-to-buffer-other-window (get-buffer-window
+           (org-switch-to-buffer-other-window (get-buffer-window
                                            (marker-buffer pos)))))
       (goto-char pos)
       (org-table-force-dataline)
@@ -10768,10 +11002,11 @@ For file links, arg negates `org-context-in-file-links'."
          (setq cpltxt (substring cpltxt 0 -2)))
       (setq link (org-make-link cpltxt)))
 
-     (buffer-file-name
+     ((buffer-file-name (buffer-base-buffer))
       ;; Just link to this file here.
       (setq cpltxt (concat "file:"
-                          (abbreviate-file-name buffer-file-name)))
+                          (abbreviate-file-name
+                           (buffer-file-name (buffer-base-buffer)))))
       ;; Add a context string
       (when (org-xor org-context-in-file-links arg)
        (setq txt (if (org-region-active-p)
@@ -10797,9 +11032,9 @@ For file links, arg negates `org-context-in-file-links'."
     (if (and (interactive-p) link)
        (progn
          (setq org-stored-links
-               (cons (list cpltxt link desc) org-stored-links))
-         (message "Stored: %s" (or cpltxt link)))
-      (org-make-link-string link desc))))
+               (cons (list link desc) org-stored-links))
+         (message "Stored: %s" (or desc link)))
+      (and link (org-make-link-string link desc)))))
 
 (defun org-store-link-props (&rest plist)
   "Store link properties, extract names and addresses."
@@ -10873,6 +11108,8 @@ according to FMT (default from `org-email-link-description-format')."
 
 (defun org-make-link-string (link &optional description)
   "Make a link with brackets, consisting of LINK and DESCRIPTION."
+  (unless (string-match "\\S-" link)
+    (error "Empty link"))
   (when (stringp description)
     ;; Remove brackets from the description, they are fatal.
     (while (string-match "\\[\\|\\]" description)
@@ -10888,14 +11125,24 @@ according to FMT (default from `org-email-link-description-format')."
          "]"))
 
 (defconst org-link-escape-chars 
-  '((" " . "%20")    ("\340" . "%E0")
-    ("\342" . "%E2") ("\347" . "%E7")
-    ("\350" . "%E8") ("\351" . "%E9")
-    ("\352" . "%EA") ("\356" . "%EE")
-    ("\364" . "%F4") ("\371" . "%F9")
-    ("\373" . "%FB") (";" . "%3B")
-    ("?" . "%3F")    ("=" . "%3D")
-    ("+" . "%2B"))
+  '((" " . "%20")
+    ("[" . "%5B")
+    ("]" . "%5d")
+    ("\340" . "%E0")  ; `a
+    ("\342" . "%E2")  ; ^a  
+    ("\347" . "%E7")  ; ,c
+    ("\350" . "%E8")  ; `e
+    ("\351" . "%E9")  ; 'e
+    ("\352" . "%EA")  ; ^e
+    ("\356" . "%EE")  ; ^i
+    ("\364" . "%F4")  ; ^o
+    ("\371" . "%F9")  ; `u
+    ("\373" . "%FB")  ; ^u
+    (";" . "%3B")
+    ("?" . "%3F")
+    ("=" . "%3D")
+    ("+" . "%2B")
+    )
   "Association list of escapes for some characters problematic in links.")
 
 (defun org-link-escape (text)
@@ -10963,8 +11210,7 @@ according to FMT (default from `org-email-link-description-format')."
 ;;;###autoload
 (defun org-insert-link-global ()
   "Insert a link like Org-mode does.
-This command can be called in any mode to follow a link that has
-Org-mode syntax."
+This command can be called in any mode to insert a link in Org-mode syntax."
   (interactive)
   (org-run-like-in-org-mode 'org-insert-link))
 
@@ -11038,7 +11284,10 @@ With three \\[universal-argument] prefixes, negate the meaning of
        (princ "Insert a link.  Use TAB to complete valid link prefixes.\n")
        (when org-stored-links
          (princ "\nStored links are available with <up>/<down> (most recent with RET):\n\n")
-         (princ (mapconcat 'car (reverse org-stored-links) "\n"))))
+         (princ (mapconcat
+                 (lambda (x)
+                   (if (nth 1 x) (concat (car x) " (" (nth 1 x) ")") (car x)))
+                 (reverse org-stored-links) "\n"))))
       (let ((cw (selected-window)))
        (select-window (get-buffer-window "*Org Links*"))
        (shrink-window-if-larger-than-buffer)
@@ -11066,9 +11315,8 @@ With three \\[universal-argument] prefixes, negate the meaning of
                   (not org-keep-stored-link-after-insertion))
          (setq org-stored-links (delq (assoc link org-stored-links)
                                       org-stored-links)))
-      (setq link (if entry (nth 1 entry) link)
-           desc (or region desc (nth 2 entry)))))
-
+      (setq desc (or region desc (nth 1 entry)))))
+    
     (if (string-match org-plain-link-re link)
        ;; URL-like link, normalize the use of angular brackets.
        (setq link (org-make-link (org-remove-angle-brackets link))))
@@ -11088,6 +11336,7 @@ With three \\[universal-argument] prefixes, negate the meaning of
     ;; Check if we can/should use a relative path.  If yes, simplify the link
     (when (string-match "\\<file:\\(.*\\)" link)
       (let* ((path (match-string 1 link))
+            (desc-is-link (equal link desc))
             (case-fold-search nil))
        (cond
         ((eq org-link-file-path-type 'absolute)
@@ -11105,7 +11354,8 @@ With three \\[universal-argument] prefixes, negate the meaning of
                ;; We are linking a file with relative path name.
                (setq path (substring (expand-file-name path)
                                      (match-end 0)))))))
-       (setq link (concat "file:" path))))
+       (setq link (concat "file:" path))
+       (if desc (setq desc link))))
 
     (setq desc (read-string "Description: " desc))
     (unless (string-match "\\S-" desc) (setq desc nil))
@@ -11774,12 +12024,13 @@ sequences, it will now work."
                (string= mh-index-folder (substring folder 0 end-index)))
           (if (equal major-mode 'mh-show-mode)
               (save-window-excursion
-                (when (buffer-live-p (get-buffer folder))
-                  (progn
-                    (pop-to-buffer folder)
-                    (org-mhe-get-message-folder-from-index)
-                    )
-                  ))
+               (let (pop-up-frames)
+                 (when (buffer-live-p (get-buffer folder))
+                   (progn
+                     (pop-to-buffer folder)
+                     (org-mhe-get-message-folder-from-index)
+                     )
+                   )))
             (org-mhe-get-message-folder-from-index)
             )
         folder
@@ -12022,10 +12273,12 @@ conventions in Org-mode.  This function returns such a link."
 (defconst org-remember-help
 "Select a destination location for the note.
 UP/DOWN=headline   TAB=cycle visibility  [Q]uit   RET/<left>/<right>=Store
-RET at beg-of-buf -> Append to file as level 2 headline
 RET on headline   -> Store as sublevel entry to current headline
+RET at beg-of-buf -> Append to file as level 2 headline
 <left>/<right>    -> before/after current headline, same headings level")
 
+(defvar org-remember-previous-location nil)
+
 ;;;###autoload
 (defun org-remember-apply-template (&optional use-char skip-interactive)
   "Initialize *remember* buffer with template, invoke `org-mode'.
@@ -12055,6 +12308,10 @@ to be run from that hook to fucntion properly."
             (v-U (concat "[" (substring v-T 1 -1) "]"))
             (v-i initial)      ; defined in `remember-mode'
             (v-a (if (equal annotation "[[]]") "" annotation)) ; likewise
+            (v-A (if (and v-a
+                          (string-match "\\[\\(\\[.*?\\]\\)\\(\\[.*?\\]\\)?\\]" v-a))
+                     (replace-match "[\\1[%^{Link description}]]" nil nil v-a)
+                   v-a))
             (v-n user-full-name)
             (org-startup-folded nil)
             org-time-was-given org-end-time-was-given x prompt char time)
@@ -12065,14 +12322,20 @@ to be run from that hook to fucntion properly."
        (erase-buffer)
        (insert (substitute-command-keys
                 (format
-                 "## `C-c C-c' to file interactively, `C-u C-c C-c' to file directly.
-## Target file \"%s\", headline \"%s\"
+"## Filing location: Select interactively, default, or last used:
+## %s  to select file and header location interactively.
+## %s  \"%s\" -> \"* %s\"
+## C-u C-u C-c C-c  \"%s\" -> \"* %s\"
 ## To switch templates, use `\\[org-remember]'.\n\n"
+                 (if org-remember-store-without-prompt "    C-u C-c C-c" "        C-c C-c")
+                 (if org-remember-store-without-prompt "        C-c C-c" "    C-u C-c C-c")
                  (abbreviate-file-name (or file org-default-notes-file))
-                 (or headline ""))))
+                 (or headline "")
+                 (or (car org-remember-previous-location) "???")
+                 (or (cdr org-remember-previous-location) "???"))))
        (insert tpl) (goto-char (point-min))
        ;; Simple %-escapes
-       (while (re-search-forward "%\\([tTuUai]\\)" nil t)
+       (while (re-search-forward "%\\([tTuUaiA]\\)" nil t)
          (when (and initial (equal (match-string 0) "%i"))
            (save-match-data
              (let* ((lead (buffer-substring
@@ -12170,7 +12433,7 @@ find a better place.  Then press RET or <left> or <right> in insert the note.
 
 Key      Cursor position   Note gets inserted
 -----------------------------------------------------------------------------
-RET      buffer-start      as level 2 heading at end of file
+RET      buffer-start      as level 1 heading at end of file
 RET      on headline       as sublevel of the heading at cursor
 RET      no heading        at cursor position, level taken from context.
                           Or use prefix arg to specify level manually.
@@ -12206,7 +12469,10 @@ See also the variable `org-reverse-note-order'."
           (org-startup-folded nil)
           (org-startup-align-all-tables nil)
           (org-goto-start-pos 1)
-          spos level indent reversed)
+          spos exitcmd level indent reversed)
+      (if (and (equal current-prefix-arg '(16)) org-remember-previous-location)
+         (setq file (car org-remember-previous-location)
+               heading (cdr org-remember-previous-location)))
       (setq current-prefix-arg nil)
       ;; Modify text so that it becomes a nice subtree which can be inserted
       ;; into an org tree.
@@ -12228,6 +12494,8 @@ See also the variable `org-reverse-note-order'."
       ;; Find the file
       (if (not visiting) (find-file-noselect file))
       (with-current-buffer (or visiting (get-file-buffer file))
+       (unless (org-mode-p)
+         (error "Target files for remember notes must be in Org-mode"))
        (save-excursion
          (save-restriction
            (widen)
@@ -12246,19 +12514,50 @@ See also the variable `org-reverse-note-order'."
                  (setq org-goto-start-pos (match-beginning 0))))
 
            ;; Ask the User for a location
-           (setq spos (if fastp
-                          org-goto-start-pos
-                        (org-get-location (current-buffer) org-remember-help)))
+           (if fastp
+               (setq spos org-goto-start-pos
+                     exitcmd 'return)
+             (setq spos (org-get-location (current-buffer) org-remember-help)
+                   exitcmd (cdr spos)
+                   spos (car spos)))
            (if (not spos) (throw 'quit nil)) ; return nil to show we did
                                        ; not handle this note
            (goto-char spos)
-           (cond ((and (bobp) (not reversed))
+           (cond ((org-on-heading-p t)
+                  (org-back-to-heading t)
+                  (setq level (funcall outline-level))
+                  (cond
+                   ((eq exitcmd 'return)
+                    ;; sublevel of current
+                    (setq org-remember-previous-location
+                          (cons (abbreviate-file-name file)
+                                (org-get-heading 'notags)))
+                    (if reversed
+                        (outline-next-heading)
+                      (org-end-of-subtree)
+                      (if (not (bolp))
+                          (if (looking-at "[ \t]*\n")
+                              (beginning-of-line 2)
+                            (end-of-line 1)
+                            (insert "\n"))))
+                    (org-paste-subtree (org-get-legal-level level 1) txt))
+                   ((eq exitcmd 'left)
+                    ;; before current
+                    (org-paste-subtree level txt))
+                   ((eq exitcmd 'right)
+                    ;; after current
+                    (org-end-of-subtree t)
+                    (org-paste-subtree level txt))
+                   (t (error "This should not happen"))))
+                 
+                 ((and (bobp) (not reversed))
                   ;; Put it at the end, one level below level 1
                   (save-restriction
                     (widen)
                     (goto-char (point-max))
                     (if (not (bolp)) (newline))
                     (org-paste-subtree (org-get-legal-level 1 1) txt)))
+                 
                  ((and (bobp) reversed)
                   ;; Put it at the start, as level 1
                   (save-restriction
@@ -12267,16 +12566,6 @@ See also the variable `org-reverse-note-order'."
                     (re-search-forward "^\\*+ " nil t)
                     (beginning-of-line 1)
                     (org-paste-subtree 1 txt)))
-                 ((and (org-on-heading-p t) (not current-prefix-arg))
-                  ;; Put it below this entry, at the beg/end of the subtree
-                  (org-back-to-heading t)
-                  (setq level (funcall outline-level))
-                  (if reversed
-                      (outline-next-heading)
-                    (org-end-of-subtree t))
-                  (if (not (bolp)) (newline))
-                  (beginning-of-line 1)
-                  (org-paste-subtree (org-get-legal-level level 1) txt))
                  (t
                   ;; Put it right there, with automatic level determined by
                   ;; org-paste-subtree or from prefix arg
@@ -12544,6 +12833,8 @@ At all other locations, this simply calls `ispell-complete-word'."
 If the last change removed the TODO tag or switched to DONE, then
 this is nil.")
 
+(defvar org-setting-tags nil) ; dynamically skiped
+
 (defun org-todo (&optional arg)
   "Change the TODO state of an item.
 The state of an item is given by a keyword at the start of the heading,
@@ -12585,7 +12876,13 @@ For calling through lisp, arg is also interpreted in the following way:
           (member (member this org-todo-keywords-1))
           (tail (cdr member))
           (state (cond
-                  ((equal arg '(4))
+                  ((and org-todo-key-trigger
+                        (or (and (equal arg '(4)) (eq org-use-fast-todo-selection 'prefix))
+                            (and (not arg) org-use-fast-todo-selection
+                                 (not (eq org-use-fast-todo-selection 'prefix)))))
+                   ;; Use fast selection
+                   (org-fast-todo-selection))
+                  ((and (equal arg '(4)) (eq org-use-fast-todo-selection nil))
                    ;; Read a state with completion
                    (completing-read "State: " (mapcar (lambda(x) (list x))
                                                       org-todo-keywords-1)
@@ -12601,6 +12898,8 @@ For calling through lisp, arg is also interpreted in the following way:
                          (nth (- (length org-todo-keywords-1) (length tail) 2)
                               org-todo-keywords-1)
                        (org-last org-todo-keywords-1))))
+                  ((and (eq org-use-fast-todo-selection t) (equal arg '(4))
+                        (setq arg nil))) ; hack to fall back to cycling
                   (arg
                    ;; user or caller requests a specific state
                    (cond
@@ -12647,22 +12946,30 @@ For calling through lisp, arg is also interpreted in the following way:
       (setq org-last-todo-state-is-todo
            (not (member state org-done-keywords)))
       (when (and org-log-done (not (memq arg '(nextset previousset))))
-       (setq dostates (and (eq interpret 'sequence)
-                           (listp org-log-done) (memq 'state org-log-done)))
+       (setq dostates (and (listp org-log-done) (memq 'state org-log-done)
+                           (or (not org-todo-log-states)
+                               (member state org-todo-log-states))))
+
        (cond
-        ((and state (not this))
-         ;; FIXME: should we remove CLOSED already then state is nil?
+        ((and state (member state org-not-done-keywords)
+              (not (member this org-not-done-keywords)))
+         ;; This is now a todo state and was not one before
+         ;; Remove any CLOSED timestamp, and possibly log the state change
          (org-add-planning-info nil nil 'closed)
          (and dostates (org-add-log-maybe 'state state 'findpos)))
         ((and state dostates)
+         ;; This is a non-nil state, and we need to log it
          (org-add-log-maybe 'state state 'findpos))
-        ((member state org-done-keywords)
-         ;; Planning info calls the note-setting command.
-         (org-add-planning-info 'closed (org-current-time)
-                                (if (org-get-repeat) nil 'scheduled))
+        ((and (member state org-done-keywords)
+              (not (member this org-done-keywords)))
+         ;; It is now done, and it was not done before
+         ;; FIXME: We used to remove scheduling info....
+;        (org-add-planning-info 'closed (org-current-time)
+;                               (if (org-get-repeat) nil 'scheduled))
+         (org-add-planning-info 'closed (org-current-time))
          (org-add-log-maybe 'done state 'findpos))))
       ;; Fixup tag positioning
-      (and org-auto-align-tags (org-set-tags nil t))
+      (and org-auto-align-tags (not org-setting-tags) (org-set-tags nil t))
       (run-hooks 'org-after-todo-state-change-hook)
       (and (member state org-done-keywords) (org-auto-repeat-maybe))
       (if (and arg (not (member state org-done-keywords)))
@@ -12694,6 +13001,68 @@ right sequence."
       (car org-todo-keywords-1))
      (t (nth 2 (assoc kwd org-todo-kwd-alist))))))
 
+(defun org-fast-todo-selection ()
+  "Fast TODO keyword selection with single keys.
+Returns the new TODO keyword, or nil if no state change should occur."
+  (let* ((fulltable org-todo-key-alist)
+        (done-keywords org-done-keywords) ;; needed for the faces.
+        (maxlen (apply 'max (mapcar
+                             (lambda (x)
+                               (if (stringp (car x)) (string-width (car x)) 0))
+                             fulltable)))
+        (buf (current-buffer))
+        (expert nil)
+        (fwidth (+ maxlen 3 1 3))
+        (ncol (/ (- (window-width) 4) fwidth))
+        tg cnt e c char c1 c2 ntable tbl rtn
+        groups ingroup)
+    (save-window-excursion
+      (if expert
+         (set-buffer (get-buffer-create " *Org todo*"))
+;      (delete-other-windows)
+;      (split-window-vertically)
+       (org-switch-to-buffer-other-window (get-buffer-create " *Org tags*")))
+      (erase-buffer)
+      (org-set-local 'org-done-keywords done-keywords)
+      (setq tbl fulltable char ?a cnt 0)
+      (while (setq e (pop tbl))
+       (cond
+        ((equal e '(:startgroup))
+         (push '() groups) (setq ingroup t)
+         (when (not (= cnt 0))
+           (setq cnt 0)
+           (insert "\n"))
+         (insert "{ "))
+        ((equal e '(:endgroup))
+         (setq ingroup nil cnt 0)
+         (insert "}\n"))
+        (t
+         (setq tg (car e) c (cdr e))
+         (if ingroup (push tg (car groups)))
+         (setq tg (org-add-props tg nil 'face
+                                 (org-get-todo-face tg)))
+         (if (and (= cnt 0) (not ingroup)) (insert "  "))
+         (insert "[" c "] " tg (make-string
+                                (- fwidth 4 (length tg)) ?\ ))
+         (when (= (setq cnt (1+ cnt)) ncol)
+           (insert "\n")
+           (if ingroup (insert "  "))
+           (setq cnt 0)))))
+      (insert "\n")
+      (goto-char (point-min))
+      (if (and (not expert) (fboundp 'fit-window-to-buffer))
+         (fit-window-to-buffer))
+      (message "[a-z..]:Set [SPC]:clear")
+      (setq c (let ((inhibit-quit t)) (read-char-exclusive)))
+      (cond
+       ((or (= c ?\C-g)
+           (and (= c ?q) (not (rassoc c fulltable))))
+       (setq quit-flag t))
+       ((= c ?\ ) 'none)
+       ((setq e (rassoc c fulltable) tg (car e))
+       tg)
+       (t (setq quit-flag t))))))
+
 (defun org-get-repeat ()
   "Check if tere is a deadline/schedule with repeater in this entry."
   (save-match-data
@@ -12844,8 +13213,7 @@ be removed."
             (if (not (equal (char-before) ?\ )) " " "")
             (cond ((eq what 'scheduled) org-scheduled-string)
                   ((eq what 'deadline) org-deadline-string)
-                  ((eq what 'closed) org-closed-string)
-                  ((eq what 'archived) org-archived-string))
+                  ((eq what 'closed) org-closed-string))
             " ")
            (org-insert-time-stamp
             time
@@ -12881,17 +13249,22 @@ The auto-repeater uses this.")
                            "[^\r\n]*\\)?"))
        (goto-char (match-end 0))
        (unless org-log-states-order-reversed
-         (if (looking-at "\n[ \t]*- State") (forward-char 1))
-         (while (looking-at "[ \t]*- State")
-           (condition-case nil
-               (org-next-item)
-             (error (org-end-of-item))))
+         (and (= (char-after) ?\n) (forward-char 1))
+         (org-skip-over-state-notes)
          (skip-chars-backward " \t\n\r")))
       (move-marker org-log-note-marker (point))
       (setq org-log-note-purpose purpose)
       (setq org-log-note-state state)
       (add-hook 'post-command-hook 'org-add-log-note 'append))))
 
+(defun org-skip-over-state-notes ()
+  "Skip past the list of State notes in an entry."
+  (if (looking-at "\n[ \t]*- State") (forward-char 1))
+  (while (looking-at "[ \t]*- State")
+    (condition-case nil
+       (org-next-item)
+      (error (org-end-of-item)))))
+
 (defun org-add-log-note (&optional purpose)
   "Pop up a window for taking a note, and add this note later at point."
   (remove-hook 'post-command-hook 'org-add-log-note)
@@ -12900,10 +13273,10 @@ The auto-repeater uses this.")
   (move-marker org-log-note-return-to (point))
   (switch-to-buffer (marker-buffer org-log-note-marker))
   (goto-char org-log-note-marker)
-  (switch-to-buffer-other-window "*Org Note*")
+  (org-switch-to-buffer-other-window "*Org Note*")
   (erase-buffer)
   (let ((org-inhibit-startup t)) (org-mode))
-  (insert (format "# Insert note for %s, finish with C-c C-c.\n\n"
+  (insert (format "# Insert note for %s, finish with C-c C-c, or cancel with C-u C-c C-c.\n\n"
                  (cond
                   ((eq org-log-note-purpose 'clock-out) "stopped clock")
                   ((eq org-log-note-purpose 'done)  "closed todo item")
@@ -12936,6 +13309,7 @@ The auto-repeater uses this.")
                                "")))))
       (if lines (setq note (concat note " \\\\")))
       (push note lines))
+    (when current-prefix-arg (setq lines nil))
     (when lines
       (save-excursion
        (set-buffer (marker-buffer org-log-note-marker))
@@ -13095,6 +13469,9 @@ ACTION can be `set', `up', `down', or a character."
            (setq new action)
          (message "Priority %c-%c, SPC to remove: " org-highest-priority org-lowest-priority)
          (setq new (read-char-exclusive)))
+       (if (and (= (upcase org-highest-priority) org-highest-priority)
+                (= (upcase org-lowest-priority) org-lowest-priority))
+           (setq new (upcase new)))
        (cond ((equal new ?\ ) (setq remove t))
              ((or (< (upcase new) org-highest-priority) (> (upcase new) org-lowest-priority))
               (error "Priority must be between `%c' and `%c'"
@@ -13104,7 +13481,9 @@ ACTION can be `set', `up', `down', or a character."
        ((eq action 'down)
        (setq new (1+ current)))
        (t (error "Invalid action")))
-      (setq new (min (max org-highest-priority (upcase new)) org-lowest-priority))
+      (if (or (< (upcase new) org-highest-priority)
+             (> (upcase new) org-lowest-priority))
+         (setq remove t))
       (setq news (format "%c" new))
       (if have
          (if remove
@@ -13381,7 +13760,9 @@ also TODO lines."
 With prefix ARG, realign all tags in headings in the current buffer."
   (interactive "P")
   (let* ((re (concat "^" outline-regexp))
-        (current (org-get-tags))
+        (current (org-get-tags-string))
+        (col (current-column))
+        (org-setting-tags t)
         table current-tags inherited-tags ; computed below when needed
         tags p0 c0 c1 rpl)
     (if arg
@@ -13406,7 +13787,9 @@ With prefix ARG, realign all tags in headings in the current buffer."
                (if (or (eq t org-use-fast-tag-selection)
                        (and org-use-fast-tag-selection
                             (delq nil (mapcar 'cdr table))))
-                   (org-fast-tag-selection current-tags inherited-tags table)
+                   (org-fast-tag-selection
+                    current-tags inherited-tags table
+                    (if org-fast-tag-selection-include-todo org-todo-key-alist))
                  (let ((org-add-colon-after-tag-completion t))
                    (org-trim
                     (completing-read "Tags: " 'org-tags-completion-function
@@ -13438,7 +13821,49 @@ With prefix ARG, realign all tags in headings in the current buffer."
        (replace-match rpl t t)
        (and (not (featurep 'xemacs)) c0 (tabify p0 (point)))
        tags)
-       (t (error "Tags alignment failed"))))))
+       (t (error "Tags alignment failed")))
+      (move-to-column col)
+      (unless just-align
+       (run-hooks 'org-after-tags-change-hook)))))
+
+(defun org-change-tag-in-region (beg end tag off)
+  "Add or remove TAG for each entry in the region.
+This works in the agenda, and also in an org-mode buffer."
+  (interactive
+   (list (region-beginning) (region-end)
+        (let ((org-last-tags-completion-table
+               (if (org-mode-p)
+                   (org-get-buffer-tags)
+                 (org-global-tags-completion-table))))
+          (completing-read
+           "Tag: " 'org-tags-completion-function nil nil nil
+           'org-tags-history))
+        (progn
+          (message "[s]et or [r]emove? ")
+          (equal (read-char-exclusive) ?r))))
+  (if (fboundp 'deactivate-mark) (deactivate-mark))
+  (let ((agendap (equal major-mode 'org-agenda-mode))
+       l1 l2 m buf pos newhead (cnt 0))
+    (goto-char end)
+    (setq l2 (1- (org-current-line)))
+    (goto-char beg)
+    (setq l1 (org-current-line))
+    (loop for l from l1 to l2 do
+         (goto-line l)
+         (setq m (get-text-property (point) 'org-hd-marker))
+         (when (or (and (org-mode-p) (org-on-heading-p))
+                   (and agendap m))
+           (setq buf (if agendap (marker-buffer m) (current-buffer))
+                 pos (if agendap m (point)))
+           (with-current-buffer buf
+             (save-excursion
+               (save-restriction
+                 (goto-char pos)
+                 (setq cnt (1+ cnt))
+                 (org-toggle-tag tag (if off 'off 'on))
+                 (setq newhead (org-get-heading)))))
+           (and agendap (org-agenda-change-all-lines newhead m))))
+    (message "Tag :%s: %s in %d headings" tag (if off "removed" "set") cnt)))
 
 (defun org-tags-completion-function (string predicate &optional flag)
   (let (s1 s2 rtn (ctable org-last-tags-completion-table)
@@ -13491,17 +13916,19 @@ With prefix ARG, realign all tags in headings in the current buffer."
       (put-text-property 0 (length s) 'face '(secondary-selection org-tag) s)
       (org-overlay-display org-tags-overlay (concat prefix s)))))
 
-(defun org-fast-tag-selection (current inherited table)
+(defun org-fast-tag-selection (current inherited table &optional todo-table)
   "Fast tag selection with single keys.
 CURRENT is the current list of tags in the headline, INHERITED is the
 list of inherited tags, and TABLE is an alist of tags and corresponding keys,
-possibly with grouping information.
+possibly with grouping information.  TODO-TABLE is a similar table with
+TODO keywords, should these have keys assigned to them.
 If the keys are nil, a-z are automatically assigned.
 Returns the new tags string, or nil to not change the current settings."
-  (let* ((maxlen (apply 'max (mapcar
+  (let* ((fulltable (append table todo-table))
+        (maxlen (apply 'max (mapcar
                              (lambda (x)
                                (if (stringp (car x)) (string-width (car x)) 0))
-                             table)))
+                             fulltable)))
         (buf (current-buffer))
         (expert (eq org-fast-tag-selection-single-key 'expert))
         (buffer-tags nil)
@@ -13512,6 +13939,7 @@ Returns the new tags string, or nil to not change the current settings."
         tg cnt e c char c1 c2 ntable tbl rtn
         ov-start ov-end ov-prefix
         (exit-after-next org-fast-tag-selection-single-key)
+        (done-keywords org-done-keywords)
         groups ingroup)
     (save-excursion
       (beginning-of-line 1)
@@ -13535,13 +13963,14 @@ Returns the new tags string, or nil to not change the current settings."
          (set-buffer (get-buffer-create " *Org tags*"))
        (delete-other-windows)
        (split-window-vertically)
-       (switch-to-buffer-other-window (get-buffer-create " *Org tags*")))
+       (org-switch-to-buffer-other-window (get-buffer-create " *Org tags*")))
       (erase-buffer)
+      (org-set-local 'org-done-keywords done-keywords)
       (org-fast-tag-insert "Inherited" inherited i-face "\n")
       (org-fast-tag-insert "Current" current c-face "\n\n")
       (org-fast-tag-show-exit exit-after-next)
       (org-set-current-tags-overlay current ov-prefix)
-      (setq tbl table char ?a cnt 0)
+      (setq tbl fulltable char ?a cnt 0)
       (while (setq e (pop tbl))
        (cond
         ((equal e '(:startgroup))
@@ -13569,6 +13998,8 @@ Returns the new tags string, or nil to not change the current settings."
          (if ingroup (push tg (car groups)))
          (setq tg (org-add-props tg nil 'face
                                  (cond
+                                  ((not (assoc tg table))
+                                   (org-get-todo-face tg))
                                   ((member tg current) c-face)
                                   ((member tg inherited) i-face)
                                   (t nil))))
@@ -13605,7 +14036,7 @@ Returns the new tags string, or nil to not change the current settings."
                    (setq expert nil)
                    (delete-other-windows)
                    (split-window-vertically)
-                   (switch-to-buffer-other-window " *Org tags*")
+                   (org-switch-to-buffer-other-window " *Org tags*")
                    (and (fboundp 'fit-window-to-buffer)
                         (fit-window-to-buffer))))
                 ((or (= c ?\C-g)
@@ -13629,6 +14060,10 @@ Returns the new tags string, or nil to not change the current settings."
                        (setq current (delete tg current))
                      (push tg current)))
                  (if exit-after-next (setq exit-after-next 'now)))
+                ((setq e (rassoc c todo-table) tg (car e))
+                 (with-current-buffer buf
+                   (save-excursion (org-todo tg)))
+                 (if exit-after-next (setq exit-after-next 'now)))
                 ((setq e (rassoc c ntable) tg (car e))
                  (if (member tg current)
                      (setq current (delete tg current))
@@ -13654,19 +14089,20 @@ Returns the new tags string, or nil to not change the current settings."
                (while (re-search-forward
                        (org-re "\\[.\\] \\([[:alnum:]_@]+\\)") nil t)
                  (setq tg (match-string 1))
-                 (add-text-properties (match-beginning 1) (match-end 1)
-                                      (list 'face
-                                            (cond
-                                             ((member tg current) c-face)
-                                             ((member tg inherited) i-face)
-                                             (t nil)))))
+                 (add-text-properties
+                  (match-beginning 1) (match-end 1)
+                  (list 'face
+                        (cond
+                         ((member tg current) c-face)
+                         ((member tg inherited) i-face)
+                         (t (get-text-property (match-beginning 1) 'face))))))
                (goto-char (point-min)))))
       (org-detach-overlay org-tags-overlay)
       (if rtn
          (mapconcat 'identity current ":")
        nil))))
 
-(defun org-get-tags ()
+(defun org-get-tags-string ()
   "Get the TAGS string in the current headline."
   (unless (org-on-heading-p t)
     (error "Not on a heading"))
@@ -13676,6 +14112,10 @@ Returns the new tags string, or nil to not change the current settings."
        (org-match-string-no-properties 1)
       "")))
 
+(defun org-get-tags ()
+  "Get the list of tags specified in the current headline."
+  (org-split-string (org-get-tags-string) ":"))
+
 (defun org-get-buffer-tags ()
   "Get a table of all tags used in the buffer, for completion."
   (let (tags)
@@ -13733,7 +14173,7 @@ but in some other way.")
   ;; This is used by C-c C-c for property action.
   (save-excursion
     (beginning-of-line 1)
-    (looking-at "^[ \t]*\\(:\\([a-zA-Z_0-9]+\\):\\)[ \t]*\\(.*\\)")))
+    (looking-at (org-re "^[ \t]*\\(:\\([[:alpha:]][[:alnum:]_-]*\\):\\)[ \t]*\\(.*\\)"))))
 
 (defmacro org-with-point-at (pom &rest body)
   "Move to buffer and point of point-or-marker POM for the duration of BODY."
@@ -13800,7 +14240,8 @@ If WHICH is nil or `all', get all properties.  If WHICH is
              (push (cons "TODO" (org-match-string-no-properties 2)) props))
            (when (looking-at org-priority-regexp)
              (push (cons "PRIORITY" (org-match-string-no-properties 2)) props))
-           (when (and (setq value (org-get-tags)) (string-match "\\S-" value))
+           (when (and (setq value (org-get-tags-string))
+                      (string-match "\\S-" value))
              (push (cons "TAGS" value) props))
            (when (setq value (org-get-tags-at))
              (push (cons "ALLTAGS" (concat ":" (mapconcat 'identity value ":") ":"))
@@ -13822,7 +14263,7 @@ If WHICH is nil or `all', get all properties.  If WHICH is
            (when range
              (goto-char (car range))
              (while (re-search-forward
-                     "^[ \t]*:\\([a-zA-Z][a-zA-Z_0-9]*\\):[ \t]*\\(\\S-.*\\)?"
+                     (org-re "^[ \t]*:\\([[:alpha:]][[:alnum:]_-]*\\):[ \t]*\\(\\S-.*\\)?")
                      (cdr range) t)
                (setq key (org-match-string-no-properties 1)
                      value (org-trim (or (org-match-string-no-properties 2) "")))
@@ -13881,9 +14322,7 @@ If the property is not present at all, nil is returned."
            (org-back-to-heading t)
            (move-marker org-entry-property-inherited-from (point))
            (throw 'ex tmp))
-         (condition-case nil
-             (org-up-heading-all 1)
-           (error (throw 'ex nil))))))
+         (or (org-up-heading-safe) (throw 'ex nil)))))
     (or tmp (cdr (assoc property org-local-properties))
        (cdr (assoc property org-global-properties)))))
 
@@ -13950,7 +14389,9 @@ If the property is not present at all, nil is returned."
        (while (re-search-forward org-property-start-re nil t)
          (setq range (org-get-property-block))
          (goto-char (car range))
-         (while (re-search-forward "^[ \t]*:\\([a-zA-Z0-9]+\\):" (cdr range) t)
+         (while (re-search-forward
+                 (org-re "^[ \t]*:\\([[:alnum:]_-]+\\):")
+                 (cdr range) t)
            (add-to-list 'rtn (org-match-string-no-properties 1)))
          (outline-next-heading))))
     (when include-specials
@@ -13970,6 +14411,9 @@ If the property is not present at all, nil is returned."
     (while (re-search-forward re end t))
     (setq hiddenp (org-invisible-p))
     (end-of-line 1)
+    (and (= (char-after) ?\n) (forward-char 1))
+    (org-skip-over-state-notes)
+    (end-of-line 0)
     (insert "\n:PROPERTIES:\n:END:")
     (beginning-of-line 0)
     (org-indent-line-function)
@@ -14188,8 +14632,8 @@ This is the compiled version of the format.")
         (beg (point-at-bol))
         (level-face (save-excursion
                       (beginning-of-line 1)
-                      (looking-at "\\(\\**\\)\\(\\* \\)")
-                      (org-get-level-face 2)))
+                      (and (looking-at "\\(\\**\\)\\(\\* \\)")
+                           (org-get-level-face 2))))
         (color (list :foreground 
                      (face-attribute (or level-face 'default) :foreground)))
         props pom property ass width f string ov column)
@@ -14654,7 +15098,7 @@ display, or in the #+COLUMNS line of the current buffer."
 (defun org-columns-get-autowidth-alist (s cache)
   "Derive the maximum column widths from the format and the cache."
   (let ((start 0) rtn)
-    (while (string-match "%\\([a-zA-Z]\\S-*\\)" s start)
+    (while (string-match (org-re "%\\([[:alpha:]]\\S-*\\)") s start)
       (push (cons (match-string 1 s) 1) rtn)
       (setq start (match-end 0)))
     (mapc (lambda (x)
@@ -14813,8 +15257,9 @@ display, or in the #+COLUMNS line of the current buffer."
   "FIXME"
   (let ((start 0) width prop title op f)
     (setq org-columns-current-fmt-compiled nil)
-    (while (string-match "%\\([0-9]+\\)?\\([a-zA-Z_0-9]+\\)\\(?:(\\([^)]+\\))\\)?\\(?:{\\([^}]+\\)}\\)?\\s-*"
-                        fmt start)
+    (while (string-match
+           (org-re "%\\([0-9]+\\)?\\([[:alnum:]_-]+\\)\\(?:(\\([^)]+\\))\\)?\\(?:{\\([^}]+\\)}\\)?\\s-*")
+           fmt start)
       (setq start (match-end 0)
            width (match-string 1 fmt)
            prop (match-string 2 fmt)
@@ -15215,10 +15660,25 @@ Don't touch the rest."
 
 (defun org-deadline-close (timestamp-string &optional ndays)
   "Is the time in TIMESTAMP-STRING close to the current date?"
-  (and (< (org-days-to-time timestamp-string)
-         (or ndays org-deadline-warning-days))
+  (setq ndays (or ndays (org-get-wdays timestamp-string)))
+  (and (< (org-days-to-time timestamp-string) ndays)
        (not (org-entry-is-done-p))))
 
+(defun org-get-wdays (ts)
+  "Get the deadline lead time appropriate for timestring TS."
+  (cond
+   ((<= org-deadline-warning-days 0)
+    ;; 0 or negative, enforce this value no matter what
+    (- org-deadline-warning-days))
+   ((string-match "-\\([0-9]+\\)\\([dwmy]\\)\\(\\'\\|>\\)" ts)
+    ;; lead time is specified.
+    (floor (* (string-to-number (match-string 1 ts))
+             (cdr (assoc (match-string 2 ts)
+                         '(("d" . 1)    ("w" . 7)
+                           ("m" . 30.4) ("y" . 365.25)))))))
+   ;; go for the default.
+   (t org-deadline-warning-days)))
+
 (defun org-calendar-select-mouse (ev)
   "Return to `org-read-date' with the date currently selected.
 This is used by `org-read-date' in a temporary keymap for the calendar buffer."
@@ -15241,7 +15701,7 @@ days.  If the prefix is a raw \\[universal-argument] prefix, all deadlines are s
          (cond
           ((equal ndays '(4)) 100000)
           (ndays (prefix-numeric-value ndays))
-          (t org-deadline-warning-days)))
+          (t (abs org-deadline-warning-days))))
         (case-fold-search nil)
         (regexp (concat "\\<" org-deadline-string " *<\\([^>]+\\)>"))
         (callback
@@ -15343,6 +15803,12 @@ DAYNR."
                          (time-to-days (current-time))) (match-string 0 s)))
    (t (time-to-days (apply 'encode-time (org-parse-time-string s))))))
 
+(defun org-time-from-absolute (d)
+  "Return the time corresponding to date D.
+D may be an absolute day number, or a calendar-type list (month day year)."
+  (if (numberp d) (setq d (calendar-gregorian-from-absolute d)))
+  (encode-time 0 0 0 (nth 1 d) (car d) (nth 2 d)))
+
 (defun org-calendar-holiday ()
   "List of holidays, for Diary display in Org-mode."
   (let ((hl (check-calendar-holidays date)))
@@ -16290,7 +16756,8 @@ The following commands are available:
     "--"
     ("Tags and Properties"
      ["Show all Tags" org-agenda-show-tags t]
-     ["Set Tags" org-agenda-set-tags t]
+     ["Set Tags current line" org-agenda-set-tags (not (org-region-active-p))]
+     ["Change tag in region" org-agenda-set-tags (org-region-active-p)]
      "--"
      ["Column View" org-columns t])
     ("Date/Schedule"
@@ -16470,7 +16937,7 @@ next use of \\[org-agenda]) restricted to the current file."
       (setq org-agenda-last-dispatch-buffer (current-buffer))
       (save-window-excursion
        (delete-other-windows)
-       (switch-to-buffer-other-window " *Agenda Commands*")
+       (org-switch-to-buffer-other-window " *Agenda Commands*")
        (erase-buffer)
        (insert (eval-when-compile
                  (let ((header
@@ -16649,7 +17116,7 @@ before running the agenda command."
                    (list 'org-tags-view nil cmd-key)))
       (flet ((read-char-exclusive () (string-to-char cmd-key)))
        (eval (list 'let (nreverse pars) '(org-agenda nil)))))
-    (set-buffer "*Org Agenda*")
+    (set-buffer org-agenda-buffer-name)
     (princ (org-encode-for-stdout (buffer-string)))))
 
 (defun org-encode-for-stdout (string)
@@ -16704,7 +17171,7 @@ agenda-day   The day in the agenda where this is listed"
                    (list 'org-tags-view nil cmd-key)))
       (flet ((read-char-exclusive () (string-to-char cmd-key)))
        (eval (list 'let (nreverse pars) '(org-agenda nil)))))
-    (set-buffer "*Org Agenda*")
+    (set-buffer org-agenda-buffer-name)
     (let* ((lines (org-split-string (buffer-string) "\n"))
           line)
       (while (setq line (pop lines))
@@ -16767,13 +17234,12 @@ agenda-day   The day in the agenda where this is listed"
   (interactive)
   (eval (list 'org-batch-store-agenda-views)))
 
-(defvar org-agenda-buffer-name)
-
 ;; FIXME, why is this a macro?????
 ;;;###autoload
 (defmacro org-batch-store-agenda-views (&rest parameters)
   "Run all custom agenda commands that have a file argument."
   (let ((cmds org-agenda-custom-commands)
+       (pop-up-frames nil)
        (dir default-directory)
        pars cmd thiscmdkey files opts)
     (while parameters
@@ -16784,18 +17250,19 @@ agenda-day   The day in the agenda where this is listed"
        (setq cmd (pop cmds)
              thiscmdkey (car cmd)
              opts (nth 3 cmd)
-             files (org-last cmd))
+             files (nth 4 cmd))
        (if (stringp files) (setq files (list files)))
        (when files
          (flet ((read-char-exclusive () (string-to-char thiscmdkey)))
            (eval (list 'let (append org-agenda-exporter-settings opts pars)
                        '(org-agenda nil))))
-         (set-buffer "*Org Agenda*")
+         (set-buffer org-agenda-buffer-name)
          (while files
            (eval (list 'let (append org-agenda-exporter-settings opts pars)
                        (list 'org-write-agenda
-                             (expand-file-name (pop files) dir) t)))))
-       (kill-buffer org-agenda-buffer-name)))))
+                             (expand-file-name (pop files) dir) t))))
+         (and (get-buffer org-agenda-buffer-name)
+              (kill-buffer org-agenda-buffer-name)))))))
 
 (defun org-write-agenda (file &optional nosettings)
   "Write the current buffer (an agenda view) as a file.
@@ -16863,11 +17330,19 @@ higher priority settings."
   "Get the list of agenda files.
 Optional UNRESTRICTED means return the full list even if a restriction
 is currently in place."
-  (cond
-   ((and (not unrestricted) (get 'org-agenda-files 'org-restrict)))
-   ((stringp org-agenda-files) (org-read-agenda-file-list))
-   ((listp org-agenda-files) org-agenda-files)
-   (t (error "Invalid value of `org-agenda-files'"))))
+  (let ((files
+        (cond
+         ((and (not unrestricted) (get 'org-agenda-files 'org-restrict)))
+         ((stringp org-agenda-files) (org-read-agenda-file-list))
+         ((listp org-agenda-files) org-agenda-files)
+         (t (error "Invalid value of `org-agenda-files'")))))
+    (if org-agenda-skip-unavailable-files
+       (delq nil
+             (mapcar (function
+                      (lambda (file)
+                        (and (file-readable-p file) file)))
+                     files))
+      files))) ; `org-check-agenda-file' will remove them from the list
 
 (defun org-edit-agenda-file-list ()
   "Edit the list of agenda files.
@@ -16937,7 +17412,8 @@ If the file is not present in the list, it is added to the front.  If it is
 present, it is moved there.  With optional argument TO-END, add/move to the
 end of the list."
   (interactive "P")
-  (let ((file-alist (mapcar (lambda (x)
+  (let ((org-agenda-skip-unavailable-files nil)
+       (file-alist (mapcar (lambda (x)
                              (cons (file-truename x) x))
                            (org-agenda-files t)))
        (ctf (file-truename buffer-file-name))
@@ -16958,7 +17434,8 @@ end of the list."
 These are the files which are being checked for agenda entries.
 Optional argument FILE means, use this file instead of the current."
   (interactive)
-  (let* ((file (or file buffer-file-name))
+  (let* ((org-agenda-skip-unavailable-files nil)
+        (file (or file buffer-file-name))
         (true-file (file-truename file))
         (afile (abbreviate-file-name file))
         (files (delq nil (mapcar
@@ -17020,12 +17497,12 @@ Optional argument FILE means, use this file instead of the current."
        ((equal org-agenda-window-setup 'current-window)
        (switch-to-buffer abuf))
        ((equal org-agenda-window-setup 'other-window)
-       (switch-to-buffer-other-window abuf))
+       (org-switch-to-buffer-other-window abuf))
        ((equal org-agenda-window-setup 'other-frame)
        (switch-to-buffer-other-frame abuf))
        ((equal org-agenda-window-setup 'reorganize-frame)
        (delete-other-windows)
-       (switch-to-buffer-other-window abuf))))
+       (org-switch-to-buffer-other-window abuf))))
     (setq buffer-read-only nil)
     (erase-buffer)
     (org-agenda-mode)
@@ -17233,7 +17710,7 @@ dates."
         s e rtn d emptyp)
     (setq org-agenda-redo-command
          (list 'progn
-               (list 'switch-to-buffer-other-window (current-buffer))
+               (list 'org-switch-to-buffer-other-window (current-buffer))
                (list 'org-timeline (list 'quote include-all))))
     (if (not dopast)
        ;; Remove past dates from the list of dates.
@@ -17266,14 +17743,12 @@ dates."
                              entry date args)))
        (if (or rtn (equal d today) org-timeline-show-empty-dates)
            (progn
-             (insert (calendar-day-name date) " "
-                     (number-to-string (extract-calendar-day date)) " "
-                     (calendar-month-name (extract-calendar-month date)) " "
-                     (number-to-string (extract-calendar-year date)) "\n")
-; FIXME: this gives a timezone problem
-;            (insert (format-time-string org-agenda-date-format
-;                                        (calendar-time-from-absolute d 0))
-;                    "\n")
+             (insert
+              (if (stringp org-agenda-format-date)
+                  (format-time-string org-agenda-format-date
+                                      (org-time-from-absolute date))
+                (funcall org-agenda-format-date date))
+              "\n")
              (put-text-property s (1- (point)) 'face 'org-agenda-structure)
              (put-text-property s (1- (point)) 'org-date-line t)
              (if (equal d today)
@@ -17336,7 +17811,7 @@ When EMPTY is non-nil, also include days without any entries."
 (defvar org-starting-day nil) ; local variable in the agenda buffer
 (defvar org-agenda-span nil) ; local variable in the agenda buffer
 (defvar org-include-all-loc nil) ; local variable
-
+(defvar org-agenda-remove-date nil) ; dynamically scoped
 
 ;;;###autoload
 (defun org-agenda-list (&optional include-all start-day ndays)
@@ -17446,14 +17921,12 @@ NDAYS defaults to `org-agenda-ndays'."
            (setq rtnall (append rtnall rtn))))
       (if (or rtnall org-agenda-show-all-dates)
          (progn
-           (insert (format "%-9s %2d %s %4d\n"
-                           (calendar-day-name date)
-                           (extract-calendar-day date)
-                           (calendar-month-name (extract-calendar-month date))
-                           (extract-calendar-year date)))
-; FIXME: this gives a timezone problem
-;          (insert (format-time-string org-agenda-date-format
-;                                      (calendar-time-from-absolute d 0)) "\n")
+           (insert
+            (if (stringp org-agenda-format-date)
+                (format-time-string org-agenda-format-date
+                                    (org-time-from-absolute date))
+              (funcall org-agenda-format-date date))
+            "\n")
            (put-text-property s (1- (point)) 'face 'org-agenda-structure)
            (put-text-property s (1- (point)) 'org-date-line t)
            (if todayp (put-text-property s (1- (point)) 'org-today t))
@@ -17688,10 +18161,10 @@ that can be put into `org-agenda-skip-function' for the duration of a command."
           (not (re-search-forward org-deadline-time-regexp end t)))
       (and (setq m (memq 'regexp conditions))
           (stringp (setq r (nth 1 m)))
-          (re-search-forward m end t))
+          (re-search-forward (nth 1 m) end t))
       (and (setq m (memq 'notregexp conditions))
           (stringp (setq r (nth 1 m)))
-          (not (re-search-forward m end t))))
+          (not (re-search-forward (nth 1 m) end t))))
      end)))
 
 (defun org-agenda-list-stuck-projects (&rest ignore)
@@ -17748,6 +18221,7 @@ MATCH is being ignored."
   "Get the (Emacs Calendar) diary entries for DATE."
   (let* ((fancy-diary-buffer "*temporary-fancy-diary-buffer*")
         (diary-display-hook '(fancy-diary-display))
+        (pop-up-frames nil)
         (list-diary-entries-hook
          (cons 'org-diary-default-entry list-diary-entries-hook))
         (diary-file-name-prefix-function nil) ; turn this feature off
@@ -18018,7 +18492,7 @@ the documentation of `org-diary'."
                    (and org-agenda-todo-ignore-deadlines (goto-char beg)
                         (re-search-forward org-deadline-time-regexp end t)
                         (org-deadline-close (match-string 1))))
-           (goto-char beg)
+           (goto-char (1+ beg))
            (or org-agenda-todo-list-sublevels (org-end-of-subtree 'invisible))
            (throw :skip nil)))
        (goto-char beg)
@@ -18053,6 +18527,13 @@ the documentation of `org-diary'."
                      (format "mouse-2 or RET jump to org file %s"
                              (abbreviate-file-name buffer-file-name))))
         (d1 (calendar-absolute-from-gregorian date))
+        (remove-re
+         (concat
+          (regexp-quote
+           (format-time-string
+            "<%Y-%m-%d"
+            (encode-time 0 0 0 (nth 1 date) (nth 0 date) (nth 2 date))))
+          ".*?>"))
         (regexp
          (concat
           (regexp-quote
@@ -18100,7 +18581,8 @@ the documentation of `org-diary'."
                      tags (org-get-tags-at))
                (looking-at "\\*+[ \t]+\\([^\r\n]+\\)")
                (setq txt (org-format-agenda-item
-                          nil (match-string 1) category tags timestr)))
+                          nil (match-string 1) category tags timestr nil
+                          remove-re)))
            (setq txt org-agenda-no-heading-message))
          (setq priority (org-get-priority txt))
          (org-add-props txt props
@@ -18220,7 +18702,7 @@ the documentation of `org-diary'."
         (todayp (equal date (calendar-current-date))) ; DATE bound by calendar
         (d1 (calendar-absolute-from-gregorian date))  ; DATE bound by calendar
         d2 diff dfrac wdays pos pos1 category tags
-        ee txt head face s upcomingp)
+        ee txt head face s upcomingp donep timestr)
     (goto-char (point-min))
     (while (re-search-forward regexp nil t)
       (catch :skip
@@ -18228,17 +18710,10 @@ the documentation of `org-diary'."
        (setq s (match-string 1)
              pos (1- (match-beginning 1))
              d2 (org-time-string-to-absolute (match-string 1) d1)
-             diff (- d2 d1))
-       (if (string-match "-\\([0-9]+\\)\\([dwmy]\\)\\'" s)
-           (setq wdays
-                 (floor
-                  (* (string-to-number (match-string 1 s))
-                     (cdr (assoc (match-string 2 s)
-                                 '(("d" . 1)    ("w" . 7)
-                                   ("m" . 30.4) ("y" . 365.25)))))))
-         (setq wdays org-deadline-warning-days))
-       (setq dfrac (/ (* 1.0 (- wdays diff)) wdays))
-       (setq upcomingp (and todayp (> diff 0)))
+             diff (- d2 d1)
+             wdays (org-get-wdays s)
+             dfrac (/ (* 1.0 (- wdays diff)) wdays)
+             upcomingp (and todayp (> diff 0)))
        ;; When to show a deadline in the calendar:
        ;; If the expiration is within wdays warning time.
        ;; Past-due deadlines are only shown on the current date
@@ -18255,14 +18730,20 @@ the documentation of `org-diary'."
                                (point)
                                (progn (skip-chars-forward "^\r\n")
                                       (point))))
-                   (if (and org-agenda-skip-deadline-if-done
-                            (string-match org-looking-at-done-regexp head))
+                   (setq donep (string-match org-looking-at-done-regexp head))
+                   (if (string-match " \\([012]?[0-9]:[0-9][0-9]\\)" s)
+                       (setq timestr
+                             (concat (substring s (match-beginning 1)) " "))
+                     (setq timestr 'time))
+                   (if (and donep
+                            (or org-agenda-skip-deadline-if-done
+                                (not (= diff 0))))
                        (setq txt nil)
                      (setq txt (org-format-agenda-item
                                 (if (= diff 0)
                                     "Deadline:  "
                                   (format "In %3d d.: " diff))
-                                head category tags))))
+                                head category tags timestr))))
                (setq txt org-agenda-no-heading-message))
              (when txt
                (setq face (org-agenda-deadline-face dfrac))
@@ -18274,9 +18755,10 @@ the documentation of `org-diary'."
                  'org-category category
                  'type (if upcomingp "upcoming-deadline" "deadline")
                  'date (if upcomingp date d2)
-                 'face face 'undone-face face 'done-face 'org-done)
+                 'face (if donep 'org-done face)
+                 'undone-face face 'done-face 'org-done)
                (push txt ee))))))
-    ee))
+    (nreverse ee)))
 
 (defun org-agenda-deadline-face (fraction)
   "Return the face to displaying a deadline item.
@@ -18300,15 +18782,16 @@ FRACTION is what fraction of the head-warning time has passed."
         (todayp (equal date (calendar-current-date))) ; DATE bound by calendar
         (d1 (calendar-absolute-from-gregorian date))  ; DATE bound by calendar
         d2 diff pos pos1 category tags
-        ee txt head pastduep donep face)
+        ee txt head pastschedp donep face timestr s)
     (goto-char (point-min))
     (while (re-search-forward regexp nil t)
       (catch :skip
        (org-agenda-skip)
-       (setq pos (1- (match-beginning 1))
+       (setq s (match-string 1)
+             pos (1- (match-beginning 1))
              d2 (org-time-string-to-absolute (match-string 1) d1)
              diff (- d2 d1))
-       (setq pastduep (and todayp (< diff 0)))
+       (setq pastschedp (and todayp (< diff 0)))
        ;; When to show a scheduled item in the calendar:
        ;; If it is on or past the date.
        (if (or (and (< diff 0) todayp)
@@ -18324,16 +18807,22 @@ FRACTION is what fraction of the head-warning time has passed."
                                (point)
                                (progn (skip-chars-forward "^\r\n") (point))))
                    (setq donep (string-match org-looking-at-done-regexp head))
-                   (if (and org-agenda-skip-scheduled-if-done donep)
+                   (if (string-match " \\([012]?[0-9]:[0-9][0-9]\\)" s)
+                       (setq timestr
+                             (concat (substring s (match-beginning 1)) " "))
+                     (setq timestr 'time))
+                   (if (and donep
+                            (or org-agenda-skip-scheduled-if-done
+                                (not (= diff 0))))
                        (setq txt nil)
                      (setq txt (org-format-agenda-item
                                 (if (= diff 0)
                                     "Scheduled: "
                                   (format "Sched.%2dx: " (- 1 diff)))
-                                head category tags))))
+                                head category tags timestr))))
                (setq txt org-agenda-no-heading-message))
              (when txt
-               (setq face (if pastduep
+               (setq face (if pastschedp
                               'org-scheduled-previously
                             'org-scheduled-today))
                (org-add-props txt props
@@ -18341,12 +18830,12 @@ FRACTION is what fraction of the head-warning time has passed."
                  'face (if donep 'org-done face)
                  'org-marker (org-agenda-new-marker pos)
                  'org-hd-marker (org-agenda-new-marker pos1)
-                 'type (if pastduep "past-scheduled" "scheduled")
-                 'date (if pastduep d2 date)
+                 'type (if pastschedp "past-scheduled" "scheduled")
+                 'date (if pastschedp d2 date)
                  'priority (+ (- 5 diff) (org-get-priority txt))
                  'org-category category)
                (push txt ee))))))
-    ee))
+    (nreverse ee)))
 
 (defun org-agenda-get-blocks ()
   "Return the date-range information for agenda display."
@@ -18436,7 +18925,7 @@ The flag is set if the currently compiled format contains a `%t'.")
 The flag is set if the currently compiled format contains a `%T'.")
 
 (defun org-format-agenda-item (extra txt &optional category tags dotime
-                                    noprefix)
+                                    noprefix remove-re)
   "Format TXT to be inserted into the agenda buffer.
 In particular, it adds the prefix and corresponding text properties.  EXTRA
 must be a string and replaces the `%s' specifier in the prefix format.
@@ -18447,7 +18936,8 @@ time-of-day should be extracted from TXT for sorting of this entry, and for
 the `%t' specifier in the format.  When DOTIME is a string, this string is
 searched for a time before TXT is.  NOPREFIX is a flag and indicates that
 only the correctly processes TXT should be returned - this is used by
-`org-agenda-change-all-lines'.  TAGS can be the tags of the headline."
+`org-agenda-change-all-lines'.  TAGS can be the tags of the headline.
+Any match of REMOVE-RE will be removed from TXT."
   (save-match-data
     ;; Diary entries sometimes have extra whitespace at the beginning
     (if (string-match "^ +" txt) (setq txt (replace-match "" nil nil txt)))
@@ -18505,6 +18995,10 @@ only the correctly processes TXT should be returned - this is used by
                             (match-string 2 txt))
                     t t txt))))
 
+      (when remove-re
+       (while (string-match remove-re txt)
+         (setq txt (replace-match "" t t txt))))
+
       ;; Create the final string
       (if noprefix
          (setq rtn txt)
@@ -18646,16 +19140,18 @@ HH:MM."
     (if (eq x 'line)
        (save-excursion
          (beginning-of-line 1)
-         (setq re (get-text-property (point) 'org-not-done-regexp))
+         (setq re (get-text-property (point) 'org-todo-regexp))
          (goto-char (+ (point) (or (get-text-property (point) 'prefix-length) 0)))
          (and (looking-at (concat "[ \t]*\\.*" re))
               (add-text-properties (match-beginning 0) (match-end 0)
-                                   '(face org-todo))))
-      (setq re (concat (get-text-property 0 'org-not-done-regexp x))
+                                   (list 'face (org-get-todo-face 0)))))
+      (setq re (concat (get-text-property 0 'org-todo-regexp x))
            pl (get-text-property 0 'prefix-length x))
       (and re (equal (string-match (concat "\\(\\.*\\)" re) x (or pl 0)) pl)
-          (add-text-properties (or (match-end 1) (match-end 0)) (match-end 0)
-                               '(face org-todo) x))
+          (add-text-properties
+           (or (match-end 1) (match-end 0)) (match-end 0)
+           (list 'face (org-get-todo-face (match-string 2 x)))
+           x))
       x)))
 
 (defsubst org-cmp-priority (a b)
@@ -19032,8 +19528,13 @@ and by additional input from the age of a schedules or deadline entry."
       (save-excursion
        (and (outline-next-heading)
             (org-flag-heading nil)))) ; show the next heading
+    (run-hooks 'org-agenda-after-show-hook)
     (and highlight (org-highlight (point-at-bol) (point-at-eol)))))
 
+(defvar org-agenda-after-show-hook nil
+  "Normal hook run after an item has been shown from the agenda.
+Point is in the buffer where the item originated.")
+
 (defun org-agenda-kill ()
   "Kill the entry or subtree belonging to the current agenda entry."
   (interactive)
@@ -19050,7 +19551,7 @@ and by additional input from the age of a schedules or deadline entry."
         (goto-char pos)
         (if (and (org-mode-p) (not (member type '("sexp"))))
             (setq dbeg (progn (org-back-to-heading t) (point))
-                  dend (org-end-of-subtree t))
+                  dend (org-end-of-subtree t t))
           (setq dbeg (point-at-bol)
                 dend (min (point-max) (1+ (point-at-eol)))))
         (goto-char dbeg)
@@ -19342,7 +19843,7 @@ POS defaults to point.  If tags are inherited, the list contains
 the targets in the same sequence as the headlines appear, i.e.
 the tags of the current headline come last."
   (interactive)
-  (let (tags)
+  (let (tags lastpos)
     (save-excursion
       (save-restriction
        (widen)
@@ -19350,7 +19851,8 @@ the tags of the current headline come last."
        (save-match-data
          (org-back-to-heading t)
          (condition-case nil
-             (while t
+             (while (not (equal lastpos (point)))
+               (setq lastpos (point))
                (if (looking-at (org-re "[^\r\n]+?:\\([[:alnum:]_@:]+\\):[ \t]*$"))
                    (setq tags (append (org-split-string
                                        (org-match-string-no-properties 1) ":")
@@ -19365,28 +19867,30 @@ the tags of the current headline come last."
   "Set tags for the current headline."
   (interactive)
   (org-agenda-check-no-diary)
-  (org-agenda-show)   ;;; FIXME This is a stupid hack and should not be needed
-  (let* ((hdmarker (or (get-text-property (point) 'org-hd-marker)
-                       (org-agenda-error)))
-        (buffer (marker-buffer hdmarker))
-        (pos (marker-position hdmarker))
-        (inhibit-read-only t)
-        newhead)
-    (org-with-remote-undo buffer
-      (with-current-buffer buffer
-       (widen)
-       (goto-char pos)
-       (save-excursion
-         (org-show-context 'agenda))
-       (save-excursion
-         (and (outline-next-heading)
-              (org-flag-heading nil)))   ; show the next heading
-       (goto-char pos)
-       (call-interactively 'org-set-tags)
-       (end-of-line 1)
-       (setq newhead (org-get-heading)))
-      (org-agenda-change-all-lines newhead hdmarker)
-      (beginning-of-line 1))))
+  (if (and (org-region-active-p) (interactive-p))
+      (call-interactively 'org-change-tag-in-region)
+    (org-agenda-show)   ;;; FIXME This is a stupid hack and should not be needed
+    (let* ((hdmarker (or (get-text-property (point) 'org-hd-marker)
+                        (org-agenda-error)))
+          (buffer (marker-buffer hdmarker))
+          (pos (marker-position hdmarker))
+          (inhibit-read-only t)
+          newhead)
+      (org-with-remote-undo buffer
+       (with-current-buffer buffer
+         (widen)
+         (goto-char pos)
+         (save-excursion
+           (org-show-context 'agenda))
+         (save-excursion
+           (and (outline-next-heading)
+                (org-flag-heading nil)))   ; show the next heading
+         (goto-char pos)
+         (call-interactively 'org-set-tags)
+         (end-of-line 1)
+         (setq newhead (org-get-heading)))
+       (org-agenda-change-all-lines newhead hdmarker)
+       (beginning-of-line 1)))))
 
 (defun org-agenda-toggle-archive-tag ()
   "Toggle the archive tag for the current entry."
@@ -19518,11 +20022,15 @@ be used to request time specification in the time stamp."
        (setq ts (org-deadline))
        (message "Deadline for this item set to %s" ts)))))
 
-(defun org-get-heading ()
+(defun org-get-heading (&optional no-tags)
   "Return the heading of the current entry, without the stars."
   (save-excursion
     (org-back-to-heading t)
-    (if (looking-at "\\*+[ \t]+\\([^\r\n]*\\)")        (match-string 1) "")))
+    (if (looking-at
+        (if no-tags 
+            (org-re "\\*+[ \t]+\\([^\n\r]*?\\)\\([ \t]+:[[:alnum:]:_@]+:[ \t]*\\)?$")
+          "\\*+[ \t]+\\([^\r\n]*\\)"))
+       (match-string 1) "")))
 
 (defun org-agenda-clock-in (&optional arg)
   "Start the clock on the currently selected item."
@@ -19681,6 +20189,7 @@ This is a command that has to be installed in `calendar-mode-map'."
             "Hebrew:     " (calendar-hebrew-date-string date) " (until sunset)\n"
             "Islamic:    " (calendar-islamic-date-string date) " (until sunset)\n"
             "French:     " (calendar-french-date-string date) "\n"
+            "Baha'i:     " (calendar-bahai-date-string date) " (until sunset)\n"
             "Mayan:      " (calendar-mayan-date-string date) "\n"
             "Coptic:     " (calendar-coptic-date-string date) "\n"
             "Ethiopic:   " (calendar-ethiopic-date-string date) "\n"
@@ -20055,7 +20564,7 @@ The images can be removed again with \\[org-ctrl-c-ctrl-c]."
   (save-excursion
     (goto-char 0)
     (let ((re (org-make-options-regexp
-              '("TITLE" "AUTHOR" "EMAIL" "TEXT" "OPTIONS" "LANGUAGE")))
+              '("TITLE" "AUTHOR" "DATE" "EMAIL" "TEXT" "OPTIONS" "LANGUAGE")))
          p key val text options)
       (while (re-search-forward re nil t)
        (setq key (org-match-string-no-properties 1)
@@ -20064,6 +20573,7 @@ The images can be removed again with \\[org-ctrl-c-ctrl-c]."
         ((string-equal key "TITLE") (setq p (plist-put p :title val)))
         ((string-equal key "AUTHOR")(setq p (plist-put p :author val)))
         ((string-equal key "EMAIL") (setq p (plist-put p :email val)))
+        ((string-equal key "DATE") (setq p (plist-put p :date val)))
         ((string-equal key "LANGUAGE") (setq p (plist-put p :language val)))
         ((string-equal key "TEXT")
          (setq text (if text (concat text "\n" val) val)))
@@ -20501,6 +21011,7 @@ translations.  There is currently no way for users to extend this.")
         (asciip (plist-get parameters :for-ascii))
         (latexp (plist-get parameters :for-LaTeX))
         (commentsp (plist-get parameters :comments))
+        (archived-trees (plist-get parameters :archived-trees))
         (inhibit-read-only t)
         (outline-regexp "\\*+ ")
         a b xx
@@ -20528,13 +21039,13 @@ translations.  There is currently no way for users to extend this.")
        (insert (plist-get parameters :add-text) "\n"))
 
       ;; Get rid of archived trees
-      (when (not (eq org-export-with-archived-trees t))
+      (when (not (eq archived-trees t))
        (goto-char (point-min))
        (while (re-search-forward re-archive nil t)
          (if (not (org-on-heading-p t))
              (org-end-of-subtree t)
            (beginning-of-line 1)
-           (setq a (if org-export-with-archived-trees
+           (setq a (if archived-trees
                        (1+ (point-at-eol)) (point))
                  b (org-end-of-subtree t))
            (if (> b a) (delete-region a b)))))
@@ -20581,7 +21092,7 @@ translations.  There is currently no way for users to extend this.")
                                     '(org-protected t))
              (delete-region (match-beginning 0) (match-end 0))))))
 
-      ;; Protect quoted subtreedes
+      ;; Protect quoted subtrees
       (goto-char (point-min))
       (while (re-search-forward re-quote nil t)
        (goto-char (match-beginning 0))
@@ -20607,14 +21118,23 @@ translations.  There is currently no way for users to extend this.")
                             (point-at-eol))
            (end-of-line 1))))
 
-      ;; Specific LaTeX cleaning
+      ;; Specific LaTeX stuff
       (when latexp
-       (require 'org-export-latex nil t)
+       (require 'org-export-latex nil)
        (org-export-latex-cleaned-string))
 
+      ;; Specific HTML stuff
+      (when htmlp
+       ;; Convert LaTeX fragments to images
+       (when (plist-get parameters :LaTeX-fragments)
+         (org-format-latex
+          (concat "ltxpng/" (file-name-sans-extension
+                             (file-name-nondirectory
+                              org-current-export-file)))
+          org-current-export-dir nil "Creating LaTeX image %s"))
+       (message "Exporting..."))
+
       ;; Remove or replace comments
-      ;; If :comments is set, use this char for commenting out comments and
-      ;; protect them. otherwise delete them
       (goto-char (point-min))
       (while (re-search-forward "^#\\(.*\n?\\)" nil t)
        (if commentsp
@@ -20637,14 +21157,6 @@ translations.  There is currently no way for users to extend this.")
         (replace-match "\\1 \\3")
         (goto-char (match-beginning 0))))
 
-      ;; Convert LaTeX fragments to images
-      (when (plist-get parameters :LaTeX-fragments)
-       (org-format-latex
-        (concat "ltxpng/" (file-name-sans-extension
-                           (file-name-nondirectory
-                            org-current-export-file)))
-        org-current-export-dir nil "Creating LaTeX image %s"))
-      (message "Exporting...")
 
       ;; Normalize links: Convert angle and plain links into bracket links
       ;; Expand link abbreviations
@@ -20708,6 +21220,22 @@ translations.  There is currently no way for users to extend this.")
          ;; Return the title string
          (org-trim (match-string 0)))))))
 
+(defun org-export-get-title-from-subtree ()
+  "Return subtree title and exclude it from export."
+  (let (title (m (mark)))
+    (save-excursion
+      (goto-char (region-beginning))
+      (when (and (org-at-heading-p)
+                (>= (org-end-of-subtree t t) (region-end)))
+       ;; This is a subtree, we take the title from the first heading
+       (goto-char (region-beginning))
+       (looking-at org-todo-line-regexp)
+       (setq title (match-string 3))
+       (org-unmodified
+        (add-text-properties (point) (1+ (point-at-eol))
+                             (list :org-license-to-kill t)))))
+    title))
+        
 (defun org-solidify-link-text (s &optional alist)
   "Take link text and make a safe target out of it."
   (save-match-data
@@ -20718,6 +21246,15 @@ translations.  There is currently no way for users to extend this.")
           (a (assoc rtn alist)))
       (or (cdr a) rtn))))
 
+(defun org-get-min-level (lines)
+  "Get the minimum level in LINES."
+  (let ((re "^\\(\\*+\\) ") l min)
+    (catch 'exit
+      (while (setq l (pop lines))
+       (if (string-match re l)
+           (throw 'exit (org-tr-level (length (match-string 1 l))))))
+      1)))
+
 ;; Variable holding the vector with section numbers
 (defvar org-section-numbers (make-vector org-level-max 0))
 
@@ -20767,6 +21304,7 @@ When LEVEL is non-nil, increase section numbers on that level."
 ;;; ASCII export
 
 (defvar org-last-level nil) ; dynamically scoped variable
+(defvar org-min-level nil) ; dynamically scoped variable
 (defvar org-levels-open nil) ; dynamically scoped parameter
 (defvar org-ascii-current-indentation nil) ; For communication
 
@@ -20779,6 +21317,13 @@ underlined headlines.  The default is 3."
   (setq-default org-todo-line-regexp org-todo-line-regexp)
   (let* ((opt-plist (org-combine-plists (org-default-export-plist)
                                        (org-infile-export-plist)))
+        (region-p (org-region-active-p))
+        (subtree-p
+         (when region-p
+           (save-excursion
+             (goto-char (region-beginning))
+             (and (org-at-heading-p)
+                  (>= (org-end-of-subtree t t) (region-end))))))
         (custom-times org-display-custom-times)
         (org-ascii-current-indentation '(0 . 0))
         (level 0) line txt
@@ -20788,7 +21333,10 @@ underlined headlines.  The default is 3."
          (filename (concat (file-name-as-directory
                            (org-export-directory :ascii opt-plist))
                           (file-name-sans-extension
-                           (file-name-nondirectory buffer-file-name))
+                           (or (and subtree-p
+                                    (org-entry-get (region-beginning)
+                                                   "EXPORT_FILE_NAME" t))
+                               (file-name-nondirectory buffer-file-name)))
                           ".txt"))
         (filename (if (equal (file-truename filename)
                              (file-truename buffer-file-name))
@@ -20797,10 +21345,10 @@ underlined headlines.  The default is 3."
         (buffer (find-file-noselect filename))
         (org-levels-open (make-vector org-level-max nil))
         (odd org-odd-levels-only)
-        (date  (format-time-string "%Y/%m/%d" (current-time)))
-        (time  (format-time-string "%X" (org-current-time)))
+        (date  (plist-get opt-plist :date))
         (author      (plist-get opt-plist :author))
-        (title       (or (plist-get opt-plist :title)
+        (title       (or (and subtree-p (org-export-get-title-from-subtree))
+                         (plist-get opt-plist :title)
                          (and (not
                                (plist-get opt-plist :skip-before-1st-heading))
                               (org-export-grab-title-from-buffer))
@@ -20822,6 +21370,8 @@ underlined headlines.  The default is 3."
                  :for-ascii t
                  :skip-before-1st-heading
                  (plist-get opt-plist :skip-before-1st-heading)
+                 :archived-trees
+                 (plist-get opt-plist :archived-trees)
                  :add-text (plist-get opt-plist :text))
                 "[\r\n]")) ;; FIXME: why \r here???/
         thetoc have-headings first-heading-pos
@@ -20832,7 +21382,8 @@ underlined headlines.  The default is 3."
        (remove-text-properties (point-min) (point-max)
                               '(:org-license-to-kill t))))
 
-    (setq org-last-level 1)
+    (setq org-min-level (org-get-min-level lines))
+    (setq org-last-level org-min-level)
     (org-init-section-numbers)
 
     (find-file-noselect filename)
@@ -20863,8 +21414,15 @@ underlined headlines.  The default is 3."
        (insert (concat (nth 1 lang-words) ": " (or author "")
                        (if email (concat " <" email ">") "")
                        "\n")))
-    (if (and date time org-export-time-stamp-file)
-       (insert (concat (nth 2 lang-words) ": " date " " time "\n")))
+
+    (cond
+     ((and date (string-match "%" date))
+      (setq date (format-time-string date (current-time))))
+     (date)
+     (t (setq date (format-time-string "%Y/%m/%d %X" (current-time)))))
+
+    (if (and date org-export-time-stamp-file)
+       (insert (concat (nth 2 lang-words) ": " date"\n")))
 
     (insert "\n\n")
 
@@ -20908,7 +21466,8 @@ underlined headlines.  The default is 3."
                               (progn
                                 (push
                                  (concat
-                                  (make-string (* (1- level) 4) ?\ )
+                                  (make-string
+                                   (* (max 0 (- level org-min-level)) 4) ?\ )
                                   (format (if todo "%s (*)\n" "%s\n") txt))
                                  thetoc)
                                 (setq org-last-level level))
@@ -21084,6 +21643,12 @@ command."
         (file buffer-file-name)
         (buffer (get-buffer-create "*Org Export Visible*"))
         s e)
+    ;; Need to hack the drawers here.
+    (save-excursion
+      (goto-char (point-min))
+      (while (re-search-forward org-drawer-regexp nil t)
+       (goto-char (match-beginning 1))
+       (or (org-invisible-p) (org-flag-drawer nil))))
     (with-current-buffer buffer (erase-buffer))
     (save-excursion
       (setq s (goto-char (point-min)))
@@ -21091,6 +21656,7 @@ command."
        (goto-char (org-find-invisible))
        (append-to-buffer buffer s (point))
        (setq s (goto-char (org-find-visible))))
+      (org-cycle-hide-drawers 'all)
       (goto-char (point-min))
       (unless keepp
        ;; Copy all comment lines to the end, to make sure #+ settings are
@@ -21267,7 +21833,7 @@ This can be used in any buffer.  For example, you could write an
 itemized list in org-mode syntax in an HTML buffer and then use this
 command to convert it."
   (interactive "r")
-  (let (reg html buf)
+  (let (reg html buf pop-up-frames)
     (save-window-excursion
       (if (org-mode-p)
          (setq html (org-export-region-as-html
@@ -21354,6 +21920,12 @@ the body tags themselves."
         valid thetoc have-headings first-heading-pos
         (odd org-odd-levels-only)
         (region-p (org-region-active-p))
+        (subtree-p
+         (when region-p
+           (save-excursion
+             (goto-char (region-beginning))
+             (and (org-at-heading-p)
+                  (>= (org-end-of-subtree t t) (region-end))))))
         ;; The following two are dynamically scoped into other
         ;; routines below.
         (org-current-export-dir (org-export-directory :html opt-plist))
@@ -21365,7 +21937,10 @@ the body tags themselves."
                     (concat (file-name-as-directory
                              (org-export-directory :html opt-plist))
                             (file-name-sans-extension
-                             (file-name-nondirectory buffer-file-name))
+                             (or (and subtree-p
+                                      (org-entry-get (region-beginning)
+                                                     "EXPORT_FILE_NAME" t))
+                                 (file-name-nondirectory buffer-file-name)))
                             ".html")))
         (current-dir (if buffer-file-name
                          (file-name-directory buffer-file-name)
@@ -21376,10 +21951,10 @@ the body tags themselves."
                      (t (get-buffer-create to-buffer)))
                   (find-file-noselect filename)))
          (org-levels-open (make-vector org-level-max nil))
-        (date (format-time-string "%Y/%m/%d" (current-time)))
-        (time  (format-time-string "%X" (org-current-time)))
+        (date (plist-get opt-plist :date))
          (author      (plist-get opt-plist :author))
-        (title       (or (plist-get opt-plist :title)
+        (title       (or (and subtree-p (org-export-get-title-from-subtree))
+                         (plist-get opt-plist :title)
                          (and (not
                                (plist-get opt-plist :skip-before-1st-heading))
                               (org-export-grab-title-from-buffer))
@@ -21423,6 +21998,8 @@ the body tags themselves."
            :for-html t
            :skip-before-1st-heading
            (plist-get opt-plist :skip-before-1st-heading)
+           :archived-trees
+           (plist-get opt-plist :archived-trees)
            :add-text
            (plist-get opt-plist :text)
            :LaTeX-fragments
@@ -21441,9 +22018,16 @@ the body tags themselves."
 
     (message "Exporting...")
 
-    (setq org-last-level 1)
+    (setq org-min-level (org-get-min-level lines))
+    (setq org-last-level org-min-level)
     (org-init-section-numbers)
 
+    (cond
+     ((and date (string-match "%" date))
+      (setq date (format-time-string date (current-time))))
+     (date)
+     (t (setq date (format-time-string "%Y/%m/%d %X" (current-time)))))
+
     ;; Get the language-dependent settings
     (setq lang-words (or (assoc language org-export-language-setup)
                          (assoc "en" org-export-language-setup)))
@@ -21480,13 +22064,13 @@ lang=\"%s\" xml:lang=\"%s\">
 <title>%s</title>
 <meta http-equiv=\"Content-Type\" content=\"text/html;charset=%s\"/>
 <meta name=\"generator\" content=\"Org-mode\"/>
-<meta name=\"generated\" content=\"%s %s\"/>
+<meta name=\"generated\" content=\"%s\"/>
 <meta name=\"author\" content=\"%s\"/>
 %s
 </head><body>
 "
                 language language (org-html-expand title)
-                (or charset "iso-8859-1") date time author style))
+                (or charset "iso-8859-1") date author style))
 
        (insert (or (plist-get opt-plist :preamble) ""))
 
@@ -21572,7 +22156,7 @@ lang=\"%s\" xml:lang=\"%s\">
                            )))
                    line)
                          lines))
-           (while (> org-last-level 0)
+           (while (> org-last-level (1- org-min-level))
              (setq org-last-level (1- org-last-level))
              (push "</li>\n</ul>\n" thetoc))
            (setq thetoc (if have-headings (nreverse thetoc) nil))))
@@ -21901,10 +22485,10 @@ lang=\"%s\" xml:lang=\"%s\">
              (insert "<a href=\"mailto:" email "\">&lt;"
                      email "&gt;</a>\n"))
            (insert "</p>\n"))
-         (when (and date time org-export-time-stamp-file)
+         (when (and date org-export-time-stamp-file)
            (insert "<p class=\"date\"> "
                    (nth 2 lang-words) ": "
-                   date " " time "</p>\n")))
+                   date "</p>\n")))
 
        (if org-export-html-with-timestamp
            (insert org-export-html-html-helper-timestamp))
@@ -23132,7 +23716,9 @@ Calls `org-timestamp-up' or `org-priority-up', or `org-previous-item',
 depending on context.  See the individual commands for more information."
   (interactive "P")
   (cond
-   ((org-at-timestamp-p t) (call-interactively 'org-timestamp-up))
+   ((org-at-timestamp-p t)
+    (call-interactively (if org-edit-timestamp-down-means-later
+                           'org-timestamp-down 'org-timestamp-up)))
    ((org-on-heading-p) (call-interactively 'org-priority-up))
    ((org-at-item-p) (call-interactively 'org-previous-item))
    (t (call-interactively 'org-beginning-of-item) (beginning-of-line 1))))
@@ -23143,7 +23729,9 @@ Calls `org-timestamp-down' or `org-priority-down', or `org-next-item'
 depending on context.  See the individual commands for more information."
   (interactive "P")
   (cond
-   ((org-at-timestamp-p t) (call-interactively 'org-timestamp-down))
+   ((org-at-timestamp-p t)
+    (call-interactively (if org-edit-timestamp-down-means-later
+                           'org-timestamp-up 'org-timestamp-down)))
    ((org-on-heading-p) (call-interactively 'org-priority-down))
    (t (call-interactively 'org-next-item))))
 
@@ -23410,11 +23998,7 @@ See the individual commands for more information."
      ["Next Same Level" outline-forward-same-level t]
      ["Previous Same Level" outline-backward-same-level t]
      "--"
-     ["Jump" org-goto t]
-     "--"
-     ["C-a/e find headline/item start/end"
-      (setq org-special-ctrl-a/e (not org-special-ctrl-a/e))
-      :style toggle :selected org-special-ctrl-a/e])
+     ["Jump" org-goto t])
     ("Edit Structure"
      ["Move Subtree Up" org-shiftmetaup (not (org-at-table-p))]
      ["Move Subtree Down" org-shiftmetadown (not (org-at-table-p))]
@@ -23470,6 +24054,7 @@ See the individual commands for more information."
      ["Priority Down" org-shiftdown t])
     ("TAGS and Properties"
      ["Set Tags" 'org-ctrl-c-ctrl-c (org-at-heading-p)]
+     ["Change tag in region" 'org-change-tag-in-region (org-region-active-p)] ;FIXME
      ["Column view of properties" org-columns t])
     ("Dates and Scheduling"
      ["Timestamp" org-time-stamp t]
@@ -23757,6 +24342,13 @@ return nil."
           (list context (match-beginning group) (match-end group))
         t)))
 
+(defun org-switch-to-buffer-other-window (&rest args)
+  "Switch to buffer in a second window on the current frame.
+In particular, do not allow pop-up frames."
+  (let (pop-up-frames special-display-buffer-names special-display-regexps
+                     special-display-function)
+    (apply 'switch-to-buffer-other-window args)))
+
 (defun org-combine-plists (&rest plists)
   "Create a single property list from all plists in PLISTS.
 The process starts by copying the first list, and then setting properties
@@ -23983,14 +24575,22 @@ beyond the end of the headline."
        ((and (looking-at org-todo-line-regexp)
             (= (char-after (match-end 1)) ?\ ))
        (goto-char
-        (cond ((> pos (match-beginning 3)) (match-beginning 3))
-              ((= pos (point)) (match-beginning 3))
-              (t (point)))))
+        (if (eq org-special-ctrl-a/e t)
+            (cond ((> pos (match-beginning 3)) (match-beginning 3))
+                  ((= pos (point)) (match-beginning 3))
+                  (t (point)))
+          (cond ((> pos (point)) (point))
+                ((not (eq last-command this-command)) (point))
+                (t (match-beginning 3))))))
        ((org-at-item-p)
        (goto-char
-        (cond ((> pos (match-end 4)) (match-end 4))
-              ((= pos (point)) (match-end 4))
-              (t (point)))))))))
+        (if (eq org-special-ctrl-a/e t)
+            (cond ((> pos (match-end 4)) (match-end 4))
+                  ((= pos (point)) (match-end 4))
+                  (t (point)))
+          (cond ((> pos (point)) (point))
+                ((not (eq last-command this-command)) (point))
+                (t (match-end 4))))))))))
 
 (defun org-end-of-line (&optional arg)
   "Go to the end of the line.
@@ -24004,10 +24604,14 @@ beyond the end of the headline."
     (let ((pos (point)))
       (beginning-of-line 1)
       (if (looking-at (org-re ".*?\\([ \t]*\\)\\(:[[:alnum:]_@:]+:\\)[ \t]*$"))
-         (if (or (< pos (match-beginning 1))
-                 (= pos (match-end 0)))
-             (goto-char (match-beginning 1))
-           (goto-char (match-end 0)))
+         (if (eq org-special-ctrl-a/e t)
+             (if (or (< pos (match-beginning 1))
+                     (= pos (match-end 0)))
+                 (goto-char (match-beginning 1))
+               (goto-char (match-end 0)))
+           (if (or (< pos (match-end 0)) (not (eq this-command last-command)))
+               (goto-char (match-end 0))
+             (goto-char (match-beginning 1))))
        (end-of-line arg)))))
 
 (define-key org-mode-map "\C-a" 'org-beginning-of-line)
@@ -24047,6 +24651,21 @@ With argument, move up ARG levels."
       (outline-up-heading-all arg)   ; emacs 21 version of outline.el
     (outline-up-heading arg t)))     ; emacs 22 version of outline.el
 
+(defun org-up-heading-safe ()
+  "Move to the heading line of which the present line is a subheading.
+This version will not throw an error.  It will return the level of the
+headline found, or nil if no higher level is found."
+  (let ((pos (point)) start-level level
+       (re (concat "^" outline-regexp)))
+    (catch 'exit
+      (outline-back-to-heading t)
+      (setq start-level (funcall outline-level))
+      (if (equal start-level 1) (throw 'exit nil))
+      (while (re-search-backward re nil t)
+       (setq level (funcall outline-level))
+       (if (< level start-level) (throw 'exit level)))
+      nil)))
+
 (defun org-goto-sibling (&optional previous)
   "Goto the next sibling, even if it is invisible.
 When PREVIOUS is set, go to the previous sibling instead.  Returns t
@@ -24264,7 +24883,30 @@ Still experimental, may disappear in the furture."
               t)))
          (t nil))))                                 ; call paragraph-fill
 
-
+;; FIXME: this needs a much better algorithm
+(defun org-assign-fast-keys (alist)
+  "Assign fast keys to a keyword-key alist.
+Respect keys that are already there."
+  (let (new e k c c1 c2 (char ?a))
+    (while (setq e (pop alist))
+      (cond
+       ((equal e '(:startgroup)) (push e new))
+       ((equal e '(:endgroup)) (push e new))
+       (t
+       (setq k (car e) c2 nil)
+       (if (cdr e)
+           (setq c (cdr e))
+         ;; automatically assign a character.
+         (setq c1 (string-to-char
+                   (downcase (substring
+                              k (if (= (string-to-char k) ?@) 1 0)))))
+         (if (or (rassoc c1 new) (rassoc c1 alist))
+             (while (or (rassoc char new) (rassoc char alist))
+               (setq char (1+ char)))
+           (setq c2 c1))
+         (setq c (or c2 char)))
+       (push (cons k c) new))))
+    (nreverse new)))
 
 ;;;; Finish up
 
index eadb9e606c34a2cd10c7e24b1295edfd19be50ed..5e8b8c7cbc2004de8ad61d4429f9eb74b08d770b 100644 (file)
@@ -1376,7 +1376,7 @@ the last cache point coordinate."
 ;;
 
 ;; Point Motion Only Group
-(mapcar
+(mapc
  (lambda (command)
    (let ((func-symbol (intern (format "*table--cell-%s" command)))
         (doc-string (format "Table remapped function for `%s'." command)))
@@ -1409,7 +1409,7 @@ the last cache point coordinate."
    backward-paragraph))
 
 ;; Extraction Group
-(mapcar
+(mapc
  (lambda (command)
    (let ((func-symbol (intern (format "*table--cell-%s" command)))
         (doc-string (format "Table remapped function for `%s'." command)))
@@ -1443,7 +1443,7 @@ the last cache point coordinate."
    backward-kill-sexp))
 
 ;; Pasting Group
-(mapcar
+(mapc
  (lambda (command)
    (let ((func-symbol (intern (format "*table--cell-%s" command)))
         (doc-string (format "Table remapped function for `%s'." command)))
@@ -1469,7 +1469,7 @@ the last cache point coordinate."
    insert))
 
 ;; Formatting Group
-(mapcar
+(mapc
  (lambda (command)
    (let ((func-symbol (intern (format "*table--cell-%s" command)))
         (doc-string (format "Table remapped function for `%s'." command)))
@@ -1641,20 +1641,20 @@ Inside a table cell has a special keymap.
   (if (numberp cell-width) (setq cell-width (cons cell-width nil)))
   (if (numberp cell-height) (setq cell-height (cons cell-height nil)))
   ;; test validity of the arguments.
-  (mapcar (lambda (arg)
-           (let* ((value (symbol-value arg))
-                  (error-handler
-                   (function (lambda ()
-                               (error "%s must be a positive integer%s" arg
-                                      (if (listp value) " or a list of positive integers" ""))))))
-             (if (null value) (funcall error-handler))
-             (mapcar (function (lambda (arg1)
-                                 (if (or (not (integerp arg1))
-                                         (< arg1 1))
-                                     (funcall error-handler))))
-                     (if (listp value) value
-                       (cons value nil)))))
-         '(columns rows cell-width cell-height))
+  (mapc (lambda (arg)
+         (let* ((value (symbol-value arg))
+                (error-handler
+                 (function (lambda ()
+                   (error "%s must be a positive integer%s" arg
+                          (if (listp value) " or a list of positive integers" ""))))))
+           (if (null value) (funcall error-handler))
+           (mapcar (function (lambda (arg1)
+                     (if (or (not (integerp arg1))
+                             (< arg1 1))
+                         (funcall error-handler))))
+                   (if (listp value) value
+                     (cons value nil)))))
+       '(columns rows cell-width cell-height))
   (let ((orig-coord (table--get-coordinate))
        (coord (table--get-coordinate))
        r i cw ch cell-str border-str)
@@ -3141,7 +3141,7 @@ CALS (DocBook DTD):
       (set-marker-insertion-type (table-get-source-info 'colspec-marker) t) ;; insert before
       (save-excursion
        (goto-char (table-get-source-info 'colspec-marker))
-       (mapcar
+       (mapc
         (lambda (col)
           (insert (format "    <colspec colnum=\"%d\" colname=\"c%d\"/>\n" col col)))
         (sort (table-get-source-info 'colnum-list) '<)))
@@ -3223,11 +3223,11 @@ CALS (DocBook DTD):
              (if (> colspan 1)
                  (let ((scol (table-get-source-info 'current-column))
                        (ecol (+ (table-get-source-info 'current-column) colspan -1)))
-                   (mapcar (lambda (col)
-                             (unless (memq col (table-get-source-info 'colnum-list))
-                               (table-put-source-info 'colnum-list
-                                                      (cons col (table-get-source-info 'colnum-list)))))
-                           (list scol ecol))
+                   (mapc (lambda (col)
+                           (unless (memq col (table-get-source-info 'colnum-list))
+                             (table-put-source-info 'colnum-list
+                                                    (cons col (table-get-source-info 'colnum-list)))))
+                         (list scol ecol))
                    (insert (format " namest=\"c%d\" nameend=\"c%d\"" scol ecol))))
              (if (> rowspan 1) (insert (format " morerows=\"%d\"" (1- rowspan))))
              (if (and alignment
@@ -3910,19 +3910,19 @@ converts a table into plain text without frames.  It is a companion to
          (remap-alist table-command-remap-alist))
       ;; table-command-prefix mode specific bindings
       (if (vectorp table-command-prefix)
-         (mapcar (lambda (binding)
-                   (let ((seq (copy-sequence (car binding))))
-                     (and (vectorp seq)
-                          (listp (aref seq 0))
-                          (eq (car (aref seq 0)) 'control)
-                          (progn
-                            (aset seq 0 (cadr (aref seq 0)))
-                            (define-key map (vconcat table-command-prefix seq) (cdr binding))))))
-                 table-cell-bindings))
+         (mapc (lambda (binding)
+                 (let ((seq (copy-sequence (car binding))))
+                   (and (vectorp seq)
+                        (listp (aref seq 0))
+                        (eq (car (aref seq 0)) 'control)
+                        (progn
+                          (aset seq 0 (cadr (aref seq 0)))
+                          (define-key map (vconcat table-command-prefix seq) (cdr binding))))))
+               table-cell-bindings))
       ;; shorthand control bindings
-      (mapcar (lambda (binding)
-               (define-key map (car binding) (cdr binding)))
-             table-cell-bindings)
+      (mapc (lambda (binding)
+             (define-key map (car binding) (cdr binding)))
+           table-cell-bindings)
       ;; remap normal commands to table specific version
       (while remap-alist
        (define-key map (vector 'remap (caar remap-alist)) (cdar remap-alist))
@@ -4092,11 +4092,11 @@ key             binding
 ---             -------
 
 ")
-      (mapcar (lambda (binding)
-               (princ (format "%-16s%s\n"
-                              (key-description (car binding))
-                              (cdr binding))))
-             table-cell-bindings)
+      (mapc (lambda (binding)
+             (princ (format "%-16s%s\n"
+                            (key-description (car binding))
+                            (cdr binding))))
+           table-cell-bindings)
       (print-help-return-message))))
 
 (defun *table--cell-dabbrev-expand (arg)
index 44bc31d36d6893fa25f40ced507a5eb2399fa8b4..06e26d21aafc51a61352044030fbd7d85bb024a1 100644 (file)
@@ -1,7 +1,8 @@
 ;;; tex-mode.el --- TeX, LaTeX, and SliTeX mode commands -*- coding: utf-8 -*-
 
-;; Copyright (C) 1985, 1986, 1989, 1992, 1994, 1995, 1996, 1997, 1998, 1999,
-;;   2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+;; Copyright (C) 1985, 1986, 1989, 1992, 1994, 1995, 1996, 1997, 1998
+;;   1999, 2001, 2002, 2003, 2004, 2005, 2006, 2007
+;;   Free Software Foundation, Inc.
 
 ;; Maintainer: FSF
 ;; Keywords: tex
@@ -246,15 +247,20 @@ Normally set to either `plain-tex-mode' or `latex-mode'."
 (defcustom tex-fontify-script t
   "If non-nil, fontify subscript and superscript strings."
   :type 'boolean
-  :group 'tex)
+  :group 'tex
+  :version "23.1")
 (put 'tex-fontify-script 'safe-local-variable 'booleanp)
 
 (defcustom tex-font-script-display '(-0.2 0.2)
-  "Display specification for subscript and superscript content.
-The first is used for subscript, the second is used for superscripts."
+  "How much to lower and raise subscript and superscript content.
+This is a list of two floats.  The first is negative and
+specifies how much subscript is lowered, the second is positive
+and specifies how much superscript is raised.  Heights are
+measured relative to that of the normal text."
   :group 'tex
   :type '(list (float :tag "Subscript")
-               (float :tag "Superscript")))
+               (float :tag "Superscript"))
+  :version "23.1")
 
 (defvar tex-last-temp-file nil
   "Latest temporary file generated by \\[tex-region] and \\[tex-buffer].
@@ -636,7 +642,7 @@ An alternative value is \" . \", if you use a font with a narrow period."
 (defvar tex-verbatim-environments
   '("verbatim" "verbatim*"))
 (put 'tex-verbatim-environments 'safe-local-variable
-     (lambda (x) (require 'cl) (every 'stringp x)))
+     (lambda (x) (null (delq t (mapcar 'stringp x)))))
 
 (defvar tex-font-lock-syntactic-keywords
   '((eval . `(,(concat "^\\\\begin *{"
@@ -672,12 +678,42 @@ An alternative value is \" . \", if you use a font with a narrow period."
          (put-text-property beg next 'display nil))
       (setq beg next))))
 
+(defcustom tex-suscript-height-ratio 0.8
+  "Ratio of subscript/superscript height to that of the preceding text.
+In nested subscript/superscript, this factor is applied repeatedly,
+subject to the limit set by `tex-suscript-height-minimum'."
+  :type 'float
+  :group 'tex
+  :version "23.1")
+
+(defcustom tex-suscript-height-minimum 0.0
+  "Integer or float limiting the minimum size of subscript/superscript text.
+An integer is an absolute height in units of 1/10 point, a float
+is a height relative to that of the default font.  Zero means no minimum."
+  :type '(choice (integer :tag "Integer height in 1/10 point units")
+                (float :tag "Fraction of default font height"))
+  :group 'tex
+  :version "23.1")
+
+(defun tex-suscript-height (height)
+  "Return the integer height of subscript/superscript font in 1/10 points.
+Not smaller than the value set by `tex-suscript-height-minimum'."
+  (ceiling (max (if (integerp tex-suscript-height-minimum)
+                   tex-suscript-height-minimum
+                 ;; For bootstrapping.
+                 (condition-case nil
+                     (* tex-suscript-height-minimum
+                        (face-attribute 'default :height))
+                   (error 0)))
+               ;; NB assumes height is integer.
+               (* height tex-suscript-height-ratio))))
+
 (defface superscript
-  '((t :height 0.8)) ;; :raise 0.2
+  '((t :height tex-suscript-height)) ;; :raise 0.2
   "Face used for superscripts."
   :group 'tex)
 (defface subscript
-  '((t :height 0.8)) ;; :raise -0.2
+  '((t :height tex-suscript-height)) ;; :raise -0.2
   "Face used for subscripts."
   :group 'tex)
 
@@ -1184,24 +1220,27 @@ on the line for the invalidity you want to see."
        (setq occur-revert-arguments (list nil 0 (list buffer))))
       (save-excursion
        (goto-char (point-max))
-       (while (and (not (bobp)))
-         (let ((end (point))
-               prev-end)
+       ;; Do a little shimmy to place point at the end of the last
+       ;; "real" paragraph. Need to avoid validating across an \end,
+       ;; because that blows up latex-forward-sexp.
+       (backward-paragraph)
+       (forward-paragraph)
+       (while (not (bobp))
            ;; Scan the previous paragraph for invalidities.
-           (if (search-backward "\n\n" nil t)
-               (progn
-                 (setq prev-end (point))
-                 (forward-char 2))
-             (goto-char (setq prev-end (point-min))))
-           (or (tex-validate-region (point) end)
-               (let* ((end (line-beginning-position 2))
+         (backward-paragraph)
+         (save-excursion
+           (or (tex-validate-region (point) (save-excursion
+                                              (forward-paragraph)
+                                              (point)))
+               (let ((end (line-beginning-position 2))
                       start tem)
                  (beginning-of-line)
                  (setq start (point))
                  ;; Keep track of line number as we scan,
                  ;; in a cumulative fashion.
                  (if linenum
-                     (setq linenum (- linenum (count-lines prevpos (point))))
+                     (setq linenum (- linenum
+                                      (count-lines prevpos (point))))
                    (setq linenum (1+ (count-lines 1 start))))
                  (setq prevpos (point))
                  ;; Mention this mismatch in *Occur*.
@@ -1222,10 +1261,10 @@ on the line for the invalidity you want to see."
                      (add-text-properties
                       text-beg (- text-end 1)
                       '(mouse-face highlight
-                        help-echo "mouse-2: go to this invalidity"))
+                                   help-echo
+                                   "mouse-2: go to this invalidity"))
                      (put-text-property text-beg (- text-end 1)
-                                        'occur-target tem)))))
-           (goto-char prev-end))))
+                                        'occur-target tem))))))))
       (with-current-buffer standard-output
        (let ((no-matches (zerop num-matches)))
          (if no-matches
@@ -1248,7 +1287,9 @@ area if a mismatch is found."
            (narrow-to-region start end)
            ;; First check that the open and close parens balance in numbers.
            (goto-char start)
-           (while (<= 0 (setq max-possible-sexps (1- max-possible-sexps)))
+           (while (and (not (eobp))
+                       (<= 0 (setq max-possible-sexps
+                                   (1- max-possible-sexps))))
              (forward-sexp 1))
            ;; Now check that like matches like.
            (goto-char start)
@@ -1256,6 +1297,7 @@ area if a mismatch is found."
              (save-excursion
                (let ((pos (match-beginning 0)))
                  (goto-char pos)
+                 (skip-chars-backward "\\\\") ; escaped parens
                  (forward-sexp 1)
                  (or (eq (preceding-char) (cdr (syntax-after pos)))
                      (eq (char-after pos) (cdr (syntax-after (1- (point)))))
@@ -1273,9 +1315,13 @@ A prefix arg inhibits the checking."
   (interactive "*P")
   (or inhibit-validation
       (save-excursion
+       ;; For the purposes of this, a "paragraph" is a block of text
+       ;; wherein all the brackets etc are expected to be balanced.  It
+       ;; may start after a blank line (ie a "proper" paragraph), or
+       ;; a begin{} or end{} block, etc.
        (tex-validate-region
         (save-excursion
-          (search-backward "\n\n" nil 'move)
+          (backward-paragraph)
           (point))
         (point)))
       (message "Paragraph being closed appears to contain a mismatch"))
@@ -1383,13 +1429,41 @@ Return the value returned by the last execution of BODY."
     (search-failed (error "Couldn't find unended \\begin"))))
 
 (defun tex-next-unmatched-end ()
-  "Leave point at the end of the next `\\end' that is unended."
+  "Leave point at the end of the next `\\end' that is unmatched."
   (while (and (tex-search-noncomment
               (re-search-forward "\\\\\\(begin\\|end\\)\\s *{[^}]+}"))
              (save-excursion (goto-char (match-beginning 0))
                              (looking-at "\\\\begin")))
     (tex-next-unmatched-end)))
 
+(defun tex-next-unmatched-eparen (otype)
+  "Leave point after the next unmatched escaped closing parenthesis.
+The string OTYPE is an opening parenthesis type: `(', `{', or `['."
+  (condition-case nil
+      (let ((ctype (char-to-string (cdr (aref (syntax-table)
+                                             (string-to-char otype))))))
+       (while (and (tex-search-noncomment
+                    (re-search-forward (format "\\\\[%s%s]" ctype otype)))
+                   (save-excursion
+                     (goto-char (match-beginning 0))
+                     (looking-at (format "\\\\%s" (regexp-quote otype)))))
+         (tex-next-unmatched-eparen otype)))
+    (wrong-type-argument (error "Unknown opening parenthesis type: %s" otype))
+    (search-failed (error "Couldn't find closing escaped paren"))))
+
+(defun tex-last-unended-eparen (ctype)
+  "Leave point at the start of the last unended escaped opening parenthesis.
+The string CTYPE is a closing parenthesis type:  `)', `}', or `]'."
+  (condition-case nil
+      (let ((otype (char-to-string (cdr (aref (syntax-table)
+                                             (string-to-char ctype))))))
+       (while (and (tex-search-noncomment
+                    (re-search-backward (format "\\\\[%s%s]" ctype otype)))
+                   (looking-at (format "\\\\%s" (regexp-quote ctype))))
+         (tex-last-unended-eparen ctype)))
+    (wrong-type-argument (error "Unknown opening parenthesis type: %s" ctype))
+    (search-failed (error "Couldn't find unended escaped paren"))))
+
 (defun tex-goto-last-unclosed-latex-block ()
   "Move point to the last unclosed \\begin{...}.
 Mark is left at original location."
@@ -1401,26 +1475,34 @@ Mark is left at original location."
     (push-mark)
     (goto-char spot)))
 
+;; Don't think this one actually _needs_ (for the purposes of
+;; tex-mode) to handle escaped parens.
 (defun latex-backward-sexp-1 ()
-  "Like (backward-sexp 1) but aware of multi-char elements."
+  "Like (backward-sexp 1) but aware of multi-char elements and escaped parens."
   (let ((pos (point))
        (forward-sexp-function))
     (backward-sexp 1)
-    (if (looking-at "\\\\begin\\>")
-       (signal 'scan-error
-               (list "Containing expression ends prematurely"
-                     (point) (prog1 (point) (goto-char pos))))
-      (when (eq (char-after) ?{)
-       (let ((newpos (point)))
-         (when (ignore-errors (backward-sexp 1) t)
-           (if (or (looking-at "\\\\end\\>")
-                   ;; In case the \\ ends a verbatim section.
-                   (and (looking-at "end\\>") (eq (char-before) ?\\)))
-               (tex-last-unended-begin)
-             (goto-char newpos))))))))
-
+    (cond ((looking-at "\\\\\\(begin\\>\\|[[({]\\)")
+          (signal 'scan-error
+                  (list "Containing expression ends prematurely"
+                        (point) (prog1 (point) (goto-char pos)))))
+         ((looking-at "\\\\\\([])}]\\)")
+          (tex-last-unended-eparen (match-string 1)))
+         ((eq (char-after) ?{)
+          (let ((newpos (point)))
+            (when (ignore-errors (backward-sexp 1) t)
+              (if (or (looking-at "\\\\end\\>")
+                      ;; In case the \\ ends a verbatim section.
+                      (and (looking-at "end\\>") (eq (char-before) ?\\)))
+                  (tex-last-unended-begin)
+                (goto-char newpos))))))))
+
+;; Note this does not handle things like mismatched brackets inside
+;; begin/end blocks.
+;; Needs to handle escaped parens for tex-validate-*.
+;; http://lists.gnu.org/archive/html/bug-gnu-emacs/2007-09/msg00038.html
 (defun latex-forward-sexp-1 ()
-  "Like (forward-sexp 1) but aware of multi-char elements."
+  "Like (forward-sexp 1) but aware of multi-char elements and escaped parens."
   (let ((pos (point))
        (forward-sexp-function))
     (forward-sexp 1)
@@ -1437,10 +1519,19 @@ Mark is left at original location."
        ((looking-at "\\\\begin\\>")
        (goto-char (match-end 0))
        (tex-next-unmatched-end))
+       ;; A better way to handle this, \( .. \) etc, is probably to
+       ;; temporarily change the syntax of the \ in \( to punctuation.
+       ((looking-back "\\\\[])}]")
+       (signal 'scan-error
+               (list "Containing expression ends prematurely"
+                     (- (point) 2) (prog1 (point)
+                                     (goto-char pos)))))
+       ((looking-back "\\\\\\([({[]\\)")
+       (tex-next-unmatched-eparen (match-string 1)))
        (t (goto-char newpos))))))
 
 (defun latex-forward-sexp (&optional arg)
-  "Like `forward-sexp' but aware of multi-char elements."
+  "Like `forward-sexp' but aware of multi-char elements and escaped parens."
   (interactive "P")
   (unless arg (setq arg 1))
   (let ((pos (point)))
@@ -2032,29 +2123,37 @@ for the error messages."
          (file-name-directory (buffer-file-name tex-last-buffer-texed)))
        found-desired (num-errors-found 0)
        last-filename last-linenum last-position
-       begin-of-error end-of-error)
+       begin-of-error end-of-error errfilename)
     ;; Don't reparse messages already seen at last parse.
     (goto-char compilation-parsing-end)
     ;; Parse messages.
     (while (and (not (or found-desired (eobp)))
-               (prog1 (re-search-forward "^! " nil 'move)
+               ;; First alternative handles the newer --file-line-error style:
+               ;; ./test2.tex:14: Too many }'s.
+               ;; Second handles the old-style:
+               ;; ! Too many }'s.
+               (prog1 (re-search-forward
+                       "^\\(?:\\([^:\n]+\\):[[:digit:]]+:\\|!\\) " nil 'move)
                  (setq begin-of-error (match-beginning 0)
-                       end-of-error (match-end 0)))
+                       end-of-error (match-end 0)
+                       errfilename (match-string 1)))
                (re-search-forward
                 "^l\\.\\([0-9]+\\) \\(\\.\\.\\.\\)?\\(.*\\)$" nil 'move))
       (let* ((this-error (copy-marker begin-of-error))
             (linenum (string-to-number (match-string 1)))
             (error-text (regexp-quote (match-string 3)))
             (filename
-             (save-excursion
-               (with-syntax-table tex-error-parse-syntax-table
-                 (backward-up-list 1)
-                 (skip-syntax-forward "(_")
-                 (while (not (file-readable-p (thing-at-point 'filename)))
-                   (skip-syntax-backward "(_")
-                   (backward-up-list 1)
-                   (skip-syntax-forward "(_"))
-                 (thing-at-point 'filename))))
+             ;; Prefer --file-liner-error filename if we have it.
+             (or errfilename
+                 (save-excursion
+                   (with-syntax-table tex-error-parse-syntax-table
+                     (backward-up-list 1)
+                     (skip-syntax-forward "(_")
+                     (while (not (file-readable-p (thing-at-point 'filename)))
+                       (skip-syntax-backward "(_")
+                       (backward-up-list 1)
+                       (skip-syntax-forward "(_"))
+                     (thing-at-point 'filename)))))
             (new-file
              (or (null last-filename)
                  (not (string-equal last-filename filename))))
@@ -2124,57 +2223,31 @@ The value of `tex-command' specifies the command to use to run TeX."
   (let* ((zap-directory
           (file-name-as-directory (expand-file-name tex-directory)))
          (tex-out-file (expand-file-name (concat tex-zap-file ".tex")
-                                        zap-directory)))
+                                        zap-directory))
+        (main-file (expand-file-name (tex-main-file)))
+        (ismain (string-equal main-file (buffer-file-name)))
+        already-output)
     ;; Don't delete temp files if we do the same buffer twice in a row.
     (or (eq (current-buffer) tex-last-buffer-texed)
        (tex-delete-last-temp-files t))
-    ;; Write the new temp file.
-    (save-excursion
-      (save-restriction
-       (widen)
-       (goto-char (point-min))
-       (forward-line 100)
-       (let ((search-end (point))
-             (default-directory zap-directory)
-             (already-output 0))
-         (goto-char (point-min))
-
-          ;; Maybe copy first line, such as `\input texinfo', to temp file.
-         (and tex-first-line-header-regexp
-              (looking-at tex-first-line-header-regexp)
-              (write-region (point)
-                            (progn (forward-line 1)
-                                   (setq already-output (point)))
-                            tex-out-file nil nil))
-
-         ;; Write out the header, if there is one,
-         ;; and any of the specified region which extends before it.
-         ;; But don't repeat anything already written.
-         (if (re-search-forward tex-start-of-header search-end t)
-             (let (hbeg)
-               (beginning-of-line)
-               (setq hbeg (point))     ;mark beginning of header
-               (if (re-search-forward tex-end-of-header nil t)
-                   (let (hend)
-                     (forward-line 1)
-                     (setq hend (point)) ;mark end of header
-                     (write-region (max (min hbeg beg) already-output)
-                                   hend
-                                   tex-out-file
-                                   (not (zerop already-output)) nil)
-                     (setq already-output hend)))))
-
-         ;; Write out the specified region
-         ;; (but don't repeat anything already written).
-         (write-region (max beg already-output) end
-                       tex-out-file
-                       (not (zerop already-output)) nil))
-       ;; Write the trailer, if any.
-       ;; Precede it with a newline to make sure it
-       ;; is not hidden in a comment.
-       (if tex-trailer
-           (write-region (concat "\n" tex-trailer) nil
-                         tex-out-file t nil))))
+    (let ((default-directory zap-directory)) ; why?
+      ;; We assume the header is fully contained in tex-main-file.
+      ;; We use f-f-ns so we get prompted about any changes on disk.
+      (with-current-buffer (find-file-noselect main-file)
+       (setq already-output (tex-region-header tex-out-file
+                                               (and ismain beg))))
+      ;; Write out the specified region (but don't repeat anything
+      ;; already written in the header).
+      (write-region (if ismain
+                       (max beg already-output)
+                     beg)
+                   end tex-out-file (not (zerop already-output)))
+      ;; Write the trailer, if any.
+      ;; Precede it with a newline to make sure it
+      ;; is not hidden in a comment.
+      (if tex-trailer
+         (write-region (concat "\n" tex-trailer) nil
+                       tex-out-file t)))
     ;; Record the file name to be deleted afterward.
     (setq tex-last-temp-file tex-out-file)
     ;; Use a relative file name here because (1) the proper dir
@@ -2183,6 +2256,52 @@ The value of `tex-command' specifies the command to use to run TeX."
     (tex-start-tex tex-command (concat tex-zap-file ".tex") zap-directory)
     (setq tex-print-file tex-out-file)))
 
+(defun tex-region-header (file &optional beg)
+  "If there is a TeX header in the current buffer, write it to FILE.
+Return point at the end of the region so written, or zero.  If
+the optional buffer position BEG is specified, then the region
+written out starts at BEG, if this lies before the start of the header.
+
+If the first line matches `tex-first-line-header-regexp', it is
+also written out.  The variables `tex-start-of-header' and
+`tex-end-of-header' are used to locate the header.  Note that the
+start of the header is required to be within the first 100 lines."
+  (save-excursion
+    (save-restriction
+      (widen)
+      (goto-char (point-min))
+      (let ((search-end (save-excursion
+                         (forward-line 100)
+                         (point)))
+           (already-output 0)
+           hbeg hend)
+       ;; Maybe copy first line, such as `\input texinfo', to temp file.
+       (and tex-first-line-header-regexp
+            (looking-at tex-first-line-header-regexp)
+            (write-region (point)
+                          (progn (forward-line 1)
+                                 (setq already-output (point)))
+                          file))
+       ;; Write out the header, if there is one, and any of the
+       ;; specified region which extends before it.  But don't repeat
+       ;; anything already written.
+       (and tex-start-of-header
+            (re-search-forward tex-start-of-header search-end t)
+            (progn
+              (beginning-of-line)
+              (setq hbeg (point))      ; mark beginning of header
+              (when (re-search-forward tex-end-of-header nil t)
+                (forward-line 1)
+                (setq hend (point))    ; mark end of header
+                (write-region
+                 (max (if beg
+                          (min hbeg beg)
+                        hbeg)
+                      already-output)
+                 hend file (not (zerop already-output)))
+                (setq already-output hend))))
+       already-output))))
+
 (defun tex-buffer ()
   "Run TeX on current buffer.  See \\[tex-region] for more information.
 Does not save the buffer, so it's useful for trying experimental versions.
index 038345e17bdf94a100bd93bc86709e121d3ef03e..004e57bc21a2dfcaa47179afeef5fce952d87051 100644 (file)
 
 ;;;###autoload
 (defcustom texinfo-open-quote "``"
-  "*String inserted by typing \\[texinfo-insert-quote] to open a quotation."
+  "String inserted by typing \\[texinfo-insert-quote] to open a quotation."
   :type 'string
   :group 'texinfo)
 
 ;;;###autoload
 (defcustom texinfo-close-quote "''"
-  "*String inserted by typing \\[texinfo-insert-quote] to close a quotation."
+  "String inserted by typing \\[texinfo-insert-quote] to close a quotation."
   :type 'string
   :group 'texinfo)
 
@@ -296,21 +296,19 @@ chapter."
 
 ;;; Syntax table
 
-(defvar texinfo-mode-syntax-table nil)
-
-(if texinfo-mode-syntax-table
-    nil
-  (setq texinfo-mode-syntax-table (make-syntax-table))
-  (modify-syntax-entry ?\" "." texinfo-mode-syntax-table)
-  (modify-syntax-entry ?\\ "." texinfo-mode-syntax-table)
-  (modify-syntax-entry ?@ "\\" texinfo-mode-syntax-table)
-  (modify-syntax-entry ?\^q "\\" texinfo-mode-syntax-table)
-  (modify-syntax-entry ?\[ "(]" texinfo-mode-syntax-table)
-  (modify-syntax-entry ?\] ")[" texinfo-mode-syntax-table)
-  (modify-syntax-entry ?{ "(}" texinfo-mode-syntax-table)
-  (modify-syntax-entry ?} "){" texinfo-mode-syntax-table)
-  (modify-syntax-entry ?\n ">" texinfo-mode-syntax-table)
-  (modify-syntax-entry ?\' "w" texinfo-mode-syntax-table))
+(defvar texinfo-mode-syntax-table
+  (let ((st (make-syntax-table)))
+    (modify-syntax-entry ?\" "." st)
+    (modify-syntax-entry ?\\ "." st)
+    (modify-syntax-entry ?@ "\\" st)
+    (modify-syntax-entry ?\^q "\\" st)
+    (modify-syntax-entry ?\[ "(]" st)
+    (modify-syntax-entry ?\] ")[" st)
+    (modify-syntax-entry ?{ "(}" st)
+    (modify-syntax-entry ?} "){" st)
+    (modify-syntax-entry ?\n ">" st)
+    (modify-syntax-entry ?\' "w" st)
+    st))
 
 ;; Written by Wolfgang Bangerth <zcg51122@rpool1.rus.uni-stuttgart.de>
 ;; To override this example, set either `imenu-generic-expression'
@@ -399,7 +397,6 @@ Subexpression 1 is what goes into the corresponding `@end' statement.")
 
 \f
 ;;; Keybindings
-(defvar texinfo-mode-map nil)
 
 ;;; Keys common both to Texinfo mode and to TeX shell.
 
@@ -420,65 +417,65 @@ Subexpression 1 is what goes into the corresponding `@end' statement.")
 ;; Mode documentation displays commands in reverse order
 ;; from how they are listed in the texinfo-mode-map.
 
-(if texinfo-mode-map
-    nil
-  (setq texinfo-mode-map (make-sparse-keymap))
-
-  ;; bindings for `texnfo-tex.el'
-  (texinfo-define-common-keys texinfo-mode-map)
-
-  (define-key texinfo-mode-map "\"" 'texinfo-insert-quote)
-
-  ;; bindings for `makeinfo.el'
-  (define-key texinfo-mode-map "\C-c\C-m\C-k" 'kill-compilation)
-  (define-key texinfo-mode-map "\C-c\C-m\C-l"
-    'makeinfo-recenter-compilation-buffer)
-  (define-key texinfo-mode-map "\C-c\C-m\C-r" 'makeinfo-region)
-  (define-key texinfo-mode-map "\C-c\C-m\C-b" 'makeinfo-buffer)
-
-  ;; bindings for `texinfmt.el'
-  (define-key texinfo-mode-map "\C-c\C-e\C-r"    'texinfo-format-region)
-  (define-key texinfo-mode-map "\C-c\C-e\C-b"    'texinfo-format-buffer)
-
-  ;; AUCTeX-like bindings
-  (define-key texinfo-mode-map "\e\r"          'texinfo-insert-@item)
-
-  ;; bindings for updating nodes and menus
-
-  (define-key texinfo-mode-map "\C-c\C-um"   'texinfo-master-menu)
-
-  (define-key texinfo-mode-map "\C-c\C-u\C-m"   'texinfo-make-menu)
-  (define-key texinfo-mode-map "\C-c\C-u\C-n"   'texinfo-update-node)
-  (define-key texinfo-mode-map "\C-c\C-u\C-e"   'texinfo-every-node-update)
-  (define-key texinfo-mode-map "\C-c\C-u\C-a"   'texinfo-all-menus-update)
-
-  (define-key texinfo-mode-map "\C-c\C-s"     'texinfo-show-structure)
-
-  (define-key texinfo-mode-map "\C-c}"          'up-list)
-  (define-key texinfo-mode-map "\C-c]"          'up-list)
-  (define-key texinfo-mode-map "\C-c{"         'texinfo-insert-braces)
-
-  ;; bindings for inserting strings
-  (define-key texinfo-mode-map "\C-c\C-o"     'texinfo-insert-block)
-  (define-key texinfo-mode-map "\C-c\C-c\C-d" 'texinfo-start-menu-description)
-  (define-key texinfo-mode-map "\C-c\C-c\C-s" 'texinfo-insert-@strong)
-  (define-key texinfo-mode-map "\C-c\C-c\C-e" 'texinfo-insert-@emph)
-
-  (define-key texinfo-mode-map "\C-c\C-cv"    'texinfo-insert-@var)
-  (define-key texinfo-mode-map "\C-c\C-cu"    'texinfo-insert-@uref)
-  (define-key texinfo-mode-map "\C-c\C-ct"    'texinfo-insert-@table)
-  (define-key texinfo-mode-map "\C-c\C-cs"    'texinfo-insert-@samp)
-  (define-key texinfo-mode-map "\C-c\C-cq"    'texinfo-insert-@quotation)
-  (define-key texinfo-mode-map "\C-c\C-co"    'texinfo-insert-@noindent)
-  (define-key texinfo-mode-map "\C-c\C-cn"    'texinfo-insert-@node)
-  (define-key texinfo-mode-map "\C-c\C-cm"    'texinfo-insert-@email)
-  (define-key texinfo-mode-map "\C-c\C-ck"    'texinfo-insert-@kbd)
-  (define-key texinfo-mode-map "\C-c\C-ci"    'texinfo-insert-@item)
-  (define-key texinfo-mode-map "\C-c\C-cf"    'texinfo-insert-@file)
-  (define-key texinfo-mode-map "\C-c\C-cx"    'texinfo-insert-@example)
-  (define-key texinfo-mode-map "\C-c\C-ce"    'texinfo-insert-@end)
-  (define-key texinfo-mode-map "\C-c\C-cd"    'texinfo-insert-@dfn)
-  (define-key texinfo-mode-map "\C-c\C-cc"    'texinfo-insert-@code))
+(defvar texinfo-mode-map
+  (let ((map (make-sparse-keymap)))
+
+    ;; bindings for `texnfo-tex.el'
+    (texinfo-define-common-keys map)
+
+    (define-key map "\"" 'texinfo-insert-quote)
+
+    ;; bindings for `makeinfo.el'
+    (define-key map "\C-c\C-m\C-k" 'kill-compilation)
+    (define-key map "\C-c\C-m\C-l"
+      'makeinfo-recenter-compilation-buffer)
+    (define-key map "\C-c\C-m\C-r" 'makeinfo-region)
+    (define-key map "\C-c\C-m\C-b" 'makeinfo-buffer)
+
+    ;; bindings for `texinfmt.el'
+    (define-key map "\C-c\C-e\C-r"    'texinfo-format-region)
+    (define-key map "\C-c\C-e\C-b"    'texinfo-format-buffer)
+
+    ;; AUCTeX-like bindings
+    (define-key map "\e\r"             'texinfo-insert-@item)
+
+    ;; bindings for updating nodes and menus
+
+    (define-key map "\C-c\C-um"   'texinfo-master-menu)
+
+    (define-key map "\C-c\C-u\C-m"   'texinfo-make-menu)
+    (define-key map "\C-c\C-u\C-n"   'texinfo-update-node)
+    (define-key map "\C-c\C-u\C-e"   'texinfo-every-node-update)
+    (define-key map "\C-c\C-u\C-a"   'texinfo-all-menus-update)
+
+    (define-key map "\C-c\C-s"     'texinfo-show-structure)
+
+    (define-key map "\C-c}"          'up-list)
+    (define-key map "\C-c]"          'up-list)
+    (define-key map "\C-c{"            'texinfo-insert-braces)
+
+    ;; bindings for inserting strings
+    (define-key map "\C-c\C-o"     'texinfo-insert-block)
+    (define-key map "\C-c\C-c\C-d" 'texinfo-start-menu-description)
+    (define-key map "\C-c\C-c\C-s" 'texinfo-insert-@strong)
+    (define-key map "\C-c\C-c\C-e" 'texinfo-insert-@emph)
+
+    (define-key map "\C-c\C-cv"    'texinfo-insert-@var)
+    (define-key map "\C-c\C-cu"    'texinfo-insert-@uref)
+    (define-key map "\C-c\C-ct"    'texinfo-insert-@table)
+    (define-key map "\C-c\C-cs"    'texinfo-insert-@samp)
+    (define-key map "\C-c\C-cq"    'texinfo-insert-@quotation)
+    (define-key map "\C-c\C-co"    'texinfo-insert-@noindent)
+    (define-key map "\C-c\C-cn"    'texinfo-insert-@node)
+    (define-key map "\C-c\C-cm"    'texinfo-insert-@email)
+    (define-key map "\C-c\C-ck"    'texinfo-insert-@kbd)
+    (define-key map "\C-c\C-ci"    'texinfo-insert-@item)
+    (define-key map "\C-c\C-cf"    'texinfo-insert-@file)
+    (define-key map "\C-c\C-cx"    'texinfo-insert-@example)
+    (define-key map "\C-c\C-ce"    'texinfo-insert-@end)
+    (define-key map "\C-c\C-cd"    'texinfo-insert-@dfn)
+    (define-key map "\C-c\C-cc"    'texinfo-insert-@code)
+    map))
 
 (easy-menu-define texinfo-mode-menu
   texinfo-mode-map
@@ -947,22 +944,22 @@ to jump to the corresponding spot in the Texinfo source file."
 ;;; The  tex  and  print  function definitions:
 
 (defcustom texinfo-texi2dvi-command "texi2dvi"
-  "*Command used by `texinfo-tex-buffer' to run TeX and texindex on a buffer."
+  "Command used by `texinfo-tex-buffer' to run TeX and texindex on a buffer."
   :type 'string
   :group 'texinfo)
 
 (defcustom texinfo-tex-command "tex"
-  "*Command used by `texinfo-tex-region' to run TeX on a region."
+  "Command used by `texinfo-tex-region' to run TeX on a region."
   :type 'string
   :group 'texinfo)
 
 (defcustom texinfo-texindex-command "texindex"
-  "*Command used by `texinfo-texindex' to sort unsorted index files."
+  "Command used by `texinfo-texindex' to sort unsorted index files."
   :type 'string
   :group 'texinfo)
 
 (defcustom texinfo-delete-from-print-queue-command "lprm"
-  "*Command string used to delete a job from the line printer queue.
+  "Command string used to delete a job from the line printer queue.
 Command is used by \\[texinfo-delete-from-print-queue] based on
 number provided by a previous \\[tex-show-print-queue]
 command."
index b6b5e46aa27564e3aa69a85359fc6238c8f03ea9..6deed45bf5c1cb3e1f48f4f5fd1b04c4416e3038 100644 (file)
@@ -47,7 +47,6 @@
 (defvar tmm-table-undef)
 
 ;;;###autoload (define-key global-map "\M-`" 'tmm-menubar)
-;;;###autoload (define-key global-map [f10] 'tmm-menubar)
 ;;;###autoload (define-key global-map [menu-bar mouse-1] 'tmm-menubar-mouse)
 
 ;;;###autoload
@@ -101,7 +100,7 @@ See the documentation for `tmm-prompt'."
   (tmm-menubar (car (posn-x-y (event-start event)))))
 
 (defcustom tmm-mid-prompt "==>"
-  "*String to insert between shortcut and menu item.
+  "String to insert between shortcut and menu item.
 If nil, there will be no shortcuts. It should not consist only of spaces,
 or else the correct item might not be found in the `*Completions*' buffer."
   :type 'string
@@ -116,14 +115,14 @@ Alternatively, you can use Up/Down keys (or your History keys) to change
 the item in the minibuffer, and press RET when you are done, or press the
 marked letters to pick up your choice.  Type C-g or ESC ESC ESC to cancel.
 "
-  "*Help text to insert on the top of the completion buffer.
+  "Help text to insert on the top of the completion buffer.
 To save space, you can set this to nil,
 in which case the standard introduction text is deleted too."
   :type '(choice string (const nil))
   :group 'tmm)
 
 (defcustom tmm-shortcut-style '(downcase upcase)
-  "*What letters to use as menu shortcuts.
+  "What letters to use as menu shortcuts.
 Must be either one of the symbols `downcase' or `upcase',
 or else a list of the two in the order you prefer."
   :type '(choice (const downcase)
@@ -132,7 +131,7 @@ or else a list of the two in the order you prefer."
   :group 'tmm)
 
 (defcustom tmm-shortcut-words 2
-  "*How many successive words to try for shortcuts, nil means all.
+  "How many successive words to try for shortcuts, nil means all.
 If you use only one of `downcase' or `upcase' for `tmm-shortcut-style',
 specify nil for this variable."
   :type '(choice integer (const nil))
@@ -232,13 +231,11 @@ Its value should be an event that has a binding in MENU."
                            tmm-km-list nil t nil
                            (cons 'history
                                  (- (* 2 history-len) index-of-default))))
-                  (save-excursion
-                    (remove-hook 'minibuffer-setup-hook 'tmm-add-prompt)
-                    (if (get-buffer "*Completions*")
-                        (progn
-                          (set-buffer "*Completions*")
-                          (use-local-map tmm-old-comp-map)
-                          (bury-buffer (current-buffer))))))))))
+                   (remove-hook 'minibuffer-setup-hook 'tmm-add-prompt)
+                   (if (get-buffer "*Completions*")
+                       (with-current-buffer "*Completions*"
+                         (use-local-map tmm-old-comp-map)
+                         (bury-buffer (current-buffer)))))))))
       (setq choice (cdr (assoc out tmm-km-list)))
       (and (null choice)
           (> (length out) (length tmm-c-prompt))
@@ -566,9 +563,10 @@ of `menu-bar-final-items'."
          ;; Return that keymap.
          bind))))
 
+;; Huh?  What's that about?  --Stef
 (add-hook 'calendar-load-hook (lambda () (require 'cal-menu)))
 
 (provide 'tmm)
 
-;;; arch-tag: e7ddbdb6-4b95-4da3-afbe-ad6063d112f4
+;; arch-tag: e7ddbdb6-4b95-4da3-afbe-ad6063d112f4
 ;;; tmm.el ends here
index 768fee70411f6597e111bd3981324d58022e6b1c..e3635f47fe70241ad237bea8e52e74cd24cc5591 100644 (file)
@@ -55,22 +55,22 @@ conveniently adding tool bar items."
   :group 'mouse
   :group 'frames
   (and (display-images-p)
-       (let ((lines (if tool-bar-mode 1 0)))
-        ;; Alter existing frames...
-        (mapc (lambda (frame)
-                (modify-frame-parameters frame
-                                         (list (cons 'tool-bar-lines lines))))
-              (frame-list))
-        ;; ...and future ones.
-        (let ((elt (assq 'tool-bar-lines default-frame-alist)))
-          (if elt
-              (setcdr elt lines)
-            (add-to-list 'default-frame-alist (cons 'tool-bar-lines lines)))))
+       (modify-all-frames-parameters (list (cons 'tool-bar-lines
+                                                (if tool-bar-mode 1 0))))
        (if (and tool-bar-mode
-               (display-graphic-p)
-               (= 1 (length (default-value 'tool-bar-map)))) ; not yet setup
+               (display-graphic-p))
           (tool-bar-setup))))
 
+;;;###autoload
+;; Used in the Show/Hide menu, to have the toggle reflect the current frame.
+(defun toggle-tool-bar-mode-from-frame (&optional arg)
+  "Toggle tool bar on or off, based on the status of the current frame.
+See `tool-bar-mode' for more information."
+  (interactive (list (or current-prefix-arg 'toggle)))
+  (if (eq arg 'toggle)
+      (tool-bar-mode (if (> (frame-parameter nil 'tool-bar-lines) 0) 0 1))
+    (tool-bar-mode arg)))
+
 ;;;###autoload
 ;; We want to pretend the toolbar by standard is on, as this will make
 ;; customize consider disabling the toolbar a customization, and save
@@ -228,42 +228,47 @@ holds a keymap."
 
 ;;; Set up some global items.  Additions/deletions up for grabs.
 
-(defun tool-bar-setup ()
-  ;; People say it's bad to have EXIT on the tool bar, since users
-  ;; might inadvertently click that button.
-  ;;(tool-bar-add-item-from-menu 'save-buffers-kill-emacs "exit")
-  (tool-bar-add-item-from-menu 'find-file "new")
-  (tool-bar-add-item-from-menu 'menu-find-file-existing "open")
-  (tool-bar-add-item-from-menu 'dired "diropen")
-  (tool-bar-add-item-from-menu 'kill-this-buffer "close")
-  (tool-bar-add-item-from-menu 'save-buffer "save" nil
-                              :visible '(or buffer-file-name
-                                            (not (eq 'special
-                                                     (get major-mode
-                                                          'mode-class)))))
-  (tool-bar-add-item-from-menu 'write-file "saveas" nil
-                              :visible '(or buffer-file-name
-                                            (not (eq 'special
-                                                     (get major-mode
-                                                          'mode-class)))))
-  (tool-bar-add-item-from-menu 'undo "undo" nil
-                              :visible '(not (eq 'special (get major-mode
-                                                               'mode-class))))
-  (tool-bar-add-item-from-menu (lookup-key menu-bar-edit-menu [cut])
-                              "cut" nil
-                              :visible '(not (eq 'special (get major-mode
-                                                               'mode-class))))
-  (tool-bar-add-item-from-menu (lookup-key menu-bar-edit-menu [copy])
-                              "copy")
-  (tool-bar-add-item-from-menu (lookup-key menu-bar-edit-menu [paste])
-                              "paste" nil
-                              :visible '(not (eq 'special (get major-mode
-                                                               'mode-class))))
-  (tool-bar-add-item-from-menu 'nonincremental-search-forward "search")
-  ;;(tool-bar-add-item-from-menu 'ispell-buffer "spell")
-
-  ;; There's no icon appropriate for News and we need a command rather
-  ;; than a lambda for Read Mail.
+(defvar tool-bar-setup nil
+  "t if the tool-bar has been set up by `tool-bar-setup'.")
+
+(defun tool-bar-setup (&optional frame)
+  (unless tool-bar-setup
+    (with-selected-frame (or frame (selected-frame))
+      ;; People say it's bad to have EXIT on the tool bar, since users
+      ;; might inadvertently click that button.
+      ;;(tool-bar-add-item-from-menu 'save-buffers-kill-emacs "exit")
+      (tool-bar-add-item-from-menu 'find-file "new")
+      (tool-bar-add-item-from-menu 'menu-find-file-existing "open")
+      (tool-bar-add-item-from-menu 'dired "diropen")
+      (tool-bar-add-item-from-menu 'kill-this-buffer "close")
+      (tool-bar-add-item-from-menu 'save-buffer "save" nil
+                                  :visible '(or buffer-file-name
+                                                (not (eq 'special
+                                                         (get major-mode
+                                                              'mode-class)))))
+      (tool-bar-add-item-from-menu 'write-file "saveas" nil
+                                  :visible '(or buffer-file-name
+                                                (not (eq 'special
+                                                         (get major-mode
+                                                              'mode-class)))))
+      (tool-bar-add-item-from-menu 'undo "undo" nil
+                                  :visible '(not (eq 'special (get major-mode
+                                                                   'mode-class))))
+      (tool-bar-add-item-from-menu (lookup-key menu-bar-edit-menu [cut])
+                                  "cut" nil
+                                  :visible '(not (eq 'special (get major-mode
+                                                                   'mode-class))))
+      (tool-bar-add-item-from-menu (lookup-key menu-bar-edit-menu [copy])
+                                  "copy")
+      (tool-bar-add-item-from-menu (lookup-key menu-bar-edit-menu [paste])
+                                  "paste" nil
+                                  :visible '(not (eq 'special (get major-mode
+                                                                   'mode-class))))
+      (tool-bar-add-item-from-menu 'nonincremental-search-forward "search")
+      ;;(tool-bar-add-item-from-menu 'ispell-buffer "spell")
+
+      ;; There's no icon appropriate for News and we need a command rather
+      ;; than a lambda for Read Mail.
   ;;(tool-bar-add-item-from-menu 'compose-mail "mail/compose")
 
   (tool-bar-add-item-from-menu 'print-buffer "print")
@@ -281,9 +286,9 @@ holds a keymap."
                                (popup-menu menu-bar-help-menu))
                       'help
                       :help "Pop up the Help menu"))
-  )
+  (setq tool-bar-setup t))))
 
-(provide 'tool-bar)
 
+(provide 'tool-bar)
 ;;; arch-tag: 15f30f0a-d0d7-4d50-bbb7-f48fd0c8582f
 ;;; tool-bar.el ends here
index 841facff69caf452bfb607625ae16d47184a167e..26fb0e503f787b17670d8a9617049343f91988ad 100644 (file)
@@ -210,14 +210,12 @@ LEFT and RIGHT are the elements to compare."
 (defconst tutorial--default-keys
   ;; On window system, `suspend-emacs' is replaced in the default
   ;; keymap
-  (let* ((suspend-emacs (if window-system
-                            'iconify-or-deiconify-frame
-                          'suspend-emacs))
+  (let* ((suspend-emacs 'suspend-frame)
          (default-keys
            `((ESC-prefix [27])
              (Control-X-prefix [?\C-x])
              (mode-specific-command-prefix [?\C-c])
-             (save-buffers-kill-emacs [?\C-x ?\C-c])
+             (save-buffers-kill-terminal [?\C-x ?\C-c])
 
              ;; * SUMMARY
              (scroll-up [?\C-v])
@@ -293,7 +291,7 @@ LEFT and RIGHT are the elements to compare."
              ;; * MODE LINE
              (describe-mode [?\C-h ?m])
              (set-fill-column [?\C-x ?f])
-             (fill-paragraph [?\M-q])
+             (fill-paragraph-or-region [?\M-q])
 
              ;; * SEARCHING
              (isearch-forward [?\C-s])
index 46a2bb62a75247980efd77651ef25f647301af5b..5da6a1fbae34faf2b2cf77d2493fc75545dfba4b 100644 (file)
@@ -1,3 +1,45 @@
+2007-09-26  Juanma Barranquero  <lekktu@gmail.com>
+
+       * url-dav.el (top):
+       * url-vars.el (top): Use `mapc' rather than `mapcar'.
+
+2007-09-22  Diane Murray  <disumu@x3y2z1.net>
+
+       * url-misc.el (url-generic-emulator-loader): Send the port as a
+        string to `url-do-terminal-emulator'.
+
+2007-09-21  Diane Murray  <disumu@x3y2z1.net>
+
+       * url-news.el (url-news-fetch-newsgroup): Fix formatting of Gnus
+       method.
+
+       * url-util.el (url-get-normalized-date): Pass full timezone
+       information to timezone-make-date-arpa-standard, since zone name
+       may be unknown.
+
+2007-09-03  Diane Murray  <disumu@x3y2z1.net>
+
+       * url-http.el (url-http-parse-headers): Bind the current buffer
+       rather than calling `url-mark-buffer-as-dead' with
+       `current-buffer', so that the correct buffer is killed if
+       `url-retrieve-synchronously' gets redirected to a new URL.
+
+2007-08-31  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * url-parse.el (url): Use defstruct rather than macros.
+       (url-generic-parse-url):
+       * url-util.el (url-normalize-url, url-truncate-url-for-viewing):
+       * url-methods.el (url-scheme-register-proxy):
+       * url-mailto.el (url-mailto):
+       * url-file.el (url-file-build-filename):
+       * url-expand.el (url-identity-expander, url-default-expander):
+       Update all callers.
+
+2007-08-09  Edward O'Connor  <hober0@gmail.com>  (tiny change)
+
+       * url-auth.el (url-basic-auth): When prompting for username
+       and password, default to the username and password in the URL.
+
 2007-08-08  Glenn Morris  <rgm@gnu.org>
 
        * url-auth.el, url-cache.el, url-dav.el, url-file.el, vc-dav.el:
index 3c33fd914e5079280c10c5e346625f30d56192d0..e48a4e293bda388bc8a7fbc4e524940862882804 100644 (file)
@@ -317,5 +317,5 @@ RATING   a rating between 1 and 10 of the strength of the authentication.
 
 (provide 'url-auth)
 
-;;; arch-tag: 04058625-616d-44e4-9dbf-4b46b00b2a91
+;; arch-tag: 04058625-616d-44e4-9dbf-4b46b00b2a91
 ;;; url-auth.el ends here
index b58c16728656e4f06bb1773c16a7cfc4c1ef71af..3c2ea8721347b7493e450e4ce0c85b79cf40543e 100644 (file)
     (while children
       (setq node (car children)
            node-type (intern
-                      (or 
+                      (or
                        (cdr-safe (assq url-dav-datatype-attribute
                                        (xml-node-attributes node)))
                        "unknown"))
@@ -864,7 +864,7 @@ If NOSORT is non-nil, the list is not sorted--its order is unpredictable.
         (exists-p (url-http-file-exists-p newname)))
 
     (if (and exists-p
-            (or 
+            (or
              (null overwrite)
              (and (numberp overwrite)
                   (not (yes-or-no-p
@@ -933,19 +933,19 @@ Returns nil if DIR contains no name starting with FILE."
 (defun url-dav-register-handler (op)
   (put op 'url-file-handlers (intern-soft (format "url-dav-%s" op))))
 
-(mapcar 'url-dav-register-handler
-        ;; These handlers are disabled because they incorrectly presume that
-        ;; the URL specifies an HTTP location and thus break FTP URLs.
-       '(;; file-name-all-completions
-         ;; file-name-completion
-         ;; rename-file
-         ;; make-directory
-         ;; file-directory-p
-         ;; directory-files
-         ;; delete-file
-         ;; delete-directory
-         ;; file-attributes
-          ))
+(mapc 'url-dav-register-handler
+      ;; These handlers are disabled because they incorrectly presume that
+      ;; the URL specifies an HTTP location and thus break FTP URLs.
+      '(;; file-name-all-completions
+       ;; file-name-completion
+       ;; rename-file
+       ;; make-directory
+       ;; file-directory-p
+       ;; directory-files
+       ;; delete-file
+       ;; delete-directory
+       ;; file-attributes
+       ))
 
 \f
 ;;; Version Control backend cruft
index 7b3b105d951c3d113202a825418dcfd4944b6634..df4de29a619e367acf4d777d0ec79e79752ec6f8 100644 (file)
@@ -106,24 +106,24 @@ path components followed by `..' are removed, along with the `..' itself."
       (url-recreate-url urlobj)))))
 
 (defun url-identity-expander (urlobj defobj)
-  (url-set-type urlobj (or (url-type urlobj) (url-type defobj))))
+  (setf (url-type urlobj) (or (url-type urlobj) (url-type defobj))))
 
 (defun url-default-expander (urlobj defobj)
   ;; The default expansion routine - urlobj is modified by side effect!
   (if (url-type urlobj)
       ;; Well, they told us the scheme, let's just go with it.
       nil
-    (url-set-type urlobj (or (url-type urlobj) (url-type defobj)))
-    (url-set-port urlobj (or (url-port urlobj)
-                            (and (string= (url-type urlobj)
-                                          (url-type defobj))
-                                 (url-port defobj))))
+    (setf (url-type urlobj) (or (url-type urlobj) (url-type defobj)))
+    (setf (url-port urlobj) (or (url-port urlobj)
+                                (and (string= (url-type urlobj)
+                                              (url-type defobj))
+                                     (url-port defobj))))
     (if (not (string= "file" (url-type urlobj)))
-       (url-set-host urlobj (or (url-host urlobj) (url-host defobj))))
+       (setf (url-host urlobj) (or (url-host urlobj) (url-host defobj))))
     (if (string= "ftp"  (url-type urlobj))
-       (url-set-user urlobj (or (url-user urlobj) (url-user defobj))))
+       (setf (url-user urlobj) (or (url-user urlobj) (url-user defobj))))
     (if (string= (url-filename urlobj) "")
-       (url-set-filename urlobj "/"))
+       (setf (url-filename urlobj) "/"))
     (if (string-match "^/" (url-filename urlobj))
        nil
       (let ((query nil)
@@ -136,9 +136,10 @@ path components followed by `..' are removed, along with the `..' itself."
          (setq file (url-filename urlobj)))
        (setq file (url-expander-remove-relative-links
                    (concat (url-basepath (url-filename defobj)) file)))
-       (url-set-filename urlobj (if query (concat file sepchar query) file))))))
+       (setf (url-filename urlobj)
+              (if query (concat file sepchar query) file))))))
 
 (provide 'url-expand)
 
-;;; arch-tag: 7b5f744b-b721-49da-be47-484631680a5a
+;; arch-tag: 7b5f744b-b721-49da-be47-484631680a5a
 ;;; url-expand.el ends here
index 6e771c9cd6928f2637530230473027c1c66f5138..c361016856b26c7d26a93c5399a224ea7b57d931 100644 (file)
@@ -127,10 +127,11 @@ to them."
     ;; straighten it out for us?
     ;; (if (and (file-directory-p filename)
     ;;          (not (string-match (format "%c$" directory-sep-char) filename)))
-    ;;     (url-set-filename url (format "%s%c" filename directory-sep-char)))
+    ;;     (setf (url-filename url)
+    ;;           (format "%s%c" filename directory-sep-char)))
     (if (and (file-directory-p filename)
             (not (string-match "/\\'" filename)))
-       (url-set-filename url (format "%s/" filename)))
+       (setf (url-filename url) (format "%s/" filename)))
 
 
     ;; If it is a directory, look for an index file first.
index 148449d41cf630af0fd6667b74c143cab2ad4f7d..c5931c7d877e146df1dac3ffc9b315627abcea08 100644 (file)
@@ -429,7 +429,8 @@ should be shown to the user."
       (when (and connection
                 (string= (downcase connection) "close"))
        (delete-process url-http-process)))))
-  (let ((class nil)
+  (let ((buffer (current-buffer))
+       (class nil)
        (success nil))
     (setq class (/ url-http-response-status 100))
     (url-http-debug "Parsed HTTP headers: class=%d status=%d" class url-http-response-status)
@@ -447,7 +448,7 @@ should be shown to the user."
        ;; 100 = Continue with request
        ;; 101 = Switching protocols
        ;; 102 = Processing (Added by DAV)
-       (url-mark-buffer-as-dead (current-buffer))
+       (url-mark-buffer-as-dead buffer)
        (error "HTTP responses in class 1xx not supported (%d)" url-http-response-status))
       (2                               ; Success
        ;; 200 Ok
@@ -461,14 +462,14 @@ should be shown to the user."
        (case url-http-response-status
         ((204 205)
          ;; No new data, just stay at the same document
-         (url-mark-buffer-as-dead (current-buffer))
+         (url-mark-buffer-as-dead buffer)
          (setq success t))
         (otherwise
          ;; Generic success for all others.  Store in the cache, and
          ;; mark it as successful.
          (widen)
          (if (and url-automatic-caching (equal url-http-method "GET"))
-             (url-store-in-cache (current-buffer)))
+             (url-store-in-cache buffer))
          (setq success t))))
       (3                               ; Redirection
        ;; 300 Multiple choices
@@ -584,7 +585,7 @@ should be shown to the user."
                        (url-retrieve-internal
                         redirect-uri url-callback-function
                         url-callback-arguments))
-                  (url-mark-buffer-as-dead (current-buffer)))
+                  (url-mark-buffer-as-dead buffer))
               ;; We hit url-max-redirections, so issue an error and
               ;; stop redirecting.
               (url-http-debug "Maximum redirections reached")
@@ -625,7 +626,7 @@ should be shown to the user."
          (url-http-handle-authentication nil))
         (402
          ;; This code is reserved for future use
-         (url-mark-buffer-as-dead (current-buffer))
+         (url-mark-buffer-as-dead buffer)
          (error "Somebody wants you to give them money"))
         (403
          ;; The server understood the request, but is refusing to
@@ -780,7 +781,7 @@ should be shown to the user."
        (error "Unknown class of HTTP response code: %d (%d)"
              class url-http-response-status)))
     (if (not success)
-       (url-mark-buffer-as-dead (current-buffer)))
+       (url-mark-buffer-as-dead buffer))
     (url-http-debug "Finished parsing HTTP headers: %S" success)
     (widen)
     success))
index 10d08b9633ff355a426990a8409cc782666b871c..4b15d07245b0155786779c6fe169b4965da1a55c 100644 (file)
@@ -66,7 +66,7 @@
   (if (url-user url)
       ;; malformed mailto URL (mailto://wmperry@gnu.org) instead of
       ;; mailto:wmperry@gnu.org
-      (url-set-filename url (concat (url-user url) "@" (url-filename url))))
+      (setf (url-filename url) (concat (url-user url) "@" (url-filename url))))
   (setq url (url-filename url))
   (let (to args source-url subject func headers-start)
     (if (string-match (regexp-quote "?") url)
index 89c36bec73735ff010bf3684d3dd55e7c55a0d07..94dcd49f00d757353950b55eda47688137357876 100644 (file)
      ;; First check if its something like hostname:port
      ((string-match "^\\([^:]+\\):\\([0-9]+\\)$" env-proxy)
       (setq urlobj (url-generic-parse-url nil)) ; Get a blank object
-      (url-set-type urlobj "http")
-      (url-set-host urlobj (match-string 1 env-proxy))
-      (url-set-port urlobj (string-to-number (match-string 2 env-proxy))))
+      (setf (url-type urlobj) "http")
+      (setf (url-host urlobj) (match-string 1 env-proxy))
+      (setf (url-port urlobj) (string-to-number (match-string 2 env-proxy))))
      ;; Then check if its a fully specified URL
      ((string-match url-nonrelative-link env-proxy)
       (setq urlobj (url-generic-parse-url env-proxy))
-      (url-set-type urlobj "http")
-      (url-set-target urlobj nil))
+      (setf (url-type urlobj) "http")
+      (setf (url-target urlobj) nil))
      ;; Finally, fall back on the assumption that its just a hostname
      (t
       (setq urlobj (url-generic-parse-url nil)) ; Get a blank object
-      (url-set-type urlobj "http")
-      (url-set-host urlobj env-proxy)))
+      (setf (url-type urlobj) "http")
+      (setf (url-host urlobj) env-proxy)))
 
      (if (and (not cur-proxy) urlobj)
         (progn
index a793cacc5bc9ed3287b4ef92c723465ce2308618..f70726407d37f28eb0be739ed1678a19380da7ca 100644 (file)
@@ -75,7 +75,7 @@
   (let* ((type (intern (downcase (url-type url))))
         (server (url-host url))
         (name (url-user url))
-        (port (url-port url)))
+        (port (number-to-string (url-port url))))
     (url-do-terminal-emulator type server port name))
   nil)
 
index 48f332fe7a063df41bba06d677fa872d94bd253d..d774270aced0577207ccf8adcfe46e9a41cd010c 100644 (file)
   (goto-char (point-min))
   (gnus-group-read-ephemeral-group newsgroup
                                   (list 'nntp host
-                                        'nntp-open-connection-function
-                                        nntp-open-connection-function)
+                                        (list 'nntp-open-connection-function
+                                              nntp-open-connection-function))
                                   nil
                                   (cons (current-buffer) 'browse)))
 
index 3dfc7ac86a206366fd88845efa1d9b2cc487f991..9f3437f401c7a8468a37f2c667484bc110b77531 100644 (file)
 ;;; Code:
 
 (require 'url-vars)
+(eval-when-compile (require 'cl))
 
 (autoload 'url-scheme-get-property "url-methods")
 
-(defmacro url-type (urlobj)
-  `(aref ,urlobj 0))
+(defstruct (url
+            (:constructor nil)
+            (:constructor url-parse-make-urlobj
+                          (&optional type user password host portspec filename
+                                     target attributes fullness))
+            (:copier nil))
+  type user password host portspec filename target attributes fullness)
 
-(defmacro url-user (urlobj)
-  `(aref ,urlobj 1))
+(defsubst url-port (urlobj)
+  (or (url-portspec urlobj)
+      (if (url-fullness urlobj)
+          (url-scheme-get-property (url-type urlobj) 'default-port))))
 
-(defmacro url-password (urlobj)
-  `(aref ,urlobj 2))
-
-(defmacro url-host (urlobj)
-  `(aref ,urlobj 3))
-
-(defmacro url-port (urlobj)
-  `(or (aref ,urlobj 4)
-      (if (url-fullness ,urlobj)
-         (url-scheme-get-property (url-type ,urlobj) 'default-port))))
-
-(defmacro url-filename (urlobj)
-  `(aref ,urlobj 5))
-
-(defmacro url-target (urlobj)
-  `(aref ,urlobj 6))
-
-(defmacro url-attributes (urlobj)
-  `(aref ,urlobj 7))
-
-(defmacro url-fullness (urlobj)
-  `(aref ,urlobj 8))
-
-(defmacro url-set-type (urlobj type)
-  `(aset ,urlobj 0 ,type))
-
-(defmacro url-set-user (urlobj user)
-  `(aset ,urlobj 1 ,user))
-
-(defmacro url-set-password (urlobj pass)
-  `(aset ,urlobj 2 ,pass))
-
-(defmacro url-set-host (urlobj host)
-  `(aset ,urlobj 3 ,host))
-
-(defmacro url-set-port (urlobj port)
-  `(aset ,urlobj 4 ,port))
-
-(defmacro url-set-filename (urlobj file)
-  `(aset ,urlobj 5 ,file))
-
-(defmacro url-set-target (urlobj targ)
-  `(aset ,urlobj 6 ,targ))
-
-(defmacro url-set-attributes (urlobj targ)
-  `(aset ,urlobj 7 ,targ))
-
-(defmacro url-set-full (urlobj val)
-  `(aset ,urlobj 8 ,val))
+(defsetf url-port (urlobj) (port) `(setf (url-portspec ,urlobj) ,port))
 
 ;;;###autoload
 (defun url-recreate-url (urlobj)
@@ -123,17 +83,14 @@ Format is:
   ;; See RFC 3986.
   (cond
    ((null url)
-    (make-vector 9 nil))
+    (url-parse-make-urlobj))
    ((or (not (string-match url-nonrelative-link url))
        (= ?/ (string-to-char url)))
     ;; This isn't correct, as a relative URL can be a fragment link
     ;; (e.g. "#foo") and many other things (see section 4.2).
     ;; However, let's not fix something that isn't broken, especially
     ;; when close to a release.
-    (let ((retval (make-vector 9 nil)))
-      (url-set-filename retval url)
-      (url-set-full retval nil)
-      retval))
+    (url-parse-make-urlobj nil nil nil nil nil url))
    (t
     (with-temp-buffer
       (set-syntax-table url-parse-syntax-table)
@@ -214,7 +171,8 @@ Format is:
        (setq file (buffer-substring save-pos (point)))
        (if (and host (string-match "%[0-9][0-9]" host))
            (setq host (url-unhex-string host)))
-       (vector prot user pass host port file refs attr full))))))
+       (url-parse-make-urlobj
+         prot user pass host port file refs attr full))))))
 
 (provide 'url-parse)
 
index fa971da5d17d578be2a7d6c056e9376657e52049..9f73fa435be4b1fc6bf9ccd6d208aa8ae0cdc741 100644 (file)
@@ -168,7 +168,7 @@ Strips out default port numbers, etc."
          type (url-type data))
     (if (member type '("www" "about" "mailto" "info"))
        (setq retval url)
-      (url-set-target data nil)
+      (setf (url-target data) nil)
       (setq retval (url-recreate-url data)))
     retval))
 
@@ -190,7 +190,7 @@ Will not do anything if `url-show-status' is nil."
   (let* ((raw (if specified-time (current-time-string specified-time)
                (current-time-string)))
         (gmt (timezone-make-date-arpa-standard raw
-                                               (nth 1 (current-time-zone))
+                                               (current-time-zone)
                                                "GMT"))
         (parsed (timezone-parse-date gmt))
         (day (cdr-safe (assoc (substring raw 0 3) url-weekday-alist)))
@@ -421,13 +421,13 @@ WIDTH defaults to the current frame width."
                  (string-match "/" fname))
        (setq fname (substring fname (match-end 0) nil)
              modified (1+ modified))
-       (url-set-filename urlobj fname)
+       (setf (url-filename urlobj) fname)
        (setq url (url-recreate-url urlobj)
              str-width (length url)))
       (if (> modified 1)
          (setq fname (concat "/.../" fname))
        (setq fname (concat "/" fname)))
-      (url-set-filename urlobj fname)
+      (setf (url-filename urlobj) fname)
       (setq url (url-recreate-url urlobj)))
     url))
 
index 35e69e7990b9c7deb9081f6098a5ef08013c1e31..7ddab8aab6431d4b15c6d6969322a130496b46cc 100644 (file)
 (defvar url-current-mime-headers nil
   "A parsed representation of the MIME headers for the current url.")
 
-(mapcar 'make-variable-buffer-local
-       '(
-         url-current-object
-         url-current-referer
-         url-current-mime-headers
-         ))
+(mapc 'make-variable-buffer-local
+      '(
+       url-current-object
+       url-current-referer
+       url-current-mime-headers
+       ))
 
 (defcustom url-honor-refresh-requests t
   "*Whether to do automatic page reloads.
index 19c5c0ac9a063d0d35763fde3174bf7c757e52be..840a19a0f6673c0e442b98b686d8ea66eb7e07f8 100644 (file)
@@ -370,7 +370,7 @@ Return non-nil if FILE is unchanged."
 (defun vc-arch-checkin (files rev comment)
   (if rev (error "Committing to a specific revision is unsupported"))
   ;; FIXME: This implementation probably only works for singleton filesets
-  (let ((summary (file-relative-name (car file) (vc-arch-root (car files)))))
+  (let ((summary (file-relative-name (car files) (vc-arch-root (car files)))))
     ;; Extract a summary from the comment.
     (when (or (string-match "\\`Summary:[ \t]*\\(.*[^ \t\n]\\)\\([ \t]*\n\\)*" comment)
              (string-match "\\`[ \t]*\\(.*[^ \t\n]\\)[ \t]*\\(\n?\\'\\|\n\\([ \t]*\n\\)+\\)" comment))
index c42a64969f2daf3f794f4f8c12ad78b3e441b046..18abed00939f6caebdc4ba1029a77137055e9080 100644 (file)
@@ -5,7 +5,7 @@
 ;; Author: Dave Love <fx@gnu.org>, Riccardo Murri <riccardo.murri@gmail.com>
 ;; Keywords: tools
 ;; Created: Sept 2006
-;; Version: 2007-08-03
+;; Version: 2007-09-05
 ;; URL: http://launchpad.net/vc-bzr
 
 ;; This file is free software; you can redistribute it and/or modify
@@ -105,6 +105,8 @@ Invoke the bzr command adding `BZR_PROGRESS_BAR=none' to the environment."
   (concat vc-bzr-admin-dirname "/branch/format"))
 (defconst vc-bzr-admin-revhistory
   (concat vc-bzr-admin-dirname "/branch/revision-history"))
+(defconst vc-bzr-admin-lastrev
+  (concat vc-bzr-admin-dirname "/branch/last-revision"))
 
 ;;;###autoload (defun vc-bzr-registered (file)
 ;;;###autoload   (if (vc-find-root file vc-bzr-admin-checkout-format-file)
@@ -162,7 +164,7 @@ running `vc-bzr-state'."
   (lexical-let*
       ((filename* (expand-file-name filename))
        (rootdir (vc-bzr-root (file-name-directory filename*))))
-    (and rootdir 
+    (when rootdir 
          (file-relative-name filename* rootdir))))
 
 ;; FIXME:  Also get this in a non-registered sub-directory.
@@ -198,13 +200,13 @@ If any error occurred in running `bzr status', then return nil."
                          (if (file-directory-p file) "/?" "")
                          "[ \t\n]*$")
                  nil t)
-            (let ((status (match-string 1)))
+            (lexical-let ((statusword (match-string 1)))
               ;; Erase the status text that matched.
               (delete-region (match-beginning 0) (match-end 0))
               (setq status
                     (and (equal ret 0) ; Seems redundant.  --Stef
                          (intern (replace-regexp-in-string " " ""
-                                                           status))))))
+                                                         statusword))))))
           (when status
             (goto-char (point-min))
             (skip-chars-forward " \n\t") ;Throw away spaces.
@@ -239,12 +241,12 @@ If any error occurred in running `bzr status', then return nil."
 (defun vc-bzr-workfile-version (file)
   (lexical-let*
       ((rootdir (vc-bzr-root file))
-       (branch-format-file (concat rootdir "/" vc-bzr-admin-branch-format-file))
-       (revhistory-file (concat rootdir "/" vc-bzr-admin-revhistory))
-       (lastrev-file (concat rootdir "/" "branch/last-revision")))
-    ;; Count lines in .bzr/branch/revision-history to avoid forking a
-    ;; bzr process.  This looks at internal files.  May break if they
-    ;; change their format.
+       (branch-format-file (expand-file-name vc-bzr-admin-branch-format-file
+                                             rootdir))
+       (revhistory-file (expand-file-name vc-bzr-admin-revhistory rootdir))
+       (lastrev-file (expand-file-name vc-bzr-admin-lastrev rootdir)))
+    ;; This looks at internal files to avoid forking a bzr process.
+    ;; May break if they change their format.
     (if (file-exists-p branch-format-file)
         (with-temp-buffer
           (insert-file-contents branch-format-file) 
@@ -259,7 +261,6 @@ If any error occurred in running `bzr status', then return nil."
            ((looking-at "Bazaar Branch Format 6 (bzr 0.15)")
             ;; revno is the first number in .bzr/branch/last-revision
             (insert-file-contents lastrev-file) 
-            (goto-char (line-end-position))
             (if (re-search-forward "[0-9]+" nil t)
                 (buffer-substring (match-beginning 0) (match-end 0))))))
       ;; fallback to calling "bzr revno"
@@ -415,14 +416,14 @@ EDITABLE is ignored."
   "Prepare BUFFER for `vc-annotate' on FILE.
 Each line is tagged with the revision number, which has a `help-echo'
 property containing author and date information."
-  (apply #'vc-bzr-command "annotate" buffer 0 file "-l" "--all"
+  (apply #'vc-bzr-command "annotate" buffer 0 file "--long" "--all"
          (if version (list "-r" version)))
   (with-current-buffer buffer
     ;; Store the tags for the annotated source lines in a hash table
     ;; to allow saving space by sharing the text properties.
     (setq vc-bzr-annotation-table (make-hash-table :test 'equal))
     (goto-char (point-min))
-    (while (re-search-forward "^\\( *[0-9]+\\) \\(.+\\) +\\([0-9]\\{8\\}\\) |"
+    (while (re-search-forward "^\\( *[0-9]+\\) +\\(.+\\) +\\([0-9]\\{8\\}\\) |"
                               nil t)
       (let* ((rev (match-string 1))
              (author (match-string 2))
@@ -430,9 +431,6 @@ property containing author and date information."
              (key (match-string 0))
              (tag (gethash key vc-bzr-annotation-table)))
         (unless tag
-          (save-match-data
-            (string-match " +\\'" author)
-            (setq author (substring author 0 (match-beginning 0))))
           (setq tag (propertize rev 'help-echo (concat "Author: " author
                                                        ", date: " date)
                                 'mouse-face 'highlight))
@@ -573,7 +571,6 @@ Optional argument LOCALP is always ignored."
 (eval-after-load "vc"
   '(add-to-list 'vc-directory-exclusion-list vc-bzr-admin-dirname t))
 
-
 (provide 'vc-bzr)
 ;; arch-tag: 8101bad8-4e92-4e7d-85ae-d8e08b4e7c06
 ;;; vc-bzr.el ends here
index f90f698275e96fa78e4bb580aeaf64d8d46524c4..0a17388ae344c98347018fde14ad65899dc7f652 100644 (file)
@@ -590,7 +590,8 @@ encoded as fractional days."
 systime, or nil if there is none."
   (let* ((bol (point))
          (cache (get-text-property bol 'vc-cvs-annotate-time))
-         buffer-read-only)
+         (inhibit-read-only t)
+         (inhibit-modification-hooks t))
     (cond
      (cache)
      ((looking-at
index 32d8d48299cb1222f487e8e3e6f4ba8be941acd4..d68b33be76a0353fe63476f7ab6b733ee64f30d7 100644 (file)
 
 (defun vc-git-state (file)
   "Git-specific version of `vc-state'."
+  (call-process "git" nil nil nil "add" "--refresh" "--" (file-relative-name file))
   (let ((diff (vc-git--run-command-string file "diff-index" "-z" "HEAD" "--")))
     (if (and diff (string-match ":[0-7]\\{6\\} [0-7]\\{6\\} [0-9a-f]\\{40\\} [0-9a-f]\\{40\\} [ADMU]\0[^\0]+\0" diff))
         'edited
   'implicit)
 
 (defun vc-git-workfile-unchanged-p (file)
-  ;; The reason this does not use the result of vc-git-state is that
-  ;; git-diff-index (used by vc-git-state) doesn't refresh the cached
-  ;; stat info, so if the file has been modified it will always show
-  ;; up as modified in vc-git-state, even if the change has been
-  ;; undone, until git-update-index --refresh is run.
-
-  ;; OTOH the vc-git-workfile-unchanged-p implementation checks the
-  ;; actual content, so it will detect the case of a file reverted
-  ;; back to its original state.
-
-  ;; The ideal implementation would be to refresh the stat cache and
-  ;; then call vc-git-state, but at the moment there's no git command
-  ;; to refresh a single file, so this will have to be added first.
-  (let ((sha1 (vc-git--run-command-string file "hash-object" "--"))
-        (head (vc-git--run-command-string file "ls-tree" "-z" "HEAD" "--")))
-    (and head
-         (string-match "[0-7]\\{6\\} blob \\([0-9a-f]\\{40\\}\\)\t[^\0]+\0" head)
-         (string= (car (split-string sha1 "\n")) (match-string 1 head)))))
+  (eq 'up-to-date (vc-git-state file)))
 
 (defun vc-git-mode-line-string (file)
   "Return string for placement into the modeline for FILE."
 
 (defun vc-git-create-repo ()
   "Create a new Git repository."
-  (vc-git-command "init" nil 0 nil))
+  (vc-git-command nil 0 nil "init"))
 
 (defun vc-git-register (files &optional rev comment)
   "Register FILE into the git version-control system."
           ("^Author:[ \t]+\\([^<(]+?\\)[ \t]*[(<]\\([A-Za-z0-9_.+-]+@[A-Za-z0-9_.-]+\\)[>)]"
            (1 'change-log-name)
            (2 'change-log-email))
+          ("^ +\\(?:\\(?:[Aa]cked\\|[Ss]igned-[Oo]ff\\)-[Bb]y:\\)[ \t]+\\([A-Za-z0-9_.+-]+@[A-Za-z0-9_.-]+\\)"
+           (1 'change-log-name))
+          ("^ +\\(?:\\(?:[Aa]cked\\|[Ss]igned-[Oo]ff\\)-[Bb]y:\\)[ \t]+\\([^<(]+?\\)[ \t]*[(<]\\([A-Za-z0-9_.+-]+@[A-Za-z0-9_.-]+\\)[>)]"
+           (1 'change-log-name)
+           (2 'change-log-email))
+          ("^Merge: \\([0-9a-z]+\\) \\([0-9a-z]+\\)"
+           (1 'change-log-acknowledgement)
+           (2 'change-log-acknowledgement))
           ("^Date:   \\(.+\\)" (1 'change-log-date))
           ("^summary:[ \t]+\\(.+\\)" (1 'log-view-message))))))
 
index 1415f8d94992477dedaba79272d86d6127daa0a8..6b9565b8bd8d13cfc1d572b34260b719a4d2ffbc 100644 (file)
 (defvar log-view-font-lock-keywords)
 
 (define-derived-mode vc-hg-log-view-mode log-view-mode "Hg-Log-View"
-  (require 'add-log) ;; we need the faces add-log
-  ;; Don't have file markers, so use impossible regexp.
+  (require 'add-log) ;; we need the add-log faces
   (set (make-local-variable 'log-view-file-re) "^File:[ \t]+\\(.+\\)")
   (set (make-local-variable 'log-view-message-re)
        "^changeset:[ \t]*\\([0-9]+\\):\\(.+\\)")
@@ -443,6 +442,71 @@ REV is the revision to check out into WORKFILE."
   (unless contents-done
     (with-temp-buffer (vc-hg-command t 0 file "revert"))))
 
+;;; Hg specific functionality.
+
+;;; XXX This functionality is experimental/work in progress. It might
+;;; change without notice.
+(defvar vc-hg-extra-menu-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map [incoming] '(menu-item "Show incoming" vc-hg-incoming))
+    (define-key map [outgoing] '(menu-item "Show outgoing" vc-hg-outgoing))
+    map))
+
+(defun vc-hg-extra-menu () vc-hg-extra-menu-map)
+
+(define-derived-mode vc-hg-outgoing-mode vc-hg-log-view-mode "Hg-Outgoing")
+
+(define-derived-mode vc-hg-incoming-mode vc-hg-log-view-mode "Hg-Incoming")
+
+;; XXX this adds another top level menu, instead figure out how to
+;; replace the Log-View menu.
+(easy-menu-define log-view-mode-menu vc-hg-outgoing-mode-map
+  "Hg-outgoing Display Menu"
+  `("Hg-outgoing"
+    ["Push selected"  vc-hg-push]))
+
+(easy-menu-define log-view-mode-menu vc-hg-incoming-mode-map
+  "Hg-incoming Display Menu"
+  `("Hg-incoming"
+    ["Pull selected"  vc-hg-pull]))
+
+(defun vc-hg-outgoing ()
+  (interactive)
+  (let ((bname "*Hg outgoing*"))
+    (vc-hg-command bname 0 nil "outgoing" "-n")
+    (pop-to-buffer bname)
+    (vc-hg-outgoing-mode)))
+
+(defun vc-hg-incoming ()
+  (interactive)
+  (let ((bname "*Hg incoming*"))
+    (vc-hg-command bname 0 nil "incoming" "-n")
+    (pop-to-buffer bname)
+    (vc-hg-incoming-mode)))
+
+;; XXX maybe also add key bindings for these functions.
+(defun vc-hg-push ()
+  (interactive)
+  (let ((marked-list (log-view-get-marked)))
+    (if marked-list
+       (vc-hg-command 
+        nil 0 nil
+        (cons "push"
+              (apply 'nconc
+                     (mapcar (lambda (arg) (list "-r" arg)) marked-list))))
+        (error "No log entries selected for push"))))
+
+(defun vc-hg-pull ()
+  (interactive)
+  (let ((marked-list (log-view-get-marked)))
+    (if marked-list
+       (vc-hg-command 
+        nil 0 nil
+        (cons "pull"
+              (apply 'nconc
+                     (mapcar (lambda (arg) (list "-r" arg)) marked-list))))
+      (error "No log entries selected for pull"))))
+
 ;;; Internal functions
 
 (defun vc-hg-command (buffer okstatus file-or-list &rest flags)
index 5b134831d08efdabcd28a7eee0c09f40513ef031..822a7eae682f8122ff04466fbca705a3ab7b4972 100644 (file)
@@ -62,9 +62,10 @@ interpreted as hostnames."
   :type 'regexp
   :group 'vc)
 
-(defcustom vc-handled-backends '(RCS CVS SVN SCCS Bzr Git Hg Arch MCVS)
-  ;; Bzr, Git, Hg, Arch and MCVS come last because they are per-tree
-  ;; rather than per-dir.
+(defcustom vc-handled-backends '(RCS CVS SVN SCCS Bzr Git Hg Mtn Arch MCVS)
+  ;; RCS, CVS, SVN and SCCS come first because they are per-dir
+  ;; rather than per-tree.  RCS comes first because of the multibackend
+  ;; support intended to use RCS for local commits (with a remote CVS server).
   "List of version control backends for which VC will be used.
 Entries in this list will be tried in order to determine whether a
 file is under that sort of version control.
diff --git a/lisp/vc-mtn.el b/lisp/vc-mtn.el
new file mode 100644 (file)
index 0000000..e24bf39
--- /dev/null
@@ -0,0 +1,285 @@
+;;; vc-mtn.el --- VC backend for Monotone
+
+;; Copyright (C) 2007  Free Software Foundation, Inc.
+
+;; Author: Stefan Monnier <monnier@iro.umontreal.ca>
+;; Keywords: 
+
+;; This file 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, or (at your option)
+;; any later version.
+
+;; This file 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; see the file COPYING.  If not, write to
+;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; 
+
+;;; Code:
+
+(eval-when-compile (require 'cl) (require 'vc))
+
+;; Clear up the cache to force vc-call to check again and discover
+;; new functions when we reload this file.
+(put 'Mtn 'vc-functions nil)
+
+(defvar vc-mtn-command "mtn")
+(unless (executable-find vc-mtn-command)
+  ;; vc-mtn.el is 100% non-functional without the `mtn' executable.
+  (setq vc-handled-backends (delq 'Mtn vc-handled-backends)))
+
+;;;###autoload
+(defconst vc-mtn-admin-dir "_MTN")
+;;;###autoload
+(defconst vc-mtn-admin-format (concat vc-mtn-admin-dir "/format"))
+
+;;;###autoload (defun vc-mtn-registered (file)
+;;;###autoload   (if (vc-find-root file vc-mtn-admin-format)
+;;;###autoload       (progn
+;;;###autoload         (load "vc-mtn")
+;;;###autoload         (vc-mtn-registered file))))
+
+(defun vc-mtn-revision-granularity () 'repository)
+(defun vc-mtn-checkout-model (file) 'implicit)
+
+(defun vc-mtn-root (file)
+  (setq file (if (file-directory-p file)
+                 (file-name-as-directory file)
+               (file-name-directory file)))
+  (or (vc-file-getprop file 'vc-mtn-root)
+      (vc-file-setprop file 'vc-mtn-root
+                       (vc-find-root file vc-mtn-admin-format))))
+
+
+(defun vc-mtn-registered (file)
+  (let ((root (vc-mtn-root file)))
+    (when root
+      (vc-mtn-state file))))
+
+(defun vc-mtn-command (buffer okstatus files &rest flags)
+  "A wrapper around `vc-do-command' for use in vc-mtn.el."
+  (apply 'vc-do-command buffer okstatus vc-mtn-command files flags))
+
+(defun vc-mtn-state (file)
+  ;; If `mtn' fails or returns status>0, or if the search files, just
+  ;; return nil.
+  (ignore-errors
+    (with-temp-buffer
+      (vc-mtn-command t 0 file "status")
+      (goto-char (point-min))
+      (re-search-forward "^  \\(?:patched \\(.*\\)\\|no changes$\\)")
+      (if (match-end 1)
+          'edited
+        'up-to-date))))
+
+(defun vc-mtn-workfile-version (file)
+  ;; If `mtn' fails or returns status>0, or if the search fails, just
+  ;; return nil.
+  (ignore-errors
+    (with-temp-buffer
+      (vc-mtn-command t 0 file "status")
+      (goto-char (point-min))
+      (re-search-forward "Current branch: \\(.*\\)\nChanges against parent \\(.*\\)")
+      (match-string 2))))
+
+(defun vc-mtn-workfile-branch (file)
+  ;; If `mtn' fails or returns status>0, or if the search files, just
+  ;; return nil.
+  (ignore-errors
+    (with-temp-buffer
+      (vc-mtn-command t 0 file "status")
+      (goto-char (point-min))
+      (re-search-forward "Current branch: \\(.*\\)\nChanges against parent \\(.*\\)")
+      (match-string 1))))
+
+(defun vc-mtn-workfile-unchanged-p (file)
+  (not (eq (vc-mtn-state file) 'edited)))
+
+;; Mode-line rewrite code copied from vc-arch.el.
+
+(defcustom vc-mtn-mode-line-rewrite
+  '(("\\`[^:/#]*[:/#]" . ""))           ;Drop the host part.
+  "Rewrite rules to shorten Mtn's revision names on the mode-line."
+  :type '(repeat (cons regexp string))
+  :group 'vc)
+
+(defun vc-mtn-mode-line-string (file)
+  "Return string for placement in modeline by `vc-mode-line' for FILE."
+  (let ((branch (vc-mtn-workfile-branch file)))
+    (dolist (rule vc-mtn-mode-line-rewrite)
+      (if (string-match (car rule) branch)
+         (setq branch (replace-match (cdr rule) t nil branch))))
+    (format "Mtn%c%s"
+           (case (vc-state file)
+             ((up-to-date needs-patch) ?-)
+             (added ?@)
+             (t ?:))
+           branch)))
+
+(defun vc-mtn-register (files &optional rest)
+  (vc-mtn-command nil 0 files "add"))
+
+(defun vc-mtn-responsible-p (file) (vc-mtn-root file))
+(defun vc-mtn-could-register (file) (vc-mtn-root file))
+
+(defun vc-mtn-checkin (files rev comment)
+  (vc-mtn-command nil 0 files "commit" "-m" comment))
+
+(defun vc-mtn-find-version (file rev buffer)
+  (vc-mtn-command buffer 0 file "cat" "-r" rev))
+
+;; (defun vc-mtn-checkout (file &optional editable rev)
+;;   )
+
+(defun vc-mtn-revert (file &optional contents-done)
+  (unless contents-done
+    (vc-mtn-command nil 0 file "revert")))
+
+;; (defun vc-mtn-roolback (files)
+;;   )
+
+(defun vc-mtn-print-log (files &optional buffer)
+  (vc-mtn-command buffer 0 files "log"))
+
+(define-derived-mode vc-mtn-log-view-mode log-view-mode "Mtn-Log-View"
+  ;; TODO: Not sure what to do about file markers for now.
+  (set (make-local-variable 'log-view-file-re) "\\'\\`")
+  ;; TODO: Use a more precise regexp than "[ |/]+" to avoid false positives
+  ;; in the ChangeLog text.
+  (set (make-local-variable 'log-view-message-re)
+       "^[ |/]+Revision: \\([0-9a-f]+\\)")
+  (require 'add-log)                    ;For change-log faces.
+  (set (make-local-variable 'log-view-font-lock-keywords)
+       (append log-view-font-lock-keywords
+               '(("^[ |]+Author: \\(.*\\)" (1 'change-log-email))
+                 ("^[ |]+Date: \\(.*\\)" (1 'change-log-date-face))))))
+
+;; (defun vc-mtn-show-log-entry (version)
+;;   )
+
+(defun vc-mtn-wash-log (file))
+
+(defalias 'vc-mtn-diff-tree 'vc-mtn-diff)
+(defun vc-mtn-diff (files &optional rev1 rev2 buffer)
+  (apply 'vc-mtn-command (or buffer "*vc-diff*") 1 files "diff"
+         (append (if rev1 (list "-r" rev1)) (if rev2 (list "-r" rev2)))))
+
+(defun vc-mtn-annotate-command (file buf &optional rev)
+  (apply 'vc-mtn-command buf 0 file "annotate"
+         (if rev (list "-r" rev))))
+
+(defconst vc-mtn-annotate-full-re
+  "^ *\\([0-9a-f]+\\)\\.* by [^ ]+ \\([0-9]+\\)-\\([0-9]+\\)-\\([0-9]+\\): ")
+(defconst vc-mtn-annotate-any-re
+  (concat "^\\(?: +: \\|" vc-mtn-annotate-full-re "\\)"))
+
+(defun vc-mtn-annotate-time ()
+  (when (looking-at vc-mtn-annotate-any-re)
+    (goto-char (match-end 0))
+    (let ((year (match-string 2)))
+      (if (not year)
+          ;; Look for the date on a previous line.
+          (save-excursion
+            (get-text-property (1- (previous-single-property-change
+                                    (point) 'vc-mtn-time nil (point-min)))
+                               'vc-mtn-time))
+        (let ((time (vc-annotate-convert-time
+                     (encode-time 0 0 0
+                                  (string-to-number (match-string 4))
+                                  (string-to-number (match-string 3))
+                                  (string-to-number year)
+                                  t))))
+          (let ((inhibit-read-only t)
+                (inhibit-modification-hooks t))
+            (put-text-property (match-beginning 0) (match-end 0)
+                               'vc-mtn-time time))
+          time)))))
+
+(defun vc-mtn-annotate-extract-revision-at-line ()
+  (save-excursion
+    (when (or (looking-at vc-mtn-annotate-full-re)
+              (re-search-backward vc-mtn-annotate-full-re nil t))
+      (match-string 1))))
+
+;;; Revision completion.
+
+(defun vc-mtn-list-tags ()
+  (with-temp-buffer
+    (vc-mtn-command t 0 nil "list" "tags")
+    (goto-char (point-min))
+    (let ((tags ()))
+      (while (re-search-forward "^[^ ]+" nil t)
+        (push (match-string 0) tags))
+      tags)))
+
+(defun vc-mtn-list-branches ()
+  (with-temp-buffer
+    (vc-mtn-command t 0 nil "list" "branches")
+    (goto-char (point-min))
+    (let ((branches ()))
+      (while (re-search-forward "^.+" nil t)
+        (push (match-string 0) branches))
+      branches)))
+
+(defun vc-mtn-list-revision-ids (prefix)
+  (with-temp-buffer
+    (vc-mtn-command t 0 nil "complete" "revision" prefix)
+    (goto-char (point-min))
+    (let ((ids ()))
+      (while (re-search-forward "^.+" nil t)
+        (push (match-string 0) ids))
+      ids)))
+
+(defun vc-mtn-revision-completion-table (file)
+  ;; TODO: Implement completion for for selectors
+  ;; TODO: Implement completion for composite selectors.
+  (lexical-let ((file file))
+    (lambda (string pred action)
+      (cond
+       ;; "Tag" selectors.
+       ((string-match "\\`t:" string)
+        (complete-with-action action
+                              (mapcar (lambda (tag) (concat "t:" tag))
+                                      (vc-mtn-list-tags))
+                              string pred))
+       ;; "Branch" selectors.
+       ((string-match "\\`b:" string)
+        (complete-with-action action
+                              (mapcar (lambda (tag) (concat "b:" tag))
+                                      (vc-mtn-list-branches))
+                              string pred))
+       ;; "Head" selectors.  Not sure how they differ from "branch" selectors.
+       ((string-match "\\`h:" string)
+        (complete-with-action action
+                              (mapcar (lambda (tag) (concat "h:" tag))
+                                      (vc-mtn-list-branches))
+                              string pred))
+       ;; "ID" selectors.
+       ((string-match "\\`i:" string)
+        (complete-with-action action
+                              (mapcar (lambda (tag) (concat "i:" tag))
+                                      (vc-mtn-list-revision-ids
+                                       (substring string (match-end 0))))
+                              string pred))
+       (t
+        (complete-with-action action
+                              '("t:" "b:" "h:" "i:"
+                                ;; Completion not implemented for these.
+                                "a:" "c:" "d:" "e:" "l:")
+                              string pred))))))
+        
+        
+
+(provide 'vc-mtn)
+
+;; arch-tag: 2b89ffbc-cbb8-405a-9080-2eafd4becb70
+;;; vc-mtn.el ends here
index 0b34c30f630ce169384ab9e82ed30f5f303f1993..bf003f2ac97a44dab80e51e6999a26895dd07c05 100644 (file)
 
 ;;; Commentary:
 
-;; This is preliminary support for Subversion (http://subversion.tigris.org/).
-;; It started as `sed s/cvs/svn/ vc.cvs.el' (from version 1.56)
-;; and hasn't been completely fixed since.
-
-;; Sync'd with Subversion's vc-svn.el as of revision 5801.
+;; Sync'd with Subversion's vc-svn.el as of revision 5801. but this version
+;; has been extensively modified since to handle filesets.
 
 ;;; Bugs:
 
@@ -382,7 +379,16 @@ The changes are between FIRST-VERSION and SECOND-VERSION."
     (let ((inhibit-read-only t))
       (goto-char (point-min))
       ;; Add a line to tell log-view-mode what file this is.
-      (insert "Working file(s): " (vc-delistify (mapcar 'file-relative-name files)) "\n"))
+      ;; FIXME if there are multiple files, log-view-current-file
+      ;; breaks.  It's trivial to adapt log-view-file-re for the
+      ;; changed prefix, but less trivial to make
+      ;; log-view-current-file actually do the right thing in the
+      ;; multiple file case.
+      (insert (format "Working file%s: "
+                     (if (= (length files) 1)
+                         ""
+                       "s"))
+                     (vc-delistify (mapcar 'file-relative-name files)) "\n"))
     (vc-svn-command
      buffer
      (if (and (= (length files) 1) (vc-stay-local-p (car files)) (fboundp 'start-process)) 'async 0)
@@ -433,7 +439,7 @@ The changes are between FIRST-VERSION and SECOND-VERSION."
 
 (defun vc-svn-diff-tree (dir &optional rev1 rev2)
   "Diff all files at and below DIR."
-  (vc-svn-diff (file-name-as-directory dir) rev1 rev2))
+  (vc-svn-diff (list (file-name-as-directory dir)) rev1 rev2))
 
 ;;;
 ;;; Snapshot system
@@ -512,6 +518,33 @@ and that it passes `vc-svn-global-switches' to it before FLAGS."
       ;; behavior for different modules on the same server.
       (match-string 1))))
 
+(defun vc-svn-resolve-when-done ()
+  "Call \"svn resolved\" if the conflict markers have been removed."
+  (save-excursion
+    (goto-char (point-min))
+    (if (not (re-search-forward "^<<<<<<< " nil t))
+        (vc-svn-command nil 0 buffer-file-name "resolved"))))
+
+;; Inspired by vc-arch-find-file-hook.
+(defun vc-svn-find-file-hook ()
+  (when (eq ?C (vc-file-getprop buffer-file-name 'vc-svn-status))
+    ;; If the file is marked as "conflicted", then we should try and call
+    ;; "svn resolved" when applicable.
+    (if (save-excursion
+          (goto-char (point-min))
+          (re-search-forward "^<<<<<<< " nil t))
+        ;; There are conflict markers.
+        (progn
+          (smerge-mode 1)
+          (add-hook 'after-save-hook 'vc-svn-resolve-when-done nil t))
+      ;; There are no conflict markers.  This is problematic: maybe it means
+      ;; the conflict has been resolved and we should immediately call "svn
+      ;; resolved", or it means that the file's type does not allow Svn to
+      ;; use conflict markers in which case we don't really know what to do.
+      ;; So let's just punt for now.
+      nil)
+    (message "There are unresolved conflicts in this file")))
+
 (defun vc-svn-parse-status (&optional filename)
   "Parse output of \"svn status\" command in the current buffer.
 Set file properties accordingly.  Unless FILENAME is non-nil, parse only
@@ -534,6 +567,8 @@ information about FILENAME and return its status."
        ;; Use the last-modified revision, so that searching in vc-print-log
        ;; output works.
        (vc-file-setprop file 'vc-workfile-version (match-string 3))
+        ;; Remember Svn's own status.
+        (vc-file-setprop file 'vc-svn-status status)
        (vc-file-setprop
         file 'vc-state
         (cond
index 7d8c78c24a8e07c74804b7b2c0318dacdd783ed3..bfcea833c9d9677d78eb06bf9e6d1ff30169c903 100644 (file)
@@ -7,8 +7,6 @@
 ;; Maintainer: Andre Spiegel <spiegel@gnu.org>
 ;; Keywords: tools
 
-;; $Id$
-
 ;; This file is part of GNU Emacs.
 
 ;; GNU Emacs is free software; you can redistribute it and/or modify
@@ -29,8 +27,9 @@
 ;;; Credits:
 
 ;; VC was initially designed and implemented by Eric S. Raymond
-;; <esr@snark.thyrsus.com>.  Over the years, many people have
+;; <esr@thyrsus.com> in 1992.  Over the years, many other people have
 ;; contributed substantial amounts of work to VC.  These include:
+;;
 ;;   Per Cederqvist <ceder@lysator.liu.se>
 ;;   Paul Eggert <eggert@twinsun.com>
 ;;   Sebastian Kremer <sk@thp.uni-koeln.de>
 ;;   Andre Spiegel <spiegel@gnu.org>
 ;;   Richard Stallman <rms@gnu.org>
 ;;   Thien-Thi Nguyen <ttn@gnu.org>
+;;
+;; In July 2007 ESR returned and redesigned the mode to cope better
+;; with modern version-control systems that do commits by fileset
+;; rather than per individual file.
+;;
+;; Features in the new version:
+;; * Key commands (vc-next-action = C-x v v, vc-print-log = C-x v l, vc-revert
+;;   = C-x v u, vc-rollback = C-x v c, vc-diff = C-x v =, vc-update = C-x v +) 
+;;   now operate on filesets rather than individual files.
+;; * The fileset for a command is either (a) all marked files in VC-dired
+;;   mode, (b) the currently visited file if it's under version control,
+;;   or (c) the current directory if the visited buffer is not under
+;;   version control and a wildcarding-enable flag has been set. 
+;;
+;; If you maintain a client of the mode or customize it in your .emacs, 
+;; note that some backend functions which formerly took single file arguments 
+;; now take a list of files.  These include: register, checkin, print-log,
+;; rollback, and diff.
 
 ;;; Commentary:
 
 ;; This mode is fully documented in the Emacs user's manual.
 ;;
 ;; Supported version-control systems presently include CVS, RCS, GNU
-;; Arch, Subversion, Bzr, Mercurial, Meta-CVS, and SCCS (or its free
-;; replacement, CSSC).
+;; Arch, Subversion, Bzr, Git, Mercurial, Meta-CVS, Monotone and SCCS
+;; (or its free replacement, CSSC).
 ;;
 ;; Some features will not work with old RCS versions.  Where
 ;; appropriate, VC finds out which version you have, and allows or
 ;; VC keeps some per-file information in the form of properties (see
 ;; vc-file-set/getprop in vc-hooks.el).  The backend-specific functions
 ;; do not generally need to be aware of these properties.  For example,
-;; `vc-sys-workfile-version' should compute the workfile version and
+;; `vc-sys-workfile-version' should compute the focus version and
 ;; return it; it should not look it up in the property, and it needn't
 ;; store it there either.  However, if a backend-specific function does
 ;; store a value in a property, that value takes precedence over any
 ;;
 ;; * revision-granularity
 ;;
-;;   Takes no arguments.  Returns either 'file or 'repository.
-;;   FIXME: What does this mean?  Why "repository"?
-;;
+;;   Takes no arguments.  Returns either 'file or 'repository.  Backends
+;;   that return 'file have per-file revision numbering; backends
+;;   that return 'repository have per-repository revision numbering,
+;;   so a revision level implicitly identifies a changeset
+;;   
 ;; STATE-QUERYING FUNCTIONS
 ;;
 ;; * registered (file)
 ;;
 ;; * workfile-version (file)
 ;;
-;;   Return the current workfile version of FILE.
+;;   Return the current focus version of FILE.  This is the version fetched
+;;   by the last checkout or upate, not necessarily the same thing as the
+;;   head or tip version. Should return "0" for a file added but not yet 
+;;   committed.
 ;;
 ;; - latest-on-branch-p (file)
 ;;
-;;   Return non-nil if the current workfile version of FILE is the latest
-;;   on its branch.  The default implementation always returns t, which
-;;   means that working with non-current versions is not supported by
-;;   default.
+;;   Return non-nil if the focus version of FILE is the latest version
+;;   on its branch (many VCSes call this the 'tip' or 'head' version).
+;;   The default implementation always returns t, which means that
+;;   working with non-current versions is not supported by default.
 ;;
 ;; * checkout-model (file)
 ;;
 ;;
 ;; - workfile-unchanged-p (file)
 ;;
-;;   Return non-nil if FILE is unchanged from its current workfile
-;;   version.  This function should do a brief comparison of FILE's
-;;   contents with those of the master version.  If the backend does not
-;;   have such a brief-comparison feature, the default implementation of
+;;   Return non-nil if FILE is unchanged from the focus version.  This
+;;   function should do a brief comparison of FILE's contents with
+;;   those of the repository version.  If the backend does not have
+;;   such a brief-comparison feature, the default implementation of
 ;;   this function can be used, which delegates to a full
 ;;   vc-BACKEND-diff.  (Note that vc-BACKEND-diff must not run
-;;   asynchronously in this case, see variable `vc-disable-async-diff'.)
+;;   asynchronously in this case, see variable
+;;   `vc-disable-async-diff'.)
 ;;
 ;; - mode-line-string (file)
 ;;
 ;;
 ;; STATE-CHANGING FUNCTIONS
 ;;
-;; * create-repo ()
+;; * create-repo (backend)
 ;;
 ;;   Create an empty repository in the current directory and initialize 
 ;;   it so VC mode can add files to it.  For file-oriented systems, this 
 ;;   Check out revision REV of FILE into the working area.  If EDITABLE
 ;;   is non-nil, FILE should be writable by the user and if locking is
 ;;   used for FILE, a lock should also be set.  If REV is non-nil, that
-;;   is the revision to check out (default is current workfile version).
+;;   is the revision to check out (default is the focus version).
 ;;   If REV is t, that means to check out the head of the current branch;
 ;;   if it is the empty string, check out the head of the trunk.
 ;;   The implementation should pass the value of vc-checkout-switches
 ;;
 ;; * revert (file &optional contents-done)
 ;;
-;;   Revert FILE back to the current workfile version.  If optional
+;;   Revert FILE back to the current focus version.  If optional
 ;;   arg CONTENTS-DONE is non-nil, then the contents of FILE have
 ;;   already been reverted from a version backup, and this function
 ;;   only needs to update the status of FILE within the backend.
 ;;
 ;; - steal-lock (file &optional version)
 ;;
-;;   Steal any lock on the current workfile version of FILE, or on
-;;   VERSION if that is provided.  This function is only needed if
-;;   locking is used for files under this backend, and if files can
-;;   indeed be locked by other users.
+;;   Steal any lock on the focus version of FILE, or on VERSION if
+;;   that is provided.  This function is only needed if locking is
+;;   used for files under this backend, and if files can indeed be
+;;   locked by other users.
 ;;
 ;; HISTORY FUNCTIONS
 ;;
 ;;
 ;; - wash-log (file)
 ;;
-;;   Remove all non-comment information from the output of print-log.  The
-;;   default implementation of this function works for RCS-style logs.
+;;   Remove all non-comment information from the output of print-log.
 ;;
 ;; - logentry-check ()
 ;;
 ;;
 ;;   Insert the diff for FILE into BUFFER, or the *vc-diff* buffer if
 ;;   BUFFER is nil.  If REV1 and REV2 are non-nil, report differences
-;;   from REV1 to REV2.  If REV1 is nil, use the current workfile
-;;   version (as found in the repository) as the older version; if
-;;   REV2 is nil, use the current workfile contents as the newer
-;;   version.  This function should pass the value of (vc-switches
-;;   BACKEND 'diff) to the backend command.  It should return a status
-;;   of either 0 (no differences found), or 1 (either non-empty diff
-;;   or the diff is run asynchronously).
+;;   from REV1 to REV2.  If REV1 is nil, use the focus version (as
+;;   found in the repository) as the older version; if REV2 is nil,
+;;   use the current working-copy contents as the newer version.  This
+;;   function should pass the value of (vc-switches BACKEND 'diff) to
+;;   the backend command.  It should return a status of either 0 (no
+;;   differences found), or 1 (either non-empty diff or the diff is
+;;   run asynchronously).
 ;;
 ;; - revision-completion-table (file)
 ;;
@@ -591,7 +613,7 @@ These are passed to the checkin program by \\[vc-register]."
   :version "20.3")
 
 (defcustom vc-dired-terse-display t
-  "If non-nil, show only locked files in VC Dired."
+  "If non-nil, show only locked or locally modified files in VC Dired."
   :type 'boolean
   :group 'vc
   :version "20.3")
@@ -652,7 +674,7 @@ See `run-hooks'."
 
 ;;;###autoload
 (defcustom vc-checkin-hook nil
-  "Normal hook (list of functions) run after a checkin is done.
+  "Normal hook (list of functions) run after commit or file checkin.
 See also `log-edit-done-hook'."
   :type 'hook
   :options '(log-edit-comment-to-change-log)
@@ -660,7 +682,7 @@ See also `log-edit-done-hook'."
 
 ;;;###autoload
 (defcustom vc-before-checkin-hook nil
-  "Normal hook (list of functions) run before a file is checked in.
+  "Normal hook (list of functions) run before a commit or a file checkin.
 See `run-hooks'."
   :type 'hook
   :group 'vc)
@@ -756,7 +778,7 @@ List of factors, used to expand/compress the time scale.  See `vc-annotate'."
     (define-key m "L" 'vc-annotate-show-log-revision-at-line)
     (define-key m "N" 'vc-annotate-next-version)
     (define-key m "P" 'vc-annotate-prev-version)
-    (define-key m "W" 'vc-annotate-workfile-version)
+    (define-key m "W" 'vc-annotate-focus-version)
     m)
   "Local keymap used for VC-Annotate mode.")
 
@@ -819,59 +841,6 @@ in their implementation of vc-BACKEND-diff.")
 (defvar vc-dired-mode nil)
 (make-variable-buffer-local 'vc-dired-mode)
 
-;; functions that operate on RCS revision numbers.  This code should
-;; also be moved into the backends.  It stays for now, however, since
-;; it is used in code below.
-;;;###autoload
-(defun vc-trunk-p (rev)
-  "Return t if REV is a revision on the trunk."
-  (not (eq nil (string-match "\\`[0-9]+\\.[0-9]+\\'" rev))))
-
-(defun vc-branch-p (rev)
-  "Return t if REV is a branch revision."
-  (not (eq nil (string-match "\\`[0-9]+\\(\\.[0-9]+\\.[0-9]+\\)*\\'" rev))))
-
-;;;###autoload
-(defun vc-branch-part (rev)
-  "Return the branch part of a revision number REV."
-  (let ((index (string-match "\\.[0-9]+\\'" rev)))
-    (if index
-        (substring rev 0 index))))
-
-(defun vc-minor-part (rev)
-  "Return the minor version number of a revision number REV."
-  (string-match "[0-9]+\\'" rev)
-  (substring rev (match-beginning 0) (match-end 0)))
-
-(defun vc-default-previous-version (backend file rev)
-  "Return the version number immediately preceding REV for FILE,
-or nil if there is no previous version.  This default
-implementation works for MAJOR.MINOR-style version numbers as
-used by RCS and CVS."
-  (let ((branch (vc-branch-part rev))
-        (minor-num (string-to-number (vc-minor-part rev))))
-    (when branch
-      (if (> minor-num 1)
-          ;; version does probably not start a branch or release
-          (concat branch "." (number-to-string (1- minor-num)))
-        (if (vc-trunk-p rev)
-            ;; we are at the beginning of the trunk --
-            ;; don't know anything to return here
-            nil
-          ;; we are at the beginning of a branch --
-          ;; return version of starting point
-          (vc-branch-part branch))))))
-
-(defun vc-default-next-version (backend file rev)
-  "Return the version number immediately following REV for FILE,
-or nil if there is no next version.  This default implementation
-works for MAJOR.MINOR-style version numbers as used by RCS
-and CVS."
-  (when (not (string= rev (vc-workfile-version file)))
-    (let ((branch (vc-branch-part rev))
-         (minor-num (string-to-number (vc-minor-part rev))))
-      (concat branch "." (number-to-string (1+ minor-num))))))
-
 ;; File property caching
 
 (defun vc-clear-context ()
@@ -894,20 +863,15 @@ been updated to their corresponding values."
                        property (cdr setting)))))
             ,settings)))
 
-;; Random helper functions
-
-(defsubst vc-editable-p (file)
-  "Return non-nil if FILE can be edited."
-  (or (eq (vc-checkout-model file) 'implicit)
-      (memq (vc-state file) '(edited needs-merge))))
-
 ;; Two macros for elisp programming
+
 ;;;###autoload
 (defmacro with-vc-file (file comment &rest body)
   "Check out a writable copy of FILE if necessary, then execute BODY.
 Check in FILE with COMMENT (a string) after BODY has been executed.
 FILE is passed through `expand-file-name'; BODY executed within
-`save-excursion'.  If FILE is not under version control, or locked by
+`save-excursion'.  If FILE is not under version control, or you are
+using a locking version-control system and the file is locked by 
 somebody else, signal error."
   (declare (debug t) (indent 2))
   (let ((filevar (make-symbol "file")))
@@ -938,16 +902,7 @@ However, before executing BODY, find FILE, and after BODY, save buffer."
         ,@body
         (save-buffer)))))
 
-(defun vc-ensure-vc-buffer ()
-  "Make sure that the current buffer visits a version-controlled file."
-  (if vc-dired-mode
-      (set-buffer (find-file-noselect (dired-get-filename)))
-    (while vc-parent-buffer
-      (set-buffer vc-parent-buffer))
-    (if (not buffer-file-name)
-       (error "Buffer %s is not associated with a file" (buffer-name))
-      (if (not (vc-backend buffer-file-name))
-         (error "File %s is not under version control" buffer-file-name)))))
+;; Common command execution logic to be used by backends
 
 (defun vc-process-filter (p s)
   "An alternative output filter for async process P.
@@ -977,6 +932,33 @@ BUF defaults to \"*vc*\", can be a string and will be created if necessary."
           (inhibit-read-only t))
       (erase-buffer))))
 
+(defvar vc-sentinel-movepoint)          ;Dynamically scoped.
+
+(defun vc-process-sentinel (p s)
+  (let ((previous (process-get p 'vc-previous-sentinel)))
+    (if previous (funcall previous p s))
+    (with-current-buffer (process-buffer p)
+      (let (vc-sentinel-movepoint)
+        ;; Normally, we want async code such as sentinels to not move point.
+        (save-excursion
+          (goto-char (process-mark p))
+          (let ((cmds (process-get p 'vc-sentinel-commands)))
+            (process-put p 'vc-postprocess nil)
+            (dolist (cmd cmds)
+              ;; Each sentinel may move point and the next one should be run
+              ;; at that new point.  We could get the same result by having
+              ;; each sentinel read&set process-mark, but since `cmd' needs
+              ;; to work both for async and sync processes, this would be
+              ;; difficult to achieve.
+              (vc-exec-after cmd))))
+        ;; But sometimes the sentinels really want to move point.
+        (if vc-sentinel-movepoint
+            (let ((win (get-buffer-window (current-buffer) 0)))
+              (if (not win)
+                  (goto-char vc-sentinel-movepoint)
+                (with-selected-window win
+                  (goto-char vc-sentinel-movepoint)))))))))
+
 (defun vc-exec-after (code)
   "Eval CODE when the current buffer's process is done.
 If the current buffer has no process, just evaluate CODE.
@@ -994,17 +976,12 @@ Else, add CODE to the process' sentinel."
       (eval code))
      ;; If a process is running, add CODE to the sentinel
      ((eq (process-status proc) 'run)
-      (let ((sentinel (process-sentinel proc)))
-       (set-process-sentinel proc
-         `(lambda (p s)
-            (with-current-buffer ',(current-buffer)
-               (save-excursion
-                (goto-char (process-mark p))
-               ,@(append (cdr (cdr (car   ;Strip off (save-exc (goto-char...)
-                           (cdr (cdr       ;Strip off (with-current-buffer buf
-                           (car (cdr (cdr ;Strip off (lambda (p s)
-                             sentinel))))))))
-                         (list `(vc-exec-after ',code)))))))))
+      (let ((previous (process-sentinel proc)))
+        (unless (eq previous 'vc-process-sentinel)
+          (process-put proc 'vc-previous-sentinel previous))
+        (set-process-sentinel proc 'vc-process-sentinel))
+      (process-put proc 'vc-sentinel-commands
+                   (cons code (process-get proc 'vc-sentinel-commands))))
      (t (error "Unexpected process state"))))
   nil)
 
@@ -1013,11 +990,13 @@ Else, add CODE to the process' sentinel."
 Each function is called inside the buffer in which the command was run
 and is passed 3 arguments: the COMMAND, the FILE and the FLAGS.")
 
+(defvar w32-quote-process-args)
+
 (defun vc-delistify (filelist)
   "Smash a FILELIST into a file list string suitable for info messages."
+  ;; FIXME what about file names with spaces?
   (if (not filelist) "."  (mapconcat 'identity filelist " ")))
 
-(defvar w32-quote-process-args)
 ;;;###autoload
 (defun vc-do-command (buffer okstatus command file-or-list &rest flags)
   "Execute a VC command, notifying user and checking for errors.
@@ -1064,6 +1043,7 @@ that is inserted into the command line before the filename."
              ;; start-process does not support remote execution
              (setq okstatus nil))
          (if (eq okstatus 'async)
+             ;; Run asynchronously
              (let ((proc
                     (let ((process-connection-type nil))
                       (apply 'start-process command (current-buffer) command
@@ -1088,7 +1068,8 @@ that is inserted into the command line before the filename."
          (if vc-command-messages
              (message "Running %s...OK" full-command)))
        (vc-exec-after
-        `(run-hook-with-args 'vc-post-command-functions ',command ',file-or-list ',flags))
+        `(run-hook-with-args 'vc-post-command-functions
+                              ',command ',file-or-list ',flags))
        status))))
 
 (defun vc-position-context (posn)
@@ -1205,7 +1186,74 @@ CONTEXT is that which `vc-buffer-context' returns."
          (let ((new-mark (vc-find-position-by-context mark-context)))
            (if new-mark (set-mark new-mark))))))
 
-(defun vc-revert-buffer1 (&optional arg no-confirm)
+(defun vc-responsible-backend (file &optional register)
+  "Return the name of a backend system that is responsible for FILE.
+The optional argument REGISTER means that a backend suitable for
+registration should be found.
+
+If REGISTER is nil, then if FILE is already registered, return the
+backend of FILE.  If FILE is not registered, or a directory, then the
+first backend in `vc-handled-backends' that declares itself
+responsible for FILE is returned.  If no backend declares itself
+responsible, return the first backend.
+
+If REGISTER is non-nil, return the first responsible backend under
+which FILE is not yet registered.  If there is no such backend, return
+the first backend under which FILE is not yet registered, but could
+be registered."
+  (if (not vc-handled-backends)
+      (error "No handled backends"))
+  (or (and (not (file-directory-p file)) (not register) (vc-backend file))
+      (catch 'found
+       ;; First try: find a responsible backend.  If this is for registration,
+       ;; it must be a backend under which FILE is not yet registered.
+       (dolist (backend vc-handled-backends)
+         (and (or (not register)
+                  (not (vc-call-backend backend 'registered file)))
+              (vc-call-backend backend 'responsible-p file)
+              (throw 'found backend)))
+       ;; no responsible backend
+       (if (not register)
+           ;; if this is not for registration, the first backend must do
+           (car vc-handled-backends)
+         ;; for registration, we need to find a new backend that
+         ;; could register FILE
+         (dolist (backend vc-handled-backends)
+           (and (not (vc-call-backend backend 'registered file))
+                (vc-call-backend backend 'could-register file)
+                (throw 'found backend)))
+         (error "No backend that could register")))))
+
+(defun vc-expand-dirs (file-or-dir-list)
+  "Expands directories in a file list specification.
+Only files already under version control are noticed."
+  ;; FIXME: Kill this function.
+  (let ((flattened '()))
+    (dolist (node file-or-dir-list)
+      (vc-file-tree-walk
+       node (lambda (f) (if (vc-backend f) (push f flattened)))))
+    (nreverse flattened)))
+
+(defun vc-ensure-vc-buffer ()
+  "Make sure that the current buffer visits a version-controlled file."
+  (if vc-dired-mode
+      (set-buffer (find-file-noselect (dired-get-filename)))
+    (while vc-parent-buffer
+      (set-buffer vc-parent-buffer))
+    (if (not buffer-file-name)
+       (error "Buffer %s is not associated with a file" (buffer-name))
+      (if (not (vc-backend buffer-file-name))
+         (error "File %s is not under version control" buffer-file-name)))))
+
+;;; Support for the C-x v v command.  This is where all the single-file-oriented
+;;; code from before the fileset rewrite lives.
+
+(defsubst vc-editable-p (file)
+  "Return non-nil if FILE can be edited."
+  (or (eq (vc-checkout-model file) 'implicit)
+      (memq (vc-state file) '(edited needs-merge))))
+
+(defun vc-revert-buffer-internal (&optional arg no-confirm)
   "Revert buffer, keeping point and mark where user expects them.
 Try to be clever in the face of changes due to expanded version control
 key words.  This is important for typeahead to work as expected.
@@ -1223,7 +1271,6 @@ ARG and NO-CONFIRM are passed on to `revert-buffer'."
       (revert-buffer arg no-confirm t))
     (vc-restore-buffer-context context)))
 
-
 (defun vc-buffer-sync (&optional not-urgent)
   "Make sure the current buffer and its working file are in sync.
 NOT-URGENT means it is ok to continue if the user says not to save."
@@ -1234,11 +1281,74 @@ NOT-URGENT means it is ok to continue if the user says not to save."
        (unless not-urgent
          (error "Aborted")))))
 
-(defun vc-default-latest-on-branch-p (backend file)
-  "Return non-nil if FILE is the latest on its branch.
-This default implementation always returns non-nil, which means that
-editing non-current versions is not supported by default."
-  t)
+(defvar vc-dired-window-configuration)
+
+;; Here's the major entry point.
+
+;;;###autoload
+(defun vc-next-action (verbose)
+  "Do the next logical version control operation on the current file.
+
+If you call this from within a VC dired buffer with no files marked,
+it will operate on the file in the current line.
+
+If you call this from within a VC dired buffer, and one or more
+files are marked, it will accept a log message and then operate on
+each one.  The log message will be used as a comment for any register
+or checkin operations, but ignored when doing checkouts.  Attempted
+lock steals will raise an error.
+
+A prefix argument lets you specify the version number to use.
+
+For RCS and SCCS files:
+   If the file is not already registered, this registers it for version
+control.
+   If the file is registered and not locked by anyone, this checks out
+a writable and locked file ready for editing.
+   If the file is checked out and locked by the calling user, this
+first checks to see if the file has changed since checkout.  If not,
+it performs a revert.
+   If the file has been changed, this pops up a buffer for entry
+of a log message; when the message has been entered, it checks in the
+resulting changes along with the log message as change commentary.  If
+the variable `vc-keep-workfiles' is non-nil (which is its default), a
+read-only copy of the changed file is left in place afterwards.
+   If the file is registered and locked by someone else, you are given
+the option to steal the lock.
+
+For CVS files:
+   If the file is not already registered, this registers it for version
+control.  This does a \"cvs add\", but no \"cvs commit\".
+   If the file is added but not committed, it is committed.
+   If your working file is changed, but the repository file is
+unchanged, this pops up a buffer for entry of a log message; when the
+message has been entered, it checks in the resulting changes along
+with the logmessage as change commentary.  A writable file is retained.
+   If the repository file is changed, you are asked if you want to
+merge in the changes into your working copy."
+  (interactive "P")
+  (catch 'nogo
+    (if vc-dired-mode
+       (let ((files (dired-get-marked-files)))
+          (set (make-local-variable 'vc-dired-window-configuration)
+               (current-window-configuration))
+         (if (string= ""
+                (mapconcat
+                    (lambda (f)
+                      (if (not (vc-up-to-date-p f)) "@" ""))
+                    files ""))
+               (vc-next-action-dired nil nil "dummy")
+             (vc-start-entry nil nil nil nil
+                             "Enter a change comment for the marked files."
+                             'vc-next-action-dired))
+           (throw 'nogo nil)))
+    (while vc-parent-buffer
+      (pop-to-buffer vc-parent-buffer))
+    (if buffer-file-name
+        (vc-next-action-on-file buffer-file-name verbose)
+      (error "Buffer %s is not associated with a file" (buffer-name)))))
+
+;; These functions help the vc-next-action entry point
 
 (defun vc-next-action-on-file (file verbose &optional comment)
   "Do The Right Thing for a given FILE under version control.
@@ -1371,7 +1481,7 @@ If VERBOSE is non-nil, query the user rather than using default parameters."
              (yes-or-no-p (concat "File has unlocked changes.  "
                                   "Claim lock retaining changes? ")))
            (progn (vc-call steal-lock file)
-                   (clear-visited-file-modtime)
+                  (clear-visited-file-modtime)
                   ;; Must clear any headers here because they wouldn't
                   ;; show that the file is locked now.
                   (vc-clear-headers file)
@@ -1380,11 +1490,9 @@ If VERBOSE is non-nil, query the user rather than using default parameters."
          (if (not (yes-or-no-p
                    "Revert to checked-in version, instead? "))
              (error "Checkout aborted")
-           (vc-revert-buffer1 t t)
+           (vc-revert-buffer-internal t t)
            (vc-checkout file t))))))))
 
-(defvar vc-dired-window-configuration)
-
 (defun vc-next-action-dired (file rev comment)
   "Call `vc-next-action-on-file' on all the marked files.
 Ignores FILE and REV, but passes on COMMENT."
@@ -1399,102 +1507,44 @@ Ignores FILE and REV, but passes on COMMENT."
     nil t))
   (dired-move-to-filename))
 
-;; Here's the major entry point.
+(defun vc-create-repo (backend)
+  "Create an empty repository in the current directory."
+  (interactive
+   (list
+    (intern
+     (upcase
+      (completing-read
+       "Create repository for: "
+       (mapcar (lambda (b) (list (downcase (symbol-name b)))) vc-handled-backends)
+       nil t)))))
+  (vc-call-backend backend 'create-repo))
 
 ;;;###autoload
-(defun vc-next-action (verbose)
-  "Do the next logical version control operation on the current file.
+(defun vc-register (&optional set-version comment)
+  "Register the current file into a version control system.
+With prefix argument SET-VERSION, allow user to specify initial version
+level.  If COMMENT is present, use that as an initial comment.
 
-If you call this from within a VC dired buffer with no files marked,
-it will operate on the file in the current line.
-
-If you call this from within a VC dired buffer, and one or more
-files are marked, it will accept a log message and then operate on
-each one.  The log message will be used as a comment for any register
-or checkin operations, but ignored when doing checkouts.  Attempted
-lock steals will raise an error.
-
-A prefix argument lets you specify the version number to use.
-
-For RCS and SCCS files:
-   If the file is not already registered, this registers it for version
-control.
-   If the file is registered and not locked by anyone, this checks out
-a writable and locked file ready for editing.
-   If the file is checked out and locked by the calling user, this
-first checks to see if the file has changed since checkout.  If not,
-it performs a revert.
-   If the file has been changed, this pops up a buffer for entry
-of a log message; when the message has been entered, it checks in the
-resulting changes along with the log message as change commentary.  If
-the variable `vc-keep-workfiles' is non-nil (which is its default), a
-read-only copy of the changed file is left in place afterwards.
-   If the file is registered and locked by someone else, you are given
-the option to steal the lock.
-
-For CVS files:
-   If the file is not already registered, this registers it for version
-control.  This does a \"cvs add\", but no \"cvs commit\".
-   If the file is added but not committed, it is committed.
-   If your working file is changed, but the repository file is
-unchanged, this pops up a buffer for entry of a log message; when the
-message has been entered, it checks in the resulting changes along
-with the logmessage as change commentary.  A writable file is retained.
-   If the repository file is changed, you are asked if you want to
-merge in the changes into your working copy."
-
-  (interactive "P")
-  (catch 'nogo
-    (if vc-dired-mode
-       (let ((files (dired-get-marked-files)))
-          (set (make-local-variable 'vc-dired-window-configuration)
-               (current-window-configuration))
-         (if (string= ""
-                (mapconcat
-                    (lambda (f)
-                      (if (not (vc-up-to-date-p f)) "@" ""))
-                    files ""))
-               (vc-next-action-dired nil nil "dummy")
-             (vc-start-entry nil nil nil nil
-                             "Enter a change comment for the marked files."
-                             'vc-next-action-dired))
-           (throw 'nogo nil)))
-    (while vc-parent-buffer
-      (pop-to-buffer vc-parent-buffer))
-    (if buffer-file-name
-        (vc-next-action-on-file buffer-file-name verbose)
-      (error "Buffer %s is not associated with a file" (buffer-name)))))
-
-;; These functions help the vc-next-action entry point
-
-(defun vc-default-init-version (backend) vc-default-init-version)
-
-;;;###autoload
-(defun vc-register (&optional set-version comment)
-  "Register the current file into a version control system.
-With prefix argument SET-VERSION, allow user to specify initial version
-level.  If COMMENT is present, use that as an initial comment.
-
-The version control system to use is found by cycling through the list
-`vc-handled-backends'.  The first backend in that list which declares
-itself responsible for the file (usually because other files in that
-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."
-  (interactive "P")
-  (unless buffer-file-name (error "No visited file"))
-  (when (vc-backend buffer-file-name)
-    (if (vc-registered buffer-file-name)
-       (error "This file is already registered")
-      (unless (y-or-n-p "Previous master file has vanished.  Make a new one? ")
-       (error "Aborted"))))
-  ;; Watch out for new buffers of size 0: the corresponding file
-  ;; does not exist yet, even though buffer-modified-p is nil.
-  (if (and (not (buffer-modified-p))
-          (zerop (buffer-size))
-          (not (file-exists-p buffer-file-name)))
-      (set-buffer-modified-p t))
-  (vc-buffer-sync)
+The version control system to use is found by cycling through the list
+`vc-handled-backends'.  The first backend in that list which declares
+itself responsible for the file (usually because other files in that
+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."
+  (interactive "P")
+  (unless buffer-file-name (error "No visited file"))
+  (when (vc-backend buffer-file-name)
+    (if (vc-registered buffer-file-name)
+       (error "This file is already registered")
+      (unless (y-or-n-p "Previous master file has vanished.  Make a new one? ")
+       (error "Aborted"))))
+  ;; Watch out for new buffers of size 0: the corresponding file
+  ;; does not exist yet, even though buffer-modified-p is nil.
+  (if (and (not (buffer-modified-p))
+          (zerop (buffer-size))
+          (not (file-exists-p buffer-file-name)))
+      (set-buffer-modified-p t))
+  (vc-buffer-sync)
 
   (vc-start-entry buffer-file-name
                   (if set-version
@@ -1517,64 +1567,6 @@ first backend that could register the file is used."
                    (message "Registering %s... done" file))))
 
 
-(defun vc-responsible-backend (file &optional register)
-  "Return the name of a backend system that is responsible for FILE.
-The optional argument REGISTER means that a backend suitable for
-registration should be found.
-
-If REGISTER is nil, then if FILE is already registered, return the
-backend of FILE.  If FILE is not registered, or a directory, then the
-first backend in `vc-handled-backends' that declares itself
-responsible for FILE is returned.  If no backend declares itself
-responsible, return the first backend.
-
-If REGISTER is non-nil, return the first responsible backend under
-which FILE is not yet registered.  If there is no such backend, return
-the first backend under which FILE is not yet registered, but could
-be registered."
-  (if (not vc-handled-backends)
-      (error "No handled backends"))
-  (or (and (not (file-directory-p file)) (not register) (vc-backend file))
-      (catch 'found
-       ;; First try: find a responsible backend.  If this is for registration,
-       ;; it must be a backend under which FILE is not yet registered.
-       (dolist (backend vc-handled-backends)
-         (and (or (not register)
-                  (not (vc-call-backend backend 'registered file)))
-              (vc-call-backend backend 'responsible-p file)
-              (throw 'found backend)))
-       ;; no responsible backend
-       (if (not register)
-           ;; if this is not for registration, the first backend must do
-           (car vc-handled-backends)
-         ;; for registration, we need to find a new backend that
-         ;; could register FILE
-         (dolist (backend vc-handled-backends)
-           (and (not (vc-call-backend backend 'registered file))
-                (vc-call-backend backend 'could-register file)
-                (throw 'found backend)))
-         (error "No backend that could register")))))
-
-(defun vc-default-responsible-p (backend file)
-  "Indicate whether BACKEND is reponsible for FILE.
-The default is to return nil always."
-  nil)
-
-(defun vc-default-could-register (backend file)
-  "Return non-nil if BACKEND could be used to register FILE.
-The default implementation returns t for all files."
-  t)
-
-(defun vc-expand-dirs (file-or-dir-list)
-  "Expands directories in a file list specification.
-Only files already under version control are noticed."
-  ;; FIXME: Kill this function.
-  (let ((flattened '()))
-    (dolist (node file-or-dir-list)
-      (vc-file-tree-walk
-       node (lambda (f) (if (vc-backend f) (push f flattened)))))
-    (nreverse flattened)))
-
 (defun vc-resynch-window (file &optional keep noquery)
   "If FILE is in the current buffer, either revert or unvisit it.
 The choice between revert (to see expanded keywords) and unvisit depends on
@@ -1585,7 +1577,7 @@ rather than user editing!"
   (and (string= buffer-file-name file)
        (if keep
           (progn
-            (vc-revert-buffer1 t noquery)
+            (vc-revert-buffer-internal t noquery)
              ;; TODO: Adjusting view mode might no longer be necessary
              ;; after RMS change to files.el of 1999-08-08.  Investigate
              ;; this when we install the new VC.
@@ -1739,6 +1731,8 @@ Runs the normal hook `vc-checkin-hook'."
      (message "Checking in %s...done" file))
    'vc-checkin-hook))
 
+;; Code for access to the comment ring
+
 (defun vc-finish-logentry (&optional nocomment)
   "Complete the operation implied by the current log entry.
 Use the contents of the current buffer as a check-in or registration
@@ -1756,7 +1750,8 @@ the buffer contents as a comment."
   ;; But not if it is a vc-dired buffer.
   (with-current-buffer vc-parent-buffer
     (or vc-dired-mode (vc-buffer-sync)))
-  (if (not vc-log-operation) (error "No log operation is pending"))
+  (if (not vc-log-operation)
+      (error "No log operation is pending"))
   ;; save the parameters held in buffer-local variables
   (let ((log-operation vc-log-operation)
        (log-file vc-log-file)
@@ -1788,9 +1783,108 @@ the buffer contents as a comment."
       (dired-move-to-filename))
     (run-hooks after-hook 'vc-finish-logentry-hook)))
 
-;; Code for access to the comment ring
+;;; Additional entry points for examining version histories
 
-;; Additional entry points for examining version histories
+(defun vc-default-diff-tree (backend dir rev1 rev2)
+  "List differences for all registered files at and below DIR.
+The meaning of REV1 and REV2 is the same as for `vc-version-diff'."
+  ;; This implementation does an explicit tree walk, and calls
+  ;; vc-BACKEND-diff directly for each file.  An optimization
+  ;; would be to use `vc-diff-internal', so that diffs can be local,
+  ;; and to call it only for files that are actually changed.
+  ;; However, this is expensive for some backends, and so it is left
+  ;; to backend-specific implementations.
+  (setq default-directory dir)
+  (vc-file-tree-walk
+   default-directory
+   (lambda (f)
+     (vc-exec-after
+      `(let ((coding-system-for-read (vc-coding-system-for-diff ',f)))
+         (message "Looking at %s" ',f)
+         (vc-call-backend ',(vc-backend f)
+                          'diff (list ',f) ',rev1 ',rev2))))))
+
+(defun vc-coding-system-for-diff (file)
+  "Return the coding system for reading diff output for FILE."
+  (or coding-system-for-read
+      ;; if we already have this file open,
+      ;; use the buffer's coding system
+      (let ((buf (find-buffer-visiting file)))
+        (if buf (with-current-buffer buf
+                  buffer-file-coding-system)))
+      ;; otherwise, try to find one based on the file name
+      (car (find-operation-coding-system 'insert-file-contents file))
+      ;; and a final fallback
+      'undecided))
+
+(defun vc-switches (backend op)
+  (let ((switches
+        (or (if backend
+                (let ((sym (vc-make-backend-sym
+                            backend (intern (concat (symbol-name op)
+                                                    "-switches")))))
+                  (if (boundp sym) (symbol-value sym))))
+            (let ((sym (intern (format "vc-%s-switches" (symbol-name op)))))
+              (if (boundp sym) (symbol-value sym)))
+            (cond
+             ((eq op 'diff) diff-switches)))))
+    (if (stringp switches) (list switches)
+      ;; If not a list, return nil.
+      ;; This is so we can set vc-diff-switches to t to override
+      ;; any switches in diff-switches.
+      (if (listp switches) switches))))
+
+;; Old def for compatibility with Emacs-21.[123].
+(defmacro vc-diff-switches-list (backend) `(vc-switches ',backend 'diff))
+(make-obsolete 'vc-diff-switches-list 'vc-switches "22.1")
+
+(defun vc-diff-internal (file rev1 rev2)
+  "Run diff to compare FILE's revisions REV1 and REV2.
+Diff output goes to the *vc-diff* buffer.  The exit status of the diff
+command is returned.
+
+This function takes care to set up a proper coding system for diff output.
+If both revisions are available as local files, then it also does not
+actually call the backend, but performs a local diff."
+  (if (or (not rev1) (string-equal rev1 ""))
+      (setq rev1 (vc-workfile-version file)))
+  (if (string-equal rev2 "")
+      (setq rev2 nil))
+  (let ((file-rev1 (vc-version-backup-file file rev1))
+        (file-rev2 (if (not rev2)
+                       file
+                     (vc-version-backup-file file rev2)))
+        (coding-system-for-read (vc-coding-system-for-diff file)))
+    (if (and file-rev1 file-rev2)
+        (let ((status
+               (if (eq vc-diff-knows-L 'no)
+                   (apply 'vc-do-command "*vc-diff*" 1 "diff" nil
+                          (append (vc-switches nil 'diff)
+                                  (list (file-relative-name file-rev1)
+                                        (file-relative-name file-rev2))))
+                 (apply 'vc-do-command "*vc-diff*" 2 "diff" nil
+                        (append (vc-switches nil 'diff)
+                                ;; Provide explicit labels like RCS or
+                                ;; CVS would do so diff-mode refers to
+                                ;; `file' rather than to `file-rev1'
+                                ;; when trying to find/apply/undo
+                                ;; hunks.
+                                (list "-L" (vc-diff-label file file-rev1 rev1)
+                                      "-L" (vc-diff-label file file-rev2 rev2)
+                                      (file-relative-name file-rev1)
+                                      (file-relative-name file-rev2)))))))
+          (if (eq status 2)
+              (if (not vc-diff-knows-L)
+                  (setq vc-diff-knows-L 'no
+                        status (apply 'vc-do-command "*vc-diff*" 1 "diff" nil
+                                      (append 
+                                       (vc-switches nil 'diff)
+                                       (list (file-relative-name file-rev1)
+                                             (file-relative-name file-rev2)))))
+                (error "diff failed"))
+            (if (not vc-diff-knows-L) (setq vc-diff-knows-L 'yes)))
+          status)
+      (vc-call diff (list file) rev1 rev2 "*vc-diff*"))))
 
 ;;;###autoload
 (defun vc-diff (historic &optional not-urgent)
@@ -1811,12 +1905,10 @@ saving the buffer."
          (message "No changes to %s since latest version" file)
        (vc-version-diff file nil nil)))))
 
-(defun vc-default-revision-completion-table (backend file) nil)
-
 (defun vc-version-diff (file rev1 rev2)
   "List the differences between FILE's versions REV1 and REV2.
-If REV1 is empty or nil it means to use the current workfile version;
-REV2 empty or nil means the current file contents.  FILE may also be
+If REV1 is empty or nil it means to use the focus version;
+REV2 empty or nil means the working-copy contents.  FILE may also be
 a directory, in that case, generate diffs between the correponding
 versions of all registered files in or below it."
   (interactive
@@ -1849,162 +1941,61 @@ versions of all registered files in or below it."
            (rev2-prompt (concat "Newer version (default "
                                 (or rev2-default "current source") "): "))
            (rev1 (if completion-table
-                     (completing-read rev1-prompt completion-table
-                                       nil nil nil nil rev1-default)
-                   (read-string rev1-prompt nil nil rev1-default)))
-           (rev2 (if completion-table
-                     (completing-read rev2-prompt completion-table
-                                       nil nil nil nil rev2-default)
-                   (read-string rev2-prompt nil nil rev2-default))))
-       (list file rev1 rev2))))
-  (if (file-directory-p file)
-      ;; recursive directory diff
-      (progn
-        (vc-setup-buffer "*vc-diff*")
-       (if (string-equal rev1 "") (setq rev1 nil))
-       (if (string-equal rev2 "") (setq rev2 nil))
-        (let ((inhibit-read-only t))
-          (insert "Diffs between "
-                  (or rev1 "last version checked in")
-                  " and "
-                  (or rev2 "current workfile(s)")
-                  ":\n\n"))
-        (let ((dir (file-name-as-directory file)))
-          (vc-call-backend (vc-responsible-backend dir)
-                           'diff-tree dir rev1 rev2))
-       (vc-exec-after `(let ((inhibit-read-only t))
-                         (insert "\nEnd of diffs.\n"))))
-    ;; Single file diff.  It is important that the vc-controlled buffer
-    ;; is still current at this time, because any local settings in that
-    ;; buffer should affect the diff command.
-    (vc-diff-internal file rev1 rev2))
-  (set-buffer "*vc-diff*")
-  (if (and (zerop (buffer-size))
-          (not (get-buffer-process (current-buffer))))
-      (progn
-       (if rev1
-           (if rev2
-               (message "No changes to %s between %s and %s" file rev1 rev2)
-             (message "No changes to %s since %s" file rev1))
-         (message "No changes to %s since latest version" file))
-       nil)
-    (pop-to-buffer (current-buffer))
-    ;; Gnus-5.8.5 sets up an autoload for diff-mode, even if it's
-    ;; not available.  Work around that.
-    (if (require 'diff-mode nil t) (diff-mode))
-    (vc-exec-after '(let ((inhibit-read-only t))
-                     (if (eq (buffer-size) 0)
-                         (insert "No differences found.\n"))
-                     (goto-char (point-min))
-                     (shrink-window-if-larger-than-buffer)))
-    t))
-
-(defun vc-diff-label (file file-rev rev)
-  (concat (file-relative-name file)
-         (format-time-string "\t%d %b %Y %T %z\t"
-                             (nth 5 (file-attributes file-rev)))
-         rev))
-
-(defun vc-diff-internal (file rev1 rev2)
-  "Run diff to compare FILE's revisions REV1 and REV2.
-Diff output goes to the *vc-diff* buffer.  The exit status of the diff
-command is returned.
-
-This function takes care to set up a proper coding system for diff output.
-If both revisions are available as local files, then it also does not
-actually call the backend, but performs a local diff."
-  (if (or (not rev1) (string-equal rev1 ""))
-      (setq rev1 (vc-workfile-version file)))
-  (if (string-equal rev2 "")
-      (setq rev2 nil))
-  (let ((file-rev1 (vc-version-backup-file file rev1))
-        (file-rev2 (if (not rev2)
-                       file
-                     (vc-version-backup-file file rev2)))
-        (coding-system-for-read (vc-coding-system-for-diff file)))
-    (if (and file-rev1 file-rev2)
-        (let ((status
-               (if (eq vc-diff-knows-L 'no)
-                   (apply 'vc-do-command "*vc-diff*" 1 "diff" nil
-                          (append (vc-switches nil 'diff)
-                                  (list (file-relative-name file-rev1)
-                                        (file-relative-name file-rev2))))
-                 (apply 'vc-do-command "*vc-diff*" 2 "diff" nil
-                        (append (vc-switches nil 'diff)
-                                ;; Provide explicit labels like RCS or
-                                ;; CVS would do so diff-mode refers to
-                                ;; `file' rather than to `file-rev1'
-                                ;; when trying to find/apply/undo
-                                ;; hunks.
-                                (list "-L" (vc-diff-label file file-rev1 rev1)
-                                      "-L" (vc-diff-label file file-rev2 rev2)
-                                      (file-relative-name file-rev1)
-                                      (file-relative-name file-rev2)))))))
-          (if (eq status 2)
-              (if (not vc-diff-knows-L)
-                  (setq vc-diff-knows-L 'no
-                        status (apply 'vc-do-command "*vc-diff*" 1 "diff" nil
-                                      (append 
-                                       (vc-switches nil 'diff)
-                                       (list (file-relative-name file-rev1)
-                                             (file-relative-name file-rev2)))))
-                (error "diff failed"))
-            (if (not vc-diff-knows-L) (setq vc-diff-knows-L 'yes)))
-          status)
-      (vc-call diff (list file) rev1 rev2 "*vc-diff*"))))
-
-(defun vc-switches (backend op)
-  (let ((switches
-        (or (if backend
-                (let ((sym (vc-make-backend-sym
-                            backend (intern (concat (symbol-name op)
-                                                    "-switches")))))
-                  (if (boundp sym) (symbol-value sym))))
-            (let ((sym (intern (format "vc-%s-switches" (symbol-name op)))))
-              (if (boundp sym) (symbol-value sym)))
-            (cond
-             ((eq op 'diff) diff-switches)))))
-    (if (stringp switches) (list switches)
-      ;; If not a list, return nil.
-      ;; This is so we can set vc-diff-switches to t to override
-      ;; any switches in diff-switches.
-      (if (listp switches) switches))))
-
-;; Old def for compatibility with Emacs-21.[123].
-(defmacro vc-diff-switches-list (backend) `(vc-switches ',backend 'diff))
-(make-obsolete 'vc-diff-switches-list 'vc-switches "22.1")
-
-(defun vc-default-diff-tree (backend dir rev1 rev2)
-  "List differences for all registered files at and below DIR.
-The meaning of REV1 and REV2 is the same as for `vc-version-diff'."
-  ;; This implementation does an explicit tree walk, and calls
-  ;; vc-BACKEND-diff directly for each file.  An optimization
-  ;; would be to use `vc-diff-internal', so that diffs can be local,
-  ;; and to call it only for files that are actually changed.
-  ;; However, this is expensive for some backends, and so it is left
-  ;; to backend-specific implementations.
-  (setq default-directory dir)
-  (vc-file-tree-walk
-   default-directory
-   (lambda (f)
-     (vc-exec-after
-      `(let ((coding-system-for-read (vc-coding-system-for-diff ',f)))
-         (message "Looking at %s" ',f)
-         (vc-call-backend ',(vc-backend f)
-                          'diff ',f ',rev1 ',rev2))))))
+                     (completing-read rev1-prompt completion-table
+                                       nil nil nil nil rev1-default)
+                   (read-string rev1-prompt nil nil rev1-default)))
+           (rev2 (if completion-table
+                     (completing-read rev2-prompt completion-table
+                                       nil nil nil nil rev2-default)
+                   (read-string rev2-prompt nil nil rev2-default))))
+       (list file rev1 rev2))))
+  (if (file-directory-p file)
+      ;; recursive directory diff
+      (progn
+        (vc-setup-buffer "*vc-diff*")
+       (if (string-equal rev1 "") (setq rev1 nil))
+       (if (string-equal rev2 "") (setq rev2 nil))
+        (let ((inhibit-read-only t))
+          (insert "Diffs between "
+                  (or rev1 "last version checked in")
+                  " and "
+                  (or rev2 "working copy")
+                  ":\n\n"))
+        (let ((dir (file-name-as-directory file)))
+          (vc-call-backend (vc-responsible-backend dir)
+                           'diff-tree dir rev1 rev2))
+       (vc-exec-after `(let ((inhibit-read-only t))
+                         (insert "\nEnd of diffs.\n"))))
+    ;; Single file diff.  It is important that the vc-controlled buffer
+    ;; is still current at this time, because any local settings in that
+    ;; buffer should affect the diff command.
+    (vc-diff-internal file rev1 rev2))
+  (set-buffer "*vc-diff*")
+  (if (and (zerop (buffer-size))
+          (not (get-buffer-process (current-buffer))))
+      (progn
+       (if rev1
+           (if rev2
+               (message "No changes to %s between %s and %s" file rev1 rev2)
+             (message "No changes to %s since %s" file rev1))
+         (message "No changes to %s since latest version" file))
+       nil)
+    (pop-to-buffer (current-buffer))
+    ;; Gnus-5.8.5 sets up an autoload for diff-mode, even if it's
+    ;; not available.  Work around that.
+    (if (require 'diff-mode nil t) (diff-mode))
+    (vc-exec-after '(let ((inhibit-read-only t))
+                     (if (eq (buffer-size) 0)
+                         (insert "No differences found.\n"))
+                     (goto-char (point-min))
+                     (shrink-window-if-larger-than-buffer)))
+    t))
 
-(defun vc-coding-system-for-diff (file)
-  "Return the coding system for reading diff output for FILE."
-  (or coding-system-for-read
-      ;; if we already have this file open,
-      ;; use the buffer's coding system
-      (let ((buf (find-buffer-visiting file)))
-        (if buf (with-current-buffer buf
-                  buffer-file-coding-system)))
-      ;; otherwise, try to find one based on the file name
-      (car (find-operation-coding-system 'insert-file-contents file))
-      ;; and a final fallback
-      'undecided))
+(defun vc-diff-label (file file-rev rev)
+  (concat (file-relative-name file)
+         (format-time-string "\t%d %b %Y %T %z\t"
+                             (nth 5 (file-attributes file-rev)))
+         rev))
 
 ;;;###autoload
 (defun vc-version-other-window (rev)
@@ -2016,7 +2007,7 @@ If `F.~REV~' already exists, use it instead of checking it out again."
      (vc-ensure-vc-buffer)
      (let ((completion-table
             (vc-call revision-completion-table buffer-file-name))
-           (prompt "Version to visit (default is workfile version): "))
+           (prompt "Version to visit (default is focus version): "))
        (list
         (if completion-table
             (completing-read prompt completion-table)
@@ -2055,18 +2046,6 @@ If `F.~REV~' already exists, use it instead of checking it out again."
        (message "Checking out %s...done" filename)))
     (find-file-noselect filename)))
 
-(defun vc-default-find-version (backend file rev buffer)
-  "Provide the new `find-version' op based on the old `checkout' op.
-This is only for compatibility with old backends.  They should be updated
-to provide the `find-version' operation instead."
-  (let ((tmpfile (make-temp-file (expand-file-name file))))
-    (unwind-protect
-       (progn
-         (vc-call-backend backend 'checkout file nil rev tmpfile)
-         (with-current-buffer buffer
-           (insert-file-contents-literally tmpfile)))
-      (delete-file tmpfile))))
-
 ;; Header-insertion code
 
 ;;;###autoload
@@ -2131,7 +2110,7 @@ See Info node `Merging'."
         (state (vc-state file))
         first-version second-version status)
     (cond
-     ((stringp state)
+     ((stringp state)  ;; Locking VCses only
       (error "File is locked by %s" state))
      ((not (vc-editable-p file))
       (if (y-or-n-p
@@ -2273,15 +2252,6 @@ There is a special command, `*l', to mark all files currently locked."
 
 (define-key vc-dired-mode-map "*l" 'vc-dired-mark-locked)
 
-(defun vc-default-dired-state-info (backend file)
-  (let ((state (vc-state file)))
-    (cond
-     ((stringp state) (concat "(" state ")"))
-     ((eq state 'edited) (concat "(" (vc-user-login-name file) ")"))
-     ((eq state 'needs-merge) "(merge)")
-     ((eq state 'needs-patch) "(patch)")
-     ((eq state 'unlocked-changes) "(stale)"))))
-
 (defun vc-dired-reformat-line (vc-info)
   "Reformat a directory-listing line.
 Replace various columns with version control information, VC-INFO.
@@ -2461,17 +2431,6 @@ are checked out in that new branch."
                   'create-snapshot dir name branchp)
   (message "Making %s... done" (if branchp "branch" "snapshot")))
 
-(defun vc-default-create-snapshot (backend dir name branchp)
-  (when branchp
-    (error "VC backend %s does not support module branches" backend))
-  (let ((result (vc-snapshot-precondition dir)))
-    (if (stringp result)
-       (error "File %s is not up-to-date" result)
-      (vc-file-tree-walk
-       dir
-       (lambda (f)
-        (vc-call assign-name f name))))))
-
 ;;;###autoload
 (defun vc-retrieve-snapshot (dir name)
   "Descending recursively from DIR, retrieve the snapshot called NAME.
@@ -2492,26 +2451,6 @@ allowed and simply skipped)."
                     'retrieve-snapshot dir name update)
     (message "%s" (concat msg "done"))))
 
-(defun vc-default-retrieve-snapshot (backend dir name update)
-  (if (string= name "")
-      (progn
-        (vc-file-tree-walk
-         dir
-         (lambda (f) (and
-                (vc-up-to-date-p f)
-                (vc-error-occurred
-                 (vc-call checkout f nil "")
-                 (if update (vc-resynch-buffer f t t)))))))
-    (let ((result (vc-snapshot-precondition dir)))
-      (if (stringp result)
-          (error "File %s is locked" result)
-        (setq update (and (eq result 'visited) update))
-        (vc-file-tree-walk
-         dir
-         (lambda (f) (vc-error-occurred
-                (vc-call checkout f nil name)
-                (if update (vc-resynch-buffer f t t)))))))))
-
 ;; Miscellaneous other entry points
 
 ;;;###autoload
@@ -2558,41 +2497,9 @@ If FOCUS-REV is non-nil, leave the point at that revision."
        (vc-call-backend ',(vc-backend file)
                         'show-log-entry
                         ',focus-rev)
+        (setq vc-sentinel-movepoint (point))
         (set-buffer-modified-p nil)))))
 
-(defun vc-default-log-view-mode (backend) (log-view-mode))
-(defun vc-default-show-log-entry (backend rev)
-  (with-no-warnings
-   (log-view-goto-rev rev)))
-
-(defun vc-default-comment-history (backend file)
-  "Return a string with all log entries stored in BACKEND for FILE."
-  (if (vc-find-backend-function backend 'print-log)
-      (with-current-buffer "*vc*"
-       (vc-call print-log (list file))
-       (vc-call wash-log file)
-       (buffer-string))))
-
-(defun vc-default-wash-log (backend file)
-  "Remove all non-comment information from log output.
-This default implementation works for RCS logs; backends should override
-it if their logs are not in RCS format."
-  (let ((separator (concat "^-+\nrevision [0-9.]+\ndate: .*\n"
-                          "\\(branches: .*;\n\\)?"
-                          "\\(\\*\\*\\* empty log message \\*\\*\\*\n\\)?")))
-    (goto-char (point-max)) (forward-line -1)
-    (while (looking-at "=*\n")
-      (delete-char (- (match-end 0) (match-beginning 0)))
-      (forward-line -1))
-    (goto-char (point-min))
-    (if (looking-at "[\b\t\n\v\f\r ]+")
-       (delete-char (- (match-end 0) (match-beginning 0))))
-    (goto-char (point-min))
-    (re-search-forward separator nil t)
-    (delete-region (point-min) (point))
-    (while (re-search-forward separator nil t)
-      (delete-region (match-beginning 0) (match-end 0)))))
-
 ;;;###autoload
 (defun vc-revert ()
   "Revert the current buffer's file to the version it was based on.
@@ -2636,6 +2543,53 @@ changes found in the master file; use \\[universal-argument] \\[vc-next-action]
     (vc-revert-file file)
     (message "Reverting %s...done" file)))
 
+;;;###autoload
+(defun vc-rollback (&optional norevert)
+  "Get rid of most recently checked in version of this file.
+A prefix argument NOREVERT means do not revert the buffer afterwards."
+  (interactive "P")
+  (vc-ensure-vc-buffer)
+  (let* ((file buffer-file-name)
+        (backend (vc-backend file))
+         (target (vc-workfile-version file)))
+    (cond
+     ((not (vc-find-backend-function backend 'rollback))
+      (error "Sorry, canceling versions is not supported under %s" backend))
+     ((not (vc-call latest-on-branch-p file))
+      (error "This is not the latest version; VC cannot cancel it"))
+     ((not (vc-up-to-date-p file))
+      (error "%s" (substitute-command-keys "File is not up to date; use \\[vc-revert] to discard changes"))))
+    (if (null (yes-or-no-p (format "Remove version %s from master? " target)))
+       (error "Aborted")
+      (setq norevert (or norevert (not
+          (yes-or-no-p "Revert buffer to most recent remaining version? "))))
+
+      (message "Removing last change from %s..." file)
+      (with-vc-properties
+       file
+       (vc-call rollback (list file))
+       `((vc-state . ,(if norevert 'edited 'up-to-date))
+        (vc-checkout-time . ,(if norevert
+                               0
+                             (nth 5 (file-attributes file))))
+        (vc-workfile-version . nil)))
+      (message "Removing last change from %s...done" file)
+
+      (cond
+       (norevert ;; clear version headers and mark the buffer modified
+       (set-visited-file-name file)
+       (when (not vc-make-backup-files)
+         ;; inhibit backup for this buffer
+         (make-local-variable 'backup-inhibited)
+         (setq backup-inhibited t))
+       (setq buffer-read-only nil)
+       (vc-clear-headers)
+       (vc-mode-line file)
+       (vc-dired-resynch-file file))
+       (t ;; revert buffer to file on disk
+       (vc-resynch-buffer file t t)))
+      (message "Version %s has been removed from the master" target))))
+
 ;;;###autoload
 (define-obsolete-function-alias 'vc-revert-buffer 'vc-revert "23.1")
 
@@ -2670,103 +2624,29 @@ the current branch are merged into the working file."
 (defun vc-version-backup-file (file &optional rev)
   "Return name of backup file for revision REV of FILE.
 If version backups should be used for FILE, and there exists
-such a backup for REV or the current workfile version of file,
-return its name; otherwise return nil."
+such a backup for REV or the focus version of file, return 
+its name; otherwise return nil."
   (when (vc-call make-version-backups-p file)
     (let ((backup-file (vc-version-backup-file-name file rev)))
-      (if (file-exists-p backup-file)
-          backup-file
-        ;; there is no automatic backup, but maybe the user made one manually
-        (setq backup-file (vc-version-backup-file-name file rev 'manual))
-        (if (file-exists-p backup-file)
-            backup-file)))))
-
-(defun vc-default-revert (backend file contents-done)
-  (unless contents-done
-    (let ((rev (vc-workfile-version file))
-          (file-buffer (or (get-file-buffer file) (current-buffer))))
-      (message "Checking out %s..." file)
-      (let ((failed t)
-            (backup-name (car (find-backup-file-name file))))
-        (when backup-name
-          (copy-file file backup-name 'ok-if-already-exists 'keep-date)
-          (unless (file-writable-p file)
-            (set-file-modes file (logior (file-modes file) 128))))
-        (unwind-protect
-            (let ((coding-system-for-read 'no-conversion)
-                  (coding-system-for-write 'no-conversion))
-              (with-temp-file file
-                (let ((outbuf (current-buffer)))
-                  ;; Change buffer to get local value of vc-checkout-switches.
-                  (with-current-buffer file-buffer
-                    (let ((default-directory (file-name-directory file)))
-                      (vc-call find-version file rev outbuf)))))
-              (setq failed nil))
-          (when backup-name
-            (if failed
-                (rename-file backup-name file 'ok-if-already-exists)
-              (and (not vc-make-backup-files) (delete-file backup-name))))))
-      (message "Checking out %s...done" file))))
-
-(defun vc-revert-file (file)
-  "Revert FILE back to the version it was based on."
-  (with-vc-properties
-   file
-   (let ((backup-file (vc-version-backup-file file)))
-     (when backup-file
-       (copy-file backup-file file 'ok-if-already-exists 'keep-date)
-       (vc-delete-automatic-version-backups file))
-     (vc-call revert file backup-file))
-   `((vc-state . up-to-date)
-     (vc-checkout-time . ,(nth 5 (file-attributes file)))))
-  (vc-resynch-buffer file t t))
-
-;;;###autoload
-(defun vc-rollback (&optional norevert)
-  "Get rid of most recently checked in version of this file.
-A prefix argument NOREVERT means do not revert the buffer afterwards."
-  (interactive "P")
-  (vc-ensure-vc-buffer)
-  (let* ((file buffer-file-name)
-        (backend (vc-backend file))
-         (target (vc-workfile-version file)))
-    (cond
-     ((not (vc-find-backend-function backend 'rollback))
-      (error "Sorry, canceling versions is not supported under %s" backend))
-     ((not (vc-call latest-on-branch-p file))
-      (error "This is not the latest version; VC cannot cancel it"))
-     ((not (vc-up-to-date-p file))
-      (error "%s" (substitute-command-keys "File is not up to date; use \\[vc-revert] to discard changes"))))
-    (if (null (yes-or-no-p (format "Remove version %s from master? " target)))
-       (error "Aborted")
-      (setq norevert (or norevert (not
-          (yes-or-no-p "Revert buffer to most recent remaining version? "))))
-
-      (message "Removing last change from %s..." file)
-      (with-vc-properties
-       file
-       (vc-call rollback (list file))
-       `((vc-state . ,(if norevert 'edited 'up-to-date))
-        (vc-checkout-time . ,(if norevert
-                               0
-                             (nth 5 (file-attributes file))))
-        (vc-workfile-version . nil)))
-      (message "Removing last change from %s...done" file)
+      (if (file-exists-p backup-file)
+          backup-file
+        ;; there is no automatic backup, but maybe the user made one manually
+        (setq backup-file (vc-version-backup-file-name file rev 'manual))
+        (if (file-exists-p backup-file)
+            backup-file)))))
 
-      (cond
-       (norevert ;; clear version headers and mark the buffer modified
-       (set-visited-file-name file)
-       (when (not vc-make-backup-files)
-         ;; inhibit backup for this buffer
-         (make-local-variable 'backup-inhibited)
-         (setq backup-inhibited t))
-       (setq buffer-read-only nil)
-       (vc-clear-headers)
-       (vc-mode-line file)
-       (vc-dired-resynch-file file))
-       (t ;; revert buffer to file on disk
-       (vc-resynch-buffer file t t)))
-      (message "Version %s has been removed from the master" target))))
+(defun vc-revert-file (file)
+  "Revert FILE back to the repository version it was based on."
+  (with-vc-properties
+   file
+   (let ((backup-file (vc-version-backup-file file)))
+     (when backup-file
+       (copy-file backup-file file 'ok-if-already-exists 'keep-date)
+       (vc-delete-automatic-version-backups file))
+     (vc-call revert file backup-file))
+   `((vc-state . up-to-date)
+     (vc-checkout-time . ,(nth 5 (file-attributes file)))))
+  (vc-resynch-buffer file t t))
 
 ;;;###autoload
 (defun vc-switch-backend (file backend)
@@ -2875,14 +2755,6 @@ backend to NEW-BACKEND, and unregister FILE from the current backend.
       (vc-mode-line file)
       (vc-checkin file nil comment (stringp comment)))))
 
-(defun vc-default-unregister (backend file)
-  "Default implementation of `vc-unregister', signals an error."
-  (error "Unregistering files is not supported for %s" backend))
-
-(defun vc-default-receive-file (backend file rev)
-  "Let BACKEND receive FILE from another version control system."
-  (vc-call-backend backend 'register file rev ""))
-
 (defun vc-rename-master (oldmaster newfile templates)
   "Rename OLDMASTER to be the master file for NEWFILE based on TEMPLATES."
   (let* ((dir (file-name-directory (expand-file-name oldmaster)))
@@ -2933,14 +2805,6 @@ backend to NEW-BACKEND, and unregister FILE from the current backend.
     ;; If the backend hasn't deleted the file itself, let's do it for him.
     (if (file-exists-p file) (delete-file file))))
 
-(defun vc-default-rename-file (backend old new)
-  (condition-case nil
-      (add-name-to-file old new)
-    (error (rename-file old new)))
-  (vc-delete-file old)
-  (with-current-buffer (find-file-noselect new)
-    (vc-register)))
-
 ;;;###autoload
 (defun vc-rename-file (old new)
   "Rename file OLD to NEW, and rename its master file likewise."
@@ -3009,6 +2873,82 @@ log entries should be gathered."
   (vc-call-backend (vc-responsible-backend default-directory)
                    'update-changelog args))
 
+;;; The default back end.  Assumes RCS-like version numbering.
+
+(defun vc-default-revision-granularity ()
+  (error "Your backend will not work with this version of VC mode."))
+
+;; functions that operate on RCS revision numbers.  This code should
+;; also be moved into the backends.  It stays for now, however, since
+;; it is used in code below.
+;;;###autoload
+(defun vc-trunk-p (rev)
+  "Return t if REV is a revision on the trunk."
+  (not (eq nil (string-match "\\`[0-9]+\\.[0-9]+\\'" rev))))
+
+(defun vc-branch-p (rev)
+  "Return t if REV is a branch revision."
+  (not (eq nil (string-match "\\`[0-9]+\\(\\.[0-9]+\\.[0-9]+\\)*\\'" rev))))
+
+;;;###autoload
+(defun vc-branch-part (rev)
+  "Return the branch part of a revision number REV."
+  (let ((index (string-match "\\.[0-9]+\\'" rev)))
+    (if index
+        (substring rev 0 index))))
+
+(defun vc-minor-part (rev)
+  "Return the minor version number of a revision number REV."
+  (string-match "[0-9]+\\'" rev)
+  (substring rev (match-beginning 0) (match-end 0)))
+
+(defun vc-default-previous-version (backend file rev)
+  "Return the version number immediately preceding REV for FILE,
+or nil if there is no previous version.  This default
+implementation works for MAJOR.MINOR-style version numbers as
+used by RCS and CVS."
+  (let ((branch (vc-branch-part rev))
+        (minor-num (string-to-number (vc-minor-part rev))))
+    (when branch
+      (if (> minor-num 1)
+          ;; version does probably not start a branch or release
+          (concat branch "." (number-to-string (1- minor-num)))
+        (if (vc-trunk-p rev)
+            ;; we are at the beginning of the trunk --
+            ;; don't know anything to return here
+            nil
+          ;; we are at the beginning of a branch --
+          ;; return version of starting point
+          (vc-branch-part branch))))))
+
+(defun vc-default-next-version (backend file rev)
+  "Return the version number immediately following REV for FILE,
+or nil if there is no next version.  This default implementation
+works for MAJOR.MINOR-style version numbers as used by RCS
+and CVS."
+  (when (not (string= rev (vc-workfile-version file)))
+    (let ((branch (vc-branch-part rev))
+         (minor-num (string-to-number (vc-minor-part rev))))
+      (concat branch "." (number-to-string (1+ minor-num))))))
+
+(defun vc-default-responsible-p (backend file)
+  "Indicate whether BACKEND is reponsible for FILE.
+The default is to return nil always."
+  nil)
+
+(defun vc-default-could-register (backend file)
+  "Return non-nil if BACKEND could be used to register FILE.
+The default implementation returns t for all files."
+  t)
+
+(defun vc-default-latest-on-branch-p (backend file)
+  "Return non-nil if FILE is the latest on its branch.
+This default implementation always returns non-nil, which means that
+editing non-current versions is not supported by default."
+  t)
+
+(defun vc-default-init-version (backend) vc-default-init-version)
+
 (defalias 'vc-cvs-update-changelog 'vc-update-changelog-rcs2log)
 (defalias 'vc-rcs-update-changelog 'vc-update-changelog-rcs2log)
 ;; FIXME: This should probably be moved to vc-rcs.el and replaced in
@@ -3064,7 +3004,129 @@ Uses `rcs2log' which only works for RCS and CVS."
               (setq default-directory (file-name-directory changelog))
               (delete-file tempfile)))))
 
-;; Annotate functionality
+(defun vc-default-find-version (backend file rev buffer)
+  "Provide the new `find-version' op based on the old `checkout' op.
+This is only for compatibility with old backends.  They should be updated
+to provide the `find-version' operation instead."
+  (let ((tmpfile (make-temp-file (expand-file-name file))))
+    (unwind-protect
+       (progn
+         (vc-call-backend backend 'checkout file nil rev tmpfile)
+         (with-current-buffer buffer
+           (insert-file-contents-literally tmpfile)))
+      (delete-file tmpfile))))
+
+(defun vc-default-dired-state-info (backend file)
+  (let ((state (vc-state file)))
+    (cond
+     ((stringp state) (concat "(" state ")"))
+     ((eq state 'edited) (concat "(" (vc-user-login-name file) ")"))
+     ((eq state 'needs-merge) "(merge)")
+     ((eq state 'needs-patch) "(patch)")
+     ((eq state 'unlocked-changes) "(stale)"))))
+
+(defun vc-default-rename-file (backend old new)
+  (condition-case nil
+      (add-name-to-file old new)
+    (error (rename-file old new)))
+  (vc-delete-file old)
+  (with-current-buffer (find-file-noselect new)
+    (vc-register)))
+
+(defalias 'vc-default-logentry-check 'ignore)
+
+(defun vc-default-check-headers (backend)
+  "Default implementation of check-headers; always returns nil."
+  nil)
+
+(defun vc-default-log-view-mode (backend) (log-view-mode))
+
+(defun vc-default-show-log-entry (backend rev)
+  (with-no-warnings
+   (log-view-goto-rev rev)))
+
+(defun vc-default-comment-history (backend file)
+  "Return a string with all log entries stored in BACKEND for FILE."
+  (if (vc-find-backend-function backend 'print-log)
+      (with-current-buffer "*vc*"
+       (vc-call print-log (list file))
+       (vc-call-backend backend 'wash-log)
+       (buffer-string))))
+
+(defun vc-default-unregister (backend file)
+  "Default implementation of `vc-unregister', signals an error."
+  (error "Unregistering files is not supported for %s" backend))
+
+(defun vc-default-receive-file (backend file rev)
+  "Let BACKEND receive FILE from another version control system."
+  (vc-call-backend backend 'register file rev ""))
+
+(defun vc-default-create-snapshot (backend dir name branchp)
+  (when branchp
+    (error "VC backend %s does not support module branches" backend))
+  (let ((result (vc-snapshot-precondition dir)))
+    (if (stringp result)
+       (error "File %s is not up-to-date" result)
+      (vc-file-tree-walk
+       dir
+       (lambda (f)
+        (vc-call assign-name f name))))))
+
+(defun vc-default-retrieve-snapshot (backend dir name update)
+  (if (string= name "")
+      (progn
+        (vc-file-tree-walk
+         dir
+         (lambda (f) (and
+                (vc-up-to-date-p f)
+                (vc-error-occurred
+                 (vc-call checkout f nil "")
+                 (if update (vc-resynch-buffer f t t)))))))
+    (let ((result (vc-snapshot-precondition dir)))
+      (if (stringp result)
+          (error "File %s is locked" result)
+        (setq update (and (eq result 'visited) update))
+        (vc-file-tree-walk
+         dir
+         (lambda (f) (vc-error-occurred
+                (vc-call checkout f nil name)
+                (if update (vc-resynch-buffer f t t)))))))))
+
+(defun vc-default-revert (backend file contents-done)
+  (unless contents-done
+    (let ((rev (vc-workfile-version file))
+          (file-buffer (or (get-file-buffer file) (current-buffer))))
+      (message "Checking out %s..." file)
+      (let ((failed t)
+            (backup-name (car (find-backup-file-name file))))
+        (when backup-name
+          (copy-file file backup-name 'ok-if-already-exists 'keep-date)
+          (unless (file-writable-p file)
+            (set-file-modes file (logior (file-modes file) 128))))
+        (unwind-protect
+            (let ((coding-system-for-read 'no-conversion)
+                  (coding-system-for-write 'no-conversion))
+              (with-temp-file file
+                (let ((outbuf (current-buffer)))
+                  ;; Change buffer to get local value of vc-checkout-switches.
+                  (with-current-buffer file-buffer
+                    (let ((default-directory (file-name-directory file)))
+                      (vc-call find-version file rev outbuf)))))
+              (setq failed nil))
+          (when backup-name
+            (if failed
+                (rename-file backup-name file 'ok-if-already-exists)
+              (and (not vc-make-backup-files) (delete-file backup-name))))))
+      (message "Checking out %s...done" file))))
+
+(defun vc-default-revision-completion-table (backend file) nil)
+
+(defun vc-check-headers ()
+  "Check if the current file has any headers in it."
+  (interactive)
+  (vc-call-backend (vc-backend buffer-file-name) 'check-headers))
+
+;;; Annotate functionality
 
 ;; Declare globally instead of additional parameter to
 ;; temp-buffer-show-function (not possible to pass more than one
@@ -3175,7 +3237,7 @@ cover the range from the oldest annotation to the newest."
     ["Annotate next revision" vc-annotate-next-version]
     ["Annotate revision at line" vc-annotate-revision-at-line]
     ["Annotate revision previous to line" vc-annotate-revision-previous-to-line]
-    ["Annotate latest revision" vc-annotate-workfile-version]
+    ["Annotate latest revision" vc-annotate-focus-version]
     ["Show log of revision at line" vc-annotate-show-log-revision-at-line]
     ["Show diff of revision at line" vc-annotate-show-diff-revision-at-line]))
 
@@ -3280,10 +3342,8 @@ colors. `vc-annotate-background' specifies the background color."
           ;; moved it elsewhere, but really point here is not the position
           ;; of the user's cursor :-(
           (when ,current-line           ;(and (bobp))
-            (let ((win (get-buffer-window (current-buffer) 0)))
-              (when win
-                (with-selected-window win
-                  (goto-line ,current-line)))))
+            (goto-line ,current-line)
+            (setq vc-sentinel-movepoint))
           (unless (active-minibuffer-window)
             (message "Annotating... done")))))))
 
@@ -3303,8 +3363,8 @@ versions after."
   (interactive "p")
   (vc-annotate-warp-version prefix))
 
-(defun vc-annotate-workfile-version ()
-  "Visit the annotation of the workfile version of this file."
+(defun vc-annotate-focus-version ()
+  "Visit the annotation of the focus version of this file."
   (interactive)
   (if (not (equal major-mode 'vc-annotate-mode))
       (message "Cannot be invoked outside of a vc annotate buffer")
@@ -3485,20 +3545,6 @@ The annotations are relative to the current time, unless overridden by OFFSET."
   ;; Pretend to font-lock there were no matches.
   nil)
 \f
-;; Collect back-end-dependent stuff here
-
-(defalias 'vc-default-logentry-check 'ignore)
-
-(defun vc-check-headers ()
-  "Check if the current file has any headers in it."
-  (interactive)
-  (vc-call-backend (vc-backend buffer-file-name) 'check-headers))
-
-(defun vc-default-check-headers (backend)
-  "Default implementation of check-headers; always returns nil."
-  nil)
-
-;; Back-end-dependent stuff ends here.
 
 ;; Set up key bindings for use while editing log messages
 
@@ -3523,7 +3569,6 @@ The annotations are relative to the current time, unless overridden by OFFSET."
 (defun vc-file-tree-walk (dirname func &rest args)
   "Walk recursively through DIRNAME.
 Invoke FUNC f ARGS on each VC-managed file f underneath it."
-  ;; FIXME: Kill this function.
   (vc-file-tree-walk-internal (expand-file-name dirname) func args)
   (message "Traversing directory %s...done" dirname))
 
index b8c93f64ff592c5852002625536aa2fabd4bc171..a05bb3c60c5456473719eba88b13f48cb2555458 100644 (file)
 ;; and also as usual \C-h in this map will list the key definitions, which
 ;; are designed to be easy to remember.
 ;;
-;; A special feature is provided by (vcursor-toggle-vcursor-map), bound
+;; A special feature is provided by (vcursor-use-vcursor-map), bound
 ;; to t in that keymap.  With this in effect, the main keymap
 ;; is overridden by the vcursor map, so keys like \C-p and so on
 ;; move the vcursor instead.  Remember how to turn it off (type t),
   :group 'vcursor)
 
 (defcustom vcursor-auto-disable nil
-  "*If non-nil, disable the virtual cursor after use.
+  "If non-nil, disable the virtual cursor after use.
 Any non-vcursor command will force `vcursor-disable' to be called.
 If non-nil but not t, just make sure copying is toggled off, but don't
 disable the vcursor."
@@ -344,7 +344,7 @@ disable the vcursor."
   :group 'vcursor)
 
 (defcustom vcursor-modifiers (list 'control 'shift)
-  "*A list of modifiers that are used to define vcursor key bindings."
+  "A list of modifiers that are used to define vcursor key bindings."
   :type '(repeat symbol)
   :group 'vcursor)
 
@@ -464,7 +464,7 @@ on loading vcursor and from the customize package."
     )))
 
 (defcustom vcursor-key-bindings nil
-  "*How to bind keys when vcursor is loaded.
+  "How to bind keys when vcursor is loaded.
 If t, guess; if `xterm', use bindings suitable for an X terminal; if
 `oemacs', use bindings which work on a PC with Oemacs.  If nil, don't
 define any key bindings.
@@ -476,7 +476,7 @@ Default is nil."
   :version "20.3")
 
 (defcustom vcursor-interpret-input nil
-  "*If non-nil, input from the vcursor is treated as interactive input.
+  "If non-nil, input from the vcursor is treated as interactive input.
 This will cause text insertion to be much slower.  Note that no special
 interpretation of strings is done: \"\C-x\" is a string of four
 characters.  The default is simply to copy strings."
@@ -506,49 +506,48 @@ scrolling set this.  It is used by the `vcursor-auto-disable' code.")
 ;; automatically handle any new commands using the primitives.
 
 (defcustom vcursor-copy-flag nil
-  "*Non-nil means moving vcursor should copy characters moved over to point."
+  "Non-nil means moving vcursor should copy characters moved over to point."
   :type 'boolean
   :group 'vcursor)
 
 (defvar vcursor-temp-goal-column nil
   "Keeps track of temporary goal columns for the virtual cursor.")
 
-(defvar vcursor-use-vcursor-map nil
-  "Non-nil if the vcursor map is mapped directly onto the main keymap.
-See `vcursor-toggle-vcursor-map'.")
-(make-variable-buffer-local 'vcursor-use-vcursor-map)
-
-(defvar vcursor-map nil "Keymap for vcursor command.")
-(define-prefix-command 'vcursor-map)
-
-(define-key vcursor-map "t" 'vcursor-toggle-vcursor-map)
-
-(define-key vcursor-map "\C-p" 'vcursor-previous-line)
-(define-key vcursor-map "\C-n" 'vcursor-next-line)
-(define-key vcursor-map "\C-b" 'vcursor-backward-char)
-(define-key vcursor-map "\C-f" 'vcursor-forward-char)
-
-(define-key vcursor-map "\r" 'vcursor-disable)
-(define-key vcursor-map " " 'vcursor-copy)
-(define-key vcursor-map "\C-y" 'vcursor-copy-word)
-(define-key vcursor-map "\C-i" 'vcursor-toggle-copy)
-(define-key vcursor-map "<" 'vcursor-beginning-of-buffer)
-(define-key vcursor-map ">" 'vcursor-end-of-buffer)
-(define-key vcursor-map "\M-v" 'vcursor-scroll-down)
-(define-key vcursor-map "\C-v" 'vcursor-scroll-up)
-(define-key vcursor-map "o" 'vcursor-other-window)
-(define-key vcursor-map "g" 'vcursor-goto)
-(define-key vcursor-map "x" 'vcursor-swap-point)
-(define-key vcursor-map "\C-s" 'vcursor-isearch-forward)
-(define-key vcursor-map "\C-r" 'vcursor-isearch-backward)
-(define-key vcursor-map "\C-a" 'vcursor-beginning-of-line)
-(define-key vcursor-map "\C-e" 'vcursor-end-of-line)
-(define-key vcursor-map "\M-w" 'vcursor-forward-word)
-(define-key vcursor-map "\M-b" 'vcursor-backward-word)
-(define-key vcursor-map "\M-l" 'vcursor-copy-line)
-(define-key vcursor-map "c" 'vcursor-compare-windows)
-(define-key vcursor-map "k" 'vcursor-execute-key)
-(define-key vcursor-map "\M-x" 'vcursor-execute-command)
+(defvar vcursor-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map "t" 'vcursor-use-vcursor-map)
+
+    (define-key map "\C-p" 'vcursor-previous-line)
+    (define-key map "\C-n" 'vcursor-next-line)
+    (define-key map "\C-b" 'vcursor-backward-char)
+    (define-key map "\C-f" 'vcursor-forward-char)
+
+    (define-key map "\r" 'vcursor-disable)
+    (define-key map " " 'vcursor-copy)
+    (define-key map "\C-y" 'vcursor-copy-word)
+    (define-key map "\C-i" 'vcursor-toggle-copy)
+    (define-key map "<" 'vcursor-beginning-of-buffer)
+    (define-key map ">" 'vcursor-end-of-buffer)
+    (define-key map "\M-v" 'vcursor-scroll-down)
+    (define-key map "\C-v" 'vcursor-scroll-up)
+    (define-key map "o" 'vcursor-other-window)
+    (define-key map "g" 'vcursor-goto)
+    (define-key map "x" 'vcursor-swap-point)
+    (define-key map "\C-s" 'vcursor-isearch-forward)
+    (define-key map "\C-r" 'vcursor-isearch-backward)
+    (define-key map "\C-a" 'vcursor-beginning-of-line)
+    (define-key map "\C-e" 'vcursor-end-of-line)
+    (define-key map "\M-w" 'vcursor-forward-word)
+    (define-key map "\M-b" 'vcursor-backward-word)
+    (define-key map "\M-l" 'vcursor-copy-line)
+    (define-key map "c" 'vcursor-compare-windows)
+    (define-key map "k" 'vcursor-execute-key)
+    (define-key map "\M-x" 'vcursor-execute-command)
+    map)
+  "Keymap for vcursor command.")
+;; This seems unused, but it was done as part of define-prefix-command,
+;; so let's keep it for now.
+(fset 'vcursor-map vcursor-map)
 
 ;; If vcursor-key-bindings is already set on loading, bind the keys now.
 ;; This hybrid way of doing it retains compatibility while allowing
@@ -716,8 +715,7 @@ not be visible otherwise, display it in another window."
   (interactive)
   (let ((buf (current-buffer)) (here (point)) (win (selected-window)))
     (vcursor-goto) ; will disable the vcursor
-    (save-excursion
-      (set-buffer buf)
+    (with-current-buffer buf
       (setq vcursor-window win)
       (vcursor-move here)))
 )
@@ -801,8 +799,7 @@ This is called by most of the virtual-cursor copying commands to find
 out how much to copy."
 
   (vcursor-check)
-  (save-excursion
-    (set-buffer (overlay-buffer vcursor-overlay))
+  (with-current-buffer (overlay-buffer vcursor-overlay)
     (let ((start (goto-char (overlay-start vcursor-overlay))))
       (- (progn (apply func args) (point)) start)))
   )
@@ -817,6 +814,16 @@ out how much to copy."
    (t (error "The virtual cursor is not active now")))
   )
 
+(define-minor-mode vcursor-use-vcursor-map
+  "Toggle the state of the vcursor key map.
+When on, the keys defined in it are mapped directly on top of the main
+keymap, allowing you to move the vcursor with ordinary motion keys.
+An indication \"!VC\" appears in the mode list.  The effect is
+local to the current buffer.
+Disabling the vcursor automatically turns this off."
+  :keymap vcursor-map
+  :lighter " !VC")
+
 (defun vcursor-disable (&optional arg)
   "Disable the virtual cursor.
 Next time you use it, it will start from point.
@@ -844,7 +851,7 @@ not copy text until you turn it on again."
    ((and arg (< (prefix-numeric-value arg) 0))
     (vcursor-move (point))
     (setq vcursor-window (selected-window)))
-   (vcursor-use-vcursor-map (vcursor-toggle-vcursor-map 0)))
+   (vcursor-use-vcursor-map (vcursor-use-vcursor-map 0)))
   (setq vcursor-copy-flag nil)
   )
 
@@ -867,8 +874,7 @@ ALL-FRAMES is also used to decide whether to split the window."
       ;; We don't use fancy vcursor-find-window trickery, since we're
       ;; quite happy to have the vcursor cycle back into the current
       ;; window.
-      (let ((sw (selected-window))
-           (win (vcursor-find-window nil nil (not all-frames))))
+      (let ((win (vcursor-find-window nil nil (not all-frames))))
        (if win (select-window win))
        ;; else start from here
        (other-window n all-frames)
@@ -891,7 +897,7 @@ If `compare-ignore-case' is non-nil, changes in case are also ignored."
   ;; (vcursor-window-funcall 'compare-windows arg)
   (require 'compare-w)
   (let* (p1 p2 maxp1 maxp2 b1 b2 w2
-           success size
+           success
            (opoint1 (point))
            opoint2
            (skip-whitespace (if ignore-whitespace
@@ -905,8 +911,7 @@ If `compare-ignore-case' is non-nil, changes in case are also ignored."
       (setq p2 (point) b2 (current-buffer)))
     (setq opoint2 p2)
     (setq maxp1 (point-max))
-    (save-excursion
-      (set-buffer b2)
+    (with-current-buffer b2
       (setq maxp2 (point-max)))
 
     (setq success t)
@@ -921,7 +926,7 @@ If `compare-ignore-case' is non-nil, changes in case are also ignored."
 
       (and skip-whitespace
           (save-excursion
-            (let (p1a p2a w1 w2 result1 result2)
+            (let (p1a p2a result1 result2)
               (setq result1
                     (if (stringp skip-whitespace)
                         (compare-windows-skip-whitespace opoint1)
@@ -1096,8 +1101,7 @@ is called interactively, so prefix argument etc. are usable."
   (interactive "p")
   (vcursor-check)
   (vcursor-insert
-   (save-excursion
-     (set-buffer (overlay-buffer vcursor-overlay))
+   (with-current-buffer (overlay-buffer vcursor-overlay)
      (let* ((ostart (overlay-start vcursor-overlay))
            (end (+ ostart arg)))
        (prog1
@@ -1126,32 +1130,8 @@ line is treated like ordinary characters."
     (vcursor-copy (if (or (= count 0) arg) (1+ count) count)))
   )
 
-(defun vcursor-toggle-vcursor-map (&optional force noredisp)
-  "Toggle the state of the vcursor key map.
-When on, the keys defined in it are mapped directly on top of the main
-keymap, allowing you to move the vcursor with ordinary motion keys.
-An indication \"!VC\" appears in the mode list.  The effect is
-local to the current buffer.
-With prefix FORCE, turn on, or off if it is 0.
-With NOREDISP, don't force redisplay.
-Disabling the vcursor automatically turns this off."
-  (interactive "P")
-  (let ((new (cond ((not force) (not vcursor-use-vcursor-map))
-                  ((eq force 0) nil)
-                  (t))))
-    (or (eq new vcursor-use-vcursor-map)
-       (progn
-         (setq vcursor-use-vcursor-map new)
-         (or (assq 'vcursor-use-vcursor-map minor-mode-map-alist)
-             (setq minor-mode-map-alist
-                   (cons (cons 'vcursor-use-vcursor-map vcursor-map)
-                         minor-mode-map-alist)))
-         (or (assq 'vcursor-use-vcursor-map minor-mode-alist)
-             (setq minor-mode-alist
-                   (cons (list 'vcursor-use-vcursor-map " !VC")
-                         minor-mode-alist)))
-         (or noredisp (redraw-display)))))
-  )
+(define-obsolete-function-alias
+  'vcursor-toggle-vcursor-map 'vcursor-use-vcursor-map "23.1")
 
 (defun vcursor-post-command ()
   (and vcursor-auto-disable (not vcursor-last-command)
@@ -1166,5 +1146,5 @@ Disabling the vcursor automatically turns this off."
 
 (provide 'vcursor)
 
-;;; arch-tag: cdfe1cdc-2c46-4046-88e4-ed57d20f7aca
+;; arch-tag: cdfe1cdc-2c46-4046-88e4-ed57d20f7aca
 ;;; vcursor.el ends here
index 3722a14065d3168d66859c911dd657a64f6786ab..6d82b194ff89f176f5bc0aa9fb71daebfa84c6ce 100644 (file)
@@ -30,7 +30,7 @@
 (defconst emacs-copyright "Copyright (C) 2007 Free Software Foundation, Inc."
   "Short copyright string for this version of Emacs.")
 
-(defconst emacs-version "23.0.0" "\
+(defconst emacs-version "23.0.50" "\
 Version numbers of this version of Emacs.")
 
 (defconst emacs-major-version
index f6722f537569b676d641f4ab5e4efd7a10eb76e2..c152383a48be13c3d69ef54a2a8aecc3be4497e3 100644 (file)
@@ -990,27 +990,27 @@ for highlighting the match that is found."
               times (if no "no " "") regexp)
       (sit-for 4))))
 
+;; This is the dumb approach, looking at each line.  The original
+;; version of this function looked like it might have been trying to
+;; do something clever, but not succeeding:
+;; http://lists.gnu.org/archive/html/bug-gnu-emacs/2007-09/msg00073.html
 (defun view-search-no-match-lines (times regexp)
-  ;; Search for the TIMESt occurrence of line with no match for REGEXP.
-  (let ((back (and (< times 0) (setq times (- times)) -1))
-       n)
-    (while (> times 0)
-      (save-excursion (beginning-of-line (if back (- times) (1+ times)))
-                     (setq n (point)))
-      (setq times
-           (cond
-            ((< (count-lines (point) n) times) -1) ; Not enough lines.
-            ((or (null (re-search-forward regexp nil t back))
-                 (if back (and (< (match-end 0) n)
-                               (> (count-lines (match-end 0) n) 1))
-                   (and (< n (match-beginning 0))
-                        (> (count-lines n (match-beginning 0)) 1))))
-             0)                        ; No match within lines.
-            (back (count-lines (max n (match-beginning 0)) (match-end 0)))
-            (t (count-lines (match-beginning 0) (min n (match-end 0))))))
-      (goto-char n))
-    (and (zerop times) (looking-at "^.*$"))))
-
+  "Search for the TIMESth occurrence of a line with no match for REGEXP.
+If such a line is found, return non-nil and set the match-data to that line.
+If TIMES is negative, search backwards."
+  (let ((step (if (>= times 0) 1
+                (setq times (- times))
+                -1)))
+    ;; Note that we do not check the current line.
+    (while (and (> times 0)
+                (zerop (forward-line step)))
+      ;; (forward-line 1) returns 0 on moving within the last line.
+      (if (eobp)
+          (setq times -1)
+        (or (re-search-forward regexp (line-end-position) t)
+            (setq times (1- times))))))
+  (and (zerop times)
+       (looking-at ".*")))
 
 (provide 'view)
 
index 3ea8394b0b79681d6db2073ac8bc75898dc3f274..6e6aeb5fbb71b34b632e21468d8c98ebe94311ed 100644 (file)
@@ -709,7 +709,9 @@ periodically for whitespace."
 If timer is not set, then set it to scan the files in
 `whitespace-all-buffer-files' periodically (defined by
 `whitespace-rescan-timer-time') for whitespace creep."
-  (if (and whitespace-rescan-timer-time (not whitespace-rescan-timer))
+  (if (and whitespace-rescan-timer-time
+          (/= whitespace-rescan-timer-time 0)
+          (not whitespace-rescan-timer))
       (setq whitespace-rescan-timer
            (add-timeout whitespace-rescan-timer-time
                         'whitespace-rescan-files-in-buffers nil
index ec702f7b45c4636ab90fc869c9a48afc1de18531..f0dab6626acfc493fd20880e29f1b0366e755c50 100644 (file)
 
 ;;; The Mode.
 
-(defvar widget-browse-mode-map nil
+(defvar widget-browse-mode-map
+  (let ((map (make-sparse-keymap)))
+    (set-keymap-parent map widget-keymap)
+    (define-key map "q" 'bury-buffer)
+    map)
   "Keymap for `widget-browse-mode'.")
 
-(unless widget-browse-mode-map
-  (setq widget-browse-mode-map (make-sparse-keymap))
-  (set-keymap-parent widget-browse-mode-map widget-keymap)
-  (define-key widget-browse-mode-map "q" 'bury-buffer))
-
 (easy-menu-define widget-browse-mode-customize-menu
     widget-browse-mode-map
   "Menu used in widget browser buffers."
@@ -265,38 +264,21 @@ VALUE is assumed to be a list of widgets."
 
 ;;; Widget Minor Mode.
 
-(defvar widget-minor-mode nil
-  "If non-nil, we are in Widget Minor Mode.")
-(make-variable-buffer-local 'widget-minor-mode)
-
-(defvar widget-minor-mode-map nil
+(defvar widget-minor-mode-map
+  (let ((map (make-sparse-keymap)))
+    (set-keymap-parent map widget-keymap)
+    map)
   "Keymap used in Widget Minor Mode.")
 
-(unless widget-minor-mode-map
-  (setq widget-minor-mode-map (make-sparse-keymap))
-  (set-keymap-parent widget-minor-mode-map widget-keymap))
-
 ;;;###autoload
-(defun widget-minor-mode (&optional arg)
+(define-minor-mode widget-minor-mode
   "Togle minor mode for traversing widgets.
 With arg, turn widget mode on if and only if arg is positive."
-  (interactive "P")
-  (cond ((null arg)
-        (setq widget-minor-mode (not widget-minor-mode)))
-       ((<= arg 0)
-        (setq widget-minor-mode nil))
-       (t
-        (setq widget-minor-mode t)))
-  (force-mode-line-update))
-
-(add-to-list 'minor-mode-alist '(widget-minor-mode " Widget"))
-
-(add-to-list 'minor-mode-map-alist
-            (cons 'widget-minor-mode widget-minor-mode-map))
+  :lighter " Widget")
 
 ;;; The End:
 
 (provide 'wid-browse)
 
-;;; arch-tag: d5ffb18f-8984-4735-8502-edf70456db21
+;; arch-tag: d5ffb18f-8984-4735-8502-edf70456db21
 ;;; wid-browse.el ends here
index 72cff55805b5fceb974f29196834271b914aa4c5..c86f8351c7ac43396cf7c8c0efbb244197d5423d 100644 (file)
@@ -405,7 +405,17 @@ new value.")
     (unless (widget-get widget :suppress-face)
       (overlay-put overlay 'face (widget-apply widget :button-face-get))
       (overlay-put overlay 'mouse-face
-                  (widget-apply widget :mouse-face-get)))
+                  ;; Make new list structure for the mouse-face value
+                  ;; so that different widgets will have
+                  ;; different `mouse-face' property values
+                  ;; and will highlight separately.
+                  (let ((mouse-face-value
+                         (widget-apply widget :mouse-face-get)))
+                    ;; If it's a list, copy it.
+                    (if (listp mouse-face-value)
+                        (copy-sequence mouse-face-value)
+                      ;; If it's a symbol, put it in a list.
+                      (list mouse-face-value)))))
     (overlay-put overlay 'pointer 'hand)
     (overlay-put overlay 'follow-link follow-link)
     (overlay-put overlay 'help-echo help-echo)))
@@ -656,7 +666,9 @@ button is pressed or inactive, respectively.  These are currently ignored."
       (progn (widget-put widget :suppress-face t)
             (insert-image image
                           (propertize
-                           tag 'mouse-face widget-button-pressed-face)))
+                            ;; Use a `list' so it's unique and won't get
+                            ;; accidentally merged with neighbouring images.
+                           tag 'mouse-face (list widget-button-pressed-face))))
     (insert tag)))
 
 (defun widget-move-and-invoke (event)
index 26d1bdc9d3f9498f8e693aa34665970fe02d6b6d..41aa5aea06b8d58b1b60f88e3875a457debce356 100644 (file)
@@ -899,10 +899,13 @@ scrollbar interaction\) and `select' \(the next invocation of
   "Cancel delayed window autoselection.
 Optional argument FORCE means cancel unconditionally."
   (unless (and (not force)
-              ;; Don't cancel while the user drags a scroll bar.
-              (eq this-command 'scroll-bar-toolkit-scroll)
-              (memq (nth 4 (event-end last-input-event))
-                    '(handle end-scroll)))
+              ;; Don't cancel for select-window or select-frame events
+              ;; or when the user drags a scroll bar.
+              (or (memq this-command
+                        '(handle-select-window handle-switch-frame))
+                  (and (eq this-command 'scroll-bar-toolkit-scroll)
+                       (memq (nth 4 (event-end last-input-event))
+                             '(handle end-scroll)))))
     (setq mouse-autoselect-window-state nil)
     (when (timerp mouse-autoselect-window-timer)
       (cancel-timer mouse-autoselect-window-timer))
@@ -990,33 +993,39 @@ active.  This function is run by `mouse-autoselect-window-timer'."
   "Handle select-window events."
   (interactive "e")
   (let ((window (posn-window (event-start event))))
-    (when (and (window-live-p window)
-              ;; Don't switch if we're currently in the minibuffer.
-              ;; This tries to work around problems where the minibuffer gets
-              ;; unselected unexpectedly, and where you then have to move
-              ;; your mouse all the way down to the minibuffer to select it.
-              (not (window-minibuffer-p (selected-window)))
-              ;; Don't switch to a minibuffer window unless it's active.
-              (or (not (window-minibuffer-p window))
-                  (minibuffer-window-active-p window)))
-      (unless (and (numberp mouse-autoselect-window)
-                  (not (zerop mouse-autoselect-window))
-                  (not (eq mouse-autoselect-window-state 'select))
-                  (progn
-                    ;; Cancel any delayed autoselection.
-                    (mouse-autoselect-window-cancel t)
-                    ;; Start delayed autoselection from current mouse position
-                    ;; and window.
-                    (mouse-autoselect-window-start (mouse-position) window)
-                    ;; Executing a command cancels delayed autoselection.
-                    (add-hook
-                     'pre-command-hook 'mouse-autoselect-window-cancel)))
+    (unless (or (not (window-live-p window))
+               ;; Don't switch if we're currently in the minibuffer.
+               ;; This tries to work around problems where the
+               ;; minibuffer gets unselected unexpectedly, and where
+               ;; you then have to move your mouse all the way down to
+               ;; the minibuffer to select it.
+               (window-minibuffer-p (selected-window))
+               ;; Don't switch to minibuffer window unless it's active.
+               (and (window-minibuffer-p window)
+                    (not (minibuffer-window-active-p window)))
+               ;; Don't switch when autoselection shall be delayed.
+               (and (numberp mouse-autoselect-window)
+                    (not (zerop mouse-autoselect-window))
+                    (not (eq mouse-autoselect-window-state 'select))
+                    (progn
+                      ;; Cancel any delayed autoselection.
+                      (mouse-autoselect-window-cancel t)
+                      ;; Start delayed autoselection from current mouse position
+                      ;; and window.
+                      (mouse-autoselect-window-start (mouse-position) window)
+                      ;; Executing a command cancels delayed autoselection.
+                      (add-hook
+                       'pre-command-hook 'mouse-autoselect-window-cancel))))
+      (when mouse-autoselect-window
        ;; Reset state of delayed autoselection.
        (setq mouse-autoselect-window-state nil)
-       (when mouse-autoselect-window
-         ;; Run `mouse-leave-buffer-hook' when autoselecting window.
-         (run-hooks 'mouse-leave-buffer-hook))
-       (select-window window)))))
+       ;; Set input focus to handle cross-frame movement.  Bind
+       ;; `focus-follows-mouse' to avoid moving the mouse cursor.
+       (let (focus-follows-mouse)
+         (select-frame-set-input-focus (window-frame window)))
+       ;; Run `mouse-leave-buffer-hook' when autoselecting window.
+       (run-hooks 'mouse-leave-buffer-hook))
+      (select-window window))))
 
 (define-key ctl-x-map "2" 'split-window-vertically)
 (define-key ctl-x-map "3" 'split-window-horizontally)
index 4d50b5d3f2e35b690e64e5b6bfc0693b2512ff8d..c4f922f38e7d8dc244179f9b5565707275d89d25 100644 (file)
@@ -502,7 +502,7 @@ As a special case, if PATHS is nil then replace it by calling
           ;; Assume no `cygpath' program available.
           ;; Hack /cygdrive/x/ or /x/ or (obsolete) //x/ to x:/
           (when (string-match "\\`\\(/cygdrive\\|/\\)?/./" file)
-            (if (match-string 1)               ; /cygdrive/x/ or //x/ -> /x/
+            (if (match-beginning 1)            ; /cygdrive/x/ or //x/ -> /x/
                 (setq file (substring file (match-end 1))))
             (aset file 0 (aref file 1))        ; /x/ -> xx/
             (aset file 1 ?:))          ; xx/ -> x:/
@@ -520,19 +520,19 @@ As a special case, if PATHS is nil then replace it by calling
   :group 'help)
 
 (defcustom woman-show-log nil
-  "*If non-nil then show the *WoMan-Log* buffer if appropriate.
+  "If non-nil then show the *WoMan-Log* buffer if appropriate.
 I.e. if any warning messages are written to it.  Default is nil."
   :type 'boolean
   :group 'woman)
 
 (defcustom woman-pre-format-hook nil
-  "*Hook run by WoMan immediately before formatting a buffer.
+  "Hook run by WoMan immediately before formatting a buffer.
 Change only via `Customization' or the function `add-hook'."
   :type 'hook
   :group 'woman)
 
 (defcustom woman-post-format-hook nil
-  "*Hook run by WoMan immediately after formatting a buffer.
+  "Hook run by WoMan immediately after formatting a buffer.
 Change only via `Customization' or the function `add-hook'."
   :type 'hook
   :group 'woman)
@@ -550,7 +550,7 @@ Change only via `Customization' or the function `add-hook'."
     (if (eq system-type 'windows-nt)
        (mapcar 'woman-Cyg-to-Win path)
       path))
-  "*List of dirs to search and/or files to try for man config file.
+  "List of dirs to search and/or files to try for man config file.
 A trailing separator (`/' for UNIX etc.) on directories is
 optional, and the filename is used if a directory specified is
 the first to start with \"man\" and has an extension starting
@@ -595,7 +595,7 @@ or
 MANPATH_MAP[ \t]+\\(\\S-+\\)[ \t]+\\(\\S-+\\)\\)" nil t)
                      (add-to-list 'manpath
                                   (if (match-beginning 1)
-                                      (match-string 1) 
+                                      (match-string 1)
                                     (cons (match-string 2)
                                           (match-string 3)))))
                    manpath))
@@ -606,7 +606,7 @@ MANPATH_MAP[ \t]+\\(\\S-+\\)[ \t]+\\(\\S-+\\)\\)" nil t)
 (defcustom woman-manpath
   (or (woman-parse-colon-path (getenv "MANPATH"))
       '("/usr/man" "/usr/share/man" "/usr/local/man"))
-  "*List of DIRECTORY TREES to search for UN*X manual files.
+  "List of DIRECTORY TREES to search for UN*X manual files.
 Each element should be the name of a directory that contains
 subdirectories of the form `man?', or more precisely subdirectories
 selected by the value of `woman-manpath-man-regexp'.  Non-directory
@@ -649,7 +649,7 @@ Microsoft platforms.  Its purpose is to avoid `cat?', `.', `..', etc."
 
 (defcustom woman-path
   (if (eq system-type 'ms-dos) '("$DJDIR/info" "$DJDIR/man/cat[1-9onlp]"))
-  "*List of SPECIFIC DIRECTORIES to search for UN*X manual files.
+  "List of SPECIFIC DIRECTORIES to search for UN*X manual files.
 For example
 
   (\"/emacs/etc\").
@@ -676,7 +676,7 @@ drive letters explicitly."
   :group 'woman-interface)
 
 (defcustom woman-cache-level 2
-  "*The level of topic caching.
+  "The level of topic caching.
 1 - cache only the topic and directory lists
     (the only level before version 0.34 - only for compatibility);
 2 - cache also the directories for each topic
@@ -695,7 +695,7 @@ file `woman-cache-filename' for a change to take effect.
   :group 'woman-interface)
 
 (defcustom woman-cache-filename nil
-  "*The full pathname of the WoMan directory and topic cache file.
+  "The full pathname of the WoMan directory and topic cache file.
 It is used to save and restore the cache between sessions.  This is
 especially useful with remote-mounted man page files!  The default
 value of nil suppresses this action.  The `standard' non-nil
@@ -707,7 +707,7 @@ the `woman' command to update and re-write the cache."
   :group 'woman-interface)
 
 (defcustom woman-dired-keys t
-  "*List of `dired' mode keys to define to run WoMan on current file.
+  "List of `dired' mode keys to define to run WoMan on current file.
 E.g. '(\"w\" \"W\"), or any non-null atom to automatically define
 \"w\" and \"W\" if they are unbound, or nil to do nothing.
 Default is t."
@@ -719,20 +719,20 @@ Default is t."
 (defcustom woman-imenu-generic-expression
   '((nil "\n\\([A-Z].*\\)" 1) ; SECTION, but not TITLE
     ("*Subsections*" "^   \\([A-Z].*\\)" 1))
-  "*Imenu support for Sections and Subsections.
+  "Imenu support for Sections and Subsections.
 An alist with elements of the form (MENU-TITLE REGEXP INDEX) --
 see the documentation for `imenu-generic-expression'."
   :type 'sexp
   :group 'woman-interface)
 
 (defcustom woman-imenu nil
-  "*If non-nil then WoMan adds a Contents menu to the menubar.
+  "If non-nil then WoMan adds a Contents menu to the menubar.
 It does this by calling `imenu-add-to-menubar'.  Default is nil."
   :type 'boolean
   :group 'woman-interface)
 
 (defcustom woman-imenu-title "CONTENTS"
-  "*The title to use if WoMan adds a Contents menu to the menubar.
+  "The title to use if WoMan adds a Contents menu to the menubar.
 Default is \"CONTENTS\"."
   :type 'string
   :group 'woman-interface)
@@ -741,13 +741,13 @@ Default is \"CONTENTS\"."
   ;; `woman-use-topic-at-point' may be let-bound when woman is loaded,
   ;; in which case its global value does not get defined.
   ;; `woman-file-name' sets it to this value if it is unbound.
-  "*Default value for `woman-use-topic-at-point'."
+  "Default value for `woman-use-topic-at-point'."
   :type '(choice (const :tag "Yes" t)
                 (const :tag "No" nil))
   :group 'woman-interface)
 
 (defcustom woman-use-topic-at-point woman-use-topic-at-point-default
-  "*Control use of the word at point as the default topic.
+  "Control use of the word at point as the default topic.
 If non-nil the `woman' command uses the word at point automatically,
 without interactive confirmation, if it exists as a topic."
   :type '(choice (const :tag "Yes" t)
@@ -778,7 +778,7 @@ Used as :set cookie by Customize when customizing the user options
 
 (defcustom woman-uncompressed-file-regexp
   "\\.\\([0-9lmnt]\\w*\\)"             ; disallow no extension
-  "*Do not change this unless you are sure you know what you are doing!
+  "Do not change this unless you are sure you know what you are doing!
 Regexp used to select man source files (ignoring any compression extension).
 
 The SysV standard man pages use two character suffixes, and this is
@@ -793,7 +793,7 @@ MUST NOT end with any kind of string terminator such as $ or \\'."
 
 (defcustom woman-file-compression-regexp
   "\\.\\(g?z\\|bz2\\)\\'"
-  "*Do not change this unless you are sure you know what you are doing!
+  "Do not change this unless you are sure you know what you are doing!
 Regexp used to match compressed man file extensions for which
 decompressors are available and handled by auto-compression mode,
 e.g. \"\\\\.\\\\(g?z\\\\|bz2\\\\)\\\\'\" for `gzip' or `bzip2'.
@@ -809,7 +809,7 @@ Should begin with \\. and end with \\' and MUST NOT be optional."
 (defcustom woman-use-own-frame         ; window-system
   (or (and (fboundp 'display-graphic-p) (display-graphic-p)) ; Emacs 21
       (memq window-system '(x w32)))   ; Emacs 20
-  "*If non-nil then use a dedicated frame for displaying WoMan windows.
+  "If non-nil then use a dedicated frame for displaying WoMan windows.
 Only useful when run on a graphic display such as X or MS-Windows."
   :type 'boolean
   :group 'woman-interface)
@@ -823,37 +823,37 @@ Only useful when run on a graphic display such as X or MS-Windows."
   :group 'woman)
 
 (defcustom woman-fill-column 65
-  "*Right margin for formatted text -- default is 65."
+  "Right margin for formatted text -- default is 65."
   :type 'integer
   :group 'woman-formatting)
 
 (defcustom woman-fill-frame nil
   ;; Based loosely on a suggestion by Theodore Jump:
-  "*If non-nil then most of the window width is used."
+  "If non-nil then most of the window width is used."
   :type 'boolean
   :group 'woman-formatting)
 
 (defcustom woman-default-indent 5
-  "*Default prevailing indent set by -man macros -- default is 5.
+  "Default prevailing indent set by -man macros -- default is 5.
 Set this variable to 7 to emulate GNU man formatting."
   :type 'integer
   :group 'woman-formatting)
 
 (defcustom woman-bold-headings t
-  "*If non-nil then embolden section and subsection headings.  Default is t.
+  "If non-nil then embolden section and subsection headings.  Default is t.
 Heading emboldening is NOT standard `man' behavior."
   :type 'boolean
   :group 'woman-formatting)
 
 (defcustom woman-ignore t
-  "*If non-nil then unrecognized requests etc. are ignored.  Default is t.
+  "If non-nil then unrecognized requests etc.. are ignored.  Default is t.
 This gives the standard ?roff behavior.  If nil then they are left in
 the buffer, which may aid debugging."
   :type 'boolean
   :group 'woman-formatting)
 
 (defcustom woman-preserve-ascii t
-  "*If non-nil, preserve ASCII characters in the WoMan buffer.
+  "If non-nil, preserve ASCII characters in the WoMan buffer.
 Otherwise, to save time, some backslashes and spaces may be
 represented differently (as the values of the variables
 `woman-escaped-escape-char' and `woman-unpadded-space-char'
@@ -865,7 +865,7 @@ buffer text is searched, copied or saved to a file."
   :group 'woman-formatting)
 
 (defcustom woman-emulation 'nroff
-  "*WoMan emulation, currently either nroff or troff.  Default is nroff.
+  "WoMan emulation, currently either nroff or troff.  Default is nroff.
 Troff emulation is experimental and largely untested.
 \(Add groff later?)"
   :type '(choice (const nroff) (const troff))
@@ -884,7 +884,7 @@ Troff emulation is experimental and largely untested.
   (or (and (fboundp 'display-color-p) (display-color-p))
       (and (fboundp 'display-graphic-p) (display-graphic-p))
       (x-display-color-p))
-  "*If non-nil then WoMan assumes that face support is available.
+  "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."
   :type 'boolean
@@ -955,11 +955,10 @@ This is usually either black or white."
   (let (symbol-fonts)
     ;; With NTEmacs 20.5, the PATTERN option to `x-list-fonts' does
     ;; not seem to work and fonts may be repeated, so ...
-    (while fonts
-      (and (string-match "-Symbol-" (car fonts))
-          (not (member (car fonts) symbol-fonts))
-          (setq symbol-fonts (cons (car fonts) symbol-fonts)))
-      (setq fonts (cdr fonts)))
+    (dolist (font fonts)
+      (and (string-match "-Symbol-" font)
+          (not (member font symbol-fonts))
+          (setq symbol-fonts (cons font symbol-fonts))))
     symbol-fonts))
 
 (when woman-font-support
@@ -969,12 +968,12 @@ This is usually either black or white."
   ;; avoid unnecessarily upsetting the line spacing in NTEmacs 20.5!
 
   (defcustom woman-use-extended-font t
-    "*If non-nil then may use non-ASCII characters from the default font."
+    "If non-nil then may use non-ASCII characters from the default font."
     :type 'boolean
     :group 'woman-faces)
 
   (defcustom woman-use-symbol-font nil
-    "*If non-nil then may use the symbol font.
+    "If non-nil then may use the symbol font.
 It is off by default, mainly because it may change the line spacing
 \(in NTEmacs 20.5)."
     :type 'boolean
@@ -986,7 +985,7 @@ It is off by default, mainly because it may change the line spacing
     "Symbol font(s), preferably same size as default when WoMan was loaded.")
 
   (defcustom woman-symbol-font (car woman-symbol-font-list)
-    "*A string describing the symbol font to use for special characters.
+    "A string describing the symbol font to use for special characters.
 It should be compatible with, and the same size as, the default text font.
 Under MS-Windows, the default is
   \"-*-Symbol-normal-r-*-*-*-*-96-96-p-*-ms-symbol\"."
@@ -1199,10 +1198,9 @@ Return t if the file exists, nil otherwise."
   "Save the directory and topic cache.
 It is saved to the file named by the variable `woman-cache-filename'."
   (if woman-cache-filename
-      (save-excursion                  ; to restore current buffer
+      (with-current-buffer (generate-new-buffer "WoMan tmp buffer")
        ;; Make a temporary buffer; name starting with space "hides" it.
-       (let ((standard-output
-              (set-buffer (generate-new-buffer "WoMan tmp buffer")))
+       (let ((standard-output (current-buffer))
              (backup-inhibited t))
          ;; (switch-to-buffer standard-output t) ; only for debugging
          (buffer-disable-undo standard-output)
@@ -1344,10 +1342,8 @@ Ignore any paths that are unreadable or not directories."
   ;; Allow each path to be a single string or a list of strings:
   (if (not (listp woman-manpath)) (setq woman-manpath (list woman-manpath)))
   (if (not (listp woman-path)) (setq woman-path (list woman-path)))
-  (let (dir head dirs path)
-    (while woman-manpath
-      (setq dir (car woman-manpath)
-           woman-manpath (cdr woman-manpath))
+  (let (head dirs path)
+    (dolist (dir woman-manpath)
       (when (consp dir)
        (unless path
          (setq path (split-string (getenv "PATH") path-separator t)))
@@ -1361,9 +1357,7 @@ Ignore any paths that are unreadable or not directories."
          (setq dir (woman-canonicalize-dir dir)
                dirs (nconc dirs (directory-files
                                  dir t woman-manpath-man-regexp)))))
-    (while woman-path
-      (setq dir (car woman-path)
-           woman-path (cdr woman-path))
+    (dolist (dir woman-path)
       (if (or (null dir)
              (null (setq dir (woman-canonicalize-dir dir)
                          head (file-name-directory dir)))
@@ -1455,22 +1449,20 @@ Also make each path-info component into a list.
 \(Note that this function changes the value of ALIST.)"
   ;; Replaces unreadably "optimized" O(n^2) implementation.
   ;; Instead we use sorting to merge stuff efficiently.  -- dak
-  (let (elt newalist)
+  (let (newalist)
     ;; Sort list into reverse order
     (setq alist (sort alist (lambda(x y) (string< (car y) (car x)))))
     ;; merge duplicate keys.
     (if (> woman-cache-level 1)
-       (while alist
-         (setq elt (pop alist))
+       (dolist (elt alist)
          (if (equal (car elt) (caar newalist))
              (unless (member (cdr elt) (cdar newalist))
                (setcdr (car newalist) (cons (cdr elt)
                                             (cdar newalist))))
            (setcdr elt (list (cdr elt)))
            (push elt newalist)))
-    ;; woman-cache-level = 1 => elements are single-element lists ...
-      (while alist
-       (setq elt (pop alist))
+      ;; woman-cache-level = 1 => elements are single-element lists ...
+      (dolist (elt alist)
        (unless (equal (car elt) (caar newalist))
          (push elt newalist))))
     newalist))
@@ -1496,10 +1488,9 @@ Also make each path-info component into a list.
        ;; Use cached path-info to locate files for each topic:
        (let ((path-info (cdr (assoc topic topics)))
              filename)
-         (while path-info
-           (setq dir (nth (car (car path-info)) path)
-                 filename (car (cdr (car path-info)))
-                 path-info (cdr path-info)
+         (dolist (elt path-info)
+           (setq dir (nth (car elt) path)
+                 filename (car (cdr elt))
                  files (nconc files
                               ;; Find the actual file name:
                               (if filename
@@ -1534,7 +1525,7 @@ Also make each path-info component into a list.
   "Define dired keys to run WoMan according to `woman-dired-keys'."
   (if woman-dired-keys
       (if (listp woman-dired-keys)
-         (mapcar 'woman-dired-define-key woman-dired-keys)
+         (mapc 'woman-dired-define-key woman-dired-keys)
        (woman-dired-define-key-maybe "w")
        (woman-dired-define-key-maybe "W")))
   (define-key-after (lookup-key dired-mode-map [menu-bar immediate])
@@ -1648,7 +1639,10 @@ Do not call directly!"
        (select-frame
         (or (and (frame-live-p woman-frame) woman-frame)
             (setq woman-frame (make-frame)))))
-    (switch-to-buffer (get-buffer-create bufname))
+    (set-buffer (get-buffer-create bufname))
+    (condition-case nil
+        (switch-to-buffer (current-buffer))
+      (error (pop-to-buffer (current-buffer))))
     (buffer-disable-undo)
     (setq buffer-read-only nil)
     (erase-buffer)                     ; NEEDED for reformat
@@ -1767,21 +1761,21 @@ Leave point at end of new text.  Return length of inserted text."
 \f
 ;;; Major mode (Man) interface:
 
-(defvar woman-mode-map nil "Keymap for woman mode.")
+(defvar woman-mode-map
+  (let ((map (make-sparse-keymap)))
+    (set-keymap-parent map Man-mode-map)
 
-(unless woman-mode-map
-  (setq woman-mode-map (make-sparse-keymap))
-  (set-keymap-parent woman-mode-map Man-mode-map)
+    (define-key map "R" 'woman-reformat-last-file)
+    (define-key map "w" 'woman)
+    (define-key map "\en" 'WoMan-next-manpage)
+    (define-key map "\ep" 'WoMan-previous-manpage)
+    (define-key map [M-mouse-2] 'woman-follow-word)
 
-  (define-key woman-mode-map "R" 'woman-reformat-last-file)
-  (define-key woman-mode-map "w" 'woman)
-  (define-key woman-mode-map "\en" 'WoMan-next-manpage)
-  (define-key woman-mode-map "\ep" 'WoMan-previous-manpage)
-  (define-key woman-mode-map [M-mouse-2] 'woman-follow-word)
-
-  ;; We don't need to call `man' when we are in `woman-mode'.
-  (define-key woman-mode-map [remap man] 'woman)
-  (define-key woman-mode-map [remap man-follow] 'woman-follow))
+    ;; We don't need to call `man' when we are in `woman-mode'.
+    (define-key map [remap man] 'woman)
+    (define-key map [remap man-follow] 'woman-follow)
+    map)
+  "Keymap for woman mode.")
 
 (defun woman-follow (topic)
   "Get a Un*x manual page of the item under point and put it in a buffer."
@@ -1916,7 +1910,7 @@ See `Man-mode' for additional details."
   ;; necessary to avoid re-installing the same imenu:
   (setq woman-imenu-done nil)
   (if woman-imenu (woman-imenu))
-  (let (buffer-read-only)
+  (let ((inhibit-read-only t))
     (Man-highlight-references 'WoMan-xref-man-page))
   (set-buffer-modified-p nil)
   (run-mode-hooks 'woman-mode-hook))
@@ -1953,14 +1947,10 @@ Optional argument REDRAW, if non-nil, forces mode line to be updated."
     (setq apropos-accumulator
          (apropos-internal "woman"
                            (lambda (symbol)
-                             (or (commandp symbol)
-                                 (user-variable-p symbol)))))
-    ;; Filter out any inhibited symbols:
-    (let ((tem apropos-accumulator))
-      (while tem
-       (if (get (car tem) 'apropos-inhibit)
-           (setq apropos-accumulator (delq (car tem) apropos-accumulator)))
-       (setq tem (cdr tem))))
+                             (and
+                              (or (commandp symbol)
+                                  (user-variable-p symbol))
+                              (not (get symbol 'apropos-inhibit))))))
     ;; Find documentation strings:
     (let ((p apropos-accumulator)
          doc symbol)
@@ -2091,17 +2081,14 @@ alist in `woman-buffer-alist' and return nil."
   (char-to-string woman-unpadded-space-char)
   "Internal string representation of unpadded space characters.")
 
-(defvar woman-syntax-table nil
+(defvar woman-syntax-table
+  (let ((st (make-syntax-table)))
+    ;; The following internal chars must NOT have whitespace syntax:
+    (modify-syntax-entry woman-unpadded-space-char "." st)
+    (modify-syntax-entry woman-escaped-escape-char "." st)
+    st)
   "Syntax table to support special characters used internally by WoMan.")
 
-(if woman-syntax-table
-    ()
-  (setq woman-syntax-table (make-syntax-table))
-  ;; The following internal chars must NOT have whitespace syntax:
-  (modify-syntax-entry woman-unpadded-space-char "." woman-syntax-table)
-  (modify-syntax-entry woman-escaped-escape-char "." woman-syntax-table)
-  )
-
 (defun woman-set-buffer-display-table ()
   "Set up a display table for a WoMan buffer.
 This display table is used for displaying internal special characters, but
@@ -2169,14 +2156,14 @@ To be called on original buffer and any .so insertions."
   (goto-char from)
   ;; .eo turns off escape character processing
   (while (re-search-forward "\\(\\\\[\\e]\\)\\|^\\.eo" to t) ; \\
-    (if (match-string 1)
+    (if (match-beginning 1)
        (replace-match woman-escaped-escape-string t t)
       (woman-delete-whole-line)
       ;; .ec turns on escape character processing (and sets the
       ;; escape character to its argument, if any, which I'm ignoring
       ;; for now!)
       (while (and (re-search-forward "\\(\\\\\\)\\|^\\.ec" to t) ; \
-                 (match-string 1))
+                 (match-beginning 1))
        (replace-match woman-escaped-escape-string t t))
       ;; ***** Need test for .ec arg and warning here! *****
       (woman-delete-whole-line)))
@@ -2190,15 +2177,13 @@ To be called on original buffer and any .so insertions."
 (defun woman-non-underline-faces ()
   "Prepare non-underlined versions of underlined faces."
   (let ((face-list (face-list)))
-    (while face-list
-      (let* ((face (car face-list))
-            (face-name (symbol-name face)))
+    (dolist (face face-list)
+      (let ((face-name (symbol-name face)))
        (if (and (string-match "\\`woman-" face-name)
                 (face-underline-p face))
            (let ((face-no-ul (intern (concat face-name "-no-ul"))))
              (copy-face face face-no-ul)
-             (set-face-underline-p face-no-ul nil))))
-      (setq face-list (cdr face-list)))))
+             (set-face-underline-p face-no-ul nil)))))))
 
 ;; Preprocessors
 ;; =============
@@ -2449,7 +2434,7 @@ Preserves location of `point'."
            to t)
       (let ((from (match-beginning 0))
            (delim (regexp-quote (match-string 1)))
-           (absolute (match-string 2)) ; absolute position?
+           (absolute (match-beginning 2)) ; absolute position?
            (N (woman-parse-numeric-arg)) ; distance
            to
            msg)                        ; for warning
@@ -2628,7 +2613,7 @@ If DELETE is non-nil then delete from point."
                       ;; Interpret bogus `el \}' as `el \{',
                       ;; especially for Tcl/Tk man pages:
                       "\\(\\\\{\\|el[ \t]*\\\\}\\)\\|\\(\n[.']\\)?[ \t]*\\\\}[ \t]*")
-                     (match-string 1))
+                     (match-beginning 1))
               (re-search-forward "\\\\}"))
             (delete-region (if delete from (match-beginning 0)) (point))
             (if (looking-at "^$") (delete-char 1))
@@ -2731,11 +2716,9 @@ If DELETE is non-nil then delete from point."
 (defun woman0-rename ()
   "Effect renaming required by .rn requests."
   ;; For now, do this backwards AFTER all macro expansion.
-  (while woman0-rename-alist
-    (let* ((new (car woman0-rename-alist))
-          (old (cdr new))
-          (new (car new)))
-      (setq woman0-rename-alist (cdr woman0-rename-alist))
+  (dolist ((new woman0-rename-alist))
+    (let ((old (cdr new))
+          (new (car new)))
       (goto-char (point-min))
       (setq new (concat "^[.'][ \t]*" (regexp-quote new)))
       (setq old (concat "." old))
@@ -2752,7 +2735,7 @@ Replaces || by |, but | by \, where | denotes the internal escape."
   (let (start)
     (while (setq start (string-match woman-unescape-regex macro start))
       (setq macro
-           (if (match-string 1 macro)
+           (if (match-beginning 1)
                (replace-match "" t t macro 1)
              (replace-match "\\" t t macro))
            start (1+ start)))
@@ -2875,7 +2858,7 @@ interpolated by `\*x' and `\*(xx' escapes."
   (while
       ;; Find .ds requests and \* escapes:
       (re-search-forward "\\(^[.'][ \t]*ds\\)\\|\\\\\\*" to t)
-    (cond ((match-string 1)            ; .ds
+    (cond ((match-beginning 1)         ; .ds
           (skip-chars-forward " \t")
           (if (eolp)                   ; ignore if no argument
               ()
@@ -3004,7 +2987,7 @@ Set NEWTEXT in face FACE if specified."
                 ((cadr replacement)    ; Use ASCII simulation
                  (woman-replace-match (cadr replacement)))))
        (WoMan-warn (concat "Special character "
-                           (if (match-string 1) "\\(%s" "\\[%s]")
+                           (if (match-beginning 1) "\\(%s" "\\[%s]")
                            " not interpolated!") name)
        (if woman-ignore (woman-delete-match 0))))
     ))
@@ -3016,8 +2999,7 @@ together with the corresponding glyphs from the default and symbol fonts.
 Useful for constructing the alist variable `woman-special-characters'."
   (interactive)
   (with-output-to-temp-buffer "*WoMan Extended Font Map*"
-    (save-excursion
-      (set-buffer standard-output)
+    (with-current-buffer standard-output
       (let ((i 32))
        (while (< i 256)
          (insert (format "\\%03o " i) (string i) " " (string i))
@@ -3238,7 +3220,7 @@ If optional arg CONCAT is non-nil then join arguments."
     (setq c (concat "\\(" c "\\)\\|^[.'][ \t]*hc"))
     (save-excursion
       (while (and (re-search-forward c nil t)
-                 (match-string 1))
+                 (match-beginning 1))
        (delete-char -1)))
     ))
 
@@ -3315,7 +3297,7 @@ If optional arg CONCAT is non-nil then join arguments."
         "^[.'][ \t]*\\(\\(\\ft\\)\\|\\(.P\\)\\)\\|\\(\\\\f\\)" nil 1)
       (let (font beg notfont fescape)
        ;; Match font indicator and leave point at end of sequence:
-       (cond ((match-string 2)
+       (cond ((match-beginning 2)
               ;; .ft request found
               (setq beg (match-beginning 0))
               (skip-chars-forward " \t")
@@ -3323,10 +3305,10 @@ If optional arg CONCAT is non-nil then join arguments."
                   (setq font previous-font)
                 (looking-at "[^ \t\n]+"))
               (forward-line))          ; end of control line and \n
-             ((match-string 3)
+             ((match-beginning 3)
               ;; Macro that resets font found
               (setq font 'default))
-             ((match-string 4)
+             ((match-beginning 4)
               ;; \f escape found
               (setq beg (match-beginning 0)
                      fescape t)
@@ -3758,7 +3740,7 @@ expression in parentheses.  Leaves point after the value."
       (while
          (and
           (setq to (re-search-forward "\\(\\\\c\\)?\n[.']" nil t))
-          (match-string 1)
+          (match-beginning 1)
           (looking-at "br"))
        (goto-char (match-beginning 0))
        (woman-delete-line 2)))
@@ -3920,12 +3902,10 @@ Leave 1 blank line.  Format paragraphs upto TO."
                ((eq c ?\t)             ; skip
                 (if (eq (following-char) ?\t)
                     (forward-char)     ; both tabs, just skip
-                  (let ((i woman-tab-width))
-                    (while (> i 0)
-                      (if (eolp)
-                          (insert ?\ ) ; extend line
-                        (forward-char)) ; skip
-                      (setq i (1- i)))
+                  (dotimes (i woman-tab-width)
+                     (if (eolp)
+                         (insert ?\ )  ; extend line
+                       (forward-char)) ; skip
                     )))
                (t
                 (if (or (eq (following-char) ?\ ) ; overwrite OK
@@ -4312,7 +4292,7 @@ Format paragraphs upto TO.  Set prevailing indent to I."
                  ;; Necessary to avoid spaces inheriting underlines.
                  ;; Cannot simply delete (current-column) whitespace
                  ;; characters because some may be tabs!
-                 (while (> i 0) (insert ? ) (setq i (1- i)))))
+                 (insert-char ?\s i)))
           (goto-char to)               ; necessary ???
           ))
     ))
@@ -4468,9 +4448,7 @@ tab stop columns or pairs (COLUMN . TYPE) where TYPE is R or C."
                    n (- (if n (1- n) eol) (point))
                    tab (- tab (if (eq type ?C) (/ n 2) n))) )
          (setq n (- tab (current-column)))
-         (while (> n 0)
-           (insert ?\ )
-           (setq n (1- n))))
+         (insert-char ?\s n))
       (insert ?\ ))))
 
 (defun woman2-DT (to)
@@ -4571,8 +4549,7 @@ Format paragraphs upto TO."
 (defun WoMan-log-begin ()
   "Log the beginning of formatting in *WoMan-Log*."
   (let ((WoMan-current-buffer (buffer-name)))
-    (save-excursion
-      (set-buffer (get-buffer-create "*WoMan-Log*"))
+    (with-current-buffer (get-buffer-create "*WoMan-Log*")
       (or (eq major-mode 'view-mode) (view-mode 1))
       (setq buffer-read-only nil)
       (goto-char (point-max))
@@ -4615,8 +4592,7 @@ with the message."
   "Log a message STRING in *WoMan-Log*.
 If optional argument END is non-nil then make buffer read-only after
 logging the message."
-  (save-excursion
-    (set-buffer (get-buffer-create "*WoMan-Log*"))
+  (with-current-buffer (get-buffer-create "*WoMan-Log*")
     (setq buffer-read-only nil)
     (goto-char (point-max))
     (or end (insert "  "))  (insert string "\n")
@@ -4635,5 +4611,5 @@ logging the message."
 
 (provide 'woman)
 
-;;; arch-tag: eea35e90-552f-4712-a94b-d9ffd3db7651
+;; arch-tag: eea35e90-552f-4712-a94b-d9ffd3db7651
 ;;; woman.el ends here
index 1c29669b73bbb6dc92e4a24f17203a7423295cbc..f6f3b75dc0795f0fd44123f0808d3b3b58234456 100644 (file)
@@ -121,14 +121,15 @@ any protocol specific data.")
 
 (defun x-dnd-init-frame (&optional frame)
   "Setup drag and drop for FRAME (i.e. create appropriate properties)."
-  (x-register-dnd-atom "DndProtocol" frame)
-  (x-register-dnd-atom "_MOTIF_DRAG_AND_DROP_MESSAGE" frame)
-  (x-register-dnd-atom "XdndEnter" frame)
-  (x-register-dnd-atom "XdndPosition" frame)
-  (x-register-dnd-atom "XdndLeave" frame)
-  (x-register-dnd-atom "XdndDrop" frame)
-  (x-dnd-init-xdnd-for-frame frame)
-  (x-dnd-init-motif-for-frame frame))
+  (when (eq 'x (window-system frame))
+    (x-register-dnd-atom "DndProtocol" frame)
+    (x-register-dnd-atom "_MOTIF_DRAG_AND_DROP_MESSAGE" frame)
+    (x-register-dnd-atom "XdndEnter" frame)
+    (x-register-dnd-atom "XdndPosition" frame)
+    (x-register-dnd-atom "XdndLeave" frame)
+    (x-register-dnd-atom "XdndDrop" frame)
+    (x-dnd-init-xdnd-for-frame frame)
+    (x-dnd-init-motif-for-frame frame)))
 
 (defun x-dnd-get-state-cons-for-frame (frame-or-window)
   "Return the entry in x-dnd-current-state for a frame or window."
index 8ce93e2293eb04b71caec8052551e535311acf08..15aebb08ab262bf78b4f6f7b7d014879bce35b2b 100644 (file)
@@ -45,6 +45,7 @@
 
 (defvar xterm-mouse-debug-buffer nil)
 
+;; XXX Perhaps this should be terminal-local instead. --lorentey
 (define-key function-key-map "\e[M" 'xterm-mouse-translate)
 
 (defvar xterm-mouse-last)
                (vector (list down-where down-data) down)
              (vector down))))))))
 
-(defvar xterm-mouse-x 0
-  "Position of last xterm mouse event relative to the frame.")
-
-(defvar xterm-mouse-y 0
-  "Position of last xterm mouse event relative to the frame.")
+;; These two variables have been converted to terminal parameters.
+;;
+;;(defvar xterm-mouse-x 0
+;;  "Position of last xterm mouse event relative to the frame.")
+;;
+;;(defvar xterm-mouse-y 0
+;;  "Position of last xterm mouse event relative to the frame.")
 
 (defvar xt-mouse-epoch nil)
 
 
 (defun xterm-mouse-position-function (pos)
   "Bound to `mouse-position-function' in XTerm mouse mode."
-  (setcdr pos (cons xterm-mouse-x xterm-mouse-y))
+  (when (terminal-parameter nil 'xterm-mouse-x)
+    (setcdr pos (cons (terminal-parameter nil 'xterm-mouse-x)
+                     (terminal-parameter nil 'xterm-mouse-y))))
   pos)
 
 ;; read xterm sequences above ascii 127 (#x7f)
          (left (nth 0 ltrb))
          (top (nth 1 ltrb)))
 
-    (setq xterm-mouse-x x
-         xterm-mouse-y y)
+    (set-terminal-parameter nil 'xterm-mouse-x x)
+    (set-terminal-parameter nil 'xterm-mouse-y y)
     (setq
      last-input-event
      (list mouse
@@ -202,27 +207,67 @@ down the SHIFT key while pressing the mouse button."
   :global t :group 'mouse
   (if xterm-mouse-mode
       ;; Turn it on
-      (unless window-system
+      (progn
+       ;; Frame creation and deletion.
+       (add-hook 'after-make-frame-functions 
+                 'turn-on-xterm-mouse-tracking-on-terminal)
+       (add-hook 'delete-frame-functions 'xterm-mouse-handle-delete-frame)
+       
+       ;; Restore normal mouse behaviour outside Emacs.
+        (add-hook 'suspend-tty-functions
+                 'turn-off-xterm-mouse-tracking-on-terminal)
+       (add-hook 'resume-tty-functions 
+                 'turn-on-xterm-mouse-tracking-on-terminal)
+       (add-hook 'suspend-hook 'turn-off-xterm-mouse-tracking)
+       (add-hook 'suspend-resume-hook 'turn-on-xterm-mouse-tracking)
+       (add-hook 'kill-emacs-hook 'turn-off-xterm-mouse-tracking)
        (setq mouse-position-function #'xterm-mouse-position-function)
        (turn-on-xterm-mouse-tracking))
     ;; Turn it off
+    (remove-hook 'after-make-frame-functions 
+                'turn-on-xterm-mouse-tracking-on-terminal)
+    (remove-hook 'delete-frame-functions 'xterm-mouse-handle-delete-frame)
+    (remove-hook 'suspend-tty-functions 
+                'turn-off-xterm-mouse-tracking-on-terminal)
+    (remove-hook 'resume-tty-functions 
+                'turn-on-xterm-mouse-tracking-on-terminal)
+    (remove-hook 'suspend-hook 'turn-off-xterm-mouse-tracking)
+    (remove-hook 'suspend-resume-hook 'turn-on-xterm-mouse-tracking)
+    (remove-hook 'kill-emacs-hook 'turn-off-xterm-mouse-tracking)
     (turn-off-xterm-mouse-tracking 'force)
     (setq mouse-position-function nil)))
 
 (defun turn-on-xterm-mouse-tracking ()
   "Enable Emacs mouse tracking in xterm."
-  (if xterm-mouse-mode
-      (send-string-to-terminal "\e[?1000h")))
+  (dolist (f (frame-list))
+    (when (eq t (frame-live-p f))
+      (with-selected-frame f
+       (when xterm-mouse-mode
+         (send-string-to-terminal "\e[?1000h"))))))
 
 (defun turn-off-xterm-mouse-tracking (&optional force)
   "Disable Emacs mouse tracking in xterm."
-  (if (or force xterm-mouse-mode)
-      (send-string-to-terminal "\e[?1000l")))
-
-;; Restore normal mouse behaviour outside Emacs.
-(add-hook 'suspend-hook 'turn-off-xterm-mouse-tracking)
-(add-hook 'suspend-resume-hook 'turn-on-xterm-mouse-tracking)
-(add-hook 'kill-emacs-hook 'turn-off-xterm-mouse-tracking)
+  (dolist (f (frame-list))
+    (when (eq t (frame-live-p f))
+      (with-selected-frame f
+       (when (or force xterm-mouse-mode)
+         (send-string-to-terminal "\e[?1000l"))))))
+
+(defun turn-on-xterm-mouse-tracking-on-terminal (terminal)
+  "Enable xterm mouse tracking on TERMINAL."
+  (when (and xterm-mouse-mode (eq t (terminal-live-p terminal)))
+    (send-string-to-terminal "\e[?1000h" terminal)))
+
+(defun turn-off-xterm-mouse-tracking-on-terminal (terminal)
+  "Disable xterm mouse tracking on TERMINAL."
+  (when (and xterm-mouse-mode (eq t (terminal-live-p terminal)))
+    (send-string-to-terminal "\e[?1000l" terminal)))
+
+(defun xterm-mouse-handle-delete-frame (frame)
+  "Turn off xterm mouse tracking if FRAME is the last frame on its device."
+  (when (and (eq t (frame-live-p frame))
+            (<= 1 (length (frames-on-display-list (frame-terminal frame)))))
+    (turn-off-xterm-mouse-tracking-on-terminal frame)))
 
 (provide 'xt-mouse)
 
index e1af5a918b0500ed75431673720f355b7586e297..f3c7a7c5da68804a1bdf391127ba34aed33c3cca 100644 (file)
@@ -1,21 +1 @@
-*.aux
-*.fn
-*.fns
-*.cps
-*.cp
-*.kys
-*.ky
-*.toc
-*.pgs
-*.pg
-*.log
-*.vrs
-*.vr
-*.dvi
-*.ps
-*.tp
-*.tps
-*.tmp
-*.txt
 Makefile
-makefile
diff --git a/lispintro/ChangeLog b/lispintro/ChangeLog
deleted file mode 100644 (file)
index 33c4faa..0000000
+++ /dev/null
@@ -1,271 +0,0 @@
-2007-07-30  Robert J. Chassell  <bob@rattlesnake.com>
-
-       * emacs-lisp-intro.texi: Fix typo on line 5173, change `thee' to
-       `these'.
-
-2007-07-25  Glenn Morris  <rgm@gnu.org>
-
-       * Relicense all FSF files to GPLv3 or later.
-
-2007-06-02  Chong Yidong  <cyd@stupidchicken.com>
-
-       * Version 22.1 released.
-
-2007-01-30  Robert J. Chassell  <bob@rattlesnake.com>
-
-       * emacs-lisp-intro.texi (else): Rephrase message of first
-       if-then-else example so it is right both in itself and in the
-       "true" case of the expression, which asks whether 4 is greater
-       than 5.
-
-2006-11-27  Andreas Schwab  <schwab@suse.de>
-
-       * Makefile.in (usermanualdir): Define.
-       (emacs-lisp-intro.dvi): Pass -I options to texi2dvi instead of
-       using TEXINPUTS.
-
-       * emacs-lisp-intro.texi: Input texinfo instead of ../man/texinfo
-       to fix building outside source directory.
-
-2006-11-09  Robert J. Chassell  <bob@rattlesnake.com>
-
-       * emacs-lisp-intro.texi: Copy descriptions from detailed master
-       menu to menus within body.
-
-       * emacs-lisp-intro.texi (at the beginning):  Add `other shell
-       commands' to produce additional output formats; total is now ten.
-       (A Loop with an Incrementing Counter, and others): Ensure Info
-       menus will appear in short windows.
-       (Disentangle beginning-of-buffer): Replace `version 21' with `more
-       recent versions'.
-       (Simple Extension): Show how to handle multiple versions by adding
-       an alternative with a test of `>= 21'
-
-
-2006-11-06  Robert J. Chassell  <bob@rattlesnake.com>
-
-       * emacs-lisp-intro.texi: Finish minor changes seen from DVI output.
-       Replace 22.1.100 with 22.1.1.
-       (current-kill): Mention functions that directly or indirectly call
-       `kill-new', which sets `kill-ring-yank-pointer'.
-       (Understanding current-kill): Change `lasted' to `last'.  Remove
-       extraneous parenthesis.  Reword item about returning `car' of list.
-       (yank): Remove mention of `rotate-yank-pointer'.
-       (Y Axis Element): Add comment regarding replacement of blank space.
-       (print-Y-axis Penultimate): Explain that `print-graph' will pass
-       `height-of-top-line' so `print-Y-axis' does not have a bug.
-
-2006-11-05  Robert J. Chassell  <bob@rattlesnake.com>
-
-       * emacs-lisp-intro.texi: Yet more minor changes:
-       (defcustom): Said that `:options' is usually for a hook.  Remove
-       extraneous space in parenthetical remark concerning
-       `text-mode-hook-identify'.  At end, mention other defines, too.
-       (Beginning a .emacs File): Reverse words about comments so they
-       parallel numbers of listed semi-colons.
-       (Text and Auto-fill): Remove extraneous blank line in example.
-       (Mail Aliases): Remove extraneous blank line in example.
-       (Keybindings): Reformat as needed with `key' rather than `kbd'.
-       (Keybindings, Miscellaneous, Mode Line): For small book format, start
-       section name on top of new page.
-       (Simple Extension): Replace longer expression with
-       `emacs-major-version'.  Remove comment about `number-to-string'
-       function.
-       (Miscellaneous): Add filename option, `-H', to `grep' example
-       (debug, debug-on-entry):  Replace `GNU Emacs 22' with `a recent
-       GNU Emacs'.
-       (edebug): More properly state where to place point for 'M-x
-       edebug-defun'.
-
-       * emacs-lisp-intro.texi: More minor changes.
-       Center images for TeX output.
-       (kill-new function):  Remove indentation for sentence talking about
-       momentarily skipping code.
-       (cons & search-fwd Review):  Document @code{funcall}.  Document
-       @code{re-search-forward} with existing @code{search-forward}.
-       Reference chapter on regular expression searches.
-       (Recursion with list): Specify a more recent version as being Emacs.
-       (Recursion with list, Every, recursive-graph-body-print):  Change
-       `if ... progn' expression to `when'.
-       (Recursive triangle function): For printing in small book, ensure
-       section name is not last on bottom of preceding page.
-       (Keep): Remove extraneous space in function definition example.
-       (sentence-end): Specify `in English' for glyphs that end a sentence.
-       Note that in GNU Emacs 22, the name refers to both a variable and a
-       function.
-       (fwd-sentence while loops): Write a function as one, not as a form
-       (fwd-para let): Add `which' to sentence with `parstart' and `parsep'.
-       (etags): Move sentences involving `find-tag' and sources.  State
-       location of Emacs `src' directory.
-       (Design count-words-region):  Better explain two backslashes in a row.
-       (Find a File): Fix grammar; add a `to' and write `to visit'.  Change
-       `named' to `selected'.
-       (lengths-list-file): Remove extraneous parenthesis from reference.
-       (lengths-list-many-files): Explain `expand-file-name' better.
-       (Files List): Rephrase sentence regarding Lisp sources directory
-
-2006-11-04  Robert J. Chassell  <bob@rattlesnake.com>
-
-       * emacs-lisp-intro.texi: Replace 22.0.100 with 22.1.100.
-       (defcustom): Note that the value set by defconst is a variable.
-       (Buffer Size & Locations): Parenthetical remark about evaluation.
-       (Finding More): Change text to include C sources by inference.
-
-       * emacs-lisp-intro.texi: Minor fixes.
-       Replace all tabs with eight spaces each so printed text looks correct.
-       Remove extraneous comma in a printed node name produced by `ref'.
-       (insert-buffer): Add a missing beginning parenthesis.
-       (beginning-of-buffer): Add `beginning of' to note about accessible
-       portion.
-       (narrow Exercise): Write closing parenthesis at end of correct
-       paragraph.
-       (zap-to-char): Remove extraneous `a' from first sentence.
-       (Complete zap-to-char): Remove two extraneous sentences.
-       (zap-to-char body): Move sentences on documentation two nodes earlier.
-       (Lisp macro): Add definition of `unless' macro.
-       (last-command & this-command): Remove comment that `we have not yet
-       seen' the @code{eq} function.
-       (kill-append function): Reformat `kill-append' function definition so
-       it prints well.
-       (kill-new function): Indent the sentence beginning `notice'.  Replace
-       `the same as' with `similar to'.  Repair typo.  Remove obsolete
-       references to `yank' and `yank-pop.  End section with a note that `we
-       will digress into C.'
-
-2006-11-02  Robert J. Chassell  <bob@rattlesnake.com>
-
-       * emacs-lisp-intro.texi (kill-ring-yank-pointer): Revert addition
-       of extraneous quotation mark to rotate-yank-pointer.
-
-2006-11-01  Juri Linkov  <juri@jurta.org>
-
-       * emacs-lisp-intro.texi: Fix unbalanced quotes.
-
-2006-10-31  Robert J. Chassell  <bob@rattlesnake.com>
-
-       * emacs-lisp-intro.texi: Revised text for kill-region,
-       copy-region-as-kill, kill-append, kill-new, forward-sentence,
-       forward-paragraph, find-file, current-kill, yank, and yank-pop.
-       Removed INSTALL MANIFEST from the directory since those files are
-       now irrelevant.  Updated Info file in ../info.  Changed numbering
-       so is now Revised Third Edition and this instance's edition-number
-       is 3.00.  Did not update ISBN number.
-
-       * emacs-lisp-intro.texi: Remove version reference for X colors.
-       Document `='.  Remove mention that :eval was new in 21. Updated
-       instance's edition-number to 3.01.
-
-2006-10-30  Robert J. Chassell  <bob@rattlesnake.com>
-
-       * emacs-lisp-intro.texi:  Many changes since it turned out that
-       many `simple' functions were rewritten.  Changes to the text
-       regarding zap-to-char, mark-whole-buffer, append-to-buffer,
-       copy-to-buffer, beginning-of-buffer, what-line, and possibly
-       others.  (I have not reviewed all yet.)  This instance does build
-       for Info and TeX.
-
-2006-10-29  Chong Yidong  <cyd@stupidchicken.com>
-
-       * Makefile.in: Use relative paths to avoid advertising filesystem
-       contents during compilation.
-
-2006-08-21  Robert J. Chassell  <bob@rattlesnake.com>
-
-       * emacs-lisp-intro.texi: deleted in directory copy of texinfo.tex
-         and pointed towards ../man/texinfo.tex so only one file
-         needs updating.  Added comment of what to do when building on own.
-
-       * texinfo.tex: changed to version 2006-02-13.16
-         to enable a DVI build using the more recent versions of TeX.
-
-2006-05-25  David Kastrup  <dak@gnu.org>
-
-       * emacs-lisp-intro.texi (setcar): replace an antelope rather than
-       a giraffe with a hippopotamus.
-
-2006-05-19  Thien-Thi Nguyen  <ttn@gnu.org>
-
-       * emacs-lisp-intro.texi (Digression concerning error): Fix typo.
-
-2005-09-16  Romain Francoise  <romain@orebokech.com>
-
-       * emacs-lisp-intro.texi (GNU Free Documentation License):
-       Specify GFDL version 1.2.
-
-2005-07-30  Eli Zaretskii  <eliz@gnu.org>
-
-       * makefile.w32-in (info): Don't run install-info.
-       ($(infodir)/dir): New target, produced by running install-info.
-
-2005-07-04  Lute Kamstra  <lute@gnu.org>
-
-       Update FSF's address in GPL notices.
-
-       * emacs-lisp-intro.texi: Update FSF's address.
-
-2004-04-23  Juanma Barranquero  <lektu@terra.es>
-
-       * makefile.w32-in: Add "-*- makefile -*-" mode tag.
-
-2004-02-29  Juanma Barranquero  <lektu@terra.es>
-
-       * makefile.w32-in (mostlyclean, clean, maintainer-clean): Use
-       $(DEL) instead of rm, and ignore exit code.
-
-2003-11-16  Kevin Ryde  <user42@zip.com.au>
-
-       * emacs-lisp-intro.texi: [CVS commitment by <bob@rattlesnake.com>]
-       Corrections to cross references,
-       (Interactive Options): elisp "interactive" -> "Using Interactive".
-       (defvar and asterisk): Remove emacs "Edit Options" reference,
-       edit-options is no longer described in the emacs manual.
-       (Lists diagrammed): elisp "List Type" -> "Cons Cell Type".
-
-2003-09-03  Peter Runestig  <peter@runestig.com>
-
-       * makefile.w32-in: New file.
-
-2001-11-29  Eli Zaretskii  <eliz@is.elta.co.il>
-
-       * emacs-lisp-intro.texi (Index): @ignore extraneous text.
-       Use @dircategory and @direntry to define the DIR entry.
-
-2001-11-25  Robert J. Chassell  <bob@rattlesnake.com>
-
-       * emacs-lisp-intro.texi: Move @contents to the beginning of the
-       file.  Set the size to @smallbook.
-
-2001-11-24  Eli Zaretskii  <eliz@is.elta.co.il>
-
-       * Makefile.in: New file.
-
-       * README: Update.
-
-       * *.eps: Rename to avoid clashes in DOS 8+3 namespace.
-
-;; Local Variables:
-;; coding: iso-2022-7bit
-;; add-log-time-zone-rule: t
-;; End:
-
-    Copyright (C) 2001, 2002, 2003, 2004, 2005,
-       2006, 2007 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, 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; see the file COPYING.  If not, write to the
-  Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-  Boston, MA 02110-1301, USA.
-
-;;; arch-tag: ee4f8e1f-e14c-4d2e-86de-4dd697e6f1c3
diff --git a/lispintro/Makefile.am b/lispintro/Makefile.am
deleted file mode 100644 (file)
index 1b89c55..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-AUTOMAKE_OPTIONS = foreign 1.2
-info_TEXINFOS = emacs-lisp-intro.texi
-EXTRA_DIST = INSTALL MANIFEST README drawers.eps  \
-       cons-1.eps cons-2.eps cons-2a.eps cons-3.eps    \
-       cons-4.eps cons-5.eps lambda-1.eps lambda-2.eps lambda-3.eps
-
-# arch-tag: 6a3e6d99-7aa2-479f-939c-5531165c5747
diff --git a/lispintro/Makefile.in b/lispintro/Makefile.in
deleted file mode 100644 (file)
index fc263c2..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-#### Makefile for the Emacs Lisp Introduction manual
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002,
-#   2003, 2004, 2005, 2006, 2007 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, 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; see the file COPYING.  If not, write to
-# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-# Boston, MA 02110-1301, USA.
-
-SHELL = @SHELL@
-
-srcdir = @srcdir@
-VPATH = @srcdir@
-
-infodir = ../info
-usermanualdir = $(srcdir)/../man
-
-INFO_SOURCES = ${srcdir}/emacs-lisp-intro.texi
-# The file name eintr must fit within 5 characters, to allow for
-# -NN extensions to fit into DOS 8+3 limits without clashing
-INFO_TARGETS = ${infodir}/eintr
-DVI_TARGETS = emacs-lisp-intro.dvi
-
-MAKEINFO = makeinfo
-TEXI2DVI = texi2dvi
-DVIPS = dvips
-
-.SUFFIXES: .dvi .ps .texi
-
-info: $(INFO_TARGETS)
-
-dvi: $(DVI_TARGETS)
-
-${infodir}/eintr: ${INFO_SOURCES}
-       cd $(srcdir); $(MAKEINFO) emacs-lisp-intro.texi -o $(infodir)/eintr
-
-emacs-lisp-intro.dvi: ${INFO_SOURCES}
-       $(TEXI2DVI) -I $(srcdir) -I $(usermanualdir) $(srcdir)/emacs-lisp-intro.texi
-
-emacs-lisp-intro.html: $(INFO_SOURCES)
-       $(MAKEINFO) --html -o $@ $(srcdir)/emacs-lisp-intro.texi
-
-.dvi.ps:
-       $(DVIPS) $< -o $@
-
-mostlyclean:
-       rm -f  *.log *.cp *.fn *.ky *.pg *.vr *.tp
-
-clean: mostlyclean
-       rm -f *.dvi
-
-distclean: clean
-
-maintainer-clean: distclean
-       rm -f *.aux *.cps *.fns *.kys *.pgs *.vrs *.toc
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/lispintro/Makefile.old b/lispintro/Makefile.old
deleted file mode 100644 (file)
index 0b4e1a8..0000000
+++ /dev/null
@@ -1,344 +0,0 @@
-# Makefile.in generated automatically by automake 1.4-p4 from Makefile.am
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002, 2003,
-#   2004, 2005, 2006, 2007  Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-
-SHELL = @SHELL@
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-
-bindir = @bindir@
-sbindir = @sbindir@
-libexecdir = @libexecdir@
-datadir = @datadir@
-sysconfdir = @sysconfdir@
-sharedstatedir = @sharedstatedir@
-localstatedir = @localstatedir@
-libdir = @libdir@
-infodir = @infodir@
-mandir = @mandir@
-includedir = @includedir@
-oldincludedir = /usr/include
-
-DESTDIR =
-
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-
-top_builddir = .
-
-ACLOCAL = @ACLOCAL@
-AUTOCONF = @AUTOCONF@
-AUTOMAKE = @AUTOMAKE@
-AUTOHEADER = @AUTOHEADER@
-
-INSTALL = @INSTALL@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-transform = @program_transform_name@
-
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-MAKEINFO = @MAKEINFO@
-PACKAGE = @PACKAGE@
-VERSION = @VERSION@
-
-AUTOMAKE_OPTIONS = foreign 1.2
-info_TEXINFOS = emacs-lisp-intro.texi
-EXTRA_DIST = INSTALL MANIFEST README chest-of-drawers-diagram.eps      cons-cell-diagram1.eps cons-cell-diagram2.eps           cons-cell-diagram2a.eps cons-cell-diagram3.eps          cons-cell-diagram4.eps cons-cell-diagram5.eps           lambda-diagram1.eps lambda-diagram2.eps lambda-diagram3.eps
-
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_CLEAN_FILES =
-TEXI2DVI = texi2dvi
-INFO_DEPS = emacs-lisp-intro.info
-DVIS = emacs-lisp-intro.dvi
-TEXINFOS = emacs-lisp-intro.texi
-DIST_COMMON =  README INSTALL Makefile.am Makefile.in aclocal.m4 \
-configure configure.in install-sh missing mkinstalldirs texinfo.tex
-
-
-DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
-
-TAR = tar
-GZIP_ENV = --best
-all: all-redirect
-.SUFFIXES:
-.SUFFIXES: .dvi .info .ps .texi .texinfo .txi
-$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
-       cd $(top_srcdir) && $(AUTOMAKE) --foreign --include-deps Makefile
-
-Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
-       cd $(top_builddir) \
-         && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
-
-$(ACLOCAL_M4):  configure.in
-       cd $(srcdir) && $(ACLOCAL)
-
-config.status: $(srcdir)/configure.in $(CONFIG_STATUS_DEPENDENCIES)
-       $(SHELL) ./config.status --recheck
-$(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
-       cd $(srcdir) && $(AUTOCONF)
-
-emacs-lisp-intro.info: emacs-lisp-intro.texi
-emacs-lisp-intro.dvi: emacs-lisp-intro.texi
-
-
-DVIPS = dvips
-
-.texi.info:
-       @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9]
-       cd $(srcdir) \
-         && $(MAKEINFO) `echo $< | sed 's,.*/,,'`
-
-.texi.dvi:
-       TEXINPUTS=.:$$TEXINPUTS \
-         MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $<
-
-.texi:
-       @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9]
-       cd $(srcdir) \
-         && $(MAKEINFO) `echo $< | sed 's,.*/,,'`
-
-.texinfo.info:
-       @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9]
-       cd $(srcdir) \
-         && $(MAKEINFO) `echo $< | sed 's,.*/,,'`
-
-.texinfo:
-       @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9]
-       cd $(srcdir) \
-         && $(MAKEINFO) `echo $< | sed 's,.*/,,'`
-
-.texinfo.dvi:
-       TEXINPUTS=.:$$TEXINPUTS \
-         MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $<
-
-.txi.info:
-       @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9]
-       cd $(srcdir) \
-         && $(MAKEINFO) `echo $< | sed 's,.*/,,'`
-
-.txi.dvi:
-       TEXINPUTS=.:$$TEXINPUTS \
-         MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $<
-
-.txi:
-       @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9]
-       cd $(srcdir) \
-         && $(MAKEINFO) `echo $< | sed 's,.*/,,'`
-.dvi.ps:
-       $(DVIPS) $< -o $@
-
-install-info-am: $(INFO_DEPS)
-       @$(NORMAL_INSTALL)
-       $(mkinstalldirs) $(DESTDIR)$(infodir)
-       @list='$(INFO_DEPS)'; \
-       for file in $$list; do \
-         d=$(srcdir); \
-         for ifile in `cd $$d && echo $$file $$file-[0-9] $$file-[0-9][0-9]`; do \
-           if test -f $$d/$$ifile; then \
-             echo " $(INSTALL_DATA) $$d/$$ifile $(DESTDIR)$(infodir)/$$ifile"; \
-             $(INSTALL_DATA) $$d/$$ifile $(DESTDIR)$(infodir)/$$ifile; \
-           else : ; fi; \
-         done; \
-       done
-       @$(POST_INSTALL)
-       @if $(SHELL) -c 'install-info --version | sed 1q | fgrep -s -v -i debian' >/dev/null 2>&1; then \
-         list='$(INFO_DEPS)'; \
-         for file in $$list; do \
-           echo " install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$file";\
-           install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$file || :;\
-         done; \
-       else : ; fi
-
-uninstall-info:
-       $(PRE_UNINSTALL)
-       @if $(SHELL) -c 'install-info --version | sed 1q | fgrep -s -v -i debian' >/dev/null 2>&1; then \
-         ii=yes; \
-       else ii=; fi; \
-       list='$(INFO_DEPS)'; \
-       for file in $$list; do \
-         test -z "$$ii" \
-           || install-info --info-dir=$(DESTDIR)$(infodir) --remove $$file; \
-       done
-       @$(NORMAL_UNINSTALL)
-       list='$(INFO_DEPS)'; \
-       for file in $$list; do \
-         (cd $(DESTDIR)$(infodir) && rm -f $$file $$file-[0-9] $$file-[0-9][0-9]); \
-       done
-
-dist-info: $(INFO_DEPS)
-       list='$(INFO_DEPS)'; \
-       for base in $$list; do \
-         d=$(srcdir); \
-         for file in `cd $$d && eval echo $$base*`; do \
-           test -f $(distdir)/$$file \
-           || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
-           || cp -p $$d/$$file $(distdir)/$$file; \
-         done; \
-       done
-
-mostlyclean-aminfo:
-       -rm -f emacs-lisp-intro.aux emacs-lisp-intro.cp emacs-lisp-intro.cps \
-         emacs-lisp-intro.dvi emacs-lisp-intro.fn emacs-lisp-intro.fns \
-         emacs-lisp-intro.ky emacs-lisp-intro.kys emacs-lisp-intro.ps \
-         emacs-lisp-intro.log emacs-lisp-intro.pg emacs-lisp-intro.toc \
-         emacs-lisp-intro.tp emacs-lisp-intro.tps emacs-lisp-intro.vr \
-         emacs-lisp-intro.vrs emacs-lisp-intro.op emacs-lisp-intro.tr \
-         emacs-lisp-intro.cv emacs-lisp-intro.cn
-
-clean-aminfo:
-
-distclean-aminfo:
-
-maintainer-clean-aminfo:
-       cd $(srcdir) && for i in $(INFO_DEPS); do \
-         rm -f $$i; \
-         if test "`echo $$i-[0-9]*`" != "$$i-[0-9]*"; then \
-           rm -f $$i-[0-9]*; \
-         fi; \
-       done
-tags: TAGS
-TAGS:
-
-
-distdir = $(PACKAGE)-$(VERSION)
-top_distdir = $(distdir)
-
-# This target untars the dist file and tries a VPATH configuration.  Then
-# it guarantees that the distribution is self-contained by making another
-# tarfile.
-distcheck: dist
-       -rm -rf $(distdir)
-       GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz
-       mkdir $(distdir)/=build
-       mkdir $(distdir)/=inst
-       dc_install_base=`cd $(distdir)/=inst && pwd`; \
-       cd $(distdir)/=build \
-         && ../configure --srcdir=.. --prefix=$$dc_install_base \
-         && $(MAKE) $(AM_MAKEFLAGS) \
-         && $(MAKE) $(AM_MAKEFLAGS) dvi \
-         && $(MAKE) $(AM_MAKEFLAGS) check \
-         && $(MAKE) $(AM_MAKEFLAGS) install \
-         && $(MAKE) $(AM_MAKEFLAGS) installcheck \
-         && $(MAKE) $(AM_MAKEFLAGS) dist
-       -rm -rf $(distdir)
-       @banner="$(distdir).tar.gz is ready for distribution"; \
-       dashes=`echo "$$banner" | sed s/./=/g`; \
-       echo "$$dashes"; \
-       echo "$$banner"; \
-       echo "$$dashes"
-dist: distdir
-       -chmod -R a+r $(distdir)
-       GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir)
-       -rm -rf $(distdir)
-dist-all: distdir
-       -chmod -R a+r $(distdir)
-       GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir)
-       -rm -rf $(distdir)
-distdir: $(DISTFILES)
-       -rm -rf $(distdir)
-       mkdir $(distdir)
-       -chmod 777 $(distdir)
-       @for file in $(DISTFILES); do \
-         d=$(srcdir); \
-         if test -d $$d/$$file; then \
-           cp -pr $$d/$$file $(distdir)/$$file; \
-         else \
-           test -f $(distdir)/$$file \
-           || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
-           || cp -p $$d/$$file $(distdir)/$$file || :; \
-         fi; \
-       done
-       $(MAKE) $(AM_MAKEFLAGS) top_distdir="$(top_distdir)" distdir="$(distdir)" dist-info
-info-am: $(INFO_DEPS)
-info: info-am
-dvi-am: $(DVIS)
-dvi: dvi-am
-check-am: all-am
-check: check-am
-installcheck-am:
-installcheck: installcheck-am
-install-exec-am:
-install-exec: install-exec-am
-
-install-data-am: install-info-am
-install-data: install-data-am
-
-install-am: all-am
-       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-install: install-am
-uninstall-am: uninstall-info
-uninstall: uninstall-am
-all-am: Makefile $(INFO_DEPS)
-all-redirect: all-am
-install-strip:
-       $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
-installdirs:
-       $(mkinstalldirs)  $(DESTDIR)$(infodir)
-
-
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-       -rm -f Makefile $(CONFIG_CLEAN_FILES)
-       -rm -f config.cache config.log stamp-h stamp-h[0-9]*
-
-maintainer-clean-generic:
-mostlyclean-am:  mostlyclean-aminfo mostlyclean-generic
-
-mostlyclean: mostlyclean-am
-
-clean-am:  clean-aminfo clean-generic mostlyclean-am
-
-clean: clean-am
-
-distclean-am:  distclean-aminfo distclean-generic clean-am
-
-distclean: distclean-am
-       -rm -f config.status
-
-maintainer-clean-am:  maintainer-clean-aminfo maintainer-clean-generic \
-               distclean-am
-       @echo "This command is intended for maintainers to use;"
-       @echo "it deletes files that may require special tools to rebuild."
-
-maintainer-clean: maintainer-clean-am
-       -rm -f config.status
-
-.PHONY: install-info-am uninstall-info mostlyclean-aminfo \
-distclean-aminfo clean-aminfo maintainer-clean-aminfo tags distdir \
-info-am info dvi-am dvi check check-am installcheck-am installcheck \
-install-exec-am install-exec install-data-am install-data install-am \
-install uninstall-am uninstall all-redirect all-am all installdirs \
-mostlyclean-generic distclean-generic clean-generic \
-maintainer-clean-generic clean mostlyclean distclean maintainer-clean
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
-
-# arch-tag: f1a44ea0-b792-4ac7-be28-9626b972c216
diff --git a/lispintro/README b/lispintro/README
deleted file mode 100644 (file)
index 5edd38a..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007
-  Free Software Foundation, Inc.
-See the end of the file for license conditions.
-
-
-This directory contains the source of the "Introduction to Programming
-in Emacs Lisp" written by Robert J. Chassell, bob@gnu.org.  This
-manual is an elementary introduction to programming in Emacs Lisp for
-people who are not programmers, and who are not necessarily interested
-in programming, but who do want to customize or extend their computing
-environment.
-
-This third edition of 2006 Oct 31 updates the previous editions to GNU
-Emacs 22.
-
-The Texinfo source file `emacs-lisp-intro.texi', formats without
-reported error using `pdfeTeXk', Version 3.141592-1.21a-2.2 (Web2C
-7.5.4) and texinfo.tex version 2006-08-26.17 started by `texi2dvi'
-version 4.8, and with `makeinfo' version 4.8.
-
-Also, this tar file contains the following optional Encapsulated Post
-Script figures.
-
-    drawers.eps         7129 bytes
-    cons-1.eps          12136
-    cons-2.eps          12523
-    cons-2a.eps         12420
-    cons-3.eps          12984
-    cons-4.eps          13866
-    cons-5.eps          12986
-    lambda-1.eps        10252
-    lambda-2.eps        10278
-    lambda-3.eps        10275
-
-See the beginning of the `emacs-lisp-intro.texi' file for appropriate
-settings.  These figures are not necessary; they are merely nice to
-look at --- without them you get the same figures printed with ASCII
-characters.
-
-Whether and how you print PostScript depends on your site.  You not
-only need to set 'print-postscript-figures' before creating the .dvi
-file, but then must convert the .dvi file to .ps with a 'dvips' or
-equivalent command.
-
-On some systems you will see an error message when `psfig.tex' is
-loaded for the last two .eps files:
-
-            ! No room for a new \write .
-
-If this happens, try `epsf.tex' instead of `psfig.tex', or try typing
-RET at the error; the formatting may continue successfully.
-
-Or else find the section that says:
-
- @c !!! Clear print-postscript-figures if the computer formatting this
- @c     document is too small and cannot handle all the diagrams and figures.
- @c clear print-postscript-figures
-
-and change the file so it reads:   @clear print-postscript-figures
-This will prevent TeX from attempting to load the last few .eps files.
-
-You will find additional instructions on formatting in the beginning
-of the Texinfo file 'emacs-lisp-intro.texi'.  Best Wishes!
-
-2006 Oct 31
-Robert J. Chassell, bob@gnu.org
-
-\f
-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, 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; see the file COPYING.  If not, write to the
-Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-Boston, MA 02110-1301, USA.
diff --git a/lispintro/aclocal.m4 b/lispintro/aclocal.m4
deleted file mode 100644 (file)
index fdc191a..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-dnl aclocal.m4 generated automatically by aclocal 1.4-p4
-
-dnl Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002, 2003,
-dnl   2004, 2005, 2006, 2007  Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-dnl This program is distributed in the hope that it will be useful,
-dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-dnl PARTICULAR PURPOSE.
-
-# Do all the work for Automake.  This macro actually does too much --
-# some checks are only needed if your package does certain things.
-# But this isn't really a big deal.
-
-# serial 1
-
-dnl Usage:
-dnl AM_INIT_AUTOMAKE(package,version, [no-define])
-
-AC_DEFUN(AM_INIT_AUTOMAKE,
-[AC_REQUIRE([AC_PROG_INSTALL])
-PACKAGE=[$1]
-AC_SUBST(PACKAGE)
-VERSION=[$2]
-AC_SUBST(VERSION)
-dnl test to see if srcdir already configured
-if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
-  AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
-fi
-ifelse([$3],,
-AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
-AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package]))
-AC_REQUIRE([AM_SANITY_CHECK])
-AC_REQUIRE([AC_ARG_PROGRAM])
-dnl FIXME This is truly gross.
-missing_dir=`cd $ac_aux_dir && pwd`
-AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir)
-AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir)
-AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir)
-AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir)
-AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir)
-AC_REQUIRE([AC_PROG_MAKE_SET])])
-
-#
-# Check to make sure that the build environment is sane.
-#
-
-AC_DEFUN(AM_SANITY_CHECK,
-[AC_MSG_CHECKING([whether build environment is sane])
-# Just in case
-sleep 1
-echo timestamp > conftestfile
-# Do `set' in a subshell so we don't clobber the current shell's
-# arguments.  Must try -L first in case configure is actually a
-# symlink; some systems play weird games with the mod time of symlinks
-# (eg FreeBSD returns the mod time of the symlink's containing
-# directory).
-if (
-   set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
-   if test "[$]*" = "X"; then
-      # -L didn't work.
-      set X `ls -t $srcdir/configure conftestfile`
-   fi
-   if test "[$]*" != "X $srcdir/configure conftestfile" \
-      && test "[$]*" != "X conftestfile $srcdir/configure"; then
-
-      # If neither matched, then we have a broken ls.  This can happen
-      # if, for instance, CONFIG_SHELL is bash and it inherits a
-      # broken ls alias from the environment.  This has actually
-      # happened.  Such a system could not be considered "sane".
-      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
-alias in your environment])
-   fi
-
-   test "[$]2" = conftestfile
-   )
-then
-   # Ok.
-   :
-else
-   AC_MSG_ERROR([newly created file is older than distributed files!
-Check your system clock])
-fi
-rm -f conftest*
-AC_MSG_RESULT(yes)])
-
-dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY)
-dnl The program must properly implement --version.
-AC_DEFUN(AM_MISSING_PROG,
-[AC_MSG_CHECKING(for working $2)
-# Run test in a subshell; some versions of sh will print an error if
-# an executable is not found, even if stderr is redirected.
-# Redirect stdin to placate older versions of autoconf.  Sigh.
-if ($2 --version) < /dev/null > /dev/null 2>&1; then
-   $1=$2
-   AC_MSG_RESULT(found)
-else
-   $1="$3/missing $2"
-   AC_MSG_RESULT(missing)
-fi
-AC_SUBST($1)])
-
diff --git a/lispintro/configure b/lispintro/configure
deleted file mode 100644 (file)
index 626083b..0000000
+++ /dev/null
@@ -1,1044 +0,0 @@
-#! /bin/sh
-
-# Guess values for system-dependent variables and create Makefiles.
-# Generated automatically using autoconf version 2.13
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 2001, 2002, 2003, 2004,
-#   2005, 2006, 2007 Free Software Foundation, Inc.
-#
-# This configure script is free software; the Free Software Foundation
-# gives unlimited permission to copy, distribute and modify it.
-
-# Defaults:
-ac_help=
-ac_default_prefix=/usr/local
-# Any additions from configure.in:
-
-# Initialize some variables set by options.
-# The variables have the same names as the options, with
-# dashes changed to underlines.
-build=NONE
-cache_file=./config.cache
-exec_prefix=NONE
-host=NONE
-no_create=
-nonopt=NONE
-no_recursion=
-prefix=NONE
-program_prefix=NONE
-program_suffix=NONE
-program_transform_name=s,x,x,
-silent=
-site=
-srcdir=
-target=NONE
-verbose=
-x_includes=NONE
-x_libraries=NONE
-bindir='${exec_prefix}/bin'
-sbindir='${exec_prefix}/sbin'
-libexecdir='${exec_prefix}/libexec'
-datadir='${prefix}/share'
-sysconfdir='${prefix}/etc'
-sharedstatedir='${prefix}/com'
-localstatedir='${prefix}/var'
-libdir='${exec_prefix}/lib'
-includedir='${prefix}/include'
-oldincludedir='/usr/include'
-infodir='${prefix}/info'
-mandir='${prefix}/man'
-
-# Initialize some other variables.
-subdirs=
-MFLAGS= MAKEFLAGS=
-SHELL=${CONFIG_SHELL-/bin/sh}
-# Maximum number of lines to put in a shell here document.
-ac_max_here_lines=12
-
-ac_prev=
-for ac_option
-do
-
-  # If the previous option needs an argument, assign it.
-  if test -n "$ac_prev"; then
-    eval "$ac_prev=\$ac_option"
-    ac_prev=
-    continue
-  fi
-
-  case "$ac_option" in
-  -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
-  *) ac_optarg= ;;
-  esac
-
-  # Accept the important Cygnus configure options, so we can diagnose typos.
-
-  case "$ac_option" in
-
-  -bindir | --bindir | --bindi | --bind | --bin | --bi)
-    ac_prev=bindir ;;
-  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
-    bindir="$ac_optarg" ;;
-
-  -build | --build | --buil | --bui | --bu)
-    ac_prev=build ;;
-  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
-    build="$ac_optarg" ;;
-
-  -cache-file | --cache-file | --cache-fil | --cache-fi \
-  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
-    ac_prev=cache_file ;;
-  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
-  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
-    cache_file="$ac_optarg" ;;
-
-  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
-    ac_prev=datadir ;;
-  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
-  | --da=*)
-    datadir="$ac_optarg" ;;
-
-  -disable-* | --disable-*)
-    ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
-    # Reject names that are not valid shell variable names.
-    if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
-      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
-    fi
-    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
-    eval "enable_${ac_feature}=no" ;;
-
-  -enable-* | --enable-*)
-    ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
-    # Reject names that are not valid shell variable names.
-    if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
-      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
-    fi
-    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
-    case "$ac_option" in
-      *=*) ;;
-      *) ac_optarg=yes ;;
-    esac
-    eval "enable_${ac_feature}='$ac_optarg'" ;;
-
-  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
-  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
-  | --exec | --exe | --ex)
-    ac_prev=exec_prefix ;;
-  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
-  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
-  | --exec=* | --exe=* | --ex=*)
-    exec_prefix="$ac_optarg" ;;
-
-  -gas | --gas | --ga | --g)
-    # Obsolete; use --with-gas.
-    with_gas=yes ;;
-
-  -help | --help | --hel | --he)
-    # Omit some internal or obsolete options to make the list less imposing.
-    # This message is too long to be a string in the A/UX 3.1 sh.
-    cat << EOF
-Usage: configure [options] [host]
-Options: [defaults in brackets after descriptions]
-Configuration:
-  --cache-file=FILE       cache test results in FILE
-  --help                  print this message
-  --no-create             do not create output files
-  --quiet, --silent       do not print \`checking...' messages
-  --version               print the version of autoconf that created configure
-Directory and file names:
-  --prefix=PREFIX         install architecture-independent files in PREFIX
-                          [$ac_default_prefix]
-  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
-                          [same as prefix]
-  --bindir=DIR            user executables in DIR [EPREFIX/bin]
-  --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]
-  --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]
-  --datadir=DIR           read-only architecture-independent data in DIR
-                          [PREFIX/share]
-  --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]
-  --sharedstatedir=DIR    modifiable architecture-independent data in DIR
-                          [PREFIX/com]
-  --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]
-  --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
-  --includedir=DIR        C header files in DIR [PREFIX/include]
-  --oldincludedir=DIR     C header files for non-gcc in DIR [/usr/include]
-  --infodir=DIR           info documentation in DIR [PREFIX/info]
-  --mandir=DIR            man documentation in DIR [PREFIX/man]
-  --srcdir=DIR            find the sources in DIR [configure dir or ..]
-  --program-prefix=PREFIX prepend PREFIX to installed program names
-  --program-suffix=SUFFIX append SUFFIX to installed program names
-  --program-transform-name=PROGRAM
-                          run sed PROGRAM on installed program names
-EOF
-    cat << EOF
-Host type:
-  --build=BUILD           configure for building on BUILD [BUILD=HOST]
-  --host=HOST             configure for HOST [guessed]
-  --target=TARGET         configure for TARGET [TARGET=HOST]
-Features and packages:
-  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
-  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
-  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
-  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
-  --x-includes=DIR        X include files are in DIR
-  --x-libraries=DIR       X library files are in DIR
-EOF
-    if test -n "$ac_help"; then
-      echo "--enable and --with options recognized:$ac_help"
-    fi
-    exit 0 ;;
-
-  -host | --host | --hos | --ho)
-    ac_prev=host ;;
-  -host=* | --host=* | --hos=* | --ho=*)
-    host="$ac_optarg" ;;
-
-  -includedir | --includedir | --includedi | --included | --include \
-  | --includ | --inclu | --incl | --inc)
-    ac_prev=includedir ;;
-  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
-  | --includ=* | --inclu=* | --incl=* | --inc=*)
-    includedir="$ac_optarg" ;;
-
-  -infodir | --infodir | --infodi | --infod | --info | --inf)
-    ac_prev=infodir ;;
-  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
-    infodir="$ac_optarg" ;;
-
-  -libdir | --libdir | --libdi | --libd)
-    ac_prev=libdir ;;
-  -libdir=* | --libdir=* | --libdi=* | --libd=*)
-    libdir="$ac_optarg" ;;
-
-  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
-  | --libexe | --libex | --libe)
-    ac_prev=libexecdir ;;
-  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
-  | --libexe=* | --libex=* | --libe=*)
-    libexecdir="$ac_optarg" ;;
-
-  -localstatedir | --localstatedir | --localstatedi | --localstated \
-  | --localstate | --localstat | --localsta | --localst \
-  | --locals | --local | --loca | --loc | --lo)
-    ac_prev=localstatedir ;;
-  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
-  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
-  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
-    localstatedir="$ac_optarg" ;;
-
-  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
-    ac_prev=mandir ;;
-  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
-    mandir="$ac_optarg" ;;
-
-  -nfp | --nfp | --nf)
-    # Obsolete; use --without-fp.
-    with_fp=no ;;
-
-  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
-  | --no-cr | --no-c)
-    no_create=yes ;;
-
-  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
-  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
-    no_recursion=yes ;;
-
-  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
-  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
-  | --oldin | --oldi | --old | --ol | --o)
-    ac_prev=oldincludedir ;;
-  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
-  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
-  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
-    oldincludedir="$ac_optarg" ;;
-
-  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
-    ac_prev=prefix ;;
-  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
-    prefix="$ac_optarg" ;;
-
-  -program-prefix | --program-prefix | --program-prefi | --program-pref \
-  | --program-pre | --program-pr | --program-p)
-    ac_prev=program_prefix ;;
-  -program-prefix=* | --program-prefix=* | --program-prefi=* \
-  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
-    program_prefix="$ac_optarg" ;;
-
-  -program-suffix | --program-suffix | --program-suffi | --program-suff \
-  | --program-suf | --program-su | --program-s)
-    ac_prev=program_suffix ;;
-  -program-suffix=* | --program-suffix=* | --program-suffi=* \
-  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
-    program_suffix="$ac_optarg" ;;
-
-  -program-transform-name | --program-transform-name \
-  | --program-transform-nam | --program-transform-na \
-  | --program-transform-n | --program-transform- \
-  | --program-transform | --program-transfor \
-  | --program-transfo | --program-transf \
-  | --program-trans | --program-tran \
-  | --progr-tra | --program-tr | --program-t)
-    ac_prev=program_transform_name ;;
-  -program-transform-name=* | --program-transform-name=* \
-  | --program-transform-nam=* | --program-transform-na=* \
-  | --program-transform-n=* | --program-transform-=* \
-  | --program-transform=* | --program-transfor=* \
-  | --program-transfo=* | --program-transf=* \
-  | --program-trans=* | --program-tran=* \
-  | --progr-tra=* | --program-tr=* | --program-t=*)
-    program_transform_name="$ac_optarg" ;;
-
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil)
-    silent=yes ;;
-
-  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
-    ac_prev=sbindir ;;
-  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
-  | --sbi=* | --sb=*)
-    sbindir="$ac_optarg" ;;
-
-  -sharedstatedir | --sharedstatedir | --sharedstatedi \
-  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
-  | --sharedst | --shareds | --shared | --share | --shar \
-  | --sha | --sh)
-    ac_prev=sharedstatedir ;;
-  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
-  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
-  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
-  | --sha=* | --sh=*)
-    sharedstatedir="$ac_optarg" ;;
-
-  -site | --site | --sit)
-    ac_prev=site ;;
-  -site=* | --site=* | --sit=*)
-    site="$ac_optarg" ;;
-
-  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
-    ac_prev=srcdir ;;
-  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
-    srcdir="$ac_optarg" ;;
-
-  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
-  | --syscon | --sysco | --sysc | --sys | --sy)
-    ac_prev=sysconfdir ;;
-  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
-  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
-    sysconfdir="$ac_optarg" ;;
-
-  -target | --target | --targe | --targ | --tar | --ta | --t)
-    ac_prev=target ;;
-  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
-    target="$ac_optarg" ;;
-
-  -v | -verbose | --verbose | --verbos | --verbo | --verb)
-    verbose=yes ;;
-
-  -version | --version | --versio | --versi | --vers)
-    echo "configure generated by autoconf version 2.13"
-    exit 0 ;;
-
-  -with-* | --with-*)
-    ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
-    # Reject names that are not valid shell variable names.
-    if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
-      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
-    fi
-    ac_package=`echo $ac_package| sed 's/-/_/g'`
-    case "$ac_option" in
-      *=*) ;;
-      *) ac_optarg=yes ;;
-    esac
-    eval "with_${ac_package}='$ac_optarg'" ;;
-
-  -without-* | --without-*)
-    ac_package=`echo $ac_option|sed -e 's/-*without-//'`
-    # Reject names that are not valid shell variable names.
-    if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
-      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
-    fi
-    ac_package=`echo $ac_package| sed 's/-/_/g'`
-    eval "with_${ac_package}=no" ;;
-
-  --x)
-    # Obsolete; use --with-x.
-    with_x=yes ;;
-
-  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
-  | --x-incl | --x-inc | --x-in | --x-i)
-    ac_prev=x_includes ;;
-  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
-  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
-    x_includes="$ac_optarg" ;;
-
-  -x-libraries | --x-libraries | --x-librarie | --x-librari \
-  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
-    ac_prev=x_libraries ;;
-  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
-  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
-    x_libraries="$ac_optarg" ;;
-
-  -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
-    ;;
-
-  *)
-    if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
-      echo "configure: warning: $ac_option: invalid host type" 1>&2
-    fi
-    if test "x$nonopt" != xNONE; then
-      { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
-    fi
-    nonopt="$ac_option"
-    ;;
-
-  esac
-done
-
-if test -n "$ac_prev"; then
-  { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
-fi
-
-trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
-
-# File descriptor usage:
-# 0 standard input
-# 1 file creation
-# 2 errors and warnings
-# 3 some systems may open it to /dev/tty
-# 4 used on the Kubota Titan
-# 6 checking for... messages and results
-# 5 compiler messages saved in config.log
-if test "$silent" = yes; then
-  exec 6>/dev/null
-else
-  exec 6>&1
-fi
-exec 5>./config.log
-
-echo "\
-This file contains any messages produced by compilers while
-running configure, to aid debugging if configure makes a mistake.
-" 1>&5
-
-# Strip out --no-create and --no-recursion so they do not pile up.
-# Also quote any args containing shell metacharacters.
-ac_configure_args=
-for ac_arg
-do
-  case "$ac_arg" in
-  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
-  | --no-cr | --no-c) ;;
-  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
-  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
-  *" "*|*"     "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
-  ac_configure_args="$ac_configure_args '$ac_arg'" ;;
-  *) ac_configure_args="$ac_configure_args $ac_arg" ;;
-  esac
-done
-
-# NLS nuisances.
-# Only set these to C if already set.  These must not be set unconditionally
-# because not all systems understand e.g. LANG=C (notably SCO).
-# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
-# Non-C LC_CTYPE values break the ctype check.
-if test "${LANG+set}"   = set; then LANG=C;   export LANG;   fi
-if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
-if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
-if test "${LC_CTYPE+set}"    = set; then LC_CTYPE=C;    export LC_CTYPE;    fi
-
-# confdefs.h avoids OS command line length limits that DEFS can exceed.
-rm -rf conftest* confdefs.h
-# AIX cpp loses on an empty file, so make sure it contains at least a newline.
-echo > confdefs.h
-
-# A filename unique to this package, relative to the directory that
-# configure is in, which we can look for to find out if srcdir is correct.
-ac_unique_file=emacs-lisp-intro.texi
-
-# Find the source files, if location was not specified.
-if test -z "$srcdir"; then
-  ac_srcdir_defaulted=yes
-  # Try the directory containing this script, then its parent.
-  ac_prog=$0
-  ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
-  test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
-  srcdir=$ac_confdir
-  if test ! -r $srcdir/$ac_unique_file; then
-    srcdir=..
-  fi
-else
-  ac_srcdir_defaulted=no
-fi
-if test ! -r $srcdir/$ac_unique_file; then
-  if test "$ac_srcdir_defaulted" = yes; then
-    { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
-  else
-    { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
-  fi
-fi
-srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
-
-# Prefer explicitly selected file to automatically selected ones.
-if test -z "$CONFIG_SITE"; then
-  if test "x$prefix" != xNONE; then
-    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
-  else
-    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
-  fi
-fi
-for ac_site_file in $CONFIG_SITE; do
-  if test -r "$ac_site_file"; then
-    echo "loading site script $ac_site_file"
-    . "$ac_site_file"
-  fi
-done
-
-if test -r "$cache_file"; then
-  echo "loading cache $cache_file"
-  . $cache_file
-else
-  echo "creating cache $cache_file"
-  > $cache_file
-fi
-
-ac_ext=c
-# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
-ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
-cross_compiling=$ac_cv_prog_cc_cross
-
-ac_exeext=
-ac_objext=o
-if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
-  # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
-  if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
-    ac_n= ac_c='
-' ac_t='       '
-  else
-    ac_n=-n ac_c= ac_t=
-  fi
-else
-  ac_n= ac_c='\c' ac_t=
-fi
-
-
-ac_aux_dir=
-for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
-  if test -f $ac_dir/install-sh; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/install-sh -c"
-    break
-  elif test -f $ac_dir/install.sh; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/install.sh -c"
-    break
-  fi
-done
-if test -z "$ac_aux_dir"; then
-  { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
-fi
-ac_config_guess=$ac_aux_dir/config.guess
-ac_config_sub=$ac_aux_dir/config.sub
-ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
-
-# Find a good install program.  We prefer a C program (faster),
-# so one script is as good as another.  But avoid the broken or
-# incompatible versions:
-# SysV /etc/install, /usr/sbin/install
-# SunOS /usr/etc/install
-# IRIX /sbin/install
-# AIX /bin/install
-# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
-# AFS /usr/afsws/bin/install, which mishandles nonexistent args
-# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
-# ./install, which can be erroneously created by make from ./install.sh.
-echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:556: checking for a BSD compatible install" >&5
-if test -z "$INSTALL"; then
-if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-    IFS="${IFS=        }"; ac_save_IFS="$IFS"; IFS=":"
-  for ac_dir in $PATH; do
-    # Account for people who put trailing slashes in PATH elements.
-    case "$ac_dir/" in
-    /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
-    *)
-      # OSF1 and SCO ODT 3.0 have their own names for install.
-      # Don't use installbsd from OSF since it installs stuff as root
-      # by default.
-      for ac_prog in ginstall scoinst install; do
-        if test -f $ac_dir/$ac_prog; then
-         if test $ac_prog = install &&
-            grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
-           # AIX install.  It has an incompatible calling convention.
-           :
-         else
-           ac_cv_path_install="$ac_dir/$ac_prog -c"
-           break 2
-         fi
-       fi
-      done
-      ;;
-    esac
-  done
-  IFS="$ac_save_IFS"
-
-fi
-  if test "${ac_cv_path_install+set}" = set; then
-    INSTALL="$ac_cv_path_install"
-  else
-    # As a last resort, use the slow shell script.  We don't cache a
-    # path for INSTALL within a source directory, because that will
-    # break other packages using the cache if that directory is
-    # removed, or if the path is relative.
-    INSTALL="$ac_install_sh"
-  fi
-fi
-echo "$ac_t""$INSTALL" 1>&6
-
-# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
-# It thinks the first close brace ends the variable substitution.
-test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
-
-test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
-
-test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
-
-echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6
-echo "configure:609: checking whether build environment is sane" >&5
-# Just in case
-sleep 1
-echo timestamp > conftestfile
-# Do `set' in a subshell so we don't clobber the current shell's
-# arguments.  Must try -L first in case configure is actually a
-# symlink; some systems play weird games with the mod time of symlinks
-# (eg FreeBSD returns the mod time of the symlink's containing
-# directory).
-if (
-   set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
-   if test "$*" = "X"; then
-      # -L didn't work.
-      set X `ls -t $srcdir/configure conftestfile`
-   fi
-   if test "$*" != "X $srcdir/configure conftestfile" \
-      && test "$*" != "X conftestfile $srcdir/configure"; then
-
-      # If neither matched, then we have a broken ls.  This can happen
-      # if, for instance, CONFIG_SHELL is bash and it inherits a
-      # broken ls alias from the environment.  This has actually
-      # happened.  Such a system could not be considered "sane".
-      { echo "configure: error: ls -t appears to fail.  Make sure there is not a broken
-alias in your environment" 1>&2; exit 1; }
-   fi
-
-   test "$2" = conftestfile
-   )
-then
-   # Ok.
-   :
-else
-   { echo "configure: error: newly created file is older than distributed files!
-Check your system clock" 1>&2; exit 1; }
-fi
-rm -f conftest*
-echo "$ac_t""yes" 1>&6
-if test "$program_transform_name" = s,x,x,; then
-  program_transform_name=
-else
-  # Double any \ or $.  echo might interpret backslashes.
-  cat <<\EOF_SED > conftestsed
-s,\\,\\\\,g; s,\$,$$,g
-EOF_SED
-  program_transform_name="`echo $program_transform_name|sed -f conftestsed`"
-  rm -f conftestsed
-fi
-test "$program_prefix" != NONE &&
-  program_transform_name="s,^,${program_prefix},; $program_transform_name"
-# Use a double $ so make ignores it.
-test "$program_suffix" != NONE &&
-  program_transform_name="s,\$\$,${program_suffix},; $program_transform_name"
-
-# sed with no file args requires a program.
-test "$program_transform_name" = "" && program_transform_name="s,x,x,"
-
-echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
-echo "configure:666: checking whether ${MAKE-make} sets \${MAKE}" >&5
-set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftestmake <<\EOF
-all:
-       @echo 'ac_maketemp="${MAKE}"'
-EOF
-# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
-eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
-if test -n "$ac_maketemp"; then
-  eval ac_cv_prog_make_${ac_make}_set=yes
-else
-  eval ac_cv_prog_make_${ac_make}_set=no
-fi
-rm -f conftestmake
-fi
-if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-  SET_MAKE=
-else
-  echo "$ac_t""no" 1>&6
-  SET_MAKE="MAKE=${MAKE-make}"
-fi
-
-
-PACKAGE=emacs-lisp-intro
-
-VERSION=2.00
-
-if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
-  { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; }
-fi
-cat >> confdefs.h <<EOF
-#define PACKAGE "$PACKAGE"
-EOF
-
-cat >> confdefs.h <<EOF
-#define VERSION "$VERSION"
-EOF
-
-
-
-missing_dir=`cd $ac_aux_dir && pwd`
-echo $ac_n "checking for working aclocal""... $ac_c" 1>&6
-echo "configure:712: checking for working aclocal" >&5
-# Run test in a subshell; some versions of sh will print an error if
-# an executable is not found, even if stderr is redirected.
-# Redirect stdin to placate older versions of autoconf.  Sigh.
-if (aclocal --version) < /dev/null > /dev/null 2>&1; then
-   ACLOCAL=aclocal
-   echo "$ac_t""found" 1>&6
-else
-   ACLOCAL="$missing_dir/missing aclocal"
-   echo "$ac_t""missing" 1>&6
-fi
-
-echo $ac_n "checking for working autoconf""... $ac_c" 1>&6
-echo "configure:725: checking for working autoconf" >&5
-# Run test in a subshell; some versions of sh will print an error if
-# an executable is not found, even if stderr is redirected.
-# Redirect stdin to placate older versions of autoconf.  Sigh.
-if (autoconf --version) < /dev/null > /dev/null 2>&1; then
-   AUTOCONF=autoconf
-   echo "$ac_t""found" 1>&6
-else
-   AUTOCONF="$missing_dir/missing autoconf"
-   echo "$ac_t""missing" 1>&6
-fi
-
-echo $ac_n "checking for working automake""... $ac_c" 1>&6
-echo "configure:738: checking for working automake" >&5
-# Run test in a subshell; some versions of sh will print an error if
-# an executable is not found, even if stderr is redirected.
-# Redirect stdin to placate older versions of autoconf.  Sigh.
-if (automake --version) < /dev/null > /dev/null 2>&1; then
-   AUTOMAKE=automake
-   echo "$ac_t""found" 1>&6
-else
-   AUTOMAKE="$missing_dir/missing automake"
-   echo "$ac_t""missing" 1>&6
-fi
-
-echo $ac_n "checking for working autoheader""... $ac_c" 1>&6
-echo "configure:751: checking for working autoheader" >&5
-# Run test in a subshell; some versions of sh will print an error if
-# an executable is not found, even if stderr is redirected.
-# Redirect stdin to placate older versions of autoconf.  Sigh.
-if (autoheader --version) < /dev/null > /dev/null 2>&1; then
-   AUTOHEADER=autoheader
-   echo "$ac_t""found" 1>&6
-else
-   AUTOHEADER="$missing_dir/missing autoheader"
-   echo "$ac_t""missing" 1>&6
-fi
-
-echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6
-echo "configure:764: checking for working makeinfo" >&5
-# Run test in a subshell; some versions of sh will print an error if
-# an executable is not found, even if stderr is redirected.
-# Redirect stdin to placate older versions of autoconf.  Sigh.
-if (makeinfo --version) < /dev/null > /dev/null 2>&1; then
-   MAKEINFO=makeinfo
-   echo "$ac_t""found" 1>&6
-else
-   MAKEINFO="$missing_dir/missing makeinfo"
-   echo "$ac_t""missing" 1>&6
-fi
-
-
-trap '' 1 2 15
-cat > confcache <<\EOF
-# This file is a shell script that caches the results of configure
-# tests run on this system so they can be shared between configure
-# scripts and configure runs.  It is not useful on other systems.
-# If it contains results you don't want to keep, you may remove or edit it.
-#
-# By default, configure uses ./config.cache as the cache file,
-# creating it if it does not exist already.  You can give configure
-# the --cache-file=FILE option to use a different cache file; that is
-# what configure does when it calls configure scripts in
-# subdirectories, so they share the cache.
-# Giving --cache-file=/dev/null disables caching, for debugging configure.
-# config.status only pays attention to the cache file if you give it the
-# --recheck option to rerun configure.
-#
-EOF
-# The following way of writing the cache mishandles newlines in values,
-# but we know of no workaround that is simple, portable, and efficient.
-# So, don't put newlines in cache variables' values.
-# Ultrix sh set writes to stderr and can't be redirected directly,
-# and sets the high bit in the cache file unless we assign to the vars.
-(set) 2>&1 |
-  case `(ac_space=' '; set | grep ac_space) 2>&1` in
-  *ac_space=\ *)
-    # `set' does not quote correctly, so add quotes (double-quote substitution
-    # turns \\\\ into \\, and sed turns \\ into \).
-    sed -n \
-      -e "s/'/'\\\\''/g" \
-      -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
-    ;;
-  *)
-    # `set' quotes correctly as required by POSIX, so do not add quotes.
-    sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
-    ;;
-  esac >> confcache
-if cmp -s $cache_file confcache; then
-  :
-else
-  if test -w $cache_file; then
-    echo "updating cache $cache_file"
-    cat confcache > $cache_file
-  else
-    echo "not updating unwritable cache $cache_file"
-  fi
-fi
-rm -f confcache
-
-trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
-
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-# Let make expand exec_prefix.
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
-# Any assignment to VPATH causes Sun make to only execute
-# the first set of double-colon rules, so remove it if not needed.
-# If there is a colon in the path, we need to keep it.
-if test "x$srcdir" = x.; then
-  ac_vpsub='/^[        ]*VPATH[        ]*=[^:]*$/d'
-fi
-
-trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
-
-# Transform confdefs.h into DEFS.
-# Protect against shell expansion while executing Makefile rules.
-# Protect against Makefile macro expansion.
-cat > conftest.defs <<\EOF
-s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
-s%[    `~#$^&*(){}\\|;'"<>?]%\\&%g
-s%\[%\\&%g
-s%\]%\\&%g
-s%\$%$$%g
-EOF
-DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
-rm -f conftest.defs
-
-
-# Without the "./", some shells look in PATH for config.status.
-: ${CONFIG_STATUS=./config.status}
-
-echo creating $CONFIG_STATUS
-rm -f $CONFIG_STATUS
-cat > $CONFIG_STATUS <<EOF
-#! /bin/sh
-# Generated automatically by configure.
-# Run this file to recreate the current configuration.
-# This directory was configured as follows,
-# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
-#
-# $0 $ac_configure_args
-#
-# Compiler output produced by configure, useful for debugging
-# configure, is in ./config.log if it exists.
-
-ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
-for ac_option
-do
-  case "\$ac_option" in
-  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
-    echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
-    exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
-  -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
-    echo "$CONFIG_STATUS generated by autoconf version 2.13"
-    exit 0 ;;
-  -help | --help | --hel | --he | --h)
-    echo "\$ac_cs_usage"; exit 0 ;;
-  *) echo "\$ac_cs_usage"; exit 1 ;;
-  esac
-done
-
-ac_given_srcdir=$srcdir
-ac_given_INSTALL="$INSTALL"
-
-trap 'rm -fr `echo "Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
-EOF
-cat >> $CONFIG_STATUS <<EOF
-
-# Protect against being on the right side of a sed subst in config.status.
-sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
- s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
-$ac_vpsub
-$extrasub
-s%@SHELL@%$SHELL%g
-s%@CFLAGS@%$CFLAGS%g
-s%@CPPFLAGS@%$CPPFLAGS%g
-s%@CXXFLAGS@%$CXXFLAGS%g
-s%@FFLAGS@%$FFLAGS%g
-s%@DEFS@%$DEFS%g
-s%@LDFLAGS@%$LDFLAGS%g
-s%@LIBS@%$LIBS%g
-s%@exec_prefix@%$exec_prefix%g
-s%@prefix@%$prefix%g
-s%@program_transform_name@%$program_transform_name%g
-s%@bindir@%$bindir%g
-s%@sbindir@%$sbindir%g
-s%@libexecdir@%$libexecdir%g
-s%@datadir@%$datadir%g
-s%@sysconfdir@%$sysconfdir%g
-s%@sharedstatedir@%$sharedstatedir%g
-s%@localstatedir@%$localstatedir%g
-s%@libdir@%$libdir%g
-s%@includedir@%$includedir%g
-s%@oldincludedir@%$oldincludedir%g
-s%@infodir@%$infodir%g
-s%@mandir@%$mandir%g
-s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
-s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
-s%@INSTALL_DATA@%$INSTALL_DATA%g
-s%@PACKAGE@%$PACKAGE%g
-s%@VERSION@%$VERSION%g
-s%@ACLOCAL@%$ACLOCAL%g
-s%@AUTOCONF@%$AUTOCONF%g
-s%@AUTOMAKE@%$AUTOMAKE%g
-s%@AUTOHEADER@%$AUTOHEADER%g
-s%@MAKEINFO@%$MAKEINFO%g
-s%@SET_MAKE@%$SET_MAKE%g
-
-CEOF
-EOF
-
-cat >> $CONFIG_STATUS <<\EOF
-
-# Split the substitutions into bite-sized pieces for seds with
-# small command number limits, like on Digital OSF/1 and HP-UX.
-ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
-ac_file=1 # Number of current file.
-ac_beg=1 # First line for current file.
-ac_end=$ac_max_sed_cmds # Line after last line for current file.
-ac_more_lines=:
-ac_sed_cmds=""
-while $ac_more_lines; do
-  if test $ac_beg -gt 1; then
-    sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
-  else
-    sed "${ac_end}q" conftest.subs > conftest.s$ac_file
-  fi
-  if test ! -s conftest.s$ac_file; then
-    ac_more_lines=false
-    rm -f conftest.s$ac_file
-  else
-    if test -z "$ac_sed_cmds"; then
-      ac_sed_cmds="sed -f conftest.s$ac_file"
-    else
-      ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
-    fi
-    ac_file=`expr $ac_file + 1`
-    ac_beg=$ac_end
-    ac_end=`expr $ac_end + $ac_max_sed_cmds`
-  fi
-done
-if test -z "$ac_sed_cmds"; then
-  ac_sed_cmds=cat
-fi
-EOF
-
-cat >> $CONFIG_STATUS <<EOF
-
-CONFIG_FILES=\${CONFIG_FILES-"Makefile"}
-EOF
-cat >> $CONFIG_STATUS <<\EOF
-for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
-  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
-  case "$ac_file" in
-  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
-       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
-  *) ac_file_in="${ac_file}.in" ;;
-  esac
-
-  # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
-
-  # Remove last slash and all that follows it.  Not all systems have dirname.
-  ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
-  if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
-    # The file is in a subdirectory.
-    test ! -d "$ac_dir" && mkdir "$ac_dir"
-    ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
-    # A "../" for each directory in $ac_dir_suffix.
-    ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
-  else
-    ac_dir_suffix= ac_dots=
-  fi
-
-  case "$ac_given_srcdir" in
-  .)  srcdir=.
-      if test -z "$ac_dots"; then top_srcdir=.
-      else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
-  /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
-  *) # Relative path.
-    srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
-    top_srcdir="$ac_dots$ac_given_srcdir" ;;
-  esac
-
-  case "$ac_given_INSTALL" in
-  [/$]*) INSTALL="$ac_given_INSTALL" ;;
-  *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
-  esac
-
-  echo creating "$ac_file"
-  rm -f "$ac_file"
-  configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
-  case "$ac_file" in
-  *Makefile*) ac_comsub="1i\\
-# $configure_input" ;;
-  *) ac_comsub= ;;
-  esac
-
-  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
-  sed -e "$ac_comsub
-s%@configure_input@%$configure_input%g
-s%@srcdir@%$srcdir%g
-s%@top_srcdir@%$top_srcdir%g
-s%@INSTALL@%$INSTALL%g
-" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
-fi; done
-rm -f conftest.s*
-
-EOF
-cat >> $CONFIG_STATUS <<EOF
-
-EOF
-cat >> $CONFIG_STATUS <<\EOF
-
-exit 0
-EOF
-chmod +x $CONFIG_STATUS
-rm -fr confdefs* $ac_clean_files
-test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
-
diff --git a/lispintro/configure.in b/lispintro/configure.in
deleted file mode 100644 (file)
index 7d60c89..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-dnl autoconf input file for the emacs lisp intro
-
-AC_INIT(emacs-lisp-intro.texi)
-AM_INIT_AUTOMAKE(emacs-lisp-intro, 2.00)
-AC_OUTPUT(Makefile)
-
-m4_if(dnl      Do not change this comment
-   arch-tag: 8d676bd8-8677-4ae0-8aa0-99bfd595b373
-)dnl
diff --git a/lispintro/cons-1.eps b/lispintro/cons-1.eps
deleted file mode 100644 (file)
index 95a74dc..0000000
+++ /dev/null
@@ -1,584 +0,0 @@
-%!
-%%BoundingBox: 35 711 289 757
-%%Title: cons-cell-diagram1
-%%CreationDate: Wed Mar  8 14:26:58 1995
-%%Creator: Tgif-2.16-p4 by William Chia-Wei Cheng (william@cs.UCLA.edu)
-%
-%      Due to bugs in Transcript, the 'PS-Adobe-' stuff is omitted from line 1
-%
-
-% Copyright (C) 1995, 1997, 2001, 2002, 2003, 2004, 2005, 2006, 2007
-%   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, 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; see the file COPYING.  If not, write to
-% the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-% Boston, MA 02110-1301, USA.
-
-/tgifdict 132 dict def
-tgifdict begin
-
-%
-%      Using a zero value radius for an ellipse or an arc would result
-%              in a non-invertible CTM matrix which causes problem when this
-%              when this PostScript is wrapped inside other routines, such as
-%              the multi.ps package from
-%              ftp.ucc.su.oz.au:/pub/ps_printing/multi.  You can overcome such
-%              error by uncommenting the sole line of the procedure below:
-%
-/tgif_min_radius
- {
-%    dup 0.01 lt { pop 0.01 } if
- } bind def
-
-/tgifellipsedict 6 dict def
-tgifellipsedict /mtrx matrix put
-
-/tgifellipse
- { tgifellipsedict begin
-      /yrad exch def
-      /xrad exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      xrad yrad scale
-      0 0 1 0 360 arc
-      savematrix setmatrix
-   end
- } def
-
-/tgifarrowtipdict 8 dict def
-tgifarrowtipdict /mtrx matrix put
-
-/tgifarrowtip
- { tgifarrowtipdict begin
-      /dy exch def
-      /dx exch def
-      /h exch def
-      /w exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      dy dx atan rotate
-      0 0 moveto
-      w neg h lineto
-      w neg h neg lineto
-      savematrix setmatrix
-   end
- } def
-
-/tgifarcdict 8 dict def
-tgifarcdict /mtrx matrix put
-
-/tgifarcn
- { tgifarcdict begin
-      /endangle exch def
-      /startangle exch def
-      /yrad exch def
-      /xrad exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      xrad yrad scale
-      0 0 1 startangle endangle arc
-      savematrix setmatrix
-   end
- } def
-
-/tgifarc
- { tgifarcdict begin
-      /endangle exch def
-      /startangle exch def
-      /yrad exch def
-      /xrad exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      xrad yrad scale
-      0 0 1 startangle endangle arcn
-      savematrix setmatrix
-   end
- } def
-
-/tgifsetuserscreendict 22 dict def
-tgifsetuserscreendict begin
-   /tempctm matrix def
-   /temprot matrix def
-   /tempscale matrix def
-
-   /concatprocs
-    { /proc2 exch cvlit def
-      /proc1 exch cvlit def
-      /newproc proc1 length proc2 length add array def
-      newproc 0 proc1 putinterval
-      newproc proc1 length proc2 putinterval
-      newproc cvx
-    } def
-   /resmatrix matrix def
-   /findresolution
-    { 72 0 resmatrix defaultmatrix dtransform
-      /yres exch def /xres exch def
-      xres dup mul yres dup mul add sqrt
-    } def
-end
-
-/tgifsetuserscreen
- { tgifsetuserscreendict begin
-      /spotfunction exch def
-      /screenangle exch def
-      /cellsize exch def
-
-      /m tempctm currentmatrix def
-      /rm screenangle temprot rotate def
-      /sm cellsize dup tempscale scale def
-
-      sm rm m m concatmatrix m concatmatrix pop
-
-      1 0 m dtransform /y1 exch def /x1 exch def
-
-      /veclength x1 dup mul y1 dup mul add sqrt def
-      /frequency findresolution veclength div def
-
-      /newscreenangle y1 x1 atan def
-
-      m 2 get m 1 get mul m 0 get m 3 get mul sub 0 gt
-
-      {{neg} /spotfunction load concatprocs
-         /spotfunction exch def
-      } if
-
-      frequency newscreenangle /spotfunction load setscreen
-   end
- } def
-
-/tgifsetpatterndict 18 dict def
-tgifsetpatterndict begin
-   /bitison
-    { /ybit exch def /xbit exch def
-      /bytevalue bstring ybit bwidth mul xbit 8 idiv add get def
-
-      /mask 1 7 xbit 8 mod sub bitshift def
-      bytevalue mask and 0 ne
-    } def
-end
-
-/tgifbitpatternspotfunction
- { tgifsetpatterndict begin
-      /y exch def /x exch def
-
-      /xindex x 1 add 2 div bpside mul cvi def
-      /yindex y 1 add 2 div bpside mul cvi def
-
-      xindex yindex bitison
-       { /onbits onbits 1 add def 1 }
-       { /offbits offbits 1 add def 0 }
-       ifelse
-   end
- } def
-
-/tgifsetpattern
- { tgifsetpatterndict begin
-      /cellsz exch def
-      /angle exch def
-      /bwidth exch def
-      /bpside exch def
-      /bstring exch def
-
-      /onbits 0 def /offbits 0 def
-      cellsz angle /tgifbitpatternspotfunction load tgifsetuserscreen
-      {} settransfer
-      offbits offbits onbits add div setgray
-   end
- } def
-
-/tgifxpmdict 4 dict def
-/tgifbwpicstr 1 string def
-/tgifcolorpicstr 3 string def
-
-/tgifsetpixels { tgifxpmdict begin /pixels exch def end } def
-
-/tgifsetpix { tgifxpmdict begin pixels 3 1 roll putinterval end } def
-
-/tgifbwspot
- { tgifxpmdict begin
-      /index exch def
-      tgifbwpicstr 0
-      pixels index 3 mul 3 getinterval aload pop
-      255 mul .114 mul exch 255 mul .587 mul add exch 255 mul .299 mul add
-      cvi put
-      tgifbwpicstr
-   end
- } def
-
-/tgifcolorspot
- { tgifxpmdict begin
-      /index exch def
-      pixels index 3 mul 3 getinterval aload pop
-      255 mul cvi tgifcolorpicstr 2 3 -1 roll put
-      255 mul cvi tgifcolorpicstr 1 3 -1 roll put
-      255 mul cvi tgifcolorpicstr 0 3 -1 roll put
-      tgifcolorpicstr
-   end
- } def
-
-/tgifnewcolorspot
- { tgifxpmdict begin
-      /index exch def
-      pixels index 3 mul 3 getinterval aload pop setrgbcolor
-   end
- } def
-
-/tgifcolordict 4 dict def
-
-/colorimage where
- { pop }
- { /colorimage
-   { tgifcolordict begin
-        pop pop pop pop pop
-        /ih exch def
-        /iw exch def
-        /x 0 def
-        /y 0 def
-        1 1 ih
-         { pop 1 1 iw
-            { pop currentfile
-              tgifbwpicstr readhexstring pop 0 get tgifnewcolorspot
-              x y moveto 1 0 rlineto 0 1 rlineto -1 0 rlineto
-              closepath fill
-              /x x 1 add def
-            } for
-           /y y 1 add def
-           /x 0 def
-         } for
-     end
-   } def
- } ifelse
-
-/tgifpatdict 10 dict def
-
-/tgifpatbyte
- { currentdict /retstr get exch
-   pat i cellsz mod get put
- } def
-
-/tgifpatproc
- { 0 1 widthlim {tgifpatbyte} for retstr
-   /i i 1 add def
- } def
-
-/tgifpatfill
- { tgifpatdict begin
-      /h exch def
-      /w exch def
-      /lty exch def
-      /ltx exch def
-      /cellsz exch def
-      /pat exch def
-
-      /widthlim w cellsz div cvi 1 sub def
-      /retstr widthlim 1 add string def
-      /i 0 def
-
-      ltx lty translate
-      w h true [1 0 0 1 0 0] {tgifpatproc} imagemask
-      ltx neg lty neg translate
-   end
- } def
-
-/pat1 <ffffffffffffffff> def
-/pat2 <0000000000000000> def
-/pat3 <8000000008000000> def
-/pat4 <8800000022000000> def
-/pat5 <8800220088002200> def
-/pat6 <8822882288228822> def
-/pat7 <aa55aa55aa55aa55> def
-/pat8 <77dd77dd77dd77dd> def
-/pat9 <77ffddff77ffddff> def
-/pat10 <77ffffff77ffffff> def
-/pat11 <7fffffff7fffffff> def
-/pat12 <8040200002040800> def
-/pat13 <40a00000040a0000> def
-/pat14 <ff888888ff888888> def
-/pat15 <ff808080ff080808> def
-/pat16 <f87422478f172271> def
-/pat17 <038448300c020101> def
-/pat18 <081c22c180010204> def
-/pat19 <8080413e080814e3> def
-/pat20 <8040201008040201> def
-/pat21 <8844221188442211> def
-/pat22 <77bbddee77bbddee> def
-/pat23 <c1e070381c0e0783> def
-/pat24 <7fbfdfeff7fbfdfe> def
-/pat25 <3e1f8fc7e3f1f87c> def
-/pat26 <0102040810204080> def
-/pat27 <1122448811224488> def
-/pat28 <eeddbb77eeddbb77> def
-/pat29 <83070e1c3870e0c1> def
-/pat30 <fefdfbf7efdfbf7f> def
-/pat31 <7cf8f1e3c78f1f3e> def
-
-/tgifcentertext { dup stringwidth pop 2 div neg 0 rmoveto } def
-
-/tgifrighttext { dup stringwidth pop neg 0 rmoveto } def
-
-/tgifreencsmalldict 12 dict def
-/tgifReEncodeSmall
- { tgifreencsmalldict begin
-      /newcodesandnames exch def
-      /newfontname exch def
-      /basefontname exch def
-
-      /basefontdict basefontname findfont def
-      /newfont basefontdict maxlength dict def
-
-      basefontdict
-      { exch dup /FID ne
-         { dup /Encoding eq
-            { exch dup length array copy newfont 3 1 roll put }
-            { exch newfont 3 1 roll put }
-            ifelse
-         }
-         { pop pop }
-         ifelse
-      }
-      forall
-
-      newfont /FontName newfontname put
-      newcodesandnames aload pop
-
-      newcodesandnames length 2 idiv
-      { newfont /Encoding get 3 1 roll put}
-      repeat
-
-      newfontname newfont definefont pop
-   end
- } def
-
-/tgifgray { 8 1 0 72 300 32 div div tgifsetpattern } bind def
-
-/tgifboxdict 6 dict def
-/tgifboxstroke
- { tgifboxdict begin
-      /pat def /w def /y2 exch def /x2 exch def /y1 exch def /x1 exch def
-      1.415 setmiterlimit
-      w 1 eq { w setlinewidth } if
-      pat pat1 ne pat pat2 ne and { gsave pat tgifgray } if
-      newpath x1 y1 moveto x2 y1 lineto x2 y2 lineto x1 y2 lineto closepath
-      pat pat2 eq { 1 setgray stroke 0 setgray } { stroke } ifelse
-      pat pat1 ne pat pat2 ne and { grestore } if
-      w 1 eq { 1 setlinewidth } if
-      1 setmiterlimit
-   end
- } def
-/tgifboxfill
- { tgifboxdict begin
-      /pat def /y2 exch def /x2 exch def /y1 exch def /x1 exch def
-      pat pat1 ne pat pat2 ne and { gsave pat tgifgray } if
-      newpath x1 y1 moveto x2 y1 lineto x2 y2 lineto x1 y2 lineto closepath
-      pat pat2 eq { 1 setgray fill 0 setgray } { fill } ifelse
-      pat pat1 ne pat pat2 ne and { grestore } if
-   end
- } def
-
-end
-
-%%PageBoundingBox: 35 711 289 757
-tgifdict begin
-/tgifsavedpage save def
-
-1 setmiterlimit
-1 setlinewidth
-
-0 setgray
-
-72 0 mul 72 11.00 mul translate
-72 128 div 100 mul 100 div dup neg scale
-
-gsave
-
-% BOX
-gsave
-   1.415 setmiterlimit
-   newpath
-      66 66 moveto 130 66 lineto 130 98 lineto 66 98 lineto
-   closepath stroke
-   1 setmiterlimit
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      98 66 moveto
-      98 98 lineto
-   stroke
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      114 82 moveto
-      0 80 atan dup cos 8 mul 194 exch sub
-      exch sin 8 mul 82 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      194 82 8 3 80 0 tgifarrowtip
-   closepath fill
-grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      146 136 moveto (rose) show
-   grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      82 82 moveto
-      82 131 lineto
-      0 48 atan dup cos 8 mul 130 exch sub
-      exch sin 8 mul 131 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      130 131 8 3 48 0 tgifarrowtip
-   closepath fill
-grestore
-
-% BOX
-gsave
-   1.415 setmiterlimit
-   newpath
-      199 66 moveto 263 66 lineto 263 98 lineto 199 98 lineto
-   closepath stroke
-   1 setmiterlimit
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      231 66 moveto
-      231 98 lineto
-   stroke
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      247 82 moveto
-      0 93 atan dup cos 8 mul 340 exch sub
-      exch sin 8 mul 82 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      340 82 8 3 93 0 tgifarrowtip
-   closepath fill
-grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      279 136 moveto (violet) show
-   grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      215 82 moveto
-      215 131 lineto
-      0 48 atan dup cos 8 mul 263 exch sub
-      exch sin 8 mul 131 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      263 131 8 3 48 0 tgifarrowtip
-   closepath fill
-grestore
-
-% BOX
-gsave
-   1.415 setmiterlimit
-   newpath
-      342 64 moveto 406 64 lineto 406 96 lineto 342 96 lineto
-   closepath stroke
-   1 setmiterlimit
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      373 64 moveto
-      373 96 lineto
-   stroke
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      389 81 moveto
-      0 48 atan dup cos 8 mul 437 exch sub
-      exch sin 8 mul 81 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      437 81 8 3 48 0 tgifarrowtip
-   closepath fill
-grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      421 135 moveto (buttercup) show
-   grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      357 81 moveto
-      357 130 lineto
-      0 48 atan dup cos 8 mul 405 exch sub
-      exch sin 8 mul 130 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      405 130 8 3 48 0 tgifarrowtip
-   closepath fill
-grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      449 87 moveto (nil) show
-   grestore
-
-grestore
-tgifsavedpage restore
-end
-%MatchingCreationDate: Wed Mar  8 14:26:58 1995
diff --git a/lispintro/cons-2.eps b/lispintro/cons-2.eps
deleted file mode 100644 (file)
index b8537d2..0000000
+++ /dev/null
@@ -1,606 +0,0 @@
-%!
-%%BoundingBox: 15 712 321 775
-%%Title: cons-cell-diagram2
-%%CreationDate: Wed Mar  8 14:26:39 1995
-%%Creator: Tgif-2.16-p4 by William Chia-Wei Cheng (william@cs.UCLA.edu)
-%
-%      Due to bugs in Transcript, the 'PS-Adobe-' stuff is omitted from line 1
-%
-
-% Copyright (C) 1995, 1997, 2001, 2002, 2003, 2004, 2005, 2006, 2007
-%   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, 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; see the file COPYING.  If not, write to
-% the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-% Boston, MA 02110-1301, USA.
-
-/tgifdict 132 dict def
-tgifdict begin
-
-%
-%      Using a zero value radius for an ellipse or an arc would result
-%              in a non-invertible CTM matrix which causes problem when this
-%              when this PostScript is wrapped inside other routines, such as
-%              the multi.ps package from
-%              ftp.ucc.su.oz.au:/pub/ps_printing/multi.  You can overcome such
-%              error by uncommenting the sole line of the procedure below:
-%
-/tgif_min_radius
- {
-%    dup 0.01 lt { pop 0.01 } if
- } bind def
-
-/tgifellipsedict 6 dict def
-tgifellipsedict /mtrx matrix put
-
-/tgifellipse
- { tgifellipsedict begin
-      /yrad exch def
-      /xrad exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      xrad yrad scale
-      0 0 1 0 360 arc
-      savematrix setmatrix
-   end
- } def
-
-/tgifarrowtipdict 8 dict def
-tgifarrowtipdict /mtrx matrix put
-
-/tgifarrowtip
- { tgifarrowtipdict begin
-      /dy exch def
-      /dx exch def
-      /h exch def
-      /w exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      dy dx atan rotate
-      0 0 moveto
-      w neg h lineto
-      w neg h neg lineto
-      savematrix setmatrix
-   end
- } def
-
-/tgifarcdict 8 dict def
-tgifarcdict /mtrx matrix put
-
-/tgifarcn
- { tgifarcdict begin
-      /endangle exch def
-      /startangle exch def
-      /yrad exch def
-      /xrad exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      xrad yrad scale
-      0 0 1 startangle endangle arc
-      savematrix setmatrix
-   end
- } def
-
-/tgifarc
- { tgifarcdict begin
-      /endangle exch def
-      /startangle exch def
-      /yrad exch def
-      /xrad exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      xrad yrad scale
-      0 0 1 startangle endangle arcn
-      savematrix setmatrix
-   end
- } def
-
-/tgifsetuserscreendict 22 dict def
-tgifsetuserscreendict begin
-   /tempctm matrix def
-   /temprot matrix def
-   /tempscale matrix def
-
-   /concatprocs
-    { /proc2 exch cvlit def
-      /proc1 exch cvlit def
-      /newproc proc1 length proc2 length add array def
-      newproc 0 proc1 putinterval
-      newproc proc1 length proc2 putinterval
-      newproc cvx
-    } def
-   /resmatrix matrix def
-   /findresolution
-    { 72 0 resmatrix defaultmatrix dtransform
-      /yres exch def /xres exch def
-      xres dup mul yres dup mul add sqrt
-    } def
-end
-
-/tgifsetuserscreen
- { tgifsetuserscreendict begin
-      /spotfunction exch def
-      /screenangle exch def
-      /cellsize exch def
-
-      /m tempctm currentmatrix def
-      /rm screenangle temprot rotate def
-      /sm cellsize dup tempscale scale def
-
-      sm rm m m concatmatrix m concatmatrix pop
-
-      1 0 m dtransform /y1 exch def /x1 exch def
-
-      /veclength x1 dup mul y1 dup mul add sqrt def
-      /frequency findresolution veclength div def
-
-      /newscreenangle y1 x1 atan def
-
-      m 2 get m 1 get mul m 0 get m 3 get mul sub 0 gt
-
-      {{neg} /spotfunction load concatprocs
-         /spotfunction exch def
-      } if
-
-      frequency newscreenangle /spotfunction load setscreen
-   end
- } def
-
-/tgifsetpatterndict 18 dict def
-tgifsetpatterndict begin
-   /bitison
-    { /ybit exch def /xbit exch def
-      /bytevalue bstring ybit bwidth mul xbit 8 idiv add get def
-
-      /mask 1 7 xbit 8 mod sub bitshift def
-      bytevalue mask and 0 ne
-    } def
-end
-
-/tgifbitpatternspotfunction
- { tgifsetpatterndict begin
-      /y exch def /x exch def
-
-      /xindex x 1 add 2 div bpside mul cvi def
-      /yindex y 1 add 2 div bpside mul cvi def
-
-      xindex yindex bitison
-       { /onbits onbits 1 add def 1 }
-       { /offbits offbits 1 add def 0 }
-       ifelse
-   end
- } def
-
-/tgifsetpattern
- { tgifsetpatterndict begin
-      /cellsz exch def
-      /angle exch def
-      /bwidth exch def
-      /bpside exch def
-      /bstring exch def
-
-      /onbits 0 def /offbits 0 def
-      cellsz angle /tgifbitpatternspotfunction load tgifsetuserscreen
-      {} settransfer
-      offbits offbits onbits add div setgray
-   end
- } def
-
-/tgifxpmdict 4 dict def
-/tgifbwpicstr 1 string def
-/tgifcolorpicstr 3 string def
-
-/tgifsetpixels { tgifxpmdict begin /pixels exch def end } def
-
-/tgifsetpix { tgifxpmdict begin pixels 3 1 roll putinterval end } def
-
-/tgifbwspot
- { tgifxpmdict begin
-      /index exch def
-      tgifbwpicstr 0
-      pixels index 3 mul 3 getinterval aload pop
-      255 mul .114 mul exch 255 mul .587 mul add exch 255 mul .299 mul add
-      cvi put
-      tgifbwpicstr
-   end
- } def
-
-/tgifcolorspot
- { tgifxpmdict begin
-      /index exch def
-      pixels index 3 mul 3 getinterval aload pop
-      255 mul cvi tgifcolorpicstr 2 3 -1 roll put
-      255 mul cvi tgifcolorpicstr 1 3 -1 roll put
-      255 mul cvi tgifcolorpicstr 0 3 -1 roll put
-      tgifcolorpicstr
-   end
- } def
-
-/tgifnewcolorspot
- { tgifxpmdict begin
-      /index exch def
-      pixels index 3 mul 3 getinterval aload pop setrgbcolor
-   end
- } def
-
-/tgifcolordict 4 dict def
-
-/colorimage where
- { pop }
- { /colorimage
-   { tgifcolordict begin
-        pop pop pop pop pop
-        /ih exch def
-        /iw exch def
-        /x 0 def
-        /y 0 def
-        1 1 ih
-         { pop 1 1 iw
-            { pop currentfile
-              tgifbwpicstr readhexstring pop 0 get tgifnewcolorspot
-              x y moveto 1 0 rlineto 0 1 rlineto -1 0 rlineto
-              closepath fill
-              /x x 1 add def
-            } for
-           /y y 1 add def
-           /x 0 def
-         } for
-     end
-   } def
- } ifelse
-
-/tgifpatdict 10 dict def
-
-/tgifpatbyte
- { currentdict /retstr get exch
-   pat i cellsz mod get put
- } def
-
-/tgifpatproc
- { 0 1 widthlim {tgifpatbyte} for retstr
-   /i i 1 add def
- } def
-
-/tgifpatfill
- { tgifpatdict begin
-      /h exch def
-      /w exch def
-      /lty exch def
-      /ltx exch def
-      /cellsz exch def
-      /pat exch def
-
-      /widthlim w cellsz div cvi 1 sub def
-      /retstr widthlim 1 add string def
-      /i 0 def
-
-      ltx lty translate
-      w h true [1 0 0 1 0 0] {tgifpatproc} imagemask
-      ltx neg lty neg translate
-   end
- } def
-
-/pat1 <ffffffffffffffff> def
-/pat2 <0000000000000000> def
-/pat3 <8000000008000000> def
-/pat4 <8800000022000000> def
-/pat5 <8800220088002200> def
-/pat6 <8822882288228822> def
-/pat7 <aa55aa55aa55aa55> def
-/pat8 <77dd77dd77dd77dd> def
-/pat9 <77ffddff77ffddff> def
-/pat10 <77ffffff77ffffff> def
-/pat11 <7fffffff7fffffff> def
-/pat12 <8040200002040800> def
-/pat13 <40a00000040a0000> def
-/pat14 <ff888888ff888888> def
-/pat15 <ff808080ff080808> def
-/pat16 <f87422478f172271> def
-/pat17 <038448300c020101> def
-/pat18 <081c22c180010204> def
-/pat19 <8080413e080814e3> def
-/pat20 <8040201008040201> def
-/pat21 <8844221188442211> def
-/pat22 <77bbddee77bbddee> def
-/pat23 <c1e070381c0e0783> def
-/pat24 <7fbfdfeff7fbfdfe> def
-/pat25 <3e1f8fc7e3f1f87c> def
-/pat26 <0102040810204080> def
-/pat27 <1122448811224488> def
-/pat28 <eeddbb77eeddbb77> def
-/pat29 <83070e1c3870e0c1> def
-/pat30 <fefdfbf7efdfbf7f> def
-/pat31 <7cf8f1e3c78f1f3e> def
-
-/tgifcentertext { dup stringwidth pop 2 div neg 0 rmoveto } def
-
-/tgifrighttext { dup stringwidth pop neg 0 rmoveto } def
-
-/tgifreencsmalldict 12 dict def
-/tgifReEncodeSmall
- { tgifreencsmalldict begin
-      /newcodesandnames exch def
-      /newfontname exch def
-      /basefontname exch def
-
-      /basefontdict basefontname findfont def
-      /newfont basefontdict maxlength dict def
-
-      basefontdict
-      { exch dup /FID ne
-         { dup /Encoding eq
-            { exch dup length array copy newfont 3 1 roll put }
-            { exch newfont 3 1 roll put }
-            ifelse
-         }
-         { pop pop }
-         ifelse
-      }
-      forall
-
-      newfont /FontName newfontname put
-      newcodesandnames aload pop
-
-      newcodesandnames length 2 idiv
-      { newfont /Encoding get 3 1 roll put}
-      repeat
-
-      newfontname newfont definefont pop
-   end
- } def
-
-/tgifgray { 8 1 0 72 300 32 div div tgifsetpattern } bind def
-
-/tgifboxdict 6 dict def
-/tgifboxstroke
- { tgifboxdict begin
-      /pat def /w def /y2 exch def /x2 exch def /y1 exch def /x1 exch def
-      1.415 setmiterlimit
-      w 1 eq { w setlinewidth } if
-      pat pat1 ne pat pat2 ne and { gsave pat tgifgray } if
-      newpath x1 y1 moveto x2 y1 lineto x2 y2 lineto x1 y2 lineto closepath
-      pat pat2 eq { 1 setgray stroke 0 setgray } { stroke } ifelse
-      pat pat1 ne pat pat2 ne and { grestore } if
-      w 1 eq { 1 setlinewidth } if
-      1 setmiterlimit
-   end
- } def
-/tgifboxfill
- { tgifboxdict begin
-      /pat def /y2 exch def /x2 exch def /y1 exch def /x1 exch def
-      pat pat1 ne pat pat2 ne and { gsave pat tgifgray } if
-      newpath x1 y1 moveto x2 y1 lineto x2 y2 lineto x1 y2 lineto closepath
-      pat pat2 eq { 1 setgray fill 0 setgray } { fill } ifelse
-      pat pat1 ne pat pat2 ne and { grestore } if
-   end
- } def
-
-end
-
-%%PageBoundingBox: 15 712 321 775
-tgifdict begin
-/tgifsavedpage save def
-
-1 setmiterlimit
-1 setlinewidth
-
-0 setgray
-
-72 0 mul 72 11.00 mul translate
-72 128 div 100 mul 100 div dup neg scale
-
-gsave
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      32 47 moveto (bouquet) show
-   grestore
-
-% BOX
-gsave
-   1.415 setmiterlimit
-   newpath
-      122 65 moveto 186 65 lineto 186 97 lineto 122 97 lineto
-   closepath stroke
-   1 setmiterlimit
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      154 65 moveto
-      154 97 lineto
-   stroke
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      170 81 moveto
-      0 80 atan dup cos 8 mul 250 exch sub
-      exch sin 8 mul 81 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      250 81 8 3 80 0 tgifarrowtip
-   closepath fill
-grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      202 135 moveto (rose) show
-   grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      138 81 moveto
-      138 130 lineto
-      0 48 atan dup cos 8 mul 186 exch sub
-      exch sin 8 mul 130 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      186 130 8 3 48 0 tgifarrowtip
-   closepath fill
-grestore
-
-% BOX
-gsave
-   1.415 setmiterlimit
-   newpath
-      255 65 moveto 319 65 lineto 319 97 lineto 255 97 lineto
-   closepath stroke
-   1 setmiterlimit
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      287 65 moveto
-      287 97 lineto
-   stroke
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      303 81 moveto
-      0 93 atan dup cos 8 mul 396 exch sub
-      exch sin 8 mul 81 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      396 81 8 3 93 0 tgifarrowtip
-   closepath fill
-grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      335 135 moveto (violet) show
-   grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      271 81 moveto
-      271 130 lineto
-      0 48 atan dup cos 8 mul 319 exch sub
-      exch sin 8 mul 130 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      319 130 8 3 48 0 tgifarrowtip
-   closepath fill
-grestore
-
-% BOX
-gsave
-   1.415 setmiterlimit
-   newpath
-      398 63 moveto 462 63 lineto 462 95 lineto 398 95 lineto
-   closepath stroke
-   1 setmiterlimit
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      429 63 moveto
-      429 95 lineto
-   stroke
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      445 80 moveto
-      0 48 atan dup cos 8 mul 493 exch sub
-      exch sin 8 mul 80 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      493 80 8 3 48 0 tgifarrowtip
-   closepath fill
-grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      477 134 moveto (buttercup) show
-   grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      413 80 moveto
-      413 129 lineto
-      0 48 atan dup cos 8 mul 461 exch sub
-      exch sin 8 mul 129 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      461 129 8 3 48 0 tgifarrowtip
-   closepath fill
-grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      505 86 moveto (nil) show
-   grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      66 53 moveto
-      66 81 lineto
-      0 46 atan dup cos 8 mul 112 exch sub
-      exch sin 8 mul 81 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      112 81 8 3 46 0 tgifarrowtip
-   closepath fill
-grestore
-
-grestore
-tgifsavedpage restore
-end
-%MatchingCreationDate: Wed Mar  8 14:26:39 1995
diff --git a/lispintro/cons-2a.eps b/lispintro/cons-2a.eps
deleted file mode 100644 (file)
index 1ec78c4..0000000
+++ /dev/null
@@ -1,600 +0,0 @@
-%!
-%%BoundingBox: 15 702 300 767
-%%Title: cons-cell-diagram2a
-%%CreationDate: Tue Mar 14 15:09:30 1995
-%%Creator: Tgif-2.16-p4 by William Chia-Wei Cheng (william@cs.UCLA.edu)
-%
-%      Due to bugs in Transcript, the 'PS-Adobe-' stuff is omitted from line 1
-%
-
-% Copyright (C) 1995, 1997, 2001, 2002, 2003, 2004, 2005, 2006, 2007
-%   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, 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; see the file COPYING.  If not, write to
-% the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-% Boston, MA 02110-1301, USA.
-
-/tgifdict 132 dict def
-tgifdict begin
-
-%
-%      Using a zero value radius for an ellipse or an arc would result
-%              in a non-invertible CTM matrix which causes problem when this
-%              when this PostScript is wrapped inside other routines, such as
-%              the multi.ps package from
-%              ftp.ucc.su.oz.au:/pub/ps_printing/multi.  You can overcome such
-%              error by uncommenting the sole line of the procedure below:
-%
-/tgif_min_radius
- {
-%    dup 0.01 lt { pop 0.01 } if
- } bind def
-
-/tgifellipsedict 6 dict def
-tgifellipsedict /mtrx matrix put
-
-/tgifellipse
- { tgifellipsedict begin
-      /yrad exch def
-      /xrad exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      xrad yrad scale
-      0 0 1 0 360 arc
-      savematrix setmatrix
-   end
- } def
-
-/tgifarrowtipdict 8 dict def
-tgifarrowtipdict /mtrx matrix put
-
-/tgifarrowtip
- { tgifarrowtipdict begin
-      /dy exch def
-      /dx exch def
-      /h exch def
-      /w exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      dy dx atan rotate
-      0 0 moveto
-      w neg h lineto
-      w neg h neg lineto
-      savematrix setmatrix
-   end
- } def
-
-/tgifarcdict 8 dict def
-tgifarcdict /mtrx matrix put
-
-/tgifarcn
- { tgifarcdict begin
-      /endangle exch def
-      /startangle exch def
-      /yrad exch def
-      /xrad exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      xrad yrad scale
-      0 0 1 startangle endangle arc
-      savematrix setmatrix
-   end
- } def
-
-/tgifarc
- { tgifarcdict begin
-      /endangle exch def
-      /startangle exch def
-      /yrad exch def
-      /xrad exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      xrad yrad scale
-      0 0 1 startangle endangle arcn
-      savematrix setmatrix
-   end
- } def
-
-/tgifsetuserscreendict 22 dict def
-tgifsetuserscreendict begin
-   /tempctm matrix def
-   /temprot matrix def
-   /tempscale matrix def
-
-   /concatprocs
-    { /proc2 exch cvlit def
-      /proc1 exch cvlit def
-      /newproc proc1 length proc2 length add array def
-      newproc 0 proc1 putinterval
-      newproc proc1 length proc2 putinterval
-      newproc cvx
-    } def
-   /resmatrix matrix def
-   /findresolution
-    { 72 0 resmatrix defaultmatrix dtransform
-      /yres exch def /xres exch def
-      xres dup mul yres dup mul add sqrt
-    } def
-end
-
-/tgifsetuserscreen
- { tgifsetuserscreendict begin
-      /spotfunction exch def
-      /screenangle exch def
-      /cellsize exch def
-
-      /m tempctm currentmatrix def
-      /rm screenangle temprot rotate def
-      /sm cellsize dup tempscale scale def
-
-      sm rm m m concatmatrix m concatmatrix pop
-
-      1 0 m dtransform /y1 exch def /x1 exch def
-
-      /veclength x1 dup mul y1 dup mul add sqrt def
-      /frequency findresolution veclength div def
-
-      /newscreenangle y1 x1 atan def
-
-      m 2 get m 1 get mul m 0 get m 3 get mul sub 0 gt
-
-      {{neg} /spotfunction load concatprocs
-         /spotfunction exch def
-      } if
-
-      frequency newscreenangle /spotfunction load setscreen
-   end
- } def
-
-/tgifsetpatterndict 18 dict def
-tgifsetpatterndict begin
-   /bitison
-    { /ybit exch def /xbit exch def
-      /bytevalue bstring ybit bwidth mul xbit 8 idiv add get def
-
-      /mask 1 7 xbit 8 mod sub bitshift def
-      bytevalue mask and 0 ne
-    } def
-end
-
-/tgifbitpatternspotfunction
- { tgifsetpatterndict begin
-      /y exch def /x exch def
-
-      /xindex x 1 add 2 div bpside mul cvi def
-      /yindex y 1 add 2 div bpside mul cvi def
-
-      xindex yindex bitison
-       { /onbits onbits 1 add def 1 }
-       { /offbits offbits 1 add def 0 }
-       ifelse
-   end
- } def
-
-/tgifsetpattern
- { tgifsetpatterndict begin
-      /cellsz exch def
-      /angle exch def
-      /bwidth exch def
-      /bpside exch def
-      /bstring exch def
-
-      /onbits 0 def /offbits 0 def
-      cellsz angle /tgifbitpatternspotfunction load tgifsetuserscreen
-      {} settransfer
-      offbits offbits onbits add div setgray
-   end
- } def
-
-/tgifxpmdict 4 dict def
-/tgifbwpicstr 1 string def
-/tgifcolorpicstr 3 string def
-
-/tgifsetpixels { tgifxpmdict begin /pixels exch def end } def
-
-/tgifsetpix { tgifxpmdict begin pixels 3 1 roll putinterval end } def
-
-/tgifbwspot
- { tgifxpmdict begin
-      /index exch def
-      tgifbwpicstr 0
-      pixels index 3 mul 3 getinterval aload pop
-      255 mul .114 mul exch 255 mul .587 mul add exch 255 mul .299 mul add
-      cvi put
-      tgifbwpicstr
-   end
- } def
-
-/tgifcolorspot
- { tgifxpmdict begin
-      /index exch def
-      pixels index 3 mul 3 getinterval aload pop
-      255 mul cvi tgifcolorpicstr 2 3 -1 roll put
-      255 mul cvi tgifcolorpicstr 1 3 -1 roll put
-      255 mul cvi tgifcolorpicstr 0 3 -1 roll put
-      tgifcolorpicstr
-   end
- } def
-
-/tgifnewcolorspot
- { tgifxpmdict begin
-      /index exch def
-      pixels index 3 mul 3 getinterval aload pop setrgbcolor
-   end
- } def
-
-/tgifcolordict 4 dict def
-
-/colorimage where
- { pop }
- { /colorimage
-   { tgifcolordict begin
-        pop pop pop pop pop
-        /ih exch def
-        /iw exch def
-        /x 0 def
-        /y 0 def
-        1 1 ih
-         { pop 1 1 iw
-            { pop currentfile
-              tgifbwpicstr readhexstring pop 0 get tgifnewcolorspot
-              x y moveto 1 0 rlineto 0 1 rlineto -1 0 rlineto
-              closepath fill
-              /x x 1 add def
-            } for
-           /y y 1 add def
-           /x 0 def
-         } for
-     end
-   } def
- } ifelse
-
-/tgifpatdict 10 dict def
-
-/tgifpatbyte
- { currentdict /retstr get exch
-   pat i cellsz mod get put
- } def
-
-/tgifpatproc
- { 0 1 widthlim {tgifpatbyte} for retstr
-   /i i 1 add def
- } def
-
-/tgifpatfill
- { tgifpatdict begin
-      /h exch def
-      /w exch def
-      /lty exch def
-      /ltx exch def
-      /cellsz exch def
-      /pat exch def
-
-      /widthlim w cellsz div cvi 1 sub def
-      /retstr widthlim 1 add string def
-      /i 0 def
-
-      ltx lty translate
-      w h true [1 0 0 1 0 0] {tgifpatproc} imagemask
-      ltx neg lty neg translate
-   end
- } def
-
-/pat1 <ffffffffffffffff> def
-/pat2 <0000000000000000> def
-/pat3 <8000000008000000> def
-/pat4 <8800000022000000> def
-/pat5 <8800220088002200> def
-/pat6 <8822882288228822> def
-/pat7 <aa55aa55aa55aa55> def
-/pat8 <77dd77dd77dd77dd> def
-/pat9 <77ffddff77ffddff> def
-/pat10 <77ffffff77ffffff> def
-/pat11 <7fffffff7fffffff> def
-/pat12 <8040200002040800> def
-/pat13 <40a00000040a0000> def
-/pat14 <ff888888ff888888> def
-/pat15 <ff808080ff080808> def
-/pat16 <f87422478f172271> def
-/pat17 <038448300c020101> def
-/pat18 <081c22c180010204> def
-/pat19 <8080413e080814e3> def
-/pat20 <8040201008040201> def
-/pat21 <8844221188442211> def
-/pat22 <77bbddee77bbddee> def
-/pat23 <c1e070381c0e0783> def
-/pat24 <7fbfdfeff7fbfdfe> def
-/pat25 <3e1f8fc7e3f1f87c> def
-/pat26 <0102040810204080> def
-/pat27 <1122448811224488> def
-/pat28 <eeddbb77eeddbb77> def
-/pat29 <83070e1c3870e0c1> def
-/pat30 <fefdfbf7efdfbf7f> def
-/pat31 <7cf8f1e3c78f1f3e> def
-
-/tgifcentertext { dup stringwidth pop 2 div neg 0 rmoveto } def
-
-/tgifrighttext { dup stringwidth pop neg 0 rmoveto } def
-
-/tgifreencsmalldict 12 dict def
-/tgifReEncodeSmall
- { tgifreencsmalldict begin
-      /newcodesandnames exch def
-      /newfontname exch def
-      /basefontname exch def
-
-      /basefontdict basefontname findfont def
-      /newfont basefontdict maxlength dict def
-
-      basefontdict
-      { exch dup /FID ne
-         { dup /Encoding eq
-            { exch dup length array copy newfont 3 1 roll put }
-            { exch newfont 3 1 roll put }
-            ifelse
-         }
-         { pop pop }
-         ifelse
-      }
-      forall
-
-      newfont /FontName newfontname put
-      newcodesandnames aload pop
-
-      newcodesandnames length 2 idiv
-      { newfont /Encoding get 3 1 roll put}
-      repeat
-
-      newfontname newfont definefont pop
-   end
- } def
-
-/tgifgray { 8 1 0 72 300 32 div div tgifsetpattern } bind def
-
-/tgifboxdict 6 dict def
-/tgifboxstroke
- { tgifboxdict begin
-      /pat def /w def /y2 exch def /x2 exch def /y1 exch def /x1 exch def
-      1.415 setmiterlimit
-      w 1 eq { w setlinewidth } if
-      pat pat1 ne pat pat2 ne and { gsave pat tgifgray } if
-      newpath x1 y1 moveto x2 y1 lineto x2 y2 lineto x1 y2 lineto closepath
-      pat pat2 eq { 1 setgray stroke 0 setgray } { stroke } ifelse
-      pat pat1 ne pat pat2 ne and { grestore } if
-      w 1 eq { 1 setlinewidth } if
-      1 setmiterlimit
-   end
- } def
-/tgifboxfill
- { tgifboxdict begin
-      /pat def /y2 exch def /x2 exch def /y1 exch def /x1 exch def
-      pat pat1 ne pat pat2 ne and { gsave pat tgifgray } if
-      newpath x1 y1 moveto x2 y1 lineto x2 y2 lineto x1 y2 lineto closepath
-      pat pat2 eq { 1 setgray fill 0 setgray } { fill } ifelse
-      pat pat1 ne pat pat2 ne and { grestore } if
-   end
- } def
-
-end
-
-%%PageBoundingBox: 15 702 300 767
-tgifdict begin
-/tgifsavedpage save def
-
-1 setmiterlimit
-1 setlinewidth
-
-0 setgray
-
-72 0 mul 72 11.00 mul translate
-72 128 div 100 mul 100 div dup neg scale
-
-gsave
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      32 62 moveto (bouquet) show
-   grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      64 80 moveto
-      64 120 lineto
-      0 49 atan dup cos 8 mul 113 exch sub
-      exch sin 8 mul 120 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      113 120 8 3 49 0 tgifarrowtip
-   closepath fill
-grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      128 110 moveto (car) show
-   grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      128 142 moveto (rose) show
-   grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      192 110 moveto (cdr) show
-   grestore
-
-% OVAL
-gsave
-   newpath 207 124 4 4 tgifellipse stroke
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      217 123 moveto
-      0 38 atan dup cos 8 mul 255 exch sub
-      exch sin 8 mul 123 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      255 123 8 3 38 0 tgifarrowtip
-   closepath fill
-grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      268 111 moveto (car) show
-   grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      264 143 moveto (violet) show
-   grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      332 111 moveto (cdr) show
-   grestore
-
-% OVAL
-gsave
-   newpath 347 125 4 4 tgifellipse stroke
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      357 124 moveto
-      0 38 atan dup cos 8 mul 395 exch sub
-      exch sin 8 mul 124 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      395 124 8 3 38 0 tgifarrowtip
-   closepath fill
-grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      408 112 moveto (car) show
-   grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      408 136 moveto (butter-) show
-      408 153 moveto (cup) show
-   grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      496 113 moveto (cdr) show
-   grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      495 137 moveto (nil) show
-   grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      178 86 moveto
-      178 157 lineto
-   stroke
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      485 84 moveto
-      485 157 lineto
-   stroke
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      327 85 moveto
-      327 157 lineto
-   stroke
-grestore
-
-% BOX
-gsave
-   1.415 setmiterlimit
-   newpath
-      120 86 moveto 234 86 lineto 234 157 lineto 120 157 lineto
-   closepath stroke
-   1 setmiterlimit
-grestore
-
-% BOX
-gsave
-   1.415 setmiterlimit
-   newpath
-      257 85 moveto 371 85 lineto 371 157 lineto 257 157 lineto
-   closepath stroke
-   1 setmiterlimit
-grestore
-
-% BOX
-gsave
-   1.415 setmiterlimit
-   newpath
-      397 84 moveto 531 84 lineto 531 157 lineto 397 157 lineto
-   closepath stroke
-   1 setmiterlimit
-grestore
-
-grestore
-tgifsavedpage restore
-end
-%MatchingCreationDate: Tue Mar 14 15:09:30 1995
diff --git a/lispintro/cons-3.eps b/lispintro/cons-3.eps
deleted file mode 100644 (file)
index 795fa2b..0000000
+++ /dev/null
@@ -1,630 +0,0 @@
-%!
-%%BoundingBox: -1 691 324 757
-%%Title: cons-cell-diagram3
-%%CreationDate: Wed Mar  8 14:25:41 1995
-%%Creator: Tgif-2.16-p4 by William Chia-Wei Cheng (william@cs.UCLA.edu)
-%
-%      Due to bugs in Transcript, the 'PS-Adobe-' stuff is omitted from line 1
-%
-
-% Copyright (C) 1995, 1997, 2001, 2002, 2003, 2004, 2005, 2006, 2007
-%   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, 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; see the file COPYING.  If not, write to
-% the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-% Boston, MA 02110-1301, USA.
-
-/tgifdict 132 dict def
-tgifdict begin
-
-%
-%      Using a zero value radius for an ellipse or an arc would result
-%              in a non-invertible CTM matrix which causes problem when this
-%              when this PostScript is wrapped inside other routines, such as
-%              the multi.ps package from
-%              ftp.ucc.su.oz.au:/pub/ps_printing/multi.  You can overcome such
-%              error by uncommenting the sole line of the procedure below:
-%
-/tgif_min_radius
- {
-%    dup 0.01 lt { pop 0.01 } if
- } bind def
-
-/tgifellipsedict 6 dict def
-tgifellipsedict /mtrx matrix put
-
-/tgifellipse
- { tgifellipsedict begin
-      /yrad exch def
-      /xrad exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      xrad yrad scale
-      0 0 1 0 360 arc
-      savematrix setmatrix
-   end
- } def
-
-/tgifarrowtipdict 8 dict def
-tgifarrowtipdict /mtrx matrix put
-
-/tgifarrowtip
- { tgifarrowtipdict begin
-      /dy exch def
-      /dx exch def
-      /h exch def
-      /w exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      dy dx atan rotate
-      0 0 moveto
-      w neg h lineto
-      w neg h neg lineto
-      savematrix setmatrix
-   end
- } def
-
-/tgifarcdict 8 dict def
-tgifarcdict /mtrx matrix put
-
-/tgifarcn
- { tgifarcdict begin
-      /endangle exch def
-      /startangle exch def
-      /yrad exch def
-      /xrad exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      xrad yrad scale
-      0 0 1 startangle endangle arc
-      savematrix setmatrix
-   end
- } def
-
-/tgifarc
- { tgifarcdict begin
-      /endangle exch def
-      /startangle exch def
-      /yrad exch def
-      /xrad exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      xrad yrad scale
-      0 0 1 startangle endangle arcn
-      savematrix setmatrix
-   end
- } def
-
-/tgifsetuserscreendict 22 dict def
-tgifsetuserscreendict begin
-   /tempctm matrix def
-   /temprot matrix def
-   /tempscale matrix def
-
-   /concatprocs
-    { /proc2 exch cvlit def
-      /proc1 exch cvlit def
-      /newproc proc1 length proc2 length add array def
-      newproc 0 proc1 putinterval
-      newproc proc1 length proc2 putinterval
-      newproc cvx
-    } def
-   /resmatrix matrix def
-   /findresolution
-    { 72 0 resmatrix defaultmatrix dtransform
-      /yres exch def /xres exch def
-      xres dup mul yres dup mul add sqrt
-    } def
-end
-
-/tgifsetuserscreen
- { tgifsetuserscreendict begin
-      /spotfunction exch def
-      /screenangle exch def
-      /cellsize exch def
-
-      /m tempctm currentmatrix def
-      /rm screenangle temprot rotate def
-      /sm cellsize dup tempscale scale def
-
-      sm rm m m concatmatrix m concatmatrix pop
-
-      1 0 m dtransform /y1 exch def /x1 exch def
-
-      /veclength x1 dup mul y1 dup mul add sqrt def
-      /frequency findresolution veclength div def
-
-      /newscreenangle y1 x1 atan def
-
-      m 2 get m 1 get mul m 0 get m 3 get mul sub 0 gt
-
-      {{neg} /spotfunction load concatprocs
-         /spotfunction exch def
-      } if
-
-      frequency newscreenangle /spotfunction load setscreen
-   end
- } def
-
-/tgifsetpatterndict 18 dict def
-tgifsetpatterndict begin
-   /bitison
-    { /ybit exch def /xbit exch def
-      /bytevalue bstring ybit bwidth mul xbit 8 idiv add get def
-
-      /mask 1 7 xbit 8 mod sub bitshift def
-      bytevalue mask and 0 ne
-    } def
-end
-
-/tgifbitpatternspotfunction
- { tgifsetpatterndict begin
-      /y exch def /x exch def
-
-      /xindex x 1 add 2 div bpside mul cvi def
-      /yindex y 1 add 2 div bpside mul cvi def
-
-      xindex yindex bitison
-       { /onbits onbits 1 add def 1 }
-       { /offbits offbits 1 add def 0 }
-       ifelse
-   end
- } def
-
-/tgifsetpattern
- { tgifsetpatterndict begin
-      /cellsz exch def
-      /angle exch def
-      /bwidth exch def
-      /bpside exch def
-      /bstring exch def
-
-      /onbits 0 def /offbits 0 def
-      cellsz angle /tgifbitpatternspotfunction load tgifsetuserscreen
-      {} settransfer
-      offbits offbits onbits add div setgray
-   end
- } def
-
-/tgifxpmdict 4 dict def
-/tgifbwpicstr 1 string def
-/tgifcolorpicstr 3 string def
-
-/tgifsetpixels { tgifxpmdict begin /pixels exch def end } def
-
-/tgifsetpix { tgifxpmdict begin pixels 3 1 roll putinterval end } def
-
-/tgifbwspot
- { tgifxpmdict begin
-      /index exch def
-      tgifbwpicstr 0
-      pixels index 3 mul 3 getinterval aload pop
-      255 mul .114 mul exch 255 mul .587 mul add exch 255 mul .299 mul add
-      cvi put
-      tgifbwpicstr
-   end
- } def
-
-/tgifcolorspot
- { tgifxpmdict begin
-      /index exch def
-      pixels index 3 mul 3 getinterval aload pop
-      255 mul cvi tgifcolorpicstr 2 3 -1 roll put
-      255 mul cvi tgifcolorpicstr 1 3 -1 roll put
-      255 mul cvi tgifcolorpicstr 0 3 -1 roll put
-      tgifcolorpicstr
-   end
- } def
-
-/tgifnewcolorspot
- { tgifxpmdict begin
-      /index exch def
-      pixels index 3 mul 3 getinterval aload pop setrgbcolor
-   end
- } def
-
-/tgifcolordict 4 dict def
-
-/colorimage where
- { pop }
- { /colorimage
-   { tgifcolordict begin
-        pop pop pop pop pop
-        /ih exch def
-        /iw exch def
-        /x 0 def
-        /y 0 def
-        1 1 ih
-         { pop 1 1 iw
-            { pop currentfile
-              tgifbwpicstr readhexstring pop 0 get tgifnewcolorspot
-              x y moveto 1 0 rlineto 0 1 rlineto -1 0 rlineto
-              closepath fill
-              /x x 1 add def
-            } for
-           /y y 1 add def
-           /x 0 def
-         } for
-     end
-   } def
- } ifelse
-
-/tgifpatdict 10 dict def
-
-/tgifpatbyte
- { currentdict /retstr get exch
-   pat i cellsz mod get put
- } def
-
-/tgifpatproc
- { 0 1 widthlim {tgifpatbyte} for retstr
-   /i i 1 add def
- } def
-
-/tgifpatfill
- { tgifpatdict begin
-      /h exch def
-      /w exch def
-      /lty exch def
-      /ltx exch def
-      /cellsz exch def
-      /pat exch def
-
-      /widthlim w cellsz div cvi 1 sub def
-      /retstr widthlim 1 add string def
-      /i 0 def
-
-      ltx lty translate
-      w h true [1 0 0 1 0 0] {tgifpatproc} imagemask
-      ltx neg lty neg translate
-   end
- } def
-
-/pat1 <ffffffffffffffff> def
-/pat2 <0000000000000000> def
-/pat3 <8000000008000000> def
-/pat4 <8800000022000000> def
-/pat5 <8800220088002200> def
-/pat6 <8822882288228822> def
-/pat7 <aa55aa55aa55aa55> def
-/pat8 <77dd77dd77dd77dd> def
-/pat9 <77ffddff77ffddff> def
-/pat10 <77ffffff77ffffff> def
-/pat11 <7fffffff7fffffff> def
-/pat12 <8040200002040800> def
-/pat13 <40a00000040a0000> def
-/pat14 <ff888888ff888888> def
-/pat15 <ff808080ff080808> def
-/pat16 <f87422478f172271> def
-/pat17 <038448300c020101> def
-/pat18 <081c22c180010204> def
-/pat19 <8080413e080814e3> def
-/pat20 <8040201008040201> def
-/pat21 <8844221188442211> def
-/pat22 <77bbddee77bbddee> def
-/pat23 <c1e070381c0e0783> def
-/pat24 <7fbfdfeff7fbfdfe> def
-/pat25 <3e1f8fc7e3f1f87c> def
-/pat26 <0102040810204080> def
-/pat27 <1122448811224488> def
-/pat28 <eeddbb77eeddbb77> def
-/pat29 <83070e1c3870e0c1> def
-/pat30 <fefdfbf7efdfbf7f> def
-/pat31 <7cf8f1e3c78f1f3e> def
-
-/tgifcentertext { dup stringwidth pop 2 div neg 0 rmoveto } def
-
-/tgifrighttext { dup stringwidth pop neg 0 rmoveto } def
-
-/tgifreencsmalldict 12 dict def
-/tgifReEncodeSmall
- { tgifreencsmalldict begin
-      /newcodesandnames exch def
-      /newfontname exch def
-      /basefontname exch def
-
-      /basefontdict basefontname findfont def
-      /newfont basefontdict maxlength dict def
-
-      basefontdict
-      { exch dup /FID ne
-         { dup /Encoding eq
-            { exch dup length array copy newfont 3 1 roll put }
-            { exch newfont 3 1 roll put }
-            ifelse
-         }
-         { pop pop }
-         ifelse
-      }
-      forall
-
-      newfont /FontName newfontname put
-      newcodesandnames aload pop
-
-      newcodesandnames length 2 idiv
-      { newfont /Encoding get 3 1 roll put}
-      repeat
-
-      newfontname newfont definefont pop
-   end
- } def
-
-/tgifgray { 8 1 0 72 300 32 div div tgifsetpattern } bind def
-
-/tgifboxdict 6 dict def
-/tgifboxstroke
- { tgifboxdict begin
-      /pat def /w def /y2 exch def /x2 exch def /y1 exch def /x1 exch def
-      1.415 setmiterlimit
-      w 1 eq { w setlinewidth } if
-      pat pat1 ne pat pat2 ne and { gsave pat tgifgray } if
-      newpath x1 y1 moveto x2 y1 lineto x2 y2 lineto x1 y2 lineto closepath
-      pat pat2 eq { 1 setgray stroke 0 setgray } { stroke } ifelse
-      pat pat1 ne pat pat2 ne and { grestore } if
-      w 1 eq { 1 setlinewidth } if
-      1 setmiterlimit
-   end
- } def
-/tgifboxfill
- { tgifboxdict begin
-      /pat def /y2 exch def /x2 exch def /y1 exch def /x1 exch def
-      pat pat1 ne pat pat2 ne and { gsave pat tgifgray } if
-      newpath x1 y1 moveto x2 y1 lineto x2 y2 lineto x1 y2 lineto closepath
-      pat pat2 eq { 1 setgray fill 0 setgray } { fill } ifelse
-      pat pat1 ne pat pat2 ne and { grestore } if
-   end
- } def
-
-end
-
-%%PageBoundingBox: -1 691 324 757
-tgifdict begin
-/tgifsavedpage save def
-
-1 setmiterlimit
-1 setlinewidth
-
-0 setgray
-
-72 0 mul 72 11.00 mul translate
-72 128 div 100 mul 100 div dup neg scale
-
-gsave
-
-% BOX
-gsave
-   1.415 setmiterlimit
-   newpath
-      128 102 moveto 192 102 lineto 192 134 lineto 128 134 lineto
-   closepath stroke
-   1 setmiterlimit
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      160 102 moveto
-      160 134 lineto
-   stroke
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      176 124 moveto
-      0 80 atan dup cos 8 mul 256 exch sub
-      exch sin 8 mul 124 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      256 124 8 3 80 0 tgifarrowtip
-   closepath fill
-grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      208 172 moveto (rose) show
-   grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      144 118 moveto
-      144 167 lineto
-      0 48 atan dup cos 8 mul 192 exch sub
-      exch sin 8 mul 167 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      192 167 8 3 48 0 tgifarrowtip
-   closepath fill
-grestore
-
-% BOX
-gsave
-   1.415 setmiterlimit
-   newpath
-      261 102 moveto 325 102 lineto 325 134 lineto 261 134 lineto
-   closepath stroke
-   1 setmiterlimit
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      293 102 moveto
-      293 134 lineto
-   stroke
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      309 118 moveto
-      0 93 atan dup cos 8 mul 402 exch sub
-      exch sin 8 mul 118 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      402 118 8 3 93 0 tgifarrowtip
-   closepath fill
-grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      341 172 moveto (violet) show
-   grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      277 118 moveto
-      277 167 lineto
-      0 48 atan dup cos 8 mul 325 exch sub
-      exch sin 8 mul 167 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      325 167 8 3 48 0 tgifarrowtip
-   closepath fill
-grestore
-
-% BOX
-gsave
-   1.415 setmiterlimit
-   newpath
-      404 100 moveto 468 100 lineto 468 132 lineto 404 132 lineto
-   closepath stroke
-   1 setmiterlimit
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      435 100 moveto
-      435 132 lineto
-   stroke
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      451 117 moveto
-      0 48 atan dup cos 8 mul 499 exch sub
-      exch sin 8 mul 117 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      499 117 8 3 48 0 tgifarrowtip
-   closepath fill
-grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      483 171 moveto (buttercup) show
-   grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      419 117 moveto
-      419 166 lineto
-      0 48 atan dup cos 8 mul 467 exch sub
-      exch sin 8 mul 166 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      467 166 8 3 48 0 tgifarrowtip
-   closepath fill
-grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      511 123 moveto (nil) show
-   grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      131 80 moveto (flowers) show
-   grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      210 75 moveto
-      237 75 lineto
-      237 113 lineto
-      0 18 atan dup cos 8 mul 255 exch sub
-      exch sin 8 mul 113 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      255 113 8 3 18 0 tgifarrowtip
-   closepath fill
-grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      2 80 moveto (bouquet) show
-   grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      81 77 moveto
-      108 77 lineto
-      108 115 lineto
-      0 18 atan dup cos 8 mul 126 exch sub
-      exch sin 8 mul 115 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      126 115 8 3 18 0 tgifarrowtip
-   closepath fill
-grestore
-
-grestore
-tgifsavedpage restore
-end
-%MatchingCreationDate: Wed Mar  8 14:25:41 1995
diff --git a/lispintro/cons-4.eps b/lispintro/cons-4.eps
deleted file mode 100644 (file)
index 68b0a29..0000000
+++ /dev/null
@@ -1,683 +0,0 @@
-%!
-%%BoundingBox: 6 681 355 758
-%%Title: cons-cell-diagram4
-%%CreationDate: Wed Mar  8 14:25:06 1995
-%%Creator: Tgif-2.16-p4 by William Chia-Wei Cheng (william@cs.UCLA.edu)
-%
-%      Due to bugs in Transcript, the 'PS-Adobe-' stuff is omitted from line 1
-%
-
-% Copyright (C) 1995, 1997, 2001, 2002, 2003, 2004, 2005, 2006, 2007
-%   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, 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; see the file COPYING.  If not, write to
-% the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-% Boston, MA 02110-1301, USA.
-
-/tgifdict 132 dict def
-tgifdict begin
-
-%
-%      Using a zero value radius for an ellipse or an arc would result
-%              in a non-invertible CTM matrix which causes problem when this
-%              when this PostScript is wrapped inside other routines, such as
-%              the multi.ps package from
-%              ftp.ucc.su.oz.au:/pub/ps_printing/multi.  You can overcome such
-%              error by uncommenting the sole line of the procedure below:
-%
-/tgif_min_radius
- {
-%    dup 0.01 lt { pop 0.01 } if
- } bind def
-
-/tgifellipsedict 6 dict def
-tgifellipsedict /mtrx matrix put
-
-/tgifellipse
- { tgifellipsedict begin
-      /yrad exch def
-      /xrad exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      xrad yrad scale
-      0 0 1 0 360 arc
-      savematrix setmatrix
-   end
- } def
-
-/tgifarrowtipdict 8 dict def
-tgifarrowtipdict /mtrx matrix put
-
-/tgifarrowtip
- { tgifarrowtipdict begin
-      /dy exch def
-      /dx exch def
-      /h exch def
-      /w exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      dy dx atan rotate
-      0 0 moveto
-      w neg h lineto
-      w neg h neg lineto
-      savematrix setmatrix
-   end
- } def
-
-/tgifarcdict 8 dict def
-tgifarcdict /mtrx matrix put
-
-/tgifarcn
- { tgifarcdict begin
-      /endangle exch def
-      /startangle exch def
-      /yrad exch def
-      /xrad exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      xrad yrad scale
-      0 0 1 startangle endangle arc
-      savematrix setmatrix
-   end
- } def
-
-/tgifarc
- { tgifarcdict begin
-      /endangle exch def
-      /startangle exch def
-      /yrad exch def
-      /xrad exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      xrad yrad scale
-      0 0 1 startangle endangle arcn
-      savematrix setmatrix
-   end
- } def
-
-/tgifsetuserscreendict 22 dict def
-tgifsetuserscreendict begin
-   /tempctm matrix def
-   /temprot matrix def
-   /tempscale matrix def
-
-   /concatprocs
-    { /proc2 exch cvlit def
-      /proc1 exch cvlit def
-      /newproc proc1 length proc2 length add array def
-      newproc 0 proc1 putinterval
-      newproc proc1 length proc2 putinterval
-      newproc cvx
-    } def
-   /resmatrix matrix def
-   /findresolution
-    { 72 0 resmatrix defaultmatrix dtransform
-      /yres exch def /xres exch def
-      xres dup mul yres dup mul add sqrt
-    } def
-end
-
-/tgifsetuserscreen
- { tgifsetuserscreendict begin
-      /spotfunction exch def
-      /screenangle exch def
-      /cellsize exch def
-
-      /m tempctm currentmatrix def
-      /rm screenangle temprot rotate def
-      /sm cellsize dup tempscale scale def
-
-      sm rm m m concatmatrix m concatmatrix pop
-
-      1 0 m dtransform /y1 exch def /x1 exch def
-
-      /veclength x1 dup mul y1 dup mul add sqrt def
-      /frequency findresolution veclength div def
-
-      /newscreenangle y1 x1 atan def
-
-      m 2 get m 1 get mul m 0 get m 3 get mul sub 0 gt
-
-      {{neg} /spotfunction load concatprocs
-         /spotfunction exch def
-      } if
-
-      frequency newscreenangle /spotfunction load setscreen
-   end
- } def
-
-/tgifsetpatterndict 18 dict def
-tgifsetpatterndict begin
-   /bitison
-    { /ybit exch def /xbit exch def
-      /bytevalue bstring ybit bwidth mul xbit 8 idiv add get def
-
-      /mask 1 7 xbit 8 mod sub bitshift def
-      bytevalue mask and 0 ne
-    } def
-end
-
-/tgifbitpatternspotfunction
- { tgifsetpatterndict begin
-      /y exch def /x exch def
-
-      /xindex x 1 add 2 div bpside mul cvi def
-      /yindex y 1 add 2 div bpside mul cvi def
-
-      xindex yindex bitison
-       { /onbits onbits 1 add def 1 }
-       { /offbits offbits 1 add def 0 }
-       ifelse
-   end
- } def
-
-/tgifsetpattern
- { tgifsetpatterndict begin
-      /cellsz exch def
-      /angle exch def
-      /bwidth exch def
-      /bpside exch def
-      /bstring exch def
-
-      /onbits 0 def /offbits 0 def
-      cellsz angle /tgifbitpatternspotfunction load tgifsetuserscreen
-      {} settransfer
-      offbits offbits onbits add div setgray
-   end
- } def
-
-/tgifxpmdict 4 dict def
-/tgifbwpicstr 1 string def
-/tgifcolorpicstr 3 string def
-
-/tgifsetpixels { tgifxpmdict begin /pixels exch def end } def
-
-/tgifsetpix { tgifxpmdict begin pixels 3 1 roll putinterval end } def
-
-/tgifbwspot
- { tgifxpmdict begin
-      /index exch def
-      tgifbwpicstr 0
-      pixels index 3 mul 3 getinterval aload pop
-      255 mul .114 mul exch 255 mul .587 mul add exch 255 mul .299 mul add
-      cvi put
-      tgifbwpicstr
-   end
- } def
-
-/tgifcolorspot
- { tgifxpmdict begin
-      /index exch def
-      pixels index 3 mul 3 getinterval aload pop
-      255 mul cvi tgifcolorpicstr 2 3 -1 roll put
-      255 mul cvi tgifcolorpicstr 1 3 -1 roll put
-      255 mul cvi tgifcolorpicstr 0 3 -1 roll put
-      tgifcolorpicstr
-   end
- } def
-
-/tgifnewcolorspot
- { tgifxpmdict begin
-      /index exch def
-      pixels index 3 mul 3 getinterval aload pop setrgbcolor
-   end
- } def
-
-/tgifcolordict 4 dict def
-
-/colorimage where
- { pop }
- { /colorimage
-   { tgifcolordict begin
-        pop pop pop pop pop
-        /ih exch def
-        /iw exch def
-        /x 0 def
-        /y 0 def
-        1 1 ih
-         { pop 1 1 iw
-            { pop currentfile
-              tgifbwpicstr readhexstring pop 0 get tgifnewcolorspot
-              x y moveto 1 0 rlineto 0 1 rlineto -1 0 rlineto
-              closepath fill
-              /x x 1 add def
-            } for
-           /y y 1 add def
-           /x 0 def
-         } for
-     end
-   } def
- } ifelse
-
-/tgifpatdict 10 dict def
-
-/tgifpatbyte
- { currentdict /retstr get exch
-   pat i cellsz mod get put
- } def
-
-/tgifpatproc
- { 0 1 widthlim {tgifpatbyte} for retstr
-   /i i 1 add def
- } def
-
-/tgifpatfill
- { tgifpatdict begin
-      /h exch def
-      /w exch def
-      /lty exch def
-      /ltx exch def
-      /cellsz exch def
-      /pat exch def
-
-      /widthlim w cellsz div cvi 1 sub def
-      /retstr widthlim 1 add string def
-      /i 0 def
-
-      ltx lty translate
-      w h true [1 0 0 1 0 0] {tgifpatproc} imagemask
-      ltx neg lty neg translate
-   end
- } def
-
-/pat1 <ffffffffffffffff> def
-/pat2 <0000000000000000> def
-/pat3 <8000000008000000> def
-/pat4 <8800000022000000> def
-/pat5 <8800220088002200> def
-/pat6 <8822882288228822> def
-/pat7 <aa55aa55aa55aa55> def
-/pat8 <77dd77dd77dd77dd> def
-/pat9 <77ffddff77ffddff> def
-/pat10 <77ffffff77ffffff> def
-/pat11 <7fffffff7fffffff> def
-/pat12 <8040200002040800> def
-/pat13 <40a00000040a0000> def
-/pat14 <ff888888ff888888> def
-/pat15 <ff808080ff080808> def
-/pat16 <f87422478f172271> def
-/pat17 <038448300c020101> def
-/pat18 <081c22c180010204> def
-/pat19 <8080413e080814e3> def
-/pat20 <8040201008040201> def
-/pat21 <8844221188442211> def
-/pat22 <77bbddee77bbddee> def
-/pat23 <c1e070381c0e0783> def
-/pat24 <7fbfdfeff7fbfdfe> def
-/pat25 <3e1f8fc7e3f1f87c> def
-/pat26 <0102040810204080> def
-/pat27 <1122448811224488> def
-/pat28 <eeddbb77eeddbb77> def
-/pat29 <83070e1c3870e0c1> def
-/pat30 <fefdfbf7efdfbf7f> def
-/pat31 <7cf8f1e3c78f1f3e> def
-
-/tgifcentertext { dup stringwidth pop 2 div neg 0 rmoveto } def
-
-/tgifrighttext { dup stringwidth pop neg 0 rmoveto } def
-
-/tgifreencsmalldict 12 dict def
-/tgifReEncodeSmall
- { tgifreencsmalldict begin
-      /newcodesandnames exch def
-      /newfontname exch def
-      /basefontname exch def
-
-      /basefontdict basefontname findfont def
-      /newfont basefontdict maxlength dict def
-
-      basefontdict
-      { exch dup /FID ne
-         { dup /Encoding eq
-            { exch dup length array copy newfont 3 1 roll put }
-            { exch newfont 3 1 roll put }
-            ifelse
-         }
-         { pop pop }
-         ifelse
-      }
-      forall
-
-      newfont /FontName newfontname put
-      newcodesandnames aload pop
-
-      newcodesandnames length 2 idiv
-      { newfont /Encoding get 3 1 roll put}
-      repeat
-
-      newfontname newfont definefont pop
-   end
- } def
-
-/tgifgray { 8 1 0 72 300 32 div div tgifsetpattern } bind def
-
-/tgifboxdict 6 dict def
-/tgifboxstroke
- { tgifboxdict begin
-      /pat def /w def /y2 exch def /x2 exch def /y1 exch def /x1 exch def
-      1.415 setmiterlimit
-      w 1 eq { w setlinewidth } if
-      pat pat1 ne pat pat2 ne and { gsave pat tgifgray } if
-      newpath x1 y1 moveto x2 y1 lineto x2 y2 lineto x1 y2 lineto closepath
-      pat pat2 eq { 1 setgray stroke 0 setgray } { stroke } ifelse
-      pat pat1 ne pat pat2 ne and { grestore } if
-      w 1 eq { 1 setlinewidth } if
-      1 setmiterlimit
-   end
- } def
-/tgifboxfill
- { tgifboxdict begin
-      /pat def /y2 exch def /x2 exch def /y1 exch def /x1 exch def
-      pat pat1 ne pat pat2 ne and { gsave pat tgifgray } if
-      newpath x1 y1 moveto x2 y1 lineto x2 y2 lineto x1 y2 lineto closepath
-      pat pat2 eq { 1 setgray fill 0 setgray } { fill } ifelse
-      pat pat1 ne pat pat2 ne and { grestore } if
-   end
- } def
-
-end
-
-%%PageBoundingBox: 6 681 355 758
-tgifdict begin
-/tgifsavedpage save def
-
-1 setmiterlimit
-1 setlinewidth
-
-0 setgray
-
-72 0 mul 72 11.00 mul translate
-72 128 div 100 mul 100 div dup neg scale
-
-gsave
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      274 102 moveto
-      274 134 lineto
-   stroke
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      289 122 moveto
-      0 56 atan dup cos 8 mul 345 exch sub
-      exch sin 8 mul 122 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      345 122 8 3 56 0 tgifarrowtip
-   closepath fill
-grestore
-
-% BOX
-gsave
-   1.415 setmiterlimit
-   newpath
-      350 100 moveto 414 100 lineto 414 132 lineto 350 132 lineto
-   closepath stroke
-   1 setmiterlimit
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      382 100 moveto
-      382 132 lineto
-   stroke
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      397 114 moveto
-      0 59 atan dup cos 8 mul 456 exch sub
-      exch sin 8 mul 114 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      456 114 8 3 59 0 tgifarrowtip
-   closepath fill
-grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      430 170 moveto (violet) show
-   grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      366 116 moveto
-      366 165 lineto
-      0 48 atan dup cos 8 mul 414 exch sub
-      exch sin 8 mul 165 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      414 165 8 3 48 0 tgifarrowtip
-   closepath fill
-grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      219 78 moveto (flowers) show
-   grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      298 73 moveto
-      325 73 lineto
-      325 111 lineto
-      0 18 atan dup cos 8 mul 343 exch sub
-      exch sin 8 mul 111 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      343 111 8 3 18 0 tgifarrowtip
-   closepath fill
-grestore
-
-% BOX
-gsave
-   1.415 setmiterlimit
-   newpath
-      459 95 moveto 523 95 lineto 523 127 lineto 459 127 lineto
-   closepath stroke
-   1 setmiterlimit
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      490 95 moveto
-      490 127 lineto
-   stroke
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      506 112 moveto
-      0 48 atan dup cos 8 mul 554 exch sub
-      exch sin 8 mul 112 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      554 112 8 3 48 0 tgifarrowtip
-   closepath fill
-grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      566 118 moveto (nil) show
-   grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      538 151 moveto (buttercup) show
-   grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      474 109 moveto
-      474 146 lineto
-      0 48 atan dup cos 8 mul 522 exch sub
-      exch sin 8 mul 146 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      522 146 8 3 48 0 tgifarrowtip
-   closepath fill
-grestore
-
-% BOX
-gsave
-   1.415 setmiterlimit
-   newpath
-      244 102 moveto 308 102 lineto 308 134 lineto 244 134 lineto
-   closepath stroke
-   1 setmiterlimit
-grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      324 189 moveto (rose) show
-   grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      260 117 moveto
-      260 184 lineto
-      0 48 atan dup cos 8 mul 308 exch sub
-      exch sin 8 mul 184 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      308 184 8 3 48 0 tgifarrowtip
-   closepath fill
-grestore
-
-% BOX
-gsave
-   1.415 setmiterlimit
-   newpath
-      146 101 moveto 210 101 lineto 210 133 lineto 146 133 lineto
-   closepath stroke
-   1 setmiterlimit
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      177 101 moveto
-      177 133 lineto
-   stroke
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      193 118 moveto
-      0 48 atan dup cos 8 mul 241 exch sub
-      exch sin 8 mul 118 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      241 118 8 3 48 0 tgifarrowtip
-   closepath fill
-grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      187 178 moveto (lily) show
-   grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      163 118 moveto
-      163 171 lineto
-      0 18 atan dup cos 8 mul 181 exch sub
-      exch sin 8 mul 171 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      181 171 8 3 18 0 tgifarrowtip
-   closepath fill
-grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      16 78 moveto (bouquet) show
-   grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      95 73 moveto
-      122 73 lineto
-      122 111 lineto
-      0 18 atan dup cos 8 mul 140 exch sub
-      exch sin 8 mul 111 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      140 111 8 3 18 0 tgifarrowtip
-   closepath fill
-grestore
-
-grestore
-tgifsavedpage restore
-end
-%MatchingCreationDate: Wed Mar  8 14:25:06 1995
diff --git a/lispintro/cons-5.eps b/lispintro/cons-5.eps
deleted file mode 100644 (file)
index e03815a..0000000
+++ /dev/null
@@ -1,628 +0,0 @@
-%!
-%%BoundingBox: 15 680 305 764
-%%Title: cons-cell-diagram5
-%%CreationDate: Wed Mar  8 14:27:28 1995
-%%Creator: Tgif-2.16-p4 by William Chia-Wei Cheng (william@cs.UCLA.edu)
-%
-%      Due to bugs in Transcript, the 'PS-Adobe-' stuff is omitted from line 1
-%
-
-% Copyright (C) 1995, 1997, 2001, 2002, 2003, 2004, 2005, 2006, 2007
-%   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, 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; see the file COPYING.  If not, write to
-% the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-% Boston, MA 02110-1301, USA.
-
-/tgifdict 132 dict def
-tgifdict begin
-
-%
-%      Using a zero value radius for an ellipse or an arc would result
-%              in a non-invertible CTM matrix which causes problem when this
-%              when this PostScript is wrapped inside other routines, such as
-%              the multi.ps package from
-%              ftp.ucc.su.oz.au:/pub/ps_printing/multi.  You can overcome such
-%              error by uncommenting the sole line of the procedure below:
-%
-/tgif_min_radius
- {
-%    dup 0.01 lt { pop 0.01 } if
- } bind def
-
-/tgifellipsedict 6 dict def
-tgifellipsedict /mtrx matrix put
-
-/tgifellipse
- { tgifellipsedict begin
-      /yrad exch def
-      /xrad exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      xrad yrad scale
-      0 0 1 0 360 arc
-      savematrix setmatrix
-   end
- } def
-
-/tgifarrowtipdict 8 dict def
-tgifarrowtipdict /mtrx matrix put
-
-/tgifarrowtip
- { tgifarrowtipdict begin
-      /dy exch def
-      /dx exch def
-      /h exch def
-      /w exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      dy dx atan rotate
-      0 0 moveto
-      w neg h lineto
-      w neg h neg lineto
-      savematrix setmatrix
-   end
- } def
-
-/tgifarcdict 8 dict def
-tgifarcdict /mtrx matrix put
-
-/tgifarcn
- { tgifarcdict begin
-      /endangle exch def
-      /startangle exch def
-      /yrad exch def
-      /xrad exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      xrad yrad scale
-      0 0 1 startangle endangle arc
-      savematrix setmatrix
-   end
- } def
-
-/tgifarc
- { tgifarcdict begin
-      /endangle exch def
-      /startangle exch def
-      /yrad exch def
-      /xrad exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      xrad yrad scale
-      0 0 1 startangle endangle arcn
-      savematrix setmatrix
-   end
- } def
-
-/tgifsetuserscreendict 22 dict def
-tgifsetuserscreendict begin
-   /tempctm matrix def
-   /temprot matrix def
-   /tempscale matrix def
-
-   /concatprocs
-    { /proc2 exch cvlit def
-      /proc1 exch cvlit def
-      /newproc proc1 length proc2 length add array def
-      newproc 0 proc1 putinterval
-      newproc proc1 length proc2 putinterval
-      newproc cvx
-    } def
-   /resmatrix matrix def
-   /findresolution
-    { 72 0 resmatrix defaultmatrix dtransform
-      /yres exch def /xres exch def
-      xres dup mul yres dup mul add sqrt
-    } def
-end
-
-/tgifsetuserscreen
- { tgifsetuserscreendict begin
-      /spotfunction exch def
-      /screenangle exch def
-      /cellsize exch def
-
-      /m tempctm currentmatrix def
-      /rm screenangle temprot rotate def
-      /sm cellsize dup tempscale scale def
-
-      sm rm m m concatmatrix m concatmatrix pop
-
-      1 0 m dtransform /y1 exch def /x1 exch def
-
-      /veclength x1 dup mul y1 dup mul add sqrt def
-      /frequency findresolution veclength div def
-
-      /newscreenangle y1 x1 atan def
-
-      m 2 get m 1 get mul m 0 get m 3 get mul sub 0 gt
-
-      {{neg} /spotfunction load concatprocs
-         /spotfunction exch def
-      } if
-
-      frequency newscreenangle /spotfunction load setscreen
-   end
- } def
-
-/tgifsetpatterndict 18 dict def
-tgifsetpatterndict begin
-   /bitison
-    { /ybit exch def /xbit exch def
-      /bytevalue bstring ybit bwidth mul xbit 8 idiv add get def
-
-      /mask 1 7 xbit 8 mod sub bitshift def
-      bytevalue mask and 0 ne
-    } def
-end
-
-/tgifbitpatternspotfunction
- { tgifsetpatterndict begin
-      /y exch def /x exch def
-
-      /xindex x 1 add 2 div bpside mul cvi def
-      /yindex y 1 add 2 div bpside mul cvi def
-
-      xindex yindex bitison
-       { /onbits onbits 1 add def 1 }
-       { /offbits offbits 1 add def 0 }
-       ifelse
-   end
- } def
-
-/tgifsetpattern
- { tgifsetpatterndict begin
-      /cellsz exch def
-      /angle exch def
-      /bwidth exch def
-      /bpside exch def
-      /bstring exch def
-
-      /onbits 0 def /offbits 0 def
-      cellsz angle /tgifbitpatternspotfunction load tgifsetuserscreen
-      {} settransfer
-      offbits offbits onbits add div setgray
-   end
- } def
-
-/tgifxpmdict 4 dict def
-/tgifbwpicstr 1 string def
-/tgifcolorpicstr 3 string def
-
-/tgifsetpixels { tgifxpmdict begin /pixels exch def end } def
-
-/tgifsetpix { tgifxpmdict begin pixels 3 1 roll putinterval end } def
-
-/tgifbwspot
- { tgifxpmdict begin
-      /index exch def
-      tgifbwpicstr 0
-      pixels index 3 mul 3 getinterval aload pop
-      255 mul .114 mul exch 255 mul .587 mul add exch 255 mul .299 mul add
-      cvi put
-      tgifbwpicstr
-   end
- } def
-
-/tgifcolorspot
- { tgifxpmdict begin
-      /index exch def
-      pixels index 3 mul 3 getinterval aload pop
-      255 mul cvi tgifcolorpicstr 2 3 -1 roll put
-      255 mul cvi tgifcolorpicstr 1 3 -1 roll put
-      255 mul cvi tgifcolorpicstr 0 3 -1 roll put
-      tgifcolorpicstr
-   end
- } def
-
-/tgifnewcolorspot
- { tgifxpmdict begin
-      /index exch def
-      pixels index 3 mul 3 getinterval aload pop setrgbcolor
-   end
- } def
-
-/tgifcolordict 4 dict def
-
-/colorimage where
- { pop }
- { /colorimage
-   { tgifcolordict begin
-        pop pop pop pop pop
-        /ih exch def
-        /iw exch def
-        /x 0 def
-        /y 0 def
-        1 1 ih
-         { pop 1 1 iw
-            { pop currentfile
-              tgifbwpicstr readhexstring pop 0 get tgifnewcolorspot
-              x y moveto 1 0 rlineto 0 1 rlineto -1 0 rlineto
-              closepath fill
-              /x x 1 add def
-            } for
-           /y y 1 add def
-           /x 0 def
-         } for
-     end
-   } def
- } ifelse
-
-/tgifpatdict 10 dict def
-
-/tgifpatbyte
- { currentdict /retstr get exch
-   pat i cellsz mod get put
- } def
-
-/tgifpatproc
- { 0 1 widthlim {tgifpatbyte} for retstr
-   /i i 1 add def
- } def
-
-/tgifpatfill
- { tgifpatdict begin
-      /h exch def
-      /w exch def
-      /lty exch def
-      /ltx exch def
-      /cellsz exch def
-      /pat exch def
-
-      /widthlim w cellsz div cvi 1 sub def
-      /retstr widthlim 1 add string def
-      /i 0 def
-
-      ltx lty translate
-      w h true [1 0 0 1 0 0] {tgifpatproc} imagemask
-      ltx neg lty neg translate
-   end
- } def
-
-/pat1 <ffffffffffffffff> def
-/pat2 <0000000000000000> def
-/pat3 <8000000008000000> def
-/pat4 <8800000022000000> def
-/pat5 <8800220088002200> def
-/pat6 <8822882288228822> def
-/pat7 <aa55aa55aa55aa55> def
-/pat8 <77dd77dd77dd77dd> def
-/pat9 <77ffddff77ffddff> def
-/pat10 <77ffffff77ffffff> def
-/pat11 <7fffffff7fffffff> def
-/pat12 <8040200002040800> def
-/pat13 <40a00000040a0000> def
-/pat14 <ff888888ff888888> def
-/pat15 <ff808080ff080808> def
-/pat16 <f87422478f172271> def
-/pat17 <038448300c020101> def
-/pat18 <081c22c180010204> def
-/pat19 <8080413e080814e3> def
-/pat20 <8040201008040201> def
-/pat21 <8844221188442211> def
-/pat22 <77bbddee77bbddee> def
-/pat23 <c1e070381c0e0783> def
-/pat24 <7fbfdfeff7fbfdfe> def
-/pat25 <3e1f8fc7e3f1f87c> def
-/pat26 <0102040810204080> def
-/pat27 <1122448811224488> def
-/pat28 <eeddbb77eeddbb77> def
-/pat29 <83070e1c3870e0c1> def
-/pat30 <fefdfbf7efdfbf7f> def
-/pat31 <7cf8f1e3c78f1f3e> def
-
-/tgifcentertext { dup stringwidth pop 2 div neg 0 rmoveto } def
-
-/tgifrighttext { dup stringwidth pop neg 0 rmoveto } def
-
-/tgifreencsmalldict 12 dict def
-/tgifReEncodeSmall
- { tgifreencsmalldict begin
-      /newcodesandnames exch def
-      /newfontname exch def
-      /basefontname exch def
-
-      /basefontdict basefontname findfont def
-      /newfont basefontdict maxlength dict def
-
-      basefontdict
-      { exch dup /FID ne
-         { dup /Encoding eq
-            { exch dup length array copy newfont 3 1 roll put }
-            { exch newfont 3 1 roll put }
-            ifelse
-         }
-         { pop pop }
-         ifelse
-      }
-      forall
-
-      newfont /FontName newfontname put
-      newcodesandnames aload pop
-
-      newcodesandnames length 2 idiv
-      { newfont /Encoding get 3 1 roll put}
-      repeat
-
-      newfontname newfont definefont pop
-   end
- } def
-
-/tgifgray { 8 1 0 72 300 32 div div tgifsetpattern } bind def
-
-/tgifboxdict 6 dict def
-/tgifboxstroke
- { tgifboxdict begin
-      /pat def /w def /y2 exch def /x2 exch def /y1 exch def /x1 exch def
-      1.415 setmiterlimit
-      w 1 eq { w setlinewidth } if
-      pat pat1 ne pat pat2 ne and { gsave pat tgifgray } if
-      newpath x1 y1 moveto x2 y1 lineto x2 y2 lineto x1 y2 lineto closepath
-      pat pat2 eq { 1 setgray stroke 0 setgray } { stroke } ifelse
-      pat pat1 ne pat pat2 ne and { grestore } if
-      w 1 eq { 1 setlinewidth } if
-      1 setmiterlimit
-   end
- } def
-/tgifboxfill
- { tgifboxdict begin
-      /pat def /y2 exch def /x2 exch def /y1 exch def /x1 exch def
-      pat pat1 ne pat pat2 ne and { gsave pat tgifgray } if
-      newpath x1 y1 moveto x2 y1 lineto x2 y2 lineto x1 y2 lineto closepath
-      pat pat2 eq { 1 setgray fill 0 setgray } { fill } ifelse
-      pat pat1 ne pat pat2 ne and { grestore } if
-   end
- } def
-
-end
-
-%%PageBoundingBox: 15 680 305 764
-tgifdict begin
-/tgifsavedpage save def
-
-1 setmiterlimit
-1 setlinewidth
-
-0 setgray
-
-72 0 mul 72 11.00 mul translate
-72 128 div 100 mul 100 div dup neg scale
-
-gsave
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      156 105 moveto
-      156 137 lineto
-   stroke
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      171 125 moveto
-      0 56 atan dup cos 8 mul 227 exch sub
-      exch sin 8 mul 125 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      227 125 8 3 56 0 tgifarrowtip
-   closepath fill
-grestore
-
-% BOX
-gsave
-   1.415 setmiterlimit
-   newpath
-      232 103 moveto 296 103 lineto 296 135 lineto 232 135 lineto
-   closepath stroke
-   1 setmiterlimit
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      264 103 moveto
-      264 135 lineto
-   stroke
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      279 117 moveto
-      0 59 atan dup cos 8 mul 338 exch sub
-      exch sin 8 mul 117 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      338 117 8 3 59 0 tgifarrowtip
-   closepath fill
-grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      289 172 moveto (a different piece of text) show
-   grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      248 119 moveto
-      248 168 lineto
-      0 29 atan dup cos 8 mul 277 exch sub
-      exch sin 8 mul 168 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      277 168 8 3 29 0 tgifarrowtip
-   closepath fill
-grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      147 66 moveto (kill-ring-yank-pointer) show
-   grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      207 76 moveto
-      207 114 lineto
-      0 18 atan dup cos 8 mul 225 exch sub
-      exch sin 8 mul 114 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      225 114 8 3 18 0 tgifarrowtip
-   closepath fill
-grestore
-
-% BOX
-gsave
-   1.415 setmiterlimit
-   newpath
-      341 98 moveto 405 98 lineto 405 130 lineto 341 130 lineto
-   closepath stroke
-   1 setmiterlimit
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      372 98 moveto
-      372 130 lineto
-   stroke
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      388 115 moveto
-      0 48 atan dup cos 8 mul 436 exch sub
-      exch sin 8 mul 115 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      436 115 8 3 48 0 tgifarrowtip
-   closepath fill
-grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      448 121 moveto (nil) show
-   grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      397 154 moveto (yet more text) show
-   grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      356 112 moveto
-      356 149 lineto
-      0 35 atan dup cos 8 mul 391 exch sub
-      exch sin 8 mul 149 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      391 149 8 3 35 0 tgifarrowtip
-   closepath fill
-grestore
-
-% BOX
-gsave
-   1.415 setmiterlimit
-   newpath
-      126 105 moveto 190 105 lineto 190 137 lineto 126 137 lineto
-   closepath stroke
-   1 setmiterlimit
-grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      206 192 moveto (some text) show
-   grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      142 120 moveto
-      142 187 lineto
-      0 48 atan dup cos 8 mul 190 exch sub
-      exch sin 8 mul 187 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      190 187 8 3 48 0 tgifarrowtip
-   closepath fill
-grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      32 66 moveto (kill-ring) show
-   grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      65 81 moveto
-      65 121 lineto
-      0 51 atan dup cos 8 mul 116 exch sub
-      exch sin 8 mul 121 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      116 121 8 3 51 0 tgifarrowtip
-   closepath fill
-grestore
-
-grestore
-tgifsavedpage restore
-end
-%MatchingCreationDate: Wed Mar  8 14:27:28 1995
diff --git a/lispintro/drawers.eps b/lispintro/drawers.eps
deleted file mode 100644 (file)
index 0e5a222..0000000
+++ /dev/null
@@ -1,513 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%BoundingBox: 34 577 324 778
-%%Title: chest-of-drawers-diagram-new
-%%CreationDate: Fri Sep 14 17:40:57 2001
-%%Creator: Tgif-4.1.35 by William Chia-Wei Cheng (william@cs.UCLA.edu)
-%%ProducedBy: (unknown)
-%%Pages: 1
-%%DocumentFonts: (atend)
-%%EndComments
-%%BeginProlog
-
-% Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007
-%   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, 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; see the file COPYING.  If not, write to
-% the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-% Boston, MA 02110-1301, USA.
-
-/tgifdict 53 dict def
-tgifdict begin
-
-/tgifellipsedict 6 dict def
-tgifellipsedict /mtrx matrix put
-
-/TGEL % tgifellipse
- { tgifellipsedict begin
-      /yrad exch def
-      /xrad exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      xrad yrad scale
-      0 0 1 0 360 arc
-      savematrix setmatrix
-   end
- } def
-
-/TGMAX
- { exch dup 3 1 roll exch dup 3 1 roll gt { pop } { exch pop } ifelse
- } def
-/TGMIN
- { exch dup 3 1 roll exch dup 3 1 roll lt { pop } { exch pop } ifelse
- } def
-/TGSW { stringwidth pop } def
-
-/bd { bind def } bind def
-
-/GS { gsave } bd
-/GR { grestore } bd
-/NP { newpath } bd
-/CP { closepath } bd
-/CHP { charpath } bd
-/CT { curveto } bd
-/L { lineto } bd
-/RL { rlineto } bd
-/M { moveto } bd
-/RM { rmoveto } bd
-/S { stroke } bd
-/F { fill } bd
-/TR { translate } bd
-/RO { rotate } bd
-/SC { scale } bd
-/MU { mul } bd
-/DI { div } bd
-/DU { dup } bd
-/NE { neg } bd
-/AD { add } bd
-/SU { sub } bd
-/PO { pop } bd
-/EX { exch } bd
-/CO { concat } bd
-/CL { clip } bd
-/EC { eoclip } bd
-/EF { eofill } bd
-/IM { image } bd
-/IMM { imagemask } bd
-/ARY { array } bd
-/SG { setgray } bd
-/RG { setrgbcolor } bd
-/SD { setdash } bd
-/W { setlinewidth } bd
-/SM { setmiterlimit } bd
-/SLC { setlinecap } bd
-/SLJ { setlinejoin } bd
-/SH { show } bd
-/FF { findfont } bd
-/MS { makefont setfont } bd
-/AR { arcto 4 {pop} repeat } bd
-/CURP { currentpoint } bd
-/FLAT { flattenpath strokepath clip newpath } bd
-/TGSM { tgiforigctm setmatrix } def
-/TGRM { savematrix setmatrix } def
-
-end
-
-%%EndProlog
-%%Page: 1 1
-
-%%PageBoundingBox: 34 577 324 778
-tgifdict begin
-/tgifsavedpage save def
-
-1 SM
-1 W
-
-0 SG
-
-72 0 MU 72 11 MU TR
-72 128 DI 100.000 MU 100 DI DU NE SC
-
-GS
-
-/tgiforigctm matrix currentmatrix def
-
-% BOX
-0 SG
-GS
-   10 SM
-   GS
-      NP 64 104 M 255 104 L 255 360 L 64 360 L CP
-      S
-   GR
-GR
-
-% POLY/OPEN-SPLINE
-0 SG
-GS
-   NP
-      65 296 M
-      254 296 L
-   TGSM
-   1 W
-   S
-GR
-
-% POLY/OPEN-SPLINE
-0 SG
-GS
-   NP
-      63 233 M
-      255 233 L
-   TGSM
-   1 W
-   S
-GR
-
-% POLY/OPEN-SPLINE
-0 SG
-GS
-   NP
-      63 169 M
-      255 169 L
-   TGSM
-   1 W
-   S
-GR
-
-% POLY/OPEN-SPLINE
-0 SG
-GS
-   NP
-      251 362 M
-      251 361 L
-      251 379 L
-      244 379 L
-      229 361 L
-   TGSM
-   1 W
-   S
-GR
-
-% OVAL
-0 SG
-GS
-   GS
-      NP 160 72 10 6 TGEL
-      S
-   GR
-GR
-
-% POLY/OPEN-SPLINE
-0 SG
-GS
-   NP
-      63 104 M
-      128 64 L
-      138 69 L
-   TGSM
-   1 W
-   S
-GR
-
-% POLY/OPEN-SPLINE
-0 SG
-GS
-   NP
-      255 103 M
-      190 63 L
-      180 68 L
-   TGSM
-   1 W
-   S
-GR
-
-% TEXT
-NP
-0 SG
-   GS
-      1 W
-      160 152 M
-      GS
-        GS
-        0
-            /Courier FF [17 0 0 -17 0 0] MS
-            (symbol name) TGSW 
-        AD
-        GR
-      2 DI NE 0 RM
-            0 SG
-            /Courier FF [17 0 0 -17 0 0] MS
-            (symbol name) SH
-      GR
-   GR
-
-% TEXT
-NP
-0 SG
-   GS
-      1 W
-      160 41 M
-      GS
-        GS
-        0
-            /Courier FF [17 0 0 -17 0 0] MS
-            (Chest of Drawers) TGSW 
-        AD
-        GR
-      2 DI NE 0 RM
-            0 SG
-            /Courier FF [17 0 0 -17 0 0] MS
-            (Chest of Drawers) SH
-      GR
-   GR
-
-% TEXT
-NP
-0 SG
-   GS
-      1 W
-      344 41 M
-      GS
-            0 SG
-            /Courier FF [17 0 0 -17 0 0] MS
-            (Contents of Drawers) SH
-      GR
-   GR
-
-% TEXT
-NP
-0 SG
-   GS
-      1 W
-      344 160 M
-      GS
-            0 SG
-            /Courier FF [17 0 0 -17 0 0] MS
-            (bouquet) SH
-      GR
-   GR
-
-% TEXT
-NP
-0 SG
-   GS
-      1 W
-      344 220 M
-      GS
-            0 SG
-            /Courier FF [17 0 0 -17 0 0] MS
-            ([none]) SH
-      GR
-   GR
-
-% TEXT
-NP
-0 SG
-   GS
-      1 W
-      344 279 M
-      GS
-            0 SG
-            /Courier FF [17 0 0 -17 0 0] MS
-            (\(rose violet buttercup\)) SH
-      GR
-   GR
-
-% TEXT
-NP
-0 SG
-   GS
-      1 W
-      344 337 M
-      GS
-            0 SG
-            /Courier FF [17 0 0 -17 0 0] MS
-            ([not described here]) SH
-      GR
-   GR
-
-% POLY/OPEN-SPLINE
-0 SG
-GS
-   NP
-      68 362 M
-      68 361 L
-      68 379 L
-      75 379 L
-      90 361 L
-   TGSM
-   1 W
-   S
-GR
-
-% TEXT
-NP
-0 SG
-   GS
-      1 W
-      158 132 M
-      GS
-        GS
-        0
-            /NewCenturySchlbk-Roman FF [17 0 0 -17 0 0] MS
-            (directions to) TGSW 
-        AD
-        GR
-      2 DI NE 0 RM
-            0 SG
-            /NewCenturySchlbk-Roman FF [17 0 0 -17 0 0] MS
-            (directions to) SH
-      GR
-   GR
-
-% TEXT
-NP
-0 SG
-   GS
-      1 W
-      345 139 M
-      GS
-            0 SG
-            /NewCenturySchlbk-Roman FF [17 0 0 -17 0 0] MS
-            (map to) SH
-      GR
-   GR
-
-% TEXT
-NP
-0 SG
-   GS
-      1 W
-      350 259 M
-      GS
-            0 SG
-            /NewCenturySchlbk-Roman FF [17 0 0 -17 0 0] MS
-            (map to) SH
-      GR
-   GR
-
-% TEXT
-NP
-0 SG
-   GS
-      1 W
-      159 213 M
-      GS
-        GS
-        0
-            /Courier FF [17 0 0 -17 0 0] MS
-            (symbol definition) TGSW 
-        AD
-        GR
-      2 DI NE 0 RM
-            0 SG
-            /Courier FF [17 0 0 -17 0 0] MS
-            (symbol definition) SH
-      GR
-   GR
-
-% TEXT
-NP
-0 SG
-   GS
-      1 W
-      159 195 M
-      GS
-        GS
-        0
-            /NewCenturySchlbk-Roman FF [17 0 0 -17 0 0] MS
-            (directions to) TGSW 
-        AD
-        GR
-      2 DI NE 0 RM
-            0 SG
-            /NewCenturySchlbk-Roman FF [17 0 0 -17 0 0] MS
-            (directions to) SH
-      GR
-   GR
-
-% TEXT
-NP
-0 SG
-   GS
-      1 W
-      160 276 M
-      GS
-        GS
-        0
-            /Courier FF [17 0 0 -17 0 0] MS
-            (variable name) TGSW 
-        AD
-        GR
-      2 DI NE 0 RM
-            0 SG
-            /Courier FF [17 0 0 -17 0 0] MS
-            (variable name) SH
-      GR
-   GR
-
-% TEXT
-NP
-0 SG
-   GS
-      1 W
-      158 260 M
-      GS
-        GS
-        0
-            /NewCenturySchlbk-Roman FF [17 0 0 -17 0 0] MS
-            (directions to) TGSW 
-        AD
-        GR
-      2 DI NE 0 RM
-            0 SG
-            /NewCenturySchlbk-Roman FF [17 0 0 -17 0 0] MS
-            (directions to) SH
-      GR
-   GR
-
-% TEXT
-NP
-0 SG
-   GS
-      1 W
-      160 339 M
-      GS
-        GS
-        0
-            /Courier FF [17 0 0 -17 0 0] MS
-            (property list) TGSW 
-        AD
-        GR
-      2 DI NE 0 RM
-            0 SG
-            /Courier FF [17 0 0 -17 0 0] MS
-            (property list) SH
-      GR
-   GR
-
-% TEXT
-NP
-0 SG
-   GS
-      1 W
-      158 323 M
-      GS
-        GS
-        0
-            /NewCenturySchlbk-Roman FF [17 0 0 -17 0 0] MS
-            (directions to) TGSW 
-        AD
-        GR
-      2 DI NE 0 RM
-            0 SG
-            /NewCenturySchlbk-Roman FF [17 0 0 -17 0 0] MS
-            (directions to) SH
-      GR
-   GR
-
-GR
-tgifsavedpage restore
-end
-showpage
-
-%%Trailer
-%MatchingCreationDate: Fri Sep 14 17:40:57 2001
-%%DocumentFonts: NewCenturySchlbk-Roman
-%%+ Courier
-%%EOF
diff --git a/lispintro/emacs-lisp-intro.texi b/lispintro/emacs-lisp-intro.texi
deleted file mode 100644 (file)
index a08d7a6..0000000
+++ /dev/null
@@ -1,22721 +0,0 @@
-\input texinfo                                      @c -*-texinfo-*-
-@comment %**start of header
-@setfilename ../info/eintr
-@c setfilename emacs-lisp-intro.info
-@c sethtmlfilename emacs-lisp-intro.html
-@settitle Programming in Emacs Lisp
-@syncodeindex vr cp
-@syncodeindex fn cp
-@setchapternewpage odd
-@finalout
-
-@c ---------
-@c <<<< For hard copy printing, this file is now
-@c      set for smallbook, which works for all sizes
-@c      of paper, and with Postscript figures >>>>
-@smallbook
-@clear  largebook
-@set print-postscript-figures
-@c set largebook
-@c clear print-postscript-figures
-@c ---------
-
-@comment %**end of header
-
-@set edition-number 3.07
-@set update-date 9 November 2006
-
-@ignore
- ## Summary of shell commands to create various output formats:
-
-    pushd /usr/local/src/emacs/lispintro/
-    ## pushd /u/intro/
-
-    ## Info output
-    makeinfo --paragraph-indent=0 --verbose emacs-lisp-intro.texi
-
-      ## ;; (progn (when (bufferp (get-buffer "*info*")) (kill-buffer "*info*")) (info "/usr/local/src/emacs/info/eintr"))
-
-    ## DVI output
-    texi2dvi emacs-lisp-intro.texi
-
-      ## xdvi -margins 24pt -topmargin 4pt -offsets 24pt -geometry 760x1140 -s 5 -useTeXpages -mousemode 1 emacs-lisp-intro.dvi &
-
-    ## HTML output
-    makeinfo --html --no-split --verbose emacs-lisp-intro.texi
-
-      ## galeon emacs-lisp-intro.html
-
-    ## Plain text output
-    makeinfo --fill-column=70 --no-split --paragraph-indent=0 \
-    --verbose --no-headers --output=emacs-lisp-intro.txt emacs-lisp-intro.texi
-
-    popd
-
-# as user `root'
-# insert thumbdrive
-  mtusb       #   mount -v -t ext3 /dev/sda /mnt
-  cp -v /u/intro/emacs-lisp-intro.texi /mnt/backup/intro/emacs-lisp-intro.texi
-  umtusb      #   umount -v /mnt
-# remove thumbdrive
-
-    ## Other shell commands
-
-    pushd /usr/local/src/emacs/lispintro/
-    ## pushd /u/intro/
-
-    ## PDF
-    texi2dvi --pdf emacs-lisp-intro.texi
-       # xpdf emacs-lisp-intro.pdf &
-
-    ## DocBook                    -- note file extension
-    makeinfo --docbook --no-split --paragraph-indent=0 \
-    --verbose --output=emacs-lisp-intro.docbook emacs-lisp-intro.texi
-
-    ## XML with a Texinfo DTD     -- note file extension
-    makeinfo --xml --no-split --paragraph-indent=0 \
-    --verbose --output=emacs-lisp-intro.texinfoxml emacs-lisp-intro.texi
-
-    ## PostScript (needs DVI)
-        #     gv emacs-lisp-intro.ps &
-        # Create DVI if we lack it
-        # texi2dvi emacs-lisp-intro.texi
-    dvips emacs-lisp-intro.dvi -o emacs-lisp-intro.ps
-
-    ## RTF (needs HTML)
-        # Use OpenOffice to view RTF
-        # Create HTML if we lack it
-        # makeinfo --no-split --html emacs-lisp-intro.texi
-    /usr/local/src/html2rtf.pl emacs-lisp-intro.html
-
-    ## LaTeX (needs RTF)
-    /usr/bin/rtf2latex emacs-lisp-intro.rtf
-
-    popd
-
-@end ignore
-
-@c ================ Included Figures ================
-
-@c Set  print-postscript-figures  if you print PostScript figures.
-@c If you clear this, the ten figures will be printed as ASCII diagrams.
-@c (This is not relevant to Info, since Info only handles ASCII.)
-@c Your site may require editing changes to print PostScript; in this
-@c case, search for `print-postscript-figures' and make appropriate changes.
-
-@c ================ How to Create an Info file ================
-
-@c If you have `makeinfo' installed, run the following command
-
-@c     makeinfo emacs-lisp-intro.texi
-
-@c or, if you want a single, large Info file, and no paragraph indents:
-@c     makeinfo --no-split --paragraph-indent=0 --verbose emacs-lisp-intro.texi
-
-@c After creating the Info file, edit your Info `dir' file, if the
-@c `dircategory' section below does not enable your system to
-@c install the manual automatically.
-@c (The `dir' file is often in the `/usr/local/share/info/' directory.)
-
-@c ================ How to Create an HTML file ================
-
-@c To convert to HTML format
-@c     makeinfo --html --no-split --verbose emacs-lisp-intro.texi
-
-@c ================ How to Print a Book in Various Sizes ================
-
-@c This book can be printed in any of three different sizes.
-@c In the above header, set @-commands appropriately.
-
-@c     7 by 9.25 inches:
-@c              @smallbook
-@c              @clear largebook
-
-@c     8.5 by 11 inches:
-@c              @c smallbook
-@c              @set largebook
-
-@c     European A4 size paper:
-@c              @c smallbook
-@c              @afourpaper
-@c              @set largebook
-
-@c ================ How to Typeset and Print ================
-
-@c If you do not include PostScript figures, run either of the
-@c following command sequences, or similar commands suited to your
-@c system:
-
-@c     texi2dvi emacs-lisp-intro.texi
-@c     lpr -d emacs-lisp-intro.dvi
-
-@c or else:
-
-@c     tex emacs-lisp-intro.texi
-@c     texindex emacs-lisp-intro.??
-@c     tex emacs-lisp-intro.texi
-@c     lpr -d emacs-lisp-intro.dvi
-
-@c If you include the PostScript figures, and you have old software,
-@c you may need to convert the .dvi file to a .ps file before
-@c printing.  Run either of the following command sequences, or one
-@c similar:
-@c
-@c     dvips -f < emacs-lisp-intro.dvi > emacs-lisp-intro.ps
-@c
-@c or else:
-@c
-@c     postscript -p < emacs-lisp-intro.dvi > emacs-lisp-intro.ps
-@c
-
-@c (Note: if you edit the book so as to change the length of the
-@c table of contents, you may have to change the value of `pageno' below.)
-
-@c ================ End of Formatting Sections ================
-
-@c For next or subsequent edition:
-@c   create function using with-output-to-temp-buffer
-@c   create a major mode, with keymaps
-@c   run an asynchronous process, like grep or diff
-
-@c For 8.5 by 11 inch format: do not use such a small amount of
-@c whitespace between paragraphs as smallbook format
-@ifset largebook
-@tex
-\global\parskip 6pt plus 1pt
-@end tex
-@end ifset
-
-@c For all sized formats:  print within-book cross
-@c reference with ``...''  rather than [...]
-
-@c This works with the texinfo.tex file, version 2003-05-04.08,
-@c in the Texinfo version 4.6 of the 2003 Jun 13 distribution.
-
-@tex
-\if \xrefprintnodename
- \global\def\xrefprintnodename#1{\unskip, ``#1''}
- \else
- \global\def\xrefprintnodename#1{ ``#1''}
-\fi
-% \global\def\xrefprintnodename#1{, ``#1''}
-@end tex
-
-@c ----------------------------------------------------
-
-@dircategory Emacs
-@direntry
-* Emacs Lisp Intro: (eintr).
-                          A simple introduction to Emacs Lisp programming.
-@end direntry
-
-@copying
-This is an @cite{Introduction to Programming in Emacs Lisp}, for
-people who are not programmers.
-@sp 1
-Edition @value{edition-number}, @value{update-date}
-@sp 1
-Copyright @copyright{} 1990, 1991, 1992, 1993, 1994, 1995, 1997, 2001,
-   2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
-@sp 1
-
-@iftex
-Published by the:@*
-
-GNU Press,                      @hfill  @uref{http://www.gnupress.org}@*
-a division of the               @hfill General: @email{press@@gnu.org}@*
-Free Software Foundation, Inc.  @hfill Orders:@w{ }  @email{sales@@gnu.org}@*
-51 Franklin Street, Fifth Floor @hfill Tel: +1 (617) 542-5942@*
-Boston, MA 02110-1301 USA       @hfill Fax: +1 (617) 542-2652@*
-@end iftex
-
-@ifnottex
-Published by the:
-
-@example
-GNU Press,                          Website: http://www.gnupress.org
-a division of the                   General: press@@gnu.org
-Free Software Foundation, Inc.      Orders:  sales@@gnu.org
-51 Franklin Street, Fifth Floor     Tel: +1 (617) 542-5942
-Boston, MA 02110-1301 USA           Fax: +1 (617) 542-2652
-@end example
-@end ifnottex
-
-@sp 1
-@c Printed copies are available for $30 each.@*
-ISBN 1-882114-43-4
-
-Permission is granted to copy, distribute and/or modify this document
-under the terms of the GNU Free Documentation License, Version 1.2 or
-any later version published by the Free Software Foundation; there
-being no Invariant Section, with the Front-Cover Texts being ``A GNU
-Manual'', and with the Back-Cover Texts as in (a) below.  A copy of
-the license is included in the section entitled ``GNU Free
-Documentation License''.
-
-(a) The FSF's Back-Cover Text is: ``You have freedom to copy and
-modify this GNU Manual, like GNU software.  Copies published by the
-Free Software Foundation raise funds for GNU development.''
-@end copying
-
-@c half title; two lines here, so do not use `shorttitlepage'
-@tex
-{\begingroup%
-    \hbox{}\vskip 1.5in \chaprm \centerline{An Introduction to}%
-        \endgroup}%
-{\begingroup\hbox{}\vskip 0.25in \chaprm%
-        \centerline{Programming in Emacs Lisp}%
-        \endgroup\page\hbox{}\page}
-@end tex
-
-@titlepage
-@sp 6
-@center @titlefont{An Introduction to}
-@sp 2
-@center @titlefont{Programming in Emacs Lisp}
-@sp 2
-@center Revised Third Edition
-@sp 4
-@center by Robert J. Chassell
-
-@page
-@vskip 0pt plus 1filll
-@insertcopying
-@end titlepage
-
-@iftex
-@headings off
-@evenheading @thispage @| @| @thischapter
-@oddheading @thissection @| @| @thispage
-@end iftex
-
-@ifnothtml
-@c     Keep T.O.C. short by tightening up for largebook
-@ifset largebook
-@tex
-\global\parskip 2pt plus 1pt
-\global\advance\baselineskip by -1pt
-@end tex
-@end ifset
-@end ifnothtml
-
-@shortcontents
-@contents
-
-@ifnottex
-@node Top, Preface, (dir), (dir)
-@top An Introduction to Programming in Emacs Lisp
-
-@insertcopying
-
-This master menu first lists each chapter and index; then it lists
-every node in every chapter.
-@end ifnottex
-
-@c >>>> Set pageno appropriately <<<<
-
-@c The first page of the Preface is a roman numeral; it is the first
-@c right handed page after the Table of Contents; hence the following
-@c setting must be for an odd negative number.
-
-@iftex
-@global@pageno = -11
-@end iftex
-
-@menu
-* Preface::                     What to look for.
-* List Processing::             What is Lisp?
-* Practicing Evaluation::       Running several programs.
-* Writing Defuns::              How to write function definitions.
-* Buffer Walk Through::         Exploring a few buffer-related functions.
-* More Complex::                A few, even more complex functions.
-* Narrowing & Widening::        Restricting your and Emacs attention to
-                                    a region.
-* car cdr & cons::              Fundamental functions in Lisp.
-* Cutting & Storing Text::      Removing text and saving it.
-* List Implementation::         How lists are implemented in the computer.
-* Yanking::                     Pasting stored text.
-* Loops & Recursion::           How to repeat a process.
-* Regexp Search::               Regular expression searches.
-* Counting Words::              A review of repetition and regexps.
-* Words in a defun::            Counting words in a @code{defun}.
-* Readying a Graph::            A prototype graph printing function.
-* Emacs Initialization::        How to write a @file{.emacs} file.
-* Debugging::                   How to run the Emacs Lisp debuggers.
-* Conclusion::                  Now you have the basics.
-* the-the::                     An appendix: how to find reduplicated words.
-* Kill Ring::                   An appendix: how the kill ring works.
-* Full Graph::                  How to create a graph with labelled axes.
-* Free Software and Free Manuals::
-* GNU Free Documentation License::
-* Index::
-* About the Author::
-
-@detailmenu
- --- The Detailed Node Listing ---
-
-Preface
-
-* Why::                         Why learn Emacs Lisp?
-* On Reading this Text::        Read, gain familiarity, pick up habits....
-* Who You Are::                 For whom this is written.
-* Lisp History::
-* Note for Novices::            You can read this as a novice.
-* Thank You::
-
-List Processing
-
-* Lisp Lists::                  What are lists?
-* Run a Program::               Any list in Lisp is a program ready to run.
-* Making Errors::               Generating an error message.
-* Names & Definitions::         Names of symbols and function definitions.
-* Lisp Interpreter::            What the Lisp interpreter does.
-* Evaluation::                  Running a program.
-* Variables::                   Returning a value from a variable.
-* Arguments::                   Passing information to a function.
-* set & setq::                  Setting the value of a variable.
-* Summary::                     The major points.
-* Error Message Exercises::
-
-Lisp Lists
-
-* Numbers Lists::               List have numbers, other lists, in them.
-* Lisp Atoms::                  Elemental entities.
-* Whitespace in Lists::         Formatting lists to be readable.
-* Typing Lists::                How GNU Emacs helps you type lists.
-
-The Lisp Interpreter
-
-* Complications::               Variables, Special forms, Lists within.
-* Byte Compiling::              Specially processing code for speed.
-
-Evaluation
-
-* How the Interpreter Acts::    Returns and Side Effects...
-* Evaluating Inner Lists::      Lists within lists...
-
-Variables
-
-* fill-column Example::
-* Void Function::               The error message for a symbol
-                                  without a function.
-* Void Variable::               The error message for a symbol without a value.
-
-Arguments
-
-* Data types::                  Types of data passed to a function.
-* Args as Variable or List::    An argument can be the value
-                                  of a variable or list.
-* Variable Number of Arguments::  Some functions may take a
-                                  variable number of arguments.
-* Wrong Type of Argument::      Passing an argument of the wrong type
-                                  to a function.
-* message::                     A useful function for sending messages.
-
-Setting the Value of a Variable
-
-* Using set::                  Setting values.
-* Using setq::                 Setting a quoted value.
-* Counting::                   Using @code{setq} to count.
-
-Practicing Evaluation
-
-* How to Evaluate::            Typing editing commands or @kbd{C-x C-e}
-                                 causes evaluation.
-* Buffer Names::               Buffers and files are different.
-* Getting Buffers::            Getting a buffer itself, not merely its name.
-* Switching Buffers::          How to change to another buffer.
-* Buffer Size & Locations::    Where point is located and the size of
-                               the buffer.
-* Evaluation Exercise::
-
-How To Write Function Definitions
-
-* Primitive Functions::
-* defun::                        The @code{defun} special form.
-* Install::                      Install a function definition.
-* Interactive::                  Making a function interactive.
-* Interactive Options::          Different options for @code{interactive}.
-* Permanent Installation::       Installing code permanently.
-* let::                          Creating and initializing local variables.
-* if::                           What if?
-* else::                         If--then--else expressions.
-* Truth & Falsehood::            What Lisp considers false and true.
-* save-excursion::               Keeping track of point, mark, and buffer.
-* Review::
-* defun Exercises::
-
-Install a Function Definition
-
-* Effect of installation::
-* Change a defun::              How to change a function definition.
-
-Make a Function Interactive
-
-* Interactive multiply-by-seven::  An overview.
-* multiply-by-seven in detail::    The interactive version.
-
-@code{let}
-
-* Prevent confusion::
-* Parts of let Expression::
-* Sample let Expression::
-* Uninitialized let Variables::
-
-The @code{if} Special Form
-
-* if in more detail::
-* type-of-animal in detail::    An example of an @code{if} expression.
-
-Truth and Falsehood in Emacs Lisp
-
-* nil explained::               @code{nil} has two meanings.
-
-@code{save-excursion}
-
-* Point and mark::              A review of various locations.
-* Template for save-excursion::
-
-A Few Buffer--Related Functions
-
-* Finding More::                How to find more information.
-* simplified-beginning-of-buffer::  Shows @code{goto-char},
-                                @code{point-min}, and @code{push-mark}.
-* mark-whole-buffer::           Almost the same as @code{beginning-of-buffer}.
-* append-to-buffer::            Uses @code{save-excursion} and
-                                @code{insert-buffer-substring}.
-* Buffer Related Review::       Review.
-* Buffer Exercises::
-
-The Definition of @code{mark-whole-buffer}
-
-* mark-whole-buffer overview::
-* Body of mark-whole-buffer::   Only three lines of code.
-
-The Definition of @code{append-to-buffer}
-
-* append-to-buffer overview::
-* append interactive::          A two part interactive expression.
-* append-to-buffer body::       Incorporates a @code{let} expression.
-* append save-excursion::       How the @code{save-excursion} works.
-
-A Few More Complex Functions
-
-* copy-to-buffer::              With @code{set-buffer}, @code{get-buffer-create}.
-* insert-buffer::               Read-only, and with @code{or}.
-* beginning-of-buffer::         Shows @code{goto-char},
-                                @code{point-min}, and @code{push-mark}.
-* Second Buffer Related Review::
-* optional Exercise::
-
-The Definition of @code{insert-buffer}
-
-* insert-buffer code::
-* insert-buffer interactive::   When you can read, but not write.
-* insert-buffer body::          The body has an @code{or} and a @code{let}.
-* if & or::                     Using an @code{if} instead of an @code{or}.
-* Insert or::                   How the @code{or} expression works.
-* Insert let::                  Two @code{save-excursion} expressions.
-* New insert-buffer::
-
-The Interactive Expression in @code{insert-buffer}
-
-* Read-only buffer::            When a buffer cannot be modified.
-* b for interactive::           An existing buffer or else its name.
-
-Complete Definition of @code{beginning-of-buffer}
-
-* Optional Arguments::
-* beginning-of-buffer opt arg::  Example with optional argument.
-* beginning-of-buffer complete::
-
-@code{beginning-of-buffer} with an Argument
-
-* Disentangle beginning-of-buffer::
-* Large buffer case::
-* Small buffer case::
-
-Narrowing and Widening
-
-* Narrowing advantages::        The advantages of narrowing
-* save-restriction::            The @code{save-restriction} special form.
-* what-line::                   The number of the line that point is on.
-* narrow Exercise::
-
-@code{car}, @code{cdr}, @code{cons}: Fundamental Functions
-
-* Strange Names::               An historical aside: why the strange names?
-* car & cdr::                   Functions for extracting part of a list.
-* cons::                        Constructing a list.
-* nthcdr::                      Calling @code{cdr} repeatedly.
-* nth::
-* setcar::                      Changing the first element of a list.
-* setcdr::                      Changing the rest of a list.
-* cons Exercise::
-
-@code{cons}
-
-* Build a list::
-* length::                      How to find the length of a list.
-
-Cutting and Storing Text
-
-* Storing Text::                Text is stored in a list.
-* zap-to-char::                 Cutting out text up to a character.
-* kill-region::                 Cutting text out of a region.
-* copy-region-as-kill::         A definition for copying text.
-* Digression into C::           Minor note on C programming language macros.
-* defvar::                      How to give a variable an initial value.
-* cons & search-fwd Review::
-* search Exercises::
-
-@code{zap-to-char}
-
-* Complete zap-to-char::        The complete implementation.
-* zap-to-char interactive::     A three part interactive expression.
-* zap-to-char body::            A short overview.
-* search-forward::              How to search for a string.
-* progn::                       The @code{progn} special form.
-* Summing up zap-to-char::      Using @code{point} and @code{search-forward}.
-
-@code{kill-region}
-
-* Complete kill-region::        The function definition.
-* condition-case::              Dealing with a problem.
-* Lisp macro::
-
-@code{copy-region-as-kill}
-
-* Complete copy-region-as-kill::  The complete function definition.
-* copy-region-as-kill body::      The body of @code{copy-region-as-kill}.
-
-The Body of @code{copy-region-as-kill}
-
-* last-command & this-command::
-* kill-append function::
-* kill-new function::
-
-Initializing a Variable with @code{defvar}
-
-* See variable current value::
-* defvar and asterisk::
-
-How Lists are Implemented
-
-* Lists diagrammed::
-* Symbols as Chest::            Exploring a powerful metaphor.
-* List Exercise::
-
-Yanking Text Back
-
-* Kill Ring Overview::
-* kill-ring-yank-pointer::      The kill ring is a list.
-* yank nthcdr Exercises::       The @code{kill-ring-yank-pointer} variable.
-
-Loops and Recursion
-
-* while::                       Causing a stretch of code to repeat.
-* dolist dotimes::
-* Recursion::                   Causing a function to call itself.
-* Looping exercise::
-
-@code{while}
-
-* Looping with while::          Repeat so long as test returns true.
-* Loop Example::                A @code{while} loop that uses a list.
-* print-elements-of-list::      Uses @code{while}, @code{car}, @code{cdr}.
-* Incrementing Loop::           A loop with an incrementing counter.
-* Incrementing Loop Details::
-* Decrementing Loop::           A loop with a decrementing counter.
-
-Details of an Incrementing Loop
-
-* Incrementing Example::        Counting pebbles in a triangle.
-* Inc Example parts::           The parts of the function definition.
-* Inc Example altogether::      Putting the function definition together.
-
-Loop with a Decrementing Counter
-
-* Decrementing Example::        More pebbles on the beach.
-* Dec Example parts::           The parts of the function definition.
-* Dec Example altogether::      Putting the function definition together.
-
-Save your time: @code{dolist} and @code{dotimes}
-
-* dolist::
-* dotimes::
-
-Recursion
-
-* Building Robots::             Same model, different serial number ...
-* Recursive Definition Parts::  Walk until you stop ...
-* Recursion with list::         Using a list as the test whether to recurse.
-* Recursive triangle function::
-* Recursion with cond::
-* Recursive Patterns::          Often used templates.
-* No Deferment::                Don't store up work ...
-* No deferment solution::
-
-Recursion in Place of a Counter
-
-* Recursive Example arg of 1 or 2::
-* Recursive Example arg of 3 or 4::
-
-Recursive Patterns
-
-* Every::
-* Accumulate::
-* Keep::
-
-Regular Expression Searches
-
-* sentence-end::                The regular expression for @code{sentence-end}.
-* re-search-forward::           Very similar to @code{search-forward}.
-* forward-sentence::            A straightforward example of regexp search.
-* forward-paragraph::           A somewhat complex example.
-* etags::                       How to create your own @file{TAGS} table.
-* Regexp Review::
-* re-search Exercises::
-
-@code{forward-sentence}
-
-* Complete forward-sentence::
-* fwd-sentence while loops::    Two @code{while} loops.
-* fwd-sentence re-search::      A regular expression search.
-
-@code{forward-paragraph}: a Goldmine of Functions
-
-* forward-paragraph in brief::  Key parts of the function definition.
-* fwd-para let::                The @code{let*} expression.
-* fwd-para while::              The forward motion @code{while} loop.
-
-Counting: Repetition and Regexps
-
-* Why Count Words::
-* count-words-region::          Use a regexp, but find a problem.
-* recursive-count-words::       Start with case of no words in region.
-* Counting Exercise::
-
-The @code{count-words-region} Function
-
-* Design count-words-region::   The definition using a @code{while} loop.
-* Whitespace Bug::              The Whitespace Bug in @code{count-words-region}.
-
-Counting Words in a @code{defun}
-
-* Divide and Conquer::
-* Words and Symbols::           What to count?
-* Syntax::                      What constitutes a word or symbol?
-* count-words-in-defun::        Very like @code{count-words}.
-* Several defuns::              Counting several defuns in a file.
-* Find a File::                 Do you want to look at a file?
-* lengths-list-file::           A list of the lengths of many definitions.
-* Several files::               Counting in definitions in different files.
-* Several files recursively::   Recursively counting in different files.
-* Prepare the data::            Prepare the data for display in a graph.
-
-Count Words in @code{defuns} in Different Files
-
-* lengths-list-many-files::     Return a list of the lengths of defuns.
-* append::                      Attach one list to another.
-
-Prepare the Data for Display in a Graph
-
-* Data for Display in Detail::
-* Sorting::                     Sorting lists.
-* Files List::                  Making a list of files.
-* Counting function definitions::
-
-Readying a Graph
-
-* Columns of a graph::
-* graph-body-print::            How to print the body of a graph.
-* recursive-graph-body-print::
-* Printed Axes::
-* Line Graph Exercise::
-
-Your @file{.emacs} File
-
-* Default Configuration::
-* Site-wide Init::              You can write site-wide init files.
-* defcustom::                   Emacs will write code for you.
-* Beginning a .emacs File::     How to write a @code{.emacs file}.
-* Text and Auto-fill::          Automatically wrap lines.
-* Mail Aliases::                Use abbreviations for email addresses.
-* Indent Tabs Mode::            Don't use tabs with @TeX{}
-* Keybindings::                 Create some personal keybindings.
-* Keymaps::                     More about key binding.
-* Loading Files::               Load (i.e., evaluate) files automatically.
-* Autoload::                    Make functions available.
-* Simple Extension::            Define a function; bind it to a key.
-* X11 Colors::                  Colors in X.
-* Miscellaneous::
-* Mode Line::                   How to customize your mode line.
-
-Debugging
-
-* debug::                       How to use the built-in debugger.
-* debug-on-entry::              Start debugging when you call a function.
-* debug-on-quit::               Start debugging when you quit with @kbd{C-g}.
-* edebug::                      How to use Edebug, a source level debugger.
-* Debugging Exercises::
-
-Handling the Kill Ring
-
-* What the Kill Ring Does::
-* current-kill::
-* yank::                        Paste a copy of a clipped element.
-* yank-pop::                    Insert element pointed to.
-* ring file::
-
-The @code{current-kill} Function
-
-* Understanding current-kill::
-
-@code{current-kill} in Outline
-
-* Body of current-kill::
-* Digression concerning error::  How to mislead humans, but not computers.
-* Determining the Element::
-
-A Graph with Labelled Axes
-
-* Labelled Example::
-* print-graph Varlist::         @code{let} expression in @code{print-graph}.
-* print-Y-axis::                Print a label for the vertical axis.
-* print-X-axis::                Print a horizontal label.
-* Print Whole Graph::           The function to print a complete graph.
-
-The @code{print-Y-axis} Function
-
-* print-Y-axis in Detail::
-* Height of label::             What height for the Y axis?
-* Compute a Remainder::         How to compute the remainder of a division.
-* Y Axis Element::              Construct a line for the Y axis.
-* Y-axis-column::               Generate a list of Y axis labels.
-* print-Y-axis Penultimate::    A not quite final version.
-
-The @code{print-X-axis} Function
-
-* Similarities differences::    Much like @code{print-Y-axis}, but not exactly.
-* X Axis Tic Marks::            Create tic marks for the horizontal axis.
-
-Printing the Whole Graph
-
-* The final version::           A few changes.
-* Test print-graph::            Run a short test.
-* Graphing words in defuns::    Executing the final code.
-* lambda::                      How to write an anonymous function.
-* mapcar::                      Apply a function to elements of a list.
-* Another Bug::                 Yet another bug @dots{} most insidious.
-* Final printed graph::         The graph itself!
-
-@end detailmenu
-@end menu
-
-@node Preface, List Processing, Top, Top
-@comment  node-name,  next,  previous,  up
-@unnumbered Preface
-
-Most of the GNU Emacs integrated environment is written in the programming
-language called Emacs Lisp.  The code written in this programming
-language is the software---the sets of instructions---that tell the
-computer what to do when you give it commands.  Emacs is designed so
-that you can write new code in Emacs Lisp and easily install it as an
-extension to the editor.
-
-(GNU Emacs is sometimes called an ``extensible editor'', but it does
-much more than provide editing capabilities.  It is better to refer to
-Emacs as an ``extensible computing environment''.  However, that
-phrase is quite a mouthful.  It is easier to refer to Emacs simply as
-an editor.  Moreover, everything you do in Emacs---find the Mayan date
-and phases of the moon, simplify polynomials, debug code, manage
-files, read letters, write books---all these activities are kinds of
-editing in the most general sense of the word.)
-
-@menu
-* Why::                         Why learn Emacs Lisp?
-* On Reading this Text::        Read, gain familiarity, pick up habits....
-* Who You Are::                 For whom this is written.
-* Lisp History::
-* Note for Novices::            You can read this as a novice.
-* Thank You::
-@end menu
-
-@node Why, On Reading this Text, Preface, Preface
-@ifnottex
-@unnumberedsec Why Study Emacs Lisp?
-@end ifnottex
-
-Although Emacs Lisp is usually thought of in association only with Emacs,
-it is a full computer programming language.  You can use Emacs Lisp as
-you would any other programming language.
-
-Perhaps you want to understand programming; perhaps you want to extend
-Emacs; or perhaps you want to become a programmer.  This introduction to
-Emacs Lisp is designed to get you started: to guide you in learning the
-fundamentals of programming, and more importantly, to show you how you
-can teach yourself to go further.
-
-@node On Reading this Text, Who You Are, Why, Preface
-@comment  node-name,  next,  previous,  up
-@unnumberedsec On Reading this Text
-
-All through this document, you will see little sample programs you can
-run inside of Emacs.  If you read this document in Info inside of GNU
-Emacs, you can run the programs as they appear.  (This is easy to do and
-is explained when the examples are presented.)  Alternatively, you can
-read this introduction as a printed book while sitting beside a computer
-running Emacs.  (This is what I like to do; I like printed books.)  If
-you don't have a running Emacs beside you, you can still read this book,
-but in this case, it is best to treat it as a novel or as a travel guide
-to a country not yet visited: interesting, but not the same as being
-there.
-
-Much of this introduction is dedicated to walk-throughs or guided tours
-of code used in GNU Emacs.  These tours are designed for two purposes:
-first, to give you familiarity with real, working code (code you use
-every day); and, second, to give you familiarity with the way Emacs
-works.  It is interesting to see how a working environment is
-implemented.
-Also, I
-hope that you will pick up the habit of browsing through source code.
-You can learn from it and mine it for ideas.  Having GNU Emacs is like
-having a dragon's cave of treasures.
-
-In addition to learning about Emacs as an editor and Emacs Lisp as a
-programming language, the examples and guided tours will give you an
-opportunity to get acquainted with Emacs as a Lisp programming
-environment.  GNU Emacs supports programming and provides tools that
-you will want to become comfortable using, such as @kbd{M-.} (the key
-which invokes the @code{find-tag} command).  You will also learn about
-buffers and other objects that are part of the environment.
-Learning about these features of Emacs is like learning new routes
-around your home town.
-
-@ignore
-In addition, I have written several programs as extended examples.
-Although these are examples, the programs are real.  I use them.
-Other people use them.  You may use them.  Beyond the fragments of
-programs used for illustrations, there is very little in here that is
-`just for teaching purposes'; what you see is used.  This is a great
-advantage of Emacs Lisp: it is easy to learn to use it for work.
-@end ignore
-
-Finally, I hope to convey some of the skills for using Emacs to
-learn aspects of programming that you don't know.  You can often use
-Emacs to help you understand what puzzles you or to find out how to do
-something new.  This self-reliance is not only a pleasure, but an
-advantage.
-
-@node Who You Are, Lisp History, On Reading this Text, Preface
-@comment  node-name,  next,  previous,  up
-@unnumberedsec For Whom This is Written
-
-This text is written as an elementary introduction for people who are
-not programmers.  If you are a programmer, you may not be satisfied with
-this primer.  The reason is that you may have become expert at reading
-reference manuals and be put off by the way this text is organized.
-
-An expert programmer who reviewed this text said to me:
-
-@quotation
-@i{I prefer to learn from reference manuals.  I ``dive into'' each
-paragraph, and ``come up for air'' between paragraphs.}
-
-@i{When I get to the end of a paragraph, I assume that that subject is
-done, finished, that I know everything I need (with the
-possible exception of the case when the next paragraph starts talking
-about it in more detail).  I expect that a well written reference manual
-will not have a lot of redundancy, and that it will have excellent
-pointers to the (one) place where the information I want is.}
-@end quotation
-
-This introduction is not written for this person!
-
-Firstly, I try to say everything at least three times: first, to
-introduce it; second, to show it in context; and third, to show it in a
-different context, or to review it.
-
-Secondly, I hardly ever put all the information about a subject in one
-place, much less in one paragraph.  To my way of thinking, that imposes
-too heavy a burden on the reader.  Instead I try to explain only what
-you need to know at the time.  (Sometimes I include a little extra
-information so you won't be surprised later when the additional
-information is formally introduced.)
-
-When you read this text, you are not expected to learn everything the
-first time.  Frequently, you need only make, as it were, a `nodding
-acquaintance' with some of the items mentioned.  My hope is that I have
-structured the text and given you enough hints that you will be alert to
-what is important, and concentrate on it.
-
-You will need to ``dive into'' some paragraphs; there is no other way
-to read them.  But I have tried to keep down the number of such
-paragraphs.  This book is intended as an approachable hill, rather than
-as a daunting mountain.
-
-This introduction to @cite{Programming in Emacs Lisp} has a companion
-document,
-@iftex
-@cite{The GNU Emacs Lisp Reference Manual}.
-@end iftex
-@ifnottex
-@ref{Top, , The GNU Emacs Lisp Reference Manual, elisp, The GNU
-Emacs Lisp Reference Manual}.
-@end ifnottex
-The reference manual has more detail than this introduction.  In the
-reference manual, all the information about one topic is concentrated
-in one place.  You should turn to it if you are like the programmer
-quoted above.  And, of course, after you have read this
-@cite{Introduction}, you will find the @cite{Reference Manual} useful
-when you are writing your own programs.
-
-@node Lisp History, Note for Novices, Who You Are, Preface
-@unnumberedsec Lisp History
-@cindex Lisp history
-
-Lisp was first developed in the late 1950s at the Massachusetts
-Institute of Technology for research in artificial intelligence.  The
-great power of the Lisp language makes it superior for other purposes as
-well, such as writing editor commands and integrated environments.
-
-@cindex Maclisp
-@cindex Common Lisp
-GNU Emacs Lisp is largely inspired by Maclisp, which was written at MIT
-in the 1960s.  It is somewhat inspired by Common Lisp, which became a
-standard in the 1980s.  However, Emacs Lisp is much simpler than Common
-Lisp.  (The standard Emacs distribution contains an optional extensions
-file, @file{cl.el}, that adds many Common Lisp features to Emacs Lisp.)
-
-@node Note for Novices, Thank You, Lisp History, Preface
-@comment  node-name,  next,  previous,  up
-@unnumberedsec A Note for Novices
-
-If you don't know GNU Emacs, you can still read this document
-profitably.  However, I recommend you learn Emacs, if only to learn to
-move around your computer screen.  You can teach yourself how to use
-Emacs with the on-line tutorial.  To use it, type @kbd{C-h t}.  (This
-means you press and release the @key{CTRL} key and the @kbd{h} at the
-same time, and then press and release @kbd{t}.)
-
-Also, I often refer to one of Emacs' standard commands by listing the
-keys which you press to invoke the command and then giving the name of
-the command in parentheses, like this: @kbd{M-C-\}
-(@code{indent-region}).  What this means is that the
-@code{indent-region} command is customarily invoked by typing
-@kbd{M-C-\}.  (You can, if you wish, change the keys that are typed to
-invoke the command; this is called @dfn{rebinding}.  @xref{Keymaps, ,
-Keymaps}.)  The abbreviation @kbd{M-C-\} means that you type your
-@key{META} key, @key{CTRL} key and @key{\} key all at the same time.
-(On many modern keyboards the @key{META} key is labelled
-@key{ALT}.)
-Sometimes a combination like this is called a keychord, since it is
-similar to the way you play a chord on a piano.  If your keyboard does
-not have a @key{META} key, the @key{ESC} key prefix is used in place
-of it.  In this case, @kbd{M-C-\} means that you press and release your
-@key{ESC} key and then type the @key{CTRL} key and the @key{\} key at
-the same time.  But usually @kbd{M-C-\} means press the @key{CTRL} key
-along with the key that is labelled @key{ALT} and, at the same time,
-press the @key{\} key.
-
-In addition to typing a lone keychord, you can prefix what you type
-with @kbd{C-u}, which is called the `universal argument'.  The
-@kbd{C-u} keychord passes an argument to the subsequent command.
-Thus, to indent a region of plain text by 6 spaces, mark the region,
-and then type @w{@kbd{C-u 6 M-C-\}}.  (If you do not specify a number,
-Emacs either passes the number 4 to the command or otherwise runs the
-command differently than it would otherwise.)  @xref{Arguments, ,
-Numeric Arguments, emacs, The GNU Emacs Manual}.
-
-If you are reading this in Info using GNU Emacs, you can read through
-this whole document just by pressing the space bar, @key{SPC}.
-(To learn about Info, type @kbd{C-h i} and then select Info.)
-
-A note on terminology:  when I use the word Lisp alone, I often am
-referring to the various dialects of Lisp in general, but when I speak
-of Emacs Lisp, I am referring to GNU Emacs Lisp in particular.
-
-@node Thank You,  , Note for Novices, Preface
-@comment  node-name,  next,  previous,  up
-@unnumberedsec Thank You
-
-My thanks to all who helped me with this book.  My especial thanks to
-@r{Jim Blandy}, @r{Noah Friedman}, @w{Jim Kingdon}, @r{Roland
-McGrath}, @w{Frank Ritter}, @w{Randy Smith}, @w{Richard M.@:
-Stallman}, and @w{Melissa Weisshaus}.  My thanks also go to both
-@w{Philip Johnson} and @w{David Stampe} for their patient
-encouragement.  My mistakes are my own.
-
-@flushright
-Robert J. Chassell
-@end flushright
-
-@c ================ Beginning of main text ================
-
-@c Start main text on right-hand (verso) page
-
-@tex
-\par\vfill\supereject
-\headings off
-\ifodd\pageno
-    \par\vfill\supereject
-\else
-    \par\vfill\supereject
-    \page\hbox{}\page
-    \par\vfill\supereject
-\fi
-@end tex
-
-@iftex
-@headings off
-@evenheading @thispage @| @| @thischapter
-@oddheading @thissection @| @| @thispage
-@global@pageno = 1
-@end iftex
-
-@node List Processing, Practicing Evaluation, Preface, Top
-@comment  node-name,  next,  previous,  up
-@chapter List Processing
-
-To the untutored eye, Lisp is a strange programming language.  In Lisp
-code there are parentheses everywhere.  Some people even claim that
-the name stands for `Lots of Isolated Silly Parentheses'.  But the
-claim is unwarranted.  Lisp stands for LISt Processing, and the
-programming language handles @emph{lists} (and lists of lists) by
-putting them between parentheses.  The parentheses mark the boundaries
-of the list.  Sometimes a list is preceded by a single apostrophe or
-quotation mark, @samp{'}@footnote{The single apostrophe or quotation
-mark is an abbreviation for the function @code{quote}; you need not
-think about functions now; functions are defined in @ref{Making
-Errors, , Generate an Error Message}.}  Lists are the basis of Lisp.
-
-@menu
-* Lisp Lists::                  What are lists?
-* Run a Program::               Any list in Lisp is a program ready to run.
-* Making Errors::               Generating an error message.
-* Names & Definitions::         Names of symbols and function definitions.
-* Lisp Interpreter::            What the Lisp interpreter does.
-* Evaluation::                  Running a program.
-* Variables::                   Returning a value from a variable.
-* Arguments::                   Passing information to a function.
-* set & setq::                  Setting the value of a variable.
-* Summary::                     The major points.
-* Error Message Exercises::
-@end menu
-
-@node Lisp Lists, Run a Program, List Processing, List Processing
-@comment  node-name,  next,  previous,  up
-@section Lisp Lists
-@cindex Lisp Lists
-
-In Lisp, a list looks like this: @code{'(rose violet daisy buttercup)}.
-This list is preceded by a single apostrophe.  It could just as well be
-written as follows, which looks more like the kind of list you are likely
-to be familiar with:
-
-@smallexample
-@group
-'(rose
-  violet
-  daisy
-  buttercup)
-@end group
-@end smallexample
-
-@noindent
-The elements of this list are the names of the four different flowers,
-separated from each other by whitespace and surrounded by parentheses,
-like flowers in a field with a stone wall around them.
-@cindex Flowers in a field
-
-@menu
-* Numbers Lists::               List have numbers, other lists, in them.
-* Lisp Atoms::                  Elemental entities.
-* Whitespace in Lists::         Formatting lists to be readable.
-* Typing Lists::                How GNU Emacs helps you type lists.
-@end menu
-
-@node Numbers Lists, Lisp Atoms, Lisp Lists, Lisp Lists
-@ifnottex
-@unnumberedsubsec Numbers, Lists inside of Lists
-@end ifnottex
-
-Lists can also have numbers in them, as in this list: @code{(+ 2 2)}.
-This list has a plus-sign, @samp{+}, followed by two @samp{2}s, each
-separated by whitespace.
-
-In Lisp, both data and programs are represented the same way; that is,
-they are both lists of words, numbers, or other lists, separated by
-whitespace and surrounded by parentheses.  (Since a program looks like
-data, one program may easily serve as data for another; this is a very
-powerful feature of Lisp.)  (Incidentally, these two parenthetical
-remarks are @emph{not} Lisp lists, because they contain @samp{;} and
-@samp{.} as punctuation marks.)
-
-@need 1200
-Here is another list, this time with a list inside of it:
-
-@smallexample
-'(this list has (a list inside of it))
-@end smallexample
-
-The components of this list are the words @samp{this}, @samp{list},
-@samp{has}, and the list @samp{(a list inside of it)}.  The interior
-list is made up of the words @samp{a}, @samp{list}, @samp{inside},
-@samp{of}, @samp{it}.
-
-@node Lisp Atoms, Whitespace in Lists, Numbers Lists, Lisp Lists
-@comment  node-name,  next,  previous,  up
-@subsection Lisp Atoms
-@cindex Lisp Atoms
-
-In Lisp, what we have been calling words are called @dfn{atoms}.  This
-term comes from the historical meaning of the word atom, which means
-`indivisible'.  As far as Lisp is concerned, the words we have been
-using in the lists cannot be divided into any smaller parts and still
-mean the same thing as part of a program; likewise with numbers and
-single character symbols like @samp{+}.  On the other hand, unlike an
-ancient atom, a list can be split into parts.  (@xref{car cdr & cons,
-, @code{car} @code{cdr} & @code{cons} Fundamental Functions}.)
-
-In a list, atoms are separated from each other by whitespace.  They can be
-right next to a parenthesis.
-
-@cindex @samp{empty list} defined
-Technically speaking, a list in Lisp consists of parentheses surrounding
-atoms separated by whitespace or surrounding other lists or surrounding
-both atoms and other lists.  A list can have just one atom in it or
-have nothing in it at all.  A list with nothing in it looks like this:
-@code{()}, and is called the @dfn{empty list}.  Unlike anything else, an
-empty list is considered both an atom and a list at the same time.
-
-@cindex Symbolic expressions, introduced
-@cindex @samp{expression} defined
-@cindex @samp{form} defined
-The printed representation of both atoms and lists are called
-@dfn{symbolic expressions} or, more concisely, @dfn{s-expressions}.
-The word @dfn{expression} by itself can refer to either the printed
-representation, or to the atom or list as it is held internally in the
-computer.  Often, people use the term @dfn{expression}
-indiscriminately.  (Also, in many texts, the word @dfn{form} is used
-as a synonym for expression.)
-
-Incidentally, the atoms that make up our universe were named such when
-they were thought to be indivisible; but it has been found that physical
-atoms are not indivisible.  Parts can split off an atom or it can
-fission into two parts of roughly equal size.  Physical atoms were named
-prematurely, before their truer nature was found.  In Lisp, certain
-kinds of atom, such as an array, can be separated into parts; but the
-mechanism for doing this is different from the mechanism for splitting a
-list.  As far as list operations are concerned, the atoms of a list are
-unsplittable.
-
-As in English, the meanings of the component letters of a Lisp atom
-are different from the meaning the letters make as a word.  For
-example, the word for the South American sloth, the @samp{ai}, is
-completely different from the two words, @samp{a}, and @samp{i}.
-
-There are many kinds of atom in nature but only a few in Lisp: for
-example, @dfn{numbers}, such as 37, 511, or 1729, and @dfn{symbols}, such
-as @samp{+}, @samp{foo}, or @samp{forward-line}.  The words we have
-listed in the examples above are all symbols.  In everyday Lisp
-conversation, the word ``atom'' is not often used, because programmers
-usually try to be more specific about what kind of atom they are dealing
-with.  Lisp programming is mostly about symbols (and sometimes numbers)
-within lists.  (Incidentally, the preceding three word parenthetical
-remark is a proper list in Lisp, since it consists of atoms, which in
-this case are symbols, separated by whitespace and enclosed by
-parentheses, without any non-Lisp punctuation.)
-
-@need 1250
-In addition, text between double quotation marks---even sentences or
-paragraphs---is an atom.  Here is an example:
-@cindex Text between double quotation marks
-
-@smallexample
-'(this list includes "text between quotation marks.")
-@end smallexample
-
-@cindex @samp{string} defined
-@noindent
-In Lisp, all of the quoted text including the punctuation mark and the
-blank spaces is a single atom.  This kind of atom is called a
-@dfn{string} (for `string of characters') and is the sort of thing that
-is used for messages that a computer can print for a human to read.
-Strings are a different kind of atom than numbers or symbols and are
-used differently.
-
-@node Whitespace in Lists, Typing Lists, Lisp Atoms, Lisp Lists
-@comment  node-name,  next,  previous,  up
-@subsection Whitespace in Lists
-@cindex Whitespace in lists
-
-@need 1200
-The amount of whitespace in a list does not matter.  From the point of view
-of the Lisp language,
-
-@smallexample
-@group
-'(this list
-   looks like this)
-@end group
-@end smallexample
-
-@need 800
-@noindent
-is exactly the same as this:
-
-@smallexample
-'(this list looks like this)
-@end smallexample
-
-Both examples show what to Lisp is the same list, the list made up of
-the symbols @samp{this}, @samp{list}, @samp{looks}, @samp{like}, and
-@samp{this} in that order.
-
-Extra whitespace and newlines are designed to make a list more readable
-by humans.  When Lisp reads the expression, it gets rid of all the extra
-whitespace (but it needs to have at least one space between atoms in
-order to tell them apart.)
-
-Odd as it seems, the examples we have seen cover almost all of what Lisp
-lists look like!  Every other list in Lisp looks more or less like one
-of these examples, except that the list may be longer and more complex.
-In brief, a list is between parentheses, a string is between quotation
-marks, a symbol looks like a word, and a number looks like a number.
-(For certain situations, square brackets, dots and a few other special
-characters may be used; however, we will go quite far without them.)
-
-@node Typing Lists,  , Whitespace in Lists, Lisp Lists
-@comment  node-name,  next,  previous,  up
-@subsection GNU Emacs Helps You Type Lists
-@cindex Help typing lists
-@cindex Formatting help
-
-When you type a Lisp expression in GNU Emacs using either Lisp
-Interaction mode or Emacs Lisp mode, you have available to you several
-commands to format the Lisp expression so it is easy to read.  For
-example, pressing the @key{TAB} key automatically indents the line the
-cursor is on by the right amount.  A command to properly indent the
-code in a region is customarily bound to @kbd{M-C-\}.  Indentation is
-designed so that you can see which elements of a list belong to which
-list---elements of a sub-list are indented more than the elements of
-the enclosing list.
-
-In addition, when you type a closing parenthesis, Emacs momentarily
-jumps the cursor back to the matching opening parenthesis, so you can
-see which one it is.  This is very useful, since every list you type
-in Lisp must have its closing parenthesis match its opening
-parenthesis.  (@xref{Major Modes, , Major Modes, emacs, The GNU Emacs
-Manual}, for more information about Emacs' modes.)
-
-@node Run a Program, Making Errors, Lisp Lists, List Processing
-@comment  node-name,  next,  previous,  up
-@section Run a Program
-@cindex Run a program
-@cindex Program, running one
-
-@cindex @samp{evaluate} defined
-A list in Lisp---any list---is a program ready to run.  If you run it
-(for which the Lisp jargon is @dfn{evaluate}), the computer will do one
-of three things: do nothing except return to you the list itself; send
-you an error message; or, treat the first symbol in the list as a
-command to do something.  (Usually, of course, it is the last of these
-three things that you really want!)
-
-@c use code for the single apostrophe, not samp.
-The single apostrophe, @code{'}, that I put in front of some of the
-example lists in preceding sections is called a @dfn{quote}; when it
-precedes a list, it tells Lisp to do nothing with the list, other than
-take it as it is written.  But if there is no quote preceding a list,
-the first item of the list is special: it is a command for the computer
-to obey.  (In Lisp, these commands are called @emph{functions}.)  The list
-@code{(+ 2 2)} shown above did not have a quote in front of it, so Lisp
-understands that the @code{+} is an instruction to do something with the
-rest of the list: add the numbers that follow.
-
-@need 1250
-If you are reading this inside of GNU Emacs in Info, here is how you can
-evaluate such a list:  place your cursor immediately after the right
-hand parenthesis of the following list and then type @kbd{C-x C-e}:
-
-@smallexample
-(+ 2 2)
-@end smallexample
-
-@c use code for the number four, not samp.
-@noindent
-You will see the number @code{4} appear in the echo area.  (In the
-jargon, what you have just done is ``evaluate the list.''  The echo area
-is the line at the bottom of the screen that displays or ``echoes''
-text.)  Now try the same thing with a quoted list:  place the cursor
-right after the following list and type @kbd{C-x C-e}:
-
-@smallexample
-'(this is a quoted list)
-@end smallexample
-
-@noindent
-You will see @code{(this is a quoted list)} appear in the echo area.
-
-@cindex Lisp interpreter, explained
-@cindex Interpreter, Lisp, explained
-In both cases, what you are doing is giving a command to the program
-inside of GNU Emacs called the @dfn{Lisp interpreter}---giving the
-interpreter a command to evaluate the expression.  The name of the Lisp
-interpreter comes from the word for the task done by a human who comes
-up with the meaning of an expression---who ``interprets'' it.
-
-You can also evaluate an atom that is not part of a list---one that is
-not surrounded by parentheses; again, the Lisp interpreter translates
-from the humanly readable expression to the language of the computer.
-But before discussing this (@pxref{Variables}), we will discuss what the
-Lisp interpreter does when you make an error.
-
-@node Making Errors, Names & Definitions, Run a Program, List Processing
-@comment  node-name,  next,  previous,  up
-@section Generate an Error Message
-@cindex Generate an error message
-@cindex Error message generation
-
-Partly so you won't worry if you do it accidentally, we will now give
-a command to the Lisp interpreter that generates an error message.
-This is a harmless activity; and indeed, we will often try to generate
-error messages intentionally.  Once you understand the jargon, error
-messages can be informative.  Instead of being called ``error''
-messages, they should be called ``help'' messages.  They are like
-signposts to a traveller in a strange country; deciphering them can be
-hard, but once understood, they can point the way.
-
-The error message is generated by a built-in GNU Emacs debugger.  We
-will `enter the debugger'.  You get out of the debugger by typing @code{q}.
-
-What we will do is evaluate a list that is not quoted and does not
-have a meaningful command as its first element.  Here is a list almost
-exactly the same as the one we just used, but without the single-quote
-in front of it.  Position the cursor right after it and type @kbd{C-x
-C-e}:
-
-@smallexample
-(this is an unquoted list)
-@end smallexample
-
-@noindent
-What you see depends on which version of Emacs you are running.  GNU
-Emacs version 22 provides more information than version 20 and before.
-First, the more recent result of generating an error; then the
-earlier, version 20 result.
-
-@need 1250
-@noindent
-In GNU Emacs version 22, a @file{*Backtrace*} window will open up and
-you will see the following in it:
-
-@smallexample
-@group
----------- Buffer: *Backtrace* ----------
-Debugger entered--Lisp error: (void-function this)
-  (this is an unquoted list)
-  eval((this is an unquoted list))
-  eval-last-sexp-1(nil)
-  eval-last-sexp(nil)
-  call-interactively(eval-last-sexp)
----------- Buffer: *Backtrace* ----------
-@end group
-@end smallexample
-
-@need 1200
-@noindent
-Your cursor will be in this window (you may have to wait a few seconds
-before it becomes visible).  To quit the debugger and make the
-debugger window go away, type:
-
-@smallexample
-q
-@end smallexample
-
-@noindent
-Please type @kbd{q} right now, so you become confident that you can
-get out of the debugger.  Then, type @kbd{C-x C-e} again to re-enter
-it.
-
-@cindex @samp{function} defined
-Based on what we already know, we can almost read this error message.
-
-You read the @file{*Backtrace*} buffer from the bottom up; it tells
-you what Emacs did.  When you typed @kbd{C-x C-e}, you made an
-interactive call to the command @code{eval-last-sexp}.  @code{eval} is
-an abbreviation for `evaluate' and @code{sexp} is an abbreviation for
-`symbolic expression'.  The command means `evaluate last symbolic
-expression', which is the expression just before your cursor.
-
-Each line above tells you what the Lisp interpreter evaluated next.
-The most recent action is at the top.  The buffer is called the
-@file{*Backtrace*} buffer because it enables you to track Emacs
-backwards.
-
-@need 800
-At the top of the @file{*Backtrace*} buffer, you see the line:
-
-@smallexample
-Debugger entered--Lisp error: (void-function this)
-@end smallexample
-
-@noindent
-The Lisp interpreter tried to evaluate the first atom of the list, the
-word @samp{this}.  It is this action that generated the error message
-@samp{void-function this}.
-
-The message contains the words @samp{void-function} and @samp{this}.
-
-@cindex @samp{function} defined
-The word @samp{function} was mentioned once before.  It is a very
-important word.  For our purposes, we can define it by saying that a
-@dfn{function} is a set of instructions to the computer that tell the
-computer to do something.
-
-Now we can begin to understand the error message: @samp{void-function
-this}.  The function (that is, the word @samp{this}) does not have a
-definition of any set of instructions for the computer to carry out.
-
-The slightly odd word, @samp{void-function}, is designed to cover the
-way Emacs Lisp is implemented, which is that when a symbol does not
-have a function definition attached to it, the place that should
-contain the instructions is `void'.
-
-On the other hand, since we were able to add 2 plus 2 successfully, by
-evaluating @code{(+ 2 2)}, we can infer that the symbol @code{+} must
-have a set of instructions for the computer to obey and those
-instructions must be to add the numbers that follow the @code{+}.
-
-@need 1250
-In GNU Emacs version 20, and in earlier versions, you will see only
-one line of error message; it will appear in the echo area and look
-like this:
-
-@smallexample
-Symbol's function definition is void:@: this
-@end smallexample
-
-@noindent
-(Also, your terminal may beep at you---some do, some don't; and others
-blink.  This is just a device to get your attention.)  The message goes
-away as soon as you type another key, even just to move the cursor.
-
-We know the meaning of the word @samp{Symbol}.  It refers to the first
-atom of the list, the word @samp{this}.  The word @samp{function}
-refers to the instructions that tell the computer what to do.
-(Technically, the symbol tells the computer where to find the
-instructions, but this is a complication we can ignore for the
-moment.)
-
-The error message can be understood: @samp{Symbol's function
-definition is void:@: this}.  The symbol (that is, the word
-@samp{this}) lacks instructions for the computer to carry out.
-
-@node Names & Definitions, Lisp Interpreter, Making Errors, List Processing
-@comment  node-name,  next,  previous,  up
-@section Symbol Names and Function Definitions
-@cindex Symbol names
-
-We can articulate another characteristic of Lisp based on what we have
-discussed so far---an important characteristic: a symbol, like
-@code{+}, is not itself the set of instructions for the computer to
-carry out.  Instead, the symbol is used, perhaps temporarily, as a way
-of locating the definition or set of instructions.  What we see is the
-name through which the instructions can be found.  Names of people
-work the same way.  I can be referred to as @samp{Bob}; however, I am
-not the letters @samp{B}, @samp{o}, @samp{b} but am, or was, the
-consciousness consistently associated with a particular life-form.
-The name is not me, but it can be used to refer to me.
-
-In Lisp, one set of instructions can be attached to several names.
-For example, the computer instructions for adding numbers can be
-linked to the symbol @code{plus} as well as to the symbol @code{+}
-(and are in some dialects of Lisp).  Among humans, I can be referred
-to as @samp{Robert} as well as @samp{Bob} and by other words as well.
-
-On the other hand, a symbol can have only one function definition
-attached to it at a time.  Otherwise, the computer would be confused as
-to which definition to use.  If this were the case among people, only
-one person in the world could be named @samp{Bob}.  However, the function
-definition to which the name refers can be changed readily.
-(@xref{Install, , Install a Function Definition}.)
-
-Since Emacs Lisp is large, it is customary to name symbols in a way
-that identifies the part of Emacs to which the function belongs.
-Thus, all the names for functions that deal with Texinfo start with
-@samp{texinfo-} and those for functions that deal with reading mail
-start with @samp{rmail-}.
-
-@node Lisp Interpreter, Evaluation, Names & Definitions, List Processing
-@comment  node-name,  next,  previous,  up
-@section The Lisp Interpreter
-@cindex Lisp interpreter, what it does
-@cindex Interpreter, what it does
-
-Based on what we have seen, we can now start to figure out what the
-Lisp interpreter does when we command it to evaluate a list.
-First, it looks to see whether there is a quote before the list; if
-there is, the interpreter just gives us the list.  On the other
-hand, if there is no quote, the interpreter looks at the first element
-in the list and sees whether it has a function definition.  If it does,
-the interpreter carries out the instructions in the function definition.
-Otherwise, the interpreter prints an error message.
-
-This is how Lisp works.  Simple.  There are added complications which we
-will get to in a minute, but these are the fundamentals.  Of course, to
-write Lisp programs, you need to know how to write function definitions
-and attach them to names, and how to do this without confusing either
-yourself or the computer.
-
-@menu
-* Complications::               Variables, Special forms, Lists within.
-* Byte Compiling::              Specially processing code for speed.
-@end menu
-
-@node Complications, Byte Compiling, Lisp Interpreter, Lisp Interpreter
-@ifnottex
-@unnumberedsubsec Complications
-@end ifnottex
-
-Now, for the first complication.  In addition to lists, the Lisp
-interpreter can evaluate a symbol that is not quoted and does not have
-parentheses around it.  The Lisp interpreter will attempt to determine
-the symbol's value as a @dfn{variable}.  This situation is described
-in the section on variables.  (@xref{Variables}.)
-
-@cindex Special form
-The second complication occurs because some functions are unusual and do
-not work in the usual manner.  Those that don't are called @dfn{special
-forms}.  They are used for special jobs, like defining a function, and
-there are not many of them.  In the next few chapters, you will be
-introduced to several of the more important special forms.
-
-The third and final complication is this: if the function that the
-Lisp interpreter is looking at is not a special form, and if it is part
-of a list, the Lisp interpreter looks to see whether the list has a list
-inside of it.  If there is an inner list, the Lisp interpreter first
-figures out what it should do with the inside list, and then it works on
-the outside list.  If there is yet another list embedded inside the
-inner list, it works on that one first, and so on.  It always works on
-the innermost list first.  The interpreter works on the innermost list
-first, to evaluate the result of that list.  The result may be
-used by the enclosing expression.
-
-Otherwise, the interpreter works left to right, from one expression to
-the next.
-
-@node Byte Compiling,  , Complications, Lisp Interpreter
-@subsection Byte Compiling
-@cindex Byte compiling
-
-One other aspect of interpreting: the Lisp interpreter is able to
-interpret two kinds of entity: humanly readable code, on which we will
-focus exclusively, and specially processed code, called @dfn{byte
-compiled} code, which is not humanly readable.  Byte compiled code
-runs faster than humanly readable code.
-
-You can transform humanly readable code into byte compiled code by
-running one of the compile commands such as @code{byte-compile-file}.
-Byte compiled code is usually stored in a file that ends with a
-@file{.elc} extension rather than a @file{.el} extension.  You will
-see both kinds of file in the @file{emacs/lisp} directory; the files
-to read are those with @file{.el} extensions.
-
-As a practical matter, for most things you might do to customize or
-extend Emacs, you do not need to byte compile; and I will not discuss
-the topic here.  @xref{Byte Compilation, , Byte Compilation, elisp,
-The GNU Emacs Lisp Reference Manual}, for a full description of byte
-compilation.
-
-@node Evaluation, Variables, Lisp Interpreter, List Processing
-@comment  node-name,  next,  previous,  up
-@section Evaluation
-@cindex Evaluation
-
-When the Lisp interpreter works on an expression, the term for the
-activity is called @dfn{evaluation}.  We say that the interpreter
-`evaluates the expression'.  I've used this term several times before.
-The word comes from its use in everyday language, `to ascertain the
-value or amount of; to appraise', according to @cite{Webster's New
-Collegiate Dictionary}.
-
-@menu
-* How the Interpreter Acts::    Returns and Side Effects...
-* Evaluating Inner Lists::      Lists within lists...
-@end menu
-
-@node How the Interpreter Acts, Evaluating Inner Lists, Evaluation, Evaluation
-@ifnottex
-@unnumberedsubsec How the Lisp Interpreter Acts
-@end ifnottex
-
-@cindex @samp{returned value} explained
-After evaluating an expression, the Lisp interpreter will most likely
-@dfn{return} the value that the computer produces by carrying out the
-instructions it found in the function definition, or perhaps it will
-give up on that function and produce an error message.  (The interpreter
-may also find itself tossed, so to speak, to a different function or it
-may attempt to repeat continually what it is doing for ever and ever in
-what is called an `infinite loop'.  These actions are less common; and
-we can ignore them.)  Most frequently, the interpreter returns a value.
-
-@cindex @samp{side effect} defined
-At the same time the interpreter returns a value, it may do something
-else as well, such as move a cursor or copy a file; this other kind of
-action is called a @dfn{side effect}.  Actions that we humans think are
-important, such as printing results, are often ``side effects'' to the
-Lisp interpreter.  The jargon can sound peculiar, but it turns out that
-it is fairly easy to learn to use side effects.
-
-In summary, evaluating a symbolic expression most commonly causes the
-Lisp interpreter to return a value and perhaps carry out a side effect;
-or else produce an error.
-
-@node Evaluating Inner Lists,  , How the Interpreter Acts, Evaluation
-@comment  node-name,  next,  previous,  up
-@subsection Evaluating Inner Lists
-@cindex Inner list evaluation
-@cindex Evaluating inner lists
-
-If evaluation applies to a list that is inside another list, the outer
-list may use the value returned by the first evaluation as information
-when the outer list is evaluated.  This explains why inner expressions
-are evaluated first: the values they return are used by the outer
-expressions.
-
-@need 1250
-We can investigate this process by evaluating another addition example.
-Place your cursor after the following expression and type @kbd{C-x C-e}:
-
-@smallexample
-(+ 2 (+ 3 3))
-@end smallexample
-
-@noindent
-The number 8 will appear in the echo area.
-
-What happens is that the Lisp interpreter first evaluates the inner
-expression, @code{(+ 3 3)}, for which the value 6 is returned; then it
-evaluates the outer expression as if it were written @code{(+ 2 6)}, which
-returns the value 8.  Since there are no more enclosing expressions to
-evaluate, the interpreter prints that value in the echo area.
-
-Now it is easy to understand the name of the command invoked by the
-keystrokes @kbd{C-x C-e}: the name is @code{eval-last-sexp}.  The
-letters @code{sexp} are an abbreviation for `symbolic expression', and
-@code{eval} is an abbreviation for `evaluate'.  The command means
-`evaluate last symbolic expression'.
-
-As an experiment, you can try evaluating the expression by putting the
-cursor at the beginning of the next line immediately following the
-expression, or inside the expression.
-
-@need 800
-Here is another copy of the expression:
-
-@smallexample
-(+ 2 (+ 3 3))
-@end smallexample
-
-@noindent
-If you place the cursor at the beginning of the blank line that
-immediately follows the expression and type @kbd{C-x C-e}, you will
-still get the value 8 printed in the echo area.  Now try putting the
-cursor inside the expression.  If you put it right after the next to
-last parenthesis (so it appears to sit on top of the last parenthesis),
-you will get a 6 printed in the echo area!  This is because the command
-evaluates the expression @code{(+ 3 3)}.
-
-Now put the cursor immediately after a number.  Type @kbd{C-x C-e} and
-you will get the number itself.  In Lisp, if you evaluate a number, you
-get the number itself---this is how numbers differ from symbols.  If you
-evaluate a list starting with a symbol like @code{+}, you will get a
-value returned that is the result of the computer carrying out the
-instructions in the function definition attached to that name.  If a
-symbol by itself is evaluated, something different happens, as we will
-see in the next section.
-
-@node Variables, Arguments, Evaluation, List Processing
-@comment  node-name,  next,  previous,  up
-@section Variables
-@cindex Variables
-
-In Emacs Lisp, a symbol can have a value attached to it just as it can
-have a function definition attached to it.  The two are different.
-The function definition is a set of instructions that a computer will
-obey.  A value, on the other hand, is something, such as number or a
-name, that can vary (which is why such a symbol is called a variable).
-The value of a symbol can be any expression in Lisp, such as a symbol,
-number, list, or string.  A symbol that has a value is often called a
-@dfn{variable}.
-
-A symbol can have both a function definition and a value attached to
-it at the same time.  Or it can have just one or the other.
-The two are separate.  This is somewhat similar
-to the way the name Cambridge can refer to the city in Massachusetts
-and have some information attached to the name as well, such as
-``great programming center''.
-
-@ignore
-(Incidentally, in Emacs Lisp, a symbol can have two
-other things attached to it, too: a property list and a documentation
-string; these are discussed later.)
-@end ignore
-
-Another way to think about this is to imagine a symbol as being a chest
-of drawers.  The function definition is put in one drawer, the value in
-another, and so on.  What is put in the drawer holding the value can be
-changed without affecting the contents of the drawer holding the
-function definition, and vice-verse.
-
-@menu
-* fill-column Example::
-* Void Function::               The error message for a symbol
-                                  without a function.
-* Void Variable::               The error message for a symbol without a value.
-@end menu
-
-@node fill-column Example, Void Function, Variables, Variables
-@ifnottex
-@unnumberedsubsec @code{fill-column}, an Example Variable
-@end ifnottex
-
-@findex fill-column, @r{an example variable}
-@cindex Example variable, @code{fill-column}
-@cindex Variable, example of, @code{fill-column}
-The variable @code{fill-column} illustrates a symbol with a value
-attached to it: in every GNU Emacs buffer, this symbol is set to some
-value, usually 72 or 70, but sometimes to some other value.  To find the
-value of this symbol, evaluate it by itself.  If you are reading this in
-Info inside of GNU Emacs, you can do this by putting the cursor after
-the symbol and typing @kbd{C-x C-e}:
-
-@smallexample
-fill-column
-@end smallexample
-
-@noindent
-After I typed @kbd{C-x C-e}, Emacs printed the number 72 in my echo
-area.  This is the value for which @code{fill-column} is set for me as I
-write this.  It may be different for you in your Info buffer.  Notice
-that the value returned as a variable is printed in exactly the same way
-as the value returned by a function carrying out its instructions.  From
-the point of view of the Lisp interpreter, a value returned is a value
-returned.  What kind of expression it came from ceases to matter once
-the value is known.
-
-A symbol can have any value attached to it or, to use the jargon, we can
-@dfn{bind} the variable to a value: to a number, such as 72; to a
-string, @code{"such as this"}; to a list, such as @code{(spruce pine
-oak)}; we can even bind a variable to a function definition.
-
-A symbol can be bound to a value in several ways.  @xref{set & setq, ,
-Setting the Value of a Variable}, for information about one way to do
-this.
-
-@node Void Function, Void Variable, fill-column Example, Variables
-@comment  node-name,  next,  previous,  up
-@subsection Error Message for a Symbol Without a Function
-@cindex Symbol without function error
-@cindex Error for symbol without function
-
-When we evaluated @code{fill-column} to find its value as a variable,
-we did not place parentheses around the word.  This is because we did
-not intend to use it as a function name.
-
-If @code{fill-column} were the first or only element of a list, the
-Lisp interpreter would attempt to find the function definition
-attached to it.  But @code{fill-column} has no function definition.
-Try evaluating this:
-
-@smallexample
-(fill-column)
-@end smallexample
-
-@need 1250
-@noindent
-In GNU Emacs version 22, you will create a @file{*Backtrace*} buffer
-that says:
-
-@smallexample
-@group
----------- Buffer: *Backtrace* ----------
-Debugger entered--Lisp error: (void-function fill-column)
-  (fill-column)
-  eval((fill-column))
-  eval-last-sexp-1(nil)
-  eval-last-sexp(nil)
-  call-interactively(eval-last-sexp)
----------- Buffer: *Backtrace* ----------
-@end group
-@end smallexample
-
-@noindent
-(Remember, to quit the debugger and make the debugger window go away,
-type @kbd{q} in the @file{*Backtrace*} buffer.)
-
-@ignore
-@need 800
-In GNU Emacs 20 and before, you will produce an error message that says:
-
-@smallexample
-Symbol's function definition is void:@: fill-column
-@end smallexample
-
-@noindent
-(The message will go away as soon as you move the cursor or type
-another key.)
-@end ignore
-
-@node Void Variable,  , Void Function, Variables
-@comment  node-name,  next,  previous,  up
-@subsection Error Message for a Symbol Without a Value
-@cindex Symbol without value error
-@cindex Error for symbol without value
-
-If you attempt to evaluate a symbol that does not have a value bound to
-it, you will receive an error message.  You can see this by
-experimenting with our 2 plus 2 addition.  In the following expression,
-put your cursor right after the @code{+}, before the first number 2,
-type @kbd{C-x C-e}:
-
-@smallexample
-(+ 2 2)
-@end smallexample
-
-@need 1500
-@noindent
-In GNU Emacs 22, you will create a @file{*Backtrace*} buffer that
-says:
-
-@smallexample
-@group
----------- Buffer: *Backtrace* ----------
-Debugger entered--Lisp error: (void-variable +)
-  eval(+)
-  eval-last-sexp-1(nil)
-  eval-last-sexp(nil)
-  call-interactively(eval-last-sexp)
----------- Buffer: *Backtrace* ----------
-@end group
-@end smallexample
-
-@noindent
-(As with the other times we entered the debugger, you can quit by
-typing @kbd{q} in the @file{*Backtrace*} buffer.)
-
-This backtrace is different from the very first error message we saw,
-which said, @samp{Debugger entered--Lisp error: (void-function this)}.
-In this case, the function does not have a value as a variable; while
-in the other error message, the function (the word `this') did not
-have a definition.
-
-In this experiment with the @code{+}, what we did was cause the Lisp
-interpreter to evaluate the @code{+} and look for the value of the
-variable instead of the function definition.  We did this by placing the
-cursor right after the symbol rather than after the parenthesis of the
-enclosing list as we did before.  As a consequence, the Lisp interpreter
-evaluated the preceding s-expression, which in this case was the
-@code{+} by itself.
-
-Since @code{+} does not have a value bound to it, just the function
-definition, the error message reported that the symbol's value as a
-variable was void.
-
-@ignore
-@need 800
-In GNU Emacs version 20 and before, your error message will say:
-
-@example
-Symbol's value as variable is void:@: +
-@end example
-
-@noindent
-The meaning is the same as in GNU Emacs 22.
-@end ignore
-
-@node Arguments, set & setq, Variables, List Processing
-@comment  node-name,  next,  previous,  up
-@section Arguments
-@cindex Arguments
-@cindex Passing information to functions
-
-To see how information is passed to functions, let's look again at
-our old standby, the addition of two plus two.  In Lisp, this is written
-as follows:
-
-@smallexample
-(+ 2 2)
-@end smallexample
-
-If you evaluate this expression, the number 4 will appear in your echo
-area.  What the Lisp interpreter does is add the numbers that follow
-the @code{+}.
-
-@cindex @samp{argument} defined
-The numbers added by @code{+} are called the @dfn{arguments} of the
-function @code{+}.  These numbers are the information that is given to
-or @dfn{passed} to the function.
-
-The word `argument' comes from the way it is used in mathematics and
-does not refer to a disputation between two people; instead it refers to
-the information presented to the function, in this case, to the
-@code{+}.  In Lisp, the arguments to a function are the atoms or lists
-that follow the function.  The values returned by the evaluation of
-these atoms or lists are passed to the function.  Different functions
-require different numbers of arguments; some functions require none at
-all.@footnote{It is curious to track the path by which the word `argument'
-came to have two different meanings, one in mathematics and the other in
-everyday English.  According to the @cite{Oxford English Dictionary},
-the word derives from the Latin for @samp{to make clear, prove}; thus it
-came to mean, by one thread of derivation, `the evidence offered as
-proof', which is to say, `the information offered', which led to its
-meaning in Lisp.  But in the other thread of derivation, it came to mean
-`to assert in a manner against which others may make counter
-assertions', which led to the meaning of the word as a disputation.
-(Note here that the English word has two different definitions attached
-to it at the same time.  By contrast, in Emacs Lisp, a symbol cannot
-have two different function definitions at the same time.)}
-
-@menu
-* Data types::                  Types of data passed to a function.
-* Args as Variable or List::    An argument can be the value
-                                  of a variable or list.
-* Variable Number of Arguments::  Some functions may take a
-                                  variable number of arguments.
-* Wrong Type of Argument::      Passing an argument of the wrong type
-                                  to a function.
-* message::                     A useful function for sending messages.
-@end menu
-
-@node Data types, Args as Variable or List, Arguments, Arguments
-@comment  node-name,  next,  previous,  up
-@subsection Arguments' Data Types
-@cindex Data types
-@cindex Types of data
-@cindex Arguments' data types
-
-The type of data that should be passed to a function depends on what
-kind of information it uses.  The arguments to a function such as
-@code{+} must have values that are numbers, since @code{+} adds numbers.
-Other functions use different kinds of data for their arguments.
-
-@need 1250
-@findex concat
-For example, the @code{concat} function links together or unites two or
-more strings of text to produce a string.  The arguments are strings.
-Concatenating the two character strings @code{abc}, @code{def} produces
-the single string @code{abcdef}.  This can be seen by evaluating the
-following:
-
-@smallexample
-(concat "abc" "def")
-@end smallexample
-
-@noindent
-The value produced by evaluating this expression is @code{"abcdef"}.
-
-A function such as @code{substring} uses both a string and numbers as
-arguments.  The function returns a part of the string, a substring of
-the first argument.  This function takes three arguments.  Its first
-argument is the string of characters, the second and third arguments are
-numbers that indicate the beginning and end of the substring.  The
-numbers are a count of the number of characters (including spaces and
-punctuations) from the beginning of the string.
-
-@need 800
-For example, if you evaluate the following:
-
-@smallexample
-(substring "The quick brown fox jumped." 16 19)
-@end smallexample
-
-@noindent
-you will see @code{"fox"} appear in the echo area.  The arguments are the
-string and the two numbers.
-
-Note that the string passed to @code{substring} is a single atom even
-though it is made up of several words separated by spaces.  Lisp counts
-everything between the two quotation marks as part of the string,
-including the spaces.  You can think of the @code{substring} function as
-a kind of `atom smasher' since it takes an otherwise indivisible atom
-and extracts a part.  However, @code{substring} is only able to extract
-a substring from an argument that is a string, not from another type of
-atom such as a number or symbol.
-
-@node Args as Variable or List, Variable Number of Arguments, Data types, Arguments
-@comment  node-name,  next,  previous,  up
-@subsection An Argument as the Value of a Variable or List
-
-An argument can be a symbol that returns a value when it is evaluated.
-For example, when the symbol @code{fill-column} by itself is evaluated,
-it returns a number.  This number can be used in an addition.
-
-@need 1250
-Position the cursor after the following expression and type @kbd{C-x
-C-e}:
-
-@smallexample
-(+ 2 fill-column)
-@end smallexample
-
-@noindent
-The value will be a number two more than what you get by evaluating
-@code{fill-column} alone.  For me, this is 74, because my value of
-@code{fill-column} is 72.
-
-As we have just seen, an argument can be a symbol that returns a value
-when evaluated.  In addition, an argument can be a list that returns a
-value when it is evaluated.  For example, in the following expression,
-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
-
-@noindent
-If you evaluate this expression---and if, as with my Emacs,
-@code{fill-column} evaluates to 72---@code{"The 74 red foxes."} will
-appear in the echo area.  (Note that you must put spaces after the
-word @samp{The} and before the word @samp{red} so they will appear in
-the final string.  The function @code{number-to-string} converts the
-integer that the addition function returns to a string.
-@code{number-to-string} is also known as @code{int-to-string}.)
-
-@node Variable Number of Arguments, Wrong Type of Argument, Args as Variable or List, Arguments
-@comment  node-name,  next,  previous,  up
-@subsection Variable Number of Arguments
-@cindex Variable number of arguments
-@cindex Arguments, variable number of
-
-Some functions, such as @code{concat}, @code{+} or @code{*}, take any
-number of arguments.  (The @code{*} is the symbol for multiplication.)
-This can be seen by evaluating each of the following expressions in
-the usual way.  What you will see in the echo area is printed in this
-text after @samp{@result{}}, which you may read as `evaluates to'.
-
-@need 1250
-In the first set, the functions have no arguments:
-
-@smallexample
-@group
-(+)       @result{} 0
-
-(*)       @result{} 1
-@end group
-@end smallexample
-
-@need 1250
-In this set, the functions have one argument each:
-
-@smallexample
-@group
-(+ 3)     @result{} 3
-
-(* 3)     @result{} 3
-@end group
-@end smallexample
-
-@need 1250
-In this set, the functions have three arguments each:
-
-@smallexample
-@group
-(+ 3 4 5) @result{} 12
-
-(* 3 4 5) @result{} 60
-@end group
-@end smallexample
-
-@node Wrong Type of Argument, message, Variable Number of Arguments, Arguments
-@comment  node-name,  next,  previous,  up
-@subsection Using the Wrong Type Object as an Argument
-@cindex Wrong type of argument
-@cindex Argument, wrong type of
-
-When a function is passed an argument of the wrong type, the Lisp
-interpreter produces an error message.  For example, the @code{+}
-function expects the values of its arguments to be numbers.  As an
-experiment we can pass it the quoted symbol @code{hello} instead of a
-number.  Position the cursor after the following expression and type
-@kbd{C-x C-e}:
-
-@smallexample
-(+ 2 'hello)
-@end smallexample
-
-@noindent
-When you do this you will generate an error message.  What has happened
-is that @code{+} has tried to add the 2 to the value returned by
-@code{'hello}, but the value returned by @code{'hello} is the symbol
-@code{hello}, not a number.  Only numbers can be added.  So @code{+}
-could not carry out its addition.
-
-@need 1250
-In GNU Emacs version 22, you will create and enter a
-@file{*Backtrace*} buffer that says:
-
-@noindent
-@smallexample
-@group
----------- Buffer: *Backtrace* ----------
-Debugger entered--Lisp error:
-         (wrong-type-argument number-or-marker-p hello)
-  +(2 hello)
-  eval((+ 2 (quote hello)))
-  eval-last-sexp-1(nil)
-  eval-last-sexp(nil)
-  call-interactively(eval-last-sexp)
----------- Buffer: *Backtrace* ----------
-@end group
-@end smallexample
-
-@need 1250
-As usual, the error message tries to be helpful and makes sense after you
-learn how to read it.@footnote{@code{(quote hello)} is an expansion of
-the abbreviation @code{'hello}.}
-
-The first part of the error message is straightforward; it says
-@samp{wrong type argument}.  Next comes the mysterious jargon word
-@w{@samp{number-or-marker-p}}.  This word is trying to tell you what
-kind of argument the @code{+} expected.
-
-The symbol @code{number-or-marker-p} says that the Lisp interpreter is
-trying to determine whether the information presented it (the value of
-the argument) is a number or a marker (a special object representing a
-buffer position).  What it does is test to see whether the @code{+} is
-being given numbers to add.  It also tests to see whether the
-argument is something called a marker, which is a specific feature of
-Emacs Lisp.  (In Emacs, locations in a buffer are recorded as markers.
-When the mark is set with the @kbd{C-@@} or @kbd{C-@key{SPC}} command,
-its position is kept as a marker.  The mark can be considered a
-number---the number of characters the location is from the beginning
-of the buffer.)  In Emacs Lisp, @code{+} can be used to add the
-numeric value of marker positions as numbers.
-
-The @samp{p} of @code{number-or-marker-p} is the embodiment of a
-practice started in the early days of Lisp programming.  The @samp{p}
-stands for `predicate'.  In the jargon used by the early Lisp
-researchers, a predicate refers to a function to determine whether some
-property is true or false.  So the @samp{p} tells us that
-@code{number-or-marker-p} is the name of a function that determines
-whether it is true or false that the argument supplied is a number or
-a marker.  Other Lisp symbols that end in @samp{p} include @code{zerop},
-a function that tests whether its argument has the value of zero, and
-@code{listp}, a function that tests whether its argument is a list.
-
-Finally, the last part of the error message is the symbol @code{hello}.
-This is the value of the argument that was passed to @code{+}.  If the
-addition had been passed the correct type of object, the value passed
-would have been a number, such as 37, rather than a symbol like
-@code{hello}.  But then you would not have got the error message.
-
-@ignore
-@need 1250
-In GNU Emacs version 20 and before, the echo area displays an error
-message that says:
-
-@smallexample
-Wrong type argument:@: number-or-marker-p, hello
-@end smallexample
-
-This says, in different words, the same as the top line of the
-@file{*Backtrace*} buffer.
-@end ignore
-
-@node message,  , Wrong Type of Argument, Arguments
-@comment  node-name,  next,  previous,  up
-@subsection The @code{message} Function
-@findex message
-
-Like @code{+}, the @code{message} function takes a variable number of
-arguments.  It is used to send messages to the user and is so useful
-that we will describe it here.
-
-@need 1250
-A message is printed in the echo area.  For example, you can print a
-message in your echo area by evaluating the following list:
-
-@smallexample
-(message "This message appears in the echo area!")
-@end smallexample
-
-The whole string between double quotation marks is a single argument
-and is printed @i{in toto}.  (Note that in this example, the message
-itself will appear in the echo area within double quotes; that is
-because you see the value returned by the @code{message} function.  In
-most uses of @code{message} in programs that you write, the text will
-be printed in the echo area as a side-effect, without the quotes.
-@xref{multiply-by-seven in detail, , @code{multiply-by-seven} in
-detail}, for an example of this.)
-
-However, if there is a @samp{%s} in the quoted string of characters, the
-@code{message} function does not print the @samp{%s} as such, but looks
-to the argument that follows the string.  It evaluates the second
-argument and prints the value at the location in the string where the
-@samp{%s} is.
-
-@need 1250
-You can see this by positioning the cursor after the following
-expression and typing @kbd{C-x C-e}:
-
-@smallexample
-(message "The name of this buffer is: %s." (buffer-name))
-@end smallexample
-
-@noindent
-In Info, @code{"The name of this buffer is: *info*."} will appear in the
-echo area.  The function @code{buffer-name} returns the name of the
-buffer as a string, which the @code{message} function inserts in place
-of @code{%s}.
-
-To print a value as an integer, use @samp{%d} in the same way as
-@samp{%s}.  For example, to print a message in the echo area that
-states the value of the @code{fill-column}, evaluate the following:
-
-@smallexample
-(message "The value of fill-column is %d." fill-column)
-@end smallexample
-
-@noindent
-On my system, when I evaluate this list, @code{"The value of
-fill-column is 72."} appears in my echo area@footnote{Actually, you
-can use @code{%s} to print a number.  It is non-specific.  @code{%d}
-prints only the part of a number left of a decimal point, and not
-anything that is not a number.}.
-
-If there is more than one @samp{%s} in the quoted string, the value of
-the first argument following the quoted string is printed at the
-location of the first @samp{%s} and the value of the second argument is
-printed at the location of the second @samp{%s}, and so on.
-
-@need 1250
-For example, if you evaluate the following,
-
-@smallexample
-@group
-(message "There are %d %s in the office!"
-         (- fill-column 14) "pink elephants")
-@end group
-@end smallexample
-
-@noindent
-a rather whimsical message will appear in your echo area.  On my system
-it says, @code{"There are 58 pink elephants in the office!"}.
-
-The expression @code{(- fill-column 14)} is evaluated and the resulting
-number is inserted in place of the @samp{%d}; and the string in double
-quotes, @code{"pink elephants"}, is treated as a single argument and
-inserted in place of the @samp{%s}.  (That is to say, a string between
-double quotes evaluates to itself, like a number.)
-
-Finally, here is a somewhat complex example that not only illustrates
-the computation of a number, but also shows how you can use an
-expression within an expression to generate the text that is substituted
-for @samp{%s}:
-
-@smallexample
-@group
-(message "He saw %d %s"
-         (- fill-column 32)
-         (concat "red "
-                 (substring
-                  "The quick brown foxes jumped." 16 21)
-                 " leaping."))
-@end group
-@end smallexample
-
-In this example, @code{message} has three arguments: the string,
-@code{"He saw %d %s"}, the expression, @code{(- fill-column 32)}, and
-the expression beginning with the function @code{concat}.  The value
-resulting from the evaluation of @code{(- fill-column 32)} is inserted
-in place of the @samp{%d}; and the value returned by the expression
-beginning with @code{concat} is inserted in place of the @samp{%s}.
-
-When your fill column is 70 and you evaluate the expression, the
-message @code{"He saw 38 red foxes leaping."} appears in your echo
-area.
-
-@node set & setq, Summary, Arguments, List Processing
-@comment  node-name,  next,  previous,  up
-@section Setting the Value of a Variable
-@cindex Variable, setting value
-@cindex Setting value of variable
-
-@cindex @samp{bind} defined
-There are several ways by which a variable can be given a value.  One of
-the ways is to use either the function @code{set} or the function
-@code{setq}.  Another way is to use @code{let} (@pxref{let}).  (The
-jargon for this process is to @dfn{bind} a variable to a value.)
-
-The following sections not only describe how @code{set} and @code{setq}
-work but also illustrate how arguments are passed.
-
-@menu
-* Using set::                  Setting values.
-* Using setq::                 Setting a quoted value.
-* Counting::                   Using @code{setq} to count.
-@end menu
-
-@node Using set, Using setq, set & setq, set & setq
-@comment  node-name,  next,  previous,  up
-@subsection Using @code{set}
-@findex set
-
-To set the value of the symbol @code{flowers} to the list @code{'(rose
-violet daisy buttercup)}, evaluate the following expression by
-positioning the cursor after the expression and typing @kbd{C-x C-e}.
-
-@smallexample
-(set 'flowers '(rose violet daisy buttercup))
-@end smallexample
-
-@noindent
-The list @code{(rose violet daisy buttercup)} will appear in the echo
-area.  This is what is @emph{returned} by the @code{set} function.  As a
-side effect, the symbol @code{flowers} is bound to the list; that is,
-the symbol @code{flowers}, which can be viewed as a variable, is given
-the list as its value.  (This process, by the way, illustrates how a
-side effect to the Lisp interpreter, setting the value, can be the
-primary effect that we humans are interested in.  This is because every
-Lisp function must return a value if it does not get an error, but it
-will only have a side effect if it is designed to have one.)
-
-After evaluating the @code{set} expression, you can evaluate the symbol
-@code{flowers} and it will return the value you just set.  Here is the
-symbol.  Place your cursor after it and type @kbd{C-x C-e}.
-
-@smallexample
-flowers
-@end smallexample
-
-@noindent
-When you evaluate @code{flowers}, the list
-@code{(rose violet daisy buttercup)} appears in the echo area.
-
-Incidentally, if you evaluate @code{'flowers}, the variable with a quote
-in front of it, what you will see in the echo area is the symbol itself,
-@code{flowers}.  Here is the quoted symbol, so you can try this:
-
-@smallexample
-'flowers
-@end smallexample
-
-Note also, that when you use @code{set}, you need to quote both
-arguments to @code{set}, unless you want them evaluated.  Since we do
-not want either argument evaluated, neither the variable
-@code{flowers} nor the list @code{(rose violet daisy buttercup)}, both
-are quoted.  (When you use @code{set} without quoting its first
-argument, the first argument is evaluated before anything else is
-done.  If you did this and @code{flowers} did not have a value
-already, you would get an error message that the @samp{Symbol's value
-as variable is void}; on the other hand, if @code{flowers} did return
-a value after it was evaluated, the @code{set} would attempt to set
-the value that was returned.  There are situations where this is the
-right thing for the function to do; but such situations are rare.)
-
-@node Using setq, Counting, Using set, set & setq
-@comment  node-name,  next,  previous,  up
-@subsection Using @code{setq}
-@findex setq
-
-As a practical matter, you almost always quote the first argument to
-@code{set}.  The combination of @code{set} and a quoted first argument
-is so common that it has its own name: the special form @code{setq}.
-This special form is just like @code{set} except that the first argument
-is quoted automatically, so you don't need to type the quote mark
-yourself.  Also, as an added convenience, @code{setq} permits you to set
-several different variables to different values, all in one expression.
-
-To set the value of the variable @code{carnivores} to the list
-@code{'(lion tiger leopard)} using @code{setq}, the following expression
-is used:
-
-@smallexample
-(setq carnivores '(lion tiger leopard))
-@end smallexample
-
-@noindent
-This is exactly the same as using @code{set} except the first argument
-is automatically quoted by @code{setq}.  (The @samp{q} in @code{setq}
-means @code{quote}.)
-
-@need 1250
-With @code{set}, the expression would look like this:
-
-@smallexample
-(set 'carnivores '(lion tiger leopard))
-@end smallexample
-
-Also, @code{setq} can be used to assign different values to
-different variables.  The first argument is bound to the value
-of the second argument, the third argument is bound to the value of the
-fourth argument, and so on.  For example, you could use the following to
-assign a list of trees to the symbol @code{trees} and a list of herbivores
-to the symbol @code{herbivores}:
-
-@smallexample
-@group
-(setq trees '(pine fir oak maple)
-      herbivores '(gazelle antelope zebra))
-@end group
-@end smallexample
-
-@noindent
-(The expression could just as well have been on one line, but it might
-not have fit on a page; and humans find it easier to read nicely
-formatted lists.)
-
-Although I have been using the term `assign', there is another way of
-thinking about the workings of @code{set} and @code{setq}; and that is to
-say that @code{set} and @code{setq} make the symbol @emph{point} to the
-list.  This latter way of thinking is very common and in forthcoming
-chapters we shall come upon at least one symbol that has `pointer' as
-part of its name.  The name is chosen because the symbol has a value,
-specifically a list, attached to it; or, expressed another way,
-the symbol is set to ``point'' to the list.
-
-@node Counting,  , Using setq, set & setq
-@comment  node-name,  next,  previous,  up
-@subsection Counting
-@cindex Counting
-
-Here is an example that shows how to use @code{setq} in a counter.  You
-might use this to count how many times a part of your program repeats
-itself.  First set a variable to zero; then add one to the number each
-time the program repeats itself.  To do this, you need a variable that
-serves as a counter, and two expressions: an initial @code{setq}
-expression that sets the counter variable to zero; and a second
-@code{setq} expression that increments the counter each time it is
-evaluated.
-
-@smallexample
-@group
-(setq counter 0)                ; @r{Let's call this the initializer.}
-
-(setq counter (+ counter 1))    ; @r{This is the incrementer.}
-
-counter                         ; @r{This is the counter.}
-@end group
-@end smallexample
-
-@noindent
-(The text following the @samp{;} are comments.  @xref{Change a
-defun, , Change a Function Definition}.)
-
-If you evaluate the first of these expressions, the initializer,
-@code{(setq counter 0)}, and then evaluate the third expression,
-@code{counter}, the number @code{0} will appear in the echo area.  If
-you then evaluate the second expression, the incrementer, @code{(setq
-counter (+ counter 1))}, the counter will get the value 1.  So if you
-again evaluate @code{counter}, the number @code{1} will appear in the
-echo area.  Each time you evaluate the second expression, the value of
-the counter will be incremented.
-
-When you evaluate the incrementer, @code{(setq counter (+ counter 1))},
-the Lisp interpreter first evaluates the innermost list; this is the
-addition.  In order to evaluate this list, it must evaluate the variable
-@code{counter} and the number @code{1}.  When it evaluates the variable
-@code{counter}, it receives its current value.  It passes this value and
-the number @code{1} to the @code{+} which adds them together.  The sum
-is then returned as the value of the inner list and passed to the
-@code{setq} which sets the variable @code{counter} to this new value.
-Thus, the value of the variable, @code{counter}, is changed.
-
-@node Summary, Error Message Exercises, set & setq, List Processing
-@comment  node-name,  next,  previous,  up
-@section Summary
-
-Learning Lisp is like climbing a hill in which the first part is the
-steepest.  You have now climbed the most difficult part; what remains
-becomes easier as you progress onwards.
-
-@need 1000
-In summary,
-
-@itemize @bullet
-
-@item
-Lisp programs are made up of expressions, which are lists or single atoms.
-
-@item
-Lists are made up of zero or more atoms or inner lists, separated by whitespace and
-surrounded by parentheses.  A list can be empty.
-
-@item
-Atoms are multi-character symbols, like @code{forward-paragraph}, single
-character symbols like @code{+}, strings of characters between double
-quotation marks, or numbers.
-
-@item
-A number evaluates to itself.
-
-@item
-A string between double quotes also evaluates to itself.
-
-@item
-When you evaluate a symbol by itself, its value is returned.
-
-@item
-When you evaluate a list, the Lisp interpreter looks at the first symbol
-in the list and then at the function definition bound to that symbol.
-Then the instructions in the function definition are carried out.
-
-@item
-A single quotation mark,
-@ifinfo
-'
-@end ifinfo
-@ifnotinfo
-@code{'}
-@end ifnotinfo
-, tells the Lisp interpreter that it should
-return the following expression as written, and not evaluate it as it
-would if the quote were not there.
-
-@item
-Arguments are the information passed to a function.  The arguments to a
-function are computed by evaluating the rest of the elements of the list
-of which the function is the first element.
-
-@item
-A function always returns a value when it is evaluated (unless it gets
-an error); in addition, it may also carry out some action called a
-``side effect''.  In many cases, a function's primary purpose is to
-create a side effect.
-@end itemize
-
-@node Error Message Exercises,  , Summary, List Processing
-@comment  node-name,  next,  previous,  up
-@section Exercises
-
-A few simple exercises:
-
-@itemize @bullet
-@item
-Generate an error message by evaluating an appropriate symbol that is
-not within parentheses.
-
-@item
-Generate an error message by evaluating an appropriate symbol that is
-between parentheses.
-
-@item
-Create a counter that increments by two rather than one.
-
-@item
-Write an expression that prints a message in the echo area when
-evaluated.
-@end itemize
-
-@node Practicing Evaluation, Writing Defuns, List Processing, Top
-@comment  node-name,  next,  previous,  up
-@chapter Practicing Evaluation
-@cindex Practicing evaluation
-@cindex Evaluation practice
-
-Before learning how to write a function definition in Emacs Lisp, it is
-useful to spend a little time evaluating various expressions that have
-already been written.  These expressions will be lists with the
-functions as their first (and often only) element.  Since some of the
-functions associated with buffers are both simple and interesting, we
-will start with those.  In this section, we will evaluate a few of
-these.  In another section, we will study the code of several other
-buffer-related functions, to see how they were written.
-
-@menu
-* How to Evaluate::            Typing editing commands or @kbd{C-x C-e}
-                                 causes evaluation.
-* Buffer Names::               Buffers and files are different.
-* Getting Buffers::            Getting a buffer itself, not merely its name.
-* Switching Buffers::          How to change to another buffer.
-* Buffer Size & Locations::    Where point is located and the size of
-                               the buffer.
-* Evaluation Exercise::
-@end menu
-
-@node How to Evaluate, Buffer Names, Practicing Evaluation, Practicing Evaluation
-@ifnottex
-@unnumberedsec How to Evaluate
-@end ifnottex
-
-@i{Whenever you give an editing command} to Emacs Lisp, such as the
-command to move the cursor or to scroll the screen, @i{you are evaluating
-an expression,} the first element of which is a function.  @i{This is
-how Emacs works.}
-
-@cindex @samp{interactive function} defined
-@cindex @samp{command} defined
-When you type keys, you cause the Lisp interpreter to evaluate an
-expression and that is how you get your results.  Even typing plain text
-involves evaluating an Emacs Lisp function, in this case, one that uses
-@code{self-insert-command}, which simply inserts the character you
-typed.  The functions you evaluate by typing keystrokes are called
-@dfn{interactive} functions, or @dfn{commands}; how you make a function
-interactive will be illustrated in the chapter on how to write function
-definitions.  @xref{Interactive, , Making a Function Interactive}.
-
-In addition to typing keyboard commands, we have seen a second way to
-evaluate an expression: by positioning the cursor after a list and
-typing @kbd{C-x C-e}.  This is what we will do in the rest of this
-section.  There are other ways to evaluate an expression as well; these
-will be described as we come to them.
-
-Besides being used for practicing evaluation, the functions shown in the
-next few sections are important in their own right.  A study of these
-functions makes clear the distinction between buffers and files, how to
-switch to a buffer, and how to determine a location within it.
-
-@node Buffer Names, Getting Buffers, How to Evaluate, Practicing Evaluation
-@comment  node-name,  next,  previous,  up
-@section Buffer Names
-@findex buffer-name
-@findex buffer-file-name
-
-The two functions, @code{buffer-name} and @code{buffer-file-name}, show
-the difference between a file and a buffer.  When you evaluate the
-following expression, @code{(buffer-name)}, the name of the buffer
-appears in the echo area.  When you evaluate @code{(buffer-file-name)},
-the name of the file to which the buffer refers appears in the echo
-area.  Usually, the name returned by @code{(buffer-name)} is the same as
-the name of the file to which it refers, and the name returned by
-@code{(buffer-file-name)} is the full path-name of the file.
-
-A file and a buffer are two different entities.  A file is information
-recorded permanently in the computer (unless you delete it).  A buffer,
-on the other hand, is information inside of Emacs that will vanish at
-the end of the editing session (or when you kill the buffer).  Usually,
-a buffer contains information that you have copied from a file; we say
-the buffer is @dfn{visiting} that file.  This copy is what you work on
-and modify.  Changes to the buffer do not change the file, until you
-save the buffer.  When you save the buffer, the buffer is copied to the file
-and is thus saved permanently.
-
-@need 1250
-If you are reading this in Info inside of GNU Emacs, you can evaluate
-each of the following expressions by positioning the cursor after it and
-typing @kbd{C-x C-e}.
-
-@example
-@group
-(buffer-name)
-
-(buffer-file-name)
-@end group
-@end example
-
-@noindent
-When I do this in Info, the value returned by evaluating
-@code{(buffer-name)} is @file{"*info*"}, and the value returned by
-evaluating @code{(buffer-file-name)} is @file{nil}.
-
-On the other hand, while I am writing this Introduction, the value
-returned by evaluating @code{(buffer-name)} is
-@file{"introduction.texinfo"}, and the value returned by evaluating
-@code{(buffer-file-name)} is
-@file{"/gnu/work/intro/introduction.texinfo"}.
-
-@cindex @code{nil}, history of word
-The former is the name of the buffer and the latter is the name of the
-file.  In Info, the buffer name is @file{"*info*"}.  Info does not
-point to any file, so the result of evaluating
-@code{(buffer-file-name)} is @file{nil}.  The symbol @code{nil} is
-from the Latin word for `nothing'; in this case, it means that the
-buffer is not associated with any file.  (In Lisp, @code{nil} is also
-used to mean `false' and is a synonym for the empty list, @code{()}.)
-
-When I am writing, the name of my buffer is
-@file{"introduction.texinfo"}.  The name of the file to which it
-points is @file{"/gnu/work/intro/introduction.texinfo"}.
-
-(In the expressions, the parentheses tell the Lisp interpreter to
-treat @w{@code{buffer-name}} and @w{@code{buffer-file-name}} as
-functions; without the parentheses, the interpreter would attempt to
-evaluate the symbols as variables.  @xref{Variables}.)
-
-In spite of the distinction between files and buffers, you will often
-find that people refer to a file when they mean a buffer and vice-verse.
-Indeed, most people say, ``I am editing a file,'' rather than saying,
-``I am editing a buffer which I will soon save to a file.''  It is
-almost always clear from context what people mean.  When dealing with
-computer programs, however, it is important to keep the distinction in mind,
-since the computer is not as smart as a person.
-
-@cindex Buffer, history of word
-The word `buffer', by the way, comes from the meaning of the word as a
-cushion that deadens the force of a collision.  In early computers, a
-buffer cushioned the interaction between files and the computer's
-central processing unit.  The drums or tapes that held a file and the
-central processing unit were pieces of equipment that were very
-different from each other, working at their own speeds, in spurts.  The
-buffer made it possible for them to work together effectively.
-Eventually, the buffer grew from being an intermediary, a temporary
-holding place, to being the place where work is done.  This
-transformation is rather like that of a small seaport that grew into a
-great city: once it was merely the place where cargo was warehoused
-temporarily before being loaded onto ships; then it became a business
-and cultural center in its own right.
-
-Not all buffers are associated with files.  For example, a
-@file{*scratch*} buffer does not visit any file.  Similarly, a
-@file{*Help*} buffer is not associated with any file.
-
-In the old days, when you lacked a @file{~/.emacs} file and started an
-Emacs session by typing the command @code{emacs} alone, without naming
-any files, Emacs started with the @file{*scratch*} buffer visible.
-Nowadays, you will see a splash screen.  You can follow one of the
-commands suggested on the splash screen, visit a file, or press the
-spacebar to reach the @file{*scratch*} buffer.
-
-If you switch to the @file{*scratch*} buffer, type
-@code{(buffer-name)}, position the cursor after it, and then type
-@kbd{C-x C-e} to evaluate the expression.  The name @code{"*scratch*"}
-will be returned and will appear in the echo area.  @code{"*scratch*"}
-is the name of the buffer.  When you type @code{(buffer-file-name)} in
-the @file{*scratch*} buffer and evaluate that, @code{nil} will appear
-in the echo area, just as it does when you evaluate
-@code{(buffer-file-name)} in Info.
-
-Incidentally, if you are in the @file{*scratch*} buffer and want the
-value returned by an expression to appear in the @file{*scratch*}
-buffer itself rather than in the echo area, type @kbd{C-u C-x C-e}
-instead of @kbd{C-x C-e}.  This causes the value returned to appear
-after the expression.  The buffer will look like this:
-
-@smallexample
-(buffer-name)"*scratch*"
-@end smallexample
-
-@noindent
-You cannot do this in Info since Info is read-only and it will not allow
-you to change the contents of the buffer.  But you can do this in any
-buffer you can edit; and when you write code or documentation (such as
-this book), this feature is very useful.
-
-@node Getting Buffers, Switching Buffers, Buffer Names, Practicing Evaluation
-@comment  node-name,  next,  previous,  up
-@section Getting Buffers
-@findex current-buffer
-@findex other-buffer
-@cindex Getting a buffer
-
-The @code{buffer-name} function returns the @emph{name} of the buffer;
-to get the buffer @emph{itself}, a different function is needed: the
-@code{current-buffer} function.  If you use this function in code, what
-you get is the buffer itself.
-
-A name and the object or entity to which the name refers are different
-from each other.  You are not your name.  You are a person to whom
-others refer by name.  If you ask to speak to George and someone hands you
-a card with the letters @samp{G}, @samp{e}, @samp{o}, @samp{r},
-@samp{g}, and @samp{e} written on it, you might be amused, but you would
-not be satisfied.  You do not want to speak to the name, but to the
-person to whom the name refers.  A buffer is similar: the name of the
-scratch buffer is @file{*scratch*}, but the name is not the buffer.  To
-get a buffer itself, you need to use a function such as
-@code{current-buffer}.
-
-However, there is a slight complication: if you evaluate
-@code{current-buffer} in an expression on its own, as we will do here,
-what you see is a printed representation of the name of the buffer
-without the contents of the buffer.  Emacs works this way for two
-reasons: the buffer may be thousands of lines long---too long to be
-conveniently displayed; and, another buffer may have the same contents
-but a different name, and it is important to distinguish between them.
-
-@need 800
-Here is an expression containing the function:
-
-@smallexample
-(current-buffer)
-@end smallexample
-
-@noindent
-If you evaluate this expression in Info in Emacs in the usual way,
-@file{#<buffer *info*>} will appear in the echo area.  The special
-format indicates that the buffer itself is being returned, rather than
-just its name.
-
-Incidentally, while you can type a number or symbol into a program, you
-cannot do that with the printed representation of a buffer: the only way
-to get a buffer itself is with a function such as @code{current-buffer}.
-
-A related function is @code{other-buffer}.  This returns the most
-recently selected buffer other than the one you are in currently, not
-a printed representation of its name.  If you have recently switched
-back and forth from the @file{*scratch*} buffer, @code{other-buffer}
-will return that buffer.
-
-@need 800
-You can see this by evaluating the expression:
-
-@smallexample
-(other-buffer)
-@end smallexample
-
-@noindent
-You should see @file{#<buffer *scratch*>} appear in the echo area, or
-the name of whatever other buffer you switched back from most
-recently@footnote{Actually, by default, if the buffer from which you
-just switched is visible to you in another window, @code{other-buffer}
-will choose the most recent buffer that you cannot see; this is a
-subtlety that I often forget.}.
-
-@node Switching Buffers, Buffer Size & Locations, Getting Buffers, Practicing Evaluation
-@comment  node-name,  next,  previous,  up
-@section Switching Buffers
-@findex switch-to-buffer
-@findex set-buffer
-@cindex Switching to a buffer
-
-The @code{other-buffer} function actually provides a buffer when it is
-used as an argument to a function that requires one.  We can see this
-by using @code{other-buffer} and @code{switch-to-buffer} to switch to a
-different buffer.
-
-But first, a brief introduction to the @code{switch-to-buffer}
-function.  When you switched back and forth from Info to the
-@file{*scratch*} buffer to evaluate @code{(buffer-name)}, you most
-likely typed @kbd{C-x b} and then typed @file{*scratch*}@footnote{Or
-rather, to save typing, you probably only typed @kbd{RET} if the
-default buffer was @file{*scratch*}, or if it was different, then you
-typed just part of the name, such as @code{*sc}, pressed your
-@kbd{TAB} key to cause it to expand to the full name, and then typed
-your @kbd{RET} key.} when prompted in the minibuffer for the name of
-the buffer to which you wanted to switch.  The keystrokes, @kbd{C-x
-b}, cause the Lisp interpreter to evaluate the interactive function
-@code{switch-to-buffer}.  As we said before, this is how Emacs works:
-different keystrokes call or run different functions.  For example,
-@kbd{C-f} calls @code{forward-char}, @kbd{M-e} calls
-@code{forward-sentence}, and so on.
-
-By writing @code{switch-to-buffer} in an expression, and giving it a
-buffer to switch to, we can switch buffers just the way @kbd{C-x b}
-does.
-
-@need 1000
-Here is the Lisp expression:
-
-@smallexample
-(switch-to-buffer (other-buffer))
-@end smallexample
-
-@noindent
-The symbol @code{switch-to-buffer} is the first element of the list,
-so the Lisp interpreter will treat it as a function and carry out the
-instructions that are attached to it.  But before doing that, the
-interpreter will note that @code{other-buffer} is inside parentheses
-and work on that symbol first.  @code{other-buffer} is the first (and
-in this case, the only) element of this list, so the Lisp interpreter
-calls or runs the function.  It returns another buffer.  Next, the
-interpreter runs @code{switch-to-buffer}, passing to it, as an
-argument, the other buffer, which is what Emacs will switch to.  If
-you are reading this in Info, try this now.  Evaluate the expression.
-(To get back, type @kbd{C-x b @key{RET}}.)@footnote{Remember, this
-expression will move you to your most recent other buffer that you
-cannot see.  If you really want to go to your most recently selected
-buffer, even if you can still see it, you need to evaluate the
-following more complex expression:
-
-@smallexample
-(switch-to-buffer (other-buffer (current-buffer) t))
-@end smallexample
-
-@c noindent
-In this case, the first argument to @code{other-buffer} tells it which
-buffer to skip---the current one---and the second argument tells
-@code{other-buffer} it is OK to switch to a visible buffer.
-In regular use, @code{switch-to-buffer} takes you to an invisible
-window since you would most likely use @kbd{C-x o} (@code{other-window})
-to go to another visible buffer.}
-
-In the programming examples in later sections of this document, you will
-see the function @code{set-buffer} more often than
-@code{switch-to-buffer}.  This is because of a difference between
-computer programs and humans: humans have eyes and expect to see the
-buffer on which they are working on their computer terminals.  This is
-so obvious, it almost goes without saying.  However, programs do not
-have eyes.  When a computer program works on a buffer, that buffer does
-not need to be visible on the screen.
-
-@code{switch-to-buffer} is designed for humans and does two different
-things: it switches the buffer to which Emacs' attention is directed; and
-it switches the buffer displayed in the window to the new buffer.
-@code{set-buffer}, on the other hand, does only one thing: it switches
-the attention of the computer program to a different buffer.  The buffer
-on the screen remains unchanged (of course, normally nothing happens
-there until the command finishes running).
-
-@cindex @samp{call} defined
-Also, we have just introduced another jargon term, the word @dfn{call}.
-When you evaluate a list in which the first symbol is a function, you
-are calling that function.  The use of the term comes from the notion of
-the function as an entity that can do something for you if you `call'
-it---just as a plumber is an entity who can fix a leak if you call him
-or her.
-
-@node Buffer Size & Locations, Evaluation Exercise, Switching Buffers, Practicing Evaluation
-@comment  node-name,  next,  previous,  up
-@section Buffer Size and the Location of Point
-@cindex Size of buffer
-@cindex Buffer size
-@cindex Point location
-@cindex Location of point
-
-Finally, let's look at several rather simple functions,
-@code{buffer-size}, @code{point}, @code{point-min}, and
-@code{point-max}.  These give information about the size of a buffer and
-the location of point within it.
-
-The function @code{buffer-size} tells you the size of the current
-buffer; that is, the function returns a count of the number of
-characters in the buffer.
-
-@smallexample
-(buffer-size)
-@end smallexample
-
-@noindent
-You can evaluate this in the usual way, by positioning the
-cursor after the expression and typing @kbd{C-x C-e}.
-
-@cindex @samp{point} defined
-In Emacs, the current  position of the cursor is called @dfn{point}.
-The expression @code{(point)} returns a number that tells you where the
-cursor is located as a count of the number of characters from the
-beginning of the buffer up to point.
-
-@need 1250
-You can see the character count for point in this buffer by evaluating
-the following expression in the usual way:
-
-@smallexample
-(point)
-@end smallexample
-
-@noindent
-As I write this, the value of @code{point} is 65724.  The @code{point}
-function is frequently used in some of the examples later in this
-book.
-
-@need 1250
-The value of point depends, of course, on its location within the
-buffer.  If you evaluate point in this spot, the number will be larger:
-
-@smallexample
-(point)
-@end smallexample
-
-@noindent
-For me, the value of point in this location is 66043, which means that
-there are 319 characters (including spaces) between the two
-expressions.  (Doubtless, you will see different numbers, since I will
-have edited this since I first evaluated point.)
-
-@cindex @samp{narrowing} defined
-The function @code{point-min} is somewhat similar to @code{point}, but
-it returns the value of the minimum permissible value of point in the
-current buffer.  This is the number 1 unless @dfn{narrowing} is in
-effect.  (Narrowing is a mechanism whereby you can restrict yourself,
-or a program, to operations on just a part of a buffer.
-@xref{Narrowing & Widening, , Narrowing and Widening}.)  Likewise, the
-function @code{point-max} returns the value of the maximum permissible
-value of point in the current buffer.
-
-@node Evaluation Exercise,  , Buffer Size & Locations, Practicing Evaluation
-@section Exercise
-
-Find a file with which you are working and move towards its middle.
-Find its buffer name, file name, length, and your position in the file.
-
-@node Writing Defuns, Buffer Walk Through, Practicing Evaluation, Top
-@comment  node-name,  next,  previous,  up
-@chapter How To Write Function Definitions
-@cindex Definition writing
-@cindex Function definition writing
-@cindex Writing a function definition
-
-When the Lisp interpreter evaluates a list, it looks to see whether the
-first symbol on the list has a function definition attached to it; or,
-put another way, whether the symbol points to a function definition.  If
-it does, the computer carries out the instructions in the definition.  A
-symbol that has a function definition is called, simply, a function
-(although, properly speaking, the definition is the function and the
-symbol refers to it.)
-
-@menu
-* Primitive Functions::
-* defun::                        The @code{defun} special form.
-* Install::                      Install a function definition.
-* Interactive::                  Making a function interactive.
-* Interactive Options::          Different options for @code{interactive}.
-* Permanent Installation::       Installing code permanently.
-* let::                          Creating and initializing local variables.
-* if::                           What if?
-* else::                         If--then--else expressions.
-* Truth & Falsehood::            What Lisp considers false and true.
-* save-excursion::               Keeping track of point, mark, and buffer.
-* Review::
-* defun Exercises::
-@end menu
-
-@node Primitive Functions, defun, Writing Defuns, Writing Defuns
-@ifnottex
-@unnumberedsec An Aside about Primitive Functions
-@end ifnottex
-@cindex Primitive functions
-@cindex Functions, primitive
-
-@cindex C language primitives
-@cindex Primitives written in C
-All functions are defined in terms of other functions, except for a few
-@dfn{primitive} functions that are written in the C programming
-language.  When you write functions' definitions, you will write them in
-Emacs Lisp and use other functions as your building blocks.  Some of the
-functions you will use will themselves be written in Emacs Lisp (perhaps
-by you) and some will be primitives written in C.  The primitive
-functions are used exactly like those written in Emacs Lisp and behave
-like them.  They are written in C so we can easily run GNU Emacs on any
-computer that has sufficient power and can run C.
-
-Let me re-emphasize this: when you write code in Emacs Lisp, you do not
-distinguish between the use of functions written in C and the use of
-functions written in Emacs Lisp.  The difference is irrelevant.  I
-mention the distinction only because it is interesting to know.  Indeed,
-unless you investigate, you won't know whether an already-written
-function is written in Emacs Lisp or C.
-
-@node defun, Install, Primitive Functions, Writing Defuns
-@comment  node-name,  next,  previous,  up
-@section The @code{defun} Special Form
-@findex defun
-@cindex Special form of @code{defun}
-
-@cindex @samp{function definition} defined
-In Lisp, a symbol such as @code{mark-whole-buffer} has code attached to
-it that tells the computer what to do when the function is called.
-This code is called the @dfn{function definition} and is created by
-evaluating a Lisp expression that starts with the symbol @code{defun}
-(which is an abbreviation for @emph{define function}).  Because
-@code{defun} does not evaluate its arguments in the usual way, it is
-called a @dfn{special form}.
-
-In subsequent sections, we will look at function definitions from the
-Emacs source code, such as @code{mark-whole-buffer}.  In this section,
-we will describe a simple function definition so you can see how it
-looks.  This function definition uses arithmetic because it makes for a
-simple example.  Some people dislike examples using arithmetic; however,
-if you are such a person, do not despair.  Hardly any of the code we
-will study in the remainder of this introduction involves arithmetic or
-mathematics.  The examples mostly involve text in one way or another.
-
-A function definition has up to five parts following the word
-@code{defun}:
-
-@enumerate
-@item
-The name of the symbol to which the function definition should be
-attached.
-
-@item
-A list of the arguments that will be passed to the function.  If no
-arguments will be passed to the function, this is an empty list,
-@code{()}.
-
-@item
-Documentation describing the function.  (Technically optional, but
-strongly recommended.)
-
-@item
-Optionally, an expression to make the function interactive so you can
-use it by typing @kbd{M-x} and then the name of the function; or by
-typing an appropriate key or keychord.
-
-@cindex @samp{body} defined
-@item
-The code that instructs the computer what to do: the @dfn{body} of the
-function definition.
-@end enumerate
-
-It is helpful to think of the five parts of a function definition as
-being organized in a template, with slots for each part:
-
-@smallexample
-@group
-(defun @var{function-name} (@var{arguments}@dots{})
-  "@var{optional-documentation}@dots{}"
-  (interactive @var{argument-passing-info})     ; @r{optional}
-  @var{body}@dots{})
-@end group
-@end smallexample
-
-As an example, here is the code for a function that multiplies its
-argument by 7.  (This example is not interactive.  @xref{Interactive,
-, Making a Function Interactive}, for that information.)
-
-@smallexample
-@group
-(defun multiply-by-seven (number)
-  "Multiply NUMBER by seven."
-  (* 7 number))
-@end group
-@end smallexample
-
-This definition begins with a parenthesis and the symbol @code{defun},
-followed by the name of the function.
-
-@cindex @samp{argument list} defined
-The name of the function is followed by a list that contains the
-arguments that will be passed to the function.  This list is called
-the @dfn{argument list}.  In this example, the list has only one
-element, the symbol, @code{number}.  When the function is used, the
-symbol will be bound to the value that is used as the argument to the
-function.
-
-Instead of choosing the word @code{number} for the name of the argument,
-I could have picked any other name.  For example, I could have chosen
-the word @code{multiplicand}.  I picked the word `number' because it
-tells what kind of value is intended for this slot; but I could just as
-well have chosen the word `multiplicand' to indicate the role that the
-value placed in this slot will play in the workings of the function.  I
-could have called it @code{foogle}, but that would have been a bad
-choice because it would not tell humans what it means.  The choice of
-name is up to the programmer and should be chosen to make the meaning of
-the function clear.
-
-Indeed, you can choose any name you wish for a symbol in an argument
-list, even the name of a symbol used in some other function: the name
-you use in an argument list is private to that particular definition.
-In that definition, the name refers to a different entity than any use
-of the same name outside the function definition.  Suppose you have a
-nick-name `Shorty' in your family; when your family members refer to
-`Shorty', they mean you.  But outside your family, in a movie, for
-example, the name `Shorty' refers to someone else.  Because a name in an
-argument list is private to the function definition, you can change the
-value of such a symbol inside the body of a function without changing
-its value outside the function.  The effect is similar to that produced
-by a @code{let} expression.  (@xref{let, , @code{let}}.)
-
-@ignore
-Note also that we discuss the word `number' in two different ways: as a
-symbol that appears in the code, and as the name of something that will
-be replaced by a something else during the evaluation of the function.
-In the first case, @code{number} is a symbol, not a number; it happens
-that within the function, it is a variable who value is the number in
-question, but our primary interest in it is as a symbol.  On the other
-hand, when we are talking about the function, our interest is that we
-will substitute a number for the word @var{number}.  To keep this
-distinction clear, we use different typography for the two
-circumstances.  When we talk about this function, or about how it works,
-we refer to this number by writing @var{number}.  In the function
-itself, we refer to it by writing @code{number}.
-@end ignore
-
-The argument list is followed by the documentation string that
-describes the function.  This is what you see when you type
-@w{@kbd{C-h f}} and the name of a function.  Incidentally, when you
-write a documentation string like this, you should make the first line
-a complete sentence since some commands, such as @code{apropos}, print
-only the first line of a multi-line documentation string.  Also, you
-should not indent the second line of a documentation string, if you
-have one, because that looks odd when you use @kbd{C-h f}
-(@code{describe-function}).  The documentation string is optional, but
-it is so useful, it should be included in almost every function you
-write.
-
-@findex * @r{(multiplication)}
-The third line of the example consists of the body of the function
-definition.  (Most functions' definitions, of course, are longer than
-this.)  In this function, the body is the list, @code{(* 7 number)}, which
-says to multiply the value of @var{number} by 7.  (In Emacs Lisp,
-@code{*} is the function for multiplication, just as @code{+} is the
-function for addition.)
-
-When you use the @code{multiply-by-seven} function, the argument
-@code{number} evaluates to the actual number you want used.  Here is an
-example that shows how @code{multiply-by-seven} is used; but don't try
-to evaluate this yet!
-
-@smallexample
-(multiply-by-seven 3)
-@end smallexample
-
-@noindent
-The symbol @code{number}, specified in the function definition in the
-next section, is given or ``bound to'' the value 3 in the actual use of
-the function.  Note that although @code{number} was inside parentheses
-in the function definition, the argument passed to the
-@code{multiply-by-seven} function is not in parentheses.  The
-parentheses are written in the function definition so the computer can
-figure out where the argument list ends and the rest of the function
-definition begins.
-
-If you evaluate this example, you are likely to get an error message.
-(Go ahead, try it!)  This is because we have written the function
-definition, but not yet told the computer about the definition---we have
-not yet installed (or `loaded') the function definition in Emacs.
-Installing a function is the process that tells the Lisp interpreter the
-definition of the function.  Installation is described in the next
-section.
-
-@node Install, Interactive, defun, Writing Defuns
-@comment  node-name,  next,  previous,  up
-@section Install a Function Definition
-@cindex Install a Function Definition
-@cindex Definition installation
-@cindex Function definition installation
-
-If you are reading this inside of Info in Emacs, you can try out the
-@code{multiply-by-seven} function by first evaluating the function
-definition and then evaluating @code{(multiply-by-seven 3)}.  A copy of
-the function definition follows.  Place the cursor after the last
-parenthesis of the function definition and type @kbd{C-x C-e}.  When you
-do this, @code{multiply-by-seven} will appear in the echo area.  (What
-this means is that when a function definition is evaluated, the value it
-returns is the name of the defined function.)  At the same time, this
-action installs the function definition.
-
-@smallexample
-@group
-(defun multiply-by-seven (number)
-  "Multiply NUMBER by seven."
-  (* 7 number))
-@end group
-@end smallexample
-
-@noindent
-By evaluating this @code{defun}, you have just installed
-@code{multiply-by-seven} in Emacs.  The function is now just as much a
-part of Emacs as @code{forward-word} or any other editing function you
-use.  (@code{multiply-by-seven} will stay installed until you quit
-Emacs.  To reload code automatically whenever you start Emacs, see
-@ref{Permanent Installation, , Installing Code Permanently}.)
-
-@menu
-* Effect of installation::
-* Change a defun::              How to change a function definition.
-@end menu
-
-@node Effect of installation, Change a defun, Install, Install
-@ifnottex
-@unnumberedsubsec The effect of installation
-@end ifnottex
-
-You can see the effect of installing @code{multiply-by-seven} by
-evaluating the following sample.  Place the cursor after the following
-expression and type @kbd{C-x C-e}.  The number 21 will appear in the
-echo area.
-
-@smallexample
-(multiply-by-seven 3)
-@end smallexample
-
-If you wish, you can read the documentation for the function by typing
-@kbd{C-h f} (@code{describe-function}) and then the name of the
-function, @code{multiply-by-seven}.  When you do this, a
-@file{*Help*} window will appear on your screen that says:
-
-@smallexample
-@group
-multiply-by-seven is a Lisp function.
-(multiply-by-seven NUMBER)
-
-Multiply NUMBER by seven.
-@end group
-@end smallexample
-
-@noindent
-(To return to a single window on your screen, type @kbd{C-x 1}.)
-
-@node Change a defun,  , Effect of installation, Install
-@comment  node-name,  next,  previous,  up
-@subsection Change a Function Definition
-@cindex Changing a function definition
-@cindex Function definition, how to change
-@cindex Definition, how to change
-
-If you want to change the code in @code{multiply-by-seven}, just rewrite
-it.  To install the new version in place of the old one, evaluate the
-function definition again.  This is how you modify code in Emacs.  It is
-very simple.
-
-As an example, you can change the @code{multiply-by-seven} function to
-add the number to itself seven times instead of multiplying the number
-by seven.  It produces the same answer, but by a different path.  At
-the same time, we will add a comment to the code; a comment is text
-that the Lisp interpreter ignores, but that a human reader may find
-useful or enlightening.  The comment is that this is the ``second
-version''.
-
-@smallexample
-@group
-(defun multiply-by-seven (number)       ; @r{Second version.}
-  "Multiply NUMBER by seven."
-  (+ number number number number number number number))
-@end group
-@end smallexample
-
-@cindex Comments in Lisp code
-The comment follows a semicolon, @samp{;}.  In Lisp, everything on a
-line that follows a semicolon is a comment.  The end of the line is the
-end of the comment.  To stretch a comment over two or more lines, begin
-each line with a semicolon.
-
-@xref{Beginning a .emacs File, , Beginning a @file{.emacs}
-File}, and @ref{Comments, , Comments, elisp, The GNU Emacs Lisp
-Reference Manual}, for more about comments.
-
-You can install this version of the @code{multiply-by-seven} function by
-evaluating it in the same way you evaluated the first function: place
-the cursor after the last parenthesis and type @kbd{C-x C-e}.
-
-In summary, this is how you write code in Emacs Lisp: you write a
-function; install it; test it; and then make fixes or enhancements and
-install it again.
-
-@node Interactive, Interactive Options, Install, Writing Defuns
-@comment  node-name,  next,  previous,  up
-@section Make a Function Interactive
-@cindex Interactive functions
-@findex interactive
-
-You make a function interactive by placing a list that begins with
-the special form @code{interactive} immediately after the
-documentation.  A user can invoke an interactive function by typing
-@kbd{M-x} and then the name of the function; or by typing the keys to
-which it is bound, for example, by typing @kbd{C-n} for
-@code{next-line} or @kbd{C-x h} for @code{mark-whole-buffer}.
-
-Interestingly, when you call an interactive function interactively,
-the value returned is not automatically displayed in the echo area.
-This is because you often call an interactive function for its side
-effects, such as moving forward by a word or line, and not for the
-value returned.  If the returned value were displayed in the echo area
-each time you typed a key, it would be very distracting.
-
-@menu
-* Interactive multiply-by-seven::  An overview.
-* multiply-by-seven in detail::    The interactive version.
-@end menu
-
-@node Interactive multiply-by-seven, multiply-by-seven in detail, Interactive, Interactive
-@ifnottex
-@unnumberedsubsec An Interactive @code{multiply-by-seven}, An Overview
-@end ifnottex
-
-Both the use of the special form @code{interactive} and one way to
-display a value in the echo area can be illustrated by creating an
-interactive version of @code{multiply-by-seven}.
-
-@need 1250
-Here is the code:
-
-@smallexample
-@group
-(defun multiply-by-seven (number)       ; @r{Interactive version.}
-  "Multiply NUMBER by seven."
-  (interactive "p")
-  (message "The result is %d" (* 7 number)))
-@end group
-@end smallexample
-
-@noindent
-You can install this code by placing your cursor after it and typing
-@kbd{C-x C-e}.  The name of the function will appear in your echo area.
-Then, you can use this code by typing @kbd{C-u} and a number and then
-typing @kbd{M-x multiply-by-seven} and pressing @key{RET}.  The phrase
-@samp{The result is @dots{}} followed by the product will appear in the
-echo area.
-
-Speaking more generally, you invoke a function like this in either of two
-ways:
-
-@enumerate
-@item
-By typing a prefix argument that contains the number to be passed, and
-then typing @kbd{M-x} and the name of the function, as with
-@kbd{C-u 3 M-x forward-sentence}; or,
-
-@item
-By typing whatever key or keychord the function is bound to, as with
-@kbd{C-u 3 M-e}.
-@end enumerate
-
-@noindent
-Both the examples just mentioned work identically to move point forward
-three sentences.  (Since @code{multiply-by-seven} is not bound to a key,
-it could not be used as an example of key binding.)
-
-(@xref{Keybindings, , Some Keybindings}, to learn how to bind a command
-to a key.)
-
-A prefix argument is passed to an interactive function by typing the
-@key{META} key followed by a number, for example, @kbd{M-3 M-e}, or by
-typing @kbd{C-u} and then a number, for example, @kbd{C-u 3 M-e} (if you
-type @kbd{C-u} without a number, it defaults to 4).
-
-@node multiply-by-seven in detail,  , Interactive multiply-by-seven, Interactive
-@comment  node-name,  next,  previous,  up
-@subsection An Interactive @code{multiply-by-seven}
-
-Let's look at the use of the special form @code{interactive} and then at
-the function @code{message} in the interactive version of
-@code{multiply-by-seven}.  You will recall that the function definition
-looks like this:
-
-@smallexample
-@group
-(defun multiply-by-seven (number)       ; @r{Interactive version.}
-  "Multiply NUMBER by seven."
-  (interactive "p")
-  (message "The result is %d" (* 7 number)))
-@end group
-@end smallexample
-
-In this function, the expression, @code{(interactive "p")}, is a list of
-two elements.  The @code{"p"} tells Emacs to pass the prefix argument to
-the function and use its value for the argument of the function.
-
-@need 1000
-The argument will be a number.  This means that the symbol
-@code{number} will be bound to a number in the line:
-
-@smallexample
-(message "The result is %d" (* 7 number))
-@end smallexample
-
-@need 1250
-@noindent
-For example, if your prefix argument is 5, the Lisp interpreter will
-evaluate the line as if it were:
-
-@smallexample
-(message "The result is %d" (* 7 5))
-@end smallexample
-
-@noindent
-(If you are reading this in GNU Emacs, you can evaluate this expression
-yourself.)  First, the interpreter will evaluate the inner list, which
-is @code{(* 7 5)}.  This returns a value of 35.  Next, it
-will evaluate the outer list, passing the values of the second and
-subsequent elements of the list to the function @code{message}.
-
-As we have seen, @code{message} is an Emacs Lisp function especially
-designed for sending a one line message to a user.  (@xref{message, ,
-The @code{message} function}.)  In summary, the @code{message}
-function prints its first argument in the echo area as is, except for
-occurrences of @samp{%d} or @samp{%s} (and various other %-sequences
-which we have not mentioned).  When it sees a control sequence, the
-function looks to the second or subsequent arguments and prints the
-value of the argument in the location in the string where the control
-sequence is located.
-
-In the interactive @code{multiply-by-seven} function, the control string
-is @samp{%d}, which requires a number, and the value returned by
-evaluating @code{(* 7 5)} is the number 35.  Consequently, the number 35
-is printed in place of the @samp{%d} and the message is @samp{The result
-is 35}.
-
-(Note that when you call the function @code{multiply-by-seven}, the
-message is printed without quotes, but when you call @code{message}, the
-text is printed in double quotes.  This is because the value returned by
-@code{message} is what appears in the echo area when you evaluate an
-expression whose first element is @code{message}; but when embedded in a
-function, @code{message} prints the text as a side effect without
-quotes.)
-
-@node Interactive Options, Permanent Installation, Interactive, Writing Defuns
-@comment  node-name,  next,  previous,  up
-@section Different Options for @code{interactive}
-@cindex Options for @code{interactive}
-@cindex Interactive options
-
-In the example, @code{multiply-by-seven} used @code{"p"} as the
-argument to @code{interactive}.  This argument told Emacs to interpret
-your typing either @kbd{C-u} followed by a number or @key{META}
-followed by a number as a command to pass that number to the function
-as its argument.  Emacs has more than twenty characters predefined for
-use with @code{interactive}.  In almost every case, one of these
-options will enable you to pass the right information interactively to
-a function.  (@xref{Interactive Codes, , Code Characters for
-@code{interactive}, elisp, The GNU Emacs Lisp Reference Manual}.)
-
-@need 1250
-Consider the function @code{zap-to-char}.  Its interactive expression
-is
-
-@smallexample
-(interactive "p\ncZap to char: ")
-@end smallexample
-
-The first part of the argument to @code{interactive} is @samp{p}, with
-which you are already familiar.  This argument tells Emacs to
-interpret a `prefix', as a number to be passed to the function.  You
-can specify a prefix either by typing @kbd{C-u} followed by a number
-or by typing @key{META} followed by a number.  The prefix is the
-number of specified characters.  Thus, if your prefix is three and the
-specified character is @samp{x}, then you will delete all the text up
-to and including the third next @samp{x}.  If you do not set a prefix,
-then you delete all the text up to and including the specified
-character, but no more.
-
-The @samp{c} tells the function the name of the character to which to delete.
-
-More formally, a function with two or more arguments can have
-information passed to each argument by adding parts to the string that
-follows @code{interactive}.  When you do this, the information is
-passed to each argument in the same order it is specified in the
-@code{interactive} list.  In the string, each part is separated from
-the next part by a @samp{\n}, which is a newline.  For example, you
-can follow @samp{p} with a @samp{\n} and an @samp{cZap to char:@: }.
-This causes Emacs to pass the value of the prefix argument (if there
-is one) and the character.
-
-In this case, the function definition looks like the following, where
-@code{arg} and @code{char} are the symbols to which @code{interactive}
-binds the prefix argument and the specified character:
-
-@smallexample
-@group
-(defun @var{name-of-function} (arg char)
-  "@var{documentation}@dots{}"
-  (interactive "p\ncZap to char: ")
-  @var{body-of-function}@dots{})
-@end group
-@end smallexample
-
-@noindent
-(The space after the colon in the prompt makes it look better when you
-are prompted.  @xref{copy-to-buffer, , The Definition of
-@code{copy-to-buffer}}, for an example.)
-
-When a function does not take arguments, @code{interactive} does not
-require any.  Such a function contains the simple expression
-@code{(interactive)}.  The @code{mark-whole-buffer} function is like
-this.
-
-Alternatively, if the special letter-codes are not right for your
-application, you can pass your own arguments to @code{interactive} as
-a list.
-
-@xref{append-to-buffer, , The Definition of @code{append-to-buffer}},
-for an example.  @xref{Using Interactive, , Using @code{Interactive},
-elisp, The GNU Emacs Lisp Reference Manual}, for a more complete
-explanation about this technique.
-
-@node Permanent Installation, let, Interactive Options, Writing Defuns
-@comment  node-name,  next,  previous,  up
-@section Install Code Permanently
-@cindex Install code permanently
-@cindex Permanent code installation
-@cindex Code installation
-
-When you install a function definition by evaluating it, it will stay
-installed until you quit Emacs.  The next time you start a new session
-of Emacs, the function will not be installed unless you evaluate the
-function definition again.
-
-At some point, you may want to have code installed automatically
-whenever you start a new session of Emacs.  There are several ways of
-doing this:
-
-@itemize @bullet
-@item
-If you have code that is just for yourself, you can put the code for the
-function definition in your @file{.emacs} initialization file.  When you
-start Emacs, your @file{.emacs} file is automatically evaluated and all
-the function definitions within it are installed.
-@xref{Emacs Initialization, , Your @file{.emacs} File}.
-
-@item
-Alternatively, you can put the function definitions that you want
-installed in one or more files of their own and use the @code{load}
-function to cause Emacs to evaluate and thereby install each of the
-functions in the files.
-@xref{Loading Files, , Loading Files}.
-
-@item
-Thirdly, if you have code that your whole site will use, it is usual
-to put it in a file called @file{site-init.el} that is loaded when
-Emacs is built.  This makes the code available to everyone who uses
-your machine.  (See the @file{INSTALL} file that is part of the Emacs
-distribution.)
-@end itemize
-
-Finally, if you have code that everyone who uses Emacs may want, you
-can post it on a computer network or send a copy to the Free Software
-Foundation.  (When you do this, please license the code and its
-documentation under a license that permits other people to run, copy,
-study, modify, and redistribute the code and which protects you from
-having your work taken from you.)  If you send a copy of your code to
-the Free Software Foundation, and properly protect yourself and
-others, it may be included in the next release of Emacs.  In large
-part, this is how Emacs has grown over the past years, by donations.
-
-@node let, if, Permanent Installation, Writing Defuns
-@comment  node-name,  next,  previous,  up
-@section @code{let}
-@findex let
-
-The @code{let} expression is a special form in Lisp that you will need
-to use in most function definitions.
-
-@code{let} is used to attach or bind a symbol to a value in such a way
-that the Lisp interpreter will not confuse the variable with a
-variable of the same name that is not part of the function.
-
-To understand why the @code{let} special form is necessary, consider
-the situation in which you own a home that you generally refer to as
-`the house', as in the sentence, ``The house needs painting.''  If you
-are visiting a friend and your host refers to `the house', he is
-likely to be referring to @emph{his} house, not yours, that is, to a
-different house.
-
-If your friend is referring to his house and you think he is referring
-to your house, you may be in for some confusion.  The same thing could
-happen in Lisp if a variable that is used inside of one function has
-the same name as a variable that is used inside of another function,
-and the two are not intended to refer to the same value.  The
-@code{let} special form prevents this kind of confusion.
-
-@menu
-* Prevent confusion::
-* Parts of let Expression::
-* Sample let Expression::
-* Uninitialized let Variables::
-@end menu
-
-@node Prevent confusion, Parts of let Expression, let, let
-@ifnottex
-@unnumberedsubsec @code{let} Prevents Confusion
-@end ifnottex
-
-@cindex @samp{local variable} defined
-@cindex @samp{variable, local}, defined
-The @code{let} special form prevents confusion.  @code{let} creates a
-name for a @dfn{local variable} that overshadows any use of the same
-name outside the @code{let} expression.  This is like understanding
-that whenever your host refers to `the house', he means his house, not
-yours.  (Symbols used in argument lists work the same way.
-@xref{defun, , The @code{defun} Special Form}.)
-
-Local variables created by a @code{let} expression retain their value
-@emph{only} within the @code{let} expression itself (and within
-expressions called within the @code{let} expression); the local
-variables have no effect outside the @code{let} expression.
-
-Another way to think about @code{let} is that it is like a @code{setq}
-that is temporary and local.  The values set by @code{let} are
-automatically undone when the @code{let} is finished.  The setting
-only affects expressions that are inside the bounds of the @code{let}
-expression.  In computer science jargon, we would say ``the binding of
-a symbol is visible only in functions called in the @code{let} form;
-in Emacs Lisp, scoping is dynamic, not lexical.''
-
-@code{let} can create more than one variable at once.  Also,
-@code{let} gives each variable it creates an initial value, either a
-value specified by you, or @code{nil}.  (In the jargon, this is called
-`binding the variable to the value'.)  After @code{let} has created
-and bound the variables, it executes the code in the body of the
-@code{let}, and returns the value of the last expression in the body,
-as the value of the whole @code{let} expression.  (`Execute' is a jargon
-term that means to evaluate a list; it comes from the use of the word
-meaning `to give practical effect to' (@cite{Oxford English
-Dictionary}).  Since you evaluate an expression to perform an action,
-`execute' has evolved as a synonym to `evaluate'.)
-
-@node Parts of let Expression, Sample let Expression, Prevent confusion, let
-@comment  node-name,  next,  previous,  up
-@subsection The Parts of a @code{let} Expression
-@cindex @code{let} expression, parts of
-@cindex Parts of @code{let} expression
-
-@cindex @samp{varlist} defined
-A @code{let} expression is a list of three parts.  The first part is
-the symbol @code{let}.  The second part is a list, called a
-@dfn{varlist}, each element of which is either a symbol by itself or a
-two-element list, the first element of which is a symbol.  The third
-part of the @code{let} expression is the body of the @code{let}.  The
-body usually consists of one or more lists.
-
-@need 800
-A template for a @code{let} expression looks like this:
-
-@smallexample
-(let @var{varlist} @var{body}@dots{})
-@end smallexample
-
-@noindent
-The symbols in the varlist are the variables that are given initial
-values by the @code{let} special form.  Symbols by themselves are given
-the initial value of @code{nil}; and each symbol that is the first
-element of a two-element list is bound to the value that is returned
-when the Lisp interpreter evaluates the second element.
-
-Thus, a varlist might look like this: @code{(thread (needles 3))}.  In
-this case, in a @code{let} expression, Emacs binds the symbol
-@code{thread} to an initial value of @code{nil}, and binds the symbol
-@code{needles} to an initial value of 3.
-
-When you write a @code{let} expression, what you do is put the
-appropriate expressions in the slots of the @code{let} expression
-template.
-
-If the varlist is composed of two-element lists, as is often the case,
-the template for the @code{let} expression looks like this:
-
-@smallexample
-@group
-(let ((@var{variable} @var{value})
-      (@var{variable} @var{value})
-      @dots{})
-  @var{body}@dots{})
-@end group
-@end smallexample
-
-@node Sample let Expression, Uninitialized let Variables, Parts of let Expression, let
-@comment  node-name,  next,  previous,  up
-@subsection Sample @code{let} Expression
-@cindex Sample @code{let} expression
-@cindex @code{let} expression sample
-
-The following expression creates and gives initial values
-to the two variables @code{zebra} and @code{tiger}.  The body of the
-@code{let} expression is a list which calls the @code{message} function.
-
-@smallexample
-@group
-(let ((zebra 'stripes)
-      (tiger 'fierce))
-  (message "One kind of animal has %s and another is %s."
-           zebra tiger))
-@end group
-@end smallexample
-
-Here, the varlist is @code{((zebra 'stripes) (tiger 'fierce))}.
-
-The two variables are @code{zebra} and @code{tiger}.  Each variable is
-the first element of a two-element list and each value is the second
-element of its two-element list.  In the varlist, Emacs binds the
-variable @code{zebra} to the value @code{stripes}@footnote{According
-to Jared Diamond in @cite{Guns, Germs, and Steel}, ``@dots{} zebras
-become impossibly dangerous as they grow older'' but the claim here is
-that they do not become fierce like a tiger.  (1997, W. W. Norton and
-Co., ISBN 0-393-03894-2, page 171)}, and binds the
-variable @code{tiger} to the value @code{fierce}.  In this example,
-both values are symbols preceded by a quote.  The values could just as
-well have been another list or a string.  The body of the @code{let}
-follows after the list holding the variables.  In this example, the
-body is a list that uses the @code{message} function to print a string
-in the echo area.
-
-@need 1500
-You may evaluate the example in the usual fashion, by placing the
-cursor after the last parenthesis and typing @kbd{C-x C-e}.  When you do
-this, the following will appear in the echo area:
-
-@smallexample
-"One kind of animal has stripes and another is fierce."
-@end smallexample
-
-As we have seen before, the @code{message} function prints its first
-argument, except for @samp{%s}.  In this example, the value of the variable
-@code{zebra} is printed at the location of the first @samp{%s} and the
-value of the variable @code{tiger} is printed at the location of the
-second @samp{%s}.
-
-@node Uninitialized let Variables,  , Sample let Expression, let
-@comment  node-name,  next,  previous,  up
-@subsection Uninitialized Variables in a @code{let} Statement
-@cindex Uninitialized @code{let} variables
-@cindex @code{let} variables uninitialized
-
-If you do not bind the variables in a @code{let} statement to specific
-initial values, they will automatically be bound to an initial value of
-@code{nil}, as in the following expression:
-
-@smallexample
-@group
-(let ((birch 3)
-      pine
-      fir
-      (oak 'some))
-  (message
-   "Here are %d variables with %s, %s, and %s value."
-   birch pine fir oak))
-@end group
-@end smallexample
-
-@noindent
-Here, the varlist is @code{((birch 3) pine fir (oak 'some))}.
-
-@need 1250
-If you evaluate this expression in the usual way, the following will
-appear in your echo area:
-
-@smallexample
-"Here are 3 variables with nil, nil, and some value."
-@end smallexample
-
-@noindent
-In this example, Emacs binds the symbol @code{birch} to the number 3,
-binds the symbols @code{pine} and @code{fir} to @code{nil}, and binds
-the symbol @code{oak} to the value @code{some}.
-
-Note that in the first part of the @code{let}, the variables @code{pine}
-and @code{fir} stand alone as atoms that are not surrounded by
-parentheses; this is because they are being bound to @code{nil}, the
-empty list.  But @code{oak} is bound to @code{some} and so is a part of
-the list @code{(oak 'some)}.  Similarly, @code{birch} is bound to the
-number 3 and so is in a list with that number.  (Since a number
-evaluates to itself, the number does not need to be quoted.  Also, the
-number is printed in the message using a @samp{%d} rather than a
-@samp{%s}.)  The four variables as a group are put into a list to
-delimit them from the body of the @code{let}.
-
-@node if, else, let, Writing Defuns
-@comment  node-name,  next,  previous,  up
-@section The @code{if} Special Form
-@findex if
-@cindex Conditional with @code{if}
-
-A third special form, in addition to @code{defun} and @code{let}, is the
-conditional @code{if}.  This form is used to instruct the computer to
-make decisions.  You can write function definitions without using
-@code{if}, but it is used often enough, and is important enough, to be
-included here.  It is used, for example, in the code for the
-function @code{beginning-of-buffer}.
-
-The basic idea behind an @code{if}, is that ``@emph{if} a test is true,
-@emph{then} an expression is evaluated.''  If the test is not true, the
-expression is not evaluated.  For example, you might make a decision
-such as, ``if it is warm and sunny, then go to the beach!''
-
-@menu
-* if in more detail::
-* type-of-animal in detail::    An example of an @code{if} expression.
-@end menu
-
-@node if in more detail, type-of-animal in detail, if, if
-@ifnottex
-@unnumberedsubsec @code{if} in more detail
-@end ifnottex
-
-@cindex @samp{if-part} defined
-@cindex @samp{then-part} defined
-An @code{if} expression written in Lisp does not use the word `then';
-the test and the action are the second and third elements of the list
-whose first element is @code{if}.  Nonetheless, the test part of an
-@code{if} expression is often called the @dfn{if-part} and the second
-argument is often called the @dfn{then-part}.
-
-Also, when an @code{if} expression is written, the true-or-false-test
-is usually written on the same line as the symbol @code{if}, but the
-action to carry out if the test is true, the ``then-part'', is written
-on the second and subsequent lines.  This makes the @code{if}
-expression easier to read.
-
-@smallexample
-@group
-(if @var{true-or-false-test}
-    @var{action-to-carry-out-if-test-is-true})
-@end group
-@end smallexample
-
-@noindent
-The true-or-false-test will be an expression that
-is evaluated by the Lisp interpreter.
-
-Here is an example that you can evaluate in the usual manner.  The test
-is whether the number 5 is greater than the number 4.  Since it is, the
-message @samp{5 is greater than 4!} will be printed.
-
-@smallexample
-@group
-(if (> 5 4)                             ; @r{if-part}
-    (message "5 is greater than 4!"))   ; @r{then-part}
-@end group
-@end smallexample
-
-@noindent
-(The function @code{>} tests whether its first argument is greater than
-its second argument and returns true if it is.)
-@findex > (greater than)
-
-Of course, in actual use, the test in an @code{if} expression will not
-be fixed for all time as it is by the expression @code{(> 5 4)}.
-Instead, at least one of the variables used in the test will be bound to
-a value that is not known ahead of time.  (If the value were known ahead
-of time, we would not need to run the test!)
-
-For example, the value may be bound to an argument of a function
-definition.  In the following function definition, the character of the
-animal is a value that is passed to the function.  If the value bound to
-@code{characteristic} is @code{fierce}, then the message, @samp{It's a
-tiger!} will be printed; otherwise, @code{nil} will be returned.
-
-@smallexample
-@group
-(defun type-of-animal (characteristic)
-  "Print message in echo area depending on CHARACTERISTIC.
-If the CHARACTERISTIC is the symbol `fierce',
-then warn of a tiger."
-  (if (equal characteristic 'fierce)
-      (message "It's a tiger!")))
-@end group
-@end smallexample
-
-@need 1500
-@noindent
-If you are reading this inside of GNU Emacs, you can evaluate the
-function definition in the usual way to install it in Emacs, and then you
-can evaluate the following two expressions to see the results:
-
-@smallexample
-@group
-(type-of-animal 'fierce)
-
-(type-of-animal 'zebra)
-
-@end group
-@end smallexample
-
-@c Following sentences rewritten to prevent overfull hbox.
-@noindent
-When you evaluate @code{(type-of-animal 'fierce)}, you will see the
-following message printed in the echo area: @code{"It's a tiger!"}; and
-when you evaluate @code{(type-of-animal 'zebra)} you will see @code{nil}
-printed in the echo area.
-
-@node type-of-animal in detail,  , if in more detail, if
-@comment  node-name,  next,  previous,  up
-@subsection The @code{type-of-animal} Function in Detail
-
-Let's look at the @code{type-of-animal} function in detail.
-
-The function definition for @code{type-of-animal} was written by filling
-the slots of two templates, one for a function definition as a whole, and
-a second for an @code{if} expression.
-
-@need 1250
-The template for every function that is not interactive is:
-
-@smallexample
-@group
-(defun @var{name-of-function} (@var{argument-list})
-  "@var{documentation}@dots{}"
-  @var{body}@dots{})
-@end group
-@end smallexample
-
-@need 800
-The parts of the function that match this template look like this:
-
-@smallexample
-@group
-(defun type-of-animal (characteristic)
-  "Print message in echo area depending on CHARACTERISTIC.
-If the CHARACTERISTIC is the symbol `fierce',
-then warn of a tiger."
-  @var{body: the} @code{if} @var{expression})
-@end group
-@end smallexample
-
-The name of function is @code{type-of-animal}; it is passed the value
-of one argument.  The argument list is followed by a multi-line
-documentation string.  The documentation string is included in the
-example because it is a good habit to write documentation string for
-every function definition.  The body of the function definition
-consists of the @code{if} expression.
-
-@need 800
-The template for an @code{if} expression looks like this:
-
-@smallexample
-@group
-(if @var{true-or-false-test}
-    @var{action-to-carry-out-if-the-test-returns-true})
-@end group
-@end smallexample
-
-@need 1250
-In the @code{type-of-animal} function, the code for the @code{if}
-looks like this:
-
-@smallexample
-@group
-(if (equal characteristic 'fierce)
-    (message "It's a tiger!")))
-@end group
-@end smallexample
-
-@need 800
-Here, the true-or-false-test is the expression:
-
-@smallexample
-(equal characteristic 'fierce)
-@end smallexample
-
-@noindent
-In Lisp, @code{equal} is a function that determines whether its first
-argument is equal to its second argument.  The second argument is the
-quoted symbol @code{'fierce} and the first argument is the value of the
-symbol @code{characteristic}---in other words, the argument passed to
-this function.
-
-In the first exercise of @code{type-of-animal}, the argument
-@code{fierce} is passed to @code{type-of-animal}.  Since @code{fierce}
-is equal to @code{fierce}, the expression, @code{(equal characteristic
-'fierce)}, returns a value of true.  When this happens, the @code{if}
-evaluates the second argument or then-part of the @code{if}:
-@code{(message "It's tiger!")}.
-
-On the other hand, in the second exercise of @code{type-of-animal}, the
-argument @code{zebra} is passed to @code{type-of-animal}.  @code{zebra}
-is not equal to @code{fierce}, so the then-part is not evaluated and
-@code{nil} is returned by the @code{if} expression.
-
-@node else, Truth & Falsehood, if, Writing Defuns
-@comment  node-name,  next,  previous,  up
-@section If--then--else Expressions
-@cindex Else
-
-An @code{if} expression may have an optional third argument, called
-the @dfn{else-part}, for the case when the true-or-false-test returns
-false.  When this happens, the second argument or then-part of the
-overall @code{if} expression is @emph{not} evaluated, but the third or
-else-part @emph{is} evaluated.  You might think of this as the cloudy
-day alternative for the decision ``if it is warm and sunny, then go to
-the beach, else read a book!''.
-
-The word ``else'' is not written in the Lisp code; the else-part of an
-@code{if} expression comes after the then-part.  In the written Lisp, the
-else-part is usually written to start on a line of its own and is
-indented less than the then-part:
-
-@smallexample
-@group
-(if @var{true-or-false-test}
-    @var{action-to-carry-out-if-the-test-returns-true}
-  @var{action-to-carry-out-if-the-test-returns-false})
-@end group
-@end smallexample
-
-For example, the following @code{if} expression prints the message @samp{4
-is not greater than 5!} when you evaluate it in the usual way:
-
-@smallexample
-@group
-(if (> 4 5)                               ; @r{if-part}
-    (message "4 falsely greater than 5!") ; @r{then-part}
-  (message "4 is not greater than 5!"))   ; @r{else-part}
-@end group
-@end smallexample
-
-@noindent
-Note that the different levels of indentation make it easy to
-distinguish the then-part from the else-part.  (GNU Emacs has several
-commands that automatically indent @code{if} expressions correctly.
-@xref{Typing Lists, , GNU Emacs Helps You Type Lists}.)
-
-We can extend the @code{type-of-animal} function to include an
-else-part by simply incorporating an additional part to the @code{if}
-expression.
-
-@need 1500
-You can see the consequences of doing this if you evaluate the following
-version of the @code{type-of-animal} function definition to install it
-and then evaluate the two subsequent expressions to pass different
-arguments to the function.
-
-@smallexample
-@group
-(defun type-of-animal (characteristic)  ; @r{Second version.}
-  "Print message in echo area depending on CHARACTERISTIC.
-If the CHARACTERISTIC is the symbol `fierce',
-then warn of a tiger;
-else say it's not fierce."
-  (if (equal characteristic 'fierce)
-      (message "It's a tiger!")
-    (message "It's not fierce!")))
-@end group
-@end smallexample
-@sp 1
-
-@smallexample
-@group
-(type-of-animal 'fierce)
-
-(type-of-animal 'zebra)
-
-@end group
-@end smallexample
-
-@c Following sentence rewritten to prevent overfull hbox.
-@noindent
-When you evaluate @code{(type-of-animal 'fierce)}, you will see the
-following message printed in the echo area: @code{"It's a tiger!"}; but
-when you evaluate @code{(type-of-animal 'zebra)}, you will see
-@code{"It's not fierce!"}.
-
-(Of course, if the @var{characteristic} were @code{ferocious}, the
-message @code{"It's not fierce!"} would be printed; and it would be
-misleading!  When you write code, you need to take into account the
-possibility that some such argument will be tested by the @code{if}
-and write your program accordingly.)
-
-@node Truth & Falsehood, save-excursion, else, Writing Defuns
-@comment  node-name,  next,  previous,  up
-@section Truth and Falsehood in Emacs Lisp
-@cindex Truth and falsehood in Emacs Lisp
-@cindex Falsehood and truth in Emacs Lisp
-@findex nil
-
-There is an important aspect to the truth test in an @code{if}
-expression.  So far, we have spoken of `true' and `false' as values of
-predicates as if they were new kinds of Emacs Lisp objects.  In fact,
-`false' is just our old friend @code{nil}.  Anything else---anything
-at all---is `true'.
-
-The expression that tests for truth is interpreted as @dfn{true}
-if the result of evaluating it is a value that is not @code{nil}.  In
-other words, the result of the test is considered true if the value
-returned is a number such as 47, a string such as @code{"hello"}, or a
-symbol (other than @code{nil}) such as @code{flowers}, or a list (so
-long as it is not empty), or even a buffer!
-
-@menu
-* nil explained::               @code{nil} has two meanings.
-@end menu
-
-@node nil explained,  , Truth & Falsehood, Truth & Falsehood
-@ifnottex
-@unnumberedsubsec An explanation of @code{nil}
-@end ifnottex
-
-Before illustrating a test for truth, we need an explanation of @code{nil}.
-
-In Emacs Lisp, the symbol @code{nil} has two meanings.  First, it means the
-empty list.  Second, it means false and is the value returned when a
-true-or-false-test tests false.  @code{nil} can be written as an empty
-list, @code{()}, or as @code{nil}.  As far as the Lisp interpreter is
-concerned, @code{()} and @code{nil} are the same.  Humans, however, tend
-to use @code{nil} for false and @code{()} for the empty list.
-
-In Emacs Lisp, any value that is not @code{nil}---is not the empty
-list---is considered true.  This means that if an evaluation returns
-something that is not an empty list, an @code{if} expression will test
-true.  For example, if a number is put in the slot for the test, it
-will be evaluated and will return itself, since that is what numbers
-do when evaluated.  In this conditional, the @code{if} expression will
-test true.  The expression tests false only when @code{nil}, an empty
-list, is returned by evaluating the expression.
-
-You can see this by evaluating the two expressions in the following examples.
-
-In the first example, the number 4 is evaluated as the test in the
-@code{if} expression and returns itself; consequently, the then-part
-of the expression is evaluated and returned: @samp{true} appears in
-the echo area.  In the second example, the @code{nil} indicates false;
-consequently, the else-part of the expression is evaluated and
-returned: @samp{false} appears in the echo area.
-
-@smallexample
-@group
-(if 4
-    'true
-  'false)
-@end group
-
-@group
-(if nil
-    'true
-  'false)
-@end group
-@end smallexample
-
-@need 1250
-Incidentally, if some other useful value is not available for a test that
-returns true, then the Lisp interpreter will return the symbol @code{t}
-for true.  For example, the expression @code{(> 5 4)} returns @code{t}
-when evaluated, as you can see by evaluating it in the usual way:
-
-@smallexample
-(> 5 4)
-@end smallexample
-
-@need 1250
-@noindent
-On the other hand, this function returns @code{nil} if the test is false.
-
-@smallexample
-(> 4 5)
-@end smallexample
-
-@node save-excursion, Review, Truth & Falsehood, Writing Defuns
-@comment  node-name,  next,  previous,  up
-@section @code{save-excursion}
-@findex save-excursion
-@cindex Region, what it is
-@cindex Preserving point, mark, and buffer
-@cindex Point, mark, buffer preservation
-@findex point
-@findex mark
-
-The @code{save-excursion} function is the fourth and final special form
-that we will discuss in this chapter.
-
-In Emacs Lisp programs used for editing, the @code{save-excursion}
-function is very common.  It saves the location of point and mark,
-executes the body of the function, and then restores point and mark to
-their previous positions if their locations were changed.  Its primary
-purpose is to keep the user from being surprised and disturbed by
-unexpected movement of point or mark.
-
-@menu
-* Point and mark::              A review of various locations.
-* Template for save-excursion::
-@end menu
-
-@node Point and mark, Template for save-excursion, save-excursion, save-excursion
-@ifnottex
-@unnumberedsubsec Point and Mark
-@end ifnottex
-
-Before discussing @code{save-excursion}, however, it may be useful
-first to review what point and mark are in GNU Emacs.  @dfn{Point} is
-the current location of the cursor.  Wherever the cursor
-is, that is point.  More precisely, on terminals where the cursor
-appears to be on top of a character, point is immediately before the
-character.  In Emacs Lisp, point is an integer.  The first character in
-a buffer is number one, the second is number two, and so on.  The
-function @code{point} returns the current position of the cursor as a
-number.  Each buffer has its own value for point.
-
-The @dfn{mark} is another position in the buffer; its value can be set
-with a command such as @kbd{C-@key{SPC}} (@code{set-mark-command}).  If
-a mark has been set, you can use the command @kbd{C-x C-x}
-(@code{exchange-point-and-mark}) to cause the cursor to jump to the mark
-and set the mark to be the previous position of point.  In addition, if
-you set another mark, the position of the previous mark is saved in the
-mark ring.  Many mark positions can be saved this way.  You can jump the
-cursor to a saved mark by typing @kbd{C-u C-@key{SPC}} one or more
-times.
-
-The part of the buffer between point and mark is called @dfn{the
-region}.  Numerous commands work on the region, including
-@code{center-region}, @code{count-lines-region}, @code{kill-region}, and
-@code{print-region}.
-
-The @code{save-excursion} special form saves the locations of point and
-mark and restores those positions after the code within the body of the
-special form is evaluated by the Lisp interpreter.  Thus, if point were
-in the beginning of a piece of text and some code moved point to the end
-of the buffer, the @code{save-excursion} would put point back to where
-it was before, after the expressions in the body of the function were
-evaluated.
-
-In Emacs, a function frequently moves point as part of its internal
-workings even though a user would not expect this.  For example,
-@code{count-lines-region} moves point.  To prevent the user from being
-bothered by jumps that are both unexpected and (from the user's point of
-view) unnecessary, @code{save-excursion} is often used to keep point and
-mark in the location expected by the user.  The use of
-@code{save-excursion} is good housekeeping.
-
-To make sure the house stays clean, @code{save-excursion} restores the
-values of point and mark even if something goes wrong in the code inside
-of it (or, to be more precise and to use the proper jargon, ``in case of
-abnormal exit'').  This feature is very helpful.
-
-In addition to recording the values of point and mark,
-@code{save-excursion} keeps track of the current buffer, and restores
-it, too.  This means you can write code that will change the buffer and
-have @code{save-excursion} switch you back to the original buffer.
-This is how @code{save-excursion} is used in @code{append-to-buffer}.
-(@xref{append-to-buffer, , The Definition of @code{append-to-buffer}}.)
-
-@node Template for save-excursion,  , Point and mark, save-excursion
-@comment  node-name,  next,  previous,  up
-@subsection Template for a @code{save-excursion} Expression
-
-@need 800
-The template for code using @code{save-excursion} is simple:
-
-@smallexample
-@group
-(save-excursion
-  @var{body}@dots{})
-@end group
-@end smallexample
-
-@noindent
-The body of the function is one or more expressions that will be
-evaluated in sequence by the Lisp interpreter.  If there is more than
-one expression in the body, the value of the last one will be returned
-as the value of the @code{save-excursion} function.  The other
-expressions in the body are evaluated only for their side effects; and
-@code{save-excursion} itself is used only for its side effect (which
-is restoring the positions of point and mark).
-
-@need 1250
-In more detail, the template for a @code{save-excursion} expression
-looks like this:
-
-@smallexample
-@group
-(save-excursion
-  @var{first-expression-in-body}
-  @var{second-expression-in-body}
-  @var{third-expression-in-body}
-   @dots{}
-  @var{last-expression-in-body})
-@end group
-@end smallexample
-
-@noindent
-An expression, of course, may be a symbol on its own or a list.
-
-In Emacs Lisp code, a @code{save-excursion} expression often occurs
-within the body of a @code{let} expression.  It looks like this:
-
-@smallexample
-@group
-(let @var{varlist}
-  (save-excursion
-    @var{body}@dots{}))
-@end group
-@end smallexample
-
-@node Review, defun Exercises, save-excursion, Writing Defuns
-@comment  node-name,  next,  previous,  up
-@section Review
-
-In the last few chapters we have introduced a fair number of functions
-and special forms.  Here they are described in brief, along with a few
-similar functions that have not been mentioned yet.
-
-@table @code
-@item eval-last-sexp
-Evaluate the last symbolic expression before the current location of
-point.  The value is printed in the echo area unless the function is
-invoked with an argument; in that case, the output is printed in the
-current buffer.  This command is normally bound to @kbd{C-x C-e}.
-
-@item defun
-Define function.  This special form has up to five parts: the name,
-a template for the arguments that will be passed to the function,
-documentation, an optional interactive declaration, and the body of the
-definition.
-
-@need 1250
-For example, in an early version of Emacs, the function definition was
-as follows.  (It is slightly more complex now that it seeks the first
-non-whitespace character rather than the first visible character.)
-
-@smallexample
-@group
-(defun back-to-indentation ()
-  "Move point to first visible character on line."
-  (interactive)
-  (beginning-of-line 1)
-  (skip-chars-forward " \t"))
-@end group
-@end smallexample
-
-@ignore
-In GNU Emacs 22,
-
-(defun backward-to-indentation (&optional arg)
-  "Move backward ARG lines and position at first nonblank character."
-  (interactive "p")
-  (forward-line (- (or arg 1)))
-  (skip-chars-forward " \t"))
-
-(defun back-to-indentation ()
-  "Move point to the first non-whitespace character on this line."
-  (interactive)
-  (beginning-of-line 1)
-  (skip-syntax-forward " " (line-end-position))
-  ;; Move back over chars that have whitespace syntax but have the p flag.
-  (backward-prefix-chars))
-@end ignore
-
-@item interactive
-Declare to the interpreter that the function can be used
-interactively.  This special form may be followed by a string with one
-or more parts that pass the information to the arguments of the
-function, in sequence.  These parts may also tell the interpreter to
-prompt for information.  Parts of the string are separated by
-newlines, @samp{\n}.
-
-@need 1000
-Common code characters are:
-
-@table @code
-@item b
-The name of an existing buffer.
-
-@item f
-The name of an existing file.
-
-@item p
-The numeric prefix argument.  (Note that this `p' is lower case.)
-
-@item r
-Point and the mark, as two numeric arguments, smallest first.  This
-is the only code letter that specifies two successive arguments
-rather than one.
-@end table
-
-@xref{Interactive Codes, , Code Characters for @samp{interactive},
-elisp, The GNU Emacs Lisp Reference Manual}, for a complete list of
-code characters.
-
-@item let
-Declare that a list of variables is for use within the body of the
-@code{let} and give them an initial value, either @code{nil} or a
-specified value; then evaluate the rest of the expressions in the body
-of the @code{let} and return the value of the last one.  Inside the
-body of the @code{let}, the Lisp interpreter does not see the values of
-the variables of the same names that are bound outside of the
-@code{let}.
-
-@need 1250
-For example,
-
-@smallexample
-@group
-(let ((foo (buffer-name))
-      (bar (buffer-size)))
-  (message
-   "This buffer is %s and has %d characters."
-   foo bar))
-@end group
-@end smallexample
-
-@item save-excursion
-Record the values of point and mark and the current buffer before
-evaluating the body of this special form.  Restore the values of point
-and mark and buffer afterward.
-
-@need 1250
-For example,
-
-@smallexample
-@group
-(message "We are %d characters into this buffer."
-         (- (point)
-            (save-excursion
-              (goto-char (point-min)) (point))))
-@end group
-@end smallexample
-
-@item if
-Evaluate the first argument to the function; if it is true, evaluate
-the second argument; else evaluate the third argument, if there is one.
-
-The @code{if} special form is called a @dfn{conditional}.  There are
-other conditionals in Emacs Lisp, but @code{if} is perhaps the most
-commonly used.
-
-@need 1250
-For example,
-
-@smallexample
-@group
-(if (= 22 emacs-major-version)
-    (message "This is version 22 Emacs")
-  (message "This is not version 22 Emacs"))
-@end group
-@end smallexample
-
-@need 1250
-@item <
-@itemx >
-@itemx <=
-@itemx >=
-The @code{<} function tests whether its first argument is smaller than
-its second argument.  A corresponding function, @code{>}, tests whether
-the first argument is greater than the second.  Likewise, @code{<=}
-tests whether the first argument is less than or equal to the second and
-@code{>=} tests whether the first argument is greater than or equal to
-the second.  In all cases, both arguments must be numbers or markers
-(markers indicate positions in buffers).
-
-@need 800
-@item =
-The @code{=} function tests whether two arguments, both numbers or
-markers, are equal.
-
-@need 1250
-@item equal
-@itemx eq
-Test whether two objects are the same.  @code{equal} uses one meaning
-of the word `same' and @code{eq} uses another:  @code{equal} returns
-true if the two objects have a similar structure and contents, such as
-two copies of the same book.  On the other hand, @code{eq}, returns
-true if both arguments are actually the same object.
-@findex equal
-@findex eq
-
-@need 1250
-@item string<
-@itemx string-lessp
-@itemx string=
-@itemx string-equal
-The @code{string-lessp} function tests whether its first argument is
-smaller than the second argument.  A shorter, alternative name for the
-same function (a @code{defalias}) is @code{string<}.
-
-The arguments to @code{string-lessp} must be strings or symbols; the
-ordering is lexicographic, so case is significant.  The print names of
-symbols are used instead of the symbols themselves.
-
-@cindex @samp{empty string} defined
-An empty string, @samp{""}, a string with no characters in it, is
-smaller than any string of characters.
-
-@code{string-equal} provides the corresponding test for equality.  Its
-shorter, alternative name is @code{string=}.  There are no string test
-functions that correspond to @var{>}, @code{>=}, or @code{<=}.
-
-@item message
-Print a message in the echo area. The first argument is a string that
-can contain @samp{%s}, @samp{%d}, or @samp{%c} to print the value of
-arguments that follow the string.  The argument used by @samp{%s} must
-be a string or a symbol; the argument used by @samp{%d} must be a
-number.  The argument used by @samp{%c} must be an @sc{ascii} code
-number; it will be printed as the character with that @sc{ascii} code.
-(Various other %-sequences have not been mentioned.)
-
-@item setq
-@itemx set
-The @code{setq} function sets the value of its first argument to the
-value of the second argument.  The first argument is automatically
-quoted by @code{setq}.  It does the same for succeeding pairs of
-arguments.  Another function, @code{set}, takes only two arguments and
-evaluates both of them before setting the value returned by its first
-argument to the value returned by its second argument.
-
-@item buffer-name
-Without an argument, return the name of the buffer, as a string.
-
-@itemx buffer-file-name
-Without an argument, return the name of the file the buffer is
-visiting.
-
-@item current-buffer
-Return the buffer in which Emacs is active; it may not be
-the buffer that is visible on the screen.
-
-@item other-buffer
-Return the most recently selected buffer (other than the buffer passed
-to @code{other-buffer} as an argument and other than the current
-buffer).
-
-@item switch-to-buffer
-Select a buffer for Emacs to be active in and display it in the current
-window so users can look at it.  Usually bound to @kbd{C-x b}.
-
-@item set-buffer
-Switch Emacs' attention to a buffer on which programs will run.  Don't
-alter what the window is showing.
-
-@item buffer-size
-Return the number of characters in the current buffer.
-
-@item point
-Return the value of the current position of the cursor, as an
-integer counting the number of characters from the beginning of the
-buffer.
-
-@item point-min
-Return the minimum permissible value of point in
-the current buffer.  This is 1, unless narrowing is in effect.
-
-@item point-max
-Return the value of the maximum permissible value of point in the
-current buffer.  This is the end of the buffer, unless narrowing is in
-effect.
-@end table
-
-@need 1500
-@node defun Exercises,  , Review, Writing Defuns
-@section Exercises
-
-@itemize @bullet
-@item
-Write a non-interactive function that doubles the value of its
-argument, a number.  Make that function interactive.
-
-@item
-Write a function that tests whether the current value of
-@code{fill-column} is greater than the argument passed to the function,
-and if so, prints an appropriate message.
-@end itemize
-
-@node Buffer Walk Through, More Complex, Writing Defuns, Top
-@comment  node-name,  next,  previous,  up
-@chapter A Few Buffer--Related Functions
-
-In this chapter we study in detail several of the functions used in GNU
-Emacs.  This is called a ``walk-through''.  These functions are used as
-examples of Lisp code, but are not imaginary examples; with the
-exception of the first, simplified function definition, these functions
-show the actual code used in GNU Emacs.  You can learn a great deal from
-these definitions.  The functions described here are all related to
-buffers.  Later, we will study other functions.
-
-@menu
-* Finding More::                How to find more information.
-* simplified-beginning-of-buffer::  Shows @code{goto-char},
-                                @code{point-min}, and @code{push-mark}.
-* mark-whole-buffer::           Almost the same as @code{beginning-of-buffer}.
-* append-to-buffer::            Uses @code{save-excursion} and
-                                @code{insert-buffer-substring}.
-* Buffer Related Review::       Review.
-* Buffer Exercises::
-@end menu
-
-@node Finding More, simplified-beginning-of-buffer, Buffer Walk Through, Buffer Walk Through
-@section Finding More Information
-
-@findex describe-function, @r{introduced}
-@cindex Find function documentation
-In this walk-through, I will describe each new function as we come to
-it, sometimes in detail and sometimes briefly.  If you are interested,
-you can get the full documentation of any Emacs Lisp function at any
-time by typing @kbd{C-h f} and then the name of the function (and then
-@key{RET}).  Similarly, you can get the full documentation for a
-variable by typing @kbd{C-h v} and then the name of the variable (and
-then @key{RET}).
-
-@cindex Find source of function
-@c In version 22, tells location both of C and of Emacs Lisp
-Also, @code{describe-function} will tell you the location of the
-function definition.
-
-Put point into the name of the file that contains the function and
-press the @key{RET} key.  In this case, @key{RET} means
-@code{push-button} rather than `return' or `enter'.  Emacs will take
-you directly to the function definition.
-
-@ignore
-Not In version 22
-
-If you move point over the file name and press
-the @key{RET} key, which in this case means @code{help-follow} rather
-than `return' or `enter', Emacs will take you directly to the function
-definition.
-@end ignore
-
-More generally, if you want to see a function in its original source
-file, you can use the @code{find-tags} function to jump to it.
-@code{find-tags} works with a wide variety of languages, not just
-Lisp, and C, and it works with non-programming text as well.  For
-example, @code{find-tags} will jump to the various nodes in the
-Texinfo source file of this document.
-The @code{find-tags} function depends on `tags tables' that record
-the locations of the functions, variables, and other items to which
-@code{find-tags} jumps.
-
-To use the @code{find-tags} command, type @kbd{M-.}  (i.e., press the
-period key while holding down the @key{META} key, or else type the
-@key{ESC} key and then type the period key), and then, at the prompt,
-type in the name of the function whose source code you want to see,
-such as @code{mark-whole-buffer}, and then type @key{RET}.  Emacs will
-switch buffers and display the source code for the function on your
-screen.  To switch back to your current buffer, type @kbd{C-x b
-@key{RET}}.  (On some keyboards, the @key{META} key is labelled
-@key{ALT}.)
-
-@c !!! 22.1.1 tags table location in this paragraph
-@cindex TAGS table, specifying
-@findex find-tags
-Depending on how the initial default values of your copy of Emacs are
-set, you may also need to specify the location of your `tags table',
-which is a file called @file{TAGS}.  For example, if you are
-interested in Emacs sources, the tags table you will most likely want,
-if it has already been created for you, will be in a subdirectory of
-the @file{/usr/local/share/emacs/} directory; thus you would use the
-@code{M-x visit-tags-table} command and specify a pathname such as
-@file{/usr/local/share/emacs/22.1.1/lisp/TAGS}.  If the tags table
-has not already been created, you will have to create it yourself.  It
-will in a file such as @file{/usr/local/src/emacs/src/TAGS}.
-
-@need 1250
-To create a @file{TAGS} file in a specific directory, switch to that
-directory in Emacs using @kbd{M-x cd} command, or list the directory
-with @kbd{C-x d} (@code{dired}).  Then run the compile command, with
-@w{@code{etags *.el}} as the command to execute:
-
-@smallexample
-M-x compile RET etags *.el RET
-@end smallexample
-
-For more information, see @ref{etags, , Create Your Own @file{TAGS} File}.
-
-After you become more familiar with Emacs Lisp, you will find that you will
-frequently use @code{find-tags} to navigate your way around source code;
-and you will create your own @file{TAGS} tables.
-
-@cindex Library, as term for `file'
-Incidentally, the files that contain Lisp code are conventionally
-called @dfn{libraries}.  The metaphor is derived from that of a
-specialized library, such as a law library or an engineering library,
-rather than a general library.  Each library, or file, contains
-functions that relate to a particular topic or activity, such as
-@file{abbrev.el} for handling abbreviations and other typing
-shortcuts, and @file{help.el} for on-line help.  (Sometimes several
-libraries provide code for a single activity, as the various
-@file{rmail@dots{}} files provide code for reading electronic mail.)
-In @cite{The GNU Emacs Manual}, you will see sentences such as ``The
-@kbd{C-h p} command lets you search the standard Emacs Lisp libraries
-by topic keywords.''
-
-@node simplified-beginning-of-buffer, mark-whole-buffer, Finding More, Buffer Walk Through
-@comment  node-name,  next,  previous,  up
-@section A Simplified @code{beginning-of-buffer} Definition
-@findex simplified-beginning-of-buffer
-
-The @code{beginning-of-buffer} command is a good function to start with
-since you are likely to be familiar with it and it is easy to
-understand.  Used as an interactive command, @code{beginning-of-buffer}
-moves the cursor to the beginning of the buffer, leaving the mark at the
-previous position.  It is generally bound to @kbd{M-<}.
-
-In this section, we will discuss a shortened version of the function
-that shows how it is most frequently used.  This shortened function
-works as written, but it does not contain the code for a complex option.
-In another section, we will describe the entire function.
-(@xref{beginning-of-buffer, , Complete Definition of
-@code{beginning-of-buffer}}.)
-
-Before looking at the code, let's consider what the function
-definition has to contain: it must include an expression that makes
-the function interactive so it can be called by typing @kbd{M-x
-beginning-of-buffer} or by typing a keychord such as @kbd{M-<}; it
-must include code to leave a mark at the original position in the
-buffer; and it must include code to move the cursor to the beginning
-of the buffer.
-
-@need 1250
-Here is the complete text of the shortened version of the function:
-
-@smallexample
-@group
-(defun simplified-beginning-of-buffer ()
-  "Move point to the beginning of the buffer;
-leave mark at previous position."
-  (interactive)
-  (push-mark)
-  (goto-char (point-min)))
-@end group
-@end smallexample
-
-Like all function definitions, this definition has five parts following
-the special form @code{defun}:
-
-@enumerate
-@item
-The name: in this example, @code{simplified-beginning-of-buffer}.
-
-@item
-A list of the arguments: in this example, an empty list, @code{()},
-
-@item
-The documentation string.
-
-@item
-The interactive expression.
-
-@item
-The body.
-@end enumerate
-
-@noindent
-In this function definition, the argument list is empty; this means that
-this function does not require any arguments.  (When we look at the
-definition for the complete function, we will see that it may be passed
-an optional argument.)
-
-The interactive expression tells Emacs that the function is intended to
-be used interactively.  In this example, @code{interactive} does not have
-an argument because @code{simplified-beginning-of-buffer} does not
-require one.
-
-@need 800
-The body of the function consists of the two lines:
-
-@smallexample
-@group
-(push-mark)
-(goto-char (point-min))
-@end group
-@end smallexample
-
-The first of these lines is the expression, @code{(push-mark)}.  When
-this expression is evaluated by the Lisp interpreter, it sets a mark at
-the current position of the cursor, wherever that may be.  The position
-of this mark is saved in the mark ring.
-
-The next line is @code{(goto-char (point-min))}.  This expression
-jumps the cursor to the minimum point in the buffer, that is, to the
-beginning of the buffer (or to the beginning of the accessible portion
-of the buffer if it is narrowed.  @xref{Narrowing & Widening, ,
-Narrowing and Widening}.)
-
-The @code{push-mark} command sets a mark at the place where the cursor
-was located before it was moved to the beginning of the buffer by the
-@code{(goto-char (point-min))} expression.  Consequently, you can, if
-you wish, go back to where you were originally by typing @kbd{C-x C-x}.
-
-That is all there is to the function definition!
-
-@findex describe-function
-When you are reading code such as this and come upon an unfamiliar
-function, such as @code{goto-char}, you can find out what it does by
-using the @code{describe-function} command.  To use this command, type
-@kbd{C-h f} and then type in the name of the function and press
-@key{RET}.  The @code{describe-function} command will print the
-function's documentation string in a @file{*Help*} window.  For
-example, the documentation for @code{goto-char} is:
-
-@smallexample
-@group
-Set point to POSITION, a number or marker.
-Beginning of buffer is position (point-min), end is (point-max).
-@end group
-@end smallexample
-
-@noindent
-The function's one argument is the desired position.
-
-@noindent
-(The prompt for @code{describe-function} will offer you the symbol
-under or preceding the cursor, so you can save typing by positioning
-the cursor right over or after the function and then typing @kbd{C-h f
-@key{RET}}.)
-
-The @code{end-of-buffer} function definition is written in the same way as
-the @code{beginning-of-buffer} definition except that the body of the
-function contains the expression @code{(goto-char (point-max))} in place
-of @code{(goto-char (point-min))}.
-
-@node mark-whole-buffer, append-to-buffer, simplified-beginning-of-buffer, Buffer Walk Through
-@comment  node-name,  next,  previous,  up
-@section The Definition of @code{mark-whole-buffer}
-@findex mark-whole-buffer
-
-The @code{mark-whole-buffer} function is no harder to understand than the
-@code{simplified-beginning-of-buffer} function.  In this case, however,
-we will look at the complete function, not a shortened version.
-
-The @code{mark-whole-buffer} function is not as commonly used as the
-@code{beginning-of-buffer} function, but is useful nonetheless: it
-marks a whole buffer as a region by putting point at the beginning and
-a mark at the end of the buffer.  It is generally bound to @kbd{C-x
-h}.
-
-@menu
-* mark-whole-buffer overview::
-* Body of mark-whole-buffer::   Only three lines of code.
-@end menu
-
-@node mark-whole-buffer overview, Body of mark-whole-buffer, mark-whole-buffer, mark-whole-buffer
-@ifnottex
-@unnumberedsubsec An overview of @code{mark-whole-buffer}
-@end ifnottex
-
-@need 1250
-In GNU Emacs 22, the code for the complete function looks like this:
-
-@smallexample
-@group
-(defun mark-whole-buffer ()
-  "Put point at beginning and mark at end of buffer.
-You probably should not use this function in Lisp programs;
-it is usually a mistake for a Lisp function to use any subroutine
-that uses or sets the mark."
-  (interactive)
-  (push-mark (point))
-  (push-mark (point-max) nil t)
-  (goto-char (point-min)))
-@end group
-@end smallexample
-
-@need 1250
-Like all other functions, the @code{mark-whole-buffer} function fits
-into the template for a function definition.  The template looks like
-this:
-
-@smallexample
-@group
-(defun @var{name-of-function} (@var{argument-list})
-  "@var{documentation}@dots{}"
-  (@var{interactive-expression}@dots{})
-  @var{body}@dots{})
-@end group
-@end smallexample
-
-Here is how the function works: the name of the function is
-@code{mark-whole-buffer}; it is followed by an empty argument list,
-@samp{()}, which means that the function does not require arguments.
-The documentation comes next.
-
-The next line is an @code{(interactive)} expression that tells Emacs
-that the function will be used interactively.  These details are similar
-to the @code{simplified-beginning-of-buffer} function described in the
-previous section.
-
-@need 1250
-@node Body of mark-whole-buffer,  , mark-whole-buffer overview, mark-whole-buffer
-@comment  node-name,  next,  previous,  up
-@subsection Body of @code{mark-whole-buffer}
-
-The body of the @code{mark-whole-buffer} function consists of three
-lines of code:
-
-@c GNU Emacs 22
-@smallexample
-@group
-(push-mark (point))
-(push-mark (point-max) nil t)
-(goto-char (point-min))
-@end group
-@end smallexample
-
-The first of these lines is the expression, @code{(push-mark (point))}.
-
-This line does exactly the same job as the first line of the body of
-the @code{simplified-beginning-of-buffer} function, which is written
-@code{(push-mark)}.  In both cases, the Lisp interpreter sets a mark
-at the current position of the cursor.
-
-I don't know why the expression in @code{mark-whole-buffer} is written
-@code{(push-mark (point))} and the expression in
-@code{beginning-of-buffer} is written @code{(push-mark)}.  Perhaps
-whoever wrote the code did not know that the arguments for
-@code{push-mark} are optional and that if @code{push-mark} is not
-passed an argument, the function automatically sets mark at the
-location of point by default.  Or perhaps the expression was written
-so as to parallel the structure of the next line.  In any case, the
-line causes Emacs to determine the position of point and set a mark
-there.
-
-In earlier versions of GNU Emacs, the next line of
-@code{mark-whole-buffer} was @code{(push-mark (point-max))}.  This
-expression sets a mark at the point in the buffer that has the highest
-number.  This will be the end of the buffer (or, if the buffer is
-narrowed, the end of the accessible portion of the buffer.
-@xref{Narrowing & Widening, , Narrowing and Widening}, for more about
-narrowing.)  After this mark has been set, the previous mark, the one
-set at point, is no longer set, but Emacs remembers its position, just
-as all other recent marks are always remembered.  This means that you
-can, if you wish, go back to that position by typing @kbd{C-u
-C-@key{SPC}} twice.
-
-@need 1250
-In GNU Emacs 22, the @code{(point-max)} is slightly more complicated.
-The line reads
-
-@smallexample
-(push-mark (point-max) nil t)
-@end smallexample
-
-@noindent
-The expression works nearly the same as before.  It sets a mark at the
-highest numbered place in the buffer that it can.  However, in this
-version, @code{push-mark} has two additional arguments.  The second
-argument to @code{push-mark} is @code{nil}.  This tells the function
-it @emph{should} display a message that says `Mark set' when it pushes
-the mark.  The third argument is @code{t}.  This tells
-@code{push-mark} to activate the mark when Transient Mark mode is
-turned on.  Transient Mark mode highlights the currently active
-region.  It is often turned off.
-
-Finally, the last line of the function is @code{(goto-char
-(point-min)))}.  This is written exactly the same way as it is written
-in @code{beginning-of-buffer}.  The expression moves the cursor to
-the minimum point in the buffer, that is, to the beginning of the buffer
-(or to the beginning of the accessible portion of the buffer).  As a
-result of this, point is placed at the beginning of the buffer and mark
-is set at the end of the buffer.  The whole buffer is, therefore, the
-region.
-
-@node append-to-buffer, Buffer Related Review, mark-whole-buffer, Buffer Walk Through
-@comment  node-name,  next,  previous,  up
-@section The Definition of @code{append-to-buffer}
-@findex append-to-buffer
-
-The @code{append-to-buffer} command is more complex than the
-@code{mark-whole-buffer} command.  What it does is copy the region
-(that is, the part of the buffer between point and mark) from the
-current buffer to a specified buffer.
-
-@menu
-* append-to-buffer overview::
-* append interactive::          A two part interactive expression.
-* append-to-buffer body::       Incorporates a @code{let} expression.
-* append save-excursion::       How the @code{save-excursion} works.
-@end menu
-
-@node append-to-buffer overview, append interactive, append-to-buffer, append-to-buffer
-@ifnottex
-@unnumberedsubsec An Overview of @code{append-to-buffer}
-@end ifnottex
-
-@findex insert-buffer-substring
-The @code{append-to-buffer} command uses the
-@code{insert-buffer-substring} function to copy the region.
-@code{insert-buffer-substring} is described by its name: it takes a
-string of characters from part of a buffer, a ``substring'', and
-inserts them into another buffer.
-
-Most of @code{append-to-buffer} is
-concerned with setting up the conditions for
-@code{insert-buffer-substring} to work: the code must specify both the
-buffer to which the text will go, the window it comes from and goes
-to, and the region that will be copied.
-
-@need 1250
-Here is the complete text of the function:
-
-@smallexample
-@group
-(defun append-to-buffer (buffer start end)
-  "Append to specified buffer the text of the region.
-It is inserted into that buffer before its point.
-@end group
-
-@group
-When calling from a program, give three arguments:
-BUFFER (or buffer name), START and END.
-START and END specify the portion of the current buffer to be copied."
-  (interactive
-   (list (read-buffer "Append to buffer: " (other-buffer
-                                            (current-buffer) t))
-         (region-beginning) (region-end)))
-@end group
-@group
-  (let ((oldbuf (current-buffer)))
-    (save-excursion
-      (let* ((append-to (get-buffer-create buffer))
-             (windows (get-buffer-window-list append-to t t))
-             point)
-        (set-buffer append-to)
-        (setq point (point))
-        (barf-if-buffer-read-only)
-        (insert-buffer-substring oldbuf start end)
-        (dolist (window windows)
-          (when (= (window-point window) point)
-            (set-window-point window (point))))))))
-@end group
-@end smallexample
-
-The function can be understood by looking at it as a series of
-filled-in templates.
-
-The outermost template is for the function definition.  In this
-function, it looks like this (with several slots filled in):
-
-@smallexample
-@group
-(defun append-to-buffer (buffer start end)
-  "@var{documentation}@dots{}"
-  (interactive @dots{})
-  @var{body}@dots{})
-@end group
-@end smallexample
-
-The first line of the function includes its name and three arguments.
-The arguments are the @code{buffer} to which the text will be copied, and
-the @code{start} and @code{end} of the region in the current buffer that
-will be copied.
-
-The next part of the function is the documentation, which is clear and
-complete.  As is conventional, the three arguments are written in
-upper case so you will notice them easily.  Even better, they are
-described in the same order as in the argument list.
-
-Note that the documentation distinguishes between a buffer and its
-name.  (The function can handle either.)
-
-@node append interactive, append-to-buffer body, append-to-buffer overview, append-to-buffer
-@comment  node-name,  next,  previous,  up
-@subsection The @code{append-to-buffer} Interactive Expression
-
-Since the @code{append-to-buffer} function will be used interactively,
-the function must have an @code{interactive} expression.  (For a
-review of @code{interactive}, see @ref{Interactive, , Making a
-Function Interactive}.)  The expression reads as follows:
-
-@smallexample
-@group
-(interactive
- (list (read-buffer
-        "Append to buffer: "
-        (other-buffer (current-buffer) t))
-       (region-beginning)
-       (region-end)))
-@end group
-@end smallexample
-
-@noindent
-This expression is not one with letters standing for parts, as
-described earlier.  Instead, it starts a list with these parts:
-
-The first part of the list is an expression to read the name of a
-buffer and return it as a string.  That is @code{read-buffer}.  The
-function requires a prompt as its first argument, @samp{"Append to
-buffer: "}.  Its second argument tells the command what value to
-provide if you don't specify anything.
-
-In this case that second argument is an expression containing the
-function @code{other-buffer}, an exception, and a @samp{t}, standing
-for true.
-
-The first argument to @code{other-buffer}, the exception, is yet
-another function, @code{current-buffer}.  That is not going to be
-returned.  The second argument is the symbol for true, @code{t}. that
-tells @code{other-buffer} that it may show visible buffers (except in
-this case, it will not show the current buffer, which makes sense).
-
-@need 1250
-The expression looks like this:
-
-@smallexample
-(other-buffer (current-buffer) t)
-@end smallexample
-
-The second and third arguments to the @code{list} expression are
-@code{(region-beginning)} and @code{(region-end)}.  These two
-functions specify the beginning and end of the text to be appended.
-
-@need 1250
-Originally, the command used the letters @samp{B} and @samp{r}.
-The whole @code{interactive} expression looked like this:
-
-@smallexample
-(interactive "BAppend to buffer:@: \nr")
-@end smallexample
-
-@noindent
-But when that was done, the default value of the buffer switched to
-was invisible.  That was not wanted.
-
-(The prompt was separated from the second argument with a newline,
-@samp{\n}.  It was followed by an @samp{r} that told Emacs to bind the
-two arguments that follow the symbol @code{buffer} in the function's
-argument list (that is, @code{start} and @code{end}) to the values of
-point and mark.  That argument worked fine.)
-
-@node append-to-buffer body, append save-excursion, append interactive, append-to-buffer
-@comment  node-name,  next,  previous,  up
-@subsection The Body of @code{append-to-buffer}
-
-@ignore
-in GNU Emacs 22   in    /usr/local/src/emacs/lisp/simple.el
-
-(defun append-to-buffer (buffer start end)
-  "Append to specified buffer the text of the region.
-It is inserted into that buffer before its point.
-
-When calling from a program, give three arguments:
-BUFFER (or buffer name), START and END.
-START and END specify the portion of the current buffer to be copied."
-  (interactive
-   (list (read-buffer "Append to buffer: " (other-buffer (current-buffer) t))
-         (region-beginning) (region-end)))
-  (let ((oldbuf (current-buffer)))
-    (save-excursion
-      (let* ((append-to (get-buffer-create buffer))
-             (windows (get-buffer-window-list append-to t t))
-             point)
-        (set-buffer append-to)
-        (setq point (point))
-        (barf-if-buffer-read-only)
-        (insert-buffer-substring oldbuf start end)
-        (dolist (window windows)
-          (when (= (window-point window) point)
-            (set-window-point window (point))))))))
-@end ignore
-
-The body of the @code{append-to-buffer} function begins with @code{let}.
-
-As we have seen before (@pxref{let, , @code{let}}), the purpose of a
-@code{let} expression is to create and give initial values to one or
-more variables that will only be used within the body of the
-@code{let}.  This means that such a variable will not be confused with
-any variable of the same name outside the @code{let} expression.
-
-We can see how the @code{let} expression fits into the function as a
-whole by showing a template for @code{append-to-buffer} with the
-@code{let} expression in outline:
-
-@smallexample
-@group
-(defun append-to-buffer (buffer start end)
-  "@var{documentation}@dots{}"
-  (interactive @dots{})
-  (let ((@var{variable} @var{value}))
-        @var{body}@dots{})
-@end group
-@end smallexample
-
-The @code{let} expression has three elements:
-
-@enumerate
-@item
-The symbol @code{let};
-
-@item
-A varlist containing, in this case, a single two-element list,
-@code{(@var{variable} @var{value})};
-
-@item
-The body of the @code{let} expression.
-@end enumerate
-
-@need 800
-In the @code{append-to-buffer} function, the varlist looks like this:
-
-@smallexample
-(oldbuf (current-buffer))
-@end smallexample
-
-@noindent
-In this part of the @code{let} expression, the one variable,
-@code{oldbuf}, is bound to the value returned by the
-@code{(current-buffer)} expression.  The variable, @code{oldbuf}, is
-used to keep track of the buffer in which you are working and from
-which you will copy.
-
-The element or elements of a varlist are surrounded by a set of
-parentheses so the Lisp interpreter can distinguish the varlist from
-the body of the @code{let}.  As a consequence, the two-element list
-within the varlist is surrounded by a circumscribing set of parentheses.
-The line looks like this:
-
-@smallexample
-@group
-(let ((oldbuf (current-buffer)))
-  @dots{} )
-@end group
-@end smallexample
-
-@noindent
-The two parentheses before @code{oldbuf} might surprise you if you did
-not realize that the first parenthesis before @code{oldbuf} marks the
-boundary of the varlist and the second parenthesis marks the beginning
-of the two-element list, @code{(oldbuf (current-buffer))}.
-
-@node append save-excursion,  , append-to-buffer body, append-to-buffer
-@comment  node-name,  next,  previous,  up
-@subsection @code{save-excursion} in @code{append-to-buffer}
-
-The body of the @code{let} expression in @code{append-to-buffer}
-consists of a @code{save-excursion} expression.
-
-The @code{save-excursion} function saves the locations of point and
-mark, and restores them to those positions after the expressions in the
-body of the @code{save-excursion} complete execution.  In addition,
-@code{save-excursion} keeps track of the original buffer, and
-restores it.  This is how @code{save-excursion} is used in
-@code{append-to-buffer}.
-
-@need 1500
-@cindex Indentation for formatting
-@cindex Formatting convention
-Incidentally, it is worth noting here that a Lisp function is normally
-formatted so that everything that is enclosed in a multi-line spread is
-indented more to the right than the first symbol.  In this function
-definition, the @code{let} is indented more than the @code{defun}, and
-the @code{save-excursion} is indented more than the @code{let}, like
-this:
-
-@smallexample
-@group
-(defun @dots{}
-  @dots{}
-  @dots{}
-  (let@dots{}
-    (save-excursion
-      @dots{}
-@end group
-@end smallexample
-
-@need 1500
-@noindent
-This formatting convention makes it easy to see that the lines in
-the body of the @code{save-excursion} are enclosed by the parentheses
-associated with @code{save-excursion}, just as the
-@code{save-excursion} itself is enclosed by the parentheses associated
-with the @code{let}:
-
-@smallexample
-@group
-(let ((oldbuf (current-buffer)))
-  (save-excursion
-    @dots{}
-    (set-buffer @dots{})
-    (insert-buffer-substring oldbuf start end)
-    @dots{}))
-@end group
-@end smallexample
-
-@need 1200
-The use of the @code{save-excursion} function can be viewed as a process
-of filling in the slots of a template:
-
-@smallexample
-@group
-(save-excursion
-  @var{first-expression-in-body}
-  @var{second-expression-in-body}
-   @dots{}
-  @var{last-expression-in-body})
-@end group
-@end smallexample
-
-@need 1200
-@noindent
-In this function, the body of the @code{save-excursion} contains only
-one expression, the @code{let*} expression.  You know about a
-@code{let} function.  The @code{let*} function is different.  It has a
-@samp{*} in its name.  It enables Emacs to set each variable in its
-varlist in sequence, one after another.
-
-Its critical feature is that variables later in the varlist can make
-use of the values to which Emacs set variables earlier in the varlist.
-@xref{fwd-para let, , The @code{let*} expression}.
-
-We will skip functions like @code{let*} and focus on two: the
-@code{set-buffer} function and the @code{insert-buffer-substring}
-function.
-
-@need 1250
-In the old days, the @code{set-buffer} expression was simply
-
-@smallexample
-(set-buffer (get-buffer-create buffer))
-@end smallexample
-
-@need 1250
-@noindent
-but now it is
-
-@smallexample
-(set-buffer append-to)
-@end smallexample
-
-@noindent
-@code{append-to} is bound to @code{(get-buffer-create buffer)} earlier
-on in the @code{let*} expression.  That extra binding would not be
-necessary except for that @code{append-to} is used later in the
-varlist as an argument to @code{get-buffer-window-list}.
-
-@ignore
-in GNU Emacs 22
-
-  (let ((oldbuf (current-buffer)))
-    (save-excursion
-      (let* ((append-to (get-buffer-create buffer))
-             (windows (get-buffer-window-list append-to t t))
-             point)
-        (set-buffer append-to)
-        (setq point (point))
-        (barf-if-buffer-read-only)
-        (insert-buffer-substring oldbuf start end)
-        (dolist (window windows)
-          (when (= (window-point window) point)
-            (set-window-point window (point))))))))
-@end ignore
-
-The @code{append-to-buffer} function definition inserts text from the
-buffer in which you are currently to a named buffer.  It happens that
-@code{insert-buffer-substring} copies text from another buffer to the
-current buffer, just the reverse---that is why the
-@code{append-to-buffer} definition starts out with a @code{let} that
-binds the local symbol @code{oldbuf} to the value returned by
-@code{current-buffer}.
-
-@need 1250
-The @code{insert-buffer-substring} expression looks like this:
-
-@smallexample
-(insert-buffer-substring oldbuf start end)
-@end smallexample
-
-@noindent
-The @code{insert-buffer-substring} function copies a string
-@emph{from} the buffer specified as its first argument and inserts the
-string into the present buffer.  In this case, the argument to
-@code{insert-buffer-substring} is the value of the variable created
-and bound by the @code{let}, namely the value of @code{oldbuf}, which
-was the current buffer when you gave the @code{append-to-buffer}
-command.
-
-After @code{insert-buffer-substring} has done its work,
-@code{save-excursion} will restore the action to the original buffer
-and @code{append-to-buffer} will have done its job.
-
-@need 800
-Written in skeletal form, the workings of the body look like this:
-
-@smallexample
-@group
-(let (@var{bind-}@code{oldbuf}@var{-to-value-of-}@code{current-buffer})
-  (save-excursion                       ; @r{Keep track of buffer.}
-    @var{change-buffer}
-    @var{insert-substring-from-}@code{oldbuf}@var{-into-buffer})
-
-  @var{change-back-to-original-buffer-when-finished}
-@var{let-the-local-meaning-of-}@code{oldbuf}@var{-disappear-when-finished}
-@end group
-@end smallexample
-
-In summary, @code{append-to-buffer} works as follows: it saves the
-value of the current buffer in the variable called @code{oldbuf}.  It
-gets the new buffer (creating one if need be) and switches Emacs'
-attention to it.  Using the value of @code{oldbuf}, it inserts the
-region of text from the old buffer into the new buffer; and then using
-@code{save-excursion}, it brings you back to your original buffer.
-
-In looking at @code{append-to-buffer}, you have explored a fairly
-complex function.  It shows how to use @code{let} and
-@code{save-excursion}, and how to change to and come back from another
-buffer.  Many function definitions use @code{let},
-@code{save-excursion}, and @code{set-buffer} this way.
-
-@node Buffer Related Review, Buffer Exercises, append-to-buffer, Buffer Walk Through
-@comment  node-name,  next,  previous,  up
-@section Review
-
-Here is a brief summary of the various functions discussed in this chapter.
-
-@table @code
-@item describe-function
-@itemx describe-variable
-Print the documentation for a function or variable.
-Conventionally bound to @kbd{C-h f} and @kbd{C-h v}.
-
-@item find-tag
-Find the file containing the source for a function or variable and
-switch buffers to it, positioning point at the beginning of the item.
-Conventionally bound to @kbd{M-.} (that's a period following the
-@key{META} key).
-
-@item save-excursion
-Save the location of point and mark and restore their values after the
-arguments to @code{save-excursion} have been evaluated.  Also, remember
-the current buffer and return to it.
-
-@item push-mark
-Set mark at a location and record the value of the previous mark on the
-mark ring.  The mark is a location in the buffer that will keep its
-relative position even if text is added to or removed from the buffer.
-
-@item goto-char
-Set point to the location specified by the value of the argument, which
-can be a number, a marker,  or an expression that returns the number of
-a position, such as @code{(point-min)}.
-
-@item insert-buffer-substring
-Copy a region of text from a buffer that is passed to the function as
-an argument and insert the region into the current buffer.
-
-@item mark-whole-buffer
-Mark the whole buffer as a region.  Normally bound to @kbd{C-x h}.
-
-@item set-buffer
-Switch the attention of Emacs to another buffer, but do not change the
-window being displayed.  Used when the program rather than a human is
-to work on a different buffer.
-
-@item get-buffer-create
-@itemx get-buffer
-Find a named buffer or create one if a buffer of that name does not
-exist.  The @code{get-buffer} function returns @code{nil} if the named
-buffer does not exist.
-@end table
-
-@need 1500
-@node Buffer Exercises,  , Buffer Related Review, Buffer Walk Through
-@section Exercises
-
-@itemize @bullet
-@item
-Write your own @code{simplified-end-of-buffer} function definition;
-then test it to see whether it works.
-
-@item
-Use @code{if} and @code{get-buffer} to write a function that prints a
-message telling you whether a buffer exists.
-
-@item
-Using @code{find-tag}, find the source for the @code{copy-to-buffer}
-function.
-@end itemize
-
-@node More Complex, Narrowing & Widening, Buffer Walk Through, Top
-@comment  node-name,  next,  previous,  up
-@chapter A Few More Complex Functions
-
-In this chapter, we build on what we have learned in previous chapters
-by looking at more complex functions.  The @code{copy-to-buffer}
-function illustrates use of two @code{save-excursion} expressions in
-one definition, while the @code{insert-buffer} function illustrates
-use of an asterisk in an @code{interactive} expression, use of
-@code{or}, and the important distinction between a name and the object
-to which the name refers.
-
-@menu
-* copy-to-buffer::              With @code{set-buffer}, @code{get-buffer-create}.
-* insert-buffer::               Read-only, and with @code{or}.
-* beginning-of-buffer::         Shows @code{goto-char},
-                                @code{point-min}, and @code{push-mark}.
-* Second Buffer Related Review::
-* optional Exercise::
-@end menu
-
-@node copy-to-buffer, insert-buffer, More Complex, More Complex
-@comment  node-name,  next,  previous,  up
-@section The Definition of @code{copy-to-buffer}
-@findex copy-to-buffer
-
-After understanding how @code{append-to-buffer} works, it is easy to
-understand @code{copy-to-buffer}.  This function copies text into a
-buffer, but instead of adding to the second buffer, it replaces all the
-previous text in the second buffer.
-
-@need 800
-The body of @code{copy-to-buffer} looks like this,
-
-@smallexample
-@group
-@dots{}
-(interactive "BCopy to buffer: \nr")
-(let ((oldbuf (current-buffer)))
-  (with-current-buffer (get-buffer-create buffer)
-    (barf-if-buffer-read-only)
-    (erase-buffer)
-    (save-excursion
-      (insert-buffer-substring oldbuf start end)))))
-@end group
-@end smallexample
-
-The @code{copy-to-buffer} function has a simpler @code{interactive}
-expression than @code{append-to-buffer}.
-
-@need 800
-The definition then says
-
-@smallexample
-(with-current-buffer (get-buffer-create buffer) @dots{}
-@end smallexample
-
-First, look at the earliest inner expression; that is evaluated first.
-That expression starts with @code{get-buffer-create buffer}.  The
-function tells the computer to use the buffer with the name specified
-as the one to which you are copying, or if such a buffer does not
-exist, to create it.  Then, the @code{with-current-buffer} function
-evaluates its body with that buffer temporarily current.
-
-(This demonstrates another way to shift the computer's attention but
-not the user's.  The @code{append-to-buffer} function showed how to do
-the same with @code{save-excursion} and @code{set-buffer}.
-@code{with-current-buffer} is a newer, and arguably easier,
-mechanism.)
-
-The @code{barf-if-buffer-read-only} function sends you an error
-message saying the buffer is read-only if you cannot modify it.
-
-The next line has the @code{erase-buffer} function as its sole
-contents.  That function erases the buffer.
-
-Finally, the last two lines contain the @code{save-excursion}
-expression with @code{insert-buffer-substring} as its body.
-The  @code{insert-buffer-substring} expression copies the text from
-the buffer you are in (and you have not seen the computer shift its
-attention, so you don't know that that buffer is now called
-@code{oldbuf}).
-
-Incidentally, this is what is meant by `replacement'.  To replace text,
-Emacs erases the previous text and then inserts new text.
-
-@need 1250
-In outline, the body of @code{copy-to-buffer} looks like this:
-
-@smallexample
-@group
-(let (@var{bind-}@code{oldbuf}@var{-to-value-of-}@code{current-buffer})
-    (@var{with-the-buffer-you-are-copying-to}
-      (@var{but-do-not-erase-or-copy-to-a-read-only-buffer})
-      (erase-buffer)
-      (save-excursion
-        @var{insert-substring-from-}@code{oldbuf}@var{-into-buffer})))
-@end group
-@end smallexample
-
-@node insert-buffer, beginning-of-buffer, copy-to-buffer, More Complex
-@comment  node-name,  next,  previous,  up
-@section The Definition of @code{insert-buffer}
-@findex insert-buffer
-
-@code{insert-buffer} is yet another buffer-related function.  This
-command copies another buffer @emph{into} the current buffer.  It is the
-reverse of @code{append-to-buffer} or @code{copy-to-buffer}, since they
-copy a region of text @emph{from} the current buffer to another buffer.
-
-Here is a discussion based on the original code.  The code was
-simplified in 2003 and is harder to understand.
-
-(@xref{New insert-buffer, , New Body for @code{insert-buffer}}, to see
-a discussion of the new body.)
-
-In addition, this code illustrates the use of @code{interactive} with a
-buffer that might be @dfn{read-only} and the important distinction
-between the name of an object and the object actually referred to.
-
-@menu
-* insert-buffer code::
-* insert-buffer interactive::   When you can read, but not write.
-* insert-buffer body::          The body has an @code{or} and a @code{let}.
-* if & or::                     Using an @code{if} instead of an @code{or}.
-* Insert or::                   How the @code{or} expression works.
-* Insert let::                  Two @code{save-excursion} expressions.
-* New insert-buffer::
-@end menu
-
-@node insert-buffer code, insert-buffer interactive, insert-buffer, insert-buffer
-@ifnottex
-@unnumberedsubsec The Code for @code{insert-buffer}
-@end ifnottex
-
-@need 800
-Here is the earlier code:
-
-@smallexample
-@group
-(defun insert-buffer (buffer)
-  "Insert after point the contents of BUFFER.
-Puts mark after the inserted text.
-BUFFER may be a buffer or a buffer name."
-  (interactive "*bInsert buffer:@: ")
-@end group
-@group
-  (or (bufferp buffer)
-      (setq buffer (get-buffer buffer)))
-  (let (start end newmark)
-    (save-excursion
-      (save-excursion
-        (set-buffer buffer)
-        (setq start (point-min) end (point-max)))
-@end group
-@group
-      (insert-buffer-substring buffer start end)
-      (setq newmark (point)))
-    (push-mark newmark)))
-@end group
-@end smallexample
-
-@need 1200
-As with other function definitions, you can use a template to see an
-outline of the function:
-
-@smallexample
-@group
-(defun insert-buffer (buffer)
-  "@var{documentation}@dots{}"
-  (interactive "*bInsert buffer:@: ")
-  @var{body}@dots{})
-@end group
-@end smallexample
-
-@node insert-buffer interactive, insert-buffer body, insert-buffer code, insert-buffer
-@comment  node-name,  next,  previous,  up
-@subsection The Interactive Expression in @code{insert-buffer}
-@findex interactive, @r{example use of}
-
-In @code{insert-buffer}, the argument to the @code{interactive}
-declaration has two parts, an asterisk, @samp{*}, and @samp{bInsert
-buffer:@: }.
-
-@menu
-* Read-only buffer::            When a buffer cannot be modified.
-* b for interactive::           An existing buffer or else its name.
-@end menu
-
-@node Read-only buffer, b for interactive, insert-buffer interactive, insert-buffer interactive
-@comment  node-name,  next,  previous,  up
-@unnumberedsubsubsec A Read-only Buffer
-@cindex Read-only buffer
-@cindex Asterisk for read-only buffer
-@findex * @r{for read-only buffer}
-
-The asterisk is for the situation when the current buffer is a
-read-only buffer---a buffer that cannot be modified.  If
-@code{insert-buffer} is called when the current buffer is read-only, a
-message to this effect is printed in the echo area and the terminal
-may beep or blink at you; you will not be permitted to insert anything
-into current buffer.  The asterisk does not need to be followed by a
-newline to separate it from the next argument.
-
-@node b for interactive,  , Read-only buffer, insert-buffer interactive
-@comment  node-name,  next,  previous,  up
-@unnumberedsubsubsec @samp{b} in an Interactive Expression
-
-The next argument in the interactive expression starts with a lower
-case @samp{b}.  (This is different from the code for
-@code{append-to-buffer}, which uses an upper-case @samp{B}.
-@xref{append-to-buffer, , The Definition of @code{append-to-buffer}}.)
-The lower-case @samp{b} tells the Lisp interpreter that the argument
-for @code{insert-buffer} should be an existing buffer or else its
-name.  (The upper-case @samp{B} option provides for the possibility
-that the buffer does not exist.)  Emacs will prompt you for the name
-of the buffer, offering you a default buffer, with name completion
-enabled.  If the buffer does not exist, you receive a message that
-says ``No match''; your terminal may beep at you as well.
-
-The new and simplified code generates a list for @code{interactive}.
-It uses the @code{barf-if-buffer-read-only} and @code{read-buffer}
-functions with which we are already familiar and the @code{progn}
-special form with which we are not.  (It will be described later.)
-
-@node insert-buffer body, if & or, insert-buffer interactive, insert-buffer
-@comment  node-name,  next,  previous,  up
-@subsection The Body of the @code{insert-buffer} Function
-
-The body of the @code{insert-buffer} function has two major parts: an
-@code{or} expression and a @code{let} expression.  The purpose of the
-@code{or} expression is to ensure that the argument @code{buffer} is
-bound to a buffer and not just the name of a buffer.  The body of the
-@code{let} expression contains the code which copies the other buffer
-into the current buffer.
-
-@need 1250
-In outline, the two expressions fit into the @code{insert-buffer}
-function like this:
-
-@smallexample
-@group
-(defun insert-buffer (buffer)
-  "@var{documentation}@dots{}"
-  (interactive "*bInsert buffer:@: ")
-  (or @dots{}
-      @dots{}
-@end group
-@group
-  (let (@var{varlist})
-      @var{body-of-}@code{let}@dots{} )
-@end group
-@end smallexample
-
-To understand how the @code{or} expression ensures that the argument
-@code{buffer} is bound to a buffer and not to the name of a buffer, it
-is first necessary to understand the @code{or} function.
-
-Before doing this, let me rewrite this part of the function using
-@code{if} so that you can see what is done in a manner that will be familiar.
-
-@node if & or, Insert or, insert-buffer body, insert-buffer
-@comment  node-name,  next,  previous,  up
-@subsection @code{insert-buffer} With an @code{if} Instead of an @code{or}
-
-The job to be done is to make sure the value of @code{buffer} is a
-buffer itself and not the name of a buffer.  If the value is the name,
-then the buffer itself must be got.
-
-You can imagine yourself at a conference where an usher is wandering
-around holding a list with your name on it and looking for you: the
-usher is ``bound'' to your name, not to you; but when the usher finds
-you and takes your arm, the usher becomes ``bound'' to you.
-
-@need 800
-In Lisp, you might describe this situation like this:
-
-@smallexample
-@group
-(if (not (holding-on-to-guest))
-    (find-and-take-arm-of-guest))
-@end group
-@end smallexample
-
-We want to do the same thing with a buffer---if we do not have the
-buffer itself, we want to get it.
-
-@need 1200
-Using a predicate called @code{bufferp} that tells us whether we have a
-buffer (rather than its name), we can write the code like this:
-
-@smallexample
-@group
-(if (not (bufferp buffer))              ; @r{if-part}
-    (setq buffer (get-buffer buffer)))  ; @r{then-part}
-@end group
-@end smallexample
-
-@noindent
-Here, the true-or-false-test of the @code{if} expression is
-@w{@code{(not (bufferp buffer))}}; and the then-part is the expression
-@w{@code{(setq buffer (get-buffer buffer))}}.
-
-In the test, the function @code{bufferp} returns true if its argument is
-a buffer---but false if its argument is the name of the buffer.  (The
-last character of the function name @code{bufferp} is the character
-@samp{p}; as we saw earlier, such use of @samp{p} is a convention that
-indicates that the function is a predicate, which is a term that means
-that the function will determine whether some property is true or false.
-@xref{Wrong Type of Argument, , Using the Wrong Type Object as an
-Argument}.)
-
-@need 1200
-The function @code{not} precedes the expression @code{(bufferp buffer)},
-so the true-or-false-test looks like this:
-
-@smallexample
-(not (bufferp buffer))
-@end smallexample
-
-@noindent
-@code{not} is a function that returns true if its argument is false
-and false if its argument is true.  So if @code{(bufferp buffer)}
-returns true, the @code{not} expression returns false and vice-verse:
-what is ``not true'' is false and what is ``not false'' is true.
-
-Using this test, the @code{if} expression works as follows: when the
-value of the variable @code{buffer} is actually a buffer rather than
-its name, the true-or-false-test returns false and the @code{if}
-expression does not evaluate the then-part.  This is fine, since we do
-not need to do anything to the variable @code{buffer} if it really is
-a buffer.
-
-On the other hand, when the value of @code{buffer} is not a buffer
-itself, but the name of a buffer, the true-or-false-test returns true
-and the then-part of the expression is evaluated.  In this case, the
-then-part is @code{(setq buffer (get-buffer buffer))}.  This
-expression uses the @code{get-buffer} function to return an actual
-buffer itself, given its name.  The @code{setq} then sets the variable
-@code{buffer} to the value of the buffer itself, replacing its previous
-value (which was the name of the buffer).
-
-@node Insert or, Insert let, if & or, insert-buffer
-@comment  node-name,  next,  previous,  up
-@subsection The @code{or} in the Body
-
-The purpose of the @code{or} expression in the @code{insert-buffer}
-function is to ensure that the argument @code{buffer} is bound to a
-buffer and not just to the name of a buffer.  The previous section shows
-how the job could have been done using an @code{if} expression.
-However, the @code{insert-buffer} function actually uses @code{or}.
-To understand this, it is necessary to understand how @code{or} works.
-
-@findex or
-An @code{or} function can have any number of arguments.  It evaluates
-each argument in turn and returns the value of the first of its
-arguments that is not @code{nil}.  Also, and this is a crucial feature
-of @code{or}, it does not evaluate any subsequent arguments after
-returning the first non-@code{nil} value.
-
-@need 800
-The @code{or} expression looks like this:
-
-@smallexample
-@group
-(or (bufferp buffer)
-    (setq buffer (get-buffer buffer)))
-@end group
-@end smallexample
-
-@noindent
-The first argument to @code{or} is the expression @code{(bufferp buffer)}.
-This expression returns true (a non-@code{nil} value) if the buffer is
-actually a buffer, and not just the name of a buffer.  In the @code{or}
-expression, if this is the case, the @code{or} expression returns this
-true value and does not evaluate the next expression---and this is fine
-with us, since we do not want to do anything to the value of
-@code{buffer} if it really is a buffer.
-
-On the other hand, if the value of @code{(bufferp buffer)} is @code{nil},
-which it will be if the value of @code{buffer} is the name of a buffer,
-the Lisp interpreter evaluates the next element of the @code{or}
-expression.  This is the expression @code{(setq buffer (get-buffer
-buffer))}.  This expression returns a non-@code{nil} value, which
-is the value to which it sets the variable @code{buffer}---and this
-value is a buffer itself, not the name of a buffer.
-
-The result of all this is that the symbol @code{buffer} is always
-bound to a buffer itself rather than to the name of a buffer.  All
-this is necessary because the @code{set-buffer} function in a
-following line only works with a buffer itself, not with the name to a
-buffer.
-
-@need 1250
-Incidentally, using @code{or}, the situation with the usher would be
-written like this:
-
-@smallexample
-(or (holding-on-to-guest) (find-and-take-arm-of-guest))
-@end smallexample
-
-@node Insert let, New insert-buffer, Insert or, insert-buffer
-@comment  node-name,  next,  previous,  up
-@subsection The @code{let} Expression in @code{insert-buffer}
-
-After ensuring that the variable @code{buffer} refers to a buffer itself
-and not just to the name of a buffer, the @code{insert-buffer function}
-continues with a @code{let} expression.  This specifies three local
-variables, @code{start}, @code{end}, and @code{newmark} and binds them
-to the initial value @code{nil}.  These variables are used inside the
-remainder of the @code{let} and temporarily hide any other occurrence of
-variables of the same name in Emacs until the end of the @code{let}.
-
-@need 1200
-The body of the @code{let} contains two @code{save-excursion}
-expressions.  First, we will look at the inner @code{save-excursion}
-expression in detail.  The expression looks like this:
-
-@smallexample
-@group
-(save-excursion
-  (set-buffer buffer)
-  (setq start (point-min) end (point-max)))
-@end group
-@end smallexample
-
-@noindent
-The expression @code{(set-buffer buffer)} changes Emacs' attention
-from the current buffer to the one from which the text will copied.
-In that buffer, the variables @code{start} and @code{end} are set to
-the beginning and end of the buffer, using the commands
-@code{point-min} and @code{point-max}.  Note that we have here an
-illustration of how @code{setq} is able to set two variables in the
-same expression.  The first argument of @code{setq} is set to the
-value of its second, and its third argument is set to the value of its
-fourth.
-
-After the body of the inner @code{save-excursion} is evaluated, the
-@code{save-excursion} restores the original buffer, but @code{start} and
-@code{end} remain set to the values of the beginning and end of the
-buffer from which the text will be copied.
-
-@need 1250
-The outer @code{save-excursion} expression looks like this:
-
-@smallexample
-@group
-(save-excursion
-  (@var{inner-}@code{save-excursion}@var{-expression}
-     (@var{go-to-new-buffer-and-set-}@code{start}@var{-and-}@code{end})
-  (insert-buffer-substring buffer start end)
-  (setq newmark (point)))
-@end group
-@end smallexample
-
-@noindent
-The @code{insert-buffer-substring} function copies the text
-@emph{into} the current buffer @emph{from} the region indicated by
-@code{start} and @code{end} in @code{buffer}.  Since the whole of the
-second buffer lies between @code{start} and @code{end}, the whole of
-the second buffer is copied into the buffer you are editing.  Next,
-the value of point, which will be at the end of the inserted text, is
-recorded in the variable @code{newmark}.
-
-After the body of the outer @code{save-excursion} is evaluated, point
-and mark are relocated to their original places.
-
-However, it is convenient to locate a mark at the end of the newly
-inserted text and locate point at its beginning.  The @code{newmark}
-variable records the end of the inserted text.  In the last line of
-the @code{let} expression, the @code{(push-mark newmark)} expression
-function sets a mark to this location.  (The previous location of the
-mark is still accessible; it is recorded on the mark ring and you can
-go back to it with @kbd{C-u C-@key{SPC}}.)  Meanwhile, point is
-located at the beginning of the inserted text, which is where it was
-before you called the insert function, the position of which was saved
-by the first @code{save-excursion}.
-
-@need 1250
-The whole @code{let} expression looks like this:
-
-@smallexample
-@group
-(let (start end newmark)
-  (save-excursion
-    (save-excursion
-      (set-buffer buffer)
-      (setq start (point-min) end (point-max)))
-    (insert-buffer-substring buffer start end)
-    (setq newmark (point)))
-  (push-mark newmark))
-@end group
-@end smallexample
-
-Like the @code{append-to-buffer} function, the @code{insert-buffer}
-function uses @code{let}, @code{save-excursion}, and
-@code{set-buffer}.  In addition, the function illustrates one way to
-use @code{or}.  All these functions are building blocks that we will
-find and use again and again.
-
-@node New insert-buffer,  , Insert let, insert-buffer
-@comment  node-name,  next,  previous,  up
-@subsection New Body for @code{insert-buffer}
-@findex insert-buffer, new version body
-@findex new version body for insert-buffer
-
-The body in the GNU Emacs 22 version is more confusing than the original.
-
-@need 1250
-It consists of two expressions,
-
-@smallexample
-@group
-  (push-mark
-   (save-excursion
-     (insert-buffer-substring (get-buffer buffer))
-     (point)))
-
-   nil
-@end group
-@end smallexample
-
-@noindent
-except, and this is what confuses novices, very important work is done
-inside the @code{push-mark} expression.
-
-The @code{get-buffer} function returns a buffer with the name
-provided.  You will note that the function is @emph{not} called
-@code{get-buffer-create}; it does not create a buffer if one does not
-already exist.  The buffer returned by @code{get-buffer}, an existing
-buffer, is passed to @code{insert-buffer-substring}, which inserts the
-whole of the buffer (since you did not specify anything else).
-
-The location into which the buffer is inserted is recorded by
-@code{push-mark}.  Then the function returns @code{nil}, the value of
-its last command.  Put another way, the @code{insert-buffer} function
-exists only to produce a side effect, inserting another buffer, not to
-return any value.
-
-@node beginning-of-buffer, Second Buffer Related Review, insert-buffer, More Complex
-@comment  node-name,  next,  previous,  up
-@section Complete Definition of @code{beginning-of-buffer}
-@findex beginning-of-buffer
-
-The basic structure of the @code{beginning-of-buffer} function has
-already been discussed.  (@xref{simplified-beginning-of-buffer, , A
-Simplified @code{beginning-of-buffer} Definition}.)
-This section describes the complex part of the definition.
-
-As previously described, when invoked without an argument,
-@code{beginning-of-buffer} moves the cursor to the beginning of the
-buffer (in truth, the beginning of the accessible portion of the
-buffer), leaving the mark at the previous position.  However, when the
-command is invoked with a number between one and ten, the function
-considers that number to be a fraction of the length of the buffer,
-measured in tenths, and Emacs moves the cursor that fraction of the
-way from the beginning of the buffer.  Thus, you can either call this
-function with the key command @kbd{M-<}, which will move the cursor to
-the beginning of the buffer, or with a key command such as @kbd{C-u 7
-M-<} which will move the cursor to a point 70% of the way through the
-buffer.  If a number bigger than ten is used for the argument, it
-moves to the end of the buffer.
-
-The @code{beginning-of-buffer} function can be called with or without an
-argument.  The use of the argument is optional.
-
-@menu
-* Optional Arguments::
-* beginning-of-buffer opt arg::  Example with optional argument.
-* beginning-of-buffer complete::
-@end menu
-
-@node Optional Arguments, beginning-of-buffer opt arg, beginning-of-buffer, beginning-of-buffer
-@subsection Optional Arguments
-
-Unless told otherwise, Lisp expects that a function with an argument in
-its function definition will be called with a value for that argument.
-If that does not happen, you get an error and a message that says
-@samp{Wrong number of arguments}.
-
-@cindex Optional arguments
-@cindex Keyword
-@findex optional
-However, optional arguments are a feature of Lisp: a particular
-@dfn{keyword} is used to tell the Lisp interpreter that an argument is
-optional.  The keyword is @code{&optional}.  (The @samp{&} in front of
-@samp{optional} is part of the keyword.)  In a function definition, if
-an argument follows the keyword @code{&optional}, no value need be
-passed to that argument when the function is called.
-
-@need 1200
-The first line of the function definition of @code{beginning-of-buffer}
-therefore looks like this:
-
-@smallexample
-(defun beginning-of-buffer (&optional arg)
-@end smallexample
-
-@need 1250
-In outline, the whole function looks like this:
-
-@smallexample
-@group
-(defun beginning-of-buffer (&optional arg)
-  "@var{documentation}@dots{}"
-  (interactive "P")
-  (or (@var{is-the-argument-a-cons-cell} arg)
-      (and @var{are-both-transient-mark-mode-and-mark-active-true})
-      (push-mark))
-  (let (@var{determine-size-and-set-it})
-  (goto-char
-    (@var{if-there-is-an-argument}
-        @var{figure-out-where-to-go}
-      @var{else-go-to}
-      (point-min))))
-   @var{do-nicety}
-@end group
-@end smallexample
-
-The function is similar to the @code{simplified-beginning-of-buffer}
-function except that the @code{interactive} expression has @code{"P"}
-as an argument and the @code{goto-char} function is followed by an
-if-then-else expression that figures out where to put the cursor if
-there is an argument that is not a cons cell.
-
-(Since I do not explain a cons cell for many more chapters, please
-consider ignoring the function @code{consp}.  @xref{List
-Implementation, , How Lists are Implemented}, and @ref{Cons Cell Type,
-, Cons Cell and List Types, elisp, The GNU Emacs Lisp Reference
-Manual}.)
-
-The @code{"P"} in the @code{interactive} expression tells Emacs to
-pass a prefix argument, if there is one, to the function in raw form.
-A prefix argument is made by typing the @key{META} key followed by a
-number, or by typing @kbd{C-u} and then a number.  (If you don't type
-a number, @kbd{C-u} defaults to a cons cell with a 4.  A lowercase
-@code{"p"} in the @code{interactive} expression causes the function to
-convert a prefix arg to a number.)
-
-The true-or-false-test of the @code{if} expression looks complex, but
-it is not: it checks whether @code{arg} has a value that is not
-@code{nil} and whether it is a cons cell.  (That is what @code{consp}
-does; it checks whether its argument is a cons cell.)  If @code{arg}
-has a value that is not @code{nil} (and is not a cons cell), which
-will be the case if @code{beginning-of-buffer} is called with a
-numeric argument, then this true-or-false-test will return true and
-the then-part of the @code{if} expression will be evaluated.  On the
-other hand, if @code{beginning-of-buffer} is not called with an
-argument, the value of @code{arg} will be @code{nil} and the else-part
-of the @code{if} expression will be evaluated.  The else-part is
-simply @code{point-min}, and when this is the outcome, the whole
-@code{goto-char} expression is @code{(goto-char (point-min))}, which
-is how we saw the @code{beginning-of-buffer} function in its
-simplified form.
-
-@node beginning-of-buffer opt arg, beginning-of-buffer complete, Optional Arguments, beginning-of-buffer
-@subsection @code{beginning-of-buffer} with an Argument
-
-When @code{beginning-of-buffer} is called with an argument, an
-expression is evaluated which calculates what value to pass to
-@code{goto-char}.  This expression is rather complicated at first sight.
-It includes an inner @code{if} expression and much arithmetic.  It looks
-like this:
-
-@smallexample
-@group
-(if (> (buffer-size) 10000)
-    ;; @r{Avoid overflow for large buffer sizes!}
-                          (* (prefix-numeric-value arg)
-                             (/ size 10))
-  (/
-   (+ 10
-      (*
-       size (prefix-numeric-value arg))) 10)))
-@end group
-@end smallexample
-
-@menu
-* Disentangle beginning-of-buffer::
-* Large buffer case::
-* Small buffer case::
-@end menu
-
-@node Disentangle beginning-of-buffer, Large buffer case, beginning-of-buffer opt arg, beginning-of-buffer opt arg
-@ifnottex
-@unnumberedsubsubsec Disentangle @code{beginning-of-buffer}
-@end ifnottex
-
-Like other complex-looking expressions, the conditional expression
-within @code{beginning-of-buffer} can be disentangled by looking at it
-as parts of a template, in this case, the template for an if-then-else
-expression.  In skeletal form, the expression looks like this:
-
-@smallexample
-@group
-(if (@var{buffer-is-large}
-    @var{divide-buffer-size-by-10-and-multiply-by-arg}
-  @var{else-use-alternate-calculation}
-@end group
-@end smallexample
-
-The true-or-false-test of this inner @code{if} expression checks the
-size of the buffer.  The reason for this is that the old version 18
-Emacs used numbers that are no bigger than eight million or so and in
-the computation that followed, the programmer feared that Emacs might
-try to use over-large numbers if the buffer were large.  The term
-`overflow', mentioned in the comment, means numbers that are over
-large.  More recent versions of Emacs use larger numbers, but this
-code has not been touched, if only because people now look at buffers
-that are far, far larger than ever before.
-
-There are two cases:  if the buffer is large and if it is not.
-
-@node Large buffer case, Small buffer case, Disentangle beginning-of-buffer, beginning-of-buffer opt arg
-@comment  node-name,  next,  previous,  up
-@unnumberedsubsubsec What happens in a large buffer
-
-In @code{beginning-of-buffer}, the inner @code{if} expression tests
-whether the size of the buffer is greater than 10,000 characters.  To do
-this, it uses the @code{>} function and the computation of @code{size}
-that comes from the let expression.
-
-In the old days, the function @code{buffer-size} was used.  Not only
-was that function called several times, it gave the size of the whole
-buffer, not the accessible part.  The computation makes much more
-sense when it handles just the accessible part.  (@xref{Narrowing &
-Widening, , Narrowing and Widening}, for more information on focusing
-attention to an `accessible' part.)
-
-@need 800
-The line looks like this:
-
-@smallexample
-(if (> size 10000)
-@end smallexample
-
-@need 1200
-@noindent
-When the buffer is large, the then-part of the @code{if} expression is
-evaluated.  It reads like this (after formatting for easy reading):
-
-@smallexample
-@group
-(*
-  (prefix-numeric-value arg)
-  (/ size 10))
-@end group
-@end smallexample
-
-@noindent
-This expression is a multiplication, with two arguments to the function
-@code{*}.
-
-The first argument is @code{(prefix-numeric-value arg)}.  When
-@code{"P"} is used as the argument for @code{interactive}, the value
-passed to the function as its argument is passed a ``raw prefix
-argument'', and not a number.  (It is a number in a list.)  To perform
-the arithmetic, a conversion is necessary, and
-@code{prefix-numeric-value} does the job.
-
-@findex / @r{(division)}
-@cindex Division
-The second argument is @code{(/ size 10)}.  This expression divides
-the numeric value by ten --- the numeric value of the size of the
-accessible portion of the buffer.  This produces a number that tells
-how many characters make up one tenth of the buffer size.  (In Lisp,
-@code{/} is used for division, just as @code{*} is used for
-multiplication.)
-
-@need 1200
-In the multiplication expression as a whole, this amount is multiplied
-by the value of the prefix argument---the multiplication looks like this:
-
-@smallexample
-@group
-(* @var{numeric-value-of-prefix-arg}
-   @var{number-of-characters-in-one-tenth-of-the-accessible-buffer})
-@end group
-@end smallexample
-
-@noindent
-If, for example, the prefix argument is @samp{7}, the one-tenth value
-will be multiplied by 7 to give a position 70% of the way through.
-
-@need 1200
-The result of all this is that if the accessible portion of the buffer
-is large, the @code{goto-char} expression reads like this:
-
-@smallexample
-@group
-(goto-char (* (prefix-numeric-value arg)
-              (/ size 10)))
-@end group
-@end smallexample
-
-This puts the cursor where we want it.
-
-@node Small buffer case,  , Large buffer case, beginning-of-buffer opt arg
-@comment  node-name,  next,  previous,  up
-@unnumberedsubsubsec What happens in a small buffer
-
-If the buffer contains fewer than 10,000 characters, a slightly
-different computation is performed.  You might think this is not
-necessary, since the first computation could do the job.  However, in
-a small buffer, the first method may not put the cursor on exactly the
-desired line; the second method does a better job.
-
-@need 800
-The code looks like this:
-
-@c Keep this on one line.
-@smallexample
-(/ (+ 10 (* size (prefix-numeric-value arg))) 10))
-@end smallexample
-
-@need 1200
-@noindent
-This is code in which you figure out what happens by discovering how the
-functions are embedded in parentheses.  It is easier to read if you
-reformat it with each expression indented more deeply than its
-enclosing expression:
-
-@smallexample
-@group
-  (/
-   (+ 10
-      (*
-       size
-       (prefix-numeric-value arg)))
-   10))
-@end group
-@end smallexample
-
-@need 1200
-@noindent
-Looking at parentheses, we see that the innermost operation is
-@code{(prefix-numeric-value arg)}, which converts the raw argument to
-a number.  In the following expression, this number is multiplied by
-the size of the accessible portion of the buffer:
-
-@smallexample
-(* size (prefix-numeric-value arg))
-@end smallexample
-
-@noindent
-This multiplication creates a number that may be larger than the size of
-the buffer---seven times larger if the argument is 7, for example.  Ten
-is then added to this number and finally the large number is divided by
-ten to provide a value that is one character larger than the percentage
-position in the buffer.
-
-The number that results from all this is passed to @code{goto-char} and
-the cursor is moved to that point.
-
-@need 1500
-@node beginning-of-buffer complete,  , beginning-of-buffer opt arg, beginning-of-buffer
-@comment  node-name,  next,  previous,  up
-@subsection The Complete @code{beginning-of-buffer}
-
-@need 1000
-Here is the complete text of the @code{beginning-of-buffer} function:
-@sp 1
-
-@c In GNU Emacs 22
-@smallexample
-@group
-(defun beginning-of-buffer (&optional arg)
-  "Move point to the beginning of the buffer;
-leave mark at previous position.
-With \\[universal-argument] prefix,
-do not set mark at previous position.
-With numeric arg N,
-put point N/10 of the way from the beginning.
-
-If the buffer is narrowed,
-this command uses the beginning and size
-of the accessible part of the buffer.
-@end group
-
-@group
-Don't use this command in Lisp programs!
-\(goto-char (point-min)) is faster
-and avoids clobbering the mark."
-  (interactive "P")
-  (or (consp arg)
-      (and transient-mark-mode mark-active)
-      (push-mark))
-@end group
-@group
-  (let ((size (- (point-max) (point-min))))
-    (goto-char (if (and arg (not (consp arg)))
-                   (+ (point-min)
-                      (if (> size 10000)
-                          ;; Avoid overflow for large buffer sizes!
-                          (* (prefix-numeric-value arg)
-                             (/ size 10))
-                        (/ (+ 10 (* size (prefix-numeric-value arg))) 10)))
-                 (point-min))))
-  (if arg (forward-line 1)))
-@end group
-@end smallexample
-
-@ignore
-From before GNU Emacs 22
-@smallexample
-@group
-(defun beginning-of-buffer (&optional arg)
-  "Move point to the beginning of the buffer;
-leave mark at previous position.
-With arg N, put point N/10 of the way
-from the true beginning.
-@end group
-@group
-Don't use this in Lisp programs!
-\(goto-char (point-min)) is faster
-and does not set the mark."
-  (interactive "P")
-  (push-mark)
-@end group
-@group
-  (goto-char
-   (if arg
-       (if (> (buffer-size) 10000)
-           ;; @r{Avoid overflow for large buffer sizes!}
-           (* (prefix-numeric-value arg)
-              (/ (buffer-size) 10))
-@end group
-@group
-         (/ (+ 10 (* (buffer-size)
-                     (prefix-numeric-value arg)))
-            10))
-     (point-min)))
-  (if arg (forward-line 1)))
-@end group
-@end smallexample
-@end ignore
-
-@noindent
-Except for two small points, the previous discussion shows how this
-function works.  The first point deals with a detail in the
-documentation string, and the second point concerns the last line of
-the function.
-
-@need 800
-In the documentation string, there is reference to an expression:
-
-@smallexample
-\\[universal-argument]
-@end smallexample
-
-@noindent
-A @samp{\\} is used before the first square bracket of this
-expression.  This @samp{\\} tells the Lisp interpreter to substitute
-whatever key is currently bound to the @samp{[@dots{}]}.  In the case
-of @code{universal-argument}, that is usually @kbd{C-u}, but it might
-be different.  (@xref{Documentation Tips, , Tips for Documentation
-Strings, elisp, The GNU Emacs Lisp Reference Manual}, for more
-information.)
-
-@need 1200
-Finally, the last line of the @code{beginning-of-buffer} command says
-to move point to the beginning of the next line if the command is
-invoked with an argument:
-
-@smallexample
-(if arg (forward-line 1)))
-@end smallexample
-
-@noindent
-This puts the cursor at the beginning of the first line after the
-appropriate tenths position in the buffer.  This is a flourish that
-means that the cursor is always located @emph{at least} the requested
-tenths of the way through the buffer, which is a nicety that is,
-perhaps, not necessary, but which, if it did not occur, would be sure
-to draw complaints.
-
-On the other hand, it also means that if you specify the command with
-a @kbd{C-u}, but without a number, that is to say, if the `raw prefix
-argument' is simply a cons cell, then the command puts you at the
-beginning of the second line @dots{}  I don't know whether this is
-intended or whether no one has dealt with the code to avoid this
-happening.
-
-@node Second Buffer Related Review, optional Exercise, beginning-of-buffer, More Complex
-@comment  node-name,  next,  previous,  up
-@section Review
-
-Here is a brief summary of some of the topics covered in this chapter.
-
-@table @code
-@item or
-Evaluate each argument in sequence, and return the value of the first
-argument that is not @code{nil}; if none return a value that is not
-@code{nil}, return @code{nil}.  In brief, return the first true value
-of the arguments; return a true value if one @emph{or} any of the
-others are true.
-
-@item and
-Evaluate each argument in sequence, and if any are @code{nil}, return
-@code{nil}; if none are @code{nil}, return the value of the last
-argument.  In brief, return a true value only if all the arguments are
-true; return a true value if one @emph{and} each of the others is
-true.
-
-@item &optional
-A keyword used to indicate that an argument to a function definition
-is optional; this means that the function can be evaluated without the
-argument, if desired.
-
-@item prefix-numeric-value
-Convert the `raw prefix argument' produced by @code{(interactive
-"P")} to a numeric value.
-
-@item forward-line
-Move point forward to the beginning of the next line, or if the argument
-is greater than one, forward that many lines.  If it can't move as far
-forward as it is supposed to, @code{forward-line} goes forward as far as
-it can and then returns a count of the number of additional lines it was
-supposed to move but couldn't.
-
-@item erase-buffer
-Delete the entire contents of the current buffer.
-
-@item bufferp
-Return @code{t} if its argument is a buffer; otherwise return @code{nil}.
-@end table
-
-@node optional Exercise,  , Second Buffer Related Review, More Complex
-@section @code{optional} Argument Exercise
-
-Write an interactive function with an optional argument that tests
-whether its argument, a number, is greater than or equal to, or else,
-less than the value of @code{fill-column}, and tells you which, in a
-message.  However, if you do not pass an argument to the function, use
-56 as a default value.
-
-@node Narrowing & Widening, car cdr & cons, More Complex, Top
-@comment  node-name,  next,  previous,  up
-@chapter Narrowing and Widening
-@cindex Focusing attention (narrowing)
-@cindex Narrowing
-@cindex Widening
-
-Narrowing is a feature of Emacs that makes it possible for you to focus
-on a specific part of a buffer, and work without accidentally changing
-other parts.  Narrowing is normally disabled since it can confuse
-novices.
-
-@menu
-* Narrowing advantages::        The advantages of narrowing
-* save-restriction::            The @code{save-restriction} special form.
-* what-line::                   The number of the line that point is on.
-* narrow Exercise::
-@end menu
-
-@node Narrowing advantages, save-restriction, Narrowing & Widening, Narrowing & Widening
-@ifnottex
-@unnumberedsec The Advantages of Narrowing
-@end ifnottex
-
-With narrowing, the rest of a buffer is made invisible, as if it weren't
-there.  This is an advantage if, for example, you want to replace a word
-in one part of a buffer but not in another: you narrow to the part you want
-and the replacement is carried out only in that section, not in the rest
-of the buffer.  Searches will only work within a narrowed region, not
-outside of one, so if you are fixing a part of a document, you can keep
-yourself from accidentally finding parts you do not need to fix by
-narrowing just to the region you want.
-(The key binding for @code{narrow-to-region} is @kbd{C-x n n}.)
-
-However, narrowing does make the rest of the buffer invisible, which
-can scare people who inadvertently invoke narrowing and think they
-have deleted a part of their file.  Moreover, the @code{undo} command
-(which is usually bound to @kbd{C-x u}) does not turn off narrowing
-(nor should it), so people can become quite desperate if they do not
-know that they can return the rest of a buffer to visibility with the
-@code{widen} command.
-(The key binding for @code{widen} is @kbd{C-x n w}.)
-
-Narrowing is just as useful to the Lisp interpreter as to a human.
-Often, an Emacs Lisp function is designed to work on just part of a
-buffer; or conversely, an Emacs Lisp function needs to work on all of a
-buffer that has been narrowed.  The @code{what-line} function, for
-example, removes the narrowing from a buffer, if it has any narrowing
-and when it has finished its job, restores the narrowing to what it was.
-On the other hand, the @code{count-lines} function, which is called by
-@code{what-line}, uses narrowing to restrict itself to just that portion
-of the buffer in which it is interested and then restores the previous
-situation.
-
-@node save-restriction, what-line, Narrowing advantages, Narrowing & Widening
-@comment  node-name,  next,  previous,  up
-@section The @code{save-restriction} Special Form
-@findex save-restriction
-
-In Emacs Lisp, you can use the @code{save-restriction} special form to
-keep track of whatever narrowing is in effect, if any.  When the Lisp
-interpreter meets with @code{save-restriction}, it executes the code
-in the body of the @code{save-restriction} expression, and then undoes
-any changes to narrowing that the code caused.  If, for example, the
-buffer is narrowed and the code that follows @code{save-restriction}
-gets rid of the narrowing, @code{save-restriction} returns the buffer
-to its narrowed region afterwards.  In the @code{what-line} command,
-any narrowing the buffer may have is undone by the @code{widen}
-command that immediately follows the @code{save-restriction} command.
-Any original narrowing is restored just before the completion of the
-function.
-
-@need 1250
-The template for a @code{save-restriction} expression is simple:
-
-@smallexample
-@group
-(save-restriction
-  @var{body}@dots{} )
-@end group
-@end smallexample
-
-@noindent
-The body of the @code{save-restriction} is one or more expressions that
-will be evaluated in sequence by the Lisp interpreter.
-
-Finally, a point to note: when you use both @code{save-excursion} and
-@code{save-restriction}, one right after the other, you should use
-@code{save-excursion} outermost.  If you write them in reverse order,
-you may fail to record narrowing in the buffer to which Emacs switches
-after calling @code{save-excursion}.  Thus, when written together,
-@code{save-excursion} and @code{save-restriction} should be written
-like this:
-
-@smallexample
-@group
-(save-excursion
-  (save-restriction
-    @var{body}@dots{}))
-@end group
-@end smallexample
-
-In other circumstances, when not written together, the
-@code{save-excursion} and @code{save-restriction} special forms must
-be written in the order appropriate to the function.
-
-@need 1250
-For example,
-
-@smallexample
-@group
-  (save-restriction
-    (widen)
-    (save-excursion
-    @var{body}@dots{}))
-@end group
-@end smallexample
-
-@ignore
-Emacs 22
-/usr/local/src/emacs/lisp/simple.el
-
-(defun what-line ()
-  "Print the current buffer line number and narrowed line number of point."
-  (interactive)
-  (let ((start (point-min))
-        (n (line-number-at-pos)))
-    (if (= start 1)
-        (message "Line %d" n)
-      (save-excursion
-        (save-restriction
-          (widen)
-          (message "line %d (narrowed line %d)"
-                   (+ n (line-number-at-pos start) -1) n))))))
-
-(defun line-number-at-pos (&optional pos)
-  "Return (narrowed) buffer line number at position POS.
-If POS is nil, use current buffer location.
-Counting starts at (point-min), so the value refers
-to the contents of the accessible portion of the buffer."
-  (let ((opoint (or pos (point))) start)
-    (save-excursion
-      (goto-char (point-min))
-      (setq start (point))
-      (goto-char opoint)
-      (forward-line 0)
-      (1+ (count-lines start (point))))))
-
-(defun count-lines (start end)
-  "Return number of lines between START and END.
-This is usually the number of newlines between them,
-but can be one more if START is not equal to END
-and the greater of them is not at the start of a line."
-  (save-excursion
-    (save-restriction
-      (narrow-to-region start end)
-      (goto-char (point-min))
-      (if (eq selective-display t)
-          (save-match-data
-            (let ((done 0))
-              (while (re-search-forward "[\n\C-m]" nil t 40)
-                (setq done (+ 40 done)))
-              (while (re-search-forward "[\n\C-m]" nil t 1)
-                (setq done (+ 1 done)))
-              (goto-char (point-max))
-              (if (and (/= start end)
-                       (not (bolp)))
-                  (1+ done)
-                done)))
-        (- (buffer-size) (forward-line (buffer-size)))))))
-@end ignore
-
-@node what-line, narrow Exercise, save-restriction, Narrowing & Widening
-@comment  node-name,  next,  previous,  up
-@section @code{what-line}
-@findex what-line
-@cindex Widening, example of
-
-The @code{what-line} command tells you the number of the line in which
-the cursor is located.  The function illustrates the use of the
-@code{save-restriction} and @code{save-excursion} commands.  Here is the
-original text of the function:
-
-@smallexample
-@group
-(defun what-line ()
-  "Print the current line number (in the buffer) of point."
-  (interactive)
-  (save-restriction
-    (widen)
-    (save-excursion
-      (beginning-of-line)
-      (message "Line %d"
-               (1+ (count-lines 1 (point)))))))
-@end group
-@end smallexample
-
-(In recent versions of GNU Emacs, the @code{what-line} function has
-been expanded to tell you your line number in a narrowed buffer as
-well as your line number in a widened buffer.  The recent version is
-more complex than the version shown here.  If you feel adventurous,
-you might want to look at it after figuring out how this version
-works.  You will probably need to use @kbd{C-h f}
-(@code{describe-function}).  The newer version uses a conditional to
-determine whether the buffer has been narrowed.
-
-(Also, it uses @code{line-number-at-pos}, which among other simple
-expressions, such as @code{(goto-char (point-min))}, moves point to
-the beginning of the current line with @code{(forward-line 0)} rather
-than @code{beginning-of-line}.)
-
-The @code{what-line} function as shown here has a documentation line
-and is interactive, as you would expect.  The next two lines use the
-functions @code{save-restriction} and @code{widen}.
-
-The @code{save-restriction} special form notes whatever narrowing is in
-effect, if any, in the current buffer and restores that narrowing after
-the code in the body of the @code{save-restriction} has been evaluated.
-
-The @code{save-restriction} special form is followed by @code{widen}.
-This function undoes any narrowing the current buffer may have had
-when @code{what-line} was called.  (The narrowing that was there is
-the narrowing that @code{save-restriction} remembers.)  This widening
-makes it possible for the line counting commands to count from the
-beginning of the buffer.  Otherwise, they would have been limited to
-counting within the accessible region.  Any original narrowing is
-restored just before the completion of the function by the
-@code{save-restriction} special form.
-
-The call to @code{widen} is followed by @code{save-excursion}, which
-saves the location of the cursor (i.e., of point) and of the mark, and
-restores them after the code in the body of the @code{save-excursion}
-uses the @code{beginning-of-line} function to move point.
-
-(Note that the @code{(widen)} expression comes between the
-@code{save-restriction} and @code{save-excursion} special forms.  When
-you write the two @code{save- @dots{}} expressions in sequence, write
-@code{save-excursion} outermost.)
-
-@need 1200
-The last two lines of the @code{what-line} function are functions to
-count the number of lines in the buffer and then print the number in the
-echo area.
-
-@smallexample
-@group
-(message "Line %d"
-         (1+ (count-lines 1 (point)))))))
-@end group
-@end smallexample
-
-The @code{message} function prints a one-line message at the bottom of
-the Emacs screen.  The first argument is inside of quotation marks and
-is printed as a string of characters.  However, it may contain a
-@samp{%d} expression to print a following argument.  @samp{%d} prints
-the argument as a decimal, so the message will say something such as
-@samp{Line 243}.
-
-@need 1200
-The number that is printed in place of the @samp{%d} is computed by the
-last line of the function:
-
-@smallexample
-(1+ (count-lines 1 (point)))
-@end smallexample
-
-@ignore
-GNU Emacs 22
-
-(defun count-lines (start end)
-  "Return number of lines between START and END.
-This is usually the number of newlines between them,
-but can be one more if START is not equal to END
-and the greater of them is not at the start of a line."
-  (save-excursion
-    (save-restriction
-      (narrow-to-region start end)
-      (goto-char (point-min))
-      (if (eq selective-display t)
-          (save-match-data
-            (let ((done 0))
-              (while (re-search-forward "[\n\C-m]" nil t 40)
-                (setq done (+ 40 done)))
-              (while (re-search-forward "[\n\C-m]" nil t 1)
-                (setq done (+ 1 done)))
-              (goto-char (point-max))
-              (if (and (/= start end)
-                       (not (bolp)))
-                  (1+ done)
-                done)))
-        (- (buffer-size) (forward-line (buffer-size)))))))
-@end ignore
-
-@noindent
-What this does is count the lines from the first position of the
-buffer, indicated by the @code{1}, up to @code{(point)}, and then add
-one to that number.  (The @code{1+} function adds one to its
-argument.)  We add one to it because line 2 has only one line before
-it, and @code{count-lines} counts only the lines @emph{before} the
-current line.
-
-After @code{count-lines} has done its job, and the message has been
-printed in the echo area, the @code{save-excursion} restores point and
-mark to their original positions; and @code{save-restriction} restores
-the original narrowing, if any.
-
-@node narrow Exercise,  , what-line, Narrowing & Widening
-@section Exercise with Narrowing
-
-Write a function that will display the first 60 characters of the
-current buffer, even if you have narrowed the buffer to its latter
-half so that the first line is inaccessible.  Restore point, mark, and
-narrowing.  For this exercise, you need to use a whole potpourri of
-functions, including @code{save-restriction}, @code{widen},
-@code{goto-char}, @code{point-min}, @code{message}, and
-@code{buffer-substring}.
-
-@cindex Properties, mention of @code{buffer-substring-no-properties}
-(@code{buffer-substring} is a previously unmentioned function you will
-have to investigate yourself; or perhaps you will have to use
-@code{buffer-substring-no-properties} or
-@code{filter-buffer-substring} @dots{}, yet other functions.  Text
-properties are a feature otherwise not discussed here.  @xref{Text
-Properties, , Text Properties, elisp, The GNU Emacs Lisp Reference
-Manual}.)
-
-Additionally, do you really need @code{goto-char} or @code{point-min}?
-Or can you write the function without them?
-
-@node car cdr & cons, Cutting & Storing Text, Narrowing & Widening, Top
-@comment  node-name,  next,  previous,  up
-@chapter @code{car}, @code{cdr}, @code{cons}: Fundamental Functions
-@findex car, @r{introduced}
-@findex cdr, @r{introduced}
-
-In Lisp, @code{car}, @code{cdr}, and @code{cons} are fundamental
-functions.  The @code{cons} function is used to construct lists, and
-the @code{car} and @code{cdr} functions are used to take them apart.
-
-In the walk through of the @code{copy-region-as-kill} function, we
-will see @code{cons} as well as two variants on @code{cdr},
-namely, @code{setcdr} and @code{nthcdr}.  (@xref{copy-region-as-kill}.)
-
-@menu
-* Strange Names::               An historical aside: why the strange names?
-* car & cdr::                   Functions for extracting part of a list.
-* cons::                        Constructing a list.
-* nthcdr::                      Calling @code{cdr} repeatedly.
-* nth::
-* setcar::                      Changing the first element of a list.
-* setcdr::                      Changing the rest of a list.
-* cons Exercise::
-@end menu
-
-@node Strange Names, car & cdr, car cdr & cons, car cdr & cons
-@ifnottex
-@unnumberedsec Strange Names
-@end ifnottex
-
-The name of the @code{cons} function is not unreasonable: it is an
-abbreviation of the word `construct'.  The origins of the names for
-@code{car} and @code{cdr}, on the other hand, are esoteric: @code{car}
-is an acronym from the phrase `Contents of the Address part of the
-Register'; and @code{cdr} (pronounced `could-er') is an acronym from
-the phrase `Contents of the Decrement part of the Register'.  These
-phrases refer to specific pieces of hardware on the very early
-computer on which the original Lisp was developed.  Besides being
-obsolete, the phrases have been completely irrelevant for more than 25
-years to anyone thinking about Lisp.  Nonetheless, although a few
-brave scholars have begun to use more reasonable names for these
-functions, the old terms are still in use.  In particular, since the
-terms are used in the Emacs Lisp source code, we will use them in this
-introduction.
-
-@node car & cdr, cons, Strange Names, car cdr & cons
-@comment  node-name,  next,  previous,  up
-@section @code{car} and @code{cdr}
-
-The @sc{car} of a list is, quite simply, the first item in the list.
-Thus the @sc{car} of the list @code{(rose violet daisy buttercup)} is
-@code{rose}.
-
-@need 1200
-If you are reading this in Info in GNU Emacs, you can see this by
-evaluating the following:
-
-@smallexample
-(car '(rose violet daisy buttercup))
-@end smallexample
-
-@noindent
-After evaluating the expression, @code{rose} will appear in the echo
-area.
-
-Clearly, a more reasonable name for the @code{car} function would be
-@code{first} and this is often suggested.
-
-@code{car} does not remove the first item from the list; it only reports
-what it is.  After @code{car} has been applied to a list, the list is
-still the same as it was.  In the jargon, @code{car} is
-`non-destructive'.  This feature turns out to be important.
-
-The @sc{cdr} of a list is the rest of the list, that is, the
-@code{cdr} function returns the part of the list that follows the
-first item.  Thus, while the @sc{car} of the list @code{'(rose violet
-daisy buttercup)} is @code{rose}, the rest of the list, the value
-returned by the @code{cdr} function, is @code{(violet daisy
-buttercup)}.
-
-@need 800
-You can see this by evaluating the following in the usual way:
-
-@smallexample
-(cdr '(rose violet daisy buttercup))
-@end smallexample
-
-@noindent
-When you evaluate this, @code{(violet daisy buttercup)} will appear in
-the echo area.
-
-Like @code{car}, @code{cdr} does not remove any elements from the
-list---it just returns a report of what the second and subsequent
-elements are.
-
-Incidentally, in the example, the list of flowers is quoted.  If it were
-not, the Lisp interpreter would try to evaluate the list by calling
-@code{rose} as a function.  In this example, we do not want to do that.
-
-Clearly, a more reasonable name for @code{cdr} would be @code{rest}.
-
-(There is a lesson here: when you name new functions, consider very
-carefully what you are doing, since you may be stuck with the names
-for far longer than you expect.  The reason this document perpetuates
-these names is that the Emacs Lisp source code uses them, and if I did
-not use them, you would have a hard time reading the code; but do,
-please, try to avoid using these terms yourself.  The people who come
-after you will be grateful to you.)
-
-When @code{car} and @code{cdr} are applied to a list made up of symbols,
-such as the list @code{(pine fir oak maple)}, the element of the list
-returned by the function @code{car} is the symbol @code{pine} without
-any parentheses around it.  @code{pine} is the first element in the
-list.  However, the @sc{cdr} of the list is a list itself, @code{(fir
-oak maple)}, as you can see by evaluating the following expressions in
-the usual way:
-
-@smallexample
-@group
-(car '(pine fir oak maple))
-
-(cdr '(pine fir oak maple))
-@end group
-@end smallexample
-
-On the other hand, in a list of lists, the first element is itself a
-list.  @code{car} returns this first element as a list.  For example,
-the following list contains three sub-lists, a list of carnivores, a
-list of herbivores and a list of sea mammals:
-
-@smallexample
-@group
-(car '((lion tiger cheetah)
-       (gazelle antelope zebra)
-       (whale dolphin seal)))
-@end group
-@end smallexample
-
-@noindent
-In this example, the first element or @sc{car} of the list is the list of
-carnivores, @code{(lion tiger cheetah)}, and the rest of the list is
-@code{((gazelle antelope zebra) (whale dolphin seal))}.
-
-@smallexample
-@group
-(cdr '((lion tiger cheetah)
-       (gazelle antelope zebra)
-       (whale dolphin seal)))
-@end group
-@end smallexample
-
-It is worth saying again that @code{car} and @code{cdr} are
-non-destructive---that is, they do not modify or change lists to which
-they are applied.  This is very important for how they are used.
-
-Also, in the first chapter, in the discussion about atoms, I said that
-in Lisp, ``certain kinds of atom, such as an array, can be separated
-into parts; but the mechanism for doing this is different from the
-mechanism for splitting a list.  As far as Lisp is concerned, the
-atoms of a list are unsplittable.''  (@xref{Lisp Atoms}.)  The
-@code{car} and @code{cdr} functions are used for splitting lists and
-are considered fundamental to Lisp.  Since they cannot split or gain
-access to the parts of an array, an array is considered an atom.
-Conversely, the other fundamental function, @code{cons}, can put
-together or construct a list, but not an array.  (Arrays are handled
-by array-specific functions.  @xref{Arrays, , Arrays, elisp, The GNU
-Emacs Lisp Reference Manual}.)
-
-@node cons, nthcdr, car & cdr, car cdr & cons
-@comment  node-name,  next,  previous,  up
-@section @code{cons}
-@findex cons, @r{introduced}
-
-The @code{cons} function constructs lists; it is the inverse of
-@code{car} and @code{cdr}.  For example, @code{cons} can be used to make
-a four element list from the three element list, @code{(fir oak maple)}:
-
-@smallexample
-(cons 'pine '(fir oak maple))
-@end smallexample
-
-@need 800
-@noindent
-After evaluating this list, you will see
-
-@smallexample
-(pine fir oak maple)
-@end smallexample
-
-@noindent
-appear in the echo area.  @code{cons} causes the creation of a new
-list in which the element is followed by the elements of the original
-list.
-
-We often say that `@code{cons} puts a new element at the beginning of
-a list; it attaches or pushes elements onto the list', but this
-phrasing can be misleading, since @code{cons} does not change an
-existing list, but creates a new one.
-
-Like @code{car} and @code{cdr}, @code{cons} is non-destructive.
-
-@menu
-* Build a list::
-* length::                      How to find the length of a list.
-@end menu
-
-@node Build a list, length, cons, cons
-@ifnottex
-@unnumberedsubsec Build a list
-@end ifnottex
-
-@code{cons} must have a list to attach to.@footnote{Actually, you can
-@code{cons} an element to an atom to produce a dotted pair.  Dotted
-pairs are not discussed here; see @ref{Dotted Pair Notation, , Dotted
-Pair Notation, elisp, The GNU Emacs Lisp Reference Manual}.}  You
-cannot start from absolutely nothing.  If you are building a list, you
-need to provide at least an empty list at the beginning.  Here is a
-series of @code{cons} expressions that build up a list of flowers.  If
-you are reading this in Info in GNU Emacs, you can evaluate each of
-the expressions in the usual way; the value is printed in this text
-after @samp{@result{}}, which you may read as `evaluates to'.
-
-@smallexample
-@group
-(cons 'buttercup ())
-     @result{} (buttercup)
-@end group
-
-@group
-(cons 'daisy '(buttercup))
-     @result{} (daisy buttercup)
-@end group
-
-@group
-(cons 'violet '(daisy buttercup))
-     @result{} (violet daisy buttercup)
-@end group
-
-@group
-(cons 'rose '(violet daisy buttercup))
-     @result{} (rose violet daisy buttercup)
-@end group
-@end smallexample
-
-@noindent
-In the first example, the empty list is shown as @code{()} and a list
-made up of @code{buttercup} followed by the empty list is constructed.
-As you can see, the empty list is not shown in the list that was
-constructed.  All that you see is @code{(buttercup)}.  The empty list is
-not counted as an element of a list because there is nothing in an empty
-list.  Generally speaking, an empty list is invisible.
-
-The second example, @code{(cons 'daisy '(buttercup))} constructs a new,
-two element list by putting @code{daisy} in front of @code{buttercup};
-and the third example constructs a three element list by putting
-@code{violet} in front of @code{daisy} and @code{buttercup}.
-
-@node length,  , Build a list, cons
-@comment  node-name,  next,  previous,  up
-@subsection Find the Length of a List: @code{length}
-@findex length
-
-You can find out how many elements there are in a list by using the Lisp
-function @code{length}, as in the following examples:
-
-@smallexample
-@group
-(length '(buttercup))
-     @result{} 1
-@end group
-
-@group
-(length '(daisy buttercup))
-     @result{} 2
-@end group
-
-@group
-(length (cons 'violet '(daisy buttercup)))
-     @result{} 3
-@end group
-@end smallexample
-
-@noindent
-In the third example, the @code{cons} function is used to construct a
-three element list which is then passed to the @code{length} function as
-its argument.
-
-@need 1200
-We can also use @code{length} to count the number of elements in an
-empty list:
-
-@smallexample
-@group
-(length ())
-     @result{} 0
-@end group
-@end smallexample
-
-@noindent
-As you would expect, the number of elements in an empty list is zero.
-
-An interesting experiment is to find out what happens if you try to find
-the length of no list at all; that is, if you try to call @code{length}
-without giving it an argument, not even an empty list:
-
-@smallexample
-(length )
-@end smallexample
-
-@need 800
-@noindent
-What you see, if you evaluate this, is the error message
-
-@smallexample
-Lisp error: (wrong-number-of-arguments length 0)
-@end smallexample
-
-@noindent
-This means that the function receives the wrong number of
-arguments, zero, when it expects some other number of arguments.  In
-this case, one argument is expected, the argument being a list whose
-length the function is measuring.  (Note that @emph{one} list is
-@emph{one} argument, even if the list has many elements inside it.)
-
-The part of the error message that says @samp{length} is the name of
-the function.
-
-@ignore
-@code{length} is still a subroutine, but you need C-h f to discover that.
-
-In an earlier version:
-    This is written with a special notation, @samp{#<subr},
-    that indicates that the function @code{length} is one of the primitive
-    functions written in C rather than in Emacs Lisp.  (@samp{subr} is an
-    abbreviation for `subroutine'.)  @xref{What Is a Function, , What Is a
-    Function?, elisp , The GNU Emacs Lisp Reference Manual}, for more
-    about subroutines.
-@end ignore
-
-@node nthcdr, nth, cons, car cdr & cons
-@comment  node-name,  next,  previous,  up
-@section @code{nthcdr}
-@findex nthcdr
-
-The @code{nthcdr} function is associated with the @code{cdr} function.
-What it does is take the @sc{cdr} of a list repeatedly.
-
-If you take the @sc{cdr} of the list @code{(pine fir
-oak maple)}, you will be returned the list @code{(fir oak maple)}.  If you
-repeat this on what was returned, you will be returned the list
-@code{(oak maple)}.  (Of course, repeated @sc{cdr}ing on the original
-list will just give you the original @sc{cdr} since the function does
-not change the list.  You need to evaluate the @sc{cdr} of the
-@sc{cdr} and so on.)  If you continue this, eventually you will be
-returned an empty list, which in this case, instead of being shown as
-@code{()} is shown as @code{nil}.
-
-@need 1200
-For review, here is a series of repeated @sc{cdr}s, the text following
-the @samp{@result{}} shows what is returned.
-
-@smallexample
-@group
-(cdr '(pine fir oak maple))
-     @result{}(fir oak maple)
-@end group
-
-@group
-(cdr '(fir oak maple))
-     @result{} (oak maple)
-@end group
-
-@group
-(cdr '(oak maple))
-     @result{}(maple)
-@end group
-
-@group
-(cdr '(maple))
-     @result{} nil
-@end group
-
-@group
-(cdr 'nil)
-     @result{} nil
-@end group
-
-@group
-(cdr ())
-     @result{} nil
-@end group
-@end smallexample
-
-@need 1200
-You can also do several @sc{cdr}s without printing the values in
-between, like this:
-
-@smallexample
-@group
-(cdr (cdr '(pine fir oak maple)))
-     @result{} (oak maple)
-@end group
-@end smallexample
-
-@noindent
-In this example, the Lisp interpreter evaluates the innermost list first.
-The innermost list is quoted, so it just passes the list as it is to the
-innermost @code{cdr}.  This @code{cdr} passes a list made up of the
-second and subsequent elements of the list to the outermost @code{cdr},
-which produces a list composed of the third and subsequent elements of
-the original list.  In this example, the @code{cdr} function is repeated
-and returns a list that consists of the original list without its
-first two elements.
-
-The @code{nthcdr} function does the same as repeating the call to
-@code{cdr}.  In the following example, the argument 2 is passed to the
-function @code{nthcdr}, along with the list, and the value returned is
-the list without its first two items, which is exactly the same
-as repeating @code{cdr} twice on the list:
-
-@smallexample
-@group
-(nthcdr 2 '(pine fir oak maple))
-     @result{} (oak maple)
-@end group
-@end smallexample
-
-@need 1200
-Using the original four element list, we can see what happens when
-various numeric arguments are passed to @code{nthcdr}, including 0, 1,
-and 5:
-
-@smallexample
-@group
-;; @r{Leave the list as it was.}
-(nthcdr 0 '(pine fir oak maple))
-     @result{} (pine fir oak maple)
-@end group
-
-@group
-;; @r{Return a copy without the first element.}
-(nthcdr 1 '(pine fir oak maple))
-     @result{} (fir oak maple)
-@end group
-
-@group
-;; @r{Return a copy of the list without three elements.}
-(nthcdr 3 '(pine fir oak maple))
-     @result{} (maple)
-@end group
-
-@group
-;; @r{Return a copy lacking all four elements.}
-(nthcdr 4 '(pine fir oak maple))
-     @result{} nil
-@end group
-
-@group
-;; @r{Return a copy lacking all elements.}
-(nthcdr 5 '(pine fir oak maple))
-     @result{} nil
-@end group
-@end smallexample
-
-@node nth, setcar, nthcdr, car cdr & cons
-@comment  node-name,  next,  previous,  up
-@section @code{nth}
-@findex nth
-
-The @code{nthcdr} function takes the @sc{cdr} of a list repeatedly.
-The @code{nth} function takes the @sc{car} of the result returned by
-@code{nthcdr}.  It returns the Nth element of the list.
-
-@need 1500
-Thus, if it were not defined in C for speed, the definition of
-@code{nth} would be:
-
-@smallexample
-@group
-(defun nth (n list)
-  "Returns the Nth element of LIST.
-N counts from zero.  If LIST is not that long, nil is returned."
-  (car (nthcdr n list)))
-@end group
-@end smallexample
-
-@noindent
-(Originally, @code{nth} was defined in Emacs Lisp in @file{subr.el},
-but its definition was redone in C in the 1980s.)
-
-The @code{nth} function returns a single element of a list.
-This can be very convenient.
-
-Note that the elements are numbered from zero, not one.  That is to
-say, the first element of a list, its @sc{car} is the zeroth element.
-This is called `zero-based' counting and often bothers people who
-are accustomed to the first element in a list being number one, which
-is `one-based'.
-
-@need 1250
-For example:
-
-@smallexample
-@group
-(nth 0 '("one" "two" "three"))
-    @result{} "one"
-
-(nth 1 '("one" "two" "three"))
-    @result{} "two"
-@end group
-@end smallexample
-
-It is worth mentioning that @code{nth}, like @code{nthcdr} and
-@code{cdr}, does not change the original list---the function is
-non-destructive.  This is in sharp contrast to the @code{setcar} and
-@code{setcdr} functions.
-
-@node setcar, setcdr, nth, car cdr & cons
-@comment  node-name,  next,  previous,  up
-@section @code{setcar}
-@findex setcar
-
-As you might guess from their names, the @code{setcar} and @code{setcdr}
-functions set the @sc{car} or the @sc{cdr} of a list to a new value.
-They actually change the original list, unlike @code{car} and @code{cdr}
-which leave the original list as it was.  One way to find out how this
-works is to experiment.  We will start with the @code{setcar} function.
-
-@need 1200
-First, we can make a list and then set the value of a variable to the
-list, using the @code{setq} function.  Here is a list of animals:
-
-@smallexample
-(setq animals '(antelope giraffe lion tiger))
-@end smallexample
-
-@noindent
-If you are reading this in Info inside of GNU Emacs, you can evaluate
-this expression in the usual fashion, by positioning the cursor after
-the expression and typing @kbd{C-x C-e}.  (I'm doing this right here
-as I write this.  This is one of the advantages of having the
-interpreter built into the computing environment.  Incidentally, when
-there is nothing on the line after the final parentheses, such as a
-comment, point can be on the next line.  Thus, if your cursor is in
-the first column of the next line, you do not need to move it.
-Indeed, Emacs permits any amount of white space after the final
-parenthesis.)
-
-@need 1200
-When we evaluate the variable @code{animals}, we see that it is bound to
-the list @code{(antelope giraffe lion tiger)}:
-
-@smallexample
-@group
-animals
-     @result{} (antelope giraffe lion tiger)
-@end group
-@end smallexample
-
-@noindent
-Put another way, the variable @code{animals} points to the list
-@code{(antelope giraffe lion tiger)}.
-
-Next, evaluate the function @code{setcar} while passing it two
-arguments, the variable @code{animals} and the quoted symbol
-@code{hippopotamus}; this is done by writing the three element list
-@code{(setcar animals 'hippopotamus)} and then evaluating it in the
-usual fashion:
-
-@smallexample
-(setcar animals 'hippopotamus)
-@end smallexample
-
-@need 1200
-@noindent
-After evaluating this expression, evaluate the variable @code{animals}
-again.  You will see that the list of animals has changed:
-
-@smallexample
-@group
-animals
-     @result{} (hippopotamus giraffe lion tiger)
-@end group
-@end smallexample
-
-@noindent
-The first element on the list, @code{antelope} is replaced by
-@code{hippopotamus}.
-
-So we can see that @code{setcar} did not add a new element to the list
-as @code{cons} would have; it replaced @code{antelope} with
-@code{hippopotamus}; it @emph{changed} the list.
-
-@node setcdr, cons Exercise, setcar, car cdr & cons
-@comment  node-name,  next,  previous,  up
-@section @code{setcdr}
-@findex setcdr
-
-The @code{setcdr} function is similar to the @code{setcar} function,
-except that the function replaces the second and subsequent elements of
-a list rather than the first element.
-
-(To see how to change the last element of a list, look ahead to
-@ref{kill-new function, , The @code{kill-new} function}, which uses
-the @code{nthcdr} and @code{setcdr} functions.)
-
-@need 1200
-To see how this works, set the value of the variable to a list of
-domesticated animals by evaluating the following expression:
-
-@smallexample
-(setq domesticated-animals '(horse cow sheep goat))
-@end smallexample
-
-@need 1200
-@noindent
-If you now evaluate the list, you will be returned the list
-@code{(horse cow sheep goat)}:
-
-@smallexample
-@group
-domesticated-animals
-     @result{} (horse cow sheep goat)
-@end group
-@end smallexample
-
-@need 1200
-Next, evaluate @code{setcdr} with two arguments, the name of the
-variable which has a list as its value, and the list to which the
-@sc{cdr} of the first list will be set;
-
-@smallexample
-(setcdr domesticated-animals '(cat dog))
-@end smallexample
-
-@noindent
-If you evaluate this expression, the list @code{(cat dog)} will appear
-in the echo area.  This is the value returned by the function.  The
-result we are interested in is the ``side effect'', which we can see by
-evaluating the variable @code{domesticated-animals}:
-
-@smallexample
-@group
-domesticated-animals
-     @result{} (horse cat dog)
-@end group
-@end smallexample
-
-@noindent
-Indeed, the list is changed from @code{(horse cow sheep goat)} to
-@code{(horse cat dog)}.  The @sc{cdr} of the list is changed from
-@code{(cow sheep goat)} to @code{(cat dog)}.
-
-@node cons Exercise,  , setcdr, car cdr & cons
-@section Exercise
-
-Construct a list of four birds by evaluating several expressions with
-@code{cons}.  Find out what happens when you @code{cons} a list onto
-itself.  Replace the first element of the list of four birds with a
-fish.  Replace the rest of that list with a list of other fish.
-
-@node Cutting & Storing Text, List Implementation, car cdr & cons, Top
-@comment  node-name,  next,  previous,  up
-@chapter Cutting and Storing Text
-@cindex Cutting and storing text
-@cindex Storing and cutting text
-@cindex Killing text
-@cindex Clipping text
-@cindex Erasing text
-@cindex Deleting text
-
-Whenever you cut or clip text out of a buffer with a `kill' command in
-GNU Emacs, it is stored in a list and you can bring it back with a
-`yank' command.
-
-(The use of the word `kill' in Emacs for processes which specifically
-@emph{do not} destroy the values of the entities is an unfortunate
-historical accident.  A much more appropriate word would be `clip' since
-that is what the kill commands do; they clip text out of a buffer and
-put it into storage from which it can be brought back.  I have often
-been tempted to replace globally all occurrences of `kill' in the Emacs
-sources with `clip' and all occurrences of `killed' with `clipped'.)
-
-@menu
-* Storing Text::                Text is stored in a list.
-* zap-to-char::                 Cutting out text up to a character.
-* kill-region::                 Cutting text out of a region.
-* copy-region-as-kill::         A definition for copying text.
-* Digression into C::           Minor note on C programming language macros.
-* defvar::                      How to give a variable an initial value.
-* cons & search-fwd Review::
-* search Exercises::
-@end menu
-
-@node Storing Text, zap-to-char, Cutting & Storing Text, Cutting & Storing Text
-@ifnottex
-@unnumberedsec Storing Text in a List
-@end ifnottex
-
-When text is cut out of a buffer, it is stored on a list.  Successive
-pieces of text are stored on the list successively, so the list might
-look like this:
-
-@smallexample
-("a piece of text" "previous piece")
-@end smallexample
-
-@need 1200
-@noindent
-The function @code{cons} can be used to create a new list from a piece
-of text (an `atom', to use the jargon) and an existing list, like
-this:
-
-@smallexample
-@group
-(cons "another piece"
-      '("a piece of text" "previous piece"))
-@end group
-@end smallexample
-
-@need 1200
-@noindent
-If you evaluate this expression, a list of three elements will appear in
-the echo area:
-
-@smallexample
-("another piece" "a piece of text" "previous piece")
-@end smallexample
-
-With the @code{car} and @code{nthcdr} functions, you can retrieve
-whichever piece of text you want.  For example, in the following code,
-@code{nthcdr 1 @dots{}} returns the list with the first item removed;
-and the @code{car} returns the first element of that remainder---the
-second element of the original list:
-
-@smallexample
-@group
-(car (nthcdr 1 '("another piece"
-                 "a piece of text"
-                 "previous piece")))
-     @result{} "a piece of text"
-@end group
-@end smallexample
-
-The actual functions in Emacs are more complex than this, of course.
-The code for cutting and retrieving text has to be written so that
-Emacs can figure out which element in the list you want---the first,
-second, third, or whatever.  In addition, when you get to the end of
-the list, Emacs should give you the first element of the list, rather
-than nothing at all.
-
-The list that holds the pieces of text is called the @dfn{kill ring}.
-This chapter leads up to a description of the kill ring and how it is
-used by first tracing how the @code{zap-to-char} function works.  This
-function uses (or `calls') a function that invokes a function that
-manipulates the kill ring.  Thus, before reaching the mountains, we
-climb the foothills.
-
-A subsequent chapter describes how text that is cut from the buffer is
-retrieved.  @xref{Yanking, , Yanking Text Back}.
-
-@node zap-to-char, kill-region, Storing Text, Cutting & Storing Text
-@comment  node-name,  next,  previous,  up
-@section @code{zap-to-char}
-@findex zap-to-char
-
-The @code{zap-to-char} function changed little between GNU Emacs
-version 19 and GNU Emacs version 22.  However, @code{zap-to-char}
-calls another function, @code{kill-region}, which enjoyed a major
-rewrite.
-
-The @code{kill-region} function in Emacs 19 is complex, but does not
-use code that is important at this time.  We will skip it.
-
-The @code{kill-region} function in Emacs 22 is easier to read than the
-same function in Emacs 19 and introduces a very important concept,
-that of error handling.  We will walk through the function.
-
-But first, let us look at the interactive @code{zap-to-char} function.
-
-@menu
-* Complete zap-to-char::        The complete implementation.
-* zap-to-char interactive::     A three part interactive expression.
-* zap-to-char body::            A short overview.
-* search-forward::              How to search for a string.
-* progn::                       The @code{progn} special form.
-* Summing up zap-to-char::      Using @code{point} and @code{search-forward}.
-@end menu
-
-@node Complete zap-to-char, zap-to-char interactive, zap-to-char, zap-to-char
-@ifnottex
-@unnumberedsubsec The Complete @code{zap-to-char} Implementation
-@end ifnottex
-
-The @code{zap-to-char} function removes the text in the region between
-the location of the cursor (i.e., of point) up to and including the
-next occurrence of a specified character.  The text that
-@code{zap-to-char} removes is put in the kill ring; and it can be
-retrieved from the kill ring by typing @kbd{C-y} (@code{yank}).  If
-the command is given an argument, it removes text through that number
-of occurrences.  Thus, if the cursor were at the beginning of this
-sentence and the character were @samp{s}, @samp{Thus} would be
-removed.  If the argument were two, @samp{Thus, if the curs} would be
-removed, up to and including the @samp{s} in @samp{cursor}.
-
-If the specified character is not found, @code{zap-to-char} will say
-``Search failed'', tell you the character you typed, and not remove
-any text.
-
-In order to determine how much text to remove, @code{zap-to-char} uses
-a search function.  Searches are used extensively in code that
-manipulates text, and we will focus attention on them as well as on the
-deletion command.
-
-@ignore
-@c GNU Emacs version 19
-(defun zap-to-char (arg char)  ; version 19 implementation
-  "Kill up to and including ARG'th occurrence of CHAR.
-Goes backward if ARG is negative; error if CHAR not found."
-  (interactive "*p\ncZap to char: ")
-  (kill-region (point)
-               (progn
-                 (search-forward
-                  (char-to-string char) nil nil arg)
-                 (point))))
-@end ignore
-
-@need 1250
-Here is the complete text of the version 22 implementation of the function:
-
-@c GNU Emacs 22
-@smallexample
-@group
-(defun zap-to-char (arg char)
-  "Kill up to and including ARG'th occurrence of CHAR.
-Case is ignored if `case-fold-search' is non-nil in the current buffer.
-Goes backward if ARG is negative; error if CHAR not found."
-  (interactive "p\ncZap to char: ")
-  (if (char-table-p translation-table-for-input)
-      (setq char (or (aref translation-table-for-input char) char)))
-  (kill-region (point) (progn
-                         (search-forward (char-to-string char) nil nil arg)
-                         (point))))
-@end group
-@end smallexample
-
-The documentation is thorough.  You do need to know the jargon meaning
-of the word `kill'.
-
-@node zap-to-char interactive, zap-to-char body, Complete zap-to-char, zap-to-char
-@comment  node-name,  next,  previous,  up
-@subsection The @code{interactive} Expression
-
-@need 800
-The interactive expression in the @code{zap-to-char} command looks like
-this:
-
-@smallexample
-(interactive "p\ncZap to char: ")
-@end smallexample
-
-The part within quotation marks, @code{"p\ncZap to char:@: "}, specifies
-two different things.  First, and most simply, is the @samp{p}.
-This part is separated from the next part by a newline, @samp{\n}.
-The @samp{p} means that the first argument to the function will be
-passed the value of a `processed prefix'.  The prefix argument is
-passed by typing @kbd{C-u} and a number, or @kbd{M-} and a number.  If
-the function is called interactively without a prefix, 1 is passed to
-this argument.
-
-The second part of @code{"p\ncZap to char:@: "} is
-@samp{cZap to char:@:  }.  In this part, the lower case @samp{c}
-indicates that @code{interactive} expects a prompt and that the
-argument will be a character.  The prompt follows the @samp{c} and is
-the string @samp{Zap to char:@: } (with a space after the colon to
-make it look good).
-
-What all this does is prepare the arguments to @code{zap-to-char} so they
-are of the right type, and give the user a prompt.
-
-In a read-only buffer, the @code{zap-to-char} function copies the text
-to the kill ring, but does not remove it.  The echo area displays a
-message saying that the buffer is read-only.  Also, the terminal may
-beep or blink at you.
-
-@node zap-to-char body, search-forward, zap-to-char interactive, zap-to-char
-@comment  node-name,  next,  previous,  up
-@subsection The Body of @code{zap-to-char}
-
-The body of the @code{zap-to-char} function contains the code that
-kills (that is, removes) the text in the region from the current
-position of the cursor up to and including the specified character.
-
-The first part of the code looks like this:
-
-@smallexample
-(if (char-table-p translation-table-for-input)
-    (setq char (or (aref translation-table-for-input char) char)))
-(kill-region (point) (progn
-                       (search-forward (char-to-string char) nil nil arg)
-                       (point)))
-@end smallexample
-
-@noindent
-@code{char-table-p} is an hitherto unseen function.  It determines
-whether its argument is a character table.  When it is, it sets the
-character passed to @code{zap-to-char} to one of them, if that
-character exists, or to the character itself.  (This becomes important
-for certain characters in non-European languages.  The @code{aref}
-function extracts an element from an array.  It is an array-specific
-function that is not described in this document.  @xref{Arrays, ,
-Arrays, elisp, The GNU Emacs Lisp Reference Manual}.)
-
-@noindent
-@code{(point)} is the current position of the cursor.
-
-The next part of the code is an expression using @code{progn}.  The body
-of the @code{progn} consists of calls to @code{search-forward} and
-@code{point}.
-
-It is easier to understand how @code{progn} works after learning about
-@code{search-forward}, so we will look at @code{search-forward} and
-then at @code{progn}.
-
-@node search-forward, progn, zap-to-char body, zap-to-char
-@comment  node-name,  next,  previous,  up
-@subsection The @code{search-forward} Function
-@findex search-forward
-
-The @code{search-forward} function is used to locate the
-zapped-for-character in @code{zap-to-char}.  If the search is
-successful, @code{search-forward} leaves point immediately after the
-last character in the target string.  (In @code{zap-to-char}, the
-target string is just one character long.  @code{zap-to-char} uses the
-function @code{char-to-string} to ensure that the computer treats that
-character as a string.)  If the search is backwards,
-@code{search-forward} leaves point just before the first character in
-the target.  Also, @code{search-forward} returns @code{t} for true.
-(Moving point is therefore a `side effect'.)
-
-@need 1250
-In @code{zap-to-char}, the @code{search-forward} function looks like this:
-
-@smallexample
-(search-forward (char-to-string char) nil nil arg)
-@end smallexample
-
-The @code{search-forward} function takes four arguments:
-
-@enumerate
-@item
-The first argument is the target, what is searched for.  This must be a
-string, such as @samp{"z"}.
-
-As it happens, the argument passed to @code{zap-to-char} is a single
-character.  Because of the way computers are built, the Lisp
-interpreter may treat a single character as being different from a
-string of characters.  Inside the computer, a single character has a
-different electronic format than a string of one character.  (A single
-character can often be recorded in the computer using exactly one
-byte; but a string may be longer, and the computer needs to be ready
-for this.)  Since the @code{search-forward} function searches for a
-string, the character that the @code{zap-to-char} function receives as
-its argument must be converted inside the computer from one format to
-the other; otherwise the @code{search-forward} function will fail.
-The @code{char-to-string} function is used to make this conversion.
-
-@item
-The second argument bounds the search; it is specified as a position in
-the buffer.  In this case, the search can go to the end of the buffer,
-so no bound is set and the second argument is @code{nil}.
-
-@item
-The third argument tells the function what it should do if the search
-fails---it can signal an error (and print a message) or it can return
-@code{nil}.  A @code{nil} as the third argument causes the function to
-signal an error when the search fails.
-
-@item
-The fourth argument to @code{search-forward} is the repeat count---how
-many occurrences of the string to look for.  This argument is optional
-and if the function is called without a repeat count, this argument is
-passed the value 1.  If this argument is negative, the search goes
-backwards.
-@end enumerate
-
-@need 800
-In template form, a @code{search-forward} expression looks like this:
-
-@smallexample
-@group
-(search-forward "@var{target-string}"
-                @var{limit-of-search}
-                @var{what-to-do-if-search-fails}
-                @var{repeat-count})
-@end group
-@end smallexample
-
-We will look at @code{progn} next.
-
-@node progn, Summing up zap-to-char, search-forward, zap-to-char
-@comment  node-name,  next,  previous,  up
-@subsection The @code{progn} Special Form
-@findex progn
-
-@code{progn} is a special form that causes each of its arguments to be
-evaluated in sequence and then returns the value of the last one.  The
-preceding expressions are evaluated only for the side effects they
-perform.  The values produced by them are discarded.
-
-@need 800
-The template for a @code{progn} expression is very simple:
-
-@smallexample
-@group
-(progn
-  @var{body}@dots{})
-@end group
-@end smallexample
-
-In @code{zap-to-char}, the @code{progn} expression has to do two things:
-put point in exactly the right position; and return the location of
-point so that @code{kill-region} will know how far to kill to.
-
-The first argument to the @code{progn} is @code{search-forward}.  When
-@code{search-forward} finds the string, the function leaves point
-immediately after the last character in the target string.  (In this
-case the target string is just one character long.)  If the search is
-backwards, @code{search-forward} leaves point just before the first
-character in the target.  The movement of point is a side effect.
-
-The second and last argument to @code{progn} is the expression
-@code{(point)}.  This expression returns the value of point, which in
-this case will be the location to which it has been moved by
-@code{search-forward}.  (In the source, a line that tells the function
-to go to the previous character, if it is going forward, was commented
-out in 1999; I don't remember whether that feature or mis-feature was
-ever a part of the distributed source.)  The value of @code{point} is
-returned by the @code{progn} expression and is passed to
-@code{kill-region} as @code{kill-region}'s second argument.
-
-@node Summing up zap-to-char,  , progn, zap-to-char
-@comment  node-name,  next,  previous,  up
-@subsection Summing up @code{zap-to-char}
-
-Now that we have seen how @code{search-forward} and @code{progn} work,
-we can see how the @code{zap-to-char} function works as a whole.
-
-The first argument to @code{kill-region} is the position of the cursor
-when the @code{zap-to-char} command is given---the value of point at
-that time.  Within the @code{progn}, the search function then moves
-point to just after the zapped-to-character and @code{point} returns the
-value of this location.  The @code{kill-region} function puts together
-these two values of point, the first one as the beginning of the region
-and the second one as the end of the region, and removes the region.
-
-The @code{progn} special form is necessary because the
-@code{kill-region} command takes two arguments; and it would fail if
-@code{search-forward} and @code{point} expressions were written in
-sequence as two additional arguments.  The @code{progn} expression is
-a single argument to @code{kill-region} and returns the one value that
-@code{kill-region} needs for its second argument.
-
-@node kill-region, copy-region-as-kill, zap-to-char, Cutting & Storing Text
-@comment  node-name,  next,  previous,  up
-@section @code{kill-region}
-@findex kill-region
-
-The @code{zap-to-char} function uses the @code{kill-region} function.
-This function clips text from a region and copies that text to
-the kill ring, from which it may be retrieved.
-
-@ignore
-GNU Emacs 22:
-
-(defun kill-region (beg end &optional yank-handler)
-  "Kill (\"cut\") text between point and mark.
-This deletes the text from the buffer and saves it in the kill ring.
-The command \\[yank] can retrieve it from there.
-\(If you want to kill and then yank immediately, use \\[kill-ring-save].)
-
-If you want to append the killed region to the last killed text,
-use \\[append-next-kill] before \\[kill-region].
-
-If the buffer is read-only, Emacs will beep and refrain from deleting
-the text, but put the text in the kill ring anyway.  This means that
-you can use the killing commands to copy text from a read-only buffer.
-
-This is the primitive for programs to kill text (as opposed to deleting it).
-Supply two arguments, character positions indicating the stretch of text
- to be killed.
-Any command that calls this function is a \"kill command\".
-If the previous command was also a kill command,
-the text killed this time appends to the text killed last time
-to make one entry in the kill ring.
-
-In Lisp code, optional third arg YANK-HANDLER, if non-nil,
-specifies the yank-handler text property to be set on the killed
-text.  See `insert-for-yank'."
-  ;; Pass point first, then mark, because the order matters
-  ;; when calling kill-append.
-  (interactive (list (point) (mark)))
-  (unless (and beg end)
-    (error "The mark is not set now, so there is no region"))
-  (condition-case nil
-      (let ((string (filter-buffer-substring beg end t)))
-        (when string                        ;STRING is nil if BEG = END
-          ;; Add that string to the kill ring, one way or another.
-          (if (eq last-command 'kill-region)
-              (kill-append string (< end beg) yank-handler)
-            (kill-new string nil yank-handler)))
-        (when (or string (eq last-command 'kill-region))
-          (setq this-command 'kill-region))
-        nil)
-    ((buffer-read-only text-read-only)
-     ;; The code above failed because the buffer, or some of the characters
-     ;; in the region, are read-only.
-     ;; We should beep, in case the user just isn't aware of this.
-     ;; However, there's no harm in putting
-     ;; the region's text in the kill ring, anyway.
-     (copy-region-as-kill beg end)
-     ;; Set this-command now, so it will be set even if we get an error.
-     (setq this-command 'kill-region)
-     ;; This should barf, if appropriate, and give us the correct error.
-     (if kill-read-only-ok
-         (progn (message "Read only text copied to kill ring") nil)
-       ;; Signal an error if the buffer is read-only.
-       (barf-if-buffer-read-only)
-       ;; If the buffer isn't read-only, the text is.
-       (signal 'text-read-only (list (current-buffer)))))))
-@end ignore
-
-The Emacs 22 version of that function uses @code{condition-case} and
-@code{copy-region-as-kill}, both of which we will explain.
-@code{condition-case} is an important special form.
-
-In essence, the @code{kill-region} function calls
-@code{condition-case}, which takes three arguments.  In this function,
-the first argument does nothing.  The second argument contains the
-code that does the work when all goes well.  The third argument
-contains the code that is called in the event of an error.
-
-@menu
-* Complete kill-region::        The function definition.
-* condition-case::              Dealing with a problem.
-* Lisp macro::
-@end menu
-
-@node Complete kill-region, condition-case, kill-region, kill-region
-@ifnottex
-@unnumberedsubsec The Complete @code{kill-region} Definition
-@end ifnottex
-
-@need 1200
-We will go through the @code{condition-case} code in a moment.  First,
-let us look at the definition of @code{kill-region}, with comments
-added:
-
-@c GNU Emacs 22:
-@smallexample
-@group
-(defun kill-region (beg end)
-  "Kill (\"cut\") text between point and mark.
-This deletes the text from the buffer and saves it in the kill ring.
-The command \\[yank] can retrieve it from there. @dots{} "
-@end group
-
-@group
-  ;; @bullet{} Since order matters, pass point first.
-  (interactive (list (point) (mark)))
-  ;; @bullet{} And tell us if we cannot cut the text.
-  ;; `unless' is an `if' without a then-part.
-  (unless (and beg end)
-    (error "The mark is not set now, so there is no region"))
-@end group
-
-@group
-  ;; @bullet{} `condition-case' takes three arguments.
-  ;;    If the first argument is nil, as it is here,
-  ;;    information about the error signal is not
-  ;;    stored for use by another function.
-  (condition-case nil
-@end group
-
-@group
-      ;; @bullet{} The second argument to `condition-case' tells the
-      ;;    Lisp interpreter what to do when all goes well.
-@end group
-
-@group
-      ;;    It starts with a `let' function that extracts the string
-      ;;    and tests whether it exists.  If so (that is what the
-      ;;    `when' checks), it calls an `if' function that determines
-      ;;    whether the previous command was another call to
-      ;;    `kill-region'; if it was, then the new text is appended to
-      ;;    the previous text; if not, then a different function,
-      ;;    `kill-new', is called.
-@end group
-
-@group
-      ;;    The `kill-append' function concatenates the new string and
-      ;;    the old.  The `kill-new' function inserts text into a new
-      ;;    item in the kill ring.
-@end group
-
-@group
-      ;;    `when' is an `if' without an else-part.  The second `when'
-      ;;    again checks whether the current string exists; in
-      ;;    addition, it checks whether the previous command was
-      ;;    another call to `kill-region'.  If one or the other
-      ;;    condition is true, then it sets the current command to
-      ;;    be `kill-region'.
-@end group
-@group
-      (let ((string (filter-buffer-substring beg end t)))
-        (when string                    ;STRING is nil if BEG = END
-          ;; Add that string to the kill ring, one way or another.
-          (if (eq last-command 'kill-region)
-@end group
-@group
-              ;;    @minus{} `yank-handler' is an optional argument to
-              ;;    `kill-region' that tells the `kill-append' and
-              ;;    `kill-new' functions how deal with properties
-              ;;    added to the text, such as `bold' or `italics'.
-              (kill-append string (< end beg) yank-handler)
-            (kill-new string nil yank-handler)))
-        (when (or string (eq last-command 'kill-region))
-          (setq this-command 'kill-region))
-        nil)
-@end group
-
-@group
-    ;;  @bullet{} The third argument to `condition-case' tells the interpreter
-    ;;    what to do with an error.
-@end group
-@group
-    ;;    The third argument has a conditions part and a body part.
-    ;;    If the conditions are met (in this case,
-    ;;             if text or buffer are read-only)
-    ;;    then the body is executed.
-@end group
-@group
-    ;;    The first part of the third argument is the following:
-    ((buffer-read-only text-read-only) ;; the if-part
-     ;; @dots{}  the then-part
-     (copy-region-as-kill beg end)
-@end group
-@group
-     ;;    Next, also as part of the then-part, set this-command, so
-     ;;    it will be set in an error
-     (setq this-command 'kill-region)
-     ;;    Finally, in the then-part, send a message if you may copy
-     ;;    the text to the kill ring without signally an error, but
-     ;;    don't if you may not.
-@end group
-@group
-     (if kill-read-only-ok
-         (progn (message "Read only text copied to kill ring") nil)
-       (barf-if-buffer-read-only)
-       ;; If the buffer isn't read-only, the text is.
-       (signal 'text-read-only (list (current-buffer)))))
-@end group
-@end smallexample
-
-@ignore
-@c v 21
-@smallexample
-@group
-(defun kill-region (beg end)
-  "Kill between point and mark.
-The text is deleted but saved in the kill ring."
-  (interactive "r")
-@end group
-
-@group
-  ;; 1. `condition-case' takes three arguments.
-  ;;    If the first argument is nil, as it is here,
-  ;;    information about the error signal is not
-  ;;    stored for use by another function.
-  (condition-case nil
-@end group
-
-@group
-      ;; 2. The second argument to `condition-case'
-      ;;    tells the Lisp interpreter what to do when all goes well.
-@end group
-
-@group
-      ;;    The `delete-and-extract-region' function usually does the
-      ;;    work.  If the beginning and ending of the region are both
-      ;;    the same, then the variable `string' will be empty, or nil
-      (let ((string (delete-and-extract-region beg end)))
-@end group
-
-@group
-        ;; `when' is an `if' clause that cannot take an `else-part'.
-        ;; Emacs normally sets the value of `last-command' to the
-        ;; previous command.
-@end group
-@group
-        ;; `kill-append' concatenates the new string and the old.
-        ;; `kill-new' inserts text into a new item in the kill ring.
-        (when string
-          (if (eq last-command 'kill-region)
-              ;; if true, prepend string
-              (kill-append string (< end beg))
-            (kill-new string)))
-        (setq this-command 'kill-region))
-@end group
-
-@group
-    ;; 3. The third argument to `condition-case' tells the interpreter
-    ;;    what to do with an error.
-@end group
-@group
-    ;;    The third argument has a conditions part and a body part.
-    ;;    If the conditions are met (in this case,
-    ;;             if text or buffer are read-only)
-    ;;    then the body is executed.
-@end group
-@group
-    ((buffer-read-only text-read-only) ;; this is the if-part
-     ;; then...
-     (copy-region-as-kill beg end)
-@end group
-@group
-     (if kill-read-only-ok            ;; usually this variable is nil
-         (message "Read only text copied to kill ring")
-       ;; or else, signal an error if the buffer is read-only;
-       (barf-if-buffer-read-only)
-       ;; and, in any case, signal that the text is read-only.
-       (signal 'text-read-only (list (current-buffer)))))))
-@end group
-@end smallexample
-@end ignore
-
-@node condition-case, Lisp macro, Complete kill-region, kill-region
-@comment  node-name,  next,  previous,  up
-@subsection @code{condition-case}
-@findex condition-case
-
-As we have seen earlier (@pxref{Making Errors, , Generate an Error
-Message}), when the Emacs Lisp interpreter has trouble evaluating an
-expression, it provides you with help; in the jargon, this is called
-``signaling an error''.  Usually, the computer stops the program and
-shows you a message.
-
-However, some programs undertake complicated actions.  They should not
-simply stop on an error.  In the @code{kill-region} function, the most
-likely error is that you will try to kill text that is read-only and
-cannot be removed.  So the @code{kill-region} function contains code
-to handle this circumstance.  This code, which makes up the body of
-the @code{kill-region} function, is inside of a @code{condition-case}
-special form.
-
-@need 800
-The template for @code{condition-case} looks like this:
-
-@smallexample
-@group
-(condition-case
-  @var{var}
-  @var{bodyform}
-  @var{error-handler}@dots{})
-@end group
-@end smallexample
-
-The second argument, @var{bodyform}, is straightforward.  The
-@code{condition-case} special form causes the Lisp interpreter to
-evaluate the code in @var{bodyform}.  If no error occurs, the special
-form returns the code's value and produces the side-effects, if any.
-
-In short, the @var{bodyform} part of a @code{condition-case}
-expression determines what should happen when everything works
-correctly.
-
-However, if an error occurs, among its other actions, the function
-generating the error signal will define one or more error condition
-names.
-
-An error handler is the third argument to @code{condition case}.
-An error handler has two parts, a @var{condition-name} and a
-@var{body}.  If the @var{condition-name} part of an error handler
-matches a condition name generated by an error, then the @var{body}
-part of the error handler is run.
-
-As you will expect, the @var{condition-name} part of an error handler
-may be either a single condition name or a list of condition names.
-
-Also, a complete @code{condition-case} expression may contain more
-than one error handler.  When an error occurs, the first applicable
-handler is run.
-
-Lastly, the first argument to the @code{condition-case} expression,
-the @var{var} argument, is sometimes bound to a variable that
-contains information about the error.  However, if that argument is
-nil, as is the case in @code{kill-region}, that information is
-discarded.
-
-@need 1200
-In brief, in the @code{kill-region} function, the code
-@code{condition-case} works like this:
-
-@smallexample
-@group
-@var{If no errors}, @var{run only this code}
-    @var{but}, @var{if errors}, @var{run this other code}.
-@end group
-@end smallexample
-
-@ignore
-2006 Oct 24
-In Emacs 22,
-copy-region-as-kill is short, 12 lines, and uses
-filter-buffer-substring, which is longer, 39 lines
-and has delete-and-extract-region in it.
-delete-and-extract-region is written in C.
-
-see Initializing a Variable with @code{defvar}
-this is line 8054
-Initializing a Variable with @code{defvar} includes line 8350
-@end ignore
-
-@node Lisp macro,  , condition-case, kill-region
-@comment  node-name,  next,  previous,  up
-@subsection Lisp macro
-@cindex Macro, lisp
-@cindex Lisp macro
-
-The part of the @code{condition-case} expression that is evaluated in
-the expectation that all goes well has a @code{when}.  The code uses
-@code{when} to determine whether the @code{string} variable points to
-text that exists.
-
-A @code{when} expression is simply a programmers' convenience.  It is
-an @code{if} without the possibility of an else clause.  In your mind,
-you can replace @code{when} with @code{if} and understand what goes
-on.  That is what the Lisp interpreter does.
-
-Technically speaking, @code{when} is a Lisp macro.  A Lisp @dfn{macro}
-enables you to define new control constructs and other language
-features.  It tells the interpreter how to compute another Lisp
-expression which will in turn compute the value.  In this case, the
-`other expression' is an @code{if} expression.
-
-The @code{kill-region} function definition also has an @code{unless}
-macro; it is the converse of @code{when}.  The @code{unless} macro is
-an @code{if} without a then clause
-
-For more about Lisp macros, see @ref{Macros, , Macros, elisp, The GNU
-Emacs Lisp Reference Manual}.  The C programming language also
-provides macros.  These are different, but also useful.
-
-@ignore
-We will briefly look at C macros in
-@ref{Digression into C}.
-@end ignore
-
-@need 1200
-Regarding the @code{when} macro, in the @code{condition-case}
-expression, when the string has content, then another conditional
-expression is executed.  This is an @code{if} with both a then-part
-and an else-part.
-
-@smallexample
-@group
-(if (eq last-command 'kill-region)
-    (kill-append string (< end beg) yank-handler)
-  (kill-new string nil yank-handler))
-@end group
-@end smallexample
-
-The then-part is evaluated if the previous command was another call to
-@code{kill-region}; if not, the else-part is evaluated.
-
-@code{yank-handler} is an optional argument to @code{kill-region} that
-tells the @code{kill-append} and @code{kill-new} functions how deal
-with properties added to the text, such as `bold' or `italics'.
-
-@code{last-command} is a variable that comes with Emacs that we have
-not seen before.  Normally, whenever a function is executed, Emacs
-sets the value of @code{last-command} to the previous command.
-
-@need 1200
-In this segment of the definition, the @code{if} expression checks
-whether the previous command was @code{kill-region}.  If it was,
-
-@smallexample
-(kill-append string (< end beg) yank-handler)
-@end smallexample
-
-@noindent
-concatenates a copy of the newly clipped text to the just previously
-clipped text in the kill ring.
-
-@node copy-region-as-kill, Digression into C, kill-region, Cutting & Storing Text
-@comment  node-name,  next,  previous,  up
-@section @code{copy-region-as-kill}
-@findex copy-region-as-kill
-@findex nthcdr
-
-The @code{copy-region-as-kill} function copies a region of text from a
-buffer and (via either @code{kill-append} or @code{kill-new}) saves it
-in the @code{kill-ring}.
-
-If you call @code{copy-region-as-kill} immediately after a
-@code{kill-region} command, Emacs appends the newly copied text to the
-previously copied text.  This means that if you yank back the text, you
-get it all, from both this and the previous operation.  On the other
-hand, if some other command precedes the @code{copy-region-as-kill},
-the function copies the text into a separate entry in the kill ring.
-
-@menu
-* Complete copy-region-as-kill::  The complete function definition.
-* copy-region-as-kill body::      The body of @code{copy-region-as-kill}.
-@end menu
-
-@node Complete copy-region-as-kill, copy-region-as-kill body, copy-region-as-kill, copy-region-as-kill
-@ifnottex
-@unnumberedsubsec The complete @code{copy-region-as-kill} function definition
-@end ifnottex
-
-@need 1200
-Here is the complete text of the version 22 @code{copy-region-as-kill}
-function:
-
-@smallexample
-@group
-(defun copy-region-as-kill (beg end)
-  "Save the region as if killed, but don't kill it.
-In Transient Mark mode, deactivate the mark.
-If `interprogram-cut-function' is non-nil, also save the text for a window
-system cut and paste."
-  (interactive "r")
-@end group
-@group
-  (if (eq last-command 'kill-region)
-      (kill-append (filter-buffer-substring beg end) (< end beg))
-    (kill-new (filter-buffer-substring beg end)))
-@end group
-@group
-  (if transient-mark-mode
-      (setq deactivate-mark t))
-  nil)
-@end group
-@end smallexample
-
-@need 800
-As usual, this function can be divided into its component parts:
-
-@smallexample
-@group
-(defun copy-region-as-kill (@var{argument-list})
-  "@var{documentation}@dots{}"
-  (interactive "r")
-  @var{body}@dots{})
-@end group
-@end smallexample
-
-The arguments are @code{beg} and @code{end} and the function is
-interactive with @code{"r"}, so the two arguments must refer to the
-beginning and end of the region.  If you have been reading though this
-document from the beginning, understanding these parts of a function is
-almost becoming routine.
-
-The documentation is somewhat confusing unless you remember that the
-word `kill' has a meaning different from usual.  The `Transient Mark'
-and @code{interprogram-cut-function} comments explain certain
-side-effects.
-
-After you once set a mark, a buffer always contains a region.  If you
-wish, you can use Transient Mark mode to highlight the region
-temporarily.  (No one wants to highlight the region all the time, so
-Transient Mark mode highlights it only at appropriate times.  Many
-people turn off Transient Mark mode, so the region is never
-highlighted.)
-
-Also, a windowing system allows you to copy, cut, and paste among
-different programs.  In the X windowing system, for example, the
-@code{interprogram-cut-function} function is @code{x-select-text},
-which works with the windowing system's equivalent of the Emacs kill
-ring.
-
-The body of the @code{copy-region-as-kill} function starts with an
-@code{if} clause.  What this clause does is distinguish between two
-different situations: whether or not this command is executed
-immediately after a previous @code{kill-region} command.  In the first
-case, the new region is appended to the previously copied text.
-Otherwise, it is inserted into the beginning of the kill ring as a
-separate piece of text from the previous piece.
-
-The last two lines of the function prevent the region from lighting up
-if Transient Mark mode is turned on.
-
-The body of @code{copy-region-as-kill} merits discussion in detail.
-
-@node copy-region-as-kill body,  , Complete copy-region-as-kill, copy-region-as-kill
-@comment  node-name,  next,  previous,  up
-@subsection The Body of @code{copy-region-as-kill}
-
-The @code{copy-region-as-kill} function works in much the same way as
-the @code{kill-region} function.  Both are written so that two or more
-kills in a row combine their text into a single entry.  If you yank
-back the text from the kill ring, you get it all in one piece.
-Moreover, kills that kill forward from the current position of the
-cursor are added to the end of the previously copied text and commands
-that copy text backwards add it to the beginning of the previously
-copied text.  This way, the words in the text stay in the proper
-order.
-
-Like @code{kill-region}, the @code{copy-region-as-kill} function makes
-use of the @code{last-command} variable that keeps track of the
-previous Emacs command.
-
-@menu
-* last-command & this-command::
-* kill-append function::
-* kill-new function::
-@end menu
-
-@node last-command & this-command, kill-append function, copy-region-as-kill body, copy-region-as-kill body
-@ifnottex
-@unnumberedsubsubsec @code{last-command} and @code{this-command}
-@end ifnottex
-
-Normally, whenever a function is executed, Emacs sets the value of
-@code{this-command} to the function being executed (which in this case
-would be @code{copy-region-as-kill}).  At the same time, Emacs sets
-the value of @code{last-command} to the previous value of
-@code{this-command}.
-
-In the first part of the body of the @code{copy-region-as-kill}
-function, an @code{if} expression determines whether the value of
-@code{last-command} is @code{kill-region}.  If so, the then-part of
-the @code{if} expression is evaluated; it uses the @code{kill-append}
-function to concatenate the text copied at this call to the function
-with the text already in the first element (the @sc{car}) of the kill
-ring.  On the other hand, if the value of @code{last-command} is not
-@code{kill-region}, then the @code{copy-region-as-kill} function
-attaches a new element to the kill ring using the @code{kill-new}
-function.
-
-@need 1250
-The @code{if} expression reads as follows; it uses @code{eq}:
-
-@smallexample
-@group
-  (if (eq last-command 'kill-region)
-      ;; @r{then-part}
-      (kill-append  (filter-buffer-substring beg end) (< end beg))
-    ;; @r{else-part}
-    (kill-new  (filter-buffer-substring beg end)))
-@end group
-@end smallexample
-
-@findex filter-buffer-substring
-(The @code{filter-buffer-substring} function returns a filtered
-substring of the buffer, if any.  Optionally---the arguments are not
-here, so neither is done---the function may delete the initial text or
-return the text without its properties; this function is a replacement
-for the older @code{buffer-substring} function, which came before text
-properties were implemented.)
-
-@findex eq @r{(example of use)}
-@noindent
-The @code{eq} function tests whether its first argument is the same Lisp
-object as its second argument.  The @code{eq} function is similar to the
-@code{equal} function in that it is used to test for equality, but
-differs in that it determines whether two representations are actually
-the same object inside the computer, but with different names.
-@code{equal} determines whether the structure and contents of two
-expressions are the same.
-
-If the previous command was @code{kill-region}, then the Emacs Lisp
-interpreter calls the @code{kill-append} function
-
-@node kill-append function, kill-new function, last-command & this-command, copy-region-as-kill body
-@unnumberedsubsubsec The @code{kill-append} function
-@findex kill-append
-
-@need 800
-The @code{kill-append} function looks like this:
-
-@c in GNU Emacs 22
-@smallexample
-@group
-(defun kill-append (string before-p &optional yank-handler)
-  "Append STRING to the end of the latest kill in the kill ring.
-If BEFORE-P is non-nil, prepend STRING to the kill.
-@dots{} "
-  (let* ((cur (car kill-ring)))
-    (kill-new (if before-p (concat string cur) (concat cur string))
-              (or (= (length cur) 0)
-                  (equal yank-handler
-                         (get-text-property 0 'yank-handler cur)))
-              yank-handler)))
-@end group
-@end smallexample
-
-@ignore
-was:
-(defun kill-append (string before-p)
-  "Append STRING to the end of the latest kill in the kill ring.
-If BEFORE-P is non-nil, prepend STRING to the kill.
-If `interprogram-cut-function' is set, pass the resulting kill to
-it."
-  (kill-new (if before-p
-                (concat string (car kill-ring))
-              (concat (car kill-ring) string))
-            t))
-@end ignore
-
-@noindent
-The @code{kill-append} function is fairly straightforward.  It uses
-the @code{kill-new} function, which we will discuss in more detail in
-a moment.
-
-(Also, the function provides an optional argument called
-@code{yank-handler}; when invoked, this argument tells the function
-how to deal with properties added to the text, such as `bold' or
-`italics'.)
-
-@c !!! bug in GNU Emacs 22 version of  kill-append ?
-It has a @code{let*} function to set the value of the first element of
-the kill ring to @code{cur}.  (I do not know why the function does not
-use @code{let} instead; only one value is set in the expression.
-Perhaps this is a bug that produces no problems?)
-
-Consider the conditional that is one of the two arguments to
-@code{kill-new}.  It uses @code{concat} to concatenate the new text to
-the @sc{car} of the kill ring.  Whether it prepends or appends the
-text depends on the results of an @code{if} expression:
-
-@smallexample
-@group
-(if before-p                            ; @r{if-part}
-    (concat string cur)                 ; @r{then-part}
-  (concat cur string))                  ; @r{else-part}
-@end group
-@end smallexample
-
-@noindent
-If the region being killed is before the region that was killed in the
-last command, then it should be prepended before the material that was
-saved in the previous kill; and conversely, if the killed text follows
-what was just killed, it should be appended after the previous text.
-The @code{if} expression depends on the predicate @code{before-p} to
-decide whether the newly saved text should be put before or after the
-previously saved text.
-
-The symbol @code{before-p} is the name of one of the arguments to
-@code{kill-append}.  When the @code{kill-append} function is
-evaluated, it is bound to the value returned by evaluating the actual
-argument.  In this case, this is the expression @code{(< end beg)}.
-This expression does not directly determine whether the killed text in
-this command is located before or after the kill text of the last
-command; what it does is determine whether the value of the variable
-@code{end} is less than the value of the variable @code{beg}.  If it
-is, it means that the user is most likely heading towards the
-beginning of the buffer.  Also, the result of evaluating the predicate
-expression, @code{(< end beg)}, will be true and the text will be
-prepended before the previous text.  On the other hand, if the value of
-the variable @code{end} is greater than the value of the variable
-@code{beg}, the text will be appended after the previous text.
-
-@need 800
-When the newly saved text will be prepended, then the string with the new
-text will be concatenated before the old text:
-
-@smallexample
-(concat string cur)
-@end smallexample
-
-@need 1200
-@noindent
-But if the text will be appended, it will be concatenated
-after the old text:
-
-@smallexample
-(concat cur string))
-@end smallexample
-
-To understand how this works, we first need to review the
-@code{concat} function.  The @code{concat} function links together or
-unites two strings of text.  The result is a string.  For example:
-
-@smallexample
-@group
-(concat "abc" "def")
-     @result{} "abcdef"
-@end group
-
-@group
-(concat "new "
-        (car '("first element" "second element")))
-     @result{} "new first element"
-
-(concat (car
-        '("first element" "second element")) " modified")
-     @result{} "first element modified"
-@end group
-@end smallexample
-
-We can now make sense of @code{kill-append}: it modifies the contents
-of the kill ring.  The kill ring is a list, each element of which is
-saved text.  The @code{kill-append} function uses the @code{kill-new}
-function which in turn uses the @code{setcar} function.
-
-@node kill-new function,  , kill-append function, copy-region-as-kill body
-@unnumberedsubsubsec The @code{kill-new} function
-@findex kill-new
-
-@c in GNU Emacs 22, additional documentation to kill-new:
-@ignore
-Optional third arguments YANK-HANDLER controls how the STRING is later
-inserted into a buffer; see `insert-for-yank' for details.
-When a yank handler is specified, STRING must be non-empty (the yank
-handler, if non-nil, is stored as a `yank-handler' text property on STRING).
-
-When the yank handler has a non-nil PARAM element, the original STRING
-argument is not used by `insert-for-yank'.  However, since Lisp code
-may access and use elements from the kill ring directly, the STRING
-argument should still be a \"useful\" string for such uses."
-@end ignore
-@need 1200
-The @code{kill-new} function looks like this:
-
-@smallexample
-@group
-(defun kill-new (string &optional replace yank-handler)
-  "Make STRING the latest kill in the kill ring.
-Set `kill-ring-yank-pointer' to point to it.
-
-If `interprogram-cut-function' is non-nil, apply it to STRING.
-Optional second argument REPLACE non-nil means that STRING will replace
-the front of the kill ring, rather than being added to the list.
-@dots{}"
-@end group
-@group
-  (if (> (length string) 0)
-      (if yank-handler
-          (put-text-property 0 (length string)
-                             'yank-handler yank-handler string))
-    (if yank-handler
-        (signal 'args-out-of-range
-                (list string "yank-handler specified for empty string"))))
-@end group
-@group
-  (if (fboundp 'menu-bar-update-yank-menu)
-      (menu-bar-update-yank-menu string (and replace (car kill-ring))))
-@end group
-@group
-  (if (and replace kill-ring)
-      (setcar kill-ring string)
-    (push string kill-ring)
-    (if (> (length kill-ring) kill-ring-max)
-        (setcdr (nthcdr (1- kill-ring-max) kill-ring) nil)))
-@end group
-@group
-  (setq kill-ring-yank-pointer kill-ring)
-  (if interprogram-cut-function
-      (funcall interprogram-cut-function string (not replace))))
-@end group
-@end smallexample
-@ignore
-was:
-(defun kill-new (string &optional replace)
-  "Make STRING the latest kill in the kill ring.
-Set the kill-ring-yank pointer to point to it.
-If `interprogram-cut-function' is non-nil, apply it to STRING.
-Optional second argument REPLACE non-nil means that STRING will replace
-the front of the kill ring, rather than being added to the list."
-  (and (fboundp 'menu-bar-update-yank-menu)
-       (menu-bar-update-yank-menu string (and replace (car kill-ring))))
-  (if (and replace kill-ring)
-      (setcar kill-ring string)
-    (setq kill-ring (cons string kill-ring))
-    (if (> (length kill-ring) kill-ring-max)
-        (setcdr (nthcdr (1- kill-ring-max) kill-ring) nil)))
-  (setq kill-ring-yank-pointer kill-ring)
-  (if interprogram-cut-function
-      (funcall interprogram-cut-function string (not replace))))
-@end ignore
-
-(Notice that the function is not interactive.)
-
-As usual, we can look at this function in parts.
-
-The function definition has an optional @code{yank-handler} argument,
-which when invoked tells the function how to deal with properties
-added to the text, such as `bold' or `italics'.  We will skip that.
-
-@need 1200
-The first line of the documentation makes sense:
-
-@smallexample
-Make STRING the latest kill in the kill ring.
-@end smallexample
-
-@noindent
-Let's skip over the rest of the documentation for the moment.
-
-@noindent
-Also, let's skip over the initial @code{if} expression and those lines
-of code involving @code{menu-bar-update-yank-menu}.  We will explain
-them below.
-
-@need 1200
-The critical lines are these:
-
-@smallexample
-@group
-  (if (and replace kill-ring)
-      ;; @r{then}
-      (setcar kill-ring string)
-@end group
-@group
-    ;; @r{else}
-  (push string kill-ring)
-@end group
-@group
-    (setq kill-ring (cons string kill-ring))
-    (if (> (length kill-ring) kill-ring-max)
-        ;; @r{avoid overly long kill ring}
-        (setcdr (nthcdr (1- kill-ring-max) kill-ring) nil)))
-@end group
-@group
-  (setq kill-ring-yank-pointer kill-ring)
-  (if interprogram-cut-function
-      (funcall interprogram-cut-function string (not replace))))
-@end group
-@end smallexample
-
-The conditional test is @w{@code{(and replace kill-ring)}}.
-This will be true when two conditions are met:  the kill ring has
-something in it, and the @code{replace} variable is true.
-
-@need 1250
-When the @code{kill-append} function sets @code{replace} to be true
-and when the kill ring has at least one item in it, the @code{setcar}
-expression is executed:
-
-@smallexample
-(setcar kill-ring string)
-@end smallexample
-
-The @code{setcar} function actually changes the first element of the
-@code{kill-ring} list to the value of @code{string}.  It replaces the
-first element.
-
-@need 1250
-On the other hand, if the kill ring is empty, or replace is false, the
-else-part of the condition is executed:
-
-@smallexample
-(push string kill-ring)
-@end smallexample
-
-@noindent
-@need 1250
-@code{push} puts its first argument onto the second.  It is similar to
-the older
-
-@smallexample
-(setq kill-ring (cons string kill-ring))
-@end smallexample
-
-@noindent
-@need 1250
-or the newer
-
-@smallexample
-(add-to-list kill-ring string)
-@end smallexample
-
-@noindent
-When it is false, the expression first constructs a new version of the
-kill ring by prepending @code{string} to the existing kill ring as a
-new element (that is what the @code{push} does).  Then it executes a
-second @code{if} clause.  This second @code{if} clause keeps the kill
-ring from growing too long.
-
-Let's look at these two expressions in order.
-
-The @code{push} line of the else-part sets the new value of the kill
-ring to what results from adding the string being killed to the old
-kill ring.
-
-We can see how this works with an example.
-
-@need 800
-First,
-
-@smallexample
-(setq example-list '("here is a clause" "another clause"))
-@end smallexample
-
-@need 1200
-@noindent
-After evaluating this expression with @kbd{C-x C-e}, you can evaluate
-@code{example-list} and see what it returns:
-
-@smallexample
-@group
-example-list
-     @result{} ("here is a clause" "another clause")
-@end group
-@end smallexample
-
-@need 1200
-@noindent
-Now, we can add a new element on to this list by evaluating the
-following expression:
-@findex push, @r{example}
-
-@smallexample
-(push "a third clause" example-list)
-@end smallexample
-
-@need 800
-@noindent
-When we evaluate @code{example-list}, we find its value is:
-
-@smallexample
-@group
-example-list
-     @result{} ("a third clause" "here is a clause" "another clause")
-@end group
-@end smallexample
-
-@noindent
-Thus, the third clause is added to the list by @code{push}.
-
-@need 1200
-Now for the second part of the @code{if} clause.  This expression
-keeps the kill ring from growing too long.  It looks like this:
-
-@smallexample
-@group
-(if (> (length kill-ring) kill-ring-max)
-    (setcdr (nthcdr (1- kill-ring-max) kill-ring) nil))
-@end group
-@end smallexample
-
-The code checks whether the length of the kill ring is greater than
-the maximum permitted length.  This is the value of
-@code{kill-ring-max} (which is 60, by default).  If the length of the
-kill ring is too long, then this code sets the last element of the
-kill ring to @code{nil}.  It does this by using two functions,
-@code{nthcdr} and @code{setcdr}.
-
-We looked at @code{setcdr} earlier (@pxref{setcdr, , @code{setcdr}}).
-It sets the @sc{cdr} of a list, just as @code{setcar} sets the
-@sc{car} of a list.  In this case, however, @code{setcdr} will not be
-setting the @sc{cdr} of the whole kill ring; the @code{nthcdr}
-function is used to cause it to set the @sc{cdr} of the next to last
-element of the kill ring---this means that since the @sc{cdr} of the
-next to last element is the last element of the kill ring, it will set
-the last element of the kill ring.
-
-@findex nthcdr, @r{example}
-The @code{nthcdr} function works by repeatedly taking the @sc{cdr} of a
-list---it takes the @sc{cdr} of the @sc{cdr} of the @sc{cdr}
-@dots{}  It does this @var{N} times and returns the results.
-(@xref{nthcdr, , @code{nthcdr}}.)
-
-@findex setcdr, @r{example}
-Thus, if we had a four element list that was supposed to be three
-elements long, we could set the @sc{cdr} of the next to last element
-to @code{nil}, and thereby shorten the list.  (If you set the last
-element to some other value than @code{nil}, which you could do, then
-you would not have shortened the list.  @xref{setcdr, ,
-@code{setcdr}}.)
-
-You can see shortening by evaluating the following three expressions
-in turn.  First set the value of @code{trees} to @code{(maple oak pine
-birch)}, then set the @sc{cdr} of its second @sc{cdr} to @code{nil}
-and then find the value of @code{trees}:
-
-@smallexample
-@group
-(setq trees '(maple oak pine birch))
-     @result{} (maple oak pine birch)
-@end group
-
-@group
-(setcdr (nthcdr 2 trees) nil)
-     @result{} nil
-
-trees
-     @result{} (maple oak pine)
-@end group
-@end smallexample
-
-@noindent
-(The value returned by the @code{setcdr} expression is @code{nil} since
-that is what the @sc{cdr} is set to.)
-
-To repeat, in @code{kill-new}, the @code{nthcdr} function takes the
-@sc{cdr} a number of times that is one less than the maximum permitted
-size of the kill ring and @code{setcdr} sets the @sc{cdr} of that
-element (which will be the rest of the elements in the kill ring) to
-@code{nil}.  This prevents the kill ring from growing too long.
-
-@need 800
-The next to last expression in the @code{kill-new} function is
-
-@smallexample
-(setq kill-ring-yank-pointer kill-ring)
-@end smallexample
-
-The @code{kill-ring-yank-pointer} is a global variable that is set to be
-the @code{kill-ring}.
-
-Even though the @code{kill-ring-yank-pointer} is called a
-@samp{pointer}, it is a variable just like the kill ring.  However, the
-name has been chosen to help humans understand how the variable is used.
-
-@need 1200
-Now, to return to an early expression in the body of the function:
-
-@smallexample
-@group
-  (if (fboundp 'menu-bar-update-yank-menu)
-       (menu-bar-update-yank-menu string (and replace (car kill-ring))))
-@end group
-@end smallexample
-
-@noindent
-It starts with an @code{if} expression
-
-In this case, the expression tests first to see whether
-@code{menu-bar-update-yank-menu} exists as a function, and if so,
-calls it.  The @code{fboundp} function returns true if the symbol it
-is testing has a function definition that `is not void'.  If the
-symbol's function definition were void, we would receive an error
-message, as we did when we created errors intentionally (@pxref{Making
-Errors, , Generate an Error Message}).
-
-@noindent
-The then-part contains an expression whose first element is the
-function @code{and}.
-
-@findex and
-The @code{and} special form evaluates each of its arguments until one
-of the arguments returns a value of @code{nil}, in which case the
-@code{and} expression returns @code{nil}; however, if none of the
-arguments returns a value of @code{nil}, the value resulting from
-evaluating the last argument is returned.  (Since such a value is not
-@code{nil}, it is considered true in Emacs Lisp.)  In other words, an
-@code{and} expression returns a true value only if all its arguments
-are true.  (@xref{Second Buffer Related Review}.)
-
-The expression determines whether the second argument to
-@code{menu-bar-update-yank-menu} is true or not.
-@ignore
-    ;; If we're supposed to be extending an existing string, and that
-    ;; string really is at the front of the menu, then update it in place.
-@end ignore
-
-@code{menu-bar-update-yank-menu} is one of the functions that make it
-possible to use the `Select and Paste' menu in the Edit item of a menu
-bar; using a mouse, you can look at the various pieces of text you
-have saved and select one piece to paste.
-
-The last expression in the @code{kill-new} function adds the newly
-copied string to whatever facility exists for copying and pasting
-among different programs running in a windowing system.  In the X
-Windowing system, for example, the @code{x-select-text} function takes
-the string and stores it in memory operated by X.  You can paste the
-string in another program, such as an Xterm.
-
-@need 1200
-The expression looks like this:
-
-@smallexample
-@group
-  (if interprogram-cut-function
-      (funcall interprogram-cut-function string (not replace))))
-@end group
-@end smallexample
-
-If an @code{interprogram-cut-function} exists, then Emacs executes
-@code{funcall}, which in turn calls its first argument as a function
-and passes the remaining arguments to it.  (Incidentally, as far as I
-can see, this @code{if} expression could be replaced by an @code{and}
-expression similar to the one in the first part of the function.)
-
-We are not going to discuss windowing systems and other programs
-further, but merely note that this is a mechanism that enables GNU
-Emacs to work easily and well with other programs.
-
-This code for placing text in the kill ring, either concatenated with
-an existing element or as a new element, leads us to the code for
-bringing back text that has been cut out of the buffer---the yank
-commands.  However, before discussing the yank commands, it is better
-to learn how lists are implemented in a computer.  This will make
-clear such mysteries as the use of the term `pointer'.  But before
-that, we will digress into C.
-
-@ignore
-@c is this true in Emacs 22?   Does not seems to be
-
-  (If the @w{@code{(< end beg))}}
-expression is true, @code{kill-append} prepends the string to the just
-previously clipped text.  For a detailed discussion, see
-@ref{kill-append function, , The @code{kill-append} function}.)
-
-If you then yank back the text, i.e., `paste' it, you get both
-pieces of text at once.  That way, if you delete two words in a row,
-and then yank them back, you get both words, in their proper order,
-with one yank.  (The @w{@code{(< end beg))}} expression makes sure the
-order is correct.)
-
-On the other hand, if the previous command is not @code{kill-region},
-then the @code{kill-new} function is called, which adds the text to
-the kill ring as the latest item, and sets the
-@code{kill-ring-yank-pointer} variable to point to it.
-@end ignore
-@ignore
-
-@c Evidently, changed for Emacs 22. The zap-to-char command does not
-@c use the delete-and-extract-region function
-
-2006 Oct 26, the Digression into C is now OK but should come after
-copy-region-as-kill and filter-buffer-substring
-
-2006 Oct 24
-In Emacs 22,
-copy-region-as-kill is short, 12 lines, and uses
-filter-buffer-substring, which is longer, 39 lines
-and has delete-and-extract-region in it.
-delete-and-extract-region is written in C.
-
-see Initializing a Variable with @code{defvar}
-@end ignore
-
-@node Digression into C, defvar, copy-region-as-kill, Cutting & Storing Text
-@comment  node-name,  next,  previous,  up
-@section Digression into C
-@findex delete-and-extract-region
-@cindex C, a digression into
-@cindex Digression into C
-
-The @code{copy-region-as-kill} function (@pxref{copy-region-as-kill, ,
-@code{copy-region-as-kill}}) uses the @code{filter-buffer-substring}
-function, which in turn uses the @code{delete-and-extract-region}
-function.  It removes the contents of a region and you cannot get them
-back.
-
-Unlike the other code discussed here, the
-@code{delete-and-extract-region} function is not written in Emacs
-Lisp; it is written in C and is one of the primitives of the GNU Emacs
-system.  Since it is very simple, I will digress briefly from Lisp and
-describe it here.
-
-@c GNU Emacs 22  in /usr/local/src/emacs/src/editfns.c
-@c the DEFUN for  buffer-substring-no-properties
-
-@need 1500
-Like many of the other Emacs primitives,
-@code{delete-and-extract-region} is written as an instance of a C
-macro, a macro being a template for code.  The complete macro looks
-like this:
-
-@smallexample
-@group
-DEFUN ("buffer-substring-no-properties", Fbuffer_substring_no_properties,
-       Sbuffer_substring_no_properties, 2, 2, 0,
-       doc: /* Return the characters of part of the buffer,
-without the text properties.
-The two arguments START and END are character positions;
-they can be in either order.  */)
-     (start, end)
-     Lisp_Object start, end;
-@{
-  register int b, e;
-
-  validate_region (&start, &end);
-  b = XINT (start);
-  e = XINT (end);
-
-  return make_buffer_string (b, e, 0);
-@}
-@end group
-@end smallexample
-
-Without going into the details of the macro writing process, let me
-point out that this macro starts with the word @code{DEFUN}.  The word
-@code{DEFUN} was chosen since the code serves the same purpose as
-@code{defun} does in Lisp.  (The @code{DEFUN} C macro is defined in
-@file{emacs/src/lisp.h}.)
-
-The word @code{DEFUN} is followed by seven parts inside of
-parentheses:
-
-@itemize @bullet
-@item
-The first part is the name given to the function in Lisp,
-@code{delete-and-extract-region}.
-
-@item
-The second part is the name of the function in C,
-@code{Fdelete_and_extract_region}.  By convention, it starts with
-@samp{F}.  Since C does not use hyphens in names, underscores are used
-instead.
-
-@item
-The third part is the name for the C constant structure that records
-information on this function for internal use.  It is the name of the
-function in C but begins with an @samp{S} instead of an @samp{F}.
-
-@item
-The fourth and fifth parts specify the minimum and maximum number of
-arguments the function can have.  This function demands exactly 2
-arguments.
-
-@item
-The sixth part is nearly like the argument that follows the
-@code{interactive} declaration in a function written in Lisp: a letter
-followed, perhaps, by a prompt.  The only difference from the Lisp is
-when the macro is called with no arguments.  Then you write a @code{0}
-(which is a `null string'), as in this macro.
-
-If you were to specify arguments, you would place them between
-quotation marks.  The C macro for @code{goto-char} includes
-@code{"NGoto char: "} in this position to indicate that the function
-expects a raw prefix, in this case, a numerical location in a buffer,
-and provides a prompt.
-
-@item
-The seventh part is a documentation string, just like the one for a
-function written in Emacs Lisp, except that every newline must be
-written explicitly as @samp{\n} followed by a backslash and carriage
-return.
-
-@need 1000
-Thus, the first two lines of documentation for  @code{goto-char} are
-written like this:
-
-@smallexample
-@group
-  "Set point to POSITION, a number or marker.\n\
-Beginning of buffer is position (point-min), end is (point-max)."
-@end group
-@end smallexample
-@end itemize
-
-@need 1200
-In a C macro, the formal parameters come next, with a statement of
-what kind of object they are, followed by what might be called the `body'
-of the macro.  For @code{delete-and-extract-region} the `body'
-consists of the following four lines:
-
-@smallexample
-@group
-validate_region (&start, &end);
-if (XINT (start) == XINT (end))
-  return build_string ("");
-return del_range_1 (XINT (start), XINT (end), 1, 1);
-@end group
-@end smallexample
-
-The   @code{validate_region} function checks whether the values
-passed as the beginning and end of the region are the proper type and
-are within range.  If the beginning and end positions are the same,
-then return and empty string.
-
-The @code{del_range_1} function actually deletes the text.  It is a
-complex function we will not look into.  It updates the buffer and
-does other things.  However, it is worth looking at the two arguments
-passed to @code{del_range}.  These are @w{@code{XINT (start)}} and
-@w{@code{XINT (end)}}.
-
-As far as the C language is concerned, @code{start} and @code{end} are
-two integers that mark the beginning and end of the region to be
-deleted@footnote{More precisely, and requiring more expert knowledge
-to understand, the two integers are of type `Lisp_Object', which can
-also be a C union instead of an integer type.}.
-
-In early versions of Emacs, these two numbers were thirty-two bits
-long, but the code is slowly being generalized to handle other
-lengths.  Three of the available bits are used to specify the type of
-information; the remaining bits are used as `content'.
-
-@samp{XINT} is a C macro that extracts the relevant number from the
-longer collection of bits; the three other bits are discarded.
-
-@need 800
-The command in @code{delete-and-extract-region} looks like this:
-
-@smallexample
-del_range_1 (XINT (start), XINT (end), 1, 1);
-@end smallexample
-
-@noindent
-It deletes the region between the beginning position, @code{start},
-and the ending position, @code{end}.
-
-From the point of view of the person writing Lisp, Emacs is all very
-simple; but hidden underneath is a great deal of complexity to make it
-all work.
-
-@node defvar, cons & search-fwd Review, Digression into C, Cutting & Storing Text
-@comment  node-name,  next,  previous,  up
-@section Initializing a Variable with @code{defvar}
-@findex defvar
-@cindex Initializing a variable
-@cindex Variable initialization
-
-@ignore
-2006 Oct 24
-In Emacs 22,
-copy-region-as-kill is short, 12 lines, and uses
-filter-buffer-substring, which is longer, 39 lines
-and has delete-and-extract-region in it.
-delete-and-extract-region is written in C.
-
-see Initializing a Variable with @code{defvar}
-
-@end ignore
-
-The @code{copy-region-as-kill} function is written in Emacs Lisp.  Two
-functions within it, @code{kill-append} and @code{kill-new}, copy a
-region in a buffer and save it in a variable called the
-@code{kill-ring}.  This section describes how the @code{kill-ring}
-variable is created and initialized using the @code{defvar} special
-form.
-
-(Again we note that the term @code{kill-ring} is a misnomer.  The text
-that is clipped out of the buffer can be brought back; it is not a ring
-of corpses, but a ring of resurrectable text.)
-
-In Emacs Lisp, a variable such as the @code{kill-ring} is created and
-given an initial value by using the @code{defvar} special form.  The
-name comes from ``define variable''.
-
-The @code{defvar} special form is similar to @code{setq} in that it sets
-the value of a variable.  It is unlike @code{setq} in two ways: first,
-it only sets the value of the variable if the variable does not already
-have a value.  If the variable already has a value, @code{defvar} does
-not override the existing value.  Second, @code{defvar} has a
-documentation string.
-
-(Another special form, @code{defcustom}, is designed for variables
-that people customize.  It has more features than @code{defvar}.
-(@xref{defcustom, , Setting Variables with @code{defcustom}}.)
-
-@menu
-* See variable current value::
-* defvar and asterisk::
-@end menu
-
-@node See variable current value, defvar and asterisk, defvar, defvar
-@ifnottex
-@unnumberedsubsec Seeing the Current Value of a Variable
-@end ifnottex
-
-You can see the current value of a variable, any variable, by using
-the @code{describe-variable} function, which is usually invoked by
-typing @kbd{C-h v}.  If you type @kbd{C-h v} and then @code{kill-ring}
-(followed by @key{RET}) when prompted, you will see what is in your
-current kill ring---this may be quite a lot!  Conversely, if you have
-been doing nothing this Emacs session except read this document, you
-may have nothing in it.  Also, you will see the documentation for
-@code{kill-ring}:
-
-@smallexample
-@group
-Documentation:
-List of killed text sequences.
-Since the kill ring is supposed to interact nicely with cut-and-paste
-facilities offered by window systems, use of this variable should
-@end group
-@group
-interact nicely with `interprogram-cut-function' and
-`interprogram-paste-function'.  The functions `kill-new',
-`kill-append', and `current-kill' are supposed to implement this
-interaction; you may want to use them instead of manipulating the kill
-ring directly.
-@end group
-@end smallexample
-
-@need 800
-The kill ring is defined by a @code{defvar} in the following way:
-
-@smallexample
-@group
-(defvar kill-ring nil
-  "List of killed text sequences.
-@dots{}")
-@end group
-@end smallexample
-
-@noindent
-In this variable definition, the variable is given an initial value of
-@code{nil}, which makes sense, since if you have saved nothing, you want
-nothing back if you give a @code{yank} command.  The documentation
-string is written just like the documentation string of a @code{defun}.
-As with the documentation string of the @code{defun}, the first line of
-the documentation should be a complete sentence, since some commands,
-like @code{apropos}, print only the first line of documentation.
-Succeeding lines should not be indented; otherwise they look odd when
-you use @kbd{C-h v} (@code{describe-variable}).
-
-@node defvar and asterisk,  , See variable current value, defvar
-@subsection @code{defvar} and an asterisk
-@findex defvar @r{for a user customizable variable}
-@findex defvar @r{with an asterisk}
-
-In the past, Emacs used the @code{defvar} special form both for
-internal variables that you would not expect a user to change and for
-variables that you do expect a user to change.  Although you can still
-use @code{defvar} for user customizable variables, please use
-@code{defcustom} instead, since that special form provides a path into
-the Customization commands.  (@xref{defcustom, , Specifying Variables
-using @code{defcustom}}.)
-
-When you specified a variable using the @code{defvar} special form,
-you could distinguish a readily settable variable from others by
-typing an asterisk, @samp{*}, in the first column of its documentation
-string.  For example:
-
-@smallexample
-@group
-(defvar shell-command-default-error-buffer nil
-  "*Buffer name for `shell-command' @dots{} error output.
-@dots{} ")
-@end group
-@end smallexample
-
-@findex set-variable
-@noindent
-You could (and still can) use the @code{set-variable} command to
-change the value of @code{shell-command-default-error-buffer}
-temporarily.  However, options set using @code{set-variable} are set
-only for the duration of your editing session.  The new values are not
-saved between sessions.  Each time Emacs starts, it reads the original
-value, unless you change the value within your @file{.emacs} file,
-either by setting it manually or by using @code{customize}.
-@xref{Emacs Initialization, , Your @file{.emacs} File}.
-
-For me, the major use of the @code{set-variable} command is to suggest
-variables that I might want to set in my @file{.emacs} file.  There
-are now more than 700 such variables --- far too many to remember
-readily.  Fortunately, you can press @key{TAB} after calling the
-@code{M-x set-variable} command to see the list of variables.
-(@xref{Examining, , Examining and Setting Variables, emacs,
-The GNU Emacs Manual}.)
-
-@need 1250
-@node cons & search-fwd Review, search Exercises, defvar, Cutting & Storing Text
-@comment  node-name,  next,  previous,  up
-@section Review
-
-Here is a brief summary of some recently introduced functions.
-
-@table @code
-@item car
-@itemx cdr
-@code{car} returns the first element of a list; @code{cdr} returns the
-second and subsequent elements of a list.
-
-@need 1250
-For example:
-
-@smallexample
-@group
-(car '(1 2 3 4 5 6 7))
-     @result{} 1
-(cdr '(1 2 3 4 5 6 7))
-     @result{} (2 3 4 5 6 7)
-@end group
-@end smallexample
-
-@item cons
-@code{cons} constructs a list by prepending its first argument to its
-second argument.
-
-@need 1250
-For example:
-
-@smallexample
-@group
-(cons 1 '(2 3 4))
-     @result{} (1 2 3 4)
-@end group
-@end smallexample
-
-@item funcall
-@code{funcall} evaluates its first argument as a function.  It passes
-its remaining arguments to its first argument.
-
-@item nthcdr
-Return the result of taking @sc{cdr} `n' times on a list.
-@iftex
-The
-@tex
-$n^{th}$
-@end tex
-@code{cdr}.
-@end iftex
-The `rest of the rest', as it were.
-
-@need 1250
-For example:
-
-@smallexample
-@group
-(nthcdr 3 '(1 2 3 4 5 6 7))
-     @result{} (4 5 6 7)
-@end group
-@end smallexample
-
-@item setcar
-@itemx setcdr
-@code{setcar} changes the first element of a list; @code{setcdr}
-changes the second and subsequent elements of a list.
-
-@need 1250
-For example:
-
-@smallexample
-@group
-(setq triple '(1 2 3))
-
-(setcar triple '37)
-
-triple
-     @result{} (37 2 3)
-
-(setcdr triple '("foo" "bar"))
-
-triple
-     @result{} (37 "foo" "bar")
-@end group
-@end smallexample
-
-@item progn
-Evaluate each argument in sequence and then return the value of the
-last.
-
-@need 1250
-For example:
-
-@smallexample
-@group
-(progn 1 2 3 4)
-     @result{} 4
-@end group
-@end smallexample
-
-@item save-restriction
-Record whatever narrowing is in effect in the current buffer, if any,
-and restore that narrowing after evaluating the arguments.
-
-@item search-forward
-Search for a string, and if the string is found, move point.  With a
-regular expression, use the similar @code{re-search-forward}.
-(@xref{Regexp Search, , Regular Expression Searches}, for an
-explanation of regular expression patterns and searches.)
-
-@need 1250
-@noindent
-@code{search-forward} and @code{re-search-forward} take four
-arguments:
-
-@enumerate
-@item
-The string or regular expression to search for.
-
-@item
-Optionally, the limit of the search.
-
-@item
-Optionally, what to do if the search fails, return @code{nil} or an
-error message.
-
-@item
-Optionally, how many times to repeat the search; if negative, the
-search goes backwards.
-@end enumerate
-
-@item kill-region
-@itemx delete-and-extract-region
-@itemx copy-region-as-kill
-
-@code{kill-region} cuts the text between point and mark from the
-buffer and stores that text in the kill ring, so you can get it back
-by yanking.
-
-@code{copy-region-as-kill} copies the text between point and mark into
-the kill ring, from which you can get it by yanking.  The function
-does not cut or remove the text from the buffer.
-@end table
-
-@code{delete-and-extract-region} removes the text between point and
-mark from the buffer and throws it away.  You cannot get it back.
-(This is not an interactive command.)
-
-@need 1500
-@node search Exercises,  , cons & search-fwd Review, Cutting & Storing Text
-@section Searching Exercises
-
-@itemize @bullet
-@item
-Write an interactive function that searches for a string.  If the
-search finds the string, leave point after it and display a message
-that says ``Found!''.  (Do not use @code{search-forward} for the name
-of this function; if you do, you will overwrite the existing version of
-@code{search-forward} that comes with Emacs.  Use a name such as
-@code{test-search} instead.)
-
-@item
-Write a function that prints the third element of the kill ring in the
-echo area, if any; if the kill ring does not contain a third element,
-print an appropriate message.
-@end itemize
-
-@node List Implementation, Yanking, Cutting & Storing Text, Top
-@comment  node-name,  next,  previous,  up
-@chapter How Lists are Implemented
-@cindex Lists in a computer
-
-In Lisp, atoms are recorded in a straightforward fashion; if the
-implementation is not straightforward in practice, it is, nonetheless,
-straightforward in theory.  The atom @samp{rose}, for example, is
-recorded as the four contiguous letters @samp{r}, @samp{o}, @samp{s},
-@samp{e}.  A list, on the other hand, is kept differently.  The mechanism
-is equally simple, but it takes a moment to get used to the idea.  A
-list is kept using a series of pairs of pointers.  In the series, the
-first pointer in each pair points to an atom or to another list, and the
-second pointer in each pair points to the next pair, or to the symbol
-@code{nil}, which marks the end of the list.
-
-A pointer itself is quite simply the electronic address of what is
-pointed to.  Hence, a list is kept as a series of electronic addresses.
-
-@menu
-* Lists diagrammed::
-* Symbols as Chest::            Exploring a powerful metaphor.
-* List Exercise::
-@end menu
-
-@node Lists diagrammed, Symbols as Chest, List Implementation, List Implementation
-@ifnottex
-@unnumberedsec Lists diagrammed
-@end ifnottex
-
-For example, the list @code{(rose violet buttercup)} has three elements,
-@samp{rose}, @samp{violet}, and @samp{buttercup}.  In the computer, the
-electronic address of @samp{rose} is recorded in a segment of computer
-memory along with the address that gives the electronic address of where
-the atom @samp{violet} is located; and that address (the one that tells
-where @samp{violet} is located) is kept along with an address that tells
-where the address for the atom @samp{buttercup} is located.
-
-@need 1200
-This sounds more complicated than it is and is easier seen in a diagram:
-
-@c clear print-postscript-figures
-@c !!! cons-cell-diagram #1
-@ifnottex
-@smallexample
-@group
-    ___ ___      ___ ___      ___ ___
-   |___|___|--> |___|___|--> |___|___|--> nil
-     |            |            |
-     |            |            |
-      --> rose     --> violet   --> buttercup
-@end group
-@end smallexample
-@end ifnottex
-@ifset print-postscript-figures
-@sp 1
-@tex
-@center @image{cons-1}
-%%%% old method of including an image
-% \input /usr/local/lib/tex/inputs/psfig.tex
-% \centerline{\psfig{figure=/usr/local/lib/emacs/man/cons-1.eps}}
-% \catcode`\@=0 %
-@end tex
-@sp 1
-@end ifset
-@ifclear print-postscript-figures
-@iftex
-@smallexample
-@group
-    ___ ___      ___ ___      ___ ___
-   |___|___|--> |___|___|--> |___|___|--> nil
-     |            |            |
-     |            |            |
-      --> rose     --> violet   --> buttercup
-@end group
-@end smallexample
-@end iftex
-@end ifclear
-
-@noindent
-In the diagram, each box represents a word of computer memory that
-holds a Lisp object, usually in the form of a memory address.  The boxes,
-i.e.@: the addresses, are in pairs.  Each arrow points to what the address
-is the address of, either an atom or another pair of addresses.  The
-first box is the electronic address of @samp{rose} and the arrow points
-to @samp{rose}; the second box is the address of the next pair of boxes,
-the first part of which is the address of @samp{violet} and the second
-part of which is the address of the next pair.  The very last box
-points to the symbol @code{nil}, which marks the end of the list.
-
-@need 1200
-When a variable is set to a list with a function such as @code{setq},
-it stores the address of the first box in the variable.  Thus,
-evaluation of the expression
-
-@smallexample
-(setq bouquet '(rose violet buttercup))
-@end smallexample
-
-@need 1250
-@noindent
-creates a situation like this:
-
-@c cons-cell-diagram #2
-@ifnottex
-@smallexample
-@group
-bouquet
-     |
-     |     ___ ___      ___ ___      ___ ___
-      --> |___|___|--> |___|___|--> |___|___|--> nil
-            |            |            |
-            |            |            |
-             --> rose     --> violet   --> buttercup
-@end group
-@end smallexample
-@end ifnottex
-@ifset print-postscript-figures
-@sp 1
-@tex
-@center @image{cons-2}
-%%%% old method of including an image
-% \input /usr/local/lib/tex/inputs/psfig.tex
-% \centerline{\psfig{figure=/usr/local/lib/emacs/man/cons-2.eps}}
-% \catcode`\@=0 %
-@end tex
-@sp 1
-@end ifset
-@ifclear print-postscript-figures
-@iftex
-@smallexample
-@group
-bouquet
-     |
-     |     ___ ___      ___ ___      ___ ___
-      --> |___|___|--> |___|___|--> |___|___|--> nil
-            |            |            |
-            |            |            |
-             --> rose     --> violet   --> buttercup
-@end group
-@end smallexample
-@end iftex
-@end ifclear
-
-@noindent
-In this example, the symbol @code{bouquet} holds the address of the first
-pair of boxes.
-
-@need 1200
-This same list can be illustrated in a different sort of box notation
-like this:
-
-@c cons-cell-diagram #2a
-@ifnottex
-@smallexample
-@group
-bouquet
- |
- |    --------------       ---------------       ----------------
- |   | car   | cdr  |     | car    | cdr  |     | car     | cdr  |
-  -->| rose  |   o------->| violet |   o------->| butter- |  nil |
-     |       |      |     |        |      |     | cup     |      |
-      --------------       ---------------       ----------------
-@end group
-@end smallexample
-@end ifnottex
-@ifset print-postscript-figures
-@sp 1
-@tex
-@center @image{cons-2a}
-%%%% old method of including an image
-% \input /usr/local/lib/tex/inputs/psfig.tex
-% \centerline{\psfig{figure=/usr/local/lib/emacs/man/cons-2a.eps}}
-% \catcode`\@=0 %
-@end tex
-@sp 1
-@end ifset
-@ifclear print-postscript-figures
-@iftex
-@smallexample
-@group
-bouquet
- |
- |    --------------       ---------------       ----------------
- |   | car   | cdr  |     | car    | cdr  |     | car     | cdr  |
-  -->| rose  |   o------->| violet |   o------->| butter- |  nil |
-     |       |      |     |        |      |     | cup     |      |
-      --------------       ---------------       ----------------
-@end group
-@end smallexample
-@end iftex
-@end ifclear
-
-(Symbols consist of more than pairs of addresses, but the structure of
-a symbol is made up of addresses.  Indeed, the symbol @code{bouquet}
-consists of a group of address-boxes, one of which is the address of
-the printed word @samp{bouquet}, a second of which is the address of a
-function definition attached to the symbol, if any, a third of which
-is the address of the first pair of address-boxes for the list
-@code{(rose violet buttercup)}, and so on.  Here we are showing that
-the symbol's third address-box points to the first pair of
-address-boxes for the list.)
-
-If a symbol is set to the @sc{cdr} of a list, the list itself is not
-changed; the symbol simply has an address further down the list.  (In
-the jargon, @sc{car} and @sc{cdr} are `non-destructive'.)  Thus,
-evaluation of the following expression
-
-@smallexample
-(setq flowers (cdr bouquet))
-@end smallexample
-
-@need 800
-@noindent
-produces this:
-
-@c cons-cell-diagram #3
-@ifnottex
-@sp 1
-@smallexample
-@group
-bouquet        flowers
-  |              |
-  |     ___ ___  |     ___ ___      ___ ___
-   --> |   |   |  --> |   |   |    |   |   |
-       |___|___|----> |___|___|--> |___|___|--> nil
-         |              |            |
-         |              |            |
-          --> rose       --> violet   --> buttercup
-@end group
-@end smallexample
-@sp 1
-@end ifnottex
-@ifset print-postscript-figures
-@sp 1
-@tex
-@center @image{cons-3}
-%%%% old method of including an image
-% \input /usr/local/lib/tex/inputs/psfig.tex
-% \centerline{\psfig{figure=/usr/local/lib/emacs/man/cons-3.eps}}
-% \catcode`\@=0 %
-@end tex
-@sp 1
-@end ifset
-@ifclear print-postscript-figures
-@iftex
-@sp 1
-@smallexample
-@group
-bouquet        flowers
-  |              |
-  |     ___ ___  |     ___ ___      ___ ___
-   --> |   |   |  --> |   |   |    |   |   |
-       |___|___|----> |___|___|--> |___|___|--> nil
-         |              |            |
-         |              |            |
-          --> rose       --> violet   --> buttercup
-@end group
-@end smallexample
-@sp 1
-@end iftex
-@end ifclear
-
-@noindent
-The value of @code{flowers} is @code{(violet buttercup)}, which is
-to say, the symbol @code{flowers} holds the address of the pair of
-address-boxes, the first of which holds the address of @code{violet},
-and the second of which holds the address of @code{buttercup}.
-
-A pair of address-boxes is called a @dfn{cons cell} or @dfn{dotted
-pair}.  @xref{Cons Cell Type, , Cons Cell and List Types, elisp, The GNU Emacs Lisp
-Reference Manual}, and @ref{Dotted Pair Notation, , Dotted Pair
-Notation, elisp, The GNU Emacs Lisp Reference Manual}, for more
-information about cons cells and dotted pairs.
-
-@need 1200
-The function @code{cons} adds a new pair of addresses to the front of
-a series of addresses like that shown above.  For example, evaluating
-the expression
-
-@smallexample
-(setq bouquet (cons 'lily bouquet))
-@end smallexample
-
-@need 1500
-@noindent
-produces:
-
-@c cons-cell-diagram #4
-@ifnottex
-@sp 1
-@smallexample
-@group
-bouquet                       flowers
-  |                             |
-  |     ___ ___        ___ ___  |     ___ ___       ___ ___
-   --> |   |   |      |   |   |  --> |   |   |     |   |   |
-       |___|___|----> |___|___|----> |___|___|---->|___|___|--> nil
-         |              |              |             |
-         |              |              |             |
-          --> lily      --> rose       --> violet    --> buttercup
-@end group
-@end smallexample
-@sp 1
-@end ifnottex
-@ifset print-postscript-figures
-@sp 1
-@tex
-@center @image{cons-4}
-%%%% old method of including an image
-% \input /usr/local/lib/tex/inputs/psfig.tex
-% \centerline{\psfig{figure=/usr/local/lib/emacs/man/cons-4.eps}}
-% \catcode`\@=0 %
-@end tex
-@sp 1
-@end ifset
-@ifclear print-postscript-figures
-@iftex
-@sp 1
-@smallexample
-@group
-bouquet                       flowers
-  |                             |
-  |     ___ ___        ___ ___  |     ___ ___       ___ ___
-   --> |   |   |      |   |   |  --> |   |   |     |   |   |
-       |___|___|----> |___|___|----> |___|___|---->|___|___|--> nil
-         |              |              |             |
-         |              |              |             |
-          --> lily      --> rose       --> violet    --> buttercup
-@end group
-@end smallexample
-@sp 1
-@end iftex
-@end ifclear
-
-@need 1200
-@noindent
-However, this does not change the value of the symbol
-@code{flowers}, as you can see by evaluating the following,
-
-@smallexample
-(eq (cdr (cdr bouquet)) flowers)
-@end smallexample
-
-@noindent
-which returns @code{t} for true.
-
-Until it is reset, @code{flowers} still has the value
-@code{(violet buttercup)}; that is, it has the address of the cons
-cell whose first address is of @code{violet}.  Also, this does not
-alter any of the pre-existing cons cells; they are all still there.
-
-Thus, in Lisp, to get the @sc{cdr} of a list, you just get the address
-of the next cons cell in the series; to get the @sc{car} of a list,
-you get the address of the first element of the list; to @code{cons} a
-new element on a list, you add a new cons cell to the front of the list.
-That is all there is to it!  The underlying structure of Lisp is
-brilliantly simple!
-
-And what does the last address in a series of cons cells refer to?  It
-is the address of the empty list, of @code{nil}.
-
-In summary, when a Lisp variable is set to a value, it is provided with
-the address of the list to which the variable refers.
-
-@node Symbols as Chest, List Exercise, Lists diagrammed, List Implementation
-@section Symbols as a Chest of Drawers
-@cindex Symbols as a Chest of Drawers
-@cindex Chest of Drawers, metaphor for a symbol
-@cindex Drawers, Chest of, metaphor for a symbol
-
-In an earlier section, I suggested that you might imagine a symbol as
-being a chest of drawers.  The function definition is put in one
-drawer, the value in another, and so on.  What is put in the drawer
-holding the value can be changed without affecting the contents of the
-drawer holding the function definition, and vice-verse.
-
-Actually, what is put in each drawer is the address of the value or
-function definition.  It is as if you found an old chest in the attic,
-and in one of its drawers you found a map giving you directions to
-where the buried treasure lies.
-
-(In addition to its name, symbol definition, and variable value, a
-symbol has a `drawer' for a @dfn{property list} which can be used to
-record other information.  Property lists are not discussed here; see
-@ref{Property Lists, , Property Lists, elisp, The GNU Emacs Lisp
-Reference Manual}.)
-
-@need 1500
-Here is a fanciful representation:
-
-@c chest-of-drawers diagram
-@ifnottex
-@sp 1
-@smallexample
-@group
-            Chest of Drawers            Contents of Drawers
-
-            __   o0O0o   __
-          /                 \
-         ---------------------
-        |    directions to    |            [map to]
-        |     symbol name     |             bouquet
-        |                     |
-        +---------------------+
-        |    directions to    |
-        |  symbol definition  |             [none]
-        |                     |
-        +---------------------+
-        |    directions to    |            [map to]
-        |    variable value   |             (rose violet buttercup)
-        |                     |
-        +---------------------+
-        |    directions to    |
-        |    property list    |             [not described here]
-        |                     |
-        +---------------------+
-        |/                   \|
-@end group
-@end smallexample
-@sp 1
-@end ifnottex
-@ifset print-postscript-figures
-@sp 1
-@tex
-@center @image{drawers}
-%%%% old method of including an image
-% \input /usr/local/lib/tex/inputs/psfig.tex
-% \centerline{\psfig{figure=/usr/local/lib/emacs/man/drawers.eps}}
-% \catcode`\@=0 %
-@end tex
-@sp 1
-@end ifset
-@ifclear print-postscript-figures
-@iftex
-@sp 1
-@smallexample
-@group
-            Chest of Drawers            Contents of Drawers
-
-            __   o0O0o   __
-          /                 \
-         ---------------------
-        |    directions to    |            [map to]
-        |     symbol name     |             bouquet
-        |                     |
-        +---------------------+
-        |    directions to    |
-        |  symbol definition  |             [none]
-        |                     |
-        +---------------------+
-        |    directions to    |            [map to]
-        |    variable value   |             (rose violet buttercup)
-        |                     |
-        +---------------------+
-        |    directions to    |
-        |    property list    |             [not described here]
-        |                     |
-        +---------------------+
-        |/                   \|
-@end group
-@end smallexample
-@sp 1
-@end iftex
-@end ifclear
-
-@node List Exercise,  , Symbols as Chest, List Implementation
-@section Exercise
-
-Set @code{flowers} to @code{violet} and @code{buttercup}.  Cons two
-more flowers on to this list and set this new list to
-@code{more-flowers}.  Set the @sc{car} of @code{flowers} to a fish.
-What does the @code{more-flowers} list now contain?
-
-@node Yanking, Loops & Recursion, List Implementation, Top
-@comment  node-name,  next,  previous,  up
-@chapter Yanking Text Back
-@findex yank
-@cindex Text retrieval
-@cindex Retrieving text
-@cindex Pasting text
-
-Whenever you cut text out of a buffer with a `kill' command in GNU Emacs,
-you can bring it back with a `yank' command.  The text that is cut out of
-the buffer is put in the kill ring and the yank commands insert the
-appropriate contents of the kill ring back into a buffer (not necessarily
-the original buffer).
-
-A simple @kbd{C-y} (@code{yank}) command inserts the first item from
-the kill ring into the current buffer.  If the @kbd{C-y} command is
-followed immediately by @kbd{M-y}, the first element is replaced by
-the second element.  Successive @kbd{M-y} commands replace the second
-element with the third, fourth, or fifth element, and so on.  When the
-last element in the kill ring is reached, it is replaced by the first
-element and the cycle is repeated.  (Thus the kill ring is called a
-`ring' rather than just a `list'.  However, the actual data structure
-that holds the text is a list.
-@xref{Kill Ring, , Handling the Kill Ring}, for the details of how the
-list is handled as a ring.)
-
-@menu
-* Kill Ring Overview::
-* kill-ring-yank-pointer::      The kill ring is a list.
-* yank nthcdr Exercises::       The @code{kill-ring-yank-pointer} variable.
-@end menu
-
-@node Kill Ring Overview, kill-ring-yank-pointer, Yanking, Yanking
-@comment  node-name,  next,  previous,  up
-@section Kill Ring Overview
-@cindex Kill ring overview
-
-The kill ring is a list of textual strings.  This is what it looks like:
-
-@smallexample
-("some text" "a different piece of text" "yet more text")
-@end smallexample
-
-If this were the contents of my kill ring and I pressed @kbd{C-y}, the
-string of characters saying @samp{some text} would be inserted in this
-buffer where my cursor is located.
-
-The @code{yank} command is also used for duplicating text by copying it.
-The copied text is not cut from the buffer, but a copy of it is put on the
-kill ring and is inserted by yanking it back.
-
-Three functions are used for bringing text back from the kill ring:
-@code{yank}, which is usually bound to @kbd{C-y}; @code{yank-pop},
-which is usually bound to @kbd{M-y}; and @code{rotate-yank-pointer},
-which is used by the two other functions.
-
-These functions refer to the kill ring through a variable called the
-@code{kill-ring-yank-pointer}.  Indeed, the insertion code for both the
-@code{yank} and @code{yank-pop} functions is:
-
-@smallexample
-(insert (car kill-ring-yank-pointer))
-@end smallexample
-
-@noindent
-(Well, no more.  In GNU Emacs 22, the function has been replaced by
-@code{insert-for-yank} which calls @code{insert-for-yank-1}
-repetitively for each @code{yank-handler} segment.  In turn,
-@code{insert-for-yank-1} strips text properties from the inserted text
-according to @code{yank-excluded-properties}.  Otherwise, it is just
-like @code{insert}.  We will stick with plain @code{insert} since it
-is easier to understand.)
-
-To begin to understand how @code{yank} and @code{yank-pop} work, it is
-first necessary to look at the @code{kill-ring-yank-pointer} variable.
-
-@node kill-ring-yank-pointer, yank nthcdr Exercises, Kill Ring Overview, Yanking
-@comment  node-name,  next,  previous,  up
-@section The @code{kill-ring-yank-pointer} Variable
-
-@code{kill-ring-yank-pointer} is a variable, just as @code{kill-ring} is
-a variable.  It points to something by being bound to the value of what
-it points to, like any other Lisp variable.
-
-@need 1000
-Thus, if the value of the kill ring is:
-
-@smallexample
-("some text" "a different piece of text" "yet more text")
-@end smallexample
-
-@need 1250
-@noindent
-and the @code{kill-ring-yank-pointer} points to the second clause, the
-value of @code{kill-ring-yank-pointer} is:
-
-@smallexample
-("a different piece of text" "yet more text")
-@end smallexample
-
-As explained in the previous chapter (@pxref{List Implementation}), the
-computer does not keep two different copies of the text being pointed to
-by both the @code{kill-ring} and the @code{kill-ring-yank-pointer}.  The
-words ``a different piece of text'' and ``yet more text'' are not
-duplicated.  Instead, the two Lisp variables point to the same pieces of
-text.  Here is a diagram:
-
-@c cons-cell-diagram #5
-@ifnottex
-@smallexample
-@group
-kill-ring     kill-ring-yank-pointer
-    |               |
-    |      ___ ___  |     ___ ___      ___ ___
-     ---> |   |   |  --> |   |   |    |   |   |
-          |___|___|----> |___|___|--> |___|___|--> nil
-            |              |            |
-            |              |            |
-            |              |             --> "yet more text"
-            |              |
-            |               --> "a different piece of text"
-            |
-             --> "some text"
-@end group
-@end smallexample
-@sp 1
-@end ifnottex
-@ifset print-postscript-figures
-@sp 1
-@tex
-@center @image{cons-5}
-%%%% old method of including an image
-% \input /usr/local/lib/tex/inputs/psfig.tex
-% \centerline{\psfig{figure=/usr/local/lib/emacs/man/cons-5.eps}}
-% \catcode`\@=0 %
-@end tex
-@sp 1
-@end ifset
-@ifclear print-postscript-figures
-@iftex
-@smallexample
-@group
-kill-ring     kill-ring-yank-pointer
-    |               |
-    |      ___ ___  |     ___ ___      ___ ___
-     ---> |   |   |  --> |   |   |    |   |   |
-          |___|___|----> |___|___|--> |___|___|--> nil
-            |              |            |
-            |              |            |
-            |              |             --> "yet more text"
-            |              |
-            |               --> "a different piece of text
-            |
-             --> "some text"
-@end group
-@end smallexample
-@sp 1
-@end iftex
-@end ifclear
-
-Both the variable @code{kill-ring} and the variable
-@code{kill-ring-yank-pointer} are pointers.  But the kill ring itself is
-usually described as if it were actually what it is composed of.  The
-@code{kill-ring} is spoken of as if it were the list rather than that it
-points to the list.  Conversely, the @code{kill-ring-yank-pointer} is
-spoken of as pointing to a list.
-
-These two ways of talking about the same thing sound confusing at first but
-make sense on reflection.  The kill ring is generally thought of as the
-complete structure of data that holds the information of what has recently
-been cut out of the Emacs buffers.  The @code{kill-ring-yank-pointer}
-on the other hand, serves to indicate---that is, to `point to'---that part
-of the kill ring of which the first element (the @sc{car}) will be
-inserted.
-
-@ignore
-In GNU Emacs 22, the @code{kill-new} function calls
-
-@code{(setq kill-ring-yank-pointer kill-ring)}
-
-(defun rotate-yank-pointer (arg)
-  "Rotate the yanking point in the kill ring.
-With argument, rotate that many kills forward (or backward, if negative)."
-  (interactive "p")
-  (current-kill arg))
-
-(defun current-kill (n &optional do-not-move)
-  "Rotate the yanking point by N places, and then return that kill.
-If N is zero, `interprogram-paste-function' is set, and calling it
-returns a string, then that string is added to the front of the
-kill ring and returned as the latest kill.
-If optional arg DO-NOT-MOVE is non-nil, then don't actually move the
-yanking point; just return the Nth kill forward."
-  (let ((interprogram-paste (and (= n 0)
-                                 interprogram-paste-function
-                                 (funcall interprogram-paste-function))))
-    (if interprogram-paste
-        (progn
-          ;; Disable the interprogram cut function when we add the new
-          ;; text to the kill ring, so Emacs doesn't try to own the
-          ;; selection, with identical text.
-          (let ((interprogram-cut-function nil))
-            (kill-new interprogram-paste))
-          interprogram-paste)
-      (or kill-ring (error "Kill ring is empty"))
-      (let ((ARGth-kill-element
-             (nthcdr (mod (- n (length kill-ring-yank-pointer))
-                          (length kill-ring))
-                     kill-ring)))
-        (or do-not-move
-            (setq kill-ring-yank-pointer ARGth-kill-element))
-        (car ARGth-kill-element)))))
-
-@end ignore
-
-@need 1500
-@node yank nthcdr Exercises,  , kill-ring-yank-pointer, Yanking
-@section Exercises with @code{yank} and @code{nthcdr}
-
-@itemize @bullet
-@item
-Using @kbd{C-h v} (@code{describe-variable}), look at the value of
-your kill ring.  Add several items to your kill ring; look at its
-value again.  Using @kbd{M-y} (@code{yank-pop)}, move all the way
-around the kill ring.  How many items were in your kill ring?  Find
-the value of @code{kill-ring-max}.  Was your kill ring full, or could
-you have kept more blocks of text within it?
-
-@item
-Using @code{nthcdr} and @code{car}, construct a series of expressions
-to return the first, second, third, and fourth elements of a list.
-@end itemize
-
-@node Loops & Recursion, Regexp Search, Yanking, Top
-@comment  node-name,  next,  previous,  up
-@chapter Loops and Recursion
-@cindex Loops and recursion
-@cindex Recursion and loops
-@cindex Repetition (loops)
-
-Emacs Lisp has two primary ways to cause an expression, or a series of
-expressions, to be evaluated repeatedly: one uses a @code{while}
-loop, and the other uses @dfn{recursion}.
-
-Repetition can be very valuable.  For example, to move forward four
-sentences, you need only write a program that will move forward one
-sentence and then repeat the process four times.  Since a computer does
-not get bored or tired, such repetitive action does not have the
-deleterious effects that excessive or the wrong kinds of repetition can
-have on humans.
-
-People mostly write Emacs Lisp functions using @code{while} loops and
-their kin; but you can use recursion, which provides a very powerful
-way to think about and then to solve problems@footnote{You can write
-recursive functions to be frugal or wasteful of mental or computer
-resources; as it happens, methods that people find easy---that are
-frugal of `mental resources'---sometimes use considerable computer
-resources.  Emacs was designed to run on machines that we now consider
-limited and its default settings are conservative.  You may want to
-increase the values of @code{max-specpdl-size} and
-@code{max-lisp-eval-depth}.  In my @file{.emacs} file, I set them to
-15 and 30 times their default value.}.
-
-@menu
-* while::                       Causing a stretch of code to repeat.
-* dolist dotimes::
-* Recursion::                   Causing a function to call itself.
-* Looping exercise::
-@end menu
-
-@node while, dolist dotimes, Loops & Recursion, Loops & Recursion
-@comment  node-name,  next,  previous,  up
-@section @code{while}
-@cindex Loops
-@findex while
-
-The @code{while} special form tests whether the value returned by
-evaluating its first argument is true or false.  This is similar to what
-the Lisp interpreter does with an @code{if}; what the interpreter does
-next, however, is different.
-
-In a @code{while} expression, if the value returned by evaluating the
-first argument is false, the Lisp interpreter skips the rest of the
-expression (the @dfn{body} of the expression) and does not evaluate it.
-However, if the value is true, the Lisp interpreter evaluates the body
-of the expression and then again tests whether the first argument to
-@code{while} is true or false.  If the value returned by evaluating the
-first argument is again true, the Lisp interpreter again evaluates the
-body of the expression.
-
-@need 1200
-The template for a @code{while} expression looks like this:
-
-@smallexample
-@group
-(while @var{true-or-false-test}
-  @var{body}@dots{})
-@end group
-@end smallexample
-
-@menu
-* Looping with while::          Repeat so long as test returns true.
-* Loop Example::                A @code{while} loop that uses a list.
-* print-elements-of-list::      Uses @code{while}, @code{car}, @code{cdr}.
-* Incrementing Loop::           A loop with an incrementing counter.
-* Incrementing Loop Details::
-* Decrementing Loop::           A loop with a decrementing counter.
-@end menu
-
-@node Looping with while, Loop Example, while, while
-@ifnottex
-@unnumberedsubsec Looping with @code{while}
-@end ifnottex
-
-So long as the true-or-false-test of the @code{while} expression
-returns a true value when it is evaluated, the body is repeatedly
-evaluated.  This process is called a loop since the Lisp interpreter
-repeats the same thing again and again, like an airplane doing a loop.
-When the result of evaluating the true-or-false-test is false, the
-Lisp interpreter does not evaluate the rest of the @code{while}
-expression and `exits the loop'.
-
-Clearly, if the value returned by evaluating the first argument to
-@code{while} is always true, the body following will be evaluated
-again and again @dots{} and again @dots{} forever.  Conversely, if the
-value returned is never true, the expressions in the body will never
-be evaluated.  The craft of writing a @code{while} loop consists of
-choosing a mechanism such that the true-or-false-test returns true
-just the number of times that you want the subsequent expressions to
-be evaluated, and then have the test return false.
-
-The value returned by evaluating a @code{while} is the value of the
-true-or-false-test.  An interesting consequence of this is that a
-@code{while} loop that evaluates without error will return @code{nil}
-or false regardless of whether it has looped 1 or 100 times or none at
-all.  A @code{while} expression that evaluates successfully never
-returns a true value!  What this means is that @code{while} is always
-evaluated for its side effects, which is to say, the consequences of
-evaluating the expressions within the body of the @code{while} loop.
-This makes sense.  It is not the mere act of looping that is desired,
-but the consequences of what happens when the expressions in the loop
-are repeatedly evaluated.
-
-@node Loop Example, print-elements-of-list, Looping with while, while
-@comment  node-name,  next,  previous,  up
-@subsection A @code{while} Loop and a List
-
-A common way to control a @code{while} loop is to test whether a list
-has any elements.  If it does, the loop is repeated; but if it does not,
-the repetition is ended.  Since this is an important technique, we will
-create a short example to illustrate it.
-
-A simple way to test whether a list has elements is to evaluate the
-list: if it has no elements, it is an empty list and will return the
-empty list, @code{()}, which is a synonym for @code{nil} or false.  On
-the other hand, a list with elements will return those elements when it
-is evaluated.  Since Emacs Lisp considers as true any value that is not
-@code{nil}, a list that returns elements will test true in a
-@code{while} loop.
-
-@need 1200
-For example, you can set the variable @code{empty-list} to @code{nil} by
-evaluating the following @code{setq} expression:
-
-@smallexample
-(setq empty-list ())
-@end smallexample
-
-@noindent
-After evaluating the @code{setq} expression, you can evaluate the
-variable @code{empty-list} in the usual way, by placing the cursor after
-the symbol and typing @kbd{C-x C-e}; @code{nil} will appear in your
-echo area:
-
-@smallexample
-empty-list
-@end smallexample
-
-On the other hand, if you set a variable to be a list with elements, the
-list will appear when you evaluate the variable, as you can see by
-evaluating the following two expressions:
-
-@smallexample
-@group
-(setq animals '(gazelle giraffe lion tiger))
-
-animals
-@end group
-@end smallexample
-
-Thus, to create a @code{while} loop that tests whether there are any
-items in the list @code{animals}, the first part of the loop will be
-written like this:
-
-@smallexample
-@group
-(while animals
-       @dots{}
-@end group
-@end smallexample
-
-@noindent
-When the @code{while} tests its first argument, the variable
-@code{animals} is evaluated.  It returns a list.  So long as the list
-has elements, the @code{while} considers the results of the test to be
-true; but when the list is empty, it considers the results of the test
-to be false.
-
-To prevent the @code{while} loop from running forever, some mechanism
-needs to be provided to empty the list eventually.  An oft-used
-technique is to have one of the subsequent forms in the @code{while}
-expression set the value of the list to be the @sc{cdr} of the list.
-Each time the @code{cdr} function is evaluated, the list will be made
-shorter, until eventually only the empty list will be left.  At this
-point, the test of the @code{while} loop will return false, and the
-arguments to the @code{while} will no longer be evaluated.
-
-For example, the list of animals bound to the variable @code{animals}
-can be set to be the @sc{cdr} of the original list with the
-following expression:
-
-@smallexample
-(setq animals (cdr animals))
-@end smallexample
-
-@noindent
-If you have evaluated the previous expressions and then evaluate this
-expression, you will see @code{(giraffe lion tiger)} appear in the echo
-area.  If you evaluate the expression again, @code{(lion tiger)} will
-appear in the echo area.  If you evaluate it again and yet again,
-@code{(tiger)} appears and then the empty list, shown by @code{nil}.
-
-A template for a @code{while} loop that uses the @code{cdr} function
-repeatedly to cause the true-or-false-test eventually to test false
-looks like this:
-
-@smallexample
-@group
-(while @var{test-whether-list-is-empty}
-  @var{body}@dots{}
-  @var{set-list-to-cdr-of-list})
-@end group
-@end smallexample
-
-This test and use of @code{cdr} can be put together in a function that
-goes through a list and prints each element of the list on a line of its
-own.
-
-@node print-elements-of-list, Incrementing Loop, Loop Example, while
-@subsection An Example: @code{print-elements-of-list}
-@findex print-elements-of-list
-
-The @code{print-elements-of-list} function illustrates a @code{while}
-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.
-
-If you are using an earlier version of Emacs, you need to copy the
-necessary expressions to your @file{*scratch*} buffer and evaluate
-them there.  This is because the echo area had only one line in the
-earlier versions.
-
-You can copy the expressions by marking the beginning of the region
-with @kbd{C-@key{SPC}} (@code{set-mark-command}), moving the cursor to
-the end of the region and then copying the region using @kbd{M-w}
-(@code{kill-ring-save}, which calls @code{copy-region-as-kill} and
-then provides visual feedback).  In the @file{*scratch*}
-buffer, you can yank the expressions back by typing @kbd{C-y}
-(@code{yank}).
-
-After you have copied the expressions to the @file{*scratch*} buffer,
-evaluate each expression in turn.  Be sure to evaluate the last
-expression, @code{(print-elements-of-list animals)}, by typing
-@kbd{C-u C-x C-e}, that is, by giving an argument to
-@code{eval-last-sexp}.  This will cause the result of the evaluation
-to be printed in the @file{*scratch*} buffer instead of being printed
-in the echo area.  (Otherwise you will see something like this in your
-echo area: @code{^Jgazelle^J^Jgiraffe^J^Jlion^J^Jtiger^Jnil}, in which
-each @samp{^J} stands for a `newline'.)
-
-@need 1500
-In a recent instance of GNU Emacs, you can evaluate these expressions
-directly in the Info buffer, and the echo area will grow to show the
-results.
-
-@smallexample
-@group
-(setq animals '(gazelle giraffe lion tiger))
-
-(defun print-elements-of-list (list)
-  "Print each element of LIST on a line of its own."
-  (while list
-    (print (car list))
-    (setq list (cdr list))))
-
-(print-elements-of-list animals)
-@end group
-@end smallexample
-
-@need 1200
-@noindent
-When you evaluate the three expressions in sequence, you will see
-this:
-
-@smallexample
-@group
-gazelle
-
-giraffe
-
-lion
-
-tiger
-nil
-@end group
-@end smallexample
-
-Each element of the list is printed on a line of its own (that is what
-the function @code{print} does) and then the value returned by the
-function is printed.  Since the last expression in the function is the
-@code{while} loop, and since @code{while} loops always return
-@code{nil}, a @code{nil} is printed after the last element of the list.
-
-@node Incrementing Loop, Incrementing Loop Details, print-elements-of-list, while
-@comment  node-name,  next,  previous,  up
-@subsection A Loop with an Incrementing Counter
-
-A loop is not useful unless it stops when it ought.  Besides
-controlling a loop with a list, a common way of stopping a loop is to
-write the first argument as a test that returns false when the correct
-number of repetitions are complete.  This means that the loop must
-have a counter---an expression that counts how many times the loop
-repeats itself.
-
-@node Incrementing Loop Details, Decrementing Loop, Incrementing Loop, while
-@ifnottex
-@unnumberedsubsec Details of an Incrementing Loop
-@end ifnottex
-
-The test for a loop with an incrementing counter can be an expression
-such as @code{(< count desired-number)} which returns @code{t} for
-true if the value of @code{count} is less than the
-@code{desired-number} of repetitions and @code{nil} for false if the
-value of @code{count} is equal to or is greater than the
-@code{desired-number}.  The expression that increments the count can
-be a simple @code{setq} such as @code{(setq count (1+ count))}, where
-@code{1+} is a built-in function in Emacs Lisp that adds 1 to its
-argument.  (The expression @w{@code{(1+ count)}} has the same result
-as @w{@code{(+ count 1)}}, but is easier for a human to read.)
-
-@need 1250
-The template for a @code{while} loop controlled by an incrementing
-counter looks like this:
-
-@smallexample
-@group
-@var{set-count-to-initial-value}
-(while (< count desired-number)         ; @r{true-or-false-test}
-  @var{body}@dots{}
-  (setq count (1+ count)))              ; @r{incrementer}
-@end group
-@end smallexample
-
-@noindent
-Note that you need to set the initial value of @code{count}; usually it
-is set to 1.
-
-@menu
-* Incrementing Example::        Counting pebbles in a triangle.
-* Inc Example parts::           The parts of the function definition.
-* Inc Example altogether::      Putting the function definition together.
-@end menu
-
-@node Incrementing Example, Inc Example parts, Incrementing Loop Details, Incrementing Loop Details
-@unnumberedsubsubsec  Example with incrementing counter
-
-Suppose you are playing on the beach and decide to make a triangle of
-pebbles, putting one pebble in the first row, two in the second row,
-three in the third row and so on, like this:
-
-@sp 1
-@c pebble diagram
-@ifnottex
-@smallexample
-@group
-               *
-              * *
-             * * *
-            * * * *
-@end group
-@end smallexample
-@end ifnottex
-@iftex
-@smallexample
-@group
-               @bullet{}
-              @bullet{} @bullet{}
-             @bullet{} @bullet{} @bullet{}
-            @bullet{} @bullet{} @bullet{} @bullet{}
-@end group
-@end smallexample
-@end iftex
-@sp 1
-
-@noindent
-(About 2500 years ago, Pythagoras and others developed the beginnings of
-number theory by considering questions such as this.)
-
-Suppose you want to know how many pebbles you will need to make a
-triangle with 7 rows?
-
-Clearly, what you need to do is add up the numbers from 1 to 7.  There
-are two ways to do this; start with the smallest number, one, and add up
-the list in sequence, 1, 2, 3, 4 and so on; or start with the largest
-number and add the list going down: 7, 6, 5, 4 and so on.  Because both
-mechanisms illustrate common ways of writing @code{while} loops, we will
-create two examples, one counting up and the other counting down.  In
-this first example, we will start with 1 and add 2, 3, 4 and so on.
-
-If you are just adding up a short list of numbers, the easiest way to do
-it is to add up all the numbers at once.  However, if you do not know
-ahead of time how many numbers your list will have, or if you want to be
-prepared for a very long list, then you need to design your addition so
-that what you do is repeat a simple process many times instead of doing
-a more complex process once.
-
-For example, instead of adding up all the pebbles all at once, what you
-can do is add the number of pebbles in the first row, 1, to the number
-in the second row, 2, and then add the total of those two rows to the
-third row, 3.  Then you can add the number in the fourth row, 4, to the
-total of the first three rows; and so on.
-
-The critical characteristic of the process is that each repetitive
-action is simple.  In this case, at each step we add only two numbers,
-the number of pebbles in the row and the total already found.  This
-process of adding two numbers is repeated again and again until the last
-row has been added to the total of all the preceding rows.  In a more
-complex loop the repetitive action might not be so simple, but it will
-be simpler than doing everything all at once.
-
-@node Inc Example parts, Inc Example altogether, Incrementing Example, Incrementing Loop Details
-@unnumberedsubsubsec The parts of the function definition
-
-The preceding analysis gives us the bones of our function definition:
-first, we will need a variable that we can call @code{total} that will
-be the total number of pebbles.  This will be the value returned by
-the function.
-
-Second, we know that the function will require an argument: this
-argument will be the total number of rows in the triangle.  It can be
-called @code{number-of-rows}.
-
-Finally, we need a variable to use as a counter.  We could call this
-variable @code{counter}, but a better name is @code{row-number}.  That
-is because what the counter does in this function is count rows, and a
-program should be written to be as understandable as possible.
-
-When the Lisp interpreter first starts evaluating the expressions in the
-function, the value of @code{total} should be set to zero, since we have
-not added anything to it.  Then the function should add the number of
-pebbles in the first row to the total, and then add the number of
-pebbles in the second to the total, and then add the number of
-pebbles in the third row to the total, and so on, until there are no
-more rows left to add.
-
-Both @code{total} and @code{row-number} are used only inside the
-function, so they can be declared as local variables with @code{let}
-and given initial values.  Clearly, the initial value for @code{total}
-should be 0.  The initial value of @code{row-number} should be 1,
-since we start with the first row.  This means that the @code{let}
-statement will look like this:
-
-@smallexample
-@group
-  (let ((total 0)
-        (row-number 1))
-    @var{body}@dots{})
-@end group
-@end smallexample
-
-After the internal variables are declared and bound to their initial
-values, we can begin the @code{while} loop.  The expression that serves
-as the test should return a value of @code{t} for true so long as the
-@code{row-number} is less than or equal to the @code{number-of-rows}.
-(If the expression tests true only so long as the row number is less
-than the number of rows in the triangle, the last row will never be
-added to the total; hence the row number has to be either less than or
-equal to the number of rows.)
-
-@need 1500
-@findex <= @r{(less than or equal)}
-Lisp provides the @code{<=} function that returns true if the value of
-its first argument is less than or equal to the value of its second
-argument and false otherwise.  So the expression that the @code{while}
-will evaluate as its test should look like this:
-
-@smallexample
-(<= row-number number-of-rows)
-@end smallexample
-
-The total number of pebbles can be found by repeatedly adding the number
-of pebbles in a row to the total already found.  Since the number of
-pebbles in the row is equal to the row number, the total can be found by
-adding the row number to the total.  (Clearly, in a more complex
-situation, the number of pebbles in the row might be related to the row
-number in a more complicated way; if this were the case, the row number
-would be replaced by the appropriate expression.)
-
-@smallexample
-(setq total (+ total row-number))
-@end smallexample
-
-@noindent
-What this does is set the new value of @code{total} to be equal to the
-sum of adding the number of pebbles in the row to the previous total.
-
-After setting the value of @code{total}, the conditions need to be
-established for the next repetition of the loop, if there is one.  This
-is done by incrementing the value of the @code{row-number} variable,
-which serves as a counter.  After the @code{row-number} variable has
-been incremented, the true-or-false-test at the beginning of the
-@code{while} loop tests whether its value is still less than or equal to
-the value of the @code{number-of-rows} and if it is, adds the new value
-of the @code{row-number} variable to the @code{total} of the previous
-repetition of the loop.
-
-@need 1200
-The built-in Emacs Lisp function @code{1+} adds 1 to a number, so the
-@code{row-number} variable can be incremented with this expression:
-
-@smallexample
-(setq row-number (1+ row-number))
-@end smallexample
-
-@node Inc Example altogether,  , Inc Example parts, Incrementing Loop Details
-@unnumberedsubsubsec Putting the function definition together
-
-We have created the parts for the function definition; now we need to
-put them together.
-
-@need 800
-First, the contents of the @code{while} expression:
-
-@smallexample
-@group
-(while (<= row-number number-of-rows)   ; @r{true-or-false-test}
-  (setq total (+ total row-number))
-  (setq row-number (1+ row-number)))    ; @r{incrementer}
-@end group
-@end smallexample
-
-Along with the @code{let} expression varlist, this very nearly
-completes the body of the function definition.  However, it requires
-one final element, the need for which is somewhat subtle.
-
-The final touch is to place the variable @code{total} on a line by
-itself after the @code{while} expression.  Otherwise, the value returned
-by the whole function is the value of the last expression that is
-evaluated in the body of the @code{let}, and this is the value
-returned by the @code{while}, which is always @code{nil}.
-
-This may not be evident at first sight.  It almost looks as if the
-incrementing expression is the last expression of the whole function.
-But that expression is part of the body of the @code{while}; it is the
-last element of the list that starts with the symbol @code{while}.
-Moreover, the whole of the @code{while} loop is a list within the body
-of the @code{let}.
-
-@need 1250
-In outline, the function will look like this:
-
-@smallexample
-@group
-(defun @var{name-of-function} (@var{argument-list})
-  "@var{documentation}@dots{}"
-  (let (@var{varlist})
-    (while (@var{true-or-false-test})
-      @var{body-of-while}@dots{} )
-    @dots{} ))                    ; @r{Need final expression here.}
-@end group
-@end smallexample
-
-The result of evaluating the @code{let} is what is going to be returned
-by the @code{defun} since the @code{let} is not embedded within any
-containing list, except for the @code{defun} as a whole.  However, if
-the @code{while} is the last element of the @code{let} expression, the
-function will always return @code{nil}.  This is not what we want!
-Instead, what we want is the value of the variable @code{total}.  This
-is returned by simply placing the symbol as the last element of the list
-starting with @code{let}.  It gets evaluated after the preceding
-elements of the list are evaluated, which means it gets evaluated after
-it has been assigned the correct value for the total.
-
-It may be easier to see this by printing the list starting with
-@code{let} all on one line.  This format makes it evident that the
-@var{varlist} and @code{while} expressions are the second and third
-elements of the list starting with @code{let}, and the @code{total} is
-the last element:
-
-@smallexample
-@group
-(let (@var{varlist}) (while (@var{true-or-false-test}) @var{body-of-while}@dots{} ) total)
-@end group
-@end smallexample
-
-@need 1200
-Putting everything together, the @code{triangle} function definition
-looks like this:
-
-@smallexample
-@group
-(defun triangle (number-of-rows)    ; @r{Version with}
-                                    ; @r{  incrementing counter.}
-  "Add up the number of pebbles in a triangle.
-The first row has one pebble, the second row two pebbles,
-the third row three pebbles, and so on.
-The argument is NUMBER-OF-ROWS."
-@end group
-@group
-  (let ((total 0)
-        (row-number 1))
-    (while (<= row-number number-of-rows)
-      (setq total (+ total row-number))
-      (setq row-number (1+ row-number)))
-    total))
-@end group
-@end smallexample
-
-@need 1200
-After you have installed @code{triangle} by evaluating the function, you
-can try it out.  Here are two examples:
-
-@smallexample
-@group
-(triangle 4)
-
-(triangle 7)
-@end group
-@end smallexample
-
-@noindent
-The sum of the first four numbers is 10 and the sum of the first seven
-numbers is 28.
-
-@node Decrementing Loop,  , Incrementing Loop Details, while
-@comment  node-name,  next,  previous,  up
-@subsection Loop with a Decrementing Counter
-
-Another common way to write a @code{while} loop is to write the test
-so that it determines whether a counter is greater than zero.  So long
-as the counter is greater than zero, the loop is repeated.  But when
-the counter is equal to or less than zero, the loop is stopped.  For
-this to work, the counter has to start out greater than zero and then
-be made smaller and smaller by a form that is evaluated
-repeatedly.
-
-The test will be an expression such as @code{(> counter 0)} which
-returns @code{t} for true if the value of @code{counter} is greater
-than zero, and @code{nil} for false if the value of @code{counter} is
-equal to or less than zero.  The expression that makes the number
-smaller and smaller can be a simple @code{setq} such as @code{(setq
-counter (1- counter))}, where @code{1-} is a built-in function in
-Emacs Lisp that subtracts 1 from its argument.
-
-@need 1250
-The template for a decrementing @code{while} loop looks like this:
-
-@smallexample
-@group
-(while (> counter 0)                    ; @r{true-or-false-test}
-  @var{body}@dots{}
-  (setq counter (1- counter)))          ; @r{decrementer}
-@end group
-@end smallexample
-
-@menu
-* Decrementing Example::        More pebbles on the beach.
-* Dec Example parts::           The parts of the function definition.
-* Dec Example altogether::      Putting the function definition together.
-@end menu
-
-@node Decrementing Example, Dec Example parts, Decrementing Loop, Decrementing Loop
-@unnumberedsubsubsec Example with decrementing counter
-
-To illustrate a loop with a decrementing counter, we will rewrite the
-@code{triangle} function so the counter decreases to zero.
-
-This is the reverse of the earlier version of the function.  In this
-case, to find out how many pebbles are needed to make a triangle with
-3 rows, add the number of pebbles in the third row, 3, to the number
-in the preceding row, 2, and then add the total of those two rows to
-the row that precedes them, which is 1.
-
-Likewise, to find the number of pebbles in a triangle with 7 rows, add
-the number of pebbles in the seventh row, 7, to the number in the
-preceding row, which is 6, and then add the total of those two rows to
-the row that precedes them, which is 5, and so on.  As in the previous
-example, each addition only involves adding two numbers, the total of
-the rows already added up and the number of pebbles in the row that is
-being added to the total.  This process of adding two numbers is
-repeated again and again until there are no more pebbles to add.
-
-We know how many pebbles to start with: the number of pebbles in the
-last row is equal to the number of rows.  If the triangle has seven
-rows, the number of pebbles in the last row is 7.  Likewise, we know how
-many pebbles are in the preceding row: it is one less than the number in
-the row.
-
-@node Dec Example parts, Dec Example altogether, Decrementing Example, Decrementing Loop
-@unnumberedsubsubsec The parts of the function definition
-
-We start with three variables: the total number of rows in the
-triangle; the number of pebbles in a row; and the total number of
-pebbles, which is what we want to calculate.  These variables can be
-named @code{number-of-rows}, @code{number-of-pebbles-in-row}, and
-@code{total}, respectively.
-
-Both @code{total} and @code{number-of-pebbles-in-row} are used only
-inside the function and are declared with @code{let}.  The initial
-value of @code{total} should, of course, be zero.  However, the
-initial value of @code{number-of-pebbles-in-row} should be equal to
-the number of rows in the triangle, since the addition will start with
-the longest row.
-
-@need 1250
-This means that the beginning of the @code{let} expression will look
-like this:
-
-@smallexample
-@group
-(let ((total 0)
-      (number-of-pebbles-in-row number-of-rows))
-  @var{body}@dots{})
-@end group
-@end smallexample
-
-The total number of pebbles can be found by repeatedly adding the number
-of pebbles in a row to the total already found, that is, by repeatedly
-evaluating the following expression:
-
-@smallexample
-(setq total (+ total number-of-pebbles-in-row))
-@end smallexample
-
-@noindent
-After the @code{number-of-pebbles-in-row} is added to the @code{total},
-the @code{number-of-pebbles-in-row} should be decremented by one, since
-the next time the loop repeats, the preceding row will be
-added to the total.
-
-The number of pebbles in a preceding row is one less than the number of
-pebbles in a row, so the built-in Emacs Lisp function @code{1-} can be
-used to compute the number of pebbles in the preceding row.  This can be
-done with the following expression:
-
-@smallexample
-@group
-(setq number-of-pebbles-in-row
-      (1- number-of-pebbles-in-row))
-@end group
-@end smallexample
-
-Finally, we know that the @code{while} loop should stop making repeated
-additions when there are no pebbles in a row.  So the test for
-the @code{while} loop is simply:
-
-@smallexample
-(while (> number-of-pebbles-in-row 0)
-@end smallexample
-
-@node Dec Example altogether,  , Dec Example parts, Decrementing Loop
-@unnumberedsubsubsec Putting the function definition together
-
-We can put these expressions together to create a function definition
-that works.  However, on examination, we find that one of the local
-variables is unneeded!
-
-@need 1250
-The function definition looks like this:
-
-@smallexample
-@group
-;;; @r{First subtractive version.}
-(defun triangle (number-of-rows)
-  "Add up the number of pebbles in a triangle."
-  (let ((total 0)
-        (number-of-pebbles-in-row number-of-rows))
-    (while (> number-of-pebbles-in-row 0)
-      (setq total (+ total number-of-pebbles-in-row))
-      (setq number-of-pebbles-in-row
-            (1- number-of-pebbles-in-row)))
-    total))
-@end group
-@end smallexample
-
-As written, this function works.
-
-However, we do not need @code{number-of-pebbles-in-row}.
-
-@cindex Argument as local variable
-When the @code{triangle} function is evaluated, the symbol
-@code{number-of-rows} will be bound to a number, giving it an initial
-value.  That number can be changed in the body of the function as if
-it were a local variable, without any fear that such a change will
-effect the value of the variable outside of the function.  This is a
-very useful characteristic of Lisp; it means that the variable
-@code{number-of-rows} can be used anywhere in the function where
-@code{number-of-pebbles-in-row} is used.
-
-@need 800
-Here is a second version of the function written a bit more cleanly:
-
-@smallexample
-@group
-(defun triangle (number)                ; @r{Second version.}
-  "Return sum of numbers 1 through NUMBER inclusive."
-  (let ((total 0))
-    (while (> number 0)
-      (setq total (+ total number))
-      (setq number (1- number)))
-    total))
-@end group
-@end smallexample
-
-In brief, a properly written @code{while} loop will consist of three parts:
-
-@enumerate
-@item
-A test that will return false after the loop has repeated itself the
-correct number of times.
-
-@item
-An expression the evaluation of which will return the value desired
-after being repeatedly evaluated.
-
-@item
-An expression to change the value passed to the true-or-false-test so
-that the test returns false after the loop has repeated itself the right
-number of times.
-@end enumerate
-
-@node dolist dotimes, Recursion, while, Loops & Recursion
-@comment  node-name,  next,  previous,  up
-@section Save your time: @code{dolist} and @code{dotimes}
-
-In addition to @code{while}, both @code{dolist} and @code{dotimes}
-provide for looping.  Sometimes these are quicker to write than the
-equivalent @code{while} loop.  Both are Lisp macros.  (@xref{Macros, ,
-Macros, elisp, The GNU Emacs Lisp Reference Manual}. )
-
-@code{dolist} works like a @code{while} loop that `@sc{cdr}s down a
-list':  @code{dolist} automatically shortens the list each time it
-loops---takes the @sc{cdr} of the list---and binds the @sc{car} of
-each shorter version of the list to the first of its arguments.
-
-@code{dotimes} loops a specific number of times: you specify the number.
-
-@menu
-* dolist::
-* dotimes::
-@end menu
-
-@node dolist, dotimes, dolist dotimes, dolist dotimes
-@unnumberedsubsubsec The @code{dolist} Macro
-@findex dolist
-
-Suppose, for example, you want to reverse a list, so that
-``first'' ``second'' ``third'' becomes ``third'' ``second'' ``first''.
-
-@need 1250
-In practice, you would use the @code{reverse} function, like this:
-
-@smallexample
-@group
-(setq animals '(gazelle giraffe lion tiger))
-
-(reverse animals)
-@end group
-@end smallexample
-
-@need 800
-@noindent
-Here is how you could reverse the list using a @code{while} loop:
-
-@smallexample
-@group
-(setq animals '(gazelle giraffe lion tiger))
-
-(defun reverse-list-with-while (list)
-  "Using while, reverse the order of LIST."
-  (let (value)  ; make sure list starts empty
-    (while list
-      (setq value (cons (car list) value))
-      (setq list (cdr list)))
-    value))
-
-(reverse-list-with-while animals)
-@end group
-@end smallexample
-
-@need 800
-@noindent
-And here is how you could use the @code{dolist} macro:
-
-@smallexample
-@group
-(setq animals '(gazelle giraffe lion tiger))
-
-(defun reverse-list-with-dolist (list)
-  "Using dolist, reverse the order of LIST."
-  (let (value)  ; make sure list starts empty
-    (dolist (element list value)
-      (setq value (cons element value)))))
-
-(reverse-list-with-dolist animals)
-@end group
-@end smallexample
-
-@need 1250
-@noindent
-In Info, you can place your cursor after the closing parenthesis of
-each expression and type @kbd{C-x C-e}; in each case, you should see
-
-@smallexample
-(tiger lion giraffe gazelle)
-@end smallexample
-
-@noindent
-in the echo area.
-
-For this example, the existing @code{reverse} function is obviously best.
-The @code{while} loop is just like our first example (@pxref{Loop
-Example, , A @code{while} Loop and a List}).  The @code{while} first
-checks whether the list has elements; if so, it constructs a new list
-by adding the first element of the list to the existing list (which in
-the first iteration of the loop is @code{nil}).  Since the second
-element is prepended in front of the first element, and the third
-element is prepended in front of the second element, the list is reversed.
-
-In the expression using a @code{while} loop,
-the @w{@code{(setq list (cdr list))}}
-expression shortens the list, so the @code{while} loop eventually
-stops.  In addition, it provides the @code{cons} expression with a new
-first element by creating a new and shorter list at each repetition of
-the loop.
-
-The @code{dolist} expression does very much the same as the
-@code{while} expression, except that the @code{dolist} macro does some
-of the work you have to do when writing a @code{while} expression.
-
-Like a @code{while} loop, a @code{dolist} loops.  What is different is
-that it automatically shortens the list each time it loops --- it
-`@sc{cdr}s down the list' on its own --- and it automatically binds
-the @sc{car} of each shorter version of the list to the first of its
-arguments.
-
-In the example, the @sc{car} of each shorter version of the list is
-referred to using the symbol @samp{element}, the list itself is called
-@samp{list}, and the value returned is called @samp{value}.  The
-remainder of the @code{dolist} expression is the body.
-
-The @code{dolist} expression binds the @sc{car} of each shorter
-version of the list to @code{element} and then evaluates the body of
-the expression; and repeats the loop.  The result is returned in
-@code{value}.
-
-@node dotimes,  , dolist, dolist dotimes
-@unnumberedsubsubsec The @code{dotimes} Macro
-@findex dotimes
-
-The @code{dotimes} macro is similar to @code{dolist}, except that it
-loops a specific number of times.
-
-The first argument to @code{dotimes} is assigned the numbers 0, 1, 2
-and so forth each time around the loop, and the value of the third
-argument is returned.  You need to provide the value of the second
-argument, which is how many times the macro loops.
-
-@need 1250
-For example, the following binds the numbers from 0 up to, but not
-including, the number 3 to the first argument, @var{number}, and then
-constructs a list of the three numbers.  (The first number is 0, the
-second number is 1, and the third number is 2; this makes a total of
-three numbers in all, starting with zero as the first number.)
-
-@smallexample
-@group
-(let (value)      ; otherwise a value is a void variable
-  (dotimes (number 3 value)
-    (setq value (cons number value))))
-
-@result{} (2 1 0)
-@end group
-@end smallexample
-
-@noindent
-@code{dotimes} returns @code{value}, so the way to use
-@code{dotimes} is to operate on some expression @var{number} number of
-times and then return the result, either as a list or an atom.
-
-@need 1250
-Here is an example of a @code{defun} that uses @code{dotimes} to add
-up the number of pebbles in a triangle.
-
-@smallexample
-@group
-(defun triangle-using-dotimes (number-of-rows)
-  "Using dotimes, add up the number of pebbles in a triangle."
-(let ((total 0))  ; otherwise a total is a void variable
-  (dotimes (number number-of-rows total)
-    (setq total (+ total (1+ number))))))
-
-(triangle-using-dotimes 4)
-@end group
-@end smallexample
-
-@node Recursion, Looping exercise, dolist dotimes, Loops & Recursion
-@comment  node-name,  next,  previous,  up
-@section Recursion
-@cindex Recursion
-
-A recursive function contains code that tells the Lisp interpreter to
-call a program that runs exactly like itself, but with slightly
-different arguments.  The code runs exactly the same because it has
-the same name.  However, even though the program has the same name, it
-is not the same entity.  It is different.  In the jargon, it is a
-different `instance'.
-
-Eventually, if the program is written correctly, the `slightly
-different arguments' will become sufficiently different from the first
-arguments that the final instance will stop.
-
-@menu
-* Building Robots::             Same model, different serial number ...
-* Recursive Definition Parts::  Walk until you stop ...
-* Recursion with list::         Using a list as the test whether to recurse.
-* Recursive triangle function::
-* Recursion with cond::
-* Recursive Patterns::          Often used templates.
-* No Deferment::                Don't store up work ...
-* No deferment solution::
-@end menu
-
-@node Building Robots, Recursive Definition Parts, Recursion, Recursion
-@comment  node-name,  next,  previous,  up
-@subsection Building Robots: Extending the Metaphor
-@cindex Building robots
-@cindex Robots, building
-
-It is sometimes helpful to think of a running program as a robot that
-does a job.  In doing its job, a recursive function calls on a second
-robot to help it.  The second robot is identical to the first in every
-way, except that the second robot helps the first and has been
-passed different arguments than the first.
-
-In a recursive function, the second robot may call a third; and the
-third may call a fourth, and so on.  Each of these is a different
-entity; but all are clones.
-
-Since each robot has slightly different instructions---the arguments
-will differ from one robot to the next---the last robot should know
-when to stop.
-
-Let's expand on the metaphor in which a computer program is a robot.
-
-A function definition provides the blueprints for a robot.  When you
-install a function definition, that is, when you evaluate a
-@code{defun} special form, you install the necessary equipment to
-build robots.  It is as if you were in a factory, setting up an
-assembly line.  Robots with the same name are built according to the
-same blueprints.  So they have, as it were, the same `model number',
-but a different `serial number'.
-
-We often say that a recursive function `calls itself'.  What we mean
-is that the instructions in a recursive function cause the Lisp
-interpreter to run a different function that has the same name and
-does the same job as the first, but with different arguments.
-
-It is important that the arguments differ from one instance to the
-next; otherwise, the process will never stop.
-
-@node Recursive Definition Parts, Recursion with list, Building Robots, Recursion
-@comment  node-name,  next,  previous,  up
-@subsection The Parts of a Recursive Definition
-@cindex Parts of a Recursive Definition
-@cindex Recursive Definition Parts
-
-A recursive function typically contains a conditional expression which
-has three parts:
-
-@enumerate
-@item
-A true-or-false-test that determines whether the function is called
-again, here called the @dfn{do-again-test}.
-
-@item
-The name of the function.  When this name is called, a new instance of
-the function---a new robot, as it were---is created and told what to do.
-
-@item
-An expression that returns a different value each time the function is
-called, here called the @dfn{next-step-expression}.  Consequently, the
-argument (or arguments) passed to the new instance of the function
-will be different from that passed to the previous instance.  This
-causes the conditional expression, the @dfn{do-again-test}, to test
-false after the correct number of repetitions.
-@end enumerate
-
-Recursive functions can be much simpler than any other kind of
-function.  Indeed, when people first start to use them, they often look
-so mysteriously simple as to be incomprehensible.  Like riding a
-bicycle, reading a recursive function definition takes a certain knack
-which is hard at first but then seems simple.
-
-@need 1200
-There are several different common recursive patterns.  A very simple
-pattern looks like this:
-
-@smallexample
-@group
-(defun @var{name-of-recursive-function} (@var{argument-list})
-  "@var{documentation}@dots{}"
-  (if @var{do-again-test}
-    @var{body}@dots{}
-    (@var{name-of-recursive-function}
-         @var{next-step-expression})))
-@end group
-@end smallexample
-
-Each time a recursive function is evaluated, a new instance of it is
-created and told what to do.  The arguments tell the instance what to do.
-
-An argument is bound to the value of the next-step-expression.  Each
-instance runs with a different value of the next-step-expression.
-
-The value in the next-step-expression is used in the do-again-test.
-
-The value returned by the next-step-expression is passed to the new
-instance of the function, which evaluates it (or some
-transmogrification of it) to determine whether to continue or stop.
-The next-step-expression is designed so that the do-again-test returns
-false when the function should no longer be repeated.
-
-The do-again-test is sometimes called the @dfn{stop condition},
-since it stops the repetitions when it tests false.
-
-@node Recursion with list, Recursive triangle function, Recursive Definition Parts, Recursion
-@comment  node-name,  next,  previous,  up
-@subsection Recursion with a List
-
-The example of a @code{while} loop that printed the elements of a list
-of numbers can be written recursively.  Here is the code, including
-an expression to set the value of the variable @code{animals} to a list.
-
-If you are using GNU Emacs 20 or before, this example must be copied
-to the @file{*scratch*} buffer and each expression must be evaluated
-there.  Use @kbd{C-u C-x C-e} to evaluate the
-@code{(print-elements-recursively animals)} expression so that the
-results are printed in the buffer; otherwise the Lisp interpreter will
-try to squeeze the results into the one line of the echo area.
-
-Also, place your cursor immediately after the last closing parenthesis
-of the @code{print-elements-recursively} function, before the comment.
-Otherwise, the Lisp interpreter will try to evaluate the comment.
-
-If you are using a more recent version of Emacs, you can evaluate this
-expression directly in Info.
-
-@findex print-elements-recursively
-@smallexample
-@group
-(setq animals '(gazelle giraffe lion tiger))
-
-(defun print-elements-recursively (list)
-  "Print each element of LIST on a line of its own.
-Uses recursion."
-  (when list                            ; @r{do-again-test}
-        (print (car list))              ; @r{body}
-        (print-elements-recursively     ; @r{recursive call}
-         (cdr list))))                  ; @r{next-step-expression}
-
-(print-elements-recursively animals)
-@end group
-@end smallexample
-
-The @code{print-elements-recursively} function first tests whether
-there is any content in the list; if there is, the function prints the
-first element of the list, the @sc{car} of the list.  Then the
-function `invokes itself', but gives itself as its argument, not the
-whole list, but the second and subsequent elements of the list, the
-@sc{cdr} of the list.
-
-Put another way, if the list is not empty, the function invokes
-another instance of code that is similar to the initial code, but is a
-different thread of execution, with different arguments than the first
-instance.
-
-Put in yet another way, if the list is not empty, the first robot
-assemblies a second robot and tells it what to do; the second robot is
-a different individual from the first, but is the same model.
-
-When the second evaluation occurs, the @code{when} expression is
-evaluated and if true, prints the first element of the list it
-receives as its argument (which is the second element of the original
-list).  Then the function `calls itself' with the @sc{cdr} of the list
-it is invoked with, which (the second time around) is the @sc{cdr} of
-the @sc{cdr} of the original list.
-
-Note that although we say that the function `calls itself', what we
-mean is that the Lisp interpreter assembles and instructs a new
-instance of the program.  The new instance is a clone of the first,
-but is a separate individual.
-
-Each time the function `invokes itself', it invokes itself on a
-shorter version of the original list.  It creates a new instance that
-works on a shorter list.
-
-Eventually, the function invokes itself on an empty list.  It creates
-a new instance whose argument is @code{nil}.  The conditional expression
-tests the value of @code{list}.  Since the value of @code{list} is
-@code{nil}, the @code{when} expression tests false so the then-part is
-not evaluated.  The function as a whole then returns @code{nil}.
-
-@need 1200
-When you evaluate @code{(print-elements-recursively animals)} in the
-@file{*scratch*} buffer, you see this result:
-
-@smallexample
-@group
-gazelle
-
-giraffe
-
-lion
-
-tiger
-nil
-@end group
-@end smallexample
-
-@need 2000
-@node Recursive triangle function, Recursion with cond, Recursion with list, Recursion
-@comment  node-name,  next,  previous,  up
-@subsection Recursion in Place of a Counter
-@findex triangle-recursively
-
-@need 1200
-The @code{triangle} function described in a previous section can also
-be written recursively.  It looks like this:
-
-@smallexample
-@group
-(defun triangle-recursively (number)
-  "Return the sum of the numbers 1 through NUMBER inclusive.
-Uses recursion."
-  (if (= number 1)                    ; @r{do-again-test}
-      1                               ; @r{then-part}
-    (+ number                         ; @r{else-part}
-       (triangle-recursively          ; @r{recursive call}
-        (1- number)))))               ; @r{next-step-expression}
-
-(triangle-recursively 7)
-@end group
-@end smallexample
-
-@noindent
-You can install this function by evaluating it and then try it by
-evaluating @code{(triangle-recursively 7)}.  (Remember to put your
-cursor immediately after the last parenthesis of the function
-definition, before the comment.)  The function evaluates to 28.
-
-To understand how this function works, let's consider what happens in the
-various cases when the function is passed 1, 2, 3, or 4 as the value of
-its argument.
-
-@menu
-* Recursive Example arg of 1 or 2::
-* Recursive Example arg of 3 or 4::
-@end menu
-
-@node Recursive Example arg of 1 or 2, Recursive Example arg of 3 or 4, Recursive triangle function, Recursive triangle function
-@ifnottex
-@unnumberedsubsubsec An argument of 1 or 2
-@end ifnottex
-
-First, what happens if the value of the argument is 1?
-
-The function has an @code{if} expression after the documentation
-string.  It tests whether the value of @code{number} is equal to 1; if
-so, Emacs evaluates the then-part of the @code{if} expression, which
-returns the number 1 as the value of the function.  (A triangle with
-one row has one pebble in it.)
-
-Suppose, however, that the value of the argument is 2.  In this case,
-Emacs evaluates the else-part of the @code{if} expression.
-
-@need 1200
-The else-part consists of an addition, the recursive call to
-@code{triangle-recursively} and a decrementing action; and it looks like
-this:
-
-@smallexample
-(+ number (triangle-recursively (1- number)))
-@end smallexample
-
-When Emacs evaluates this expression, the innermost expression is
-evaluated first; then the other parts in sequence.  Here are the steps
-in detail:
-
-@table @i
-@item Step 1 @w{  } Evaluate the innermost expression.
-
-The innermost expression is @code{(1- number)} so Emacs decrements the
-value of @code{number} from 2 to 1.
-
-@item Step 2 @w{  } Evaluate the @code{triangle-recursively} function.
-
-The Lisp interpreter creates an individual instance of
-@code{triangle-recursively}.  It does not matter that this function is
-contained within itself.  Emacs passes the result Step 1 as the
-argument used by this instance of the @code{triangle-recursively}
-function
-
-In this case, Emacs evaluates @code{triangle-recursively} with an
-argument of 1.  This means that this evaluation of
-@code{triangle-recursively} returns 1.
-
-@item Step 3 @w{  } Evaluate the value of @code{number}.
-
-The variable @code{number} is the second element of the list that
-starts with @code{+}; its value is 2.
-
-@item Step 4 @w{  } Evaluate the @code{+} expression.
-
-The @code{+} expression receives two arguments, the first
-from the evaluation of @code{number} (Step 3) and the second from the
-evaluation of @code{triangle-recursively} (Step 2).
-
-The result of the addition is the sum of 2 plus 1, and the number 3 is
-returned, which is correct.  A triangle with two rows has three
-pebbles in it.
-@end table
-
-@node Recursive Example arg of 3 or 4,  , Recursive Example arg of 1 or 2, Recursive triangle function
-@unnumberedsubsubsec An argument of 3 or 4
-
-Suppose that @code{triangle-recursively} is called with an argument of
-3.
-
-@table @i
-@item Step 1 @w{  } Evaluate the do-again-test.
-
-The @code{if} expression is evaluated first.  This is the do-again
-test and returns false, so the else-part of the @code{if} expression
-is evaluated.  (Note that in this example, the do-again-test causes
-the function to call itself when it tests false, not when it tests
-true.)
-
-@item Step 2 @w{  } Evaluate the innermost expression of the else-part.
-
-The innermost expression of the else-part is evaluated, which decrements
-3 to 2.  This is the next-step-expression.
-
-@item Step 3 @w{  } Evaluate the @code{triangle-recursively} function.
-
-The number 2 is passed to the @code{triangle-recursively} function.
-
-We know what happens when Emacs evaluates @code{triangle-recursively} with
-an argument of 2.  After going through the sequence of actions described
-earlier, it returns a value of 3.  So that is what will happen here.
-
-@item Step 4 @w{  } Evaluate the addition.
-
-3 will be passed as an argument to the addition and will be added to the
-number with which the function was called, which is 3.
-@end table
-
-@noindent
-The value returned by the function as a whole will be 6.
-
-Now that we know what will happen when @code{triangle-recursively} is
-called with an argument of 3, it is evident what will happen if it is
-called with an argument of 4:
-
-@quotation
-@need 800
-In the recursive call, the evaluation of
-
-@smallexample
-(triangle-recursively (1- 4))
-@end smallexample
-
-@need 800
-@noindent
-will return the value of evaluating
-
-@smallexample
-(triangle-recursively 3)
-@end smallexample
-
-@noindent
-which is 6 and this value will be added to 4 by the addition in the
-third line.
-@end quotation
-
-@noindent
-The value returned by the function as a whole will be 10.
-
-Each time @code{triangle-recursively} is evaluated, it evaluates a
-version of itself---a different instance of itself---with a smaller
-argument, until the argument is small enough so that it does not
-evaluate itself.
-
-Note that this particular design for a recursive function
-requires that operations be deferred.
-
-Before @code{(triangle-recursively 7)} can calculate its answer, it
-must call @code{(triangle-recursively 6)}; and before
-@code{(triangle-recursively 6)} can calculate its answer, it must call
-@code{(triangle-recursively 5)}; and so on.  That is to say, the
-calculation that @code{(triangle-recursively 7)} makes must be
-deferred until @code{(triangle-recursively 6)} makes its calculation;
-and @code{(triangle-recursively 6)} must defer until
-@code{(triangle-recursively 5)} completes; and so on.
-
-If each of these instances of @code{triangle-recursively} are thought
-of as different robots, the first robot must wait for the second to
-complete its job, which must wait until the third completes, and so
-on.
-
-There is a way around this kind of waiting, which we will discuss in
-@ref{No Deferment, , Recursion without Deferments}.
-
-@node Recursion with cond, Recursive Patterns, Recursive triangle function, Recursion
-@comment  node-name,  next,  previous,  up
-@subsection Recursion Example Using @code{cond}
-@findex cond
-
-The version of @code{triangle-recursively} described earlier is written
-with the @code{if} special form.  It can also be written using another
-special form called @code{cond}.  The name of the special form
-@code{cond} is an abbreviation of the word @samp{conditional}.
-
-Although the @code{cond} special form is not used as often in the
-Emacs Lisp sources as @code{if}, it is used often enough to justify
-explaining it.
-
-@need 800
-The template for a @code{cond} expression looks like this:
-
-@smallexample
-@group
-(cond
- @var{body}@dots{})
-@end group
-@end smallexample
-
-@noindent
-where the @var{body} is a series of lists.
-
-@need 800
-Written out more fully, the template looks like this:
-
-@smallexample
-@group
-(cond
- (@var{first-true-or-false-test} @var{first-consequent})
- (@var{second-true-or-false-test} @var{second-consequent})
- (@var{third-true-or-false-test} @var{third-consequent})
-  @dots{})
-@end group
-@end smallexample
-
-When the Lisp interpreter evaluates the @code{cond} expression, it
-evaluates the first element (the @sc{car} or true-or-false-test) of
-the first expression in a series of expressions within the body of the
-@code{cond}.
-
-If the true-or-false-test returns @code{nil} the rest of that
-expression, the consequent, is skipped and  the true-or-false-test of the
-next expression is evaluated.  When an expression is found whose
-true-or-false-test returns a value that is not @code{nil}, the
-consequent of that expression is evaluated.  The consequent can be one
-or more expressions.  If the consequent consists of more than one
-expression, the expressions are evaluated in sequence and the value of
-the last one is returned.  If the expression does not have a consequent,
-the value of the true-or-false-test is returned.
-
-If none of the true-or-false-tests test true, the @code{cond} expression
-returns @code{nil}.
-
-@need 1250
-Written using @code{cond}, the @code{triangle} function looks like this:
-
-@smallexample
-@group
-(defun triangle-using-cond (number)
-  (cond ((<= number 0) 0)
-        ((= number 1) 1)
-        ((> number 1)
-         (+ number (triangle-using-cond (1- number))))))
-@end group
-@end smallexample
-
-@noindent
-In this example, the @code{cond} returns 0 if the number is less than or
-equal to 0, it returns 1 if the number is 1 and it evaluates @code{(+
-number (triangle-using-cond (1- number)))} if the number is greater than
-1.
-
-@node Recursive Patterns, No Deferment, Recursion with cond, Recursion
-@comment  node-name,  next,  previous,  up
-@subsection Recursive Patterns
-@cindex Recursive Patterns
-
-Here are three common recursive patterns.  Each involves a list.
-Recursion does not need to involve lists, but Lisp is designed for lists
-and this provides a sense of its primal capabilities.
-
-@menu
-* Every::
-* Accumulate::
-* Keep::
-@end menu
-
-@node Every, Accumulate, Recursive Patterns, Recursive Patterns
-@comment  node-name,  next,  previous,  up
-@unnumberedsubsubsec Recursive Pattern: @emph{every}
-@cindex Every, type of recursive pattern
-@cindex Recursive pattern: every
-
-In the @code{every} recursive pattern, an action is performed on every
-element of a list.
-
-@need 1500
-The basic pattern is:
-
-@itemize @bullet
-@item
-If a list be empty, return @code{nil}.
-@item
-Else, act on the beginning of the list (the @sc{car} of the list)
-    @itemize @minus
-    @item
-    through a recursive call by the function on the rest (the
-    @sc{cdr}) of the list,
-    @item
-    and, optionally, combine the acted-on element, using @code{cons},
-    with the results of acting on the rest.
-    @end itemize
-@end itemize
-
-@need 1500
-Here is example:
-
-@smallexample
-@group
-(defun square-each (numbers-list)
-  "Square each of a NUMBERS LIST, recursively."
-  (if (not numbers-list)                ; do-again-test
-      nil
-    (cons
-     (* (car numbers-list) (car numbers-list))
-     (square-each (cdr numbers-list))))) ; next-step-expression
-@end group
-
-@group
-(square-each '(1 2 3))
-    @result{} (1 4 9)
-@end group
-@end smallexample
-
-@need 1200
-@noindent
-If @code{numbers-list} is empty, do nothing.  But if it has content,
-construct a list combining the square of the first number in the list
-with the result of the recursive call.
-
-(The example follows the pattern exactly: @code{nil} is returned if
-the numbers' list is empty.  In practice, you would write the
-conditional so it carries out the action when the numbers' list is not
-empty.)
-
-The @code{print-elements-recursively} function (@pxref{Recursion with
-list, , Recursion with a List}) is another example of an @code{every}
-pattern, except in this case, rather than bring the results together
-using @code{cons}, we print each element of output.
-
-@need 1250
-The @code{print-elements-recursively} function looks like this:
-
-@smallexample
-@group
-(setq animals '(gazelle giraffe lion tiger))
-@end group
-
-@group
-(defun print-elements-recursively (list)
-  "Print each element of LIST on a line of its own.
-Uses recursion."
-  (when list                            ; @r{do-again-test}
-        (print (car list))              ; @r{body}
-        (print-elements-recursively     ; @r{recursive call}
-         (cdr list))))                  ; @r{next-step-expression}
-
-(print-elements-recursively animals)
-@end group
-@end smallexample
-
-@need 1500
-The pattern for @code{print-elements-recursively} is:
-
-@itemize @bullet
-@item
-When the list is empty, do nothing.
-@item
-But when the list has at least one element,
-    @itemize @minus
-    @item
-    act on the beginning of the list (the @sc{car} of the list),
-    @item
-    and make a recursive call on the rest (the @sc{cdr}) of the list.
-    @end itemize
-@end itemize
-
-@node Accumulate, Keep, Every, Recursive Patterns
-@comment  node-name,  next,  previous,  up
-@unnumberedsubsubsec Recursive Pattern: @emph{accumulate}
-@cindex Accumulate, type of recursive pattern
-@cindex Recursive pattern: accumulate
-
-Another recursive pattern is called the @code{accumulate} pattern.  In
-the @code{accumulate} recursive pattern, an action is performed on
-every element of a list and the result of that action is accumulated
-with the results of performing the action on the other elements.
-
-This is very like the `every' pattern using @code{cons}, except that
-@code{cons} is not used, but some other combiner.
-
-@need 1500
-The pattern is:
-
-@itemize @bullet
-@item
-If a list be empty, return zero or some other constant.
-@item
-Else, act on the beginning of the list (the @sc{car} of the list),
-    @itemize @minus
-    @item
-    and combine that acted-on element, using @code{+} or
-    some other combining function, with
-    @item
-    a recursive call by the function on the rest (the @sc{cdr}) of the list.
-    @end itemize
-@end itemize
-
-@need 1500
-Here is an example:
-
-@smallexample
-@group
-(defun add-elements (numbers-list)
-  "Add the elements of NUMBERS-LIST together."
-  (if (not numbers-list)
-      0
-    (+ (car numbers-list) (add-elements (cdr numbers-list)))))
-@end group
-
-@group
-(add-elements '(1 2 3 4))
-    @result{} 10
-@end group
-@end smallexample
-
-@xref{Files List, , Making a List of Files}, for an example of the
-accumulate pattern.
-
-@node Keep,  , Accumulate, Recursive Patterns
-@comment  node-name,  next,  previous,  up
-@unnumberedsubsubsec Recursive Pattern: @emph{keep}
-@cindex Keep, type of recursive pattern
-@cindex Recursive pattern: keep
-
-A third recursive pattern is called the @code{keep} pattern.
-In the @code{keep} recursive pattern, each element of a list is tested;
-the element is acted on and the results are kept only if the element
-meets a criterion.
-
-Again, this is very like the `every' pattern, except the element is
-skipped unless it meets a criterion.
-
-@need 1500
-The pattern has three parts:
-
-@itemize @bullet
-@item
-If a list be empty, return @code{nil}.
-@item
-Else, if the beginning of the list (the @sc{car} of the list) passes
-        a test
-    @itemize @minus
-    @item
-    act on that element and combine it, using @code{cons} with
-    @item
-    a recursive call by the function on the rest (the @sc{cdr}) of the list.
-    @end itemize
-@item
-Otherwise, if the beginning of the list (the @sc{car} of the list) fails
-the test
-    @itemize @minus
-    @item
-    skip on that element,
-    @item
-    and, recursively call the function on the rest (the @sc{cdr}) of the list.
-    @end itemize
-@end itemize
-
-@need 1500
-Here is an example that uses @code{cond}:
-
-@smallexample
-@group
-(defun keep-three-letter-words (word-list)
-  "Keep three letter words in WORD-LIST."
-  (cond
-   ;; First do-again-test: stop-condition
-   ((not word-list) nil)
-
-   ;; Second do-again-test: when to act
-   ((eq 3 (length (symbol-name (car word-list))))
-    ;; combine acted-on element with recursive call on shorter list
-    (cons (car word-list) (keep-three-letter-words (cdr word-list))))
-
-   ;; Third do-again-test: when to skip element;
-   ;;   recursively call shorter list with next-step expression
-   (t (keep-three-letter-words (cdr word-list)))))
-@end group
-
-@group
-(keep-three-letter-words '(one two three four five six))
-    @result{} (one two six)
-@end group
-@end smallexample
-
-It goes without saying that you need not use @code{nil} as the test for
-when to stop; and you can, of course, combine these patterns.
-
-@node No Deferment, No deferment solution, Recursive Patterns, Recursion
-@subsection Recursion without Deferments
-@cindex Deferment in recursion
-@cindex Recursion without Deferments
-
-Let's consider again what happens with the @code{triangle-recursively}
-function.  We will find that the intermediate calculations are
-deferred until all can be done.
-
-@need 800
-Here is the function definition:
-
-@smallexample
-@group
-(defun triangle-recursively (number)
-  "Return the sum of the numbers 1 through NUMBER inclusive.
-Uses recursion."
-  (if (= number 1)                    ; @r{do-again-test}
-      1                               ; @r{then-part}
-    (+ number                         ; @r{else-part}
-       (triangle-recursively          ; @r{recursive call}
-        (1- number)))))               ; @r{next-step-expression}
-@end group
-@end smallexample
-
-What happens when we call this function with a argument of 7?
-
-The first instance of the @code{triangle-recursively} function adds
-the number 7 to the value returned by a second instance of
-@code{triangle-recursively}, an instance that has been passed an
-argument of 6.  That is to say, the first calculation is:
-
-@smallexample
-(+ 7 (triangle-recursively 6))
-@end smallexample
-
-@noindent
-The first instance of @code{triangle-recursively}---you may want to
-think of it as a little robot---cannot complete its job.  It must hand
-off the calculation for @code{(triangle-recursively 6)} to a second
-instance of the program, to a second robot.  This second individual is
-completely different from the first one; it is, in the jargon, a
-`different instantiation'.  Or, put another way, it is a different
-robot.  It is the same model as the first; it calculates triangle
-numbers recursively; but it has a different serial number.
-
-And what does @code{(triangle-recursively 6)} return?  It returns the
-number 6 added to the value returned by evaluating
-@code{triangle-recursively} with an argument of 5.  Using the robot
-metaphor, it asks yet another robot to help it.
-
-@need 800
-Now the total is:
-
-@smallexample
-(+ 7 6 (triangle-recursively 5))
-@end smallexample
-
-@need 800
-And what happens next?
-
-@smallexample
-(+ 7 6 5 (triangle-recursively 4))
-@end smallexample
-
-Each time @code{triangle-recursively} is called, except for the last
-time, it creates another instance of the program---another robot---and
-asks it to make a calculation.
-
-@need 800
-Eventually, the full addition is set up and performed:
-
-@smallexample
-(+ 7 6 5 4 3 2 1)
-@end smallexample
-
-This design for the function defers the calculation of the first step
-until the second can be done, and defers that until the third can be
-done, and so on.  Each deferment means the computer must remember what
-is being waited on.  This is not a problem when there are only a few
-steps, as in this example.  But it can be a problem when there are
-more steps.
-
-@node No deferment solution,  , No Deferment, Recursion
-@subsection No Deferment Solution
-@cindex No deferment solution
-@cindex Defermentless solution
-@cindex Solution without deferment
-
-The solution to the problem of deferred operations is to write in a
-manner that does not defer operations@footnote{The phrase @dfn{tail
-recursive} is used to describe such a process, one that uses
-`constant space'.}.  This requires
-writing to a different pattern, often one that involves writing two
-function definitions, an `initialization' function and a `helper'
-function.
-
-The `initialization' function sets up the job; the `helper' function
-does the work.
-
-@need 1200
-Here are the two function definitions for adding up numbers.  They are
-so simple, I find them hard to understand.
-
-@smallexample
-@group
-(defun triangle-initialization (number)
-  "Return the sum of the numbers 1 through NUMBER inclusive.
-This is the `initialization' component of a two function
-duo that uses recursion."
-  (triangle-recursive-helper 0 0 number))
-@end group
-@end smallexample
-
-@smallexample
-@group
-(defun triangle-recursive-helper (sum counter number)
-  "Return SUM, using COUNTER, through NUMBER inclusive.
-This is the `helper' component of a two function duo
-that uses recursion."
-  (if (> counter number)
-      sum
-    (triangle-recursive-helper (+ sum counter)  ; @r{sum}
-                               (1+ counter)     ; @r{counter}
-                               number)))        ; @r{number}
-@end group
-@end smallexample
-
-@need 1250
-Install both function definitions by evaluating them, then call
-@code{triangle-initialization} with 2 rows:
-
-@smallexample
-@group
-(triangle-initialization 2)
-    @result{} 3
-@end group
-@end smallexample
-
-The `initialization' function calls the first instance of the `helper'
-function with three arguments: zero, zero, and a number which is the
-number of rows in the triangle.
-
-The first two arguments passed to the `helper' function are
-initialization values.  These values are changed when
-@code{triangle-recursive-helper} invokes new instances.@footnote{The
-jargon is mildly confusing:  @code{triangle-recursive-helper} uses a
-process that is iterative in a procedure that is recursive.  The
-process is called iterative because the computer need only record the
-three values, @code{sum}, @code{counter}, and @code{number}; the
-procedure is recursive because the function `calls itself'.  On the
-other hand, both the process and the procedure used by
-@code{triangle-recursively} are called recursive.  The word
-`recursive' has different meanings in the two contexts.}
-
-Let's see what happens when we have a triangle that has one row.  (This
-triangle will have one pebble in it!)
-
-@need 1200
-@code{triangle-initialization} will call its helper with
-the arguments @w{@code{0 0 1}}.  That function will run the conditional
-test whether @code{(> counter number)}:
-
-@smallexample
-(> 0 1)
-@end smallexample
-
-@need 1200
-@noindent
-and find that the result is false, so it will invoke
-the else-part of the @code{if} clause:
-
-@smallexample
-@group
-    (triangle-recursive-helper
-     (+ sum counter)  ; @r{sum plus counter} @result{} @r{sum}
-     (1+ counter)     ; @r{increment counter} @result{} @r{counter}
-     number)          ; @r{number stays the same}
-@end group
-@end smallexample
-
-@need 800
-@noindent
-which will first compute:
-
-@smallexample
-@group
-(triangle-recursive-helper (+ 0 0)  ; @r{sum}
-                           (1+ 0)   ; @r{counter}
-                           1)       ; @r{number}
-@exdent which is:
-
-(triangle-recursive-helper 0 1 1)
-@end group
-@end smallexample
-
-Again, @code{(> counter number)} will be false, so again, the Lisp
-interpreter will evaluate @code{triangle-recursive-helper}, creating a
-new instance with new arguments.
-
-@need 800
-This new instance will be;
-
-@smallexample
-@group
-    (triangle-recursive-helper
-     (+ sum counter)  ; @r{sum plus counter} @result{} @r{sum}
-     (1+ counter)     ; @r{increment counter} @result{} @r{counter}
-     number)          ; @r{number stays the same}
-
-@exdent which is:
-
-(triangle-recursive-helper 1 2 1)
-@end group
-@end smallexample
-
-In this case, the @code{(> counter number)} test will be true!  So the
-instance will return the value of the sum, which will be 1, as
-expected.
-
-Now, let's pass @code{triangle-initialization} an argument
-of 2, to find out how many pebbles there are in a triangle with two rows.
-
-That function calls @code{(triangle-recursive-helper 0 0 2)}.
-
-@need 800
-In stages, the instances called will be:
-
-@smallexample
-@group
-                          @r{sum counter number}
-(triangle-recursive-helper 0    1       2)
-
-(triangle-recursive-helper 1    2       2)
-
-(triangle-recursive-helper 3    3       2)
-@end group
-@end smallexample
-
-When the last instance is called, the @code{(> counter number)} test
-will be true, so the instance will return the value of @code{sum},
-which will be 3.
-
-This kind of pattern helps when you are writing functions that can use
-many resources in a computer.
-
-@need 1500
-@node Looping exercise,  , Recursion, Loops & Recursion
-@section Looping Exercise
-
-@itemize @bullet
-@item
-Write a function similar to @code{triangle} in which each row has a
-value which is the square of the row number.  Use a @code{while} loop.
-
-@item
-Write a function similar to @code{triangle} that multiplies instead of
-adds the values.
-
-@item
-Rewrite these two functions recursively.  Rewrite these functions
-using @code{cond}.
-
-@c comma in printed title causes problem in Info cross reference
-@item
-Write a function for Texinfo mode that creates an index entry at the
-beginning of a paragraph for every @samp{@@dfn} within the paragraph.
-(In a Texinfo file, @samp{@@dfn} marks a definition.  This book is
-written in Texinfo.)
-
-Many of the functions you will need are described in two of the
-previous chapters, @ref{Cutting & Storing Text, , Cutting and Storing
-Text}, and @ref{Yanking, , Yanking Text Back}.  If you use
-@code{forward-paragraph} to put the index entry at the beginning of
-the paragraph, you will have to use @w{@kbd{C-h f}}
-(@code{describe-function}) to find out how to make the command go
-backwards.
-
-For more information, see
-@ifinfo
-@ref{Indicating, , Indicating Definitions, texinfo}.
-@end ifinfo
-@ifhtml
-@ref{Indicating, , Indicating, texinfo, Texinfo Manual}, which goes to
-a Texinfo manual in the current directory.  Or, if you are on the
-Internet, see
-@uref{http://www.gnu.org/software/texinfo/manual/texinfo/}
-@end ifhtml
-@iftex
-``Indicating Definitions, Commands, etc.'' in @cite{Texinfo, The GNU
-Documentation Format}.
-@end iftex
-@end itemize
-
-@node Regexp Search, Counting Words, Loops & Recursion, Top
-@comment  node-name,  next,  previous,  up
-@chapter Regular Expression Searches
-@cindex Searches, illustrating
-@cindex Regular expression searches
-@cindex Patterns, searching for
-@cindex Motion by sentence and paragraph
-@cindex Sentences, movement by
-@cindex Paragraphs, movement by
-
-Regular expression searches are used extensively in GNU Emacs.  The
-two functions, @code{forward-sentence} and @code{forward-paragraph},
-illustrate these searches well.  They use regular expressions to find
-where to move point.  The phrase `regular expression' is often written
-as `regexp'.
-
-Regular expression searches are described in @ref{Regexp Search, ,
-Regular Expression Search, emacs, The GNU Emacs Manual}, as well as in
-@ref{Regular Expressions, , , elisp, The GNU Emacs Lisp Reference
-Manual}.  In writing this chapter, I am presuming that you have at
-least a mild acquaintance with them.  The major point to remember is
-that regular expressions permit you to search for patterns as well as
-for literal strings of characters.  For example, the code in
-@code{forward-sentence} searches for the pattern of possible
-characters that could mark the end of a sentence, and moves point to
-that spot.
-
-Before looking at the code for the @code{forward-sentence} function, it
-is worth considering what the pattern that marks the end of a sentence
-must be.  The pattern is discussed in the next section; following that
-is a description of the regular expression search function,
-@code{re-search-forward}.  The @code{forward-sentence} function
-is described in the section following.  Finally, the
-@code{forward-paragraph} function is described in the last section of
-this chapter.  @code{forward-paragraph} is a complex function that
-introduces several new features.
-
-@menu
-* sentence-end::                The regular expression for @code{sentence-end}.
-* re-search-forward::           Very similar to @code{search-forward}.
-* forward-sentence::            A straightforward example of regexp search.
-* forward-paragraph::           A somewhat complex example.
-* etags::                       How to create your own @file{TAGS} table.
-* Regexp Review::
-* re-search Exercises::
-@end menu
-
-@node sentence-end, re-search-forward, Regexp Search, Regexp Search
-@comment  node-name,  next,  previous,  up
-@section The Regular Expression for @code{sentence-end}
-@findex sentence-end
-
-The symbol @code{sentence-end} is bound to the pattern that marks the
-end of a sentence.  What should this regular expression be?
-
-Clearly, a sentence may be ended by a period, a question mark, or an
-exclamation mark.  Indeed, in English, only clauses that end with one
-of those three characters should be considered the end of a sentence.
-This means that the pattern should include the character set:
-
-@smallexample
-[.?!]
-@end smallexample
-
-However, we do not want @code{forward-sentence} merely to jump to a
-period, a question mark, or an exclamation mark, because such a character
-might be used in the middle of a sentence.  A period, for example, is
-used after abbreviations.  So other information is needed.
-
-According to convention, you type two spaces after every sentence, but
-only one space after a period, a question mark, or an exclamation mark in
-the body of a sentence.  So a period, a question mark, or an exclamation
-mark followed by two spaces is a good indicator of an end of sentence.
-However, in a file, the two spaces may instead be a tab or the end of a
-line.  This means that the regular expression should include these three
-items as alternatives.
-
-@need 800
-This group of alternatives will look like this:
-
-@smallexample
-@group
-\\($\\| \\|  \\)
-       ^   ^^
-      TAB  SPC
-@end group
-@end smallexample
-
-@noindent
-Here, @samp{$} indicates the end of the line, and I have pointed out
-where the tab and two spaces are inserted in the expression.  Both are
-inserted by putting the actual characters into the expression.
-
-Two backslashes, @samp{\\}, are required before the parentheses and
-vertical bars: the first backslash quotes the following backslash in
-Emacs; and the second indicates that the following character, the
-parenthesis or the vertical bar, is special.
-
-@need 1000
-Also, a sentence may be followed by one or more carriage returns, like
-this:
-
-@smallexample
-@group
-[
-]*
-@end group
-@end smallexample
-
-@noindent
-Like tabs and spaces, a carriage return is inserted into a regular
-expression by inserting it literally.  The asterisk indicates that the
-@key{RET} is repeated zero or more times.
-
-But a sentence end does not consist only of a period, a question mark or
-an exclamation mark followed by appropriate space: a closing quotation
-mark or a closing brace of some kind may precede the space.  Indeed more
-than one such mark or brace may precede the space.  These require a
-expression that looks like this:
-
-@smallexample
-[]\"')@}]*
-@end smallexample
-
-In this expression, the first @samp{]} is the first character in the
-expression; the second character is @samp{"}, which is preceded by a
-@samp{\} to tell Emacs the @samp{"} is @emph{not} special.  The last
-three characters are @samp{'}, @samp{)}, and @samp{@}}.
-
-All this suggests what the regular expression pattern for matching the
-end of a sentence should be; and, indeed, if we evaluate
-@code{sentence-end} we find that it returns the following value:
-
-@smallexample
-@group
-sentence-end
-     @result{} "[.?!][]\"')@}]*\\($\\|     \\|  \\)[
-]*"
-@end group
-@end smallexample
-
-@noindent
-(Well, not in GNU Emacs 22; that is because of an effort to make the
-process simpler and to handle more glyphs and languages.  When the
-value of @code{sentence-end} is @code{nil}, then use the value defined
-by the function @code{sentence-end}.  (Here is a use of the difference
-between a value and a function in Emacs Lisp.)  The function returns a
-value constructed from the variables @code{sentence-end-base},
-@code{sentence-end-double-space}, @code{sentence-end-without-period},
-and @code{sentence-end-without-space}.  The critical variable is
-@code{sentence-end-base}; its global value is similar to the one
-described above but it also contains two additional quotation marks.
-These have differing degrees of curliness.  The
-@code{sentence-end-without-period} variable, when true, tells Emacs
-that a sentence may end without a period, such as text in Thai.)
-
-@ignore
-@noindent
-(Note that here the @key{TAB}, two spaces, and  @key{RET} are shown
-literally in the pattern.)
-
-This regular expression can be deciphered as follows:
-
-@table @code
-@item [.?!]
-The first part of the pattern is the three characters, a period, a question
-mark and an exclamation mark, within square brackets.  The pattern must
-begin with one or other of these characters.
-
-@item []\"')@}]*
-The second part of the pattern is the group of closing braces and
-quotation marks, which can appear zero or more times.  These may follow
-the period, question mark or exclamation mark.  In a regular expression,
-the backslash, @samp{\}, followed by the double quotation mark,
-@samp{"}, indicates the class of string-quote characters.  Usually, the
-double quotation mark is the only character in this class.  The
-asterisk, @samp{*}, indicates that the items in the previous group (the
-group surrounded by square brackets, @samp{[]}) may be repeated zero or
-more times.
-
-@item \\($\\|   \\|  \\)
-The third part of the pattern is one or other of: either the end of a
-line, or two blank spaces, or a tab.  The double back-slashes are used
-to prevent Emacs from reading the parentheses and vertical bars as part
-of the search pattern; the parentheses are used to mark the group and
-the vertical bars are used to indicated that the patterns to either side
-of them are alternatives.  The dollar sign is used to indicate the end
-of a line and both the two spaces and the tab are each inserted as is to
-indicate what they are.
-
-@item [@key{RET}]*
-Finally, the last part of the pattern indicates that the end of the line
-or the whitespace following the period, question mark or exclamation
-mark may, but need not, be followed by one or more carriage returns.  In
-the pattern, the carriage return is inserted as an actual carriage
-return between square brackets but here it is shown as @key{RET}.
-@end table
-@end ignore
-
-@node re-search-forward, forward-sentence, sentence-end, Regexp Search
-@comment  node-name,  next,  previous,  up
-@section The @code{re-search-forward} Function
-@findex re-search-forward
-
-The @code{re-search-forward} function is very like the
-@code{search-forward} function.  (@xref{search-forward, , The
-@code{search-forward} Function}.)
-
-@code{re-search-forward} searches for a regular expression.  If the
-search is successful, it leaves point immediately after the last
-character in the target.  If the search is backwards, it leaves point
-just before the first character in the target.  You may tell
-@code{re-search-forward} to return @code{t} for true.  (Moving point
-is therefore a `side effect'.)
-
-Like @code{search-forward}, the @code{re-search-forward} function takes
-four arguments:
-
-@enumerate
-@item
-The first argument is the regular expression that the function searches
-for.  The regular expression will be a string between quotations marks.
-
-@item
-The optional second argument limits how far the function will search; it is a
-bound, which is specified as a position in the buffer.
-
-@item
-The optional third argument specifies how the function responds to
-failure: @code{nil} as the third argument causes the function to
-signal an error (and print a message) when the search fails; any other
-value causes it to return @code{nil} if the search fails and @code{t}
-if the search succeeds.
-
-@item
-The optional fourth argument is the repeat count.  A negative repeat
-count causes @code{re-search-forward} to search backwards.
-@end enumerate
-
-@need 800
-The template for @code{re-search-forward} looks like this:
-
-@smallexample
-@group
-(re-search-forward "@var{regular-expression}"
-                @var{limit-of-search}
-                @var{what-to-do-if-search-fails}
-                @var{repeat-count})
-@end group
-@end smallexample
-
-The second, third, and fourth arguments are optional.  However, if you
-want to pass a value to either or both of the last two arguments, you
-must also pass a value to all the preceding arguments.  Otherwise, the
-Lisp interpreter will mistake which argument you are passing the value
-to.
-
-@need 1200
-In the @code{forward-sentence} function, the regular expression will be
-the value of the variable @code{sentence-end}.  In simple form, that is:
-
-@smallexample
-@group
-"[.?!][]\"')@}]*\\($\\|  \\|  \\)[
-]*"
-@end group
-@end smallexample
-
-@noindent
-The limit of the search will be the end of the paragraph (since a
-sentence cannot go beyond a paragraph).  If the search fails, the
-function will return @code{nil}; and the repeat count will be provided
-by the argument to the @code{forward-sentence} function.
-
-@node forward-sentence, forward-paragraph, re-search-forward, Regexp Search
-@comment  node-name,  next,  previous,  up
-@section @code{forward-sentence}
-@findex forward-sentence
-
-The command to move the cursor forward a sentence is a straightforward
-illustration of how to use regular expression searches in Emacs Lisp.
-Indeed, the function looks longer and more complicated than it is; this
-is because the function is designed to go backwards as well as forwards;
-and, optionally, over more than one sentence.  The function is usually
-bound to the key command @kbd{M-e}.
-
-@menu
-* Complete forward-sentence::
-* fwd-sentence while loops::    Two @code{while} loops.
-* fwd-sentence re-search::      A regular expression search.
-@end menu
-
-@node Complete forward-sentence, fwd-sentence while loops, forward-sentence, forward-sentence
-@ifnottex
-@unnumberedsubsec Complete @code{forward-sentence} function definition
-@end ifnottex
-
-@need 1250
-Here is the code for @code{forward-sentence}:
-
-@c in GNU Emacs 22
-@smallexample
-@group
-(defun forward-sentence (&optional arg)
-  "Move forward to next `sentence-end'.  With argument, repeat.
-With negative argument, move backward repeatedly to `sentence-beginning'.
-
-The variable `sentence-end' is a regular expression that matches ends of
-sentences.  Also, every paragraph boundary terminates sentences as well."
-@end group
-@group
-  (interactive "p")
-  (or arg (setq arg 1))
-  (let ((opoint (point))
-        (sentence-end (sentence-end)))
-    (while (< arg 0)
-      (let ((pos (point))
-            (par-beg (save-excursion (start-of-paragraph-text) (point))))
-       (if (and (re-search-backward sentence-end par-beg t)
-                (or (< (match-end 0) pos)
-                    (re-search-backward sentence-end par-beg t)))
-           (goto-char (match-end 0))
-         (goto-char par-beg)))
-      (setq arg (1+ arg)))
-@end group
-@group
-    (while (> arg 0)
-      (let ((par-end (save-excursion (end-of-paragraph-text) (point))))
-       (if (re-search-forward sentence-end par-end t)
-           (skip-chars-backward " \t\n")
-         (goto-char par-end)))
-      (setq arg (1- arg)))
-    (constrain-to-field nil opoint t)))
-@end group
-@end smallexample
-
-@ignore
-GNU Emacs 21
-@smallexample
-@group
-(defun forward-sentence (&optional arg)
-  "Move forward to next sentence-end.  With argument, repeat.
-With negative argument, move backward repeatedly to sentence-beginning.
-Sentence ends are identified by the value of sentence-end
-treated as a regular expression.  Also, every paragraph boundary
-terminates sentences as well."
-@end group
-@group
-  (interactive "p")
-  (or arg (setq arg 1))
-  (while (< arg 0)
-    (let ((par-beg
-           (save-excursion (start-of-paragraph-text) (point))))
-      (if (re-search-backward
-           (concat sentence-end "[^ \t\n]") par-beg t)
-          (goto-char (1- (match-end 0)))
-        (goto-char par-beg)))
-    (setq arg (1+ arg)))
-  (while (> arg 0)
-    (let ((par-end
-           (save-excursion (end-of-paragraph-text) (point))))
-      (if (re-search-forward sentence-end par-end t)
-          (skip-chars-backward " \t\n")
-        (goto-char par-end)))
-    (setq arg (1- arg))))
-@end group
-@end smallexample
-@end ignore
-
-The function looks long at first sight and it is best to look at its
-skeleton first, and then its muscle.  The way to see the skeleton is to
-look at the expressions that start in the left-most columns:
-
-@smallexample
-@group
-(defun forward-sentence (&optional arg)
-  "@var{documentation}@dots{}"
-  (interactive "p")
-  (or arg (setq arg 1))
-  (let ((opoint (point)) (sentence-end (sentence-end)))
-    (while (< arg 0)
-      (let ((pos (point))
-            (par-beg (save-excursion (start-of-paragraph-text) (point))))
-       @var{rest-of-body-of-while-loop-when-going-backwards}
-    (while (> arg 0)
-      (let ((par-end (save-excursion (end-of-paragraph-text) (point))))
-       @var{rest-of-body-of-while-loop-when-going-forwards}
-    @var{handle-forms-and-equivalent}
-@end group
-@end smallexample
-
-This looks much simpler!  The function definition consists of
-documentation, an @code{interactive} expression, an @code{or}
-expression, a @code{let} expression, and @code{while} loops.
-
-Let's look at each of these parts in turn.
-
-We note that the documentation is thorough and understandable.
-
-The function has an @code{interactive "p"} declaration.  This means
-that the processed prefix argument, if any, is passed to the
-function as its argument.  (This will be a number.)  If the function
-is not passed an argument (it is optional) then the argument
-@code{arg} will be bound to 1.
-
-When @code{forward-sentence} is called non-interactively without an
-argument, @code{arg} is bound to @code{nil}.  The @code{or} expression
-handles this.  What it does is either leave the value of @code{arg} as
-it is, but only if @code{arg} is bound to a value; or it sets the
-value of @code{arg} to 1, in the case when @code{arg} is bound to
-@code{nil}.
-
-Next is a @code{let}.  That specifies the values of two local
-variables, @code{point} and @code{sentence-end}.  The local value of
-point, from before the search, is used in the
-@code{constrain-to-field} function which handles forms and
-equivalents.  The @code{sentence-end} variable is set by the
-@code{sentence-end} function.
-
-@node fwd-sentence while loops, fwd-sentence re-search, Complete forward-sentence, forward-sentence
-@unnumberedsubsec The @code{while} loops
-
-Two @code{while} loops follow.  The first @code{while} has a
-true-or-false-test that tests true if the prefix argument for
-@code{forward-sentence} is a negative number.  This is for going
-backwards.  The body of this loop is similar to the body of the second
-@code{while} clause, but it is not exactly the same.  We will skip
-this @code{while} loop and concentrate on the second @code{while}
-loop.
-
-@need 1500
-The second @code{while} loop is for moving point forward.  Its skeleton
-looks like this:
-
-@smallexample
-@group
-(while (> arg 0)            ; @r{true-or-false-test}
-  (let @var{varlist}
-    (if (@var{true-or-false-test})
-        @var{then-part}
-      @var{else-part}
-  (setq arg (1- arg))))     ; @code{while} @r{loop decrementer}
-@end group
-@end smallexample
-
-The @code{while} loop is of the decrementing kind.
-(@xref{Decrementing Loop, , A Loop with a Decrementing Counter}.)  It
-has a true-or-false-test that tests true so long as the counter (in
-this case, the variable @code{arg}) is greater than zero; and it has a
-decrementer that subtracts 1 from the value of the counter every time
-the loop repeats.
-
-If no prefix argument is given to @code{forward-sentence}, which is
-the most common way the command is used, this @code{while} loop will
-run once, since the value of @code{arg} will be 1.
-
-The body of the @code{while} loop consists of a @code{let} expression,
-which creates and binds a local variable, and has, as its body, an
-@code{if} expression.
-
-@need 1250
-The body of the @code{while} loop looks like this:
-
-@smallexample
-@group
-(let ((par-end
-       (save-excursion (end-of-paragraph-text) (point))))
-  (if (re-search-forward sentence-end par-end t)
-      (skip-chars-backward " \t\n")
-    (goto-char par-end)))
-@end group
-@end smallexample
-
-The @code{let} expression creates and binds the local variable
-@code{par-end}.  As we shall see, this local variable is designed to
-provide a bound or limit to the regular expression search.  If the
-search fails to find a proper sentence ending in the paragraph, it will
-stop on reaching the end of the paragraph.
-
-But first, let us examine how @code{par-end} is bound to the value of
-the end of the paragraph.  What happens is that the @code{let} sets the
-value of @code{par-end} to the value returned when the Lisp interpreter
-evaluates the expression
-
-@smallexample
-@group
-(save-excursion (end-of-paragraph-text) (point))
-@end group
-@end smallexample
-
-@noindent
-In this expression, @code{(end-of-paragraph-text)} moves point to the
-end of the paragraph, @code{(point)} returns the value of point, and then
-@code{save-excursion} restores point to its original position.  Thus,
-the @code{let} binds @code{par-end} to the value returned by the
-@code{save-excursion} expression, which is the position of the end of
-the paragraph.  (The @code{end-of-paragraph-text} function uses
-@code{forward-paragraph}, which we will discuss shortly.)
-
-@need 1200
-Emacs next evaluates the body of the @code{let}, which is an @code{if}
-expression that looks like this:
-
-@smallexample
-@group
-(if (re-search-forward sentence-end par-end t) ; @r{if-part}
-    (skip-chars-backward " \t\n")              ; @r{then-part}
-  (goto-char par-end)))                        ; @r{else-part}
-@end group
-@end smallexample
-
-The @code{if} tests whether its first argument is true and if so,
-evaluates its then-part; otherwise, the Emacs Lisp interpreter
-evaluates the else-part.  The true-or-false-test of the @code{if}
-expression is the regular expression search.
-
-It may seem odd to have what looks like the `real work' of
-the @code{forward-sentence} function buried here, but this is a common
-way this kind of operation is carried out in Lisp.
-
-@node fwd-sentence re-search,  , fwd-sentence while loops, forward-sentence
-@unnumberedsubsec The regular expression search
-
-The @code{re-search-forward} function searches for the end of the
-sentence, that is, for the pattern defined by the @code{sentence-end}
-regular expression.  If the pattern is found---if the end of the sentence is
-found---then the @code{re-search-forward} function does two things:
-
-@enumerate
-@item
-The @code{re-search-forward} function carries out a side effect, which
-is to move point to the end of the occurrence found.
-
-@item
-The @code{re-search-forward} function returns a value of true.  This is
-the value received by the @code{if}, and means that the search was
-successful.
-@end enumerate
-
-@noindent
-The side effect, the movement of point, is completed before the
-@code{if} function is handed the value returned by the successful
-conclusion of the search.
-
-When the @code{if} function receives the value of true from a successful
-call to @code{re-search-forward}, the @code{if} evaluates the then-part,
-which is the expression @code{(skip-chars-backward " \t\n")}.  This
-expression moves backwards over any blank spaces, tabs or carriage
-returns until a printed character is found and then leaves point after
-the character.  Since point has already been moved to the end of the
-pattern that marks the end of the sentence, this action leaves point
-right after the closing printed character of the sentence, which is
-usually a period.
-
-On the other hand, if the @code{re-search-forward} function fails to
-find a pattern marking the end of the sentence, the function returns
-false.  The false then causes the @code{if} to evaluate its third
-argument, which is @code{(goto-char par-end)}:  it moves point to the
-end of the paragraph.
-
-(And if the text is in a form or equivalent, and point may not move
-fully, then the @code{constrain-to-field} function comes into play.)
-
-Regular expression searches are exceptionally useful and the pattern
-illustrated by @code{re-search-forward}, in which the search is the
-test of an @code{if} expression, is handy.  You will see or write code
-incorporating this pattern often.
-
-@node forward-paragraph, etags, forward-sentence, Regexp Search
-@comment  node-name,  next,  previous,  up
-@section @code{forward-paragraph}: a Goldmine of Functions
-@findex forward-paragraph
-
-@ignore
-@c in GNU Emacs 22
-(defun forward-paragraph (&optional arg)
-  "Move forward to end of paragraph.
-With argument ARG, do it ARG times;
-a negative argument ARG = -N means move backward N paragraphs.
-
-A line which `paragraph-start' matches either separates paragraphs
-\(if `paragraph-separate' matches it also) or is the first line of a paragraph.
-A paragraph end is the beginning of a line which is not part of the paragraph
-to which the end of the previous line belongs, or the end of the buffer.
-Returns the count of paragraphs left to move."
-  (interactive "p")
-  (or arg (setq arg 1))
-  (let* ((opoint (point))
-         (fill-prefix-regexp
-          (and fill-prefix (not (equal fill-prefix ""))
-               (not paragraph-ignore-fill-prefix)
-               (regexp-quote fill-prefix)))
-         ;; Remove ^ from paragraph-start and paragraph-sep if they are there.
-         ;; These regexps shouldn't be anchored, because we look for them
-         ;; starting at the left-margin.  This allows paragraph commands to
-         ;; work normally with indented text.
-         ;; This hack will not find problem cases like "whatever\\|^something".
-         (parstart (if (and (not (equal "" paragraph-start))
-                            (equal ?^ (aref paragraph-start 0)))
-                       (substring paragraph-start 1)
-                     paragraph-start))
-         (parsep (if (and (not (equal "" paragraph-separate))
-                          (equal ?^ (aref paragraph-separate 0)))
-                     (substring paragraph-separate 1)
-                   paragraph-separate))
-         (parsep
-          (if fill-prefix-regexp
-              (concat parsep "\\|"
-                      fill-prefix-regexp "[ \t]*$")
-            parsep))
-         ;; This is used for searching.
-         (sp-parstart (concat "^[ \t]*\\(?:" parstart "\\|" parsep "\\)"))
-         start found-start)
-    (while (and (< arg 0) (not (bobp)))
-      (if (and (not (looking-at parsep))
-               (re-search-backward "^\n" (max (1- (point)) (point-min)) t)
-               (looking-at parsep))
-          (setq arg (1+ arg))
-        (setq start (point))
-        ;; Move back over paragraph-separating lines.
-        (forward-char -1) (beginning-of-line)
-        (while (and (not (bobp))
-                    (progn (move-to-left-margin)
-                           (looking-at parsep)))
-          (forward-line -1))
-        (if (bobp)
-            nil
-          (setq arg (1+ arg))
-          ;; Go to end of the previous (non-separating) line.
-          (end-of-line)
-          ;; Search back for line that starts or separates paragraphs.
-          (if (if fill-prefix-regexp
-                  ;; There is a fill prefix; it overrides parstart.
-                  (let (multiple-lines)
-                    (while (and (progn (beginning-of-line) (not (bobp)))
-                                (progn (move-to-left-margin)
-                                       (not (looking-at parsep)))
-                                (looking-at fill-prefix-regexp))
-                      (unless (= (point) start)
-                        (setq multiple-lines t))
-                      (forward-line -1))
-                    (move-to-left-margin)
-                    ;; This deleted code caused a long hanging-indent line
-                    ;; not to be filled together with the following lines.
-                    ;; ;; Don't move back over a line before the paragraph
-                    ;; ;; which doesn't start with fill-prefix
-                    ;; ;; unless that is the only line we've moved over.
-                    ;; (and (not (looking-at fill-prefix-regexp))
-                    ;;      multiple-lines
-                    ;;      (forward-line 1))
-                    (not (bobp)))
-                (while (and (re-search-backward sp-parstart nil 1)
-                            (setq found-start t)
-                            ;; Found a candidate, but need to check if it is a
-                            ;; REAL parstart.
-                            (progn (setq start (point))
-                                   (move-to-left-margin)
-                                   (not (looking-at parsep)))
-                            (not (and (looking-at parstart)
-                                      (or (not use-hard-newlines)
-                                          (bobp)
-                                          (get-text-property
-                                           (1- start) 'hard)))))
-                  (setq found-start nil)
-                  (goto-char start))
-                found-start)
-              ;; Found one.
-              (progn
-                ;; Move forward over paragraph separators.
-                ;; We know this cannot reach the place we started
-                ;; because we know we moved back over a non-separator.
-                (while (and (not (eobp))
-                            (progn (move-to-left-margin)
-                                   (looking-at parsep)))
-                  (forward-line 1))
-                ;; If line before paragraph is just margin, back up to there.
-                (end-of-line 0)
-                (if (> (current-column) (current-left-margin))
-                    (forward-char 1)
-                  (skip-chars-backward " \t")
-                  (if (not (bolp))
-                      (forward-line 1))))
-            ;; No starter or separator line => use buffer beg.
-            (goto-char (point-min))))))
-
-    (while (and (> arg 0) (not (eobp)))
-      ;; Move forward over separator lines...
-      (while (and (not (eobp))
-                  (progn (move-to-left-margin) (not (eobp)))
-                  (looking-at parsep))
-        (forward-line 1))
-      (unless (eobp) (setq arg (1- arg)))
-      ;; ... and one more line.
-      (forward-line 1)
-      (if fill-prefix-regexp
-          ;; There is a fill prefix; it overrides parstart.
-          (while (and (not (eobp))
-                      (progn (move-to-left-margin) (not (eobp)))
-                      (not (looking-at parsep))
-                      (looking-at fill-prefix-regexp))
-            (forward-line 1))
-        (while (and (re-search-forward sp-parstart nil 1)
-                    (progn (setq start (match-beginning 0))
-                           (goto-char start)
-                           (not (eobp)))
-                    (progn (move-to-left-margin)
-                           (not (looking-at parsep)))
-                    (or (not (looking-at parstart))
-                        (and use-hard-newlines
-                             (not (get-text-property (1- start) 'hard)))))
-          (forward-char 1))
-        (if (< (point) (point-max))
-            (goto-char start))))
-    (constrain-to-field nil opoint t)
-    ;; Return the number of steps that could not be done.
-    arg))
-@end ignore
-
-The @code{forward-paragraph} function moves point forward to the end
-of the paragraph.  It is usually bound to @kbd{M-@}} and makes use of a
-number of functions that are important in themselves, including
-@code{let*}, @code{match-beginning}, and @code{looking-at}.
-
-The function definition for @code{forward-paragraph} is considerably
-longer than the function definition for @code{forward-sentence}
-because it works with a paragraph, each line of which may begin with a
-fill prefix.
-
-A fill prefix consists of a string of characters that are repeated at
-the beginning of each line.  For example, in Lisp code, it is a
-convention to start each line of a paragraph-long comment with
-@samp{;;; }.  In Text mode, four blank spaces make up another common
-fill prefix, creating an indented paragraph.  (@xref{Fill Prefix, , ,
-emacs, The GNU Emacs Manual}, for more information about fill
-prefixes.)
-
-The existence of a fill prefix means that in addition to being able to
-find the end of a paragraph whose lines begin on the left-most
-column, the @code{forward-paragraph} function must be able to find the
-end of a paragraph when all or many of the lines in the buffer begin
-with the fill prefix.
-
-Moreover, it is sometimes practical to ignore a fill prefix that
-exists, especially when blank lines separate paragraphs.
-This is an added complication.
-
-@menu
-* forward-paragraph in brief::  Key parts of the function definition.
-* fwd-para let::                The @code{let*} expression.
-* fwd-para while::              The forward motion @code{while} loop.
-@end menu
-
-@node forward-paragraph in brief, fwd-para let, forward-paragraph, forward-paragraph
-@ifnottex
-@unnumberedsubsec Shortened @code{forward-paragraph} function definition
-@end ifnottex
-
-Rather than print all of the @code{forward-paragraph} function, we
-will only print parts of it.  Read without preparation, the function
-can be daunting!
-
-@need 800
-In outline, the function looks like this:
-
-@smallexample
-@group
-(defun forward-paragraph (&optional arg)
-  "@var{documentation}@dots{}"
-  (interactive "p")
-  (or arg (setq arg 1))
-  (let*
-      @var{varlist}
-    (while (and (< arg 0) (not (bobp)))     ; @r{backward-moving-code}
-      @dots{}
-    (while (and (> arg 0) (not (eobp)))     ; @r{forward-moving-code}
-      @dots{}
-@end group
-@end smallexample
-
-The first parts of the function are routine: the function's argument
-list consists of one optional argument.  Documentation follows.
-
-The lower case @samp{p} in the @code{interactive} declaration means
-that the processed prefix argument, if any, is passed to the function.
-This will be a number, and is the repeat count of how many paragraphs
-point will move.  The @code{or} expression in the next line handles
-the common case when no argument is passed to the function, which occurs
-if the function is called from other code rather than interactively.
-This case was described earlier.  (@xref{forward-sentence, The
-@code{forward-sentence} function}.)  Now we reach the end of the
-familiar part of this function.
-
-@node fwd-para let, fwd-para while, forward-paragraph in brief, forward-paragraph
-@unnumberedsubsec The @code{let*} expression
-
-The next line of the @code{forward-paragraph} function begins a
-@code{let*} expression.  This is a different than @code{let}.  The
-symbol is @code{let*} not @code{let}.
-
-The @code{let*} special form is like @code{let} except that Emacs sets
-each variable in sequence, one after another, and variables in the
-latter part of the varlist can make use of the values to which Emacs
-set variables in the earlier part of the varlist.
-
-@ignore
-( refappend save-excursion, , code save-excursion in code append-to-buffer .)
-@end ignore
-
-(@ref{append save-excursion, , @code{save-excursion} in @code{append-to-buffer}}.)
-
-In the @code{let*} expression in this function, Emacs binds a total of
-seven variables:  @code{opoint}, @code{fill-prefix-regexp},
-@code{parstart}, @code{parsep}, @code{sp-parstart}, @code{start}, and
-@code{found-start}.
-
-The variable @code{parsep} appears twice, first, to remove instances
-of @samp{^}, and second, to handle fill prefixes.
-
-The variable @code{opoint} is just the value of @code{point}.  As you
-can guess, it is used in a @code{constrain-to-field} expression, just
-as in @code{forward-sentence}.
-
-The variable @code{fill-prefix-regexp} is set to the value returned by
-evaluating the following list:
-
-@smallexample
-@group
-(and fill-prefix
-     (not (equal fill-prefix ""))
-     (not paragraph-ignore-fill-prefix)
-     (regexp-quote fill-prefix))
-@end group
-@end smallexample
-
-@noindent
-This is an expression whose first element is the @code{and} special form.
-
-As we learned earlier (@pxref{kill-new function, , The @code{kill-new}
-function}), the @code{and} special form evaluates each of its
-arguments until one of the arguments returns a value of @code{nil}, in
-which case the @code{and} expression returns @code{nil}; however, if
-none of the arguments returns a value of @code{nil}, the value
-resulting from evaluating the last argument is returned.  (Since such
-a value is not @code{nil}, it is considered true in Lisp.)  In other
-words, an @code{and} expression returns a true value only if all its
-arguments are true.
-@findex and
-
-In this case, the variable @code{fill-prefix-regexp} is bound to a
-non-@code{nil} value only if the following four expressions produce a
-true (i.e., a non-@code{nil}) value when they are evaluated; otherwise,
-@code{fill-prefix-regexp} is bound to @code{nil}.
-
-@table @code
-@item fill-prefix
-When this variable is evaluated, the value of the fill prefix, if any,
-is returned.  If there is no fill prefix, this variable returns
-@code{nil}.
-
-@item (not (equal fill-prefix "")
-This expression checks whether an existing fill prefix is an empty
-string, that is, a string with no characters in it.  An empty string is
-not a useful fill prefix.
-
-@item (not paragraph-ignore-fill-prefix)
-This expression returns @code{nil} if the variable
-@code{paragraph-ignore-fill-prefix} has been turned on by being set to a
-true value such as @code{t}.
-
-@item (regexp-quote fill-prefix)
-This is the last argument to the @code{and} special form.  If all the
-arguments to the @code{and} are true, the value resulting from
-evaluating this expression will be returned by the @code{and} expression
-and bound to the variable @code{fill-prefix-regexp},
-@end table
-
-@findex regexp-quote
-@noindent
-The result of evaluating this @code{and} expression successfully is that
-@code{fill-prefix-regexp} will be bound to the value of
-@code{fill-prefix} as modified by the @code{regexp-quote} function.
-What @code{regexp-quote} does is read a string and return a regular
-expression that will exactly match the string and match nothing else.
-This means that @code{fill-prefix-regexp} will be set to a value that
-will exactly match the fill prefix if the fill prefix exists.
-Otherwise, the variable will be set to @code{nil}.
-
-The next two local variables in the @code{let*} expression are
-designed to remove instances of @samp{^} from @code{parstart} and
-@code{parsep}, the local variables which indicate the paragraph start
-and the paragraph separator.  The next expression sets @code{parsep}
-again.  That is to handle fill prefixes.
-
-This is the setting that requires the definition call @code{let*}
-rather than @code{let}.  The true-or-false-test for the @code{if}
-depends on whether the variable @code{fill-prefix-regexp} evaluates to
-@code{nil} or some other value.
-
-If @code{fill-prefix-regexp} does not have a value, Emacs evaluates
-the else-part of the @code{if} expression and binds @code{parsep} to
-its local value.  (@code{parsep} is a regular expression that matches
-what separates paragraphs.)
-
-But if @code{fill-prefix-regexp} does have a value, Emacs evaluates
-the then-part of the @code{if} expression and binds @code{parsep} to a
-regular expression that includes the @code{fill-prefix-regexp} as part
-of the pattern.
-
-Specifically, @code{parsep} is set to the original value of the
-paragraph separate regular expression concatenated with an alternative
-expression that consists of the @code{fill-prefix-regexp} followed by
-optional whitespace to the end of the line.  The whitespace is defined
-by @w{@code{"[ \t]*$"}}.)  The @samp{\\|} defines this portion of the
-regexp as an alternative to @code{parsep}.
-
-According to a comment in the code, the next local variable,
-@code{sp-parstart}, is used for searching, and then the final two,
-@code{start} and @code{found-start}, are set to @code{nil}.
-
-Now we get into the body of the @code{let*}.  The first part of the body
-of the @code{let*} deals with the case when the function is given a
-negative argument and is therefore moving backwards.  We will skip this
-section.
-
-@node fwd-para while,  , fwd-para let, forward-paragraph
-@unnumberedsubsec The forward motion @code{while} loop
-
-The second part of the body of the @code{let*} deals with forward
-motion.  It is a @code{while} loop that repeats itself so long as the
-value of @code{arg} is greater than zero.  In the most common use of
-the function, the value of the argument is 1, so the body of the
-@code{while} loop is evaluated exactly once, and the cursor moves
-forward one paragraph.
-
-@ignore
-(while (and (> arg 0) (not (eobp)))
-
-  ;; Move forward over separator lines...
-  (while (and (not (eobp))
-              (progn (move-to-left-margin) (not (eobp)))
-              (looking-at parsep))
-    (forward-line 1))
-  (unless (eobp) (setq arg (1- arg)))
-  ;; ... and one more line.
-  (forward-line 1)
-
-  (if fill-prefix-regexp
-      ;; There is a fill prefix; it overrides parstart.
-      (while (and (not (eobp))
-                  (progn (move-to-left-margin) (not (eobp)))
-                  (not (looking-at parsep))
-                  (looking-at fill-prefix-regexp))
-        (forward-line 1))
-
-    (while (and (re-search-forward sp-parstart nil 1)
-                (progn (setq start (match-beginning 0))
-                       (goto-char start)
-                       (not (eobp)))
-                (progn (move-to-left-margin)
-                       (not (looking-at parsep)))
-                (or (not (looking-at parstart))
-                    (and use-hard-newlines
-                         (not (get-text-property (1- start) 'hard)))))
-      (forward-char 1))
-
-    (if (< (point) (point-max))
-        (goto-char start))))
-@end ignore
-
-This part handles three situations: when point is between paragraphs,
-when there is a fill prefix and when there is no fill prefix.
-
-@need 800
-The @code{while} loop looks like this:
-
-@smallexample
-@group
-;; @r{going forwards and not at the end of the buffer}
-(while (and (> arg 0) (not (eobp)))
-
-  ;; @r{between paragraphs}
-  ;; Move forward over separator lines...
-  (while (and (not (eobp))
-              (progn (move-to-left-margin) (not (eobp)))
-              (looking-at parsep))
-    (forward-line 1))
-  ;;  @r{This decrements the loop}
-  (unless (eobp) (setq arg (1- arg)))
-  ;; ... and one more line.
-  (forward-line 1)
-@end group
-
-@group
-  (if fill-prefix-regexp
-      ;; There is a fill prefix; it overrides parstart;
-      ;; we go forward line by line
-      (while (and (not (eobp))
-                  (progn (move-to-left-margin) (not (eobp)))
-                  (not (looking-at parsep))
-                  (looking-at fill-prefix-regexp))
-        (forward-line 1))
-@end group
-
-@group
-    ;; There is no fill prefix;
-    ;; we go forward character by character
-    (while (and (re-search-forward sp-parstart nil 1)
-                (progn (setq start (match-beginning 0))
-                       (goto-char start)
-                       (not (eobp)))
-                (progn (move-to-left-margin)
-                       (not (looking-at parsep)))
-                (or (not (looking-at parstart))
-                    (and use-hard-newlines
-                         (not (get-text-property (1- start) 'hard)))))
-      (forward-char 1))
-@end group
-
-@group
-    ;; and if there is no fill prefix and if we are not at the end,
-    ;;     go to whatever was found in the regular expression search
-    ;;     for sp-parstart
-    (if (< (point) (point-max))
-        (goto-char start))))
-@end group
-@end smallexample
-
-@findex eobp
-We can see that this is a decrementing counter @code{while} loop,
-using the expression @code{(setq arg (1- arg))} as the decrementer.
-That expression is not far from the @code{while}, but is hidden in
-another Lisp macro, an @code{unless} macro.  Unless we are at the end
-of the buffer --- that is what the @code{eobp} function determines; it
-is an abbreviation of @samp{End Of Buffer P} --- we decrease the value
-of @code{arg} by one.
-
-(If we are at the end of the buffer, we cannot go forward any more and
-the next loop of the @code{while} expression will test false since the
-test is an @code{and} with @code{(not (eobp))}.  The @code{not}
-function means exactly as you expect; it is another name for
-@code{null}, a function that returns true when its argument is false.)
-
-Interestingly, the loop count is not decremented until we leave the
-space between paragraphs, unless we come to the end of buffer or stop
-seeing the local value of the paragraph separator.
-
-That second @code{while} also has a @code{(move-to-left-margin)}
-expression.  The function is self-explanatory.  It is inside a
-@code{progn} expression and not the last element of its body, so it is
-only invoked for its side effect, which is to move point to the left
-margin of the current line.
-
-@findex looking-at
-The @code{looking-at} function is also self-explanatory; it returns
-true if the text after point matches the regular expression given as
-its argument.
-
-The rest of the body of the loop looks difficult at first, but makes
-sense as you come to understand it.
-
-@need 800
-First consider what happens if there is a fill prefix:
-
-@smallexample
-@group
-  (if fill-prefix-regexp
-      ;; There is a fill prefix; it overrides parstart;
-      ;; we go forward line by line
-      (while (and (not (eobp))
-                  (progn (move-to-left-margin) (not (eobp)))
-                  (not (looking-at parsep))
-                  (looking-at fill-prefix-regexp))
-        (forward-line 1))
-@end group
-@end smallexample
-
-@noindent
-This expression moves point forward line by line so long
-as four conditions are true:
-
-@enumerate
-@item
-Point is not at the end of the buffer.
-
-@item
-We can move to the left margin of the text and are
-not at the end of the buffer.
-
-@item
-The text following point does not separate paragraphs.
-
-@item
-The pattern following point is the fill prefix regular expression.
-@end enumerate
-
-The last condition may be puzzling, until you remember that point was
-moved to the beginning of the line early in the @code{forward-paragraph}
-function.  This means that if the text has a fill prefix, the
-@code{looking-at} function will see it.
-
-@need 1250
-Consider what happens when there is no fill prefix.
-
-@smallexample
-@group
-    (while (and (re-search-forward sp-parstart nil 1)
-                (progn (setq start (match-beginning 0))
-                       (goto-char start)
-                       (not (eobp)))
-                (progn (move-to-left-margin)
-                       (not (looking-at parsep)))
-                (or (not (looking-at parstart))
-                    (and use-hard-newlines
-                         (not (get-text-property (1- start) 'hard)))))
-      (forward-char 1))
-@end group
-@end smallexample
-
-@noindent
-This @code{while} loop has us searching forward for
-@code{sp-parstart}, which is the combination of possible whitespace
-with a the local value of the start of a paragraph or of a paragraph
-separator.  (The latter two are within an expression starting
-@code{\(?:} so that they are not referenced by the
-@code{match-beginning} function.)
-
-@need 800
-The two expressions,
-
-@smallexample
-@group
-(setq start (match-beginning 0))
-(goto-char start)
-@end group
-@end smallexample
-
-@noindent
-mean go to the start of the text matched by the regular expression
-search.
-
-The @code{(match-beginning 0)} expression is new.  It returns a number
-specifying the location of the start of the text that was matched by
-the last search.
-
-The @code{match-beginning} function is used here because of a
-characteristic of a forward search: a successful forward search,
-regardless of whether it is a plain search or a regular expression
-search, moves point to the end of the text that is found.  In this
-case, a successful search moves point to the end of the pattern for
-@code{sp-parstart}.
-
-However, we want to put point at the end of the current paragraph, not
-somewhere else.  Indeed, since the search possibly includes the
-paragraph separator, point may end up at the beginning of the next one
-unless we use an expression that includes @code{match-beginning}.
-
-@findex match-beginning
-When given an argument of 0, @code{match-beginning} returns the
-position that is the start of the text matched by the most recent
-search.  In this case, the most recent search looks for
-@code{sp-parstart}.  The @code{(match-beginning 0)} expression returns
-the beginning position of that pattern, rather than the end position
-of that pattern.
-
-(Incidentally, when passed a positive number as an argument, the
-@code{match-beginning} function returns the location of point at that
-parenthesized expression in the last search unless that parenthesized
-expression begins with @code{\(?:}.  I don't know why @code{\(?:}
-appears here since the argument is 0.)
-
-@need 1250
-The last expression when there is no fill prefix is
-
-@smallexample
-@group
-(if (< (point) (point-max))
-    (goto-char start))))
-@end group
-@end smallexample
-
-@noindent
-This says that if there is no fill prefix and if we are not at the
-end, point should move to the beginning of whatever was found by the
-regular expression search for @code{sp-parstart}.
-
-The full definition for the @code{forward-paragraph} function not only
-includes code for going forwards, but also code for going backwards.
-
-If you are reading this inside of GNU Emacs and you want to see the
-whole function, you can type @kbd{C-h f} (@code{describe-function})
-and the name of the function.  This gives you the function
-documentation and the name of the library containing the function's
-source.  Place point over the name of the library and press the RET
-key; you will be taken directly to the source.  (Be sure to install
-your sources!  Without them, you are like a person who tries to drive
-a car with his eyes shut!)
-
-@node etags, Regexp Review, forward-paragraph, Regexp Search
-@section Create Your Own @file{TAGS} File
-@findex etags
-@cindex @file{TAGS} file, create own
-
-Besides @kbd{C-h f} (@code{describe-function}), another way to see the
-source of a function is to type @kbd{M-.} (@code{find-tag}) and the
-name of the function when prompted for it.  This is a good habit to
-get into.  The @kbd{M-.} (@code{find-tag}) command takes you directly
-to the source for a function, variable, or node.  The function depends
-on tags tables to tell it where to go.
-
-If the @code{find-tag} function first asks you for the name of a
-@file{TAGS} table, give it the name of a @file{TAGS} file such as
-@file{/usr/local/src/emacs/src/TAGS}.  (The exact path to your
-@file{TAGS} file depends on how your copy of Emacs was installed.  I
-just told you the location that provides both my C and my Emacs Lisp
-sources.)
-
-You can also create your own @file{TAGS} file for directories that
-lack one.
-
-You often need to build and install tags tables yourself.  They are
-not built automatically.  A tags table is called a @file{TAGS} file;
-the name is in upper case letters.
-
-You can create a @file{TAGS} file by calling the @code{etags} program
-that comes as a part of the Emacs distribution.  Usually, @code{etags}
-is compiled and installed when Emacs is built.  (@code{etags} is not
-an Emacs Lisp function or a part of Emacs; it is a C program.)
-
-@need 1250
-To create a @file{TAGS} file, first switch to the directory in which
-you want to create the file.  In Emacs you can do this with the
-@kbd{M-x cd} command, or by visiting a file in the directory, or by
-listing the directory with @kbd{C-x d} (@code{dired}).  Then run the
-compile command, with @w{@code{etags *.el}} as the command to execute
-
-@smallexample
-M-x compile RET etags *.el RET
-@end smallexample
-
-@noindent
-to create a @file{TAGS} file for Emacs Lisp.
-
-For example, if you have a large number of files in your
-@file{~/emacs} directory, as I do---I have 137 @file{.el} files in it,
-of which I load 12---you can create a @file{TAGS} file for the Emacs
-Lisp files in that directory.
-
-@need 1250
-The @code{etags} program takes all the usual shell `wildcards'.  For
-example, if you have two directories for which you want a single
-@file{TAGS} file, type @w{@code{etags *.el ../elisp/*.el}}, where
-@file{../elisp/} is the second directory:
-
-@smallexample
-M-x compile RET etags *.el ../elisp/*.el RET
-@end smallexample
-
-@need 1250
-Type
-
-@smallexample
-M-x compile RET etags --help RET
-@end smallexample
-
-@noindent
-to see a list of the options accepted by @code{etags} as well as a
-list of supported languages.
-
-The @code{etags} program handles more than 20 languages, including
-Emacs Lisp, Common Lisp, Scheme, C, C++, Ada, Fortran, HTML, Java,
-LaTeX, Pascal, Perl, Postscript, Python, TeX, Texinfo, makefiles, and
-most assemblers.  The program has no switches for specifying the
-language; it recognizes the language in an input file according to its
-file name and contents.
-
-@file{etags} is very helpful when you are writing code yourself and
-want to refer back to functions you have already written.  Just run
-@code{etags} again at intervals as you write new functions, so they
-become part of the @file{TAGS} file.
-
-If you think an appropriate @file{TAGS} file already exists for what
-you want, but do not know where it is, you can use the @code{locate}
-program to attempt to find it.
-
-Type @w{@kbd{M-x locate @key{RET} TAGS @key{RET}}} and Emacs will list
-for you the full path names of all your @file{TAGS} files.  On my
-system, this command lists 34 @file{TAGS} files.  On the other hand, a
-`plain vanilla' system I recently installed did not contain any
-@file{TAGS} files.
-
-If the tags table you want has been created, you can use the @code{M-x
-visit-tags-table} command to specify it.  Otherwise, you will need to
-create the tag table yourself and then use @code{M-x
-visit-tags-table}.
-
-@subsubheading Building Tags in the Emacs sources
-@cindex Building Tags in the Emacs sources
-@cindex Tags in the Emacs sources
-@findex make tags
-
-The GNU Emacs sources come with a @file{Makefile} that contains a
-sophisticated @code{etags} command that creates, collects, and merges
-tags tables from all over the Emacs sources and puts the information
-into one @file{TAGS} file in the @file{src/} directory. (The
-@file{src/} directory is below the top level of your Emacs directory.)
-
-@need 1250
-To build this @file{TAGS} file, go to the top level of your Emacs
-source directory and run the compile command @code{make tags}:
-
-@smallexample
-M-x compile RET make tags RET
-@end smallexample
-
-@noindent
-(The @code{make tags} command works well with the GNU Emacs sources,
-as well as with some other source packages.)
-
-For more information, see @ref{Tags, , Tag Tables, emacs, The GNU Emacs
-Manual}.
-
-@node Regexp Review, re-search Exercises, etags, Regexp Search
-@comment  node-name,  next,  previous,  up
-@section Review
-
-Here is a brief summary of some recently introduced functions.
-
-@table @code
-@item while
-Repeatedly evaluate the body of the expression so long as the first
-element of the body tests true.  Then return @code{nil}.  (The
-expression is evaluated only for its side effects.)
-
-@need 1250
-For example:
-
-@smallexample
-@group
-(let ((foo 2))
-  (while (> foo 0)
-    (insert (format "foo is %d.\n" foo))
-    (setq foo (1- foo))))
-
-     @result{}      foo is 2.
-             foo is 1.
-             nil
-@end group
-@end smallexample
-
-@noindent
-(The @code{insert} function inserts its arguments at point; the
-@code{format} function returns a string formatted from its arguments
-the way @code{message} formats its arguments; @code{\n} produces a new
-line.)
-
-@item re-search-forward
-Search for a pattern, and if the pattern is found, move point to rest
-just after it.
-
-@noindent
-Takes four arguments, like @code{search-forward}:
-
-@enumerate
-@item
-A regular expression that specifies the pattern to search for.
-(Remember to put quotation marks around this argument!)
-
-@item
-Optionally, the limit of the search.
-
-@item
-Optionally, what to do if the search fails, return @code{nil} or an
-error message.
-
-@item
-Optionally, how many times to repeat the search; if negative, the
-search goes backwards.
-@end enumerate
-
-@item let*
-Bind some variables locally to particular values,
-and then evaluate the remaining arguments, returning the value of the
-last one.  While binding the local variables, use the local values of
-variables bound earlier, if any.
-
-@need 1250
-For example:
-
-@smallexample
-@group
-(let* ((foo 7)
-      (bar (* 3 foo)))
-  (message "`bar' is %d." bar))
-     @result{} `bar' is 21.
-@end group
-@end smallexample
-
-@item match-beginning
-Return the position of the start of the text found by the last regular
-expression search.
-
-@item looking-at
-Return @code{t} for true if the text after point matches the argument,
-which should be a regular expression.
-
-@item eobp
-Return @code{t} for true if point is at the end of the accessible part
-of a buffer.  The end of the accessible part is the end of the buffer
-if the buffer is not narrowed; it is the end of the narrowed part if
-the buffer is narrowed.
-@end table
-
-@need 1500
-@node re-search Exercises,  , Regexp Review, Regexp Search
-@section Exercises with @code{re-search-forward}
-
-@itemize @bullet
-@item
-Write a function to search for a regular expression that matches two
-or more blank lines in sequence.
-
-@item
-Write a function to search for duplicated words, such as `the the'.
-@xref{Regexps, , Syntax of Regular Expressions, emacs, The GNU Emacs
-Manual}, for information on how to write a regexp (a regular
-expression) to match a string that is composed of two identical
-halves.  You can devise several regexps; some are better than others.
-The function I use is described in an appendix, along with several
-regexps.  @xref{the-the, , @code{the-the} Duplicated Words Function}.
-@end itemize
-
-@node Counting Words, Words in a defun, Regexp Search, Top
-@chapter Counting: Repetition and Regexps
-@cindex Repetition for word counting
-@cindex Regular expressions for word counting
-
-Repetition and regular expression searches are powerful tools that you
-often use when you write code in Emacs Lisp.  This chapter illustrates
-the use of regular expression searches through the construction of
-word count commands using @code{while} loops and recursion.
-
-@menu
-* Why Count Words::
-* count-words-region::          Use a regexp, but find a problem.
-* recursive-count-words::       Start with case of no words in region.
-* Counting Exercise::
-@end menu
-
-@node Why Count Words, count-words-region, Counting Words, Counting Words
-@ifnottex
-@unnumberedsec Counting words
-@end ifnottex
-
-The standard Emacs distribution contains a function for counting the
-number of lines within a region.  However, there is no corresponding
-function for counting words.
-
-Certain types of writing ask you to count words.  Thus, if you write
-an essay, you may be limited to 800 words; if you write a novel, you
-may discipline yourself to write 1000 words a day.  It seems odd to me
-that Emacs lacks a word count command.  Perhaps people use Emacs
-mostly for code or types of documentation that do not require word
-counts; or perhaps they restrict themselves to the operating system
-word count command, @code{wc}.  Alternatively, people may follow
-the publishers' convention and compute a word count by dividing the
-number of characters in a document by five.  In any event, here are
-commands to count words.
-
-@node count-words-region, recursive-count-words, Why Count Words, Counting Words
-@comment  node-name,  next,  previous,  up
-@section The @code{count-words-region} Function
-@findex count-words-region
-
-A word count command could count words in a line, paragraph, region,
-or buffer.  What should the command cover?  You could design the
-command to count the number of words in a complete buffer.  However,
-the Emacs tradition encourages flexibility---you may want to count
-words in just a section, rather than all of a buffer.  So it makes
-more sense to design the command to count the number of words in a
-region.  Once you have a @code{count-words-region} command, you can,
-if you wish, count words in a whole buffer by marking it with
-@w{@kbd{C-x h}} (@code{mark-whole-buffer}).
-
-Clearly, counting words is a repetitive act: starting from the
-beginning of the region, you count the first word, then the second
-word, then the third word, and so on, until you reach the end of the
-region.  This means that word counting is ideally suited to recursion
-or to a @code{while} loop.
-
-@menu
-* Design count-words-region::   The definition using a @code{while} loop.
-* Whitespace Bug::              The Whitespace Bug in @code{count-words-region}.
-@end menu
-
-@node Design count-words-region, Whitespace Bug, count-words-region, count-words-region
-@ifnottex
-@unnumberedsubsec Designing @code{count-words-region}
-@end ifnottex
-
-First, we will implement the word count command with a @code{while}
-loop, then with recursion.  The command will, of course, be
-interactive.
-
-@need 800
-The template for an interactive function definition is, as always:
-
-@smallexample
-@group
-(defun @var{name-of-function} (@var{argument-list})
-  "@var{documentation}@dots{}"
-  (@var{interactive-expression}@dots{})
-  @var{body}@dots{})
-@end group
-@end smallexample
-
-What we need to do is fill in the slots.
-
-The name of the function should be self-explanatory and similar to the
-existing @code{count-lines-region} name.  This makes the name easier
-to remember.  @code{count-words-region} is a good choice.
-
-The function counts words within a region.  This means that the
-argument list must contain symbols that are bound to the two
-positions, the beginning and end of the region.  These two positions
-can be called @samp{beginning} and @samp{end} respectively.  The first
-line of the documentation should be a single sentence, since that is
-all that is printed as documentation by a command such as
-@code{apropos}.  The interactive expression will be of the form
-@samp{(interactive "r")}, since that will cause Emacs to pass the
-beginning and end of the region to the function's argument list.  All
-this is routine.
-
-The body of the function needs to be written to do three tasks:
-first, to set up conditions under which the @code{while} loop can
-count words, second, to run the @code{while} loop, and third, to send
-a message to the user.
-
-When a user calls @code{count-words-region}, point may be at the
-beginning or the end of the region.  However, the counting process
-must start at the beginning of the region.  This means we will want
-to put point there if it is not already there.  Executing
-@code{(goto-char beginning)} ensures this.  Of course, we will want to
-return point to its expected position when the function finishes its
-work.  For this reason, the body must be enclosed in a
-@code{save-excursion} expression.
-
-The central part of the body of the function consists of a
-@code{while} loop in which one expression jumps point forward word by
-word, and another expression counts those jumps.  The true-or-false-test
-of the @code{while} loop should test true so long as point should jump
-forward, and false when point is at the end of the region.
-
-We could use @code{(forward-word 1)} as the expression for moving point
-forward word by word, but it is easier to see what Emacs identifies as a
-`word' if we use a regular expression search.
-
-A regular expression search that finds the pattern for which it is
-searching leaves point after the last character matched.  This means
-that a succession of successful word searches will move point forward
-word by word.
-
-As a practical matter, we want the regular expression search to jump
-over whitespace and punctuation between words as well as over the
-words themselves.  A regexp that refuses to jump over interword
-whitespace would never jump more than one word!  This means that
-the regexp should include the whitespace and punctuation that follows
-a word, if any, as well as the word itself.  (A word may end a buffer
-and not have any following whitespace or punctuation, so that part of
-the regexp must be optional.)
-
-Thus, what we want for the regexp is a pattern defining one or more
-word constituent characters followed, optionally, by one or more
-characters that are not word constituents.  The regular expression for
-this is:
-
-@smallexample
-\w+\W*
-@end smallexample
-
-@noindent
-The buffer's syntax table determines which characters are and are not
-word constituents.  (@xref{Syntax, , What Constitutes a Word or
-Symbol?}, for more about syntax.  Also, see @ref{Syntax, Syntax, The
-Syntax Table, emacs, The GNU Emacs Manual}, and @ref{Syntax Tables, ,
-Syntax Tables, elisp, The GNU Emacs Lisp Reference Manual}.)
-
-@need 800
-The search expression looks like this:
-
-@smallexample
-(re-search-forward "\\w+\\W*")
-@end smallexample
-
-@noindent
-(Note that paired backslashes precede the @samp{w} and @samp{W}.  A
-single backslash has special meaning to the Emacs Lisp interpreter.
-It indicates that the following character is interpreted differently
-than usual.  For example, the two characters, @samp{\n}, stand for
-@samp{newline}, rather than for a backslash followed by @samp{n}.  Two
-backslashes in a row stand for an ordinary, `unspecial' backslash, so
-Emacs Lisp interpreter ends of seeing a single backslash followed by a
-letter.  So it discovers the letter is special.)
-
-We need a counter to count how many words there are; this variable
-must first be set to 0 and then incremented each time Emacs goes
-around the @code{while} loop.  The incrementing expression is simply:
-
-@smallexample
-(setq count (1+ count))
-@end smallexample
-
-Finally, we want to tell the user how many words there are in the
-region.  The @code{message} function is intended for presenting this
-kind of information to the user.  The message has to be phrased so
-that it reads properly regardless of how many words there are in the
-region: we don't want to say that ``there are 1 words in the region''.
-The conflict between singular and plural is ungrammatical.  We can
-solve this problem by using a conditional expression that evaluates
-different messages depending on the number of words in the region.
-There are three possibilities: no words in the region, one word in the
-region, and more than one word.  This means that the @code{cond}
-special form is appropriate.
-
-@need 1500
-All this leads to the following function definition:
-
-@smallexample
-@group
-;;; @r{First version; has bugs!}
-(defun count-words-region (beginning end)
-  "Print number of words in the region.
-Words are defined as at least one word-constituent
-character followed by at least one character that
-is not a word-constituent.  The buffer's syntax
-table determines which characters these are."
-  (interactive "r")
-  (message "Counting words in region ... ")
-@end group
-
-@group
-;;; @r{1. Set up appropriate conditions.}
-  (save-excursion
-    (goto-char beginning)
-    (let ((count 0))
-@end group
-
-@group
-;;; @r{2. Run the} while @r{loop.}
-      (while (< (point) end)
-        (re-search-forward "\\w+\\W*")
-        (setq count (1+ count)))
-@end group
-
-@group
-;;; @r{3. Send a message to the user.}
-      (cond ((zerop count)
-             (message
-              "The region does NOT have any words."))
-            ((= 1 count)
-             (message
-              "The region has 1 word."))
-            (t
-             (message
-              "The region has %d words." count))))))
-@end group
-@end smallexample
-
-@noindent
-As written, the function works, but not in all circumstances.
-
-@node Whitespace Bug,  , Design count-words-region, count-words-region
-@comment  node-name,  next,  previous,  up
-@subsection The Whitespace Bug in @code{count-words-region}
-
-The @code{count-words-region} command described in the preceding
-section has two bugs, or rather, one bug with two manifestations.
-First, if you mark a region containing only whitespace in the middle
-of some text, the @code{count-words-region} command tells you that the
-region contains one word!  Second, if you mark a region containing
-only whitespace at the end of the buffer or the accessible portion of
-a narrowed buffer, the command displays an error message that looks
-like this:
-
-@smallexample
-Search failed: "\\w+\\W*"
-@end smallexample
-
-If you are reading this in Info in GNU Emacs, you can test for these
-bugs yourself.
-
-First, evaluate the function in the usual manner to install it.
-@ifinfo
-Here is a copy of the definition.  Place your cursor after the closing
-parenthesis and type @kbd{C-x C-e} to install it.
-
-@smallexample
-@group
-;; @r{First version; has bugs!}
-(defun count-words-region (beginning end)
-  "Print number of words in the region.
-Words are defined as at least one word-constituent character followed
-by at least one character that is not a word-constituent.  The buffer's
-syntax table determines which characters these are."
-@end group
-@group
-  (interactive "r")
-  (message "Counting words in region ... ")
-@end group
-
-@group
-;;; @r{1. Set up appropriate conditions.}
-  (save-excursion
-    (goto-char beginning)
-    (let ((count 0))
-@end group
-
-@group
-;;; @r{2. Run the} while @r{loop.}
-      (while (< (point) end)
-        (re-search-forward "\\w+\\W*")
-        (setq count (1+ count)))
-@end group
-
-@group
-;;; @r{3. Send a message to the user.}
-      (cond ((zerop count)
-             (message "The region does NOT have any words."))
-            ((= 1 count) (message "The region has 1 word."))
-            (t (message "The region has %d words." count))))))
-@end group
-@end smallexample
-@end ifinfo
-
-@need 1000
-If you wish, you can also install this keybinding by evaluating it:
-
-@smallexample
-(global-set-key "\C-c=" 'count-words-region)
-@end smallexample
-
-To conduct the first test, set mark and point to the beginning and end
-of the following line and then type @kbd{C-c =} (or @kbd{M-x
-count-words-region} if you have not bound @kbd{C-c =}):
-
-@smallexample
-    one   two  three
-@end smallexample
-
-@noindent
-Emacs will tell you, correctly, that the region has three words.
-
-Repeat the test, but place mark at the beginning of the line and place
-point just @emph{before} the word @samp{one}.  Again type the command
-@kbd{C-c =} (or @kbd{M-x count-words-region}).  Emacs should tell you
-that the region has no words, since it is composed only of the
-whitespace at the beginning of the line.  But instead Emacs tells you
-that the region has one word!
-
-For the third test, copy the sample line to the end of the
-@file{*scratch*} buffer and then type several spaces at the end of the
-line.  Place mark right after the word @samp{three} and point at the
-end of line.  (The end of the line will be the end of the buffer.)
-Type @kbd{C-c =} (or @kbd{M-x count-words-region}) as you did before.
-Again, Emacs should tell you that the region has no words, since it is
-composed only of the whitespace at the end of the line.  Instead,
-Emacs displays an error message saying @samp{Search failed}.
-
-The two bugs stem from the same problem.
-
-Consider the first manifestation of the bug, in which the command
-tells you that the whitespace at the beginning of the line contains
-one word.  What happens is this: The @code{M-x count-words-region}
-command moves point to the beginning of the region.  The @code{while}
-tests whether the value of point is smaller than the value of
-@code{end}, which it is.  Consequently, the regular expression search
-looks for and finds the first word.  It leaves point after the word.
-@code{count} is set to one.  The @code{while} loop repeats; but this
-time the value of point is larger than the value of @code{end}, the
-loop is exited; and the function displays a message saying the number
-of words in the region is one.  In brief, the regular expression
-search looks for and finds the word even though it is outside
-the marked region.
-
-In the second manifestation of the bug, the region is whitespace at
-the end of the buffer.  Emacs says @samp{Search failed}.  What happens
-is that the true-or-false-test in the @code{while} loop tests true, so
-the search expression is executed.  But since there are no more words
-in the buffer, the search fails.
-
-In both manifestations of the bug, the search extends or attempts to
-extend outside of the region.
-
-The solution is to limit the search to the region---this is a fairly
-simple action, but as you may have come to expect, it is not quite as
-simple as you might think.
-
-As we have seen, the @code{re-search-forward} function takes a search
-pattern as its first argument.  But in addition to this first,
-mandatory argument, it accepts three optional arguments.  The optional
-second argument bounds the search.  The optional third argument, if
-@code{t}, causes the function to return @code{nil} rather than signal
-an error if the search fails.  The optional fourth argument is a
-repeat count.  (In Emacs, you can see a function's documentation by
-typing @kbd{C-h f}, the name of the function, and then @key{RET}.)
-
-In the @code{count-words-region} definition, the value of the end of
-the region is held by the variable @code{end} which is passed as an
-argument to the function.  Thus, we can add @code{end} as an argument
-to the regular expression search expression:
-
-@smallexample
-(re-search-forward "\\w+\\W*" end)
-@end smallexample
-
-However, if you make only this change to the @code{count-words-region}
-definition and then test the new version of the definition on a
-stretch of whitespace, you will receive an error message saying
-@samp{Search failed}.
-
-What happens is this: the search is limited to the region, and fails
-as you expect because there are no word-constituent characters in the
-region.  Since it fails, we receive an error message.  But we do not
-want to receive an error message in this case; we want to receive the
-message that "The region does NOT have any words."
-
-The solution to this problem is to provide @code{re-search-forward}
-with a third argument of @code{t}, which causes the function to return
-@code{nil} rather than signal an error if the search fails.
-
-However, if you make this change and try it, you will see the message
-``Counting words in region ... '' and @dots{} you will keep on seeing
-that message @dots{}, until you type @kbd{C-g} (@code{keyboard-quit}).
-
-Here is what happens: the search is limited to the region, as before,
-and it fails because there are no word-constituent characters in the
-region, as expected.  Consequently, the @code{re-search-forward}
-expression returns @code{nil}.  It does nothing else.  In particular,
-it does not move point, which it does as a side effect if it finds the
-search target.  After the @code{re-search-forward} expression returns
-@code{nil}, the next expression in the @code{while} loop is evaluated.
-This expression increments the count.  Then the loop repeats.  The
-true-or-false-test tests true because the value of point is still less
-than the value of end, since the @code{re-search-forward} expression
-did not move point. @dots{} and the cycle repeats @dots{}
-
-The @code{count-words-region} definition requires yet another
-modification, to cause the true-or-false-test of the @code{while} loop
-to test false if the search fails.  Put another way, there are two
-conditions that must be satisfied in the true-or-false-test before the
-word count variable is incremented: point must still be within the
-region and the search expression must have found a word to count.
-
-Since both the first condition and the second condition must be true
-together, the two expressions, the region test and the search
-expression, can be joined with an @code{and} special form and embedded in
-the @code{while} loop as the true-or-false-test, like this:
-
-@smallexample
-(and (< (point) end) (re-search-forward "\\w+\\W*" end t))
-@end smallexample
-
-@c colon in printed section title causes problem in Info cross reference
-@c also trouble with an overfull hbox
-@iftex
-@noindent
-(For information about @code{and}, see
-@ref{kill-new function, , The @code{kill-new} function}.)
-@end iftex
-@ifinfo
-@noindent
-(@xref{kill-new function, , The @code{kill-new} function}, for
-information about @code{and}.)
-@end ifinfo
-
-The @code{re-search-forward} expression returns @code{t} if the search
-succeeds and as a side effect moves point.  Consequently, as words are
-found, point is moved through the region.  When the search expression
-fails to find another word, or when point reaches the end of the
-region, the true-or-false-test tests false, the @code{while} loop
-exits, and the @code{count-words-region} function displays one or
-other of its messages.
-
-After incorporating these final changes, the @code{count-words-region}
-works without bugs (or at least, without bugs that I have found!).
-Here is what it looks like:
-
-@smallexample
-@group
-;;; @r{Final version:} @code{while}
-(defun count-words-region (beginning end)
-  "Print number of words in the region."
-  (interactive "r")
-  (message "Counting words in region ... ")
-@end group
-
-@group
-;;; @r{1. Set up appropriate conditions.}
-  (save-excursion
-    (let ((count 0))
-      (goto-char beginning)
-@end group
-
-@group
-;;; @r{2. Run the} while @r{loop.}
-      (while (and (< (point) end)
-                  (re-search-forward "\\w+\\W*" end t))
-        (setq count (1+ count)))
-@end group
-
-@group
-;;; @r{3. Send a message to the user.}
-      (cond ((zerop count)
-             (message
-              "The region does NOT have any words."))
-            ((= 1 count)
-             (message
-              "The region has 1 word."))
-            (t
-             (message
-              "The region has %d words." count))))))
-@end group
-@end smallexample
-
-@node recursive-count-words, Counting Exercise, count-words-region, Counting Words
-@comment  node-name,  next,  previous,  up
-@section Count Words Recursively
-@cindex Count words recursively
-@cindex Recursively counting words
-@cindex Words, counted recursively
-
-You can write the function for counting words recursively as well as
-with a @code{while} loop.  Let's see how this is done.
-
-First, we need to recognize that the @code{count-words-region}
-function has three jobs: it sets up the appropriate conditions for
-counting to occur; it counts the words in the region; and it sends a
-message to the user telling how many words there are.
-
-If we write a single recursive function to do everything, we will
-receive a message for every recursive call.  If the region contains 13
-words, we will receive thirteen messages, one right after the other.
-We don't want this!  Instead, we must write two functions to do the
-job, one of which (the recursive function) will be used inside of the
-other.  One function will set up the conditions and display the
-message; the other will return the word count.
-
-Let us start with the function that causes the message to be displayed.
-We can continue to call this @code{count-words-region}.
-
-This is the function that the user will call.  It will be interactive.
-Indeed, it will be similar to our previous versions of this
-function, except that it will call @code{recursive-count-words} to
-determine how many words are in the region.
-
-@need 1250
-We can readily construct a template for this function, based on our
-previous versions:
-
-@smallexample
-@group
-;; @r{Recursive version; uses regular expression search}
-(defun count-words-region (beginning end)
-  "@var{documentation}@dots{}"
-  (@var{interactive-expression}@dots{})
-@end group
-@group
-
-;;; @r{1. Set up appropriate conditions.}
-  (@var{explanatory message})
-  (@var{set-up functions}@dots{}
-@end group
-@group
-
-;;; @r{2. Count the words.}
-    @var{recursive call}
-@end group
-@group
-
-;;; @r{3. Send a message to the user.}
-    @var{message providing word count}))
-@end group
-@end smallexample
-
-The definition looks straightforward, except that somehow the count
-returned by the recursive call must be passed to the message
-displaying the word count.  A little thought suggests that this can be
-done by making use of a @code{let} expression: we can bind a variable
-in the varlist of a @code{let} expression to the number of words in
-the region, as returned by the recursive call; and then the
-@code{cond} expression, using binding, can display the value to the
-user.
-
-Often, one thinks of the binding within a @code{let} expression as
-somehow secondary to the `primary' work of a function.  But in this
-case, what you might consider the `primary' job of the function,
-counting words, is done within the @code{let} expression.
-
-@need 1250
-Using @code{let}, the function definition looks like this:
-
-@smallexample
-@group
-(defun count-words-region (beginning end)
-  "Print number of words in the region."
-  (interactive "r")
-@end group
-
-@group
-;;; @r{1. Set up appropriate conditions.}
-  (message "Counting words in region ... ")
-  (save-excursion
-    (goto-char beginning)
-@end group
-
-@group
-;;; @r{2. Count the words.}
-    (let ((count (recursive-count-words end)))
-@end group
-
-@group
-;;; @r{3. Send a message to the user.}
-      (cond ((zerop count)
-             (message
-              "The region does NOT have any words."))
-            ((= 1 count)
-             (message
-              "The region has 1 word."))
-            (t
-             (message
-              "The region has %d words." count))))))
-@end group
-@end smallexample
-
-Next, we need to write the recursive counting function.
-
-A recursive function has at least three parts: the `do-again-test', the
-`next-step-expression', and the recursive call.
-
-The do-again-test determines whether the function will or will not be
-called again.  Since we are counting words in a region and can use a
-function that moves point forward for every word, the do-again-test
-can check whether point is still within the region.  The do-again-test
-should find the value of point and determine whether point is before,
-at, or after the value of the end of the region.  We can use the
-@code{point} function to locate point.  Clearly, we must pass the
-value of the end of the region to the recursive counting function as an
-argument.
-
-In addition, the do-again-test should also test whether the search finds a
-word.  If it does not, the function should not call itself again.
-
-The next-step-expression changes a value so that when the recursive
-function is supposed to stop calling itself, it stops.  More
-precisely, the next-step-expression changes a value so that at the
-right time, the do-again-test stops the recursive function from
-calling itself again.  In this case, the next-step-expression can be
-the expression that moves point forward, word by word.
-
-The third part of a recursive function is the recursive call.
-
-Somewhere, also, we also need a part that does the `work' of the
-function, a part that does the counting.  A vital part!
-
-@need 1250
-But already, we have an outline of the recursive counting function:
-
-@smallexample
-@group
-(defun recursive-count-words (region-end)
-  "@var{documentation}@dots{}"
-   @var{do-again-test}
-   @var{next-step-expression}
-   @var{recursive call})
-@end group
-@end smallexample
-
-Now we need to fill in the slots.  Let's start with the simplest cases
-first:  if point is at or beyond the end of the region, there cannot
-be any words in the region, so the function should return zero.
-Likewise, if the search fails, there are no words to count, so the
-function should return zero.
-
-On the other hand, if point is within the region and the search
-succeeds, the function should call itself again.
-
-@need 800
-Thus, the do-again-test should look like this:
-
-@smallexample
-@group
-(and (< (point) region-end)
-     (re-search-forward "\\w+\\W*" region-end t))
-@end group
-@end smallexample
-
-Note that the search expression is part of the do-again-test---the
-function returns @code{t} if its search succeeds and @code{nil} if it
-fails.  (@xref{Whitespace Bug, , The Whitespace Bug in
-@code{count-words-region}}, for an explanation of how
-@code{re-search-forward} works.)
-
-The do-again-test is the true-or-false test of an @code{if} clause.
-Clearly, if the do-again-test succeeds, the then-part of the @code{if}
-clause should call the function again; but if it fails, the else-part
-should return zero since either point is outside the region or the
-search failed because there were no words to find.
-
-But before considering the recursive call, we need to consider the
-next-step-expression.  What is it?  Interestingly, it is the search
-part of the do-again-test.
-
-In addition to returning @code{t} or @code{nil} for the
-do-again-test, @code{re-search-forward} moves point forward as a side
-effect of a successful search.  This is the action that changes the
-value of point so that the recursive function stops calling itself
-when point completes its movement through the region.  Consequently,
-the @code{re-search-forward} expression is the next-step-expression.
-
-@need 1200
-In outline, then, the body of the @code{recursive-count-words}
-function looks like this:
-
-@smallexample
-@group
-(if @var{do-again-test-and-next-step-combined}
-    ;; @r{then}
-    @var{recursive-call-returning-count}
-  ;; @r{else}
-  @var{return-zero})
-@end group
-@end smallexample
-
-How to incorporate the mechanism that counts?
-
-If you are not used to writing recursive functions, a question like
-this can be troublesome.  But it can and should be approached
-systematically.
-
-We know that the counting mechanism should be associated in some way
-with the recursive call.  Indeed, since the next-step-expression moves
-point forward by one word, and since a recursive call is made for
-each word, the counting mechanism must be an expression that adds one
-to the value returned by a call to @code{recursive-count-words}.
-
-@need 800
-Consider several cases:
-
-@itemize @bullet
-@item
-If there are two words in the region, the function should return
-a value resulting from adding one to the value returned when it counts
-the first word, plus the number returned when it counts the remaining
-words in the region, which in this case is one.
-
-@item
-If there is one word in the region, the function should return
-a value resulting from adding one to the value returned when it counts
-that word, plus the number returned when it counts the remaining
-words in the region, which in this case is zero.
-
-@item
-If there are no words in the region, the function should return zero.
-@end itemize
-
-From the sketch we can see that the else-part of the @code{if} returns
-zero for the case of no words.  This means that the then-part of the
-@code{if} must return a value resulting from adding one to the value
-returned from a count of the remaining words.
-
-@need 1200
-The expression will look like this, where @code{1+} is a function that
-adds one to its argument.
-
-@smallexample
-(1+ (recursive-count-words region-end))
-@end smallexample
-
-@need 1200
-The whole @code{recursive-count-words} function will then look like
-this:
-
-@smallexample
-@group
-(defun recursive-count-words (region-end)
-  "@var{documentation}@dots{}"
-
-;;; @r{1. do-again-test}
-  (if (and (< (point) region-end)
-           (re-search-forward "\\w+\\W*" region-end t))
-@end group
-
-@group
-;;; @r{2. then-part: the recursive call}
-      (1+ (recursive-count-words region-end))
-
-;;; @r{3. else-part}
-    0))
-@end group
-@end smallexample
-
-@need 1250
-Let's examine how this works:
-
-If there are no words in the region, the else part of the @code{if}
-expression is evaluated and consequently the function returns zero.
-
-If there is one word in the region, the value of point is less than
-the value of @code{region-end} and the search succeeds.  In this case,
-the true-or-false-test of the @code{if} expression tests true, and the
-then-part of the @code{if} expression is evaluated.  The counting
-expression is evaluated.  This expression returns a value (which will
-be the value returned by the whole function) that is the sum of one
-added to the value returned by a recursive call.
-
-Meanwhile, the next-step-expression has caused point to jump over the
-first (and in this case only) word in the region.  This means that
-when @code{(recursive-count-words region-end)} is evaluated a second
-time, as a result of the recursive call, the value of point will be
-equal to or greater than the value of region end.  So this time,
-@code{recursive-count-words} will return zero.  The zero will be added
-to one, and the original evaluation of @code{recursive-count-words}
-will return one plus zero, which is one, which is the correct amount.
-
-Clearly, if there are two words in the region, the first call to
-@code{recursive-count-words} returns one added to the value returned
-by calling @code{recursive-count-words} on a region containing the
-remaining word---that is, it adds one to one, producing two, which is
-the correct amount.
-
-Similarly, if there are three words in the region, the first call to
-@code{recursive-count-words} returns one added to the value returned
-by calling @code{recursive-count-words} on a region containing the
-remaining two words---and so on and so on.
-
-@need 1250
-@noindent
-With full documentation the two functions look like this:
-
-@need 1250
-@noindent
-The recursive function:
-
-@findex recursive-count-words
-@smallexample
-@group
-(defun recursive-count-words (region-end)
-  "Number of words between point and REGION-END."
-@end group
-
-@group
-;;; @r{1. do-again-test}
-  (if (and (< (point) region-end)
-           (re-search-forward "\\w+\\W*" region-end t))
-@end group
-
-@group
-;;; @r{2. then-part: the recursive call}
-      (1+ (recursive-count-words region-end))
-
-;;; @r{3. else-part}
-    0))
-@end group
-@end smallexample
-
-@need 800
-@noindent
-The wrapper:
-
-@smallexample
-@group
-;;; @r{Recursive version}
-(defun count-words-region (beginning end)
-  "Print number of words in the region.
-@end group
-
-@group
-Words are defined as at least one word-constituent
-character followed by at least one character that is
-not a word-constituent.  The buffer's syntax table
-determines which characters these are."
-@end group
-@group
-  (interactive "r")
-  (message "Counting words in region ... ")
-  (save-excursion
-    (goto-char beginning)
-    (let ((count (recursive-count-words end)))
-@end group
-@group
-      (cond ((zerop count)
-             (message
-              "The region does NOT have any words."))
-@end group
-@group
-            ((= 1 count)
-             (message "The region has 1 word."))
-            (t
-             (message
-              "The region has %d words." count))))))
-@end group
-@end smallexample
-
-@node Counting Exercise,  , recursive-count-words, Counting Words
-@section Exercise: Counting Punctuation
-
-Using a @code{while} loop, write a function to count the number of
-punctuation marks in a region---period, comma, semicolon, colon,
-exclamation mark, and question mark.  Do the same using recursion.
-
-@node Words in a defun, Readying a Graph, Counting Words, Top
-@chapter Counting Words in a @code{defun}
-@cindex Counting words in a @code{defun}
-@cindex Word counting in a @code{defun}
-
-Our next project is to count the number of words in a function
-definition.  Clearly, this can be done using some variant of
-@code{count-word-region}.  @xref{Counting Words, , Counting Words:
-Repetition and Regexps}.  If we are just going to count the words in
-one definition, it is easy enough to mark the definition with the
-@kbd{C-M-h} (@code{mark-defun}) command, and then call
-@code{count-word-region}.
-
-However, I am more ambitious: I want to count the words and symbols in
-every definition in the Emacs sources and then print a graph that
-shows how many functions there are of each length: how many contain 40
-to 49 words or symbols, how many contain 50 to 59 words or symbols,
-and so on.  I have often been curious how long a typical function is,
-and this will tell.
-
-@menu
-* Divide and Conquer::
-* Words and Symbols::           What to count?
-* Syntax::                      What constitutes a word or symbol?
-* count-words-in-defun::        Very like @code{count-words}.
-* Several defuns::              Counting several defuns in a file.
-* Find a File::                 Do you want to look at a file?
-* lengths-list-file::           A list of the lengths of many definitions.
-* Several files::               Counting in definitions in different files.
-* Several files recursively::   Recursively counting in different files.
-* Prepare the data::            Prepare the data for display in a graph.
-@end menu
-
-@node Divide and Conquer, Words and Symbols, Words in a defun, Words in a defun
-@ifnottex
-@unnumberedsec Divide and Conquer
-@end ifnottex
-
-Described in one phrase, the histogram project is daunting; but
-divided into numerous small steps, each of which we can take one at a
-time, the project becomes less fearsome.  Let us consider what the
-steps must be:
-
-@itemize @bullet
-@item
-First, write a function to count the words in one definition.  This
-includes the problem of handling symbols as well as words.
-
-@item
-Second, write a function to list the numbers of words in each function
-in a file.  This function can use the @code{count-words-in-defun}
-function.
-
-@item
-Third, write a function to list the numbers of words in each function
-in each of several files.  This entails automatically finding the
-various files, switching to them, and counting the words in the
-definitions within them.
-
-@item
-Fourth, write a function to convert the list of numbers that we
-created in step three to a form that will be suitable for printing as
-a graph.
-
-@item
-Fifth, write a function to print the results as a graph.
-@end itemize
-
-This is quite a project!  But if we take each step slowly, it will not
-be difficult.
-
-@node Words and Symbols, Syntax, Divide and Conquer, Words in a defun
-@section What to Count?
-@cindex Words and symbols in defun
-
-When we first start thinking about how to count the words in a
-function definition, the first question is (or ought to be) what are
-we going to count?  When we speak of `words' with respect to a Lisp
-function definition, we are actually speaking, in large part, of
-`symbols'.  For example, the following @code{multiply-by-seven}
-function contains the five symbols @code{defun},
-@code{multiply-by-seven}, @code{number}, @code{*}, and @code{7}.  In
-addition, in the documentation string, it contains the four words
-@samp{Multiply}, @samp{NUMBER}, @samp{by}, and @samp{seven}.  The
-symbol @samp{number} is repeated, so the definition contains a total
-of ten words and symbols.
-
-@smallexample
-@group
-(defun multiply-by-seven (number)
-  "Multiply NUMBER by seven."
-  (* 7 number))
-@end group
-@end smallexample
-
-@noindent
-However, if we mark the @code{multiply-by-seven} definition with
-@kbd{C-M-h} (@code{mark-defun}), and then call
-@code{count-words-region} on it, we will find that
-@code{count-words-region} claims the definition has eleven words, not
-ten!  Something is wrong!
-
-The problem is twofold: @code{count-words-region} does not count the
-@samp{*} as a word, and it counts the single symbol,
-@code{multiply-by-seven}, as containing three words.  The hyphens are
-treated as if they were interword spaces rather than intraword
-connectors: @samp{multiply-by-seven} is counted as if it were written
-@samp{multiply by seven}.
-
-The cause of this confusion is the regular expression search within
-the @code{count-words-region} definition that moves point forward word
-by word.  In the canonical version of @code{count-words-region}, the
-regexp is:
-
-@smallexample
-"\\w+\\W*"
-@end smallexample
-
-@noindent
-This regular expression is a pattern defining one or more word
-constituent characters possibly followed by one or more characters
-that are not word constituents.  What is meant by `word constituent
-characters' brings us to the issue of syntax, which is worth a section
-of its own.
-
-@node Syntax, count-words-in-defun, Words and Symbols, Words in a defun
-@section What Constitutes a Word or Symbol?
-@cindex Syntax categories and tables
-
-Emacs treats different characters as belonging to different
-@dfn{syntax categories}.  For example, the regular expression,
-@samp{\\w+}, is a pattern specifying one or more @emph{word
-constituent} characters.  Word constituent characters are members of
-one syntax category.  Other syntax categories include the class of
-punctuation characters, such as the period and the comma, and the
-class of whitespace characters, such as the blank space and the tab
-character.  (For more information, see @ref{Syntax, Syntax, The Syntax
-Table, emacs, The GNU Emacs Manual}, and @ref{Syntax Tables, , Syntax
-Tables, elisp, The GNU Emacs Lisp Reference Manual}.)
-
-Syntax tables specify which characters belong to which categories.
-Usually, a hyphen is not specified as a `word constituent character'.
-Instead, it is specified as being in the `class of characters that are
-part of symbol names but not words.'  This means that the
-@code{count-words-region} function treats it in the same way it treats
-an interword white space, which is why @code{count-words-region}
-counts @samp{multiply-by-seven} as three words.
-
-There are two ways to cause Emacs to count @samp{multiply-by-seven} as
-one symbol: modify the syntax table or modify the regular expression.
-
-We could redefine a hyphen as a word constituent character by
-modifying the syntax table that Emacs keeps for each mode.  This
-action would serve our purpose, except that a hyphen is merely the
-most common character within symbols that is not typically a word
-constituent character; there are others, too.
-
-Alternatively, we can redefine the regular expression used in the
-@code{count-words} definition so as to include symbols.  This
-procedure has the merit of clarity, but the task is a little tricky.
-
-@need 1200
-The first part is simple enough: the pattern must match ``at least one
-character that is a word or symbol constituent''.  Thus:
-
-@smallexample
-"\\(\\w\\|\\s_\\)+"
-@end smallexample
-
-@noindent
-The @samp{\\(} is the first part of the grouping construct that
-includes the @samp{\\w} and the @samp{\\s_} as alternatives, separated
-by the @samp{\\|}.  The @samp{\\w} matches any word-constituent
-character and the @samp{\\s_} matches any character that is part of a
-symbol name but not a word-constituent character.  The @samp{+}
-following the group indicates that the word or symbol constituent
-characters must be matched at least once.
-
-However, the second part of the regexp is more difficult to design.
-What we want is to follow the first part with ``optionally one or more
-characters that are not constituents of a word or symbol''.  At first,
-I thought I could define this with the following:
-
-@smallexample
-"\\(\\W\\|\\S_\\)*"
-@end smallexample
-
-@noindent
-The upper case @samp{W} and @samp{S} match characters that are
-@emph{not} word or symbol constituents.  Unfortunately, this
-expression matches any character that is either not a word constituent
-or not a symbol constituent.  This matches any character!
-
-I then noticed that every word or symbol in my test region was
-followed by white space (blank space, tab, or newline).  So I tried
-placing a pattern to match one or more blank spaces after the pattern
-for one or more word or symbol constituents.  This failed, too.  Words
-and symbols are often separated by whitespace, but in actual code
-parentheses may follow symbols and punctuation may follow words.  So
-finally, I designed a pattern in which the word or symbol constituents
-are followed optionally by characters that are not white space and
-then followed optionally by white space.
-
-@need 800
-Here is the full regular expression:
-
-@smallexample
-"\\(\\w\\|\\s_\\)+[^ \t\n]*[ \t\n]*"
-@end smallexample
-
-@node count-words-in-defun, Several defuns, Syntax, Words in a defun
-@section The @code{count-words-in-defun} Function
-@cindex Counting words in a @code{defun}
-
-We have seen that there are several ways to write a
-@code{count-word-region} function.  To write a
-@code{count-words-in-defun}, we need merely adapt one of these
-versions.
-
-The version that uses a @code{while} loop is easy to understand, so I
-am going to adapt that.  Because @code{count-words-in-defun} will be
-part of a more complex program, it need not be interactive and it need
-not display a message but just return the count.  These considerations
-simplify the definition a little.
-
-On the other hand, @code{count-words-in-defun} will be used within a
-buffer that contains function definitions.  Consequently, it is
-reasonable to ask that the function determine whether it is called
-when point is within a function definition, and if it is, to return
-the count for that definition.  This adds complexity to the
-definition, but saves us from needing to pass arguments to the
-function.
-
-@need 1250
-These considerations lead us to prepare the following template:
-
-@smallexample
-@group
-(defun count-words-in-defun ()
-  "@var{documentation}@dots{}"
-  (@var{set up}@dots{}
-     (@var{while loop}@dots{})
-   @var{return count})
-@end group
-@end smallexample
-
-@noindent
-As usual, our job is to fill in the slots.
-
-First, the set up.
-
-We are presuming that this function will be called within a buffer
-containing function definitions.  Point will either be within a
-function definition or not.  For @code{count-words-in-defun} to work,
-point must move to the beginning of the definition, a counter must
-start at zero, and the counting loop must stop when point reaches the
-end of the definition.
-
-The @code{beginning-of-defun} function searches backwards for an
-opening delimiter such as a @samp{(} at the beginning of a line, and
-moves point to that position, or else to the limit of the search.  In
-practice, this means that @code{beginning-of-defun} moves point to the
-beginning of an enclosing or preceding function definition, or else to
-the beginning of the buffer.  We can use @code{beginning-of-defun} to
-place point where we wish to start.
-
-The @code{while} loop requires a counter to keep track of the words or
-symbols being counted.  A @code{let} expression can be used to create
-a local variable for this purpose, and bind it to an initial value of zero.
-
-The @code{end-of-defun} function works like @code{beginning-of-defun}
-except that it moves point to the end of the definition.
-@code{end-of-defun} can be used as part of an expression that
-determines the position of the end of the definition.
-
-The set up for @code{count-words-in-defun} takes shape rapidly: first
-we move point to the beginning of the definition, then we create a
-local variable to hold the count, and finally, we record the position
-of the end of the definition so the @code{while} loop will know when to stop
-looping.
-
-@need 1250
-The code looks like this:
-
-@smallexample
-@group
-(beginning-of-defun)
-(let ((count 0)
-      (end (save-excursion (end-of-defun) (point))))
-@end group
-@end smallexample
-
-@noindent
-The code is simple.  The only slight complication is likely to concern
-@code{end}: it is bound to the position of the end of the definition
-by a @code{save-excursion} expression that returns the value of point
-after @code{end-of-defun} temporarily moves it to the end of the
-definition.
-
-The second part of the @code{count-words-in-defun}, after the set up,
-is the @code{while} loop.
-
-The loop must contain an expression that jumps point forward word by
-word and symbol by symbol, and another expression that counts the
-jumps.  The true-or-false-test for the @code{while} loop should test
-true so long as point should jump forward, and false when point is at
-the end of the definition.  We have already redefined the regular
-expression for this (@pxref{Syntax}), so the loop is straightforward:
-
-@smallexample
-@group
-(while (and (< (point) end)
-            (re-search-forward
-             "\\(\\w\\|\\s_\\)+[^ \t\n]*[ \t\n]*" end t)
-  (setq count (1+ count)))
-@end group
-@end smallexample
-
-The third part of the function definition returns the count of words
-and symbols.  This part is the last expression within the body of the
-@code{let} expression, and can be, very simply, the local variable
-@code{count}, which when evaluated returns the count.
-
-@need 1250
-Put together, the @code{count-words-in-defun} definition looks like this:
-
-@findex count-words-in-defun
-@smallexample
-@group
-(defun count-words-in-defun ()
-  "Return the number of words and symbols in a defun."
-  (beginning-of-defun)
-  (let ((count 0)
-        (end (save-excursion (end-of-defun) (point))))
-@end group
-@group
-    (while
-        (and (< (point) end)
-             (re-search-forward
-              "\\(\\w\\|\\s_\\)+[^ \t\n]*[ \t\n]*"
-              end t))
-      (setq count (1+ count)))
-    count))
-@end group
-@end smallexample
-
-How to test this?  The function is not interactive, but it is easy to
-put a wrapper around the function to make it interactive; we can use
-almost the same code as for the recursive version of
-@code{count-words-region}:
-
-@smallexample
-@group
-;;; @r{Interactive version.}
-(defun count-words-defun ()
-  "Number of words and symbols in a function definition."
-  (interactive)
-  (message
-   "Counting words and symbols in function definition ... ")
-@end group
-@group
-  (let ((count (count-words-in-defun)))
-    (cond
-     ((zerop count)
-      (message
-       "The definition does NOT have any words or symbols."))
-@end group
-@group
-     ((= 1 count)
-      (message
-       "The definition has 1 word or symbol."))
-     (t
-      (message
-       "The definition has %d words or symbols." count)))))
-@end group
-@end smallexample
-
-@need 800
-@noindent
-Let's re-use @kbd{C-c =} as a convenient keybinding:
-
-@smallexample
-(global-set-key "\C-c=" 'count-words-defun)
-@end smallexample
-
-Now we can try out @code{count-words-defun}: install both
-@code{count-words-in-defun} and @code{count-words-defun}, and set the
-keybinding, and then place the cursor within the following definition:
-
-@smallexample
-@group
-(defun multiply-by-seven (number)
-  "Multiply NUMBER by seven."
-  (* 7 number))
-     @result{} 10
-@end group
-@end smallexample
-
-@noindent
-Success!  The definition has 10 words and symbols.
-
-The next problem is to count the numbers of words and symbols in
-several definitions within a single file.
-
-@node Several defuns, Find a File, count-words-in-defun, Words in a defun
-@section Count Several @code{defuns} Within a File
-
-A file such as @file{simple.el} may have a hundred or more function
-definitions within it.  Our long term goal is to collect statistics on
-many files, but as a first step, our immediate goal is to collect
-statistics on one file.
-
-The information will be a series of numbers, each number being the
-length of a function definition.  We can store the numbers in a list.
-
-We know that we will want to incorporate the information regarding one
-file with information about many other files; this means that the
-function for counting definition lengths within one file need only
-return the list of lengths.  It need not and should not display any
-messages.
-
-The word count commands contain one expression to jump point forward
-word by word and another expression to count the jumps.  The function
-to return the lengths of definitions can be designed to work the same
-way, with one expression to jump point forward definition by
-definition and another expression to construct the lengths' list.
-
-This statement of the problem makes it elementary to write the
-function definition.  Clearly, we will start the count at the
-beginning of the file, so the first command will be @code{(goto-char
-(point-min))}.  Next, we start the @code{while} loop; and the
-true-or-false test of the loop can be a regular expression search for
-the next function definition---so long as the search succeeds, point
-is moved forward and then the body of the loop is evaluated.  The body
-needs an expression that constructs the lengths' list.  @code{cons},
-the list construction command, can be used to create the list.  That
-is almost all there is to it.
-
-@need 800
-Here is what this fragment of code looks like:
-
-@smallexample
-@group
-(goto-char (point-min))
-(while (re-search-forward "^(defun" nil t)
-  (setq lengths-list
-        (cons (count-words-in-defun) lengths-list)))
-@end group
-@end smallexample
-
-What we have left out is the mechanism for finding the file that
-contains the function definitions.
-
-In previous examples, we either used this, the Info file, or we
-switched back and forth to some other buffer, such as the
-@file{*scratch*} buffer.
-
-Finding a file is a new process that we have not yet discussed.
-
-@node Find a File, lengths-list-file, Several defuns, Words in a defun
-@comment  node-name,  next,  previous,  up
-@section Find a File
-@cindex Find a File
-
-To find a file in Emacs, you use the @kbd{C-x C-f} (@code{find-file})
-command.  This command is almost, but not quite right for the lengths
-problem.
-
-@need 1200
-Let's look at the source for @code{find-file}:
-
-@smallexample
-@group
-(defun find-file (filename)
-  "Edit file FILENAME.
-Switch to a buffer visiting file FILENAME,
-creating one if none already exists."
-  (interactive "FFind file: ")
-  (switch-to-buffer (find-file-noselect filename)))
-@end group
-@end smallexample
-
-@noindent
-(The most recent version of the @code{find-file} function definition
-permits you to specify optional wildcards to visit multiple files; that
-makes the definition more complex and we will not discuss it here,
-since it is not relevant.  You can see its source using either
-@kbd{M-.} (@code{find-tag}) or @kbd{C-h f} (@code{describe-function}).)
-
-@ignore
-In Emacs 22
-(defun find-file (filename &optional wildcards)
-  "Edit file FILENAME.
-Switch to a buffer visiting file FILENAME,
-creating one if none already exists.
-Interactively, the default if you just type RET is the current directory,
-but the visited file name is available through the minibuffer history:
-type M-n to pull it into the minibuffer.
-
-Interactively, or if WILDCARDS is non-nil in a call from Lisp,
-expand wildcards (if any) and visit multiple files.  You can
-suppress wildcard expansion by setting `find-file-wildcards' to nil.
-
-To visit a file without any kind of conversion and without
-automatically choosing a major mode, use \\[find-file-literally]."
-  (interactive (find-file-read-args "Find file: " nil))
-  (let ((value (find-file-noselect filename nil nil wildcards)))
-    (if (listp value)
-        (mapcar 'switch-to-buffer (nreverse value))
-      (switch-to-buffer value))))
-@end ignore
-
-The definition I am showing possesses short but complete documentation
-and an interactive specification that prompts you for a file name when
-you use the command interactively.  The body of the definition
-contains two functions, @code{find-file-noselect} and
-@code{switch-to-buffer}.
-
-According to its documentation as shown by @kbd{C-h f} (the
-@code{describe-function} command), the @code{find-file-noselect}
-function reads the named file into a buffer and returns the buffer.
-(Its most recent version includes an optional wildcards argument,
-too, as well as another to read a file literally and an other you
-suppress warning messages.  These optional arguments are irrelevant.)
-
-However, the @code{find-file-noselect} function does not select the
-buffer in which it puts the file.  Emacs does not switch its attention
-(or yours if you are using @code{find-file-noselect}) to the selected
-buffer.  That is what @code{switch-to-buffer} does: it switches the
-buffer to which Emacs attention is directed; and it switches the
-buffer displayed in the window to the new buffer.  We have discussed
-buffer switching elsewhere.  (@xref{Switching Buffers}.)
-
-In this histogram project, we do not need to display each file on the
-screen as the program determines the length of each definition within
-it.  Instead of employing @code{switch-to-buffer}, we can work with
-@code{set-buffer}, which redirects the attention of the computer
-program to a different buffer but does not redisplay it on the screen.
-So instead of calling on @code{find-file} to do the job, we must write
-our own expression.
-
-The task is easy: use @code{find-file-noselect} and @code{set-buffer}.
-
-@node lengths-list-file, Several files, Find a File, Words in a defun
-@section @code{lengths-list-file} in Detail
-
-The core of the @code{lengths-list-file} function is a @code{while}
-loop containing a function to move point forward `defun by defun' and
-a function to count the number of words and symbols in each defun.
-This core must be surrounded by functions that do various other tasks,
-including finding the file, and ensuring that point starts out at the
-beginning of the file.  The function definition looks like this:
-@findex lengths-list-file
-
-@smallexample
-@group
-(defun lengths-list-file (filename)
-  "Return list of definitions' lengths within FILE.
-The returned list is a list of numbers.
-Each number is the number of words or
-symbols in one function definition."
-@end group
-@group
-  (message "Working on `%s' ... " filename)
-  (save-excursion
-    (let ((buffer (find-file-noselect filename))
-          (lengths-list))
-      (set-buffer buffer)
-      (setq buffer-read-only t)
-      (widen)
-      (goto-char (point-min))
-      (while (re-search-forward "^(defun" nil t)
-        (setq lengths-list
-              (cons (count-words-in-defun) lengths-list)))
-      (kill-buffer buffer)
-      lengths-list)))
-@end group
-@end smallexample
-
-@noindent
-The function is passed one argument, the name of the file on which it
-will work.  It has four lines of documentation, but no interactive
-specification.  Since people worry that a computer is broken if they
-don't see anything going on, the first line of the body is a
-message.
-
-The next line contains a @code{save-excursion} that returns Emacs'
-attention to the current buffer when the function completes.  This is
-useful in case you embed this function in another function that
-presumes point is restored to the original buffer.
-
-In the varlist of the @code{let} expression, Emacs finds the file and
-binds the local variable @code{buffer} to the buffer containing the
-file.  At the same time, Emacs creates @code{lengths-list} as a local
-variable.
-
-Next, Emacs switches its attention to the buffer.
-
-In the following line, Emacs makes the buffer read-only.  Ideally,
-this line is not necessary.  None of the functions for counting words
-and symbols in a function definition should change the buffer.
-Besides, the buffer is not going to be saved, even if it were changed.
-This line is entirely the consequence of great, perhaps excessive,
-caution.  The reason for the caution is that this function and those
-it calls work on the sources for Emacs and it is inconvenient if they
-are inadvertently modified.  It goes without saying that I did not
-realize a need for this line until an experiment went awry and started
-to modify my Emacs source files @dots{}
-
-Next comes a call to widen the buffer if it is narrowed.  This
-function is usually not needed---Emacs creates a fresh buffer if none
-already exists; but if a buffer visiting the file already exists Emacs
-returns that one.  In this case, the buffer may be narrowed and must
-be widened.  If we wanted to be fully `user-friendly', we would
-arrange to save the restriction and the location of point, but we
-won't.
-
-The @code{(goto-char (point-min))} expression moves point to the
-beginning of the buffer.
-
-Then comes a @code{while} loop in which the `work' of the function is
-carried out.  In the loop, Emacs determines the length of each
-definition and constructs a lengths' list containing the information.
-
-Emacs kills the buffer after working through it.  This is to save
-space inside of Emacs.  My version of GNU Emacs 19 contained over 300
-source files of interest; GNU Emacs 22 contains over a thousand source
-files.  Another function will apply @code{lengths-list-file} to each
-of the files.
-
-Finally, the last expression within the @code{let} expression is the
-@code{lengths-list} variable; its value is returned as the value of
-the whole function.
-
-You can try this function by installing it in the usual fashion.  Then
-place your cursor after the following expression and type @kbd{C-x
-C-e} (@code{eval-last-sexp}).
-
-@c !!! 22.1.1 lisp sources location here
-@smallexample
-(lengths-list-file
- "/usr/local/share/emacs/22.1.1/lisp/emacs-lisp/debug.el")
-@end smallexample
-
-@noindent
-(You may need to change the pathname of the file; the one here is for
-GNU Emacs version 22.1.1.  To change the expression, copy it to
-the @file{*scratch*} buffer and edit it.
-
-@need 1200
-@noindent
-(Also, to see the full length of the list, rather than a truncated
-version, you may have to evaluate the following:
-
-@smallexample
-(custom-set-variables '(eval-expression-print-length nil))
-@end smallexample
-
-@noindent
-(@xref{defcustom, , Specifying Variables using @code{defcustom}}.
-Then evaluate the @code{lengths-list-file} expression.)
-
-@need 1200
-The lengths' list for @file{debug.el} takes less than a second to
-produce and looks like this in GNU Emacs 22:
-
-@smallexample
-(83 113 105 144 289 22 30 97 48 89 25 52 52 88 28 29 77 49 43 290 232 587)
-@end smallexample
-
-@need 1500
-(Using my old machine, the version 19 lengths' list for @file{debug.el}
-took seven seconds to produce and looked like this:
-
-@smallexample
-(75 41 80 62 20 45 44 68 45 12 34 235)
-@end smallexample
-
-(The newer version of @file{debug.el} contains more defuns than the
-earlier one; and my new machine is much faster than the old one.)
-
-Note that the length of the last definition in the file is first in
-the list.
-
-@node Several files, Several files recursively, lengths-list-file, Words in a defun
-@section Count Words in @code{defuns} in Different Files
-
-In the previous section, we created a function that returns a list of
-the lengths of each definition in a file.  Now, we want to define a
-function to return a master list of the lengths of the definitions in
-a list of files.
-
-Working on each of a list of files is a repetitious act, so we can use
-either a @code{while} loop or recursion.
-
-@menu
-* lengths-list-many-files::     Return a list of the lengths of defuns.
-* append::                      Attach one list to another.
-@end menu
-
-@node lengths-list-many-files, append, Several files, Several files
-@ifnottex
-@unnumberedsubsec Determine the lengths of @code{defuns}
-@end ifnottex
-
-The design using a @code{while} loop is routine.  The argument passed
-the function is a list of files.  As we saw earlier (@pxref{Loop
-Example}), you can write a @code{while} loop so that the body of the
-loop is evaluated if such a list contains elements, but to exit the
-loop if the list is empty.  For this design to work, the body of the
-loop must contain an expression that shortens the list each time the
-body is evaluated, so that eventually the list is empty.  The usual
-technique is to set the value of the list to the value of the @sc{cdr}
-of the list each time the body is evaluated.
-
-@need 800
-The template looks like this:
-
-@smallexample
-@group
-(while @var{test-whether-list-is-empty}
-  @var{body}@dots{}
-  @var{set-list-to-cdr-of-list})
-@end group
-@end smallexample
-
-Also, we remember that a @code{while} loop returns @code{nil} (the
-result of evaluating the true-or-false-test), not the result of any
-evaluation within its body.  (The evaluations within the body of the
-loop are done for their side effects.)  However, the expression that
-sets the lengths' list is part of the body---and that is the value
-that we want returned by the function as a whole.  To do this, we
-enclose the @code{while} loop within a @code{let} expression, and
-arrange that the last element of the @code{let} expression contains
-the value of the lengths' list.  (@xref{Incrementing Example, , Loop
-Example with an Incrementing Counter}.)
-
-@findex lengths-list-many-files
-@need 1250
-These considerations lead us directly to the function itself:
-
-@smallexample
-@group
-;;; @r{Use @code{while} loop.}
-(defun lengths-list-many-files (list-of-files)
-  "Return list of lengths of defuns in LIST-OF-FILES."
-@end group
-@group
-  (let (lengths-list)
-
-;;; @r{true-or-false-test}
-    (while list-of-files
-      (setq lengths-list
-            (append
-             lengths-list
-
-;;; @r{Generate a lengths' list.}
-             (lengths-list-file
-              (expand-file-name (car list-of-files)))))
-@end group
-
-@group
-;;; @r{Make files' list shorter.}
-      (setq list-of-files (cdr list-of-files)))
-
-;;; @r{Return final value of lengths' list.}
-    lengths-list))
-@end group
-@end smallexample
-
-@code{expand-file-name} is a built-in function that converts a file
-name to the absolute, long, path name form.  The function employs the
-name of the directory in which the function is called.
-
-@c !!! 22.1.1 lisp sources location here
-@need 1500
-Thus, if @code{expand-file-name} is called on @code{debug.el} when
-Emacs is visiting the
-@file{/usr/local/share/emacs/22.1.1/lisp/emacs-lisp/} directory,
-
-@smallexample
-debug.el
-@end smallexample
-
-@need 800
-@noindent
-becomes
-
-@c !!! 22.1.1 lisp sources location here
-@smallexample
-/usr/local/share/emacs/22.1.1/lisp/emacs-lisp/debug.el
-@end smallexample
-
-The only other new element of this function definition is the as yet
-unstudied function @code{append}, which merits a short section for
-itself.
-
-@node append,  , lengths-list-many-files, Several files
-@subsection The @code{append} Function
-
-@need 800
-The @code{append} function attaches one list to another.  Thus,
-
-@smallexample
-(append '(1 2 3 4) '(5 6 7 8))
-@end smallexample
-
-@need 800
-@noindent
-produces the list
-
-@smallexample
-(1 2 3 4 5 6 7 8)
-@end smallexample
-
-This is exactly how we want to attach two lengths' lists produced by
-@code{lengths-list-file} to each other.  The results contrast with
-@code{cons},
-
-@smallexample
-(cons '(1 2 3 4) '(5 6 7 8))
-@end smallexample
-
-@need 1250
-@noindent
-which constructs a new list in which the first argument to @code{cons}
-becomes the first element of the new list:
-
-@smallexample
-((1 2 3 4) 5 6 7 8)
-@end smallexample
-
-@node Several files recursively, Prepare the data, Several files, Words in a defun
-@section Recursively Count Words in Different Files
-
-Besides a @code{while} loop, you can work on each of a list of files
-with recursion.  A recursive version of @code{lengths-list-many-files}
-is short and simple.
-
-The recursive function has the usual parts: the `do-again-test', the
-`next-step-expression', and the recursive call.  The `do-again-test'
-determines whether the function should call itself again, which it
-will do if the @code{list-of-files} contains any remaining elements;
-the `next-step-expression' resets the @code{list-of-files} to the
-@sc{cdr} of itself, so eventually the list will be empty; and the
-recursive call calls itself on the shorter list.  The complete
-function is shorter than this description!
-@findex recursive-lengths-list-many-files
-
-@smallexample
-@group
-(defun recursive-lengths-list-many-files (list-of-files)
-  "Return list of lengths of each defun in LIST-OF-FILES."
-  (if list-of-files                     ; @r{do-again-test}
-      (append
-       (lengths-list-file
-        (expand-file-name (car list-of-files)))
-       (recursive-lengths-list-many-files
-        (cdr list-of-files)))))
-@end group
-@end smallexample
-
-@noindent
-In a sentence, the function returns the lengths' list for the first of
-the @code{list-of-files} appended to the result of calling itself on
-the rest of the @code{list-of-files}.
-
-Here is a test of @code{recursive-lengths-list-many-files}, along with
-the results of running @code{lengths-list-file} on each of the files
-individually.
-
-Install @code{recursive-lengths-list-many-files} and
-@code{lengths-list-file}, if necessary, and then evaluate the
-following expressions.  You may need to change the files' pathnames;
-those here work when this Info file and the Emacs sources are located
-in their customary places.  To change the expressions, copy them to
-the @file{*scratch*} buffer, edit them, and then evaluate them.
-
-The results are shown after the @samp{@result{}}.  (These results are
-for files from Emacs version 22.1.1; files from other versions of
-Emacs may produce different results.)
-
-@c !!! 22.1.1 lisp sources location here
-@smallexample
-@group
-(cd "/usr/local/share/emacs/22.1.1/")
-
-(lengths-list-file "./lisp/macros.el")
-     @result{} (283 263 480 90)
-@end group
-
-@group
-(lengths-list-file "./lisp/mail/mailalias.el")
-     @result{} (38 32 29 95 178 180 321 218 324)
-@end group
-
-@group
-(lengths-list-file "./lisp/makesum.el")
-     @result{} (85 181)
-@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)
-@end group
-@end smallexample
-
-The @code{recursive-lengths-list-many-files} function produces the
-output we want.
-
-The next step is to prepare the data in the list for display in a graph.
-
-@node Prepare the data,  , Several files recursively, Words in a defun
-@section Prepare the Data for Display in a Graph
-
-The @code{recursive-lengths-list-many-files} function returns a list
-of numbers.  Each number records the length of a function definition.
-What we need to do now is transform this data into a list of numbers
-suitable for generating a graph.  The new list will tell how many
-functions definitions contain less than 10 words and
-symbols, how many contain between 10 and 19 words and symbols, how
-many contain between 20 and 29 words and symbols, and so on.
-
-In brief, we need to go through the lengths' list produced by the
-@code{recursive-lengths-list-many-files} function and count the number
-of defuns within each range of lengths, and produce a list of those
-numbers.
-
-@menu
-* Data for Display in Detail::
-* Sorting::                     Sorting lists.
-* Files List::                  Making a list of files.
-* Counting function definitions::
-@end menu
-
-@node Data for Display in Detail, Sorting, Prepare the data, Prepare the data
-@ifnottex
-@unnumberedsubsec The Data for Display in Detail
-@end ifnottex
-
-Based on what we have done before, we can readily foresee that it
-should not be too hard to write a function that `@sc{cdr}s' down the
-lengths' list, looks at each element, determines which length range it
-is in, and increments a counter for that range.
-
-However, before beginning to write such a function, we should consider
-the advantages of sorting the lengths' list first, so the numbers are
-ordered from smallest to largest.  First, sorting will make it easier
-to count the numbers in each range, since two adjacent numbers will
-either be in the same length range or in adjacent ranges.  Second, by
-inspecting a sorted list, we can discover the highest and lowest
-number, and thereby determine the largest and smallest length range
-that we will need.
-
-@node Sorting, Files List, Data for Display in Detail, Prepare the data
-@subsection Sorting Lists
-@findex sort
-
-Emacs contains a function to sort lists, called (as you might guess)
-@code{sort}.  The @code{sort} function takes two arguments, the list
-to be sorted, and a predicate that determines whether the first of
-two list elements is ``less'' than the second.
-
-As we saw earlier (@pxref{Wrong Type of Argument, , Using the Wrong
-Type Object as an Argument}), a predicate is a function that
-determines whether some property is true or false.  The @code{sort}
-function will reorder a list according to whatever property the
-predicate uses; this means that @code{sort} can be used to sort
-non-numeric lists by non-numeric criteria---it can, for example,
-alphabetize a list.
-
-@need 1250
-The @code{<} function is used when sorting a numeric list.  For example,
-
-@smallexample
-(sort '(4 8 21 17 33 7 21 7) '<)
-@end smallexample
-
-@need 800
-@noindent
-produces this:
-
-@smallexample
-(4 7 7 8 17 21 21 33)
-@end smallexample
-
-@noindent
-(Note that in this example, both the arguments are quoted so that the
-symbols are not evaluated before being passed to @code{sort} as
-arguments.)
-
-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"))
- '<)
-@end group
-@end smallexample
-
-@need 800
-@noindent
-which produces:
-
-@smallexample
-(29 32 38 85 90 95 178 180 181 218 263 283 321 324 480)
-@end smallexample
-
-@noindent
-(Note that in this example, the first argument to @code{sort} is not
-quoted, since the expression must be evaluated so as to produce the
-list that is passed to @code{sort}.)
-
-@node Files List, Counting function definitions, Sorting, Prepare the data
-@subsection Making a List of Files
-
-The @code{recursive-lengths-list-many-files} function requires a list
-of files as its argument.  For our test examples, we constructed such
-a list by hand; but the Emacs Lisp source directory is too large for
-us to do for that.  Instead, we will write a function to do the job
-for us.  In this function, we will use both a @code{while} loop and a
-recursive call.
-
-@findex directory-files
-We did not have to write a function like this for older versions of
-GNU Emacs, since they placed all the @samp{.el} files in one
-directory.  Instead, we were able to use the @code{directory-files}
-function, which lists the names of files that match a specified
-pattern within a single directory.
-
-However, recent versions of Emacs place Emacs Lisp files in
-sub-directories of the top level @file{lisp} directory.  This
-re-arrangement eases navigation.  For example, all the mail related
-files are in a @file{lisp} sub-directory called @file{mail}.  But at
-the same time, this arrangement forces us to create a file listing
-function that descends into the sub-directories.
-
-@findex files-in-below-directory
-We can create this function, called @code{files-in-below-directory},
-using familiar functions such as @code{car}, @code{nthcdr}, and
-@code{substring} in conjunction with an existing function called
-@code{directory-files-and-attributes}.  This latter function not only
-lists all the filenames in a directory, including the names
-of sub-directories, but also their attributes.
-
-To restate our goal: to create a function that will enable us
-to feed filenames to @code{recursive-lengths-list-many-files}
-as a list that looks like this (but with more elements):
-
-@smallexample
-@group
-("./lisp/macros.el"
- "./lisp/mail/rmail.el"
- "./lisp/makesum.el")
-@end group
-@end smallexample
-
-The @code{directory-files-and-attributes} function returns a list of
-lists.  Each of the lists within the main list consists of 13
-elements.  The first element is a string that contains the name of the
-file -- which, in GNU/Linux, may be a `directory file', that is to
-say, a file with the special attributes of a directory.  The second
-element of the list is @code{t} for a directory, a string
-for symbolic link (the string is the name linked to), or @code{nil}.
-
-For example, the first @samp{.el} file in the @file{lisp/} directory
-is @file{abbrev.el}.  Its name is
-@file{/usr/local/share/emacs/22.1.1/lisp/abbrev.el} and it is not a
-directory or a symbolic link.
-
-@need 1000
-This is how @code{directory-files-and-attributes} lists that file and
-its attributes:
-
-@smallexample
-@group
-("abbrev.el"
-nil
-1
-1000
-100
-@end group
-@group
-(17733 259)
-(17491 28834)
-(17596 62124)
-13157
-"-rw-rw-r--"
-@end group
-@group
-nil
-2971624
-773)
-@end group
-@end smallexample
-
-@need 1200
-On the other hand, @file{mail/} is a directory within the @file{lisp/}
-directory.  The beginning of its listing looks like this:
-
-@smallexample
-@group
-("mail"
-t
-@dots{}
-)
-@end group
-@end smallexample
-
-(To learn about the different attributes, look at the documentation of
-@code{file-attributes}.  Bear in mind that the @code{file-attributes}
-function does not list the filename, so its first element is
-@code{directory-files-and-attributes}'s second element.)
-
-We will want our new function, @code{files-in-below-directory}, to
-list the @samp{.el} files in the directory it is told to check, and in
-any directories below that directory.
-
-This gives us a hint on how to construct
-@code{files-in-below-directory}:  within a directory, the function
-should add @samp{.el} filenames to a list; and if, within a directory,
-the function comes upon a sub-directory, it should go into that
-sub-directory and repeat its actions.
-
-However, we should note that every directory contains a name that
-refers to itself, called @file{.}, (``dot'') and a name that refers to
-its parent directory, called @file{..} (``double dot'').  (In
-@file{/}, the root directory, @file{..} refers to itself, since
-@file{/} has no parent.)  Clearly, we do not want our
-@code{files-in-below-directory} function to enter those directories,
-since they always lead us, directly or indirectly, to the current
-directory.
-
-Consequently, our @code{files-in-below-directory} function must do
-several tasks:
-
-@itemize @bullet
-@item
-Check to see whether it is looking at a filename that ends in
-@samp{.el}; and if so, add its name to a list.
-
-@item
-Check to see whether it is looking at a filename that is the name of a
-directory; and if so,
-
-@itemize @minus
-@item
-Check to see whether it is looking at @file{.}  or @file{..}; and if
-so skip it.
-
-@item
-Or else, go into that directory and repeat the process.
-@end itemize
-@end itemize
-
-Let's write a function definition to do these tasks.  We will use a
-@code{while} loop to move from one filename to another within a
-directory, checking what needs to be done; and we will use a recursive
-call to repeat the actions on each sub-directory.  The recursive
-pattern is `accumulate'
-(@pxref{Accumulate, , Recursive Pattern: @emph{accumulate}}),
-using @code{append} as the combiner.
-
-@ignore
-(directory-files "/usr/local/src/emacs/lisp/" t "\\.el$")
-(shell-command "find /usr/local/src/emacs/lisp/ -name '*.el'")
-
-(directory-files "/usr/local/share/emacs/22.1.1/lisp/" t "\\.el$")
-(shell-command "find /usr/local/share/emacs/22.1.1/lisp/ -name '*.el'")
-@end ignore
-
-@c  /usr/local/share/emacs/22.1.1/lisp/
-
-@need 800
-Here is the function:
-
-@smallexample
-@group
-(defun files-in-below-directory (directory)
-  "List the .el files in DIRECTORY and in its sub-directories."
-  ;; Although the function will be used non-interactively,
-  ;; it will be easier to test if we make it interactive.
-  ;; The directory will have a name such as
-  ;;  "/usr/local/share/emacs/22.1.1/lisp/"
-  (interactive "DDirectory name: ")
-@end group
-@group
-  (let (el-files-list
-        (current-directory-list
-         (directory-files-and-attributes directory t)))
-    ;; while we are in the current directory
-    (while current-directory-list
-@end group
-@group
-      (cond
-       ;; check to see whether filename ends in `.el'
-       ;; and if so, append its name to a list.
-       ((equal ".el" (substring (car (car current-directory-list)) -3))
-        (setq el-files-list
-              (cons (car (car current-directory-list)) el-files-list)))
-@end group
-@group
-       ;; check whether filename is that of a directory
-       ((eq t (car (cdr (car current-directory-list))))
-        ;; decide whether to skip or recurse
-        (if
-            (equal "."
-                   (substring (car (car current-directory-list)) -1))
-            ;; then do nothing since filename is that of
-            ;;   current directory or parent, "." or ".."
-            ()
-@end group
-@group
-          ;; else descend into the directory and repeat the process
-          (setq el-files-list
-                (append
-                 (files-in-below-directory
-                  (car (car current-directory-list)))
-                 el-files-list)))))
-      ;; move to the next filename in the list; this also
-      ;; shortens the list so the while loop eventually comes to an end
-      (setq current-directory-list (cdr current-directory-list)))
-    ;; return the filenames
-    el-files-list))
-@end group
-@end smallexample
-
-@c (files-in-below-directory "/usr/local/src/emacs/lisp/")
-@c (files-in-below-directory "/usr/local/share/emacs/22.1.1/lisp/")
-
-The @code{files-in-below-directory} @code{directory-files} function
-takes one argument, the name of a directory.
-
-@need 1250
-Thus, on my system,
-
-@c (length (files-in-below-directory "/usr/local/src/emacs/lisp/"))
-
-@c !!! 22.1.1 lisp sources location here
-@smallexample
-@group
-(length
- (files-in-below-directory "/usr/local/share/emacs/22.1.1/lisp/"))
-@end group
-@end smallexample
-
-@noindent
-tells me that in and below my Lisp sources directory are 1031
-@samp{.el} files.
-
-@code{files-in-below-directory} returns a list in reverse alphabetical
-order.  An expression to sort the list in alphabetical order looks
-like this:
-
-@smallexample
-@group
-(sort
- (files-in-below-directory "/usr/local/share/emacs/22.1.1/lisp/")
- 'string-lessp)
-@end group
-@end smallexample
-
-@ignore
-(defun test ()
-  "Test how long it takes to find lengths of all sorted elisp defuns."
-  (insert "\n" (current-time-string) "\n")
-  (sit-for 0)
-  (sort
-   (recursive-lengths-list-many-files
-    (files-in-below-directory "/usr/local/src/emacs/lisp/"))
-   '<)
-  (insert (format "%s" (current-time-string))))
-@end ignore
-
-@node Counting function definitions,  , Files List, Prepare the data
-@subsection Counting function definitions
-
-Our immediate goal is to generate a list that tells us how many
-function definitions contain fewer than 10 words and symbols, how many
-contain between 10 and 19 words and symbols, how many contain between
-20 and 29 words and symbols, and so on.
-
-With a sorted list of numbers, this is easy: count how many elements
-of the list are smaller than 10, then, after moving past the numbers
-just counted, count how many are smaller than 20, then, after moving
-past the numbers just counted, count how many are smaller than 30, and
-so on.  Each of the numbers, 10, 20, 30, 40, and the like, is one
-larger than the top of that range.  We can call the list of such
-numbers the @code{top-of-ranges} list.
-
-@need 1200
-If we wished, we could generate this list automatically, but it is
-simpler to write a list manually.  Here it is:
-@vindex top-of-ranges
-
-@smallexample
-@group
-(defvar top-of-ranges
- '(10  20  30  40  50
-   60  70  80  90 100
-  110 120 130 140 150
-  160 170 180 190 200
-  210 220 230 240 250
-  260 270 280 290 300)
- "List specifying ranges for `defuns-per-range'.")
-@end group
-@end smallexample
-
-To change the ranges, we edit this list.
-
-Next, we need to write the function that creates the list of the
-number of definitions within each range.  Clearly, this function must
-take the @code{sorted-lengths} and the @code{top-of-ranges} lists
-as arguments.
-
-The @code{defuns-per-range} function must do two things again and
-again: it must count the number of definitions within a range
-specified by the current top-of-range value; and it must shift to the
-next higher value in the @code{top-of-ranges} list after counting the
-number of definitions in the current range.  Since each of these
-actions is repetitive, we can use @code{while} loops for the job.
-One loop counts the number of definitions in the range defined by the
-current top-of-range value, and the other loop selects each of the
-top-of-range values in turn.
-
-Several entries of the @code{sorted-lengths} list are counted for each
-range; this means that the loop for the @code{sorted-lengths} list
-will be inside the loop for the @code{top-of-ranges} list, like a
-small gear inside a big gear.
-
-The inner loop counts the number of definitions within the range.  It
-is a simple counting loop of the type we have seen before.
-(@xref{Incrementing Loop, , A loop with an incrementing counter}.)
-The true-or-false test of the loop tests whether the value from the
-@code{sorted-lengths} list is smaller than the current value of the
-top of the range.  If it is, the function increments the counter and
-tests the next value from the @code{sorted-lengths} list.
-
-@need 1250
-The inner loop looks like this:
-
-@smallexample
-@group
-(while @var{length-element-smaller-than-top-of-range}
-  (setq number-within-range (1+ number-within-range))
-  (setq sorted-lengths (cdr sorted-lengths)))
-@end group
-@end smallexample
-
-The outer loop must start with the lowest value of the
-@code{top-of-ranges} list, and then be set to each of the succeeding
-higher values in turn.  This can be done with a loop like this:
-
-@smallexample
-@group
-(while top-of-ranges
-  @var{body-of-loop}@dots{}
-  (setq top-of-ranges (cdr top-of-ranges)))
-@end group
-@end smallexample
-
-@need 1200
-Put together, the two loops look like this:
-
-@smallexample
-@group
-(while top-of-ranges
-
-  ;; @r{Count the number of elements within the current range.}
-  (while @var{length-element-smaller-than-top-of-range}
-    (setq number-within-range (1+ number-within-range))
-    (setq sorted-lengths (cdr sorted-lengths)))
-
-  ;; @r{Move to next range.}
-  (setq top-of-ranges (cdr top-of-ranges)))
-@end group
-@end smallexample
-
-In addition, in each circuit of the outer loop, Emacs should record
-the number of definitions within that range (the value of
-@code{number-within-range}) in a list.  We can use @code{cons} for
-this purpose.  (@xref{cons, , @code{cons}}.)
-
-The @code{cons} function works fine, except that the list it
-constructs will contain the number of definitions for the highest
-range at its beginning and the number of definitions for the lowest
-range at its end.  This is because @code{cons} attaches new elements
-of the list to the beginning of the list, and since the two loops are
-working their way through the lengths' list from the lower end first,
-the @code{defuns-per-range-list} will end up largest number first.
-But we will want to print our graph with smallest values first and the
-larger later.  The solution is to reverse the order of the
-@code{defuns-per-range-list}.  We can do this using the
-@code{nreverse} function, which reverses the order of a list.
-@findex nreverse
-
-@need 800
-For example,
-
-@smallexample
-(nreverse '(1 2 3 4))
-@end smallexample
-
-@need 800
-@noindent
-produces:
-
-@smallexample
-(4 3 2 1)
-@end smallexample
-
-Note that the @code{nreverse} function is ``destructive''---that is,
-it changes the list to which it is applied; this contrasts with the
-@code{car} and @code{cdr} functions, which are non-destructive.  In
-this case, we do not want the original @code{defuns-per-range-list},
-so it does not matter that it is destroyed.  (The @code{reverse}
-function provides a reversed copy of a list, leaving the original list
-as is.)
-@findex reverse
-
-@need 1250
-Put all together, the @code{defuns-per-range} looks like this:
-
-@smallexample
-@group
-(defun defuns-per-range (sorted-lengths top-of-ranges)
-  "SORTED-LENGTHS defuns in each TOP-OF-RANGES range."
-  (let ((top-of-range (car top-of-ranges))
-        (number-within-range 0)
-        defuns-per-range-list)
-@end group
-
-@group
-    ;; @r{Outer loop.}
-    (while top-of-ranges
-@end group
-
-@group
-      ;; @r{Inner loop.}
-      (while (and
-              ;; @r{Need number for numeric test.}
-              (car sorted-lengths)
-              (< (car sorted-lengths) top-of-range))
-@end group
-
-@group
-        ;; @r{Count number of definitions within current range.}
-        (setq number-within-range (1+ number-within-range))
-        (setq sorted-lengths (cdr sorted-lengths)))
-
-      ;; @r{Exit inner loop but remain within outer loop.}
-@end group
-
-@group
-      (setq defuns-per-range-list
-            (cons number-within-range defuns-per-range-list))
-      (setq number-within-range 0)      ; @r{Reset count to zero.}
-@end group
-
-@group
-      ;; @r{Move to next range.}
-      (setq top-of-ranges (cdr top-of-ranges))
-      ;; @r{Specify next top of range value.}
-      (setq top-of-range (car top-of-ranges)))
-@end group
-
-@group
-    ;; @r{Exit outer loop and count the number of defuns larger than}
-    ;; @r{  the largest top-of-range value.}
-    (setq defuns-per-range-list
-          (cons
-           (length sorted-lengths)
-           defuns-per-range-list))
-@end group
-
-@group
-    ;; @r{Return a list of the number of definitions within each range,}
-    ;; @r{  smallest to largest.}
-    (nreverse defuns-per-range-list)))
-@end group
-@end smallexample
-
-@need 1200
-@noindent
-The function is straightforward except for one subtle feature.  The
-true-or-false test of the inner loop looks like this:
-
-@smallexample
-@group
-(and (car sorted-lengths)
-     (< (car sorted-lengths) top-of-range))
-@end group
-@end smallexample
-
-@need 800
-@noindent
-instead of like this:
-
-@smallexample
-(< (car sorted-lengths) top-of-range)
-@end smallexample
-
-The purpose of the test is to determine whether the first item in the
-@code{sorted-lengths} list is less than the value of the top of the
-range.
-
-The simple version of the test works fine unless the
-@code{sorted-lengths} list has a @code{nil} value.  In that case, the
-@code{(car sorted-lengths)} expression function returns
-@code{nil}.  The @code{<} function cannot compare a number to
-@code{nil}, which is an empty list, so Emacs signals an error and
-stops the function from attempting to continue to execute.
-
-The @code{sorted-lengths} list always becomes @code{nil} when the
-counter reaches the end of the list.  This means that any attempt to
-use the @code{defuns-per-range} function with the simple version of
-the test will fail.
-
-We solve the problem by using the @code{(car sorted-lengths)}
-expression in conjunction with the @code{and} expression.  The
-@code{(car sorted-lengths)} expression returns a non-@code{nil}
-value so long as the list has at least one number within it, but
-returns @code{nil} if the list is empty.  The @code{and} expression
-first evaluates the @code{(car sorted-lengths)} expression, and
-if it is @code{nil}, returns false @emph{without} evaluating the
-@code{<} expression.  But if the @code{(car sorted-lengths)}
-expression returns a non-@code{nil} value, the @code{and} expression
-evaluates the @code{<} expression, and returns that value as the value
-of the @code{and} expression.
-
-@c colon in printed section title causes problem in Info cross reference
-This way, we avoid an error.
-@iftex
-@noindent
-(For information about @code{and}, see
-@ref{kill-new function, , The @code{kill-new} function}.)
-@end iftex
-@ifinfo
-@noindent
-(@xref{kill-new function, , The @code{kill-new} function}, for
-information about @code{and}.)
-@end ifinfo
-
-Here is a short test of the @code{defuns-per-range} function.  First,
-evaluate the expression that binds (a shortened)
-@code{top-of-ranges} list to the list of values, then evaluate the
-expression for binding the @code{sorted-lengths} list, and then
-evaluate the @code{defuns-per-range} function.
-
-@smallexample
-@group
-;; @r{(Shorter list than we will use later.)}
-(setq top-of-ranges
- '(110 120 130 140 150
-   160 170 180 190 200))
-
-(setq sorted-lengths
-      '(85 86 110 116 122 129 154 176 179 200 265 300 300))
-
-(defuns-per-range sorted-lengths top-of-ranges)
-@end group
-@end smallexample
-
-@need 800
-@noindent
-The list returned looks like this:
-
-@smallexample
-(2 2 2 0 0 1 0 2 0 0 4)
-@end smallexample
-
-@noindent
-Indeed, there are two elements of the @code{sorted-lengths} list
-smaller than 110, two elements between 110 and 119, two elements
-between 120 and 129, and so on.  There are four elements with a value
-of 200 or larger.
-
-@c The next step is to turn this numbers' list into a graph.
-@node Readying a Graph, Emacs Initialization, Words in a defun, Top
-@chapter Readying a Graph
-@cindex Readying a graph
-@cindex Graph prototype
-@cindex Prototype graph
-@cindex Body of graph
-
-Our goal is to construct a graph showing the numbers of function
-definitions of various lengths in the Emacs lisp sources.
-
-As a practical matter, if you were creating a graph, you would
-probably use a program such as @code{gnuplot} to do the job.
-(@code{gnuplot} is nicely integrated into GNU Emacs.)  In this case,
-however, we create one from scratch, and in the process we will
-re-acquaint ourselves with some of what we learned before and learn
-more.
-
-In this chapter, we will first write a simple graph printing function.
-This first definition will be a @dfn{prototype}, a rapidly written
-function that enables us to reconnoiter this unknown graph-making
-territory.  We will discover dragons, or find that they are myth.
-After scouting the terrain, we will feel more confident and enhance
-the function to label the axes automatically.
-
-@menu
-* Columns of a graph::
-* graph-body-print::            How to print the body of a graph.
-* recursive-graph-body-print::
-* Printed Axes::
-* Line Graph Exercise::
-@end menu
-
-@node Columns of a graph, graph-body-print, Readying a Graph, Readying a Graph
-@ifnottex
-@unnumberedsec Printing the Columns of a Graph
-@end ifnottex
-
-Since Emacs is designed to be flexible and work with all kinds of
-terminals, including character-only terminals, the graph will need to
-be made from one of the `typewriter' symbols.  An asterisk will do; as
-we enhance the graph-printing function, we can make the choice of
-symbol a user option.
-
-We can call this function @code{graph-body-print}; it will take a
-@code{numbers-list} as its only argument.  At this stage, we will not
-label the graph, but only print its body.
-
-The @code{graph-body-print} function inserts a vertical column of
-asterisks for each element in the @code{numbers-list}.  The height of
-each line is determined by the value of that element of the
-@code{numbers-list}.
-
-Inserting columns is a repetitive act; that means that this function can
-be written either with a @code{while} loop or recursively.
-
-Our first challenge is to discover how to print a column of asterisks.
-Usually, in Emacs, we print characters onto a screen horizontally,
-line by line, by typing.  We have two routes we can follow: write our
-own column-insertion function or discover whether one exists in Emacs.
-
-To see whether there is one in Emacs, we can use the @kbd{M-x apropos}
-command.  This command is like the @kbd{C-h a} (@code{command-apropos})
-command, except that the latter finds only those functions that are
-commands.  The @kbd{M-x apropos} command lists all symbols that match
-a regular expression, including functions that are not interactive.
-@findex apropos
-
-What we want to look for is some command that prints or inserts
-columns.  Very likely, the name of the function will contain either
-the word `print' or the word `insert' or the word `column'.
-Therefore, we can simply type @kbd{M-x apropos RET
-print\|insert\|column RET} and look at the result.  On my system, this
-command once too takes quite some time, and then produced a list of 79
-functions and variables.  Now it does not take much time at all and
-produces a list of 211 functions and variables.  Scanning down the
-list, the only function that looks as if it might do the job is
-@code{insert-rectangle}.
-
-@need 1200
-Indeed, this is the function we want; its documentation says:
-
-@smallexample
-@group
-insert-rectangle:
-Insert text of RECTANGLE with upper left corner at point.
-RECTANGLE's first line is inserted at point,
-its second line is inserted at a point vertically under point, etc.
-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.
-@end group
-@end smallexample
-
-We can run a quick test, to make sure it does what we expect of it.
-
-Here is the result of placing the cursor after the
-@code{insert-rectangle} expression and typing @kbd{C-u C-x C-e}
-(@code{eval-last-sexp}).  The function inserts the strings
-@samp{"first"}, @samp{"second"}, and @samp{"third"} at and below
-point.  Also the function returns @code{nil}.
-
-@smallexample
-@group
-(insert-rectangle '("first" "second" "third"))first
-                                              second
-                                              thirdnil
-@end group
-@end smallexample
-
-@noindent
-Of course, we won't be inserting the text of the
-@code{insert-rectangle} expression itself into the buffer in which we
-are making the graph, but will call the function from our program.  We
-shall, however, have to make sure that point is in the buffer at the
-place where the @code{insert-rectangle} function will insert its
-column of strings.
-
-If you are reading this in Info, you can see how this works by
-switching to another buffer, such as the @file{*scratch*} buffer,
-placing point somewhere in the buffer, typing @kbd{M-:}, typing the
-@code{insert-rectangle} expression into the minibuffer at the prompt,
-and then typing @key{RET}.  This causes Emacs to evaluate the
-expression in the minibuffer, but to use as the value of point the
-position of point in the @file{*scratch*} buffer.  (@kbd{M-:}  is the
-keybinding for @code{eval-expression}. Also, @code{nil} does not
-appear in the @file{*scratch*} buffer since the expression is
-evaluated in the minibuffer.)
-
-We find when we do this that point ends up at the end of the last
-inserted line---that is to say, this function moves point as a
-side-effect.  If we were to repeat the command, with point at this
-position, the next insertion would be below and to the right of the
-previous insertion.  We don't want this!  If we are going to make a
-bar graph, the columns need to be beside each other.
-
-So we discover that each cycle of the column-inserting @code{while}
-loop must reposition point to the place we want it, and that place
-will be at the top, not the bottom, of the column.  Moreover, we
-remember that when we print a graph, we do not expect all the columns
-to be the same height.  This means that the top of each column may be
-at a different height from the previous one.  We cannot simply
-reposition point to the same line each time, but moved over to the
-right---or perhaps we can@dots{}
-
-We are planning to make the columns of the bar graph out of asterisks.
-The number of asterisks in the column is the number specified by the
-current element of the @code{numbers-list}.  We need to construct a
-list of asterisks of the right length for each call to
-@code{insert-rectangle}.  If this list consists solely of the requisite
-number of asterisks, then we will have position point the right number
-of lines above the base for the graph to print correctly.  This could
-be difficult.
-
-Alternatively, if we can figure out some way to pass
-@code{insert-rectangle} a list of the same length each time, then we
-can place point on the same line each time, but move it over one
-column to the right for each new column.  If we do this, however, some
-of the entries in the list passed to @code{insert-rectangle} must be
-blanks rather than asterisks.  For example, if the maximum height of
-the graph is 5, but the height of the column is 3, then
-@code{insert-rectangle} requires an argument that looks like this:
-
-@smallexample
-(" " " " "*" "*" "*")
-@end smallexample
-
-This last proposal is not so difficult, so long as we can determine
-the column height.  There are two ways for us to specify the column
-height: we can arbitrarily state what it will be, which would work
-fine for graphs of that height; or we can search through the list of
-numbers and use the maximum height of the list as the maximum height
-of the graph.  If the latter operation were difficult, then the former
-procedure would be easiest, but there is a function built into Emacs
-that determines the maximum of its arguments.  We can use that
-function.  The function is called @code{max} and it returns the
-largest of all its arguments, which must be numbers.  Thus, for
-example,
-
-@smallexample
-(max  3 4 6 5 7 3)
-@end smallexample
-
-@noindent
-returns 7.  (A corresponding function called @code{min} returns the
-smallest of all its arguments.)
-@findex max
-@findex min
-
-However, we cannot simply call @code{max} on the @code{numbers-list};
-the @code{max} function expects numbers as its argument, not a list of
-numbers.  Thus, the following expression,
-
-@smallexample
-(max  '(3 4 6 5 7 3))
-@end smallexample
-
-@need 800
-@noindent
-produces the following error message;
-
-@smallexample
-Wrong type of argument:  number-or-marker-p, (3 4 6 5 7 3)
-@end smallexample
-
-@findex apply
-We need a function that passes a list of arguments to a function.
-This function is @code{apply}.  This function `applies' its first
-argument (a function) to its remaining arguments, the last of which
-may be a list.
-
-@need 1250
-For example,
-
-@smallexample
-(apply 'max 3 4 7 3 '(4 8 5))
-@end smallexample
-
-@noindent
-returns 8.
-
-(Incidentally, I don't know how you would learn of this function
-without a book such as this.  It is possible to discover other
-functions, like @code{search-forward} or @code{insert-rectangle}, by
-guessing at a part of their names and then using @code{apropos}.  Even
-though its base in metaphor is clear---`apply' its first argument to
-the rest---I doubt a novice would come up with that particular word
-when using @code{apropos} or other aid.  Of course, I could be wrong;
-after all, the function was first named by someone who had to invent
-it.)
-
-The second and subsequent arguments to @code{apply} are optional, so
-we can use @code{apply} to call a function and pass the elements of a
-list to it, like this, which also returns 8:
-
-@smallexample
-(apply 'max '(4 8 5))
-@end smallexample
-
-This latter way is how we will use @code{apply}.  The
-@code{recursive-lengths-list-many-files} function returns a numbers'
-list to which we can apply @code{max} (we could also apply @code{max} to
-the sorted numbers' list; it does not matter whether the list is
-sorted or not.)
-
-@need 800
-Hence, the operation for finding the maximum height of the graph is this:
-
-@smallexample
-(setq max-graph-height (apply 'max numbers-list))
-@end smallexample
-
-Now we can return to the question of how to create a list of strings
-for a column of the graph.  Told the maximum height of the graph
-and the number of asterisks that should appear in the column, the
-function should return a list of strings for the
-@code{insert-rectangle} command to insert.
-
-Each column is made up of asterisks or blanks.  Since the function is
-passed the value of the height of the column and the number of
-asterisks in the column, the number of blanks can be found by
-subtracting the number of asterisks from the height of the column.
-Given the number of blanks and the number of asterisks, two
-@code{while} loops can be used to construct the list:
-
-@smallexample
-@group
-;;; @r{First version.}
-(defun column-of-graph (max-graph-height actual-height)
-  "Return list of strings that is one column of a graph."
-  (let ((insert-list nil)
-        (number-of-top-blanks
-         (- max-graph-height actual-height)))
-@end group
-
-@group
-    ;; @r{Fill in asterisks.}
-    (while (> actual-height 0)
-      (setq insert-list (cons "*" insert-list))
-      (setq actual-height (1- actual-height)))
-@end group
-
-@group
-    ;; @r{Fill in blanks.}
-    (while (> number-of-top-blanks 0)
-      (setq insert-list (cons " " insert-list))
-      (setq number-of-top-blanks
-            (1- number-of-top-blanks)))
-@end group
-
-@group
-    ;; @r{Return whole list.}
-    insert-list))
-@end group
-@end smallexample
-
-If you install this function and then evaluate the following
-expression you will see that it returns the list as desired:
-
-@smallexample
-(column-of-graph 5 3)
-@end smallexample
-
-@need 800
-@noindent
-returns
-
-@smallexample
-(" " " " "*" "*" "*")
-@end smallexample
-
-As written, @code{column-of-graph} contains a major flaw: the symbols
-used for the blank and for the marked entries in the column are
-`hard-coded' as a space and asterisk.  This is fine for a prototype,
-but you, or another user, may wish to use other symbols.  For example,
-in testing the graph function, you many want to use a period in place
-of the space, to make sure the point is being repositioned properly
-each time the @code{insert-rectangle} function is called; or you might
-want to substitute a @samp{+} sign or other symbol for the asterisk.
-You might even want to make a graph-column that is more than one
-display column wide.  The program should be more flexible.  The way to
-do that is to replace the blank and the asterisk with two variables
-that we can call @code{graph-blank} and @code{graph-symbol} and define
-those variables separately.
-
-Also, the documentation is not well written.  These considerations
-lead us to the second version of the function:
-
-@smallexample
-@group
-(defvar graph-symbol "*"
-  "String used as symbol in graph, usually an asterisk.")
-@end group
-
-@group
-(defvar graph-blank " "
-  "String used as blank in graph, usually a blank space.
-graph-blank must be the same number of columns wide
-as graph-symbol.")
-@end group
-@end smallexample
-
-@noindent
-(For an explanation of @code{defvar}, see
-@ref{defvar, , Initializing a Variable with @code{defvar}}.)
-
-@smallexample
-@group
-;;; @r{Second version.}
-(defun column-of-graph (max-graph-height actual-height)
-  "Return MAX-GRAPH-HEIGHT strings; ACTUAL-HEIGHT are graph-symbols.
-
-@end group
-@group
-The graph-symbols are contiguous entries at the end
-of the list.
-The list will be inserted as one column of a graph.
-The strings are either graph-blank or graph-symbol."
-@end group
-
-@group
-  (let ((insert-list nil)
-        (number-of-top-blanks
-         (- max-graph-height actual-height)))
-@end group
-
-@group
-    ;; @r{Fill in @code{graph-symbols}.}
-    (while (> actual-height 0)
-      (setq insert-list (cons graph-symbol insert-list))
-      (setq actual-height (1- actual-height)))
-@end group
-
-@group
-    ;; @r{Fill in @code{graph-blanks}.}
-    (while (> number-of-top-blanks 0)
-      (setq insert-list (cons graph-blank insert-list))
-      (setq number-of-top-blanks
-            (1- number-of-top-blanks)))
-
-    ;; @r{Return whole list.}
-    insert-list))
-@end group
-@end smallexample
-
-If we wished, we could rewrite @code{column-of-graph} a third time to
-provide optionally for a line graph as well as for a bar graph.  This
-would not be hard to do.  One way to think of a line graph is that it
-is no more than a bar graph in which the part of each bar that is
-below the top is blank.  To construct a column for a line graph, the
-function first constructs a list of blanks that is one shorter than
-the value, then it uses @code{cons} to attach a graph symbol to the
-list; then it uses @code{cons} again to attach the `top blanks' to
-the list.
-
-It is easy to see how to write such a function, but since we don't
-need it, we will not do it.  But the job could be done, and if it were
-done, it would be done with @code{column-of-graph}.  Even more
-important, it is worth noting that few changes would have to be made
-anywhere else.  The enhancement, if we ever wish to make it, is
-simple.
-
-Now, finally, we come to our first actual graph printing function.
-This prints the body of a graph, not the labels for the vertical and
-horizontal axes, so we can call this @code{graph-body-print}.
-
-@node graph-body-print, recursive-graph-body-print, Columns of a graph, Readying a Graph
-@section The @code{graph-body-print} Function
-@findex graph-body-print
-
-After our preparation in the preceding section, the
-@code{graph-body-print} function is straightforward.  The function
-will print column after column of asterisks and blanks, using the
-elements of a numbers' list to specify the number of asterisks in each
-column.  This is a repetitive act, which means we can use a
-decrementing @code{while} loop or recursive function for the job.  In
-this section, we will write the definition using a @code{while} loop.
-
-The @code{column-of-graph} function requires the height of the graph
-as an argument, so we should determine and record that as a local variable.
-
-This leads us to the following template for the @code{while} loop
-version of this function:
-
-@smallexample
-@group
-(defun graph-body-print (numbers-list)
-  "@var{documentation}@dots{}"
-  (let ((height  @dots{}
-         @dots{}))
-@end group
-
-@group
-    (while numbers-list
-      @var{insert-columns-and-reposition-point}
-      (setq numbers-list (cdr numbers-list)))))
-@end group
-@end smallexample
-
-@noindent
-We need to fill in the slots of the template.
-
-Clearly, we can use the @code{(apply 'max numbers-list)} expression to
-determine the height of the graph.
-
-The @code{while} loop will cycle through the @code{numbers-list} one
-element at a time.  As it is shortened by the @code{(setq numbers-list
-(cdr numbers-list))} expression, the @sc{car} of each instance of the
-list is the value of the argument for @code{column-of-graph}.
-
-At each cycle of the @code{while} loop, the @code{insert-rectangle}
-function inserts the list returned by @code{column-of-graph}.  Since
-the @code{insert-rectangle} function moves point to the lower right of
-the inserted rectangle, we need to save the location of point at the
-time the rectangle is inserted, move back to that position after the
-rectangle is inserted, and then move horizontally to the next place
-from which @code{insert-rectangle} is called.
-
-If the inserted columns are one character wide, as they will be if
-single blanks and asterisks are used, the repositioning command is
-simply @code{(forward-char 1)}; however, the width of a column may be
-greater than one.  This means that the repositioning command should be
-written @code{(forward-char symbol-width)}.  The @code{symbol-width}
-itself is the length of a @code{graph-blank} and can be found using
-the expression @code{(length graph-blank)}.  The best place to bind
-the @code{symbol-width} variable to the value of the width of graph
-column is in the varlist of the @code{let} expression.
-
-@need 1250
-These considerations lead to the following function definition:
-
-@smallexample
-@group
-(defun graph-body-print (numbers-list)
-  "Print a bar graph of the NUMBERS-LIST.
-The numbers-list consists of the Y-axis values."
-
-  (let ((height (apply 'max numbers-list))
-        (symbol-width (length graph-blank))
-        from-position)
-@end group
-
-@group
-    (while numbers-list
-      (setq from-position (point))
-      (insert-rectangle
-       (column-of-graph height (car numbers-list)))
-      (goto-char from-position)
-      (forward-char symbol-width)
-@end group
-@group
-      ;; @r{Draw graph column by column.}
-      (sit-for 0)
-      (setq numbers-list (cdr numbers-list)))
-@end group
-@group
-    ;; @r{Place point for X axis labels.}
-    (forward-line height)
-    (insert "\n")
-))
-@end group
-@end smallexample
-
-@noindent
-The one unexpected expression in this function is the
-@w{@code{(sit-for 0)}} expression in the @code{while} loop.  This
-expression makes the graph printing operation more interesting to
-watch than it would be otherwise.  The expression causes Emacs to
-`sit' or do nothing for a zero length of time and then redraw the
-screen.  Placed here, it causes Emacs to redraw the screen column by
-column.  Without it, Emacs would not redraw the screen until the
-function exits.
-
-We can test @code{graph-body-print} with a short list of numbers.
-
-@enumerate
-@item
-Install @code{graph-symbol}, @code{graph-blank},
-@code{column-of-graph}, which are in
-@iftex
-@ref{Readying a Graph, , Readying a Graph},
-@end iftex
-@ifinfo
-@ref{Columns of a graph},
-@end ifinfo
-and @code{graph-body-print}.
-
-@need 800
-@item
-Copy the following expression:
-
-@smallexample
-(graph-body-print '(1 2 3 4 6 4 3 5 7 6 5 2 3))
-@end smallexample
-
-@item
-Switch to the @file{*scratch*} buffer and place the cursor where you
-want the graph to start.
-
-@item
-Type @kbd{M-:} (@code{eval-expression}).
-
-@item
-Yank the @code{graph-body-print} expression into the minibuffer
-with @kbd{C-y} (@code{yank)}.
-
-@item
-Press @key{RET} to evaluate the @code{graph-body-print} expression.
-@end enumerate
-
-@need 800
-Emacs will print a graph like this:
-
-@smallexample
-@group
-                    *
-                *   **
-                *  ****
-               *** ****
-              ********* *
-             ************
-            *************
-@end group
-@end smallexample
-
-@node recursive-graph-body-print, Printed Axes, graph-body-print, Readying a Graph
-@section The @code{recursive-graph-body-print} Function
-@findex recursive-graph-body-print
-
-The @code{graph-body-print} function may also be written recursively.
-The recursive solution is divided into two parts: an outside `wrapper'
-that uses a @code{let} expression to determine the values of several
-variables that need only be found once, such as the maximum height of
-the graph, and an inside function that is called recursively to print
-the graph.
-
-@need 1250
-The `wrapper' is uncomplicated:
-
-@smallexample
-@group
-(defun recursive-graph-body-print (numbers-list)
-  "Print a bar graph of the NUMBERS-LIST.
-The numbers-list consists of the Y-axis values."
-  (let ((height (apply 'max numbers-list))
-        (symbol-width (length graph-blank))
-        from-position)
-    (recursive-graph-body-print-internal
-     numbers-list
-     height
-     symbol-width)))
-@end group
-@end smallexample
-
-The recursive function is a little more difficult.  It has four parts:
-the `do-again-test', the printing code, the recursive call, and the
-`next-step-expression'.  The `do-again-test' is a @code{when}
-expression that determines whether the @code{numbers-list} contains
-any remaining elements; if it does, the function prints one column of
-the graph using the printing code and calls itself again.  The
-function calls itself again according to the value produced by the
-`next-step-expression' which causes the call to act on a shorter
-version of the @code{numbers-list}.
-
-@smallexample
-@group
-(defun recursive-graph-body-print-internal
-  (numbers-list height symbol-width)
-  "Print a bar graph.
-Used within recursive-graph-body-print function."
-@end group
-
-@group
-  (when numbers-list
-        (setq from-position (point))
-        (insert-rectangle
-         (column-of-graph height (car numbers-list)))
-@end group
-@group
-        (goto-char from-position)
-        (forward-char symbol-width)
-        (sit-for 0)     ; @r{Draw graph column by column.}
-        (recursive-graph-body-print-internal
-         (cdr numbers-list) height symbol-width)))
-@end group
-@end smallexample
-
-@need 1250
-After installation, this expression can be tested; here is a sample:
-
-@smallexample
-(recursive-graph-body-print '(3 2 5 6 7 5 3 4 6 4 3 2 1))
-@end smallexample
-
-@need 800
-Here is what @code{recursive-graph-body-print} produces:
-
-@smallexample
-@group
-                *
-               **   *
-              ****  *
-              **** ***
-            * *********
-            ************
-            *************
-@end group
-@end smallexample
-
-Either of these two functions, @code{graph-body-print} or
-@code{recursive-graph-body-print}, create the body of a graph.
-
-@node Printed Axes, Line Graph Exercise, recursive-graph-body-print, Readying a Graph
-@section Need for Printed Axes
-
-A graph needs printed axes, so you can orient yourself.  For a do-once
-project, it may be reasonable to draw the axes by hand using Emacs'
-Picture mode; but a graph drawing function may be used more than once.
-
-For this reason, I have written enhancements to the basic
-@code{print-graph-body} function that automatically print labels for
-the horizontal and vertical axes.  Since the label printing functions
-do not contain much new material, I have placed their description in
-an appendix.  @xref{Full Graph, , A Graph with Labelled Axes}.
-
-@node Line Graph Exercise,  , Printed Axes, Readying a Graph
-@section Exercise
-
-Write a line graph version of the graph printing functions.
-
-@node Emacs Initialization, Debugging, Readying a Graph, Top
-@chapter Your @file{.emacs} File
-@cindex @file{.emacs} file
-@cindex Customizing your @file{.emacs} file
-@cindex Initialization file
-
-``You don't have to like Emacs to like it'' -- this seemingly
-paradoxical statement is the secret of GNU Emacs.  The plain, `out of
-the box' Emacs is a generic tool.  Most people who use it, customize
-it to suit themselves.
-
-GNU Emacs is mostly written in Emacs Lisp; this means that by writing
-expressions in Emacs Lisp you can change or extend Emacs.
-
-@menu
-* Default Configuration::
-* Site-wide Init::              You can write site-wide init files.
-* defcustom::                   Emacs will write code for you.
-* Beginning a .emacs File::     How to write a @code{.emacs file}.
-* Text and Auto-fill::          Automatically wrap lines.
-* Mail Aliases::                Use abbreviations for email addresses.
-* Indent Tabs Mode::            Don't use tabs with @TeX{}
-* Keybindings::                 Create some personal keybindings.
-* Keymaps::                     More about key binding.
-* Loading Files::               Load (i.e., evaluate) files automatically.
-* Autoload::                    Make functions available.
-* Simple Extension::            Define a function; bind it to a key.
-* X11 Colors::                  Colors in X.
-* Miscellaneous::
-* Mode Line::                   How to customize your mode line.
-@end menu
-
-@node Default Configuration, Site-wide Init, Emacs Initialization, Emacs Initialization
-@ifnottex
-@unnumberedsec Emacs' Default Configuration
-@end ifnottex
-
-There are those who appreciate Emacs' default configuration.  After
-all, Emacs starts you in C mode when you edit a C file, starts you in
-Fortran mode when you edit a Fortran file, and starts you in
-Fundamental mode when you edit an unadorned file.  This all makes
-sense, if you do not know who is going to use Emacs.  Who knows what a
-person hopes to do with an unadorned file?  Fundamental mode is the
-right default for such a file, just as C mode is the right default for
-editing C code.  (Enough programming languages have syntaxes
-that enable them to share or nearly share features, so C mode is
-now provided by by CC mode, the `C Collection'.)
-
-But when you do know who is going to use Emacs---you,
-yourself---then it makes sense to customize Emacs.
-
-For example, I seldom want Fundamental mode when I edit an
-otherwise undistinguished file; I want Text mode.  This is why I
-customize Emacs: so it suits me.
-
-You can customize and extend Emacs by writing or adapting a
-@file{~/.emacs} file.  This is your personal initialization file; its
-contents, written in Emacs Lisp, tell Emacs what to do.@footnote{You
-may also add @file{.el} to @file{~/.emacs} and call it a
-@file{~/.emacs.el} file.  In the past, you were forbidden to type the
-extra keystrokes that the name @file{~/.emacs.el} requires, but now
-you may.  The new format is consistent with the Emacs Lisp file
-naming conventions; the old format saves typing.}
-
-A @file{~/.emacs} file contains Emacs Lisp code.  You can write this
-code yourself; or you can use Emacs' @code{customize} feature to write
-the code for you.  You can combine your own expressions and
-auto-written Customize expressions in your @file{.emacs} file.
-
-(I myself prefer to write my own expressions, except for those,
-particularly fonts, that I find easier to manipulate using the
-@code{customize} command.  I combine the two methods.)
-
-Most of this chapter is about writing expressions yourself.  It
-describes a simple @file{.emacs} file; for more information, see
-@ref{Init File, , The Init File, emacs, The GNU Emacs Manual}, and
-@ref{Init File, , The Init File, elisp, The GNU Emacs Lisp Reference
-Manual}.
-
-@node Site-wide Init, defcustom, Default Configuration, Emacs Initialization
-@section Site-wide Initialization Files
-
-@cindex @file{default.el} init file
-@cindex @file{site-init.el} init file
-@cindex @file{site-load.el} init file
-In addition to your personal initialization file, Emacs automatically
-loads various site-wide initialization files, if they exist.  These
-have the same form as your @file{.emacs} file, but are loaded by
-everyone.
-
-Two site-wide initialization files, @file{site-load.el} and
-@file{site-init.el}, are loaded into Emacs and then `dumped' if a
-`dumped' version of Emacs is created, as is most common.  (Dumped
-copies of Emacs load more quickly.  However, once a file is loaded and
-dumped, a change to it does not lead to a change in Emacs unless you
-load it yourself or re-dump Emacs.  @xref{Building Emacs, , Building
-Emacs, elisp, The GNU Emacs Lisp Reference Manual}, and the
-@file{INSTALL} file.)
-
-Three other site-wide initialization files are loaded automatically
-each time you start Emacs, if they exist.  These are
-@file{site-start.el}, which is loaded @emph{before} your @file{.emacs}
-file, and @file{default.el}, and the terminal type file, which are both
-loaded @emph{after} your @file{.emacs} file.
-
-Settings and definitions in your @file{.emacs} file will overwrite
-conflicting settings and definitions in a @file{site-start.el} file,
-if it exists; but the settings and definitions in a @file{default.el}
-or terminal type file will overwrite those in your @file{.emacs} file.
-(You can prevent interference from a terminal type file by setting
-@code{term-file-prefix} to @code{nil}.  @xref{Simple Extension, , A
-Simple Extension}.)
-
-@c Rewritten to avoid overfull hbox.
-The @file{INSTALL} file that comes in the distribution contains
-descriptions of the @file{site-init.el} and @file{site-load.el} files.
-
-The @file{loadup.el}, @file{startup.el}, and @file{loaddefs.el} files
-control loading.  These files are in the @file{lisp} directory of the
-Emacs distribution and are worth perusing.
-
-The @file{loaddefs.el} file contains a good many suggestions as to
-what to put into your own @file{.emacs} file, or into a site-wide
-initialization file.
-
-@node defcustom, Beginning a .emacs File, Site-wide Init, Emacs Initialization
-@section Specifying Variables using @code{defcustom}
-@findex defcustom
-
-You can specify variables using @code{defcustom} so that you and
-others can then use Emacs' @code{customize} feature to set their
-values.  (You cannot use @code{customize} to write function
-definitions; but you can write @code{defuns} in your @file{.emacs}
-file.  Indeed, you can write any Lisp expression in your @file{.emacs}
-file.)
-
-The @code{customize} feature depends on the @code{defcustom} special
-form.  Although you can use @code{defvar} or @code{setq} for variables
-that users set, the @code{defcustom} special form is designed for the
-job.
-
-You can use your knowledge of @code{defvar} for writing the
-first three arguments for @code{defcustom}.  The first argument to
-@code{defcustom} is the name of the variable.  The second argument is
-the variable's initial value, if any; and this value is set only if
-the value has not already been set.  The third argument is the
-documentation.
-
-The fourth and subsequent arguments to @code{defcustom} specify types
-and options; these are not featured in @code{defvar}.  (These
-arguments are optional.)
-
-Each of these arguments consists of a keyword followed by a value.
-Each keyword starts with the colon character @samp{:}.
-
-@need 1250
-For example, the customizable user option variable
-@code{text-mode-hook} looks like this:
-
-@smallexample
-@group
-(defcustom text-mode-hook nil
-  "Normal hook run when entering Text mode and many related modes."
-  :type 'hook
-  :options '(turn-on-auto-fill flyspell-mode)
-  :group 'data)
-@end group
-@end smallexample
-
-@noindent
-The name of the variable is @code{text-mode-hook}; it has no default
-value; and its documentation string tells you what it does.
-
-The @code{:type} keyword tells Emacs the kind of data to which
-@code{text-mode-hook} should be set and how to display the value in a
-Customization buffer.
-
-The @code{:options} keyword specifies a suggested list of values for
-the variable.  Usually, @code{:options} applies to a hook.
-The list is only a suggestion; it is not exclusive; a person who sets
-the variable may set it to other values; the list shown following the
-@code{:options} keyword is intended to offer convenient choices to a
-user.
-
-Finally, the @code{:group} keyword tells the Emacs Customization
-command in which group the variable is located.  This tells where to
-find it.
-
-The @code{defcustom} function recognizes more than a dozen keywords.
-For more information, see @ref{Customization, , Writing Customization
-Definitions, elisp, The GNU Emacs Lisp Reference Manual}.
-
-Consider @code{text-mode-hook} as an example.
-
-There are two ways to customize this variable.  You can use the
-customization command or write the appropriate expressions yourself.
-
-@need 800
-Using the customization command,  you can type:
-
-@smallexample
-M-x customize
-@end smallexample
-
-@noindent
-and find that the group for editing files of data is called `data'.
-Enter that group.  Text Mode Hook is the first member.  You can click
-on its various options, such as @code{turn-on-auto-fill}, to set the
-values.  After you click on the button to
-
-@smallexample
-Save for Future Sessions
-@end smallexample
-
-@noindent
-Emacs will write an expression into your @file{.emacs} file.
-It will look like this:
-
-@smallexample
-@group
-(custom-set-variables
-  ;; custom-set-variables 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.
- '(text-mode-hook (quote (turn-on-auto-fill text-mode-hook-identify))))
-@end group
-@end smallexample
-
-@noindent
-(The @code{text-mode-hook-identify} function tells
-@code{toggle-text-mode-auto-fill} which buffers are in Text mode.
-It comes on automatically.)
-
-The @code{custom-set-variables} function works somewhat differently
-than a @code{setq}.  While I have never learned the differences, I
-modify the @code{custom-set-variables} expressions in my @file{.emacs}
-file by hand:  I make the changes in what appears to me to be a
-reasonable manner and have not had any problems.  Others prefer to use
-the Customization command and let Emacs do the work for them.
-
-Another @code{custom-set-@dots{}} function is @code{custom-set-faces}.
-This function sets the various font faces.  Over time, I have set a
-considerable number of faces.  Some of the time, I re-set them using
-@code{customize}; other times, I simply edit the
-@code{custom-set-faces} expression in my @file{.emacs} file itself.
-
-The second way to customize your @code{text-mode-hook} is to set it
-yourself in your @file{.emacs} file using code that has nothing to do
-with the @code{custom-set-@dots{}} functions.
-
-@need 800
-When you do this, and later use @code{customize}, you will see a
-message that says
-
-@smallexample
-CHANGED outside Customize; operating on it here may be unreliable.
-@end smallexample
-
-@need 800
-This message is only a warning.  If you click on the button to
-
-@smallexample
-Save for Future Sessions
-@end smallexample
-
-@noindent
-Emacs will write a @code{custom-set-@dots{}} expression near the end
-of your @file{.emacs} file that will be evaluated after your
-hand-written expression.  It will, therefore, overrule your
-hand-written expression.  No harm will be done.  When you do this,
-however, be careful to remember which expression is active; if you
-forget, you may confuse yourself.
-
-So long as you remember where the values are set, you will have no
-trouble.  In any event, the values are always set in your
-initialization file, which is usually called @file{.emacs}.
-
-I myself use @code{customize} for hardly anything.  Mostly, I write
-expressions myself.
-
-@findex defsubst
-@findex defconst
-Incidentally, to be more complete concerning defines:  @code{defsubst}
-defines an inline function.  The syntax is just like that of
-@code{defun}.  @code{defconst} defines a symbol as a constant.  The
-intent is that neither programs nor users should ever change a value
-set by @code{defconst}.  (You can change it; the value set is a
-variable; but please do not.)
-
-@node Beginning a .emacs File, Text and Auto-fill, defcustom, Emacs Initialization
-@section Beginning a @file{.emacs} File
-@cindex @file{.emacs} file, beginning of
-
-When you start Emacs, it loads your @file{.emacs} file unless you tell
-it not to by specifying @samp{-q} on the command line.  (The
-@code{emacs -q} command gives you a plain, out-of-the-box Emacs.)
-
-A @file{.emacs} file contains Lisp expressions.  Often, these are no
-more than expressions to set values; sometimes they are function
-definitions.
-
-@xref{Init File, , The Init File @file{~/.emacs}, emacs, The GNU Emacs
-Manual}, for a short description of initialization files.
-
-This chapter goes over some of the same ground, but is a walk among
-extracts from a complete, long-used @file{.emacs} file---my own.
-
-The first part of the file consists of comments: reminders to myself.
-By now, of course, I remember these things, but when I started, I did
-not.
-
-@need 1200
-@smallexample
-@group
-;;;; Bob's .emacs file
-; Robert J. Chassell
-; 26 September 1985
-@end group
-@end smallexample
-
-@noindent
-Look at that date!  I started this file a long time ago.  I have been
-adding to it ever since.
-
-@smallexample
-@group
-; Each section in this file is introduced by a
-; line beginning with four semicolons; and each
-; entry is introduced by a line beginning with
-; three semicolons.
-@end group
-@end smallexample
-
-@noindent
-This describes the usual conventions for comments in Emacs Lisp.
-Everything on a line that follows a semicolon is a comment.  Two,
-three, and four semicolons are used as subsection and section markers.
-(@xref{Comments, ,, elisp, The GNU Emacs Lisp Reference Manual}, for
-more about comments.)
-
-@smallexample
-@group
-;;;; The Help Key
-; Control-h is the help key;
-; after typing control-h, type a letter to
-; indicate the subject about which you want help.
-; For an explanation of the help facility,
-; type control-h two times in a row.
-@end group
-@end smallexample
-
-@noindent
-Just remember: type @kbd{C-h} two times for help.
-
-@smallexample
-@group
-; To find out about any mode, type control-h m
-; while in that mode.  For example, to find out
-; about mail mode, enter mail mode and then type
-; control-h m.
-@end group
-@end smallexample
-
-@noindent
-`Mode help', as I call this, is very helpful.  Usually, it tells you
-all you need to know.
-
-Of course, you don't need to include comments like these in your
-@file{.emacs} file.  I included them in mine because I kept forgetting
-about Mode help or the conventions for comments---but I was able to
-remember to look here to remind myself.
-
-@node Text and Auto-fill, Mail Aliases, Beginning a .emacs File, Emacs Initialization
-@section Text and Auto Fill Mode
-
-Now we come to the part that `turns on' Text mode and
-Auto Fill mode.
-
-@smallexample
-@group
-;;; Text mode and Auto Fill mode
-; The next two lines put Emacs into Text mode
-; and Auto Fill mode, and are for writers who
-; want to start writing prose rather than code.
-(setq default-major-mode 'text-mode)
-(add-hook 'text-mode-hook 'turn-on-auto-fill)
-@end group
-@end smallexample
-
-Here is the first part of this @file{.emacs} file that does something
-besides remind a forgetful human!
-
-The first of the two lines in parentheses tells Emacs to turn on Text
-mode when you find a file, @emph{unless} that file should go into some
-other mode, such as C mode.
-
-@cindex Per-buffer, local variables list
-@cindex Local variables list, per-buffer,
-@cindex Automatic mode selection
-@cindex Mode selection, automatic
-When Emacs reads a file, it looks at the extension to the file name,
-if any.  (The extension is the part that comes after a @samp{.}.)  If
-the file ends with a @samp{.c} or @samp{.h} extension then Emacs turns
-on C mode.  Also, Emacs looks at first nonblank line of the file; if
-the line says @w{@samp{-*- C -*-}}, Emacs turns on C mode.  Emacs
-possesses a list of extensions and specifications that it uses
-automatically.  In addition, Emacs looks near the last page for a
-per-buffer, ``local variables list'', if any.
-
-@ifinfo
-@xref{Choosing Modes, , How Major Modes are Chosen, emacs, The GNU
-Emacs Manual}.
-
-@xref{File Variables, , Local Variables in Files, emacs, The GNU Emacs
-Manual}.
-@end ifinfo
-@iftex
-See sections ``How Major Modes are Chosen'' and ``Local Variables in
-Files'' in @cite{The GNU Emacs Manual}.
-@end iftex
-
-Now, back to the @file{.emacs} file.
-
-@need 800
-Here is the line again; how does it work?
-
-@cindex Text Mode turned on
-@smallexample
-(setq default-major-mode 'text-mode)
-@end smallexample
-
-@noindent
-This line is a short, but complete Emacs Lisp expression.
-
-We are already familiar with @code{setq}.  It sets the following variable,
-@code{default-major-mode}, to the subsequent value, which is
-@code{text-mode}.  The single quote mark before @code{text-mode} tells
-Emacs to deal directly with the @code{text-mode} variable, not with
-whatever it might stand for.  @xref{set & setq, , Setting the Value of
-a Variable}, for a reminder of how @code{setq} works.  The main point
-is that there is no difference between the procedure you use to set
-a value in your @file{.emacs} file and the procedure you use anywhere
-else in Emacs.
-
-@need 800
-Here is the next line:
-
-@cindex Auto Fill mode turned on
-@findex add-hook
-@smallexample
-(add-hook 'text-mode-hook 'turn-on-auto-fill)
-@end smallexample
-
-@noindent
-In this line, the @code{add-hook} command adds
-@code{turn-on-auto-fill} to the variable.
-
-@code{turn-on-auto-fill} is the name of a program, that, you guessed
-it!, turns on Auto Fill mode.
-
-Every time Emacs turns on Text mode, Emacs runs the commands `hooked'
-onto Text mode.  So every time Emacs turns on Text mode, Emacs also
-turns on Auto Fill mode.
-
-In brief, the first line causes Emacs to enter Text mode when you edit a
-file, unless the file name extension, a first non-blank line, or local
-variables to tell Emacs otherwise.
-
-Text mode among other actions, sets the syntax table to work
-conveniently for writers.  In Text mode, Emacs considers an apostrophe
-as part of a word like a letter; but Emacs does not consider a period
-or a space as part of a word.  Thus, @kbd{M-f} moves you over
-@samp{it's}.  On the other hand, in C mode, @kbd{M-f} stops just after
-the @samp{t} of @samp{it's}.
-
-The second line causes Emacs to turn on Auto Fill mode when it turns
-on Text mode.  In Auto Fill mode, Emacs automatically breaks a line
-that is too wide and brings the excessively wide part of the line down
-to the next line.  Emacs breaks lines between words, not within them.
-
-When Auto Fill mode is turned off, lines continue to the right as you
-type them.  Depending on how you set the value of
-@code{truncate-lines}, the words you type either disappear off the
-right side of the screen, or else are shown, in a rather ugly and
-unreadable manner, as a continuation line on the screen.
-
-@need 1250
-In addition, in this part of my @file{.emacs} file, I tell the Emacs
-fill commands to insert two spaces after a colon:
-
-@smallexample
-(setq colon-double-space t)
-@end smallexample
-
-@node Mail Aliases, Indent Tabs Mode, Text and Auto-fill, Emacs Initialization
-@section Mail Aliases
-
-Here is a @code{setq} that `turns on' mail aliases, along with more
-reminders.
-
-@smallexample
-@group
-;;; Mail mode
-; To enter mail mode, type `C-x m'
-; To enter RMAIL (for reading mail),
-; type `M-x rmail'
-(setq mail-aliases t)
-@end group
-@end smallexample
-
-@cindex Mail aliases
-@noindent
-This @code{setq} command sets the value of the variable
-@code{mail-aliases} to @code{t}.  Since @code{t} means true, the line
-says, in effect, ``Yes, use mail aliases.''
-
-Mail aliases are convenient short names for long email addresses or
-for lists of email addresses.  The file where you keep your `aliases'
-is @file{~/.mailrc}.  You write an alias like this:
-
-@smallexample
-alias geo george@@foobar.wiz.edu
-@end smallexample
-
-@noindent
-When you write a message to George, address it to @samp{geo}; the
-mailer will automatically expand @samp{geo} to the full address.
-
-@node Indent Tabs Mode, Keybindings, Mail Aliases, Emacs Initialization
-@section Indent Tabs Mode
-@cindex Tabs, preventing
-@findex indent-tabs-mode
-
-By default, Emacs inserts tabs in place of multiple spaces when it
-formats a region.  (For example, you might indent many lines of text
-all at once with the @code{indent-region} command.)  Tabs look fine on
-a terminal or with ordinary printing, but they produce badly indented
-output when you use @TeX{} or Texinfo since @TeX{} ignores tabs.
-
-@need 1250
-The following turns off Indent Tabs mode:
-
-@smallexample
-@group
-;;; Prevent Extraneous Tabs
-(setq-default indent-tabs-mode nil)
-@end group
-@end smallexample
-
-Note that this line uses @code{setq-default} rather than the
-@code{setq} command that we have seen before.  The @code{setq-default}
-command sets values only in buffers that do not have their own local
-values for the variable.
-
-@ifinfo
-@xref{Just Spaces, , Tabs vs. Spaces, emacs, The GNU Emacs Manual}.
-
-@xref{File Variables, , Local Variables in Files, emacs, The GNU Emacs
-Manual}.
-@end ifinfo
-@iftex
-See sections ``Tabs vs.@: Spaces'' and ``Local Variables in
-Files'' in @cite{The GNU Emacs Manual}.
-@end iftex
-
-@need 1700
-@node Keybindings, Keymaps, Indent Tabs Mode, Emacs Initialization
-@section Some Keybindings
-
-Now for some personal keybindings:
-
-@smallexample
-@group
-;;; Compare windows
-(global-set-key "\C-cw" 'compare-windows)
-@end group
-@end smallexample
-
-@findex compare-windows
-@code{compare-windows} is a nifty command that compares the text in
-your current window with text in the next window.  It makes the
-comparison by starting at point in each window, moving over text in
-each window as far as they match.  I use this command all the time.
-
-This also shows how to set a key globally, for all modes.
-
-@cindex Setting a key globally
-@cindex Global set key
-@cindex Key setting globally
-@findex global-set-key
-The command is @code{global-set-key}.  It is followed by the
-keybinding.  In a @file{.emacs} file, the keybinding is written as
-shown: @code{\C-c} stands for `control-c', which means `press the
-control key and the @key{c} key at the same time'.  The @code{w} means
-`press the @key{w} key'.  The keybinding is surrounded by double
-quotation marks.  In documentation, you would write this as
-@w{@kbd{C-c w}}.  (If you were binding a @key{META} key, such as
-@kbd{M-c}, rather than a @key{CTRL} key, you would write
-@w{@code{\M-c}} in your @file{.emacs} file.  @xref{Init Rebinding, ,
-Rebinding Keys in Your Init File, emacs, The GNU Emacs Manual}, for
-details.)
-
-The command invoked by the keys is @code{compare-windows}.  Note that
-@code{compare-windows} is preceded by a single quote; otherwise, Emacs
-would first try to evaluate the symbol to determine its value.
-
-These three things, the double quotation marks, the backslash before
-the @samp{C}, and the single quote mark are necessary parts of
-keybinding that I tend to forget.  Fortunately, I have come to
-remember that I should look at my existing @file{.emacs} file, and
-adapt what is there.
-
-As for the keybinding itself: @kbd{C-c w}.  This combines the prefix
-key, @kbd{C-c}, with a single character, in this case, @kbd{w}.  This
-set of keys, @kbd{C-c} followed by a single character, is strictly
-reserved for individuals' own use.  (I call these `own' keys, since
-these are for my own use.)  You should always be able to create such a
-keybinding for your own use without stomping on someone else's
-keybinding.  If you ever write an extension to Emacs, please avoid
-taking any of these keys for public use.  Create a key like @kbd{C-c
-C-w} instead.  Otherwise, we will run out of `own' keys.
-
-@need 1250
-Here is another keybinding, with a comment:
-
-@smallexample
-@group
-;;; Keybinding for `occur'
-; I use occur a lot, so let's bind it to a key:
-(global-set-key "\C-co" 'occur)
-@end group
-@end smallexample
-
-@findex occur
-The @code{occur} command shows all the lines in the current buffer
-that contain a match for a regular expression.  Matching lines are
-shown in a buffer called @file{*Occur*}.  That buffer serves as a menu
-to jump to occurrences.
-
-@findex global-unset-key
-@cindex Unbinding key
-@cindex Key unbinding
-@need 1250
-Here is how to unbind a key, so it does not
-work:
-
-@smallexample
-@group
-;;; Unbind `C-x f'
-(global-unset-key "\C-xf")
-@end group
-@end smallexample
-
-There is a reason for this unbinding: I found I inadvertently typed
-@w{@kbd{C-x f}} when I meant to type @kbd{C-x C-f}.  Rather than find a
-file, as I intended, I accidentally set the width for filled text,
-almost always to a width I did not want.  Since I hardly ever reset my
-default width, I simply unbound the key.
-
-@findex list-buffers, @r{rebound}
-@findex buffer-menu, @r{bound to key}
-@need 1250
-The following rebinds an existing key:
-
-@smallexample
-@group
-;;; Rebind `C-x C-b' for `buffer-menu'
-(global-set-key "\C-x\C-b" 'buffer-menu)
-@end group
-@end smallexample
-
-By default, @kbd{C-x C-b} runs the
-@code{list-buffers} command.  This command lists
-your buffers in @emph{another} window.  Since I
-almost always want to do something in that
-window, I prefer the  @code{buffer-menu}
-command, which not only lists the buffers,
-but moves point into that window.
-
-@node Keymaps, Loading Files, Keybindings, Emacs Initialization
-@section Keymaps
-@cindex Keymaps
-@cindex Rebinding keys
-
-Emacs uses @dfn{keymaps} to record which keys call which commands.
-When you use @code{global-set-key} to set the keybinding for a single
-command in all parts of Emacs, you are specifying the keybinding in
-@code{current-global-map}.
-
-Specific modes, such as C mode or Text mode, have their own keymaps;
-the mode-specific keymaps override the global map that is shared by
-all buffers.
-
-The @code{global-set-key} function binds, or rebinds, the global
-keymap.  For example, the following binds the key @kbd{C-x C-b} to the
-function @code{buffer-menu}:
-
-@smallexample
-(global-set-key "\C-x\C-b" 'buffer-menu)
-@end smallexample
-
-Mode-specific keymaps are bound using the @code{define-key} function,
-which takes a specific keymap as an argument, as well as the key and
-the command.  For example, my @file{.emacs} file contains the
-following expression to bind the @code{texinfo-insert-@@group} command
-to @kbd{C-c C-c g}:
-
-@smallexample
-@group
-(define-key texinfo-mode-map "\C-c\C-cg" 'texinfo-insert-@@group)
-@end group
-@end smallexample
-
-@noindent
-The @code{texinfo-insert-@@group} function itself is a little extension
-to Texinfo mode that inserts @samp{@@group} into a Texinfo file.  I
-use this command all the time and prefer to type the three strokes
-@kbd{C-c C-c g} rather than the six strokes @kbd{@@ g r o u p}.
-(@samp{@@group} and its matching @samp{@@end group} are commands that
-keep all enclosed text together on one page; many multi-line examples
-in this book are surrounded by @samp{@@group @dots{} @@end group}.)
-
-@need 1250
-Here is the @code{texinfo-insert-@@group} function definition:
-
-@smallexample
-@group
-(defun texinfo-insert-@@group ()
-  "Insert the string @@group in a Texinfo buffer."
-  (interactive)
-  (beginning-of-line)
-  (insert "@@group\n"))
-@end group
-@end smallexample
-
-(Of course, I could have used Abbrev mode to save typing, rather than
-write a function to insert a word; but I prefer key strokes consistent
-with other Texinfo mode key bindings.)
-
-You will see numerous @code{define-key} expressions in
-@file{loaddefs.el} as well as in the various mode libraries, such as
-@file{cc-mode.el} and @file{lisp-mode.el}.
-
-@xref{Key Bindings, , Customizing Key Bindings, emacs, The GNU Emacs
-Manual}, and @ref{Keymaps, , Keymaps, elisp, The GNU Emacs Lisp
-Reference Manual}, for more information about keymaps.
-
-@node Loading Files, Autoload, Keymaps, Emacs Initialization
-@section Loading Files
-@cindex Loading files
-@c findex load
-
-Many people in the GNU Emacs community have written extensions to
-Emacs.  As time goes by, these extensions are often included in new
-releases.  For example, the Calendar and Diary packages are now part
-of the standard GNU Emacs, as is Calc.
-
-You can use a @code{load} command to evaluate a complete file and
-thereby install all the functions and variables in the file into Emacs.
-For example:
-
-@c (auto-compression-mode t)
-
-@smallexample
-(load "~/emacs/slowsplit")
-@end smallexample
-
-This evaluates, i.e.@: loads, the @file{slowsplit.el} file or if it
-exists, the faster, byte compiled @file{slowsplit.elc} file from the
-@file{emacs} sub-directory of your home directory.  The file contains
-the function @code{split-window-quietly}, which John Robinson wrote in
-1989.
-
-The @code{split-window-quietly} function splits a window with the
-minimum of redisplay.  I installed it in 1989 because it worked well
-with the slow 1200 baud terminals I was then using.  Nowadays, I only
-occasionally come across such a slow connection, but I continue to use
-the function because I like the way it leaves the bottom half of a
-buffer in the lower of the new windows and the top half in the upper
-window.
-
-@need 1250
-To replace the key binding for the default
-@code{split-window-vertically}, you must also unset that key and bind
-the keys to @code{split-window-quietly}, like this:
-
-@smallexample
-@group
-(global-unset-key "\C-x2")
-(global-set-key "\C-x2" 'split-window-quietly)
-@end group
-@end smallexample
-
-@vindex load-path
-If you load many extensions, as I do, then instead of specifying the
-exact location of the extension file, as shown above, you can specify
-that directory as part of Emacs' @code{load-path}.  Then, when Emacs
-loads a file, it will search that directory as well as its default
-list of directories.  (The default list is specified in @file{paths.h}
-when Emacs is built.)
-
-@need 1250
-The following command adds your @file{~/emacs} directory to the
-existing load path:
-
-@smallexample
-@group
-;;; Emacs Load Path
-(setq load-path (cons "~/emacs" load-path))
-@end group
-@end smallexample
-
-Incidentally, @code{load-library} is an interactive interface to the
-@code{load} function.  The complete function looks like this:
-
-@findex load-library
-@smallexample
-@group
-(defun load-library (library)
-  "Load the library named LIBRARY.
-This is an interface to the function `load'."
-  (interactive
-   (list (completing-read "Load library: "
-                          'locate-file-completion
-                          (cons load-path (get-load-suffixes)))))
-  (load library))
-@end group
-@end smallexample
-
-The name of the function, @code{load-library}, comes from the use of
-`library' as a conventional synonym for `file'.  The source for the
-@code{load-library} command is in the @file{files.el} library.
-
-Another interactive command that does a slightly different job is
-@code{load-file}.  @xref{Lisp Libraries, , Libraries of Lisp Code for
-Emacs, emacs, The GNU Emacs Manual}, for information on the
-distinction between @code{load-library} and this command.
-
-@node Autoload, Simple Extension, Loading Files, Emacs Initialization
-@section Autoloading
-@findex autoload
-
-Instead of installing a function by loading the file that contains it,
-or by evaluating the function definition, you can make the function
-available but not actually install it until it is first called.  This
-is called @dfn{autoloading}.
-
-When you execute an autoloaded function, Emacs automatically evaluates
-the file that contains the definition, and then calls the function.
-
-Emacs starts quicker with autoloaded functions, since their libraries
-are not loaded right away; but you need to wait a moment when you
-first use such a function, while its containing file is evaluated.
-
-Rarely used functions are frequently autoloaded.  The
-@file{loaddefs.el} library contains hundreds of autoloaded functions,
-from @code{bookmark-set} to @code{wordstar-mode}.  Of course, you may
-come to use a `rare' function frequently.  When you do, you should
-load that function's file with a @code{load} expression in your
-@file{.emacs} file.
-
-In my @file{.emacs} file, I load 14 libraries that contain functions
-that would otherwise be autoloaded.  (Actually, it would have been
-better to include these files in my `dumped' Emacs, but I forgot.
-@xref{Building Emacs, , Building Emacs, elisp, The GNU Emacs Lisp
-Reference Manual}, and the @file{INSTALL} file for more about
-dumping.)
-
-You may also want to include autoloaded expressions in your @file{.emacs}
-file.  @code{autoload} is a built-in function that takes up to five
-arguments, the final three of which are optional.  The first argument
-is the name of the function to be autoloaded; the second is the name
-of the file to be loaded.  The third argument is documentation for the
-function, and the fourth tells whether the function can be called
-interactively.  The fifth argument tells what type of
-object---@code{autoload} can handle a keymap or macro as well as a
-function (the default is a function).
-
-@need 800
-Here is a typical example:
-
-@smallexample
-@group
-(autoload 'html-helper-mode
-  "html-helper-mode" "Edit HTML documents" t)
-@end group
-@end smallexample
-
-@noindent
-(@code{html-helper-mode} is an older alternative to @code{html-mode},
-which is a standard part of the distribution.)
-
-@noindent
-This expression autoloads the @code{html-helper-mode} function.  It
-takes it from the @file{html-helper-mode.el} file (or from the byte
-compiled file @file{html-helper-mode.elc}, if it exists.)  The file
-must be located in a directory specified by @code{load-path}.  The
-documentation says that this is a mode to help you edit documents
-written in the HyperText Markup Language.  You can call this mode
-interactively by typing @kbd{M-x html-helper-mode}.  (You need to
-duplicate the function's regular documentation in the autoload
-expression because the regular function is not yet loaded, so its
-documentation is not available.)
-
-@xref{Autoload, , Autoload, elisp, The GNU Emacs Lisp Reference
-Manual}, for more information.
-
-@node Simple Extension, X11 Colors, Autoload, Emacs Initialization
-@section A Simple Extension: @code{line-to-top-of-window}
-@findex line-to-top-of-window
-@cindex Simple extension in @file{.emacs} file
-
-Here is a simple extension to Emacs that moves the line point is on to
-the top of the window.  I use this all the time, to make text easier
-to read.
-
-You can put the following code into a separate file and then load it
-from your @file{.emacs} file, or you can include it within your
-@file{.emacs} file.
-
-@need 1250
-Here is the definition:
-
-@smallexample
-@group
-;;; Line to top of window;
-;;; replace three keystroke sequence  C-u 0 C-l
-(defun line-to-top-of-window ()
-  "Move the line point is on to top of window."
-  (interactive)
-  (recenter 0))
-@end group
-@end smallexample
-
-@need 1250
-Now for the keybinding.
-
-Nowadays, function keys as well as mouse button events and
-non-@sc{ascii} characters are written within square brackets, without
-quotation marks.  (In Emacs version 18 and before, you had to write
-different function key bindings for each different make of terminal.)
-
-I bind @code{line-to-top-of-window} to my @key{F6} function key like
-this:
-
-@smallexample
-(global-set-key [f6] 'line-to-top-of-window)
-@end smallexample
-
-For more information, see @ref{Init Rebinding, , Rebinding Keys in
-Your Init File, emacs, The GNU Emacs Manual}.
-
-@cindex Conditional 'twixt two versions of Emacs
-@cindex Version of Emacs, choosing
-@cindex Emacs version, choosing
-If you run two versions of GNU Emacs, such as versions 21 and 22, and
-use one @file{.emacs} file, you can select which code to evaluate with
-the following conditional:
-
-@smallexample
-@group
-(cond
- (= 21 emacs-major-version)
-  ;; evaluate version 21 code
-  ( @dots{} ))
- (= 22 emacs-major-version)
-  ;; evaluate version 22 code
-  ( @dots{} )))
-@end group
-@end smallexample
-
-For example, in contrast to version 20, more recent versions blink
-their cursors by default.  I hate such blinking, as well as other
-features, so I placed the following in my @file{.emacs}
-file@footnote{When I start instances of Emacs that do not load my
-@file{.emacs} file or any site file, I also turn off blinking:
-
-@smallexample
-emacs -q --no-site-file -eval '(blink-cursor-mode nil)'
-
-@exdent Or nowadays, using an even more sophisticated set of options,
-
-emacs -Q - D
-@end smallexample
-}:
-
-@smallexample
-@group
-(when (or (= 21 emacs-major-version)
-          (= 22 emacs-major-version))
-      (blink-cursor-mode 0)
-      ;; Insert newline when you press `C-n' (next-line)
-      ;; at the end of the buffer
-      (setq next-line-add-newlines t)
-@end group
-@group
-      ;; Turn on image viewing
-      (auto-image-file-mode t)
-@end group
-@group
-      ;; Turn on menu bar (this bar has text)
-      ;; (Use numeric argument to turn on)
-      (menu-bar-mode 1)
-@end group
-@group
-      ;; Turn off tool bar (this bar has icons)
-      ;; (Use numeric argument to turn on)
-      (tool-bar-mode nil)
-@end group
-@group
-      ;; Turn off tooltip mode for tool bar
-      ;; (This mode causes icon explanations to pop up)
-      ;; (Use numeric argument to turn on)
-      (tooltip-mode nil)
-      ;; If tooltips turned on, make tips appear promptly
-      (setq tooltip-delay 0.1)  ; default is 0.7 second
-       )
-@end group
-@end smallexample
-
-@need 1250
-Alternatively, since @code{blink-cursor-mode} has existed since Emacs
-version 21 and is likely to continue, you could write
-
-@smallexample
-@group
-(when (>= emacs-major-version 21)
-  (blink-cursor-mode 0)
-@end group
-@end smallexample
-
-@noindent
-and add other expressions, too. 
-
-
-@node X11 Colors, Miscellaneous, Simple Extension, Emacs Initialization
-@section X11 Colors
-
-You can specify colors when you use Emacs with the MIT X Windowing
-system.
-
-I dislike the default colors and specify my own.
-
-@need 1250
-Here are the expressions in my @file{.emacs}
-file that set values:
-
-@smallexample
-@group
-;; Set cursor color
-(set-cursor-color "white")
-
-;; Set mouse color
-(set-mouse-color "white")
-
-;; Set foreground and background
-(set-foreground-color "white")
-(set-background-color "darkblue")
-@end group
-
-@group
-;;; Set highlighting colors for isearch and drag
-(set-face-foreground 'highlight "white")
-(set-face-background 'highlight "blue")
-@end group
-
-@group
-(set-face-foreground 'region "cyan")
-(set-face-background 'region "blue")
-@end group
-
-@group
-(set-face-foreground 'secondary-selection "skyblue")
-(set-face-background 'secondary-selection "darkblue")
-@end group
-
-@group
-;; Set calendar highlighting colors
-(setq calendar-load-hook
-      '(lambda ()
-         (set-face-foreground 'diary-face   "skyblue")
-         (set-face-background 'holiday-face "slate blue")
-         (set-face-foreground 'holiday-face "white")))
-@end group
-@end smallexample
-
-The various shades of blue soothe my eye and prevent me from seeing
-the screen flicker.
-
-Alternatively, I could have set my specifications in various X
-initialization files.  For example, I could set the foreground,
-background, cursor, and pointer (i.e., mouse) colors in my
-@file{~/.Xresources} file like this:
-
-@smallexample
-@group
-Emacs*foreground:   white
-Emacs*background:   darkblue
-Emacs*cursorColor:  white
-Emacs*pointerColor: white
-@end group
-@end smallexample
-
-In any event, since it is not part of Emacs, I set the root color of
-my X window in my @file{~/.xinitrc} file, like this@footnote{I also
-run more modern window managers, such as Enlightenment, Gnome, or KDE;
-in those cases, I often specify an image rather than a plain color.}:
-
-@smallexample
-xsetroot -solid Navy -fg white &
-@end smallexample
-
-@need 1700
-@node Miscellaneous, Mode Line, X11 Colors, Emacs Initialization
-@section Miscellaneous Settings for a @file{.emacs} File
-
-@need 1250
-Here are a few miscellaneous settings:
-@sp 1
-
-@itemize @minus
-@item
-Set the shape and color of the mouse cursor:
-
-@smallexample
-@group
-; Cursor shapes are defined in
-; `/usr/include/X11/cursorfont.h';
-; for example, the `target' cursor is number 128;
-; the `top_left_arrow' cursor is number 132.
-@end group
-
-@group
-(let ((mpointer (x-get-resource "*mpointer"
-                                "*emacs*mpointer")))
-  ;; If you have not set your mouse pointer
-  ;;     then set it, otherwise leave as is:
-  (if (eq mpointer nil)
-      (setq mpointer "132")) ; top_left_arrow
-@end group
-@group
-  (setq x-pointer-shape (string-to-int mpointer))
-  (set-mouse-color "white"))
-@end group
-@end smallexample
-
-@item
-Or you can set the values of a variety of features in an alist, like
-this:
-
-@smallexample
-@group
-(setq-default
- default-frame-alist
- '((cursor-color . "white")
-   (mouse-color . "white")
-   (foreground-color . "white")
-   (background-color . "DodgerBlue4")
-   ;; (cursor-type . bar)
-   (cursor-type . box)
-@end group
-@group
-   (tool-bar-lines . 0)
-   (menu-bar-lines . 1)
-   (width . 80)
-   (height . 58)
-   (font .
-         "-Misc-Fixed-Medium-R-Normal--20-200-75-75-C-100-ISO8859-1")
-   ))
-@end group
-@end smallexample
-
-@item
-Convert @kbd{@key{CTRL}-h} into @key{DEL} and @key{DEL}
-into @kbd{@key{CTRL}-h}.@*
-(Some older keyboards needed this, although I have not seen the
-problem recently.)
-
-@smallexample
-@group
-;; Translate `C-h' to <DEL>.
-; (keyboard-translate ?\C-h ?\C-?)
-
-;; Translate <DEL> to `C-h'.
-(keyboard-translate ?\C-? ?\C-h)
-@end group
-@end smallexample
-
-@item Turn off a blinking cursor!
-
-@smallexample
-@group
-(if (fboundp 'blink-cursor-mode)
-    (blink-cursor-mode -1))
-@end group
-@end smallexample
-
-@noindent
-or start GNU Emacs with the command @code{emacs -nbc}.
-
-@need 1250
-@item When using `grep'@*
-@samp{-i}@w{  }   Ignore case distinctions@*
-@samp{-n}@w{  }   Prefix each line of output with line number@*
-@samp{-H}@w{  }   Print the filename for each match.@*
-@samp{-e}@w{  }   Protect patterns beginning with a hyphen character, @samp{-}
-
-@smallexample
-(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.
-
-@smallexample
-(setq find-file-existing-other-name t)
-@end smallexample
-
-@item Set your language environment and default input method
-
-@smallexample
-@group
-(set-language-environment "latin-1")
-;; Remember you can enable or disable multilingual text input
-;; with the @code{toggle-input-method'} (@kbd{C-\}) command
-(setq default-input-method "latin-1-prefix")
-@end group
-@end smallexample
-
-If you want to write with Chinese `GB' characters, set this instead:
-
-@smallexample
-@group
-(set-language-environment "Chinese-GB")
-(setq default-input-method "chinese-tonepy")
-@end group
-@end smallexample
-@end itemize
-
-@subsubheading Fixing Unpleasant Key Bindings
-@cindex Key bindings, fixing
-@cindex Bindings, key, fixing unpleasant
-
-Some systems bind keys unpleasantly.  Sometimes, for example, the
-@key{CTRL} key appears in an awkward spot rather than at the far left
-of the home row.
-
-Usually, when people fix these sorts of keybindings, they do not
-change their @file{~/.emacs} file.  Instead, they bind the proper keys
-on their consoles with the @code{loadkeys} or @code{install-keymap}
-commands in their boot script and then include @code{xmodmap} commands
-in their @file{.xinitrc} or @file{.Xsession} file for X Windows.
-
-@need 1250
-@noindent
-For a boot script:
-
-@smallexample
-@group
-loadkeys /usr/share/keymaps/i386/qwerty/emacs2.kmap.gz
-@exdent or
-install-keymap emacs2
-@end group
-@end smallexample
-
-@need 1250
-@noindent
-For a @file{.xinitrc} or @file{.Xsession} file when the @key{Caps
-Lock} key is at the far left of the home row:
-
-@smallexample
-@group
-# Bind the key labeled `Caps Lock' to `Control'
-# (Such a broken user interface suggests that keyboard manufacturers
-# think that computers are typewriters from 1885.)
-
-xmodmap -e "clear Lock"
-xmodmap -e "add Control = Caps_Lock"
-@end group
-@end smallexample
-
-@need 1250
-@noindent
-In a @file{.xinitrc} or @file{.Xsession} file, to convert an @key{ALT}
-key to a @key{META} key:
-
-@smallexample
-@group
-# Some ill designed keyboards have a key labeled ALT and no Meta
-xmodmap -e "keysym Alt_L = Meta_L Alt_L"
-@end group
-@end smallexample
-
-@need 1700
-@node Mode Line,  , Miscellaneous, Emacs Initialization
-@section A Modified Mode Line
-@vindex default-mode-line-format
-@cindex Mode line format
-
-Finally, a feature I really like: a modified mode line.
-
-When I work over a network, I forget which machine I am using.  Also,
-I tend to I lose track of where I am, and which line point is on.
-
-So I reset my mode line to look like this:
-
-@smallexample
--:-- foo.texi   rattlesnake:/home/bob/  Line 1  (Texinfo Fill) Top
-@end smallexample
-
-I am visiting a file called @file{foo.texi}, on my machine
-@file{rattlesnake} in my @file{/home/bob} buffer.  I am on line 1, in
-Texinfo mode, and am at the top of the buffer.
-
-@need 1200
-My @file{.emacs} file has a section that looks like this:
-
-@smallexample
-@group
-;; Set a Mode Line that tells me which machine, which directory,
-;; and which line I am on, plus the other customary information.
-(setq default-mode-line-format
- (quote
-  (#("-" 0 1
-     (help-echo
-      "mouse-1: select window, mouse-2: delete others ..."))
-   mode-line-mule-info
-   mode-line-modified
-   mode-line-frame-identification
-   "    "
-@end group
-@group
-   mode-line-buffer-identification
-   "    "
-   (:eval (substring
-           (system-name) 0 (string-match "\\..+" (system-name))))
-   ":"
-   default-directory
-   #(" " 0 1
-     (help-echo
-      "mouse-1: select window, mouse-2: delete others ..."))
-   (line-number-mode " Line %l ")
-   global-mode-string
-@end group
-@group
-   #("   %[(" 0 6
-     (help-echo
-      "mouse-1: select window, mouse-2: delete others ..."))
-   (:eval (mode-line-mode-name))
-   mode-line-process
-   minor-mode-alist
-   #("%n" 0 2 (help-echo "mouse-2: widen" local-map (keymap ...)))
-   ")%] "
-   (-3 . "%P")
-   ;;   "-%-"
-   )))
-@end group
-@end smallexample
-
-@noindent
-Here, I redefine the default mode line.  Most of the parts are from
-the original; but I make a few changes.  I set the @emph{default} mode
-line format so as to permit various modes, such as Info, to override
-it.
-
-Many elements in the list are self-explanatory:
-@code{mode-line-modified} is a variable that tells whether the buffer
-has been modified, @code{mode-name} tells the name of the mode, and so
-on.  However, the format looks complicated because of two features we
-have not discussed.
-
-@cindex Properties, in mode line example
-The first string in the mode line is a dash or hyphen, @samp{-}.  In
-the old days, it would have been specified simply as @code{"-"}.  But
-nowadays, Emacs can add properties to a string, such as highlighting
-or, as in this case, a help feature.  If you place your mouse cursor
-over the hyphen, some help information appears (By default, you must
-wait seven-tenths of a second before the information appears.  You can
-change that timing by changing the value of @code{tooltip-delay}.)
-
-@need 1000
-The new string format has a special syntax:
-
-@smallexample
-#("-" 0 1 (help-echo "mouse-1: select window, ..."))
-@end smallexample
-
-@noindent
-The @code{#(} begins a list.  The first element of the list is the
-string itself, just one @samp{-}.  The second and third
-elements specify the range over which the fourth element applies.  A
-range starts @emph{after} a character, so a zero means the range
-starts just before the first character; a 1 means that the range ends
-just after the first character.  The third element is the property for
-the range.  It consists of a property list,  a
-property name, in this case, @samp{help-echo}, followed by a value, in this
-case, a string.  The second, third, and fourth elements of this new
-string format can be repeated.
-
-@xref{Text Properties, , Text Properties, elisp, The GNU Emacs Lisp
-Reference Manual}, and see @ref{Mode Line Format, , Mode Line Format,
-elisp, The GNU Emacs Lisp Reference Manual}, for more information.
-
-@code{mode-line-buffer-identification}
-displays the current buffer name.  It is a list
-beginning @code{(#("%12b" 0 4 @dots{}}.
-The @code{#(} begins the list.
-
-The @samp{"%12b"} displays the current buffer name, using the
-@code{buffer-name} function with which we are familiar; the `12'
-specifies the maximum number of characters that will be displayed.
-When a name has fewer characters, whitespace is added to fill out to
-this number.  (Buffer names can and often should be longer than 12
-characters; this length works well in a typical 80 column wide
-window.)
-
-@code{:eval} says to evaluate the following form and use the result as
-a string to display.  In this case, the expression displays the first
-component of the full system name.  The end of the first component is
-a @samp{.} (`period'), so I use the @code{string-match} function to
-tell me the length of the first component.  The substring from the
-zeroth character to that length is the name of the machine.
-
-@need 1250
-This is the expression:
-
-@smallexample
-@group
-(:eval (substring
-        (system-name) 0 (string-match "\\..+" (system-name))))
-@end group
-@end smallexample
-
-@samp{%[} and @samp{%]} cause a pair of square brackets
-to appear for each recursive editing level.  @samp{%n} says `Narrow'
-when narrowing is in effect.  @samp{%P} tells you the percentage of
-the buffer that is above the bottom of the window, or `Top', `Bottom',
-or `All'.  (A lower case @samp{p} tell you the percentage above the
-@emph{top} of the window.)  @samp{%-} inserts enough dashes to fill
-out the line.
-
-Remember, ``You don't have to like Emacs to like it'' --- your own
-Emacs can have different colors, different commands, and different
-keys than a default Emacs.
-
-On the other hand, if you want to bring up a plain `out of the box'
-Emacs, with no customization, type:
-
-@smallexample
-emacs -q
-@end smallexample
-
-@noindent
-This will start an Emacs that does @emph{not} load your
-@file{~/.emacs} initialization file.  A plain, default Emacs.  Nothing
-more.
-
-@node Debugging, Conclusion, Emacs Initialization, Top
-@chapter Debugging
-@cindex debugging
-
-GNU Emacs has two debuggers, @code{debug} and @code{edebug}.  The
-first is built into the internals of Emacs and is always with you;
-the second requires that you instrument a function before you can use it.
-
-Both debuggers are described extensively in @ref{Debugging, ,
-Debugging Lisp Programs, elisp, The GNU Emacs Lisp Reference Manual}.
-In this chapter, I will walk through a short example of each.
-
-@menu
-* debug::                       How to use the built-in debugger.
-* debug-on-entry::              Start debugging when you call a function.
-* debug-on-quit::               Start debugging when you quit with @kbd{C-g}.
-* edebug::                      How to use Edebug, a source level debugger.
-* Debugging Exercises::
-@end menu
-
-@node debug, debug-on-entry, Debugging, Debugging
-@section @code{debug}
-@findex debug
-
-Suppose you have written a function definition that is intended to
-return the sum of the numbers 1 through a given number.  (This is the
-@code{triangle} function discussed earlier.  @xref{Decrementing
-Example, , Example with Decrementing Counter}, for a discussion.)
-@c xref{Decrementing Loop,, Loop with a Decrementing Counter}, for a discussion.)
-
-However, your function definition has a bug.  You have mistyped
-@samp{1=} for @samp{1-}.  Here is the broken definition:
-
-@findex triangle-bugged
-@smallexample
-@group
-(defun triangle-bugged (number)
-  "Return sum of numbers 1 through NUMBER inclusive."
-  (let ((total 0))
-    (while (> number 0)
-      (setq total (+ total number))
-      (setq number (1= number)))      ; @r{Error here.}
-    total))
-@end group
-@end smallexample
-
-If you are reading this in Info, you can evaluate this definition in
-the normal fashion.  You will see @code{triangle-bugged} appear in the
-echo area.
-
-@need 1250
-Now evaluate the @code{triangle-bugged} function with an
-argument of 4:
-
-@smallexample
-(triangle-bugged 4)
-@end smallexample
-
-@noindent
-In a recent GNU Emacs, you will create and enter a @file{*Backtrace*}
-buffer that says:
-
-@noindent
-@smallexample
-@group
----------- Buffer: *Backtrace* ----------
-Debugger entered--Lisp error: (void-function 1=)
-  (1= number)
-  (setq number (1= number))
-  (while (> number 0) (setq total (+ total number))
-        (setq number (1= number)))
-  (let ((total 0)) (while (> number 0) (setq total ...)
-    (setq number ...)) total)
-  triangle-bugged(4)
-@end group
-@group
-  eval((triangle-bugged 4))
-  eval-last-sexp-1(nil)
-  eval-last-sexp(nil)
-  call-interactively(eval-last-sexp)
----------- Buffer: *Backtrace* ----------
-@end group
-@end smallexample
-
-@noindent
-(I have reformatted this example slightly; the debugger does not fold
-long lines.  As usual, you can quit the debugger by typing @kbd{q} in
-the @file{*Backtrace*} buffer.)
-
-In practice, for a bug as simple as this, the `Lisp error' line will
-tell you what you need to know to correct the definition.  The
-function @code{1=} is `void'.
-
-@ignore
-@need 800
-In GNU Emacs 20 and before, you will see:
-
-@smallexample
-Symbol's function definition is void:@: 1=
-@end smallexample
-
-@noindent
-which has the same meaning as the @file{*Backtrace*} buffer line in
-version 21.
-@end ignore
-
-However, suppose you are not quite certain what is going on?
-You can read the complete backtrace.
-
-In this case, you need to run a recent GNU Emacs, which automatically
-starts the debugger that puts you in the @file{*Backtrace*} buffer; or
-else, you need to start the debugger manually as described below.
-
-Read the @file{*Backtrace*} buffer from the bottom up; it tells you
-what Emacs did that led to the error.  Emacs made an interactive call
-to @kbd{C-x C-e} (@code{eval-last-sexp}), which led to the evaluation
-of the @code{triangle-bugged} expression.  Each line above tells you
-what the Lisp interpreter evaluated next.
-
-@need 1250
-The third line from the top of the buffer is
-
-@smallexample
-(setq number (1= number))
-@end smallexample
-
-@noindent
-Emacs tried to evaluate this expression; in order to do so, it tried
-to evaluate the inner expression shown on the second line from the
-top:
-
-@smallexample
-(1= number)
-@end smallexample
-
-@need 1250
-@noindent
-This is where the error occurred; as the top line says:
-
-@smallexample
-Debugger entered--Lisp error: (void-function 1=)
-@end smallexample
-
-@noindent
-You can correct the mistake, re-evaluate the function definition, and
-then run your test again.
-
-@node debug-on-entry, debug-on-quit, debug, Debugging
-@section @code{debug-on-entry}
-@findex debug-on-entry
-
-A recent GNU Emacs starts the debugger automatically when your
-function has an error.
-
-@ignore
-GNU Emacs version 20 and before did not; it simply
-presented you with an error message.  You had to start the debugger
-manually.
-@end ignore
-
-Incidentally, you can start the debugger manually for all versions of
-Emacs; the advantage is that the debugger runs even if you do not have
-a bug in your code.  Sometimes your code will be free of bugs!
-
-You can enter the debugger when you call the function by calling
-@code{debug-on-entry}.
-
-@need 1250
-@noindent
-Type:
-
-@smallexample
-M-x debug-on-entry RET triangle-bugged RET
-@end smallexample
-
-@need 1250
-@noindent
-Now, evaluate the following:
-
-@smallexample
-(triangle-bugged 5)
-@end smallexample
-
-@noindent
-All versions of Emacs will create a @file{*Backtrace*} buffer and tell
-you that it is beginning to evaluate the @code{triangle-bugged}
-function:
-
-@smallexample
-@group
----------- Buffer: *Backtrace* ----------
-Debugger entered--entering a function:
-* triangle-bugged(5)
-  eval((triangle-bugged 5))
-@end group
-@group
-  eval-last-sexp-1(nil)
-  eval-last-sexp(nil)
-  call-interactively(eval-last-sexp)
----------- Buffer: *Backtrace* ----------
-@end group
-@end smallexample
-
-In the @file{*Backtrace*} buffer, type @kbd{d}.  Emacs will evaluate
-the first expression in @code{triangle-bugged}; the buffer will look
-like this:
-
-@smallexample
-@group
----------- Buffer: *Backtrace* ----------
-Debugger entered--beginning evaluation of function call form:
-* (let ((total 0)) (while (> number 0) (setq total ...)
-        (setq number ...)) total)
-* triangle-bugged(5)
-  eval((triangle-bugged 5))
-@end group
-@group
-  eval-last-sexp-1(nil)
-  eval-last-sexp(nil)
-  call-interactively(eval-last-sexp)
----------- Buffer: *Backtrace* ----------
-@end group
-@end smallexample
-
-@noindent
-Now, type @kbd{d} again, eight times, slowly.  Each time you type
-@kbd{d}, Emacs will evaluate another expression in the function
-definition.
-
-@need 1750
-Eventually, the buffer will look like this:
-
-@smallexample
-@group
----------- Buffer: *Backtrace* ----------
-Debugger entered--beginning evaluation of function call form:
-* (setq number (1= number))
-* (while (> number 0) (setq total (+ total number))
-        (setq number (1= number)))
-@group
-@end group
-* (let ((total 0)) (while (> number 0) (setq total ...)
-        (setq number ...)) total)
-* triangle-bugged(5)
-  eval((triangle-bugged 5))
-@group
-@end group
-  eval-last-sexp-1(nil)
-  eval-last-sexp(nil)
-  call-interactively(eval-last-sexp)
----------- Buffer: *Backtrace* ----------
-@end group
-@end smallexample
-
-@need 1500
-@noindent
-Finally, after you type @kbd{d} two more times, Emacs will reach the
-error, and the top two lines of the @file{*Backtrace*} buffer will look
-like this:
-
-@smallexample
-@group
----------- Buffer: *Backtrace* ----------
-Debugger entered--Lisp error: (void-function 1=)
-* (1= number)
-@dots{}
----------- Buffer: *Backtrace* ----------
-@end group
-@end smallexample
-
-By typing @kbd{d}, you were able to step through the function.
-
-You can quit a @file{*Backtrace*} buffer by typing @kbd{q} in it; this
-quits the trace, but does not cancel @code{debug-on-entry}.
-
-@findex cancel-debug-on-entry
-To cancel the effect of @code{debug-on-entry}, call
-@code{cancel-debug-on-entry} and the name of the function, like this:
-
-@smallexample
-M-x cancel-debug-on-entry RET triangle-bugged RET
-@end smallexample
-
-@noindent
-(If you are reading this in Info, cancel @code{debug-on-entry} now.)
-
-@node debug-on-quit, edebug, debug-on-entry, Debugging
-@section @code{debug-on-quit} and @code{(debug)}
-
-In addition to setting @code{debug-on-error} or calling @code{debug-on-entry},
-there are two other ways to start @code{debug}.
-
-@findex debug-on-quit
-You can start @code{debug} whenever you type @kbd{C-g}
-(@code{keyboard-quit}) by setting the variable @code{debug-on-quit} to
-@code{t}.  This is useful for debugging infinite loops.
-
-@need 1500
-@cindex @code{(debug)} in code
-Or, you can insert a line that says @code{(debug)} into your code
-where you want the debugger to start, like this:
-
-@smallexample
-@group
-(defun triangle-bugged (number)
-  "Return sum of numbers 1 through NUMBER inclusive."
-  (let ((total 0))
-    (while (> number 0)
-      (setq total (+ total number))
-      (debug)                         ; @r{Start debugger.}
-      (setq number (1= number)))      ; @r{Error here.}
-    total))
-@end group
-@end smallexample
-
-The @code{debug} function is described in detail in @ref{Debugger, ,
-The Lisp Debugger, elisp, The GNU Emacs Lisp Reference Manual}.
-
-@node edebug, Debugging Exercises, debug-on-quit, Debugging
-@section The @code{edebug} Source Level Debugger
-@cindex Source level debugger
-@findex edebug
-
-Edebug is a source level debugger.  Edebug normally displays the
-source of the code you are debugging, with an arrow at the left that
-shows which line you are currently executing.
-
-You can walk through the execution of a function, line by line, or run
-quickly until reaching a @dfn{breakpoint} where execution stops.
-
-Edebug is described in @ref{edebug, , Edebug, elisp, The GNU Emacs
-Lisp Reference Manual}.
-
-@need 1250
-Here is a bugged function definition for @code{triangle-recursively}.
-@xref{Recursive triangle function, , Recursion in place of a counter},
-for a review of it.
-
-@smallexample
-@group
-(defun triangle-recursively-bugged (number)
-  "Return sum of numbers 1 through NUMBER inclusive.
-Uses recursion."
-  (if (= number 1)
-      1
-    (+ number
-       (triangle-recursively-bugged
-        (1= number)))))               ; @r{Error here.}
-@end group
-@end smallexample
-
-@noindent
-Normally, you would install this definition by positioning your cursor
-after the function's closing parenthesis and typing @kbd{C-x C-e}
-(@code{eval-last-sexp}) or else by positioning your cursor within the
-definition and typing @kbd{C-M-x} (@code{eval-defun}).  (By default,
-the @code{eval-defun} command works only in Emacs Lisp mode or in Lisp
-Interactive mode.)
-
-@need 1500
-However, to prepare this function definition for Edebug, you must
-first @dfn{instrument} the code using a different command.  You can do
-this by positioning your cursor within or just after the definition
-and typing
-
-@smallexample
-M-x edebug-defun RET
-@end smallexample
-
-@noindent
-This will cause Emacs to load Edebug automatically if it is not
-already loaded, and properly instrument the function.
-
-After instrumenting the function, place your cursor after the
-following expression and type @kbd{C-x C-e} (@code{eval-last-sexp}):
-
-@smallexample
-(triangle-recursively-bugged 3)
-@end smallexample
-
-@noindent
-You will be jumped back to the source for
-@code{triangle-recursively-bugged} and the cursor positioned at the
-beginning of the @code{if} line of the function.  Also, you will see
-an arrowhead at the left hand side of that line.  The arrowhead marks
-the line where the function is executing.  (In the following examples,
-we show the arrowhead with @samp{=>}; in a windowing system, you may
-see the arrowhead as a solid triangle in the window `fringe'.)
-
-@smallexample
-=>@point{}(if (= number 1)
-@end smallexample
-
-@noindent
-@iftex
-In the example, the location of point is displayed with a star,
-@samp{@point{}} (in Info, it is displayed as @samp{-!-}).
-@end iftex
-@ifnottex
-In the example, the location of point is displayed as @samp{@point{}}
-(in a printed book, it is displayed with a five pointed star).
-@end ifnottex
-
-If you now press @key{SPC}, point will move to the next expression to
-be executed; the line will look like this:
-
-@smallexample
-=>(if @point{}(= number 1)
-@end smallexample
-
-@noindent
-As you continue to press @key{SPC}, point will move from expression to
-expression.  At the same time, whenever an expression returns a value,
-that value will be displayed in the echo area.  For example, after you
-move point past @code{number}, you will see the following:
-
-@smallexample
-Result: 3 (#o3, #x3, ?\C-c)
-@end smallexample
-
-@noindent
-This means the value of @code{number} is 3, which is octal three,
-hexadecimal three, and @sc{ascii} `control-c' (the third letter of the
-alphabet, in case you need to know this information).
-
-You can continue moving through the code until you reach the line with
-the error.  Before evaluation, that line looks like this:
-
-@smallexample
-=>        @point{}(1= number)))))               ; @r{Error here.}
-@end smallexample
-
-@need 1250
-@noindent
-When you press @key{SPC} once again, you will produce an error message
-that says:
-
-@smallexample
-Symbol's function definition is void:@: 1=
-@end smallexample
-
-@noindent
-This is the bug.
-
-Press @kbd{q} to quit Edebug.
-
-To remove instrumentation from a function definition, simply
-re-evaluate it with a command that does not instrument it.
-For example, you could place your cursor after the definition's
-closing parenthesis and type @kbd{C-x C-e}.
-
-Edebug does a great deal more than walk with you through a function.
-You can set it so it races through on its own, stopping only at an
-error or at specified stopping points; you can cause it to display the
-changing values of various expressions; you can find out how many
-times a function is called, and more.
-
-Edebug is described in @ref{edebug, , Edebug, elisp, The GNU Emacs
-Lisp Reference Manual}.
-
-@need 1500
-@node Debugging Exercises,  , edebug, Debugging
-@section Debugging Exercises
-
-@itemize @bullet
-@item
-Install the @code{count-words-region} function and then cause it to
-enter the built-in debugger when you call it.  Run the command on a
-region containing two words.  You will need to press @kbd{d} a
-remarkable number of times.  On your system, is a `hook' called after
-the command finishes?  (For information on hooks, see @ref{Command
-Overview, , Command Loop Overview, elisp, The GNU Emacs Lisp Reference
-Manual}.)
-
-@item
-Copy @code{count-words-region} into the @file{*scratch*} buffer,
-instrument the function for Edebug, and walk through its execution.
-The function does not need to have a bug, although you can introduce
-one if you wish.  If the function lacks a bug, the walk-through
-completes without problems.
-
-@item
-While running Edebug, type @kbd{?} to see a list of all the Edebug commands.
-(The @code{global-edebug-prefix} is usually @kbd{C-x X}, i.e.@:
-@kbd{@key{CTRL}-x} followed by an upper case @kbd{X}; use this prefix
-for commands made outside of the Edebug debugging buffer.)
-
-@item
-In the Edebug debugging buffer, use the @kbd{p}
-(@code{edebug-bounce-point}) command to see where in the region the
-@code{count-words-region} is working.
-
-@item
-Move point to some spot further down the function and then type the
-@kbd{h} (@code{edebug-goto-here}) command to jump to that location.
-
-@item
-Use the @kbd{t} (@code{edebug-trace-mode}) command to cause Edebug to
-walk through the function on its own; use an upper case @kbd{T} for
-@code{edebug-Trace-fast-mode}.
-
-@item
-Set a breakpoint, then run Edebug in Trace mode until it reaches the
-stopping point.
-@end itemize
-
-@node Conclusion, the-the, Debugging, Top
-@chapter Conclusion
-
-We have now reached the end of this Introduction.  You have now
-learned enough about programming in Emacs Lisp to set values, to write
-simple @file{.emacs} files for yourself and your friends, and write
-simple customizations and extensions to Emacs.
-
-This is a place to stop.  Or, if you wish, you can now go onward, and
-teach yourself.
-
-You have learned some of the basic nuts and bolts of programming.  But
-only some.  There are a great many more brackets and hinges that are
-easy to use that we have not touched.
-
-A path you can follow right now lies among the sources to GNU Emacs
-and in
-@ifnotinfo
-@cite{The GNU Emacs Lisp Reference Manual}.
-@end ifnotinfo
-@ifinfo
-@ref{Top, , The GNU Emacs Lisp Reference Manual, elisp, The GNU
-Emacs Lisp Reference Manual}.
-@end ifinfo
-
-The Emacs Lisp sources are an adventure.  When you read the sources and
-come across a function or expression that is unfamiliar, you need to
-figure out or find out what it does.
-
-Go to the Reference Manual.  It is a thorough, complete, and fairly
-easy-to-read description of Emacs Lisp.  It is written not only for
-experts, but for people who know what you know.  (The @cite{Reference
-Manual} comes with the standard GNU Emacs distribution.  Like this
-introduction, it comes as a Texinfo source file, so you can read it
-on-line and as a typeset, printed book.)
-
-Go to the other on-line help that is part of GNU Emacs: the on-line
-documentation for all functions and variables, and @code{find-tags},
-the program that takes you to sources.
-
-Here is an example of how I explore the sources.  Because of its name,
-@file{simple.el} is the file I looked at first, a long time ago.  As
-it happens some of the functions in @file{simple.el} are complicated,
-or at least look complicated at first sight.  The @code{open-line}
-function, for example, looks complicated.
-
-You may want to walk through this function slowly, as we did with the
-@code{forward-sentence} function.  (@xref{forward-sentence, The
-@code{forward-sentence} function}.)  Or you may want to skip that
-function and look at another, such as @code{split-line}.  You don't
-need to read all the functions.  According to
-@code{count-words-in-defun}, the @code{split-line} function contains
-102 words and symbols.
-
-Even though it is short, @code{split-line} contains  expressions
-we have not studied: @code{skip-chars-forward}, @code{indent-to},
-@code{current-column} and @code{insert-and-inherit}.
-
-Consider the @code{skip-chars-forward} function.  (It is part of the
-function definition for @code{back-to-indentation}, which is shown in
-@ref{Review, , Review}.)
-
-In GNU Emacs, you can find out more about @code{skip-chars-forward} by
-typing @kbd{C-h f} (@code{describe-function}) and the name of the
-function.  This gives you the function documentation.
-
-You may be able to guess what is done by a well named function such as
-@code{indent-to}; or you can look it up, too.  Incidentally, the
-@code{describe-function} function itself is in @file{help.el}; it is
-one of those long, but decipherable functions.  You can look up
-@code{describe-function} using the @kbd{C-h f} command!
-
-In this instance, since the code is Lisp, the @file{*Help*} buffer
-contains the name of the library containing the function's source.
-You can put point over the name of the library and press the RET key,
-which in this situation is bound to @code{help-follow}, and be taken
-directly to the source, in the same way as @kbd{M-.}
-(@code{find-tag}).
-
-The definition for @code{describe-function} illustrates how to
-customize the @code{interactive} expression without using the standard
-character codes; and it shows how to create a temporary buffer.
-
-(The @code{indent-to} function is written in C rather than Emacs Lisp;
-it is a `built-in' function.  @code{help-follow} takes you to its
-source as does @code{find-tag}, when properly set up.)
-
-You can look at a function's source using @code{find-tag}, which is
-bound to @kbd{M-.}  Finally, you can find out what the Reference
-Manual has to say by visiting the manual in Info, and typing @kbd{i}
-(@code{Info-index}) and the name of the function, or by looking up the
-function in the index to a printed copy of the manual.
-
-Similarly, you can find out what is meant by
-@code{insert-and-inherit}.
-
-Other interesting source files include @file{paragraphs.el},
-@file{loaddefs.el}, and @file{loadup.el}.  The @file{paragraphs.el}
-file includes short, easily understood functions as well as longer
-ones.  The @file{loaddefs.el} file contains the many standard
-autoloads and many keymaps.  I have never looked at it all; only at
-parts.  @file{loadup.el} is the file that loads the standard parts of
-Emacs; it tells you a great deal about how Emacs is built.
-(@xref{Building Emacs, , Building Emacs, elisp, The GNU Emacs Lisp
-Reference Manual}, for more about building.)
-
-As I said, you have learned some nuts and bolts; however, and very
-importantly, we have hardly touched major aspects of programming; I
-have said nothing about how to sort information, except to use the
-predefined @code{sort} function; I have said nothing about how to store
-information, except to use variables and lists; I have said nothing
-about how to write programs that write programs.  These are topics for
-another, and different kind of book, a different kind of learning.
-
-What you have done is learn enough for much practical work with GNU
-Emacs.  What you have done is get started.  This is the end of a
-beginning.
-
-@c ================ Appendix ================
-
-@node the-the, Kill Ring, Conclusion, Top
-@appendix The @code{the-the} Function
-@findex the-the
-@cindex Duplicated words function
-@cindex Words, duplicated
-
-Sometimes when you you write text, you duplicate words---as with ``you
-you'' near the beginning of this sentence.  I find that most
-frequently, I duplicate ``the''; hence, I call the function for
-detecting duplicated words, @code{the-the}.
-
-@need 1250
-As a first step, you could use the following regular expression to
-search for duplicates:
-
-@smallexample
-\\(\\w+[ \t\n]+\\)\\1
-@end smallexample
-
-@noindent
-This regexp matches one or more word-constituent characters followed
-by one or more spaces, tabs, or newlines.  However, it does not detect
-duplicated words on different lines, since the ending of the first
-word, the end of the line, is different from the ending of the second
-word, a space.  (For more information about regular expressions, see
-@ref{Regexp Search, , Regular Expression Searches}, as well as
-@ref{Regexps, , Syntax of Regular Expressions, emacs, The GNU Emacs
-Manual}, and @ref{Regular Expressions, , Regular Expressions, elisp,
-The GNU Emacs Lisp Reference Manual}.)
-
-You might try searching just for duplicated word-constituent
-characters but that does not work since the pattern detects doubles
-such as the two occurrences of `th' in `with the'.
-
-Another possible regexp searches for word-constituent characters
-followed by non-word-constituent characters, reduplicated.  Here,
-@w{@samp{\\w+}} matches one or more word-constituent characters and
-@w{@samp{\\W*}} matches zero or more non-word-constituent characters.
-
-@smallexample
-\\(\\(\\w+\\)\\W*\\)\\1
-@end smallexample
-
-@noindent
-Again, not useful.
-
-Here is the pattern that I use.  It is not perfect, but good enough.
-@w{@samp{\\b}} matches the empty string, provided it is at the beginning
-or end of a word; @w{@samp{[^@@ \n\t]+}} matches one or more occurrences of
-any characters that are @emph{not} an @@-sign, space, newline, or tab.
-
-@smallexample
-\\b\\([^@@ \n\t]+\\)[ \n\t]+\\1\\b
-@end smallexample
-
-One can write more complicated expressions, but I found that this
-expression is good enough, so I use it.
-
-Here is the @code{the-the} function, as I include it in my
-@file{.emacs} file, along with a handy global key binding:
-
-@smallexample
-@group
-(defun the-the ()
-  "Search forward for for a duplicated word."
-  (interactive)
-  (message "Searching for for duplicated words ...")
-  (push-mark)
-@end group
-@group
-  ;; This regexp is not perfect
-  ;; but is fairly good over all:
-  (if (re-search-forward
-       "\\b\\([^@@ \n\t]+\\)[ \n\t]+\\1\\b" nil 'move)
-      (message "Found duplicated word.")
-    (message "End of buffer")))
-@end group
-
-@group
-;; Bind `the-the' to  C-c \
-(global-set-key "\C-c\\" 'the-the)
-@end group
-@end smallexample
-
-@sp 1
-Here is test text:
-
-@smallexample
-@group
-one two two three four five
-five six seven
-@end group
-@end smallexample
-
-You can substitute the other regular expressions shown above in the
-function definition and try each of them on this list.
-
-@node Kill Ring, Full Graph, the-the, Top
-@appendix Handling the Kill Ring
-@cindex Kill ring handling
-@cindex Handling the kill ring
-@cindex Ring, making a list like a
-
-The kill ring is a list that is transformed into a ring by the
-workings of the @code{current-kill} function.  The @code{yank} and
-@code{yank-pop} commands use the @code{current-kill} function.
-
-This appendix describes the @code{current-kill} function as well as
-both the @code{yank} and the @code{yank-pop} commands, but first,
-consider the workings of the kill ring.
-
-@menu
-* What the Kill Ring Does::
-* current-kill::
-* yank::                        Paste a copy of a clipped element.
-* yank-pop::                    Insert element pointed to.
-* ring file::
-@end menu
-
-@node What the Kill Ring Does, current-kill, Kill Ring, Kill Ring
-@ifnottex
-@unnumberedsec What the Kill Ring Does
-@end ifnottex
-
-@need 1250
-The kill ring has a default maximum length of sixty items; this number
-is too large for an explanation.  Instead, set it to four.  Please
-evaluate the following:
-
-@smallexample
-@group
-(setq old-kill-ring-max kill-ring-max)
-(setq kill-ring-max 4)
-@end group
-@end smallexample
-
-@noindent
-Then, please copy each line of the following indented example into the
-kill ring.  You may kill each line with @kbd{C-k} or mark it and copy
-it with @kbd{M-w}.
-
-@noindent
-(In a read-only buffer, such as the @file{*info*} buffer, the kill
-command, @kbd{C-k} (@code{kill-line}), will not remove the text,
-merely copy it to the kill ring.  However, your machine may beep at
-you.  Alternatively, for silence, you may copy the region of each line
-with the @kbd{M-w} (@code{kill-ring-save}) command.  You must mark
-each line for this command to succeed, but it does not matter at which
-end you put point or mark.)
-
-@need 1250
-@noindent
-Please invoke the calls in order, so that five elements attempt to
-fill the kill ring:
-
-@smallexample
-@group
-first some text
-second piece of text
-third line
-fourth line of text
-fifth bit of text
-@end group
-@end smallexample
-
-@need 1250
-@noindent
-Then find the value of @code{kill-ring} by evaluating
-
-@smallexample
-kill-ring
-@end smallexample
-
-@need 800
-@noindent
-It is:
-
-@smallexample
-@group
-("fifth bit of text" "fourth line of text"
-"third line" "second piece of text")
-@end group
-@end smallexample
-
-@noindent
-The first element, @samp{first some text}, was dropped.
-
-@need 1250
-To return to the old value for the length of the kill ring, evaluate:
-
-@smallexample
-(setq kill-ring-max old-kill-ring-max)
-@end smallexample
-
-@node current-kill, yank, What the Kill Ring Does, Kill Ring
-@comment  node-name,  next,  previous,  up
-@appendixsec The @code{current-kill} Function
-@findex current-kill
-
-The @code{current-kill} function changes the element in the kill ring
-to which @code{kill-ring-yank-pointer} points.  (Also, the
-@code{kill-new} function sets @code{kill-ring-yank-pointer} to point
-to the latest element of the the kill ring.  The @code{kill-new}
-function is used directly or indirectly by @code{kill-append},
-@code{copy-region-as-kill}, @code{kill-ring-save}, @code{kill-line},
-and @code{kill-region}.)
-
-@menu
-* Code for current-kill::
-* Understanding current-kill::
-@end menu
-
-@node Code for current-kill, Understanding current-kill, current-kill, current-kill
-@ifnottex
-@unnumberedsubsec The code for @code{current-kill}
-@end ifnottex
-
-
-@need 1500
-The @code{current-kill} function is used by @code{yank} and by
-@code{yank-pop}.  Here is the code for @code{current-kill}:
-
-@smallexample
-@group
-(defun current-kill (n &optional do-not-move)
-  "Rotate the yanking point by N places, and then return that kill.
-If N is zero, `interprogram-paste-function' is set, and calling it
-returns a string, then that string is added to the front of the
-kill ring and returned as the latest kill.
-@end group
-@group
-If optional arg DO-NOT-MOVE is non-nil, then don't actually move the
-yanking point; just return the Nth kill forward."
-  (let ((interprogram-paste (and (= n 0)
-                                 interprogram-paste-function
-                                 (funcall interprogram-paste-function))))
-@end group
-@group
-    (if interprogram-paste
-        (progn
-          ;; Disable the interprogram cut function when we add the new
-          ;; text to the kill ring, so Emacs doesn't try to own the
-          ;; selection, with identical text.
-          (let ((interprogram-cut-function nil))
-            (kill-new interprogram-paste))
-          interprogram-paste)
-@end group
-@group
-      (or kill-ring (error "Kill ring is empty"))
-      (let ((ARGth-kill-element
-             (nthcdr (mod (- n (length kill-ring-yank-pointer))
-                          (length kill-ring))
-                     kill-ring)))
-        (or do-not-move
-            (setq kill-ring-yank-pointer ARGth-kill-element))
-        (car ARGth-kill-element)))))
-@end group
-@end smallexample
-
-Remember also that the @code{kill-new} function sets
-@code{kill-ring-yank-pointer} to the latest element of the the kill
-ring, which means that all the functions that call it set the value
-indirectly: @code{kill-append}, @code{copy-region-as-kill},
-@code{kill-ring-save}, @code{kill-line}, and @code{kill-region}.
-
-@need 1500
-Here is the line in @code{kill-new}, which is explained in
-@ref{kill-new function, , The @code{kill-new} function}.
-
-@smallexample
-(setq kill-ring-yank-pointer kill-ring)
-@end smallexample
-
-@node Understanding current-kill,  , Code for current-kill, current-kill
-@ifnottex
-@unnumberedsubsec @code{current-kill} in Outline
-@end ifnottex
-
-The @code{current-kill} function looks complex, but as usual, it can
-be understood by taking it apart piece by piece.  First look at it in
-skeletal form:
-
-@smallexample
-@group
-(defun current-kill (n &optional do-not-move)
-  "Rotate the yanking point by N places, and then return that kill."
-  (let @var{varlist}
-    @var{body}@dots{})
-@end group
-@end smallexample
-
-This function takes two arguments, one of which is optional.  It has a
-documentation string.  It is @emph{not} interactive.
-
-@menu
-* Body of current-kill::
-* Digression concerning error::  How to mislead humans, but not computers.
-* Determining the Element::
-@end menu
-
-@node Body of current-kill, Digression concerning error, Understanding current-kill, Understanding current-kill
-@ifnottex
-@unnumberedsubsubsec The Body of @code{current-kill}
-@end ifnottex
-
-The body of the function definition is a @code{let} expression, which
-itself has a body as well as a @var{varlist}.
-
-The @code{let} expression declares a variable that will be only usable
-within the bounds of this function.  This variable is called
-@code{interprogram-paste} and is for copying to another program.  It
-is not for copying within this instance of GNU Emacs.  Most window
-systems provide a facility for interprogram pasting.  Sadly, that
-facility usually provides only for the last element.  Most windowing
-systems have not adopted a ring of many possibilities, even though
-Emacs has provided it for decades.
-
-The @code{if} expression has two parts, one if there exists
-@code{interprogram-paste} and one if not.
-
-@need 2000
-Let us consider the `if not' or else-part of the @code{current-kill}
-function.  (The then-part uses the the @code{kill-new} function, which
-we have already described.  @xref{kill-new function, , The
-@code{kill-new} function}.)
-
-@smallexample
-@group
-(or kill-ring (error "Kill ring is empty"))
-(let ((ARGth-kill-element
-       (nthcdr (mod (- n (length kill-ring-yank-pointer))
-                    (length kill-ring))
-               kill-ring)))
-  (or do-not-move
-      (setq kill-ring-yank-pointer ARGth-kill-element))
-  (car ARGth-kill-element))
-@end group
-@end smallexample
-
-@noindent
-The code first checks whether the kill ring has content; otherwise it
-signals an error.
-
-@need 1000
-Note that the @code{or} expression is very similar to testing length
-with an @code{if}:
-
-@findex zerop
-@findex error
-@smallexample
-@group
-(if (zerop (length kill-ring))          ; @r{if-part}
-    (error "Kill ring is empty"))       ; @r{then-part}
-  ;; No else-part
-@end group
-@end smallexample
-
-@noindent
-If there is not anything in the kill ring, its length must be zero and
-an error message sent to the user: @samp{Kill ring is empty}.  The
-@code{current-kill} function uses an @code{or} expression which is
-simpler.  But an @code{if} expression reminds us what goes on.
-
-This @code{if} expression uses the function @code{zerop} which returns
-true if the value it is testing is zero.  When @code{zerop} tests
-true, the then-part of the @code{if} is evaluated.  The then-part is a
-list starting with the function @code{error}, which is a function that
-is similar to the @code{message} function
-(@pxref{message, , The @code{message} Function}) in that
-it prints a one-line message in the echo area.  However, in addition
-to printing a message, @code{error} also stops evaluation of the
-function within which it is embedded.  This means that the rest of the
-function will not be evaluated if the length of the kill ring is zero.
-
-Then the @code{current-kill} function selects the element to return.
-The selection depends on the number of places that @code{current-kill}
-rotates and on where @code{kill-ring-yank-pointer} points.
-
-Next, either the optional @code{do-not-move} argument is true or the
-current value of @code{kill-ring-yank-pointer} is set to point to the
-list.  Finally, another expression returns the first element of the
-list even if the @code{do-not-move} argument is true.
-
-@node Digression concerning error, Determining the Element, Body of current-kill, Understanding current-kill
-@ifnottex
-@unnumberedsubsubsec Digression about the word `error'
-@end ifnottex
-
-In my opinion, it is slightly misleading, at least to humans, to use
-the term `error' as the name of the @code{error} function.  A better
-term would be `cancel'.  Strictly speaking, of course, you cannot
-point to, much less rotate a pointer to a list that has no length, so
-from the point of view of the computer, the word `error' is correct.
-But a human expects to attempt this sort of thing, if only to find out
-whether the kill ring is full or empty.  This is an act of
-exploration.
-
-From the human point of view, the act of exploration and discovery is
-not necessarily an error, and therefore should not be labelled as one,
-even in the bowels of a computer.  As it is, the code in Emacs implies
-that a human who is acting virtuously, by exploring his or her
-environment, is making an error.  This is bad.  Even though the computer
-takes the same steps as it does when there is an `error', a term such as
-`cancel' would have a clearer connotation.
-
-@node Determining the Element,  , Digression concerning error, Understanding current-kill
-@ifnottex
-@unnumberedsubsubsec Determining the Element
-@end ifnottex
-
-Among other actions, the else-part of the @code{if} expression sets
-the value of @code{kill-ring-yank-pointer} to
-@code{ARGth-kill-element} when the kill ring has something in it and
-the value of @code{do-not-move} is @code{nil}.
-
-@need 800
-The code looks like this:
-
-@smallexample
-@group
-(nthcdr (mod (- n (length kill-ring-yank-pointer))
-             (length kill-ring))
-        kill-ring)))
-@end group
-@end smallexample
-
-This needs some examination.  Unless it is not supposed to move the
-pointer, the @code{current-kill} function changes where
-@code{kill-ring-yank-pointer} points.
-That is what the
-@w{@code{(setq kill-ring-yank-pointer ARGth-kill-element))}}
-expression does.  Also, clearly, @code{ARGth-kill-element} is being
-set to be equal to some @sc{cdr} of the kill ring, using the
-@code{nthcdr} function that is described in an earlier section.
-(@xref{copy-region-as-kill}.)  How does it do this?
-
-As we have seen before (@pxref{nthcdr}), the @code{nthcdr} function
-works by repeatedly taking the @sc{cdr} of a list---it takes the
-@sc{cdr} of the @sc{cdr} of the @sc{cdr} @dots{}
-
-@need 800
-The two following expressions produce the same result:
-
-@smallexample
-@group
-(setq kill-ring-yank-pointer (cdr kill-ring))
-
-(setq kill-ring-yank-pointer (nthcdr 1 kill-ring))
-@end group
-@end smallexample
-
-However, the @code{nthcdr} expression is more complicated.  It uses
-the @code{mod} function to determine which @sc{cdr} to select.
-
-(You will remember to look at inner functions first; indeed, we will
-have to go inside the @code{mod}.)
-
-The @code{mod} function returns the value of its first argument modulo
-the second; that is to say, it returns the remainder after dividing
-the first argument by the second.  The value returned has the same
-sign as the second argument.
-
-@need 800
-Thus,
-
-@smallexample
-@group
-(mod 12 4)
-  @result{} 0  ;; @r{because there is no remainder}
-(mod 13 4)
-  @result{} 1
-@end group
-@end smallexample
-
-@need 1250
-In this case, the first argument is often smaller than the second.
-That is fine.
-
-@smallexample
-@group
-(mod 0 4)
-  @result{} 0
-(mod 1 4)
-  @result{} 1
-@end group
-@end smallexample
-
-We can guess what the @code{-} function does.  It is like @code{+} but
-subtracts instead of adds; the @code{-} function subtracts its second
-argument from its first.  Also, we already know what the @code{length}
-function does (@pxref{length}).  It returns the length of a list.
-
-And @code{n} is the name of the required argument to the
-@code{current-kill} function.
-
-@need 1250
-So when the first argument to @code{nthcdr} is zero, the @code{nthcdr}
-expression returns the whole list, as you can see by evaluating the
-following:
-
-@smallexample
-@group
-;; kill-ring-yank-pointer @r{and} kill-ring @r{have a length of four}
-;; @r{and} (mod (- 0 4) 4) @result{} 0
-(nthcdr (mod (- 0 4) 4)
-        '("fourth line of text"
-          "third line"
-          "second piece of text"
-          "first some text"))
-@end group
-@end smallexample
-
-@need 1250
-When the first argument to the @code{current-kill} function is one,
-the @code{nthcdr} expression returns the list without its first
-element.
-
-@smallexample
-@group
-(nthcdr (mod (- 1 4) 4)
-        '("fourth line of text"
-          "third line"
-          "second piece of text"
-          "first some text"))
-@end group
-@end smallexample
-
-@cindex @samp{global variable} defined
-@cindex @samp{variable, global}, defined
-Incidentally, both @code{kill-ring} and @code{kill-ring-yank-pointer}
-are @dfn{global variables}.  That means that any expression in Emacs
-Lisp can access them.  They are not like the local variables set by
-@code{let} or like the symbols in an argument list.
-Local variables can only be accessed
-within the @code{let} that defines them or the function that specifies
-them in an argument list (and within expressions called by them).
-
-@ignore
-@c texi2dvi fails when the name of the section is within ifnottex ...
-(@xref{Prevent confusion, , @code{let} Prevents Confusion}, and
-@ref{defun, , The @code{defun} Special Form}.)
-@end ignore
-
-@node yank, yank-pop, current-kill, Kill Ring
-@comment  node-name,  next,  previous,  up
-@appendixsec @code{yank}
-@findex yank
-
-After learning about @code{current-kill}, the code for the
-@code{yank} function is almost easy.
-
-The @code{yank} function does not use the
-@code{kill-ring-yank-pointer} variable directly.  It calls
-@code{insert-for-yank} which calls @code{current-kill} which sets the
-@code{kill-ring-yank-pointer} variable.
-
-@need 1250
-The code looks like this:
-
-@c in GNU Emacs 22
-@smallexample
-@group
-(defun yank (&optional arg)
-  "Reinsert (\"paste\") the last stretch of killed text.
-More precisely, reinsert the stretch of killed text most recently
-killed OR yanked.  Put point at end, and set mark at beginning.
-With just \\[universal-argument] as argument, same but put point at
-beginning (and mark at end).  With argument N, reinsert the Nth most
-recently killed stretch of killed text.
-
-When this command inserts killed text into the buffer, it honors
-`yank-excluded-properties' and `yank-handler' as described in the
-doc string for `insert-for-yank-1', which see.
-
-See also the command \\[yank-pop]."
-@end group
-@group
-  (interactive "*P")
-  (setq yank-window-start (window-start))
-  ;; If we don't get all the way thru, make last-command indicate that
-  ;; for the following command.
-  (setq this-command t)
-  (push-mark (point))
-@end group
-@group
-  (insert-for-yank (current-kill (cond
-                                  ((listp arg) 0)
-                                  ((eq arg '-) -2)
-                                  (t (1- arg)))))
-  (if (consp arg)
-      ;; This is like exchange-point-and-mark,
-      ;;     but doesn't activate the mark.
-      ;; It is cleaner to avoid activation, even though the command
-      ;; loop would deactivate the mark because we inserted text.
-      (goto-char (prog1 (mark t)
-                   (set-marker (mark-marker) (point) (current-buffer)))))
-@end group
-@group
-  ;; If we do get all the way thru, make this-command indicate that.
-  (if (eq this-command t)
-      (setq this-command 'yank))
-  nil)
-@end group
-@end smallexample
-
-The key expression is @code{insert-for-yank}, which inserts the string
-returned by @code{current-kill}, but removes some text properties from
-it.
-
-However, before getting to that expression, the function sets the value
-of @code{yank-window-start} to the position returned by the
-@code{(window-start)} expression, the position at which the display
-currently starts.  The @code{yank} function also sets
-@code{this-command} and pushes the mark.
-
-After it yanks the appropriate element, if the optional argument is a
-@sc{cons} rather than a number or nothing, it puts point at beginning
-of the yanked text and mark at its end.
-
-(The @code{prog1} function is like @code{progn} but returns the value
-of its first argument rather than the value of its last argument.  Its
-first argument is forced to return the buffer's mark as an integer.
-You can see the documentation for these functions by placing point
-over them in this buffer and then typing @kbd{C-h f}
-(@code{describe-function}) followed by a @kbd{RET}; the default is the
-function.)
-
-The last part of the function tells what to do when it succeeds.
-
-@node yank-pop, ring file, yank, Kill Ring
-@comment  node-name,  next,  previous,  up
-@appendixsec @code{yank-pop}
-@findex yank-pop
-
-After understanding @code{yank} and @code{current-kill}, you know how
-to approach the @code{yank-pop} function.  Leaving out the
-documentation to save space, it looks like this:
-
-@c GNU Emacs 22
-@smallexample
-@group
-(defun yank-pop (&optional arg)
-  "@dots{}"
-  (interactive "*p")
-  (if (not (eq last-command 'yank))
-      (error "Previous command was not a yank"))
-@end group
-@group
-  (setq this-command 'yank)
-  (unless arg (setq arg 1))
-  (let ((inhibit-read-only t)
-        (before (< (point) (mark t))))
-@end group
-@group
-    (if before
-        (funcall (or yank-undo-function 'delete-region) (point) (mark t))
-      (funcall (or yank-undo-function 'delete-region) (mark t) (point)))
-    (setq yank-undo-function nil)
-@end group
-@group
-    (set-marker (mark-marker) (point) (current-buffer))
-    (insert-for-yank (current-kill arg))
-    ;; Set the window start back where it was in the yank command,
-    ;; if possible.
-    (set-window-start (selected-window) yank-window-start t)
-@end group
-@group
-    (if before
-        ;; This is like exchange-point-and-mark,
-        ;;     but doesn't activate the mark.
-        ;; It is cleaner to avoid activation, even though the command
-        ;; loop would deactivate the mark because we inserted text.
-        (goto-char (prog1 (mark t)
-                     (set-marker (mark-marker)
-                                 (point)
-                                 (current-buffer))))))
-  nil)
-@end group
-@end smallexample
-
-The function is interactive with a small @samp{p} so the prefix
-argument is processed and passed to the function.  The command can
-only be used after a previous yank; otherwise an error message is
-sent.  This check uses the variable @code{last-command} which is set
-by @code{yank} and is discussed elsewhere.
-(@xref{copy-region-as-kill}.)
-
-The @code{let} clause sets the variable @code{before} to true or false
-depending whether point is before or after mark and then the region
-between point and mark is deleted.  This is the region that was just
-inserted by the previous yank and it is this text that will be
-replaced.
-
-@code{funcall} calls its first argument as a function, passing
-remaining arguments to it.  The first argument is whatever the
-@code{or} expression returns.  The two remaining arguments are the
-positions of point and mark set by the preceding @code{yank} command.
-
-There is more, but that is the hardest part.
-
-@node ring file,  , yank-pop, Kill Ring
-@comment  node-name,  next,  previous,  up
-@appendixsec The @file{ring.el} File
-@cindex @file{ring.el} file
-
-Interestingly, GNU Emacs posses a file called @file{ring.el} that
-provides many of the features we just discussed.  But functions such
-as @code{kill-ring-yank-pointer} do not use this library, possibly
-because they were written earlier.
-
-@node Full Graph, Free Software and Free Manuals, Kill Ring, Top
-@appendix A Graph with Labelled Axes
-
-Printed axes help you understand a graph.  They convey scale.  In an
-earlier chapter (@pxref{Readying a Graph, ,  Readying a Graph}), we
-wrote the code to print the body of a graph.  Here we write the code
-for printing and labelling vertical and horizontal axes, along with the
-body itself.
-
-@menu
-* Labelled Example::
-* print-graph Varlist::         @code{let} expression in @code{print-graph}.
-* print-Y-axis::                Print a label for the vertical axis.
-* print-X-axis::                Print a horizontal label.
-* Print Whole Graph::           The function to print a complete graph.
-@end menu
-
-@node Labelled Example, print-graph Varlist, Full Graph, Full Graph
-@ifnottex
-@unnumberedsec Labelled Example Graph
-@end ifnottex
-
-Since insertions fill a buffer to the right and below point, the new
-graph printing function should first print the Y or vertical axis,
-then the body of the graph, and finally the X or horizontal axis.
-This sequence lays out for us the contents of the function:
-
-@enumerate
-@item
-Set up code.
-
-@item
-Print Y axis.
-
-@item
-Print body of graph.
-
-@item
-Print X axis.
-@end enumerate
-
-@need 800
-Here is an example of how a finished graph should look:
-
-@smallexample
-@group
-    10 -
-                  *
-                  *  *
-                  *  **
-                  *  ***
-     5 -      *   *******
-            * *** *******
-            *************
-          ***************
-     1 - ****************
-         |   |    |    |
-         1   5   10   15
-@end group
-@end smallexample
-
-@noindent
-In this graph, both the vertical and the horizontal axes are labelled
-with numbers.  However, in some graphs, the horizontal axis is time
-and would be better labelled with months, like this:
-
-@smallexample
-@group
-     5 -      *
-            * ** *
-            *******
-          ********** **
-     1 - **************
-         |    ^      |
-         Jan  June   Jan
-@end group
-@end smallexample
-
-Indeed, with a little thought, we can easily come up with a variety of
-vertical and horizontal labelling schemes.  Our task could become
-complicated.  But complications breed confusion.  Rather than permit
-this, it is better choose a simple labelling scheme for our first
-effort, and to modify or replace it later.
-
-@need 1200
-These considerations suggest the following outline for the
-@code{print-graph} function:
-
-@smallexample
-@group
-(defun print-graph (numbers-list)
-  "@var{documentation}@dots{}"
-  (let ((height  @dots{}
-        @dots{}))
-@end group
-@group
-    (print-Y-axis height @dots{} )
-    (graph-body-print numbers-list)
-    (print-X-axis @dots{} )))
-@end group
-@end smallexample
-
-We can work on each part of the @code{print-graph} function definition
-in turn.
-
-@node print-graph Varlist, print-Y-axis, Labelled Example, Full Graph
-@comment  node-name,  next,  previous,  up
-@appendixsec The @code{print-graph} Varlist
-@cindex @code{print-graph} varlist
-
-In writing the @code{print-graph} function, the first task is to write
-the varlist in the @code{let} expression.  (We will leave aside for the
-moment any thoughts about making the function interactive or about the
-contents of its documentation string.)
-
-The varlist should set several values.  Clearly, the top of the label
-for the vertical axis must be at least the height of the graph, which
-means that we must obtain this information here.  Note that the
-@code{print-graph-body} function also requires this information.  There
-is no reason to calculate the height of the graph in two different
-places, so we should change @code{print-graph-body} from the way we
-defined it earlier to take advantage of the calculation.
-
-Similarly, both the function for printing the X axis labels and the
-@code{print-graph-body} function need to learn the value of the width of
-each symbol.  We can perform the calculation here and change the
-definition for @code{print-graph-body} from the way we defined it in the
-previous chapter.
-
-The length of the label for the horizontal axis must be at least as long
-as the graph.  However, this information is used only in the function
-that prints the horizontal axis, so it does not need to be calculated here.
-
-These thoughts lead us directly to the following form for the varlist
-in the @code{let} for @code{print-graph}:
-
-@smallexample
-@group
-(let ((height (apply 'max numbers-list)) ; @r{First version.}
-      (symbol-width (length graph-blank)))
-@end group
-@end smallexample
-
-@noindent
-As we shall see, this expression is not quite right.
-
-@need 2000
-@node print-Y-axis, print-X-axis, print-graph Varlist, Full Graph
-@comment  node-name,  next,  previous,  up
-@appendixsec The @code{print-Y-axis} Function
-@cindex Axis, print vertical
-@cindex Y axis printing
-@cindex Vertical axis printing
-@cindex Print vertical axis
-
-The job of the @code{print-Y-axis} function is to print a label for
-the vertical axis that looks like this:
-
-@smallexample
-@group
-    10 -
-
-
-
-
-     5 -
-
-
-
-     1 -
-@end group
-@end smallexample
-
-@noindent
-The function should be passed the height of the graph, and then should
-construct and insert the appropriate numbers and marks.
-
-@menu
-* print-Y-axis in Detail::
-* Height of label::             What height for the Y axis?
-* Compute a Remainder::         How to compute the remainder of a division.
-* Y Axis Element::              Construct a line for the Y axis.
-* Y-axis-column::               Generate a list of Y axis labels.
-* print-Y-axis Penultimate::    A not quite final version.
-@end menu
-
-@node print-Y-axis in Detail, Height of label, print-Y-axis, print-Y-axis
-@ifnottex
-@unnumberedsubsec The @code{print-Y-axis} Function in Detail
-@end ifnottex
-
-It is easy enough to see in the figure what the Y axis label should
-look like; but to say in words, and then to write a function
-definition to do the job is another matter.  It is not quite true to
-say that we want a number and a tic every five lines: there are only
-three lines between the @samp{1} and the @samp{5} (lines 2, 3, and 4),
-but four lines between the @samp{5} and the @samp{10} (lines 6, 7, 8,
-and 9).  It is better to say that we want a number and a tic mark on
-the base line (number 1) and then that we want a number and a tic on
-the fifth line from the bottom and on every line that is a multiple of
-five.
-
-@node Height of label, Compute a Remainder, print-Y-axis in Detail, print-Y-axis
-@ifnottex
-@unnumberedsubsec What height should the label be?
-@end ifnottex
-
-The next issue is what height the label should be?  Suppose the maximum
-height of tallest column of the graph is seven.  Should the highest
-label on the Y axis be @samp{5 -}, and should the graph stick up above
-the label?  Or should the highest label be @samp{7 -}, and mark the peak
-of the graph?  Or should the highest label be @code{10 -}, which is a
-multiple of five, and be higher than the topmost value of the graph?
-
-The latter form is preferred.  Most graphs are drawn within rectangles
-whose sides are an integral number of steps long---5, 10, 15, and so
-on for a step distance of five.  But as soon as we decide to use a
-step height for the vertical axis, we discover that the simple
-expression in the varlist for computing the height is wrong.  The
-expression is @code{(apply 'max numbers-list)}.  This returns the
-precise height, not the maximum height plus whatever is necessary to
-round up to the nearest multiple of five.  A more complex expression
-is required.
-
-As usual in cases like this, a complex problem becomes simpler if it is
-divided into several smaller problems.
-
-First, consider the case when the highest value of the graph is an
-integral multiple of five---when it is 5, 10, 15, or some higher
-multiple of five.  We can use this value as the Y axis height.
-
-A fairly simply way to determine whether a number is a multiple of
-five is to divide it by five and see if the division results in a
-remainder.  If there is no remainder, the number is a multiple of
-five.  Thus, seven divided by five has a remainder of two, and seven
-is not an integral multiple of five.  Put in slightly different
-language, more reminiscent of the classroom, five goes into seven
-once, with a remainder of two.  However, five goes into ten twice,
-with no remainder: ten is an integral multiple of five.
-
-@node Compute a Remainder, Y Axis Element, Height of label, print-Y-axis
-@appendixsubsec Side Trip: Compute a Remainder
-
-@findex % @r{(remainder function)}
-@cindex Remainder function, @code{%}
-In Lisp, the function for computing a remainder is @code{%}.  The
-function returns the remainder of its first argument divided by its
-second argument.  As it happens, @code{%} is a function in Emacs Lisp
-that you cannot discover using @code{apropos}: you find nothing if you
-type @kbd{M-x apropos @key{RET} remainder @key{RET}}.  The only way to
-learn of the existence of @code{%} is to read about it in a book such
-as this or in the Emacs Lisp sources.
-
-You can try the @code{%} function by evaluating the following two
-expressions:
-
-@smallexample
-@group
-(% 7 5)
-
-(% 10 5)
-@end group
-@end smallexample
-
-@noindent
-The first expression returns 2 and the second expression returns 0.
-
-To test whether the returned value is zero or some other number, we
-can use the @code{zerop} function.  This function returns @code{t} if
-its argument, which must be a number, is zero.
-
-@smallexample
-@group
-(zerop (% 7 5))
-     @result{} nil
-
-(zerop (% 10 5))
-     @result{} t
-@end group
-@end smallexample
-
-Thus, the following expression will return @code{t} if the height
-of the graph is evenly divisible by five:
-
-@smallexample
-(zerop (% height 5))
-@end smallexample
-
-@noindent
-(The value of @code{height}, of course, can be found from @code{(apply
-'max numbers-list)}.)
-
-On the other hand, if the value of @code{height} is not a multiple of
-five, we want to reset the value to the next higher multiple of five.
-This is straightforward arithmetic using functions with which we are
-already familiar.  First, we divide the value of @code{height} by five
-to determine how many times five goes into the number.  Thus, five
-goes into twelve twice.  If we add one to this quotient and multiply by
-five, we will obtain the value of the next multiple of five that is
-larger than the height.  Five goes into twelve twice.  Add one to two,
-and multiply by five; the result is fifteen, which is the next multiple
-of five that is higher than twelve.  The Lisp expression for this is:
-
-@smallexample
-(* (1+ (/ height 5)) 5)
-@end smallexample
-
-@noindent
-For example, if you evaluate the following, the result is 15:
-
-@smallexample
-(* (1+ (/ 12 5)) 5)
-@end smallexample
-
-All through this discussion, we have been using `five' as the value
-for spacing labels on the Y axis; but we may want to use some other
-value.  For generality, we should replace `five' with a variable to
-which we can assign a value.  The best name I can think of for this
-variable is @code{Y-axis-label-spacing}.
-
-@need 1250
-Using this term, and an @code{if} expression, we produce the
-following:
-
-@smallexample
-@group
-(if (zerop (% height Y-axis-label-spacing))
-    height
-  ;; @r{else}
-  (* (1+ (/ height Y-axis-label-spacing))
-     Y-axis-label-spacing))
-@end group
-@end smallexample
-
-@noindent
-This expression returns the value of @code{height} itself if the height
-is an even multiple of the value of the @code{Y-axis-label-spacing} or
-else it computes and returns a value of @code{height} that is equal to
-the next higher multiple of the value of the @code{Y-axis-label-spacing}.
-
-We can now include this expression in the @code{let} expression of the
-@code{print-graph} function (after first setting the value of
-@code{Y-axis-label-spacing}):
-@vindex Y-axis-label-spacing
-
-@smallexample
-@group
-(defvar Y-axis-label-spacing 5
-  "Number of lines from one Y axis label to next.")
-@end group
-
-@group
-@dots{}
-(let* ((height (apply 'max numbers-list))
-       (height-of-top-line
-        (if (zerop (% height Y-axis-label-spacing))
-            height
-@end group
-@group
-          ;; @r{else}
-          (* (1+ (/ height Y-axis-label-spacing))
-             Y-axis-label-spacing)))
-       (symbol-width (length graph-blank))))
-@dots{}
-@end group
-@end smallexample
-
-@noindent
-(Note use of the  @code{let*} function: the initial value of height is
-computed once by the @code{(apply 'max numbers-list)} expression and
-then the resulting value of  @code{height} is used to compute its
-final value.  @xref{fwd-para let, , The @code{let*} expression}, for
-more about @code{let*}.)
-
-@node Y Axis Element, Y-axis-column, Compute a Remainder, print-Y-axis
-@appendixsubsec Construct a Y Axis Element
-
-When we print the vertical axis, we want to insert strings such as
-@w{@samp{5 -}} and @w{@samp{10 - }} every five lines.
-Moreover, we want the numbers and dashes to line up, so shorter
-numbers must be padded with leading spaces.  If some of the strings
-use two digit numbers, the strings with single digit numbers must
-include a leading blank space before the number.
-
-@findex number-to-string
-To figure out the length of the number, the @code{length} function is
-used.  But the @code{length} function works only with a string, not with
-a number.  So the number has to be converted from being a number to
-being a string.  This is done with the @code{number-to-string} function.
-For example,
-
-@smallexample
-@group
-(length (number-to-string 35))
-     @result{} 2
-
-(length (number-to-string 100))
-     @result{} 3
-@end group
-@end smallexample
-
-@noindent
-(@code{number-to-string} is also called @code{int-to-string}; you will
-see this alternative name in various sources.)
-
-In addition, in each label, each number is followed by a string such
-as @w{@samp{ - }}, which we will call the @code{Y-axis-tic} marker.
-This variable is defined with @code{defvar}:
-
-@vindex Y-axis-tic
-@smallexample
-@group
-(defvar Y-axis-tic " - "
-   "String that follows number in a Y axis label.")
-@end group
-@end smallexample
-
-The length of the Y label is the sum of the length of the Y axis tic
-mark and the length of the number of the top of the graph.
-
-@smallexample
-(length (concat (number-to-string height) Y-axis-tic)))
-@end smallexample
-
-This value will be calculated by the @code{print-graph} function in
-its varlist as @code{full-Y-label-width} and passed on.  (Note that we
-did not think to include this in the varlist when we first proposed it.)
-
-To make a complete vertical axis label, a tic mark is concatenated
-with a number; and the two together may be preceded by one or more
-spaces depending on how long the number is.  The label consists of
-three parts: the (optional) leading spaces, the number, and the tic
-mark.  The function is passed the value of the number for the specific
-row, and the value of the width of the top line, which is calculated
-(just once) by @code{print-graph}.
-
-@smallexample
-@group
-(defun Y-axis-element (number full-Y-label-width)
-  "Construct a NUMBERed label element.
-A numbered element looks like this `  5 - ',
-and is padded as needed so all line up with
-the element for the largest number."
-@end group
-@group
-  (let* ((leading-spaces
-         (- full-Y-label-width
-            (length
-             (concat (number-to-string number)
-                     Y-axis-tic)))))
-@end group
-@group
-    (concat
-     (make-string leading-spaces ? )
-     (number-to-string number)
-     Y-axis-tic)))
-@end group
-@end smallexample
-
-The @code{Y-axis-element} function concatenates together the leading
-spaces, if any; the number, as a string; and the tic mark.
-
-To figure out how many leading spaces the label will need, the
-function subtracts the actual length of the label---the length of the
-number plus the length of the tic mark---from the desired label width.
-
-@findex make-string
-Blank spaces are inserted using the @code{make-string} function.  This
-function takes two arguments: the first tells it how long the string
-will be and the second is a symbol for the character to insert, in a
-special format.  The format is a question mark followed by a blank
-space, like this, @samp{? }.  @xref{Character Type, , Character Type,
-elisp, The GNU Emacs Lisp Reference Manual}, for a description of the
-syntax for characters.  (Of course, you might want to replace the
-blank space by some other character @dots{}  You know what to do.)
-
-The @code{number-to-string} function is used in the concatenation
-expression, to convert the number to a string that is concatenated
-with the leading spaces and the tic mark.
-
-@node Y-axis-column, print-Y-axis Penultimate, Y Axis Element, print-Y-axis
-@appendixsubsec Create a Y Axis Column
-
-The preceding functions provide all the tools needed to construct a
-function that generates a list of numbered and blank strings to insert
-as the label for the vertical axis:
-
-@findex Y-axis-column
-@smallexample
-@group
-(defun Y-axis-column (height width-of-label)
-  "Construct list of Y axis labels and blank strings.
-For HEIGHT of line above base and WIDTH-OF-LABEL."
-  (let (Y-axis)
-@group
-@end group
-    (while (> height 1)
-      (if (zerop (% height Y-axis-label-spacing))
-          ;; @r{Insert label.}
-          (setq Y-axis
-                (cons
-                 (Y-axis-element height width-of-label)
-                 Y-axis))
-@group
-@end group
-        ;; @r{Else, insert blanks.}
-        (setq Y-axis
-              (cons
-               (make-string width-of-label ? )
-               Y-axis)))
-      (setq height (1- height)))
-    ;; @r{Insert base line.}
-    (setq Y-axis
-          (cons (Y-axis-element 1 width-of-label) Y-axis))
-    (nreverse Y-axis)))
-@end group
-@end smallexample
-
-In this function, we start with the value of @code{height} and
-repetitively subtract one from its value.  After each subtraction, we
-test to see whether the value is an integral multiple of the
-@code{Y-axis-label-spacing}.  If it is, we construct a numbered label
-using the @code{Y-axis-element} function; if not, we construct a
-blank label using the @code{make-string} function.  The base line
-consists of the number one followed by a tic mark.
-
-@need 2000
-@node print-Y-axis Penultimate,  , Y-axis-column, print-Y-axis
-@appendixsubsec The Not Quite Final Version of @code{print-Y-axis}
-
-The list constructed by the @code{Y-axis-column} function is passed to
-the @code{print-Y-axis} function, which inserts the list as a column.
-
-@findex print-Y-axis
-@smallexample
-@group
-(defun print-Y-axis (height full-Y-label-width)
-  "Insert Y axis using HEIGHT and FULL-Y-LABEL-WIDTH.
-Height must be the maximum height of the graph.
-Full width is the width of the highest label element."
-;; Value of height and full-Y-label-width
-;; are passed by `print-graph'.
-@end group
-@group
-  (let ((start (point)))
-    (insert-rectangle
-     (Y-axis-column height full-Y-label-width))
-    ;; @r{Place point ready for inserting graph.}
-    (goto-char start)
-    ;; @r{Move point forward by value of} full-Y-label-width
-    (forward-char full-Y-label-width)))
-@end group
-@end smallexample
-
-The @code{print-Y-axis} uses the @code{insert-rectangle} function to
-insert the Y axis labels created by the @code{Y-axis-column} function.
-In addition, it places point at the correct position for printing the body of
-the graph.
-
-You can test @code{print-Y-axis}:
-
-@enumerate
-@item
-Install
-
-@smallexample
-@group
-Y-axis-label-spacing
-Y-axis-tic
-Y-axis-element
-Y-axis-column
-print-Y-axis
-@end group
-@end smallexample
-
-@item
-Copy the following expression:
-
-@smallexample
-(print-Y-axis 12 5)
-@end smallexample
-
-@item
-Switch to the @file{*scratch*} buffer and place the cursor where you
-want the axis labels to start.
-
-@item
-Type @kbd{M-:} (@code{eval-expression}).
-
-@item
-Yank the @code{graph-body-print} expression into the minibuffer
-with @kbd{C-y} (@code{yank)}.
-
-@item
-Press @key{RET} to evaluate the expression.
-@end enumerate
-
-Emacs will print labels vertically, the top one being @w{@samp{10 -@w{
-}}}.  (The @code{print-graph} function will pass the value of
-@code{height-of-top-line}, which in this case will end up as 15,
-thereby getting rid of what might appear as a bug.)
-
-@need 2000
-@node print-X-axis, Print Whole Graph, print-Y-axis, Full Graph
-@appendixsec The @code{print-X-axis} Function
-@cindex Axis, print horizontal
-@cindex X axis printing
-@cindex Print horizontal axis
-@cindex Horizontal axis printing
-
-X axis labels are much like Y axis labels, except that the ticks are on a
-line above the numbers.  Labels should look like this:
-
-@smallexample
-@group
-    |   |    |    |
-    1   5   10   15
-@end group
-@end smallexample
-
-The first tic is under the first column of the graph and is preceded by
-several blank spaces.  These spaces provide room in rows above for the Y
-axis labels.  The second, third, fourth, and subsequent ticks are all
-spaced equally, according to the value of @code{X-axis-label-spacing}.
-
-The second row of the X axis consists of numbers, preceded by several
-blank spaces and also separated according to the value of the variable
-@code{X-axis-label-spacing}.
-
-The value of the variable @code{X-axis-label-spacing} should itself be
-measured in units of @code{symbol-width}, since you may want to change
-the width of the symbols that you are using to print the body of the
-graph without changing the ways the graph is labelled.
-
-@menu
-* Similarities differences::    Much like @code{print-Y-axis}, but not exactly.
-* X Axis Tic Marks::            Create tic marks for the horizontal axis.
-@end menu
-
-@node Similarities differences, X Axis Tic Marks, print-X-axis, print-X-axis
-@ifnottex
-@unnumberedsubsec Similarities and differences
-@end ifnottex
-
-The @code{print-X-axis} function is constructed in more or less the
-same fashion as the @code{print-Y-axis} function except that it has
-two lines: the line of tic marks and the numbers.  We will write a
-separate function to print each line and then combine them within the
-@code{print-X-axis} function.
-
-This is a three step process:
-
-@enumerate
-@item
-Write a function to print the X axis tic marks, @code{print-X-axis-tic-line}.
-
-@item
-Write a function to print the X numbers, @code{print-X-axis-numbered-line}.
-
-@item
-Write a function to print both lines, the @code{print-X-axis} function,
-using @code{print-X-axis-tic-line} and
-@code{print-X-axis-numbered-line}.
-@end enumerate
-
-@node X Axis Tic Marks,  , Similarities differences, print-X-axis
-@appendixsubsec X Axis Tic Marks
-
-The first function should print the X axis tic marks.  We must specify
-the tic marks themselves and their spacing:
-
-@smallexample
-@group
-(defvar X-axis-label-spacing
-  (if (boundp 'graph-blank)
-      (* 5 (length graph-blank)) 5)
-  "Number of units from one X axis label to next.")
-@end group
-@end smallexample
-
-@noindent
-(Note that the value of @code{graph-blank} is set by another
-@code{defvar}.  The @code{boundp} predicate checks whether it has
-already been set; @code{boundp} returns @code{nil} if it has not.  If
-@code{graph-blank} were unbound and we did not use this conditional
-construction, in a recent GNU Emacs, we would enter the debugger and
-see an error message saying @samp{@w{Debugger entered--Lisp error:}
-@w{(void-variable graph-blank)}}.)
-
-@need 1200
-Here is the @code{defvar} for @code{X-axis-tic-symbol}:
-
-@smallexample
-@group
-(defvar X-axis-tic-symbol "|"
-  "String to insert to point to a column in X axis.")
-@end group
-@end smallexample
-
-@need 1250
-The goal is to make a line that looks like this:
-
-@smallexample
-       |   |    |    |
-@end smallexample
-
-The first tic is indented so that it is under the first column, which is
-indented to provide space for the Y axis labels.
-
-A tic element consists of the blank spaces that stretch from one tic to
-the next plus a tic symbol.  The number of blanks is determined by the
-width of the tic symbol and the @code{X-axis-label-spacing}.
-
-@need 1250
-The code looks like this:
-
-@smallexample
-@group
-;;; X-axis-tic-element
-@dots{}
-(concat
- (make-string
-  ;; @r{Make a string of blanks.}
-  (-  (* symbol-width X-axis-label-spacing)
-      (length X-axis-tic-symbol))
-  ? )
- ;; @r{Concatenate blanks with tic symbol.}
- X-axis-tic-symbol)
-@dots{}
-@end group
-@end smallexample
-
-Next, we determine how many blanks are needed to indent the first tic
-mark to the first column of the graph.  This uses the value of
-@code{full-Y-label-width} passed it by the @code{print-graph} function.
-
-@need 1250
-The code to make @code{X-axis-leading-spaces}
-looks like this:
-
-@smallexample
-@group
-;; X-axis-leading-spaces
-@dots{}
-(make-string full-Y-label-width ? )
-@dots{}
-@end group
-@end smallexample
-
-We also need to determine the length of the horizontal axis, which is
-the length of the numbers list, and the number of ticks in the horizontal
-axis:
-
-@smallexample
-@group
-;; X-length
-@dots{}
-(length numbers-list)
-@end group
-
-@group
-;; tic-width
-@dots{}
-(* symbol-width X-axis-label-spacing)
-@end group
-
-@group
-;; number-of-X-ticks
-(if (zerop (% (X-length tic-width)))
-    (/ (X-length tic-width))
-  (1+ (/ (X-length tic-width))))
-@end group
-@end smallexample
-
-@need 1250
-All this leads us directly to the function for printing the X axis tic line:
-
-@findex print-X-axis-tic-line
-@smallexample
-@group
-(defun print-X-axis-tic-line
-  (number-of-X-tics X-axis-leading-spaces X-axis-tic-element)
-  "Print ticks for X axis."
-    (insert X-axis-leading-spaces)
-    (insert X-axis-tic-symbol)  ; @r{Under first column.}
-@end group
-@group
-    ;; @r{Insert second tic in the right spot.}
-    (insert (concat
-             (make-string
-              (-  (* symbol-width X-axis-label-spacing)
-                  ;; @r{Insert white space up to second tic symbol.}
-                  (* 2 (length X-axis-tic-symbol)))
-              ? )
-             X-axis-tic-symbol))
-@end group
-@group
-    ;; @r{Insert remaining ticks.}
-    (while (> number-of-X-tics 1)
-      (insert X-axis-tic-element)
-      (setq number-of-X-tics (1- number-of-X-tics))))
-@end group
-@end smallexample
-
-The line of numbers is equally straightforward:
-
-@need 1250
-First, we create a numbered element with blank spaces before each number:
-
-@findex X-axis-element
-@smallexample
-@group
-(defun X-axis-element (number)
-  "Construct a numbered X axis element."
-  (let ((leading-spaces
-         (-  (* symbol-width X-axis-label-spacing)
-             (length (number-to-string number)))))
-    (concat (make-string leading-spaces ? )
-            (number-to-string number))))
-@end group
-@end smallexample
-
-Next, we create the function to print the numbered line, starting with
-the number ``1'' under the first column:
-
-@findex print-X-axis-numbered-line
-@smallexample
-@group
-(defun print-X-axis-numbered-line
-  (number-of-X-tics X-axis-leading-spaces)
-  "Print line of X-axis numbers"
-  (let ((number X-axis-label-spacing))
-    (insert X-axis-leading-spaces)
-    (insert "1")
-@end group
-@group
-    (insert (concat
-             (make-string
-              ;; @r{Insert white space up to next number.}
-              (-  (* symbol-width X-axis-label-spacing) 2)
-              ? )
-             (number-to-string number)))
-@end group
-@group
-    ;; @r{Insert remaining numbers.}
-    (setq number (+ number X-axis-label-spacing))
-    (while (> number-of-X-tics 1)
-      (insert (X-axis-element number))
-      (setq number (+ number X-axis-label-spacing))
-      (setq number-of-X-tics (1- number-of-X-tics)))))
-@end group
-@end smallexample
-
-Finally, we need to write the @code{print-X-axis} that uses
-@code{print-X-axis-tic-line} and
-@code{print-X-axis-numbered-line}.
-
-The function must determine the local values of the variables used by both
-@code{print-X-axis-tic-line} and @code{print-X-axis-numbered-line}, and
-then it must call them.  Also, it must print the carriage return that
-separates the two lines.
-
-The function consists of a varlist that specifies five local variables,
-and calls to each of the two line printing functions:
-
-@findex print-X-axis
-@smallexample
-@group
-(defun print-X-axis (numbers-list)
-  "Print X axis labels to length of NUMBERS-LIST."
-  (let* ((leading-spaces
-          (make-string full-Y-label-width ? ))
-@end group
-@group
-       ;; symbol-width @r{is provided by} graph-body-print
-       (tic-width (* symbol-width X-axis-label-spacing))
-       (X-length (length numbers-list))
-@end group
-@group
-       (X-tic
-        (concat
-         (make-string
-@end group
-@group
-          ;; @r{Make a string of blanks.}
-          (-  (* symbol-width X-axis-label-spacing)
-              (length X-axis-tic-symbol))
-          ? )
-@end group
-@group
-         ;; @r{Concatenate blanks with tic symbol.}
-         X-axis-tic-symbol))
-@end group
-@group
-       (tic-number
-        (if (zerop (% X-length tic-width))
-            (/ X-length tic-width)
-          (1+ (/ X-length tic-width)))))
-@end group
-@group
-    (print-X-axis-tic-line tic-number leading-spaces X-tic)
-    (insert "\n")
-    (print-X-axis-numbered-line tic-number leading-spaces)))
-@end group
-@end smallexample
-
-@need 1250
-You can test @code{print-X-axis}:
-
-@enumerate
-@item
-Install @code{X-axis-tic-symbol}, @code{X-axis-label-spacing},
-@code{print-X-axis-tic-line}, as well as @code{X-axis-element},
-@code{print-X-axis-numbered-line}, and @code{print-X-axis}.
-
-@item
-Copy the following expression:
-
-@smallexample
-@group
-(progn
- (let ((full-Y-label-width 5)
-       (symbol-width 1))
-   (print-X-axis
-    '(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16))))
-@end group
-@end smallexample
-
-@item
-Switch to the @file{*scratch*} buffer and place the cursor where you
-want the axis labels to start.
-
-@item
-Type @kbd{M-:} (@code{eval-expression}).
-
-@item
-Yank the test expression into the minibuffer
-with @kbd{C-y} (@code{yank)}.
-
-@item
-Press @key{RET} to evaluate the expression.
-@end enumerate
-
-@need 1250
-Emacs will print the horizontal axis like this:
-@sp 1
-
-@smallexample
-@group
-     |   |    |    |    |
-     1   5   10   15   20
-@end group
-@end smallexample
-
-@node Print Whole Graph,  , print-X-axis, Full Graph
-@appendixsec Printing the Whole Graph
-@cindex Printing the whole graph
-@cindex Whole graph printing
-@cindex Graph, printing all
-
-Now we are nearly ready to print the whole graph.
-
-The function to print the graph with the proper labels follows the
-outline we created earlier (@pxref{Full Graph, , A Graph with Labelled
-Axes}), but with additions.
-
-@need 1250
-Here is the outline:
-
-@smallexample
-@group
-(defun print-graph (numbers-list)
-  "@var{documentation}@dots{}"
-  (let ((height  @dots{}
-        @dots{}))
-@end group
-@group
-    (print-Y-axis height @dots{} )
-    (graph-body-print numbers-list)
-    (print-X-axis @dots{} )))
-@end group
-@end smallexample
-
-@menu
-* The final version::           A few changes.
-* Test print-graph::            Run a short test.
-* Graphing words in defuns::    Executing the final code.
-* lambda::                      How to write an anonymous function.
-* mapcar::                      Apply a function to elements of a list.
-* Another Bug::                 Yet another bug @dots{} most insidious.
-* Final printed graph::         The graph itself!
-@end menu
-
-@node The final version, Test print-graph, Print Whole Graph, Print Whole Graph
-@ifnottex
-@unnumberedsubsec Changes for the Final Version
-@end ifnottex
-
-The final version is different from what we planned in two ways:
-first, it contains additional values calculated once in the varlist;
-second, it carries an option to specify the labels' increment per row.
-This latter feature turns out to be essential; otherwise, a graph may
-have more rows than fit on a display or on a sheet of paper.
-
-@need 1500
-This new feature requires a change to the @code{Y-axis-column}
-function, to add @code{vertical-step} to it.  The function looks like
-this:
-
-@findex Y-axis-column @r{Final version.}
-@smallexample
-@group
-;;; @r{Final version.}
-(defun Y-axis-column
-  (height width-of-label &optional vertical-step)
-  "Construct list of labels for Y axis.
-HEIGHT is maximum height of graph.
-WIDTH-OF-LABEL is maximum width of label.
-VERTICAL-STEP, an option, is a positive integer
-that specifies how much a Y axis label increments
-for each line.  For example, a step of 5 means
-that each line is five units of the graph."
-@end group
-@group
-  (let (Y-axis
-        (number-per-line (or vertical-step 1)))
-    (while (> height 1)
-      (if (zerop (% height Y-axis-label-spacing))
-@end group
-@group
-          ;; @r{Insert label.}
-          (setq Y-axis
-                (cons
-                 (Y-axis-element
-                  (* height number-per-line)
-                  width-of-label)
-                 Y-axis))
-@end group
-@group
-        ;; @r{Else, insert blanks.}
-        (setq Y-axis
-              (cons
-               (make-string width-of-label ? )
-               Y-axis)))
-      (setq height (1- height)))
-@end group
-@group
-    ;; @r{Insert base line.}
-    (setq Y-axis (cons (Y-axis-element
-                        (or vertical-step 1)
-                        width-of-label)
-                       Y-axis))
-    (nreverse Y-axis)))
-@end group
-@end smallexample
-
-The values for the maximum height of graph and the width of a symbol
-are computed by @code{print-graph} in its @code{let} expression; so
-@code{graph-body-print} must be changed to accept them.
-
-@findex graph-body-print @r{Final version.}
-@smallexample
-@group
-;;; @r{Final version.}
-(defun graph-body-print (numbers-list height symbol-width)
-  "Print a bar graph of the NUMBERS-LIST.
-The numbers-list consists of the Y-axis values.
-HEIGHT is maximum height of graph.
-SYMBOL-WIDTH is number of each column."
-@end group
-@group
-  (let (from-position)
-    (while numbers-list
-      (setq from-position (point))
-      (insert-rectangle
-       (column-of-graph height (car numbers-list)))
-      (goto-char from-position)
-      (forward-char symbol-width)
-@end group
-@group
-      ;; @r{Draw graph column by column.}
-      (sit-for 0)
-      (setq numbers-list (cdr numbers-list)))
-    ;; @r{Place point for X axis labels.}
-    (forward-line height)
-    (insert "\n")))
-@end group
-@end smallexample
-
-@need 1250
-Finally, the code for the @code{print-graph} function:
-
-@findex print-graph @r{Final version.}
-@smallexample
-@group
-;;; @r{Final version.}
-(defun print-graph
-  (numbers-list &optional vertical-step)
-  "Print labelled bar graph of the NUMBERS-LIST.
-The numbers-list consists of the Y-axis values.
-@end group
-
-@group
-Optionally, VERTICAL-STEP, a positive integer,
-specifies how much a Y axis label increments for
-each line.  For example, a step of 5 means that
-each row is five units."
-@end group
-@group
-  (let* ((symbol-width (length graph-blank))
-         ;; @code{height} @r{is both the largest number}
-         ;; @r{and the number with the most digits.}
-         (height (apply 'max numbers-list))
-@end group
-@group
-         (height-of-top-line
-          (if (zerop (% height Y-axis-label-spacing))
-              height
-            ;; @r{else}
-            (* (1+ (/ height Y-axis-label-spacing))
-               Y-axis-label-spacing)))
-@end group
-@group
-         (vertical-step (or vertical-step 1))
-         (full-Y-label-width
-          (length
-@end group
-@group
-           (concat
-            (number-to-string
-             (* height-of-top-line vertical-step))
-            Y-axis-tic))))
-@end group
-
-@group
-    (print-Y-axis
-     height-of-top-line full-Y-label-width vertical-step)
-@end group
-@group
-    (graph-body-print
-     numbers-list height-of-top-line symbol-width)
-    (print-X-axis numbers-list)))
-@end group
-@end smallexample
-
-@node Test print-graph, Graphing words in defuns, The final version, Print Whole Graph
-@appendixsubsec Testing @code{print-graph}
-
-@need 1250
-We can test the @code{print-graph} function with a short list of numbers:
-
-@enumerate
-@item
-Install the final versions of @code{Y-axis-column},
-@code{graph-body-print}, and @code{print-graph} (in addition to the
-rest of the code.)
-
-@item
-Copy the following expression:
-
-@smallexample
-(print-graph '(3 2 5 6 7 5 3 4 6 4 3 2 1))
-@end smallexample
-
-@item
-Switch to the @file{*scratch*} buffer and place the cursor where you
-want the axis labels to start.
-
-@item
-Type @kbd{M-:} (@code{eval-expression}).
-
-@item
-Yank the test expression into the minibuffer
-with @kbd{C-y} (@code{yank)}.
-
-@item
-Press @key{RET} to evaluate the expression.
-@end enumerate
-
-@need 1250
-Emacs will print a graph that looks like this:
-
-@smallexample
-@group
-10 -
-
-
-         *
-        **   *
- 5 -   ****  *
-       **** ***
-     * *********
-     ************
- 1 - *************
-
-     |   |    |    |
-     1   5   10   15
-@end group
-@end smallexample
-
-@need 1200
-On the other hand, if you pass @code{print-graph} a
-@code{vertical-step} value of 2, by evaluating this expression:
-
-@smallexample
-(print-graph '(3 2 5 6 7 5 3 4 6 4 3 2 1) 2)
-@end smallexample
-
-@need 1250
-@noindent
-The graph looks like this:
-
-@smallexample
-@group
-20 -
-
-
-         *
-        **   *
-10 -   ****  *
-       **** ***
-     * *********
-     ************
- 2 - *************
-
-     |   |    |    |
-     1   5   10   15
-@end group
-@end smallexample
-
-@noindent
-(A question: is the `2' on the bottom of the vertical axis a bug or a
-feature?  If you think it is a bug, and should be a `1' instead, (or
-even a `0'), you can modify the sources.)
-
-@node Graphing words in defuns, lambda, Test print-graph, Print Whole Graph
-@appendixsubsec Graphing Numbers of Words and Symbols
-
-Now for the graph for which all this code was written: a graph that
-shows how many function definitions contain fewer than 10 words and
-symbols, how many contain between 10 and 19 words and symbols, how
-many contain between 20 and 29 words and symbols, and so on.
-
-This is a multi-step process.  First make sure you have loaded all the
-requisite code.
-
-@need 1500
-It is a good idea to reset the value of @code{top-of-ranges} in case
-you have set it to some different value.  You can evaluate the
-following:
-
-@smallexample
-@group
-(setq top-of-ranges
- '(10  20  30  40  50
-   60  70  80  90 100
-  110 120 130 140 150
-  160 170 180 190 200
-  210 220 230 240 250
-  260 270 280 290 300)
-@end group
-@end smallexample
-
-@noindent
-Next create a list of the number of words and symbols in each range.
-
-@need 1500
-@noindent
-Evaluate the following:
-
-@smallexample
-@group
-(setq list-for-graph
-       (defuns-per-range
-         (sort
-          (recursive-lengths-list-many-files
-           (directory-files "/usr/local/emacs/lisp"
-                            t ".+el$"))
-          '<)
-         top-of-ranges))
-@end group
-@end smallexample
-
-@noindent
-On my old machine, this took about an hour.  It looked though 303 Lisp
-files in my copy of Emacs version 19.23.  After all that computing,
-the @code{list-for-graph} had this value:
-
-@smallexample
-@group
-(537 1027 955 785 594 483 349 292 224 199 166 120 116 99
-90 80 67 48 52 45 41 33 28 26 25 20 12 28 11 13 220)
-@end group
-@end smallexample
-
-@noindent
-This means that my copy of Emacs had 537 function definitions with
-fewer than 10 words or symbols in them, 1,027 function definitions
-with 10 to 19 words or symbols in them, 955 function definitions with
-20 to 29 words or symbols in them, and so on.
-
-Clearly, just by looking at this list we can see that most function
-definitions contain ten to thirty words and symbols.
-
-Now for printing.  We do @emph{not} want to print a graph that is
-1,030 lines high @dots{}  Instead, we should print a graph that is
-fewer than twenty-five lines high.  A graph that height can be
-displayed on almost any monitor, and easily printed on a sheet of paper.
-
-This means that each value in @code{list-for-graph} must be reduced to
-one-fiftieth its present value.
-
-Here is a short function to do just that, using two functions we have
-not yet seen, @code{mapcar} and @code{lambda}.
-
-@smallexample
-@group
-(defun one-fiftieth (full-range)
-  "Return list, each number one-fiftieth of previous."
- (mapcar '(lambda (arg) (/ arg 50)) full-range))
-@end group
-@end smallexample
-
-@node lambda, mapcar, Graphing words in defuns, Print Whole Graph
-@appendixsubsec A @code{lambda} Expression: Useful Anonymity
-@cindex Anonymous function
-@findex lambda
-
-@code{lambda} is the symbol for an anonymous function, a function
-without a name.  Every time you use an anonymous function, you need to
-include its whole body.
-
-@need 1250
-@noindent
-Thus,
-
-@smallexample
-(lambda (arg) (/ arg 50))
-@end smallexample
-
-@noindent
-is a function definition that says `return the value resulting from
-dividing whatever is passed to me as @code{arg} by 50'.
-
-@need 1200
-Earlier, for example, we had a function @code{multiply-by-seven}; it
-multiplied its argument by 7.  This function is similar, except it
-divides its argument by 50; and, it has no name.  The anonymous
-equivalent of @code{multiply-by-seven} is:
-
-@smallexample
-(lambda (number) (* 7 number))
-@end smallexample
-
-@noindent
-(@xref{defun, ,  The @code{defun} Special Form}.)
-
-@need 1250
-@noindent
-If we want to multiply 3 by 7, we can write:
-
-@c !!! Clear print-postscript-figures if the computer formatting this
-@c     document is too small and cannot handle all the diagrams and figures.
-@c clear print-postscript-figures
-@c set print-postscript-figures
-@c lambda example diagram #1
-@ifnottex
-@smallexample
-@group
-(multiply-by-seven 3)
- \_______________/ ^
-         |         |
-      function  argument
-@end group
-@end smallexample
-@end ifnottex
-@ifset print-postscript-figures
-@sp 1
-@tex
-@center @image{lambda-1}
-%%%% old method of including an image
-% \input /usr/local/lib/tex/inputs/psfig.tex
-% \centerline{\psfig{figure=/usr/local/lib/emacs/man/lambda-1.eps}}
-% \catcode`\@=0 %
-@end tex
-@sp 1
-@end ifset
-@ifclear print-postscript-figures
-@iftex
-@smallexample
-@group
-(multiply-by-seven 3)
- \_______________/ ^
-         |         |
-      function  argument
-@end group
-@end smallexample
-@end iftex
-@end ifclear
-
-@noindent
-This expression returns 21.
-
-@need 1250
-@noindent
-Similarly, we can write:
-
-@c lambda example diagram #2
-@ifnottex
-@smallexample
-@group
-((lambda (number) (* 7 number)) 3)
- \____________________________/ ^
-               |                |
-      anonymous function     argument
-@end group
-@end smallexample
-@end ifnottex
-@ifset print-postscript-figures
-@sp 1
-@tex
-@center @image{lambda-2}
-%%%% old method of including an image
-% \input /usr/local/lib/tex/inputs/psfig.tex
-% \centerline{\psfig{figure=/usr/local/lib/emacs/man/lambda-2.eps}}
-% \catcode`\@=0 %
-@end tex
-@sp 1
-@end ifset
-@ifclear print-postscript-figures
-@iftex
-@smallexample
-@group
-((lambda (number) (* 7 number)) 3)
- \____________________________/ ^
-               |                |
-      anonymous function     argument
-@end group
-@end smallexample
-@end iftex
-@end ifclear
-
-@need 1250
-@noindent
-If we want to divide 100 by 50, we can write:
-
-@c lambda example diagram #3
-@ifnottex
-@smallexample
-@group
-((lambda (arg) (/ arg 50)) 100)
- \______________________/  \_/
-             |              |
-    anonymous function   argument
-@end group
-@end smallexample
-@end ifnottex
-@ifset print-postscript-figures
-@sp 1
-@tex
-@center @image{lambda-3}
-%%%% old method of including an image
-% \input /usr/local/lib/tex/inputs/psfig.tex
-% \centerline{\psfig{figure=/usr/local/lib/emacs/man/lambda-3.eps}}
-% \catcode`\@=0 %
-@end tex
-@sp 1
-@end ifset
-@ifclear print-postscript-figures
-@iftex
-@smallexample
-@group
-((lambda (arg) (/ arg 50)) 100)
- \______________________/  \_/
-             |              |
-    anonymous function   argument
-@end group
-@end smallexample
-@end iftex
-@end ifclear
-
-@noindent
-This expression returns 2.  The 100 is passed to the function, which
-divides that number by 50.
-
-@xref{Lambda Expressions, , Lambda Expressions, elisp, The GNU Emacs
-Lisp Reference Manual}, for more about @code{lambda}.  Lisp and lambda
-expressions derive from the Lambda Calculus.
-
-@node mapcar, Another Bug, lambda, Print Whole Graph
-@appendixsubsec The @code{mapcar} Function
-@findex mapcar
-
-@code{mapcar} is a function that calls its first argument with each
-element of its second argument, in turn.  The second argument must be
-a sequence.
-
-The @samp{map} part of the name comes from the mathematical phrase,
-`mapping over a domain', meaning to apply a function to each of the
-elements in a domain.  The mathematical phrase is based on the
-metaphor of a surveyor walking, one step at a time, over an area he is
-mapping.  And @samp{car}, of course, comes from the Lisp notion of the
-first of a list.
-
-@need 1250
-@noindent
-For example,
-
-@smallexample
-@group
-(mapcar '1+ '(2 4 6))
-     @result{} (3 5 7)
-@end group
-@end smallexample
-
-@noindent
-The function @code{1+} which adds one to its argument, is executed on
-@emph{each} element of the list, and a new list is returned.
-
-Contrast this with @code{apply}, which applies its first argument to
-all the remaining.
-(@xref{Readying a Graph, , Readying a Graph}, for a explanation of
-@code{apply}.)
-
-@need 1250
-In the definition of @code{one-fiftieth}, the first argument is the
-anonymous function:
-
-@smallexample
-(lambda (arg) (/ arg 50))
-@end smallexample
-
-@noindent
-and the second argument is @code{full-range}, which will be bound to
-@code{list-for-graph}.
-
-@need 1250
-The whole expression looks like this:
-
-@smallexample
-(mapcar '(lambda (arg) (/ arg 50)) full-range))
-@end smallexample
-
-@xref{Mapping Functions, , Mapping Functions, elisp, The GNU Emacs
-Lisp Reference Manual}, for more about @code{mapcar}.
-
-Using the @code{one-fiftieth} function, we can generate a list in
-which each element is one-fiftieth the size of the corresponding
-element in @code{list-for-graph}.
-
-@smallexample
-@group
-(setq fiftieth-list-for-graph
-      (one-fiftieth list-for-graph))
-@end group
-@end smallexample
-
-@need 1250
-The resulting list looks like this:
-
-@smallexample
-@group
-(10 20 19 15 11 9 6 5 4 3 3 2 2
-1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 4)
-@end group
-@end smallexample
-
-@noindent
-This, we are almost ready to print!  (We also notice the loss of
-information: many of the higher ranges are 0, meaning that fewer than
-50 defuns had that many words or symbols---but not necessarily meaning
-that none had that many words or symbols.)
-
-@node Another Bug, Final printed graph, mapcar, Print Whole Graph
-@appendixsubsec Another Bug @dots{} Most Insidious
-@cindex Bug, most insidious type
-@cindex Insidious type of bug
-
-I said `almost ready to print'!  Of course, there is a bug in the
-@code{print-graph} function @dots{}  It has a @code{vertical-step}
-option, but not a @code{horizontal-step} option.  The
-@code{top-of-range} scale goes from 10 to 300 by tens.  But the
-@code{print-graph} function will print only by ones.
-
-This is a classic example of what some consider the most insidious
-type of bug, the bug of omission.  This is not the kind of bug you can
-find by studying the code, for it is not in the code; it is an omitted
-feature.  Your best actions are to try your program early and often;
-and try to arrange, as much as you can, to write code that is easy to
-understand and easy to change.  Try to be aware, whenever you can,
-that whatever you have written, @emph{will} be rewritten, if not soon,
-eventually.  A hard maxim to follow.
-
-It is the @code{print-X-axis-numbered-line} function that needs the
-work; and then the @code{print-X-axis} and the @code{print-graph}
-functions need to be adapted.  Not much needs to be done; there is one
-nicety: the numbers ought to line up under the tic marks.  This takes
-a little thought.
-
-@need 1250
-Here is the corrected @code{print-X-axis-numbered-line}:
-
-@smallexample
-@group
-(defun print-X-axis-numbered-line
-  (number-of-X-tics X-axis-leading-spaces
-   &optional horizontal-step)
-  "Print line of X-axis numbers"
-  (let ((number X-axis-label-spacing)
-        (horizontal-step (or horizontal-step 1)))
-@end group
-@group
-    (insert X-axis-leading-spaces)
-    ;; @r{Delete extra leading spaces.}
-    (delete-char
-     (- (1-
-         (length (number-to-string horizontal-step)))))
-    (insert (concat
-             (make-string
-@end group
-@group
-              ;; @r{Insert white space.}
-              (-  (* symbol-width
-                     X-axis-label-spacing)
-                  (1-
-                   (length
-                    (number-to-string horizontal-step)))
-                  2)
-              ? )
-             (number-to-string
-              (* number horizontal-step))))
-@end group
-@group
-    ;; @r{Insert remaining numbers.}
-    (setq number (+ number X-axis-label-spacing))
-    (while (> number-of-X-tics 1)
-      (insert (X-axis-element
-               (* number horizontal-step)))
-      (setq number (+ number X-axis-label-spacing))
-      (setq number-of-X-tics (1- number-of-X-tics)))))
-@end group
-@end smallexample
-
-@need 1500
-If you are reading this in Info, you can see the new versions of
-@code{print-X-axis} @code{print-graph} and evaluate them.  If you are
-reading this in a printed book, you can see the changed lines here
-(the full text is too much to print).
-
-@iftex
-@smallexample
-@group
-(defun print-X-axis (numbers-list horizontal-step)
-  @dots{}
-    (print-X-axis-numbered-line
-     tic-number leading-spaces horizontal-step))
-@end group
-@end smallexample
-
-@smallexample
-@group
-(defun print-graph
-  (numbers-list
-   &optional vertical-step horizontal-step)
-  @dots{}
-    (print-X-axis numbers-list horizontal-step))
-@end group
-@end smallexample
-@end iftex
-
-@ifnottex
-@smallexample
-@group
-(defun print-X-axis (numbers-list horizontal-step)
-  "Print X axis labels to length of NUMBERS-LIST.
-Optionally, HORIZONTAL-STEP, a positive integer,
-specifies how much an X  axis label increments for
-each column."
-@end group
-@group
-;; Value of symbol-width and full-Y-label-width
-;; are passed by `print-graph'.
-  (let* ((leading-spaces
-          (make-string full-Y-label-width ? ))
-       ;; symbol-width @r{is provided by} graph-body-print
-       (tic-width (* symbol-width X-axis-label-spacing))
-       (X-length (length numbers-list))
-@end group
-@group
-       (X-tic
-        (concat
-         (make-string
-          ;; @r{Make a string of blanks.}
-          (-  (* symbol-width X-axis-label-spacing)
-              (length X-axis-tic-symbol))
-          ? )
-@end group
-@group
-         ;; @r{Concatenate blanks with tic symbol.}
-         X-axis-tic-symbol))
-       (tic-number
-        (if (zerop (% X-length tic-width))
-            (/ X-length tic-width)
-          (1+ (/ X-length tic-width)))))
-@end group
-
-@group
-    (print-X-axis-tic-line
-     tic-number leading-spaces X-tic)
-    (insert "\n")
-    (print-X-axis-numbered-line
-     tic-number leading-spaces horizontal-step)))
-@end group
-@end smallexample
-
-@smallexample
-@group
-(defun print-graph
-  (numbers-list &optional vertical-step horizontal-step)
-  "Print labelled bar graph of the NUMBERS-LIST.
-The numbers-list consists of the Y-axis values.
-@end group
-
-@group
-Optionally, VERTICAL-STEP, a positive integer,
-specifies how much a Y axis label increments for
-each line.  For example, a step of 5 means that
-each row is five units.
-@end group
-
-@group
-Optionally, HORIZONTAL-STEP, a positive integer,
-specifies how much an X  axis label increments for
-each column."
-  (let* ((symbol-width (length graph-blank))
-         ;; @code{height} @r{is both the largest number}
-         ;; @r{and the number with the most digits.}
-         (height (apply 'max numbers-list))
-@end group
-@group
-         (height-of-top-line
-          (if (zerop (% height Y-axis-label-spacing))
-              height
-            ;; @r{else}
-            (* (1+ (/ height Y-axis-label-spacing))
-               Y-axis-label-spacing)))
-@end group
-@group
-         (vertical-step (or vertical-step 1))
-         (full-Y-label-width
-          (length
-           (concat
-            (number-to-string
-             (* height-of-top-line vertical-step))
-            Y-axis-tic))))
-@end group
-@group
-    (print-Y-axis
-     height-of-top-line full-Y-label-width vertical-step)
-    (graph-body-print
-        numbers-list height-of-top-line symbol-width)
-    (print-X-axis numbers-list horizontal-step)))
-@end group
-@end smallexample
-@end ifnottex
-
-@c qqq
-@ignore
-Graphing Definitions Re-listed
-
-@need 1250
-Here are all the graphing definitions in their final form:
-
-@smallexample
-@group
-(defvar top-of-ranges
- '(10  20  30  40  50
-   60  70  80  90 100
-  110 120 130 140 150
-  160 170 180 190 200
-  210 220 230 240 250)
- "List specifying ranges for `defuns-per-range'.")
-@end group
-
-@group
-(defvar graph-symbol "*"
-  "String used as symbol in graph, usually an asterisk.")
-@end group
-
-@group
-(defvar graph-blank " "
-  "String used as blank in graph, usually a blank space.
-graph-blank must be the same number of columns wide
-as graph-symbol.")
-@end group
-
-@group
-(defvar Y-axis-tic " - "
-   "String that follows number in a Y axis label.")
-@end group
-
-@group
-(defvar Y-axis-label-spacing 5
-  "Number of lines from one Y axis label to next.")
-@end group
-
-@group
-(defvar X-axis-tic-symbol "|"
-  "String to insert to point to a column in X axis.")
-@end group
-
-@group
-(defvar X-axis-label-spacing
-  (if (boundp 'graph-blank)
-      (* 5 (length graph-blank)) 5)
-  "Number of units from one X axis label to next.")
-@end group
-@end smallexample
-
-@smallexample
-@group
-(defun count-words-in-defun ()
-  "Return the number of words and symbols in a defun."
-  (beginning-of-defun)
-  (let ((count 0)
-        (end (save-excursion (end-of-defun) (point))))
-@end group
-
-@group
-    (while
-        (and (< (point) end)
-             (re-search-forward
-              "\\(\\w\\|\\s_\\)+[^ \t\n]*[ \t\n]*"
-              end t))
-      (setq count (1+ count)))
-    count))
-@end group
-@end smallexample
-
-@smallexample
-@group
-(defun lengths-list-file (filename)
-  "Return list of definitions' lengths within FILE.
-The returned list is a list of numbers.
-Each number is the number of words or
-symbols in one function definition."
-@end group
-
-@group
-  (message "Working on `%s' ... " filename)
-  (save-excursion
-    (let ((buffer (find-file-noselect filename))
-          (lengths-list))
-      (set-buffer buffer)
-      (setq buffer-read-only t)
-      (widen)
-      (goto-char (point-min))
-@end group
-
-@group
-      (while (re-search-forward "^(defun" nil t)
-        (setq lengths-list
-              (cons (count-words-in-defun) lengths-list)))
-      (kill-buffer buffer)
-      lengths-list)))
-@end group
-@end smallexample
-
-@smallexample
-@group
-(defun lengths-list-many-files (list-of-files)
-  "Return list of lengths of defuns in LIST-OF-FILES."
-  (let (lengths-list)
-;;; @r{true-or-false-test}
-    (while list-of-files
-      (setq lengths-list
-            (append
-             lengths-list
-@end group
-@group
-;;; @r{Generate a lengths' list.}
-             (lengths-list-file
-              (expand-file-name (car list-of-files)))))
-;;; @r{Make files' list shorter.}
-      (setq list-of-files (cdr list-of-files)))
-;;; @r{Return final value of lengths' list.}
-    lengths-list))
-@end group
-@end smallexample
-
-@smallexample
-@group
-(defun defuns-per-range (sorted-lengths top-of-ranges)
-  "SORTED-LENGTHS defuns in each TOP-OF-RANGES range."
-  (let ((top-of-range (car top-of-ranges))
-        (number-within-range 0)
-        defuns-per-range-list)
-@end group
-
-@group
-    ;; @r{Outer loop.}
-    (while top-of-ranges
-
-      ;; @r{Inner loop.}
-      (while (and
-              ;; @r{Need number for numeric test.}
-              (car sorted-lengths)
-              (< (car sorted-lengths) top-of-range))
-
-        ;; @r{Count number of definitions within current range.}
-        (setq number-within-range (1+ number-within-range))
-        (setq sorted-lengths (cdr sorted-lengths)))
-@end group
-
-@group
-      ;; @r{Exit inner loop but remain within outer loop.}
-
-      (setq defuns-per-range-list
-            (cons number-within-range defuns-per-range-list))
-      (setq number-within-range 0)      ; @r{Reset count to zero.}
-
-      ;; @r{Move to next range.}
-      (setq top-of-ranges (cdr top-of-ranges))
-      ;; @r{Specify next top of range value.}
-      (setq top-of-range (car top-of-ranges)))
-@end group
-
-@group
-    ;; @r{Exit outer loop and count the number of defuns larger than}
-    ;; @r{  the largest top-of-range value.}
-    (setq defuns-per-range-list
-          (cons
-           (length sorted-lengths)
-           defuns-per-range-list))
-
-    ;; @r{Return a list of the number of definitions within each range,}
-    ;; @r{  smallest to largest.}
-    (nreverse defuns-per-range-list)))
-@end group
-@end smallexample
-
-@smallexample
-@group
-(defun column-of-graph (max-graph-height actual-height)
-  "Return list of MAX-GRAPH-HEIGHT strings;
-ACTUAL-HEIGHT are graph-symbols.
-The graph-symbols are contiguous entries at the end
-of the list.
-The list will be inserted as one column of a graph.
-The strings are either graph-blank or graph-symbol."
-@end group
-
-@group
-  (let ((insert-list nil)
-        (number-of-top-blanks
-         (- max-graph-height actual-height)))
-
-    ;; @r{Fill in @code{graph-symbols}.}
-    (while (> actual-height 0)
-      (setq insert-list (cons graph-symbol insert-list))
-      (setq actual-height (1- actual-height)))
-@end group
-
-@group
-    ;; @r{Fill in @code{graph-blanks}.}
-    (while (> number-of-top-blanks 0)
-      (setq insert-list (cons graph-blank insert-list))
-      (setq number-of-top-blanks
-            (1- number-of-top-blanks)))
-
-    ;; @r{Return whole list.}
-    insert-list))
-@end group
-@end smallexample
-
-@smallexample
-@group
-(defun Y-axis-element (number full-Y-label-width)
-  "Construct a NUMBERed label element.
-A numbered element looks like this `  5 - ',
-and is padded as needed so all line up with
-the element for the largest number."
-@end group
-@group
-  (let* ((leading-spaces
-         (- full-Y-label-width
-            (length
-             (concat (number-to-string number)
-                     Y-axis-tic)))))
-@end group
-@group
-    (concat
-     (make-string leading-spaces ? )
-     (number-to-string number)
-     Y-axis-tic)))
-@end group
-@end smallexample
-
-@smallexample
-@group
-(defun print-Y-axis
-  (height full-Y-label-width &optional vertical-step)
-  "Insert Y axis by HEIGHT and FULL-Y-LABEL-WIDTH.
-Height must be the  maximum height of the graph.
-Full width is the width of the highest label element.
-Optionally, print according to VERTICAL-STEP."
-@end group
-@group
-;; Value of height and full-Y-label-width
-;; are passed by `print-graph'.
-  (let ((start (point)))
-    (insert-rectangle
-     (Y-axis-column height full-Y-label-width vertical-step))
-@end group
-@group
-    ;; @r{Place point ready for inserting graph.}
-    (goto-char start)
-    ;; @r{Move point forward by value of} full-Y-label-width
-    (forward-char full-Y-label-width)))
-@end group
-@end smallexample
-
-@smallexample
-@group
-(defun print-X-axis-tic-line
-  (number-of-X-tics X-axis-leading-spaces X-axis-tic-element)
-  "Print ticks for X axis."
-    (insert X-axis-leading-spaces)
-    (insert X-axis-tic-symbol)  ; @r{Under first column.}
-@end group
-@group
-    ;; @r{Insert second tic in the right spot.}
-    (insert (concat
-             (make-string
-              (-  (* symbol-width X-axis-label-spacing)
-                  ;; @r{Insert white space up to second tic symbol.}
-                  (* 2 (length X-axis-tic-symbol)))
-              ? )
-             X-axis-tic-symbol))
-@end group
-@group
-    ;; @r{Insert remaining ticks.}
-    (while (> number-of-X-tics 1)
-      (insert X-axis-tic-element)
-      (setq number-of-X-tics (1- number-of-X-tics))))
-@end group
-@end smallexample
-
-@smallexample
-@group
-(defun X-axis-element (number)
-  "Construct a numbered X axis element."
-  (let ((leading-spaces
-         (-  (* symbol-width X-axis-label-spacing)
-             (length (number-to-string number)))))
-    (concat (make-string leading-spaces ? )
-            (number-to-string number))))
-@end group
-@end smallexample
-
-@smallexample
-@group
-(defun graph-body-print (numbers-list height symbol-width)
-  "Print a bar graph of the NUMBERS-LIST.
-The numbers-list consists of the Y-axis values.
-HEIGHT is maximum height of graph.
-SYMBOL-WIDTH is number of each column."
-@end group
-@group
-  (let (from-position)
-    (while numbers-list
-      (setq from-position (point))
-      (insert-rectangle
-       (column-of-graph height (car numbers-list)))
-      (goto-char from-position)
-      (forward-char symbol-width)
-@end group
-@group
-      ;; @r{Draw graph column by column.}
-      (sit-for 0)
-      (setq numbers-list (cdr numbers-list)))
-    ;; @r{Place point for X axis labels.}
-    (forward-line height)
-    (insert "\n")))
-@end group
-@end smallexample
-
-@smallexample
-@group
-(defun Y-axis-column
-  (height width-of-label &optional vertical-step)
-  "Construct list of labels for Y axis.
-HEIGHT is maximum height of graph.
-WIDTH-OF-LABEL is maximum width of label.
-@end group
-@group
-VERTICAL-STEP, an option, is a positive integer
-that specifies how much a Y axis label increments
-for each line.  For example, a step of 5 means
-that each line is five units of the graph."
-  (let (Y-axis
-        (number-per-line (or vertical-step 1)))
-@end group
-@group
-    (while (> height 1)
-      (if (zerop (% height Y-axis-label-spacing))
-          ;; @r{Insert label.}
-          (setq Y-axis
-                (cons
-                 (Y-axis-element
-                  (* height number-per-line)
-                  width-of-label)
-                 Y-axis))
-@end group
-@group
-        ;; @r{Else, insert blanks.}
-        (setq Y-axis
-              (cons
-               (make-string width-of-label ? )
-               Y-axis)))
-      (setq height (1- height)))
-@end group
-@group
-    ;; @r{Insert base line.}
-    (setq Y-axis (cons (Y-axis-element
-                        (or vertical-step 1)
-                        width-of-label)
-                       Y-axis))
-    (nreverse Y-axis)))
-@end group
-@end smallexample
-
-@smallexample
-@group
-(defun print-X-axis-numbered-line
-  (number-of-X-tics X-axis-leading-spaces
-   &optional horizontal-step)
-  "Print line of X-axis numbers"
-  (let ((number X-axis-label-spacing)
-        (horizontal-step (or horizontal-step 1)))
-@end group
-@group
-    (insert X-axis-leading-spaces)
-    ;; line up number
-    (delete-char (- (1- (length (number-to-string horizontal-step)))))
-    (insert (concat
-             (make-string
-              ;; @r{Insert white space up to next number.}
-              (-  (* symbol-width X-axis-label-spacing)
-                  (1- (length (number-to-string horizontal-step)))
-                  2)
-              ? )
-             (number-to-string (* number horizontal-step))))
-@end group
-@group
-    ;; @r{Insert remaining numbers.}
-    (setq number (+ number X-axis-label-spacing))
-    (while (> number-of-X-tics 1)
-      (insert (X-axis-element (* number horizontal-step)))
-      (setq number (+ number X-axis-label-spacing))
-      (setq number-of-X-tics (1- number-of-X-tics)))))
-@end group
-@end smallexample
-
-@smallexample
-@group
-(defun print-X-axis (numbers-list horizontal-step)
-  "Print X axis labels to length of NUMBERS-LIST.
-Optionally, HORIZONTAL-STEP, a positive integer,
-specifies how much an X  axis label increments for
-each column."
-@end group
-@group
-;; Value of symbol-width and full-Y-label-width
-;; are passed by `print-graph'.
-  (let* ((leading-spaces
-          (make-string full-Y-label-width ? ))
-       ;; symbol-width @r{is provided by} graph-body-print
-       (tic-width (* symbol-width X-axis-label-spacing))
-       (X-length (length numbers-list))
-@end group
-@group
-       (X-tic
-        (concat
-         (make-string
-          ;; @r{Make a string of blanks.}
-          (-  (* symbol-width X-axis-label-spacing)
-              (length X-axis-tic-symbol))
-          ? )
-@end group
-@group
-         ;; @r{Concatenate blanks with tic symbol.}
-         X-axis-tic-symbol))
-       (tic-number
-        (if (zerop (% X-length tic-width))
-            (/ X-length tic-width)
-          (1+ (/ X-length tic-width)))))
-@end group
-
-@group
-    (print-X-axis-tic-line
-     tic-number leading-spaces X-tic)
-    (insert "\n")
-    (print-X-axis-numbered-line
-     tic-number leading-spaces horizontal-step)))
-@end group
-@end smallexample
-
-@smallexample
-@group
-(defun one-fiftieth (full-range)
-  "Return list, each number of which is 1/50th previous."
- (mapcar '(lambda (arg) (/ arg 50)) full-range))
-@end group
-@end smallexample
-
-@smallexample
-@group
-(defun print-graph
-  (numbers-list &optional vertical-step horizontal-step)
-  "Print labelled bar graph of the NUMBERS-LIST.
-The numbers-list consists of the Y-axis values.
-@end group
-
-@group
-Optionally, VERTICAL-STEP, a positive integer,
-specifies how much a Y axis label increments for
-each line.  For example, a step of 5 means that
-each row is five units.
-@end group
-
-@group
-Optionally, HORIZONTAL-STEP, a positive integer,
-specifies how much an X  axis label increments for
-each column."
-  (let* ((symbol-width (length graph-blank))
-         ;; @code{height} @r{is both the largest number}
-         ;; @r{and the number with the most digits.}
-         (height (apply 'max numbers-list))
-@end group
-@group
-         (height-of-top-line
-          (if (zerop (% height Y-axis-label-spacing))
-              height
-            ;; @r{else}
-            (* (1+ (/ height Y-axis-label-spacing))
-               Y-axis-label-spacing)))
-@end group
-@group
-         (vertical-step (or vertical-step 1))
-         (full-Y-label-width
-          (length
-           (concat
-            (number-to-string
-             (* height-of-top-line vertical-step))
-            Y-axis-tic))))
-@end group
-@group
-
-    (print-Y-axis
-     height-of-top-line full-Y-label-width vertical-step)
-    (graph-body-print
-        numbers-list height-of-top-line symbol-width)
-    (print-X-axis numbers-list horizontal-step)))
-@end group
-@end smallexample
-@c qqq
-@end ignore
-
-@page
-@node Final printed graph,  , Another Bug, Print Whole Graph
-@appendixsubsec The Printed Graph
-
-When made and installed, you can call the @code{print-graph} command
-like this:
-@sp 1
-
-@smallexample
-@group
-(print-graph fiftieth-list-for-graph 50 10)
-@end group
-@end smallexample
-@sp 1
-
-@noindent
-Here is the graph:
-@sp 2
-
-@smallexample
-@group
-1000 -  *
-        **
-        **
-        **
-        **
- 750 -  ***
-        ***
-        ***
-        ***
-        ****
- 500 - *****
-       ******
-       ******
-       ******
-       *******
- 250 - ********
-       *********                     *
-       ***********                   *
-       *************                 *
-  50 - ***************** *           *
-       |   |    |    |    |    |    |    |
-      10  50  100  150  200  250  300  350
-@end group
-@end smallexample
-
-@sp 2
-
-@noindent
-The largest group of functions contain 10 -- 19 words and symbols each.
-
-@node Free Software and Free Manuals, GNU Free Documentation License, Full Graph, Top
-@appendix Free Software and Free Manuals
-
-@strong{by Richard M. Stallman}
-@sp 1
-
-The biggest deficiency in free operating systems is not in the
-software---it is the lack of good free manuals that we can include in
-these systems.  Many of our most important programs do not come with
-full manuals.  Documentation is an essential part of any software
-package; when an important free software package does not come with a
-free manual, that is a major gap.  We have many such gaps today.
-
-Once upon a time, many years ago, I thought I would learn Perl.  I got
-a copy of a free manual, but I found it hard to read.  When I asked
-Perl users about alternatives, they told me that there were better
-introductory manuals---but those were not free.
-
-Why was this?  The authors of the good manuals had written them for
-O'Reilly Associates, which published them with restrictive terms---no
-copying, no modification, source files not available---which exclude
-them from the free software community.
-
-That wasn't the first time this sort of thing has happened, and (to
-our community's great loss) it was far from the last.  Proprietary
-manual publishers have enticed a great many authors to restrict their
-manuals since then.  Many times I have heard a GNU user eagerly tell me
-about a manual that he is writing, with which he expects to help the
-GNU project---and then had my hopes dashed, as he proceeded to explain
-that he had signed a contract with a publisher that would restrict it
-so that we cannot use it.
-
-Given that writing good English is a rare skill among programmers, we
-can ill afford to lose manuals this way.
-
-@c (texinfo)uref
-(The Free Software Foundation
-@uref{http://www.gnu.org/doc/doc.html#DescriptionsOfGNUDocumentation, ,
-sells printed copies} of free @uref{http://www.gnu.org/doc/doc.html,
-GNU manuals}, too.)
-
-Free documentation, like free software, is a matter of freedom, not
-price.  The problem with these manuals was not that O'Reilly Associates
-charged a price for printed copies---that in itself is fine.  (The Free
-Software Foundation sells printed copies of free GNU manuals, too.)
-But GNU manuals are available in source code form, while these manuals
-are available only on paper.  GNU manuals come with permission to copy
-and modify; the Perl manuals do not.  These restrictions are the
-problems.
-
-The criterion for a free manual is pretty much the same as for free
-software: it is a matter of giving all users certain
-freedoms.  Redistribution (including commercial redistribution) must be
-permitted, so that the manual can accompany every copy of the program,
-on-line or on paper.  Permission for modification is crucial too.
-
-As a general rule, I don't believe that it is essential for people to
-have permission to modify all sorts of articles and books.  The issues
-for writings are not necessarily the same as those for software.  For
-example, I don't think you or I are obliged to give permission to
-modify articles like this one, which describe our actions and our
-views.
-
-But there is a particular reason why the freedom to modify is crucial
-for documentation for free software.  When people exercise their right
-to modify the software, and add or change its features, if they are
-conscientious they will change the manual too---so they can provide
-accurate and usable documentation with the modified program.  A manual
-which forbids programmers to be conscientious and finish the job, or
-more precisely requires them to write a new manual from scratch if
-they change the program, does not fill our community's needs.
-
-While a blanket prohibition on modification is unacceptable, some
-kinds of limits on the method of modification pose no problem.  For
-example, requirements to preserve the original author's copyright
-notice, the distribution terms, or the list of authors, are ok.  It is
-also no problem to require modified versions to include notice that
-they were modified, even to have entire sections that may not be
-deleted or changed, as long as these sections deal with nontechnical
-topics.  (Some GNU manuals have them.)
-
-These kinds of restrictions are not a problem because, as a practical
-matter, they don't stop the conscientious programmer from adapting the
-manual to fit the modified program.  In other words, they don't block
-the free software community from making full use of the manual.
-
-However, it must be possible to modify all the technical content of
-the manual, and then distribute the result in all the usual media,
-through all the usual channels; otherwise, the restrictions do block
-the community, the manual is not free, and so we need another manual.
-
-Unfortunately, it is often hard to find someone to write another
-manual when a proprietary manual exists.  The obstacle is that many
-users think that a proprietary manual is good enough---so they don't
-see the need to write a free manual.  They do not see that the free
-operating system has a gap that needs filling.
-
-Why do users think that proprietary manuals are good enough? Some have
-not considered the issue.  I hope this article will do something to
-change that.
-
-Other users consider proprietary manuals acceptable for the same
-reason so many people consider proprietary software acceptable: they
-judge in purely practical terms, not using freedom as a
-criterion.  These people are entitled to their opinions, but since
-those opinions spring from values which do not include freedom, they
-are no guide for those of us who do value freedom.
-
-Please spread the word about this issue.  We continue to lose manuals
-to proprietary publishing.  If we spread the word that proprietary
-manuals are not sufficient, perhaps the next person who wants to help
-GNU by writing documentation will realize, before it is too late, that
-he must above all make it free.
-
-We can also encourage commercial publishers to sell free, copylefted
-manuals instead of proprietary ones.  One way you can help this is to
-check the distribution terms of a manual before you buy it, and prefer
-copylefted manuals to non-copylefted ones.
-
-@sp 2
-@noindent
-Note: The Free Software Foundation maintains a page on its Web site
-that lists free books available from other publishers:@*
-@uref{http://www.gnu.org/doc/other-free-books.html}
-
-@node GNU Free Documentation License, Index, Free Software and Free Manuals, Top
-@appendix GNU Free Documentation License
-
-@cindex FDL, GNU Free Documentation License
-@center Version 1.2, November 2002
-
-@display
-Copyright @copyright{} 2000,2001,2002 Free Software Foundation, Inc.
-51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
-
-Everyone is permitted to copy and distribute verbatim copies
-of this license document, but changing it is not allowed.
-@end display
-
-@enumerate 0
-@item
-PREAMBLE
-
-The purpose of this License is to make a manual, textbook, or other
-functional and useful document @dfn{free} in the sense of freedom: to
-assure everyone the effective freedom to copy and redistribute it,
-with or without modifying it, either commercially or noncommercially.
-Secondarily, this License preserves for the author and publisher a way
-to get credit for their work, while not being considered responsible
-for modifications made by others.
-
-This License is a kind of ``copyleft'', which means that derivative
-works of the document must themselves be free in the same sense.  It
-complements the GNU General Public License, which is a copyleft
-license designed for free software.
-
-We have designed this License in order to use it for manuals for free
-software, because free software needs free documentation: a free
-program should come with manuals providing the same freedoms that the
-software does.  But this License is not limited to software manuals;
-it can be used for any textual work, regardless of subject matter or
-whether it is published as a printed book.  We recommend this License
-principally for works whose purpose is instruction or reference.
-
-@item
-APPLICABILITY AND DEFINITIONS
-
-This License applies to any manual or other work, in any medium, that
-contains a notice placed by the copyright holder saying it can be
-distributed under the terms of this License.  Such a notice grants a
-world-wide, royalty-free license, unlimited in duration, to use that
-work under the conditions stated herein.  The ``Document'', below,
-refers to any such manual or work.  Any member of the public is a
-licensee, and is addressed as ``you''.  You accept the license if you
-copy, modify or distribute the work in a way requiring permission
-under copyright law.
-
-A ``Modified Version'' of the Document means any work containing the
-Document or a portion of it, either copied verbatim, or with
-modifications and/or translated into another language.
-
-A ``Secondary Section'' is a named appendix or a front-matter section
-of the Document that deals exclusively with the relationship of the
-publishers or authors of the Document to the Document's overall
-subject (or to related matters) and contains nothing that could fall
-directly within that overall subject.  (Thus, if the Document is in
-part a textbook of mathematics, a Secondary Section may not explain
-any mathematics.)  The relationship could be a matter of historical
-connection with the subject or with related matters, or of legal,
-commercial, philosophical, ethical or political position regarding
-them.
-
-The ``Invariant Sections'' are certain Secondary Sections whose titles
-are designated, as being those of Invariant Sections, in the notice
-that says that the Document is released under this License.  If a
-section does not fit the above definition of Secondary then it is not
-allowed to be designated as Invariant.  The Document may contain zero
-Invariant Sections.  If the Document does not identify any Invariant
-Sections then there are none.
-
-The ``Cover Texts'' are certain short passages of text that are listed,
-as Front-Cover Texts or Back-Cover Texts, in the notice that says that
-the Document is released under this License.  A Front-Cover Text may
-be at most 5 words, and a Back-Cover Text may be at most 25 words.
-
-A ``Transparent'' copy of the Document means a machine-readable copy,
-represented in a format whose specification is available to the
-general public, that is suitable for revising the document
-straightforwardly with generic text editors or (for images composed of
-pixels) generic paint programs or (for drawings) some widely available
-drawing editor, and that is suitable for input to text formatters or
-for automatic translation to a variety of formats suitable for input
-to text formatters.  A copy made in an otherwise Transparent file
-format whose markup, or absence of markup, has been arranged to thwart
-or discourage subsequent modification by readers is not Transparent.
-An image format is not Transparent if used for any substantial amount
-of text.  A copy that is not ``Transparent'' is called ``Opaque''.
-
-Examples of suitable formats for Transparent copies include plain
-@sc{ascii} without markup, Texinfo input format, La@TeX{} input
-format, @acronym{SGML} or @acronym{XML} using a publicly available
-@acronym{DTD}, and standard-conforming simple @acronym{HTML},
-PostScript or @acronym{PDF} designed for human modification.  Examples
-of transparent image formats include @acronym{PNG}, @acronym{XCF} and
-@acronym{JPG}.  Opaque formats include proprietary formats that can be
-read and edited only by proprietary word processors, @acronym{SGML} or
-@acronym{XML} for which the @acronym{DTD} and/or processing tools are
-not generally available, and the machine-generated @acronym{HTML},
-PostScript or @acronym{PDF} produced by some word processors for
-output purposes only.
-
-The ``Title Page'' means, for a printed book, the title page itself,
-plus such following pages as are needed to hold, legibly, the material
-this License requires to appear in the title page.  For works in
-formats which do not have any title page as such, ``Title Page'' means
-the text near the most prominent appearance of the work's title,
-preceding the beginning of the body of the text.
-
-A section ``Entitled XYZ'' means a named subunit of the Document whose
-title either is precisely XYZ or contains XYZ in parentheses following
-text that translates XYZ in another language.  (Here XYZ stands for a
-specific section name mentioned below, such as ``Acknowledgements'',
-``Dedications'', ``Endorsements'', or ``History''.)  To ``Preserve the Title''
-of such a section when you modify the Document means that it remains a
-section ``Entitled XYZ'' according to this definition.
-
-The Document may include Warranty Disclaimers next to the notice which
-states that this License applies to the Document.  These Warranty
-Disclaimers are considered to be included by reference in this
-License, but only as regards disclaiming warranties: any other
-implication that these Warranty Disclaimers may have is void and has
-no effect on the meaning of this License.
-
-@item
-VERBATIM COPYING
-
-You may copy and distribute the Document in any medium, either
-commercially or noncommercially, provided that this License, the
-copyright notices, and the license notice saying this License applies
-to the Document are reproduced in all copies, and that you add no other
-conditions whatsoever to those of this License.  You may not use
-technical measures to obstruct or control the reading or further
-copying of the copies you make or distribute.  However, you may accept
-compensation in exchange for copies.  If you distribute a large enough
-number of copies you must also follow the conditions in section 3.
-
-You may also lend copies, under the same conditions stated above, and
-you may publicly display copies.
-
-@item
-COPYING IN QUANTITY
-
-If you publish printed copies (or copies in media that commonly have
-printed covers) of the Document, numbering more than 100, and the
-Document's license notice requires Cover Texts, you must enclose the
-copies in covers that carry, clearly and legibly, all these Cover
-Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
-the back cover.  Both covers must also clearly and legibly identify
-you as the publisher of these copies.  The front cover must present
-the full title with all words of the title equally prominent and
-visible.  You may add other material on the covers in addition.
-Copying with changes limited to the covers, as long as they preserve
-the title of the Document and satisfy these conditions, can be treated
-as verbatim copying in other respects.
-
-If the required texts for either cover are too voluminous to fit
-legibly, you should put the first ones listed (as many as fit
-reasonably) on the actual cover, and continue the rest onto adjacent
-pages.
-
-If you publish or distribute Opaque copies of the Document numbering
-more than 100, you must either include a machine-readable Transparent
-copy along with each Opaque copy, or state in or with each Opaque copy
-a computer-network location from which the general network-using
-public has access to download using public-standard network protocols
-a complete Transparent copy of the Document, free of added material.
-If you use the latter option, you must take reasonably prudent steps,
-when you begin distribution of Opaque copies in quantity, to ensure
-that this Transparent copy will remain thus accessible at the stated
-location until at least one year after the last time you distribute an
-Opaque copy (directly or through your agents or retailers) of that
-edition to the public.
-
-It is requested, but not required, that you contact the authors of the
-Document well before redistributing any large number of copies, to give
-them a chance to provide you with an updated version of the Document.
-
-@item
-MODIFICATIONS
-
-You may copy and distribute a Modified Version of the Document under
-the conditions of sections 2 and 3 above, provided that you release
-the Modified Version under precisely this License, with the Modified
-Version filling the role of the Document, thus licensing distribution
-and modification of the Modified Version to whoever possesses a copy
-of it.  In addition, you must do these things in the Modified Version:
-
-@enumerate A
-@item
-Use in the Title Page (and on the covers, if any) a title distinct
-from that of the Document, and from those of previous versions
-(which should, if there were any, be listed in the History section
-of the Document).  You may use the same title as a previous version
-if the original publisher of that version gives permission.
-
-@item
-List on the Title Page, as authors, one or more persons or entities
-responsible for authorship of the modifications in the Modified
-Version, together with at least five of the principal authors of the
-Document (all of its principal authors, if it has fewer than five),
-unless they release you from this requirement.
-
-@item
-State on the Title page the name of the publisher of the
-Modified Version, as the publisher.
-
-@item
-Preserve all the copyright notices of the Document.
-
-@item
-Add an appropriate copyright notice for your modifications
-adjacent to the other copyright notices.
-
-@item
-Include, immediately after the copyright notices, a license notice
-giving the public permission to use the Modified Version under the
-terms of this License, in the form shown in the Addendum below.
-
-@item
-Preserve in that license notice the full lists of Invariant Sections
-and required Cover Texts given in the Document's license notice.
-
-@item
-Include an unaltered copy of this License.
-
-@item
-Preserve the section Entitled ``History'', Preserve its Title, and add
-to it an item stating at least the title, year, new authors, and
-publisher of the Modified Version as given on the Title Page.  If
-there is no section Entitled ``History'' in the Document, create one
-stating the title, year, authors, and publisher of the Document as
-given on its Title Page, then add an item describing the Modified
-Version as stated in the previous sentence.
-
-@item
-Preserve the network location, if any, given in the Document for
-public access to a Transparent copy of the Document, and likewise
-the network locations given in the Document for previous versions
-it was based on.  These may be placed in the ``History'' section.
-You may omit a network location for a work that was published at
-least four years before the Document itself, or if the original
-publisher of the version it refers to gives permission.
-
-@item
-For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve
-the Title of the section, and preserve in the section all the
-substance and tone of each of the contributor acknowledgements and/or
-dedications given therein.
-
-@item
-Preserve all the Invariant Sections of the Document,
-unaltered in their text and in their titles.  Section numbers
-or the equivalent are not considered part of the section titles.
-
-@item
-Delete any section Entitled ``Endorsements''.  Such a section
-may not be included in the Modified Version.
-
-@item
-Do not retitle any existing section to be Entitled ``Endorsements'' or
-to conflict in title with any Invariant Section.
-
-@item
-Preserve any Warranty Disclaimers.
-@end enumerate
-
-If the Modified Version includes new front-matter sections or
-appendices that qualify as Secondary Sections and contain no material
-copied from the Document, you may at your option designate some or all
-of these sections as invariant.  To do this, add their titles to the
-list of Invariant Sections in the Modified Version's license notice.
-These titles must be distinct from any other section titles.
-
-You may add a section Entitled ``Endorsements'', provided it contains
-nothing but endorsements of your Modified Version by various
-parties---for example, statements of peer review or that the text has
-been approved by an organization as the authoritative definition of a
-standard.
-
-You may add a passage of up to five words as a Front-Cover Text, and a
-passage of up to 25 words as a Back-Cover Text, to the end of the list
-of Cover Texts in the Modified Version.  Only one passage of
-Front-Cover Text and one of Back-Cover Text may be added by (or
-through arrangements made by) any one entity.  If the Document already
-includes a cover text for the same cover, previously added by you or
-by arrangement made by the same entity you are acting on behalf of,
-you may not add another; but you may replace the old one, on explicit
-permission from the previous publisher that added the old one.
-
-The author(s) and publisher(s) of the Document do not by this License
-give permission to use their names for publicity for or to assert or
-imply endorsement of any Modified Version.
-
-@item
-COMBINING DOCUMENTS
-
-You may combine the Document with other documents released under this
-License, under the terms defined in section 4 above for modified
-versions, provided that you include in the combination all of the
-Invariant Sections of all of the original documents, unmodified, and
-list them all as Invariant Sections of your combined work in its
-license notice, and that you preserve all their Warranty Disclaimers.
-
-The combined work need only contain one copy of this License, and
-multiple identical Invariant Sections may be replaced with a single
-copy.  If there are multiple Invariant Sections with the same name but
-different contents, make the title of each such section unique by
-adding at the end of it, in parentheses, the name of the original
-author or publisher of that section if known, or else a unique number.
-Make the same adjustment to the section titles in the list of
-Invariant Sections in the license notice of the combined work.
-
-In the combination, you must combine any sections Entitled ``History''
-in the various original documents, forming one section Entitled
-``History''; likewise combine any sections Entitled ``Acknowledgements'',
-and any sections Entitled ``Dedications''.  You must delete all
-sections Entitled ``Endorsements.''
-
-@item
-COLLECTIONS OF DOCUMENTS
-
-You may make a collection consisting of the Document and other documents
-released under this License, and replace the individual copies of this
-License in the various documents with a single copy that is included in
-the collection, provided that you follow the rules of this License for
-verbatim copying of each of the documents in all other respects.
-
-You may extract a single document from such a collection, and distribute
-it individually under this License, provided you insert a copy of this
-License into the extracted document, and follow this License in all
-other respects regarding verbatim copying of that document.
-
-@item
-AGGREGATION WITH INDEPENDENT WORKS
-
-A compilation of the Document or its derivatives with other separate
-and independent documents or works, in or on a volume of a storage or
-distribution medium, is called an ``aggregate'' if the copyright
-resulting from the compilation is not used to limit the legal rights
-of the compilation's users beyond what the individual works permit.
-When the Document is included in an aggregate, this License does not
-apply to the other works in the aggregate which are not themselves
-derivative works of the Document.
-
-If the Cover Text requirement of section 3 is applicable to these
-copies of the Document, then if the Document is less than one half of
-the entire aggregate, the Document's Cover Texts may be placed on
-covers that bracket the Document within the aggregate, or the
-electronic equivalent of covers if the Document is in electronic form.
-Otherwise they must appear on printed covers that bracket the whole
-aggregate.
-
-@item
-TRANSLATION
-
-Translation is considered a kind of modification, so you may
-distribute translations of the Document under the terms of section 4.
-Replacing Invariant Sections with translations requires special
-permission from their copyright holders, but you may include
-translations of some or all Invariant Sections in addition to the
-original versions of these Invariant Sections.  You may include a
-translation of this License, and all the license notices in the
-Document, and any Warranty Disclaimers, provided that you also include
-the original English version of this License and the original versions
-of those notices and disclaimers.  In case of a disagreement between
-the translation and the original version of this License or a notice
-or disclaimer, the original version will prevail.
-
-If a section in the Document is Entitled ``Acknowledgements'',
-``Dedications'', or ``History'', the requirement (section 4) to Preserve
-its Title (section 1) will typically require changing the actual
-title.
-
-@item
-TERMINATION
-
-You may not copy, modify, sublicense, or distribute the Document except
-as expressly provided for under this License.  Any other attempt to
-copy, modify, sublicense or distribute the Document is void, and will
-automatically terminate your rights under this License.  However,
-parties who have received copies, or rights, from you under this
-License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-@item
-FUTURE REVISIONS OF THIS LICENSE
-
-The Free Software Foundation may publish new, revised versions
-of the GNU Free Documentation License from time to time.  Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns.  See
-@uref{http://www.gnu.org/copyleft/}.
-
-Each version of the License is given a distinguishing version number.
-If the Document specifies that a particular numbered version of this
-License ``or any later version'' applies to it, you have the option of
-following the terms and conditions either of that specified version or
-of any later version that has been published (not as a draft) by the
-Free Software Foundation.  If the Document does not specify a version
-number of this License, you may choose any version ever published (not
-as a draft) by the Free Software Foundation.
-@end enumerate
-
-@page
-@appendixsubsec ADDENDUM: How to use this License for your documents
-
-To use this License in a document you have written, include a copy of
-the License in the document and put the following copyright and
-license notices just after the title page:
-
-@smallexample
-@group
-Copyright (C)  @var{year}  @var{your name}.
-Permission is granted to copy, distribute and/or modify this document
-under the terms of the GNU Free Documentation License, Version 1.2
-or any later version published by the Free Software Foundation;
-with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
-A copy of the license is included in the section entitled ``GNU
-Free Documentation License''.
-@end group
-@end smallexample
-
-If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
-replace the ``with...Texts.'' line with this:
-
-@smallexample
-@group
-with the Invariant Sections being @var{list their titles}, with
-the Front-Cover Texts being @var{list}, and with the Back-Cover Texts
-being @var{list}.
-@end group
-@end smallexample
-
-If you have Invariant Sections without Cover Texts, or some other
-combination of the three, merge those two alternatives to suit the
-situation.
-
-If your document contains nontrivial examples of program code, we
-recommend releasing these examples in parallel under your choice of
-free software license, such as the GNU General Public License,
-to permit their use in free software.
-
-@node Index, About the Author, GNU Free Documentation License, Top
-@comment  node-name,  next,  previous,  up
-@unnumbered Index
-
-@ignore
-MENU ENTRY: NODE NAME.
-@end ignore
-
-@printindex cp
-
-@iftex
-@c Place biographical information on right-hand (verso) page
-
-@tex
-\ifodd\pageno
-    \par\vfill\supereject
-    \global\evenheadline={\hfil} \global\evenfootline={\hfil}
-    \global\oddheadline={\hfil} \global\oddfootline={\hfil}
-    \page\hbox{}\page
-\else
-    \par\vfill\supereject
-    \par\vfill\supereject
-    \global\evenheadline={\hfil} \global\evenfootline={\hfil}
-    \global\oddheadline={\hfil} \global\oddfootline={\hfil}
-    \page\hbox{}\page
-    \page\hbox{}\page
-\fi
-@end tex
-
-@page
-@w{ }
-
-@c ================ Biographical information ================
-
-@w{ }
-@sp 8
-@center About the Author
-@sp 1
-@end iftex
-
-@ifnottex
-@node About the Author,  , Index, Top
-@unnumbered About the Author
-@end ifnottex
-
-@quotation
-Robert J. Chassell has worked with GNU Emacs since 1985.  He writes
-and edits, teaches Emacs and Emacs Lisp, and speaks throughout the
-world on software freedom.  Chassell was a founding Director and
-Treasurer of the Free Software Foundation, Inc.  He is co-author of
-the @cite{Texinfo} manual, and has edited more than a dozen other
-books.  He graduated from Cambridge University, in England.  He has an
-abiding interest in social and economic history and flies his own
-airplane.
-@end quotation
-
-@page
-@w{ }
-
-@c Prevent page number on blank verso, so eject it first.
-@tex
-\par\vfill\supereject
-@end tex
-
-@iftex
-@headings off
-@evenheading @thispage @| @| @thistitle
-@oddheading            @| @| @thispage
-@end iftex
-
-@bye
-
-@ignore
-   arch-tag: da1a2154-531f-43a8-8e33-fc7faad10acf
-@end ignore
diff --git a/lispintro/install-sh b/lispintro/install-sh
deleted file mode 100644 (file)
index 2df3e3b..0000000
+++ /dev/null
@@ -1,250 +0,0 @@
-#!/bin/sh
-#
-# install - install a program, script, or datafile
-# This comes from X11R5 (mit/util/scripts/install.sh).
-#
-# Copyright 1991 by the Massachusetts Institute of Technology
-#
-# Permission to use, copy, modify, distribute, and sell this software and its
-# documentation for any purpose is hereby granted without fee, provided that
-# the above copyright notice appear in all copies and that both that
-# copyright notice and this permission notice appear in supporting
-# documentation, and that the name of M.I.T. not be used in advertising or
-# publicity pertaining to distribution of the software without specific,
-# written prior permission.  M.I.T. makes no representations about the
-# suitability of this software for any purpose.  It is provided "as is"
-# without express or implied warranty.
-#
-# Calling this script install-sh is preferred over install.sh, to prevent
-# `make' implicit rules from creating a file called install from it
-# when there is no Makefile.
-#
-# This script is compatible with the BSD install script, but was written
-# from scratch.  It can only install one file at a time, a restriction
-# shared with many OS's install programs.
-
-
-# set DOITPROG to echo to test this script
-
-# Don't use :- since 4.3BSD and earlier shells don't like it.
-doit="${DOITPROG-}"
-
-
-# put in absolute paths if you don't have them in your path; or use env. vars.
-
-mvprog="${MVPROG-mv}"
-cpprog="${CPPROG-cp}"
-chmodprog="${CHMODPROG-chmod}"
-chownprog="${CHOWNPROG-chown}"
-chgrpprog="${CHGRPPROG-chgrp}"
-stripprog="${STRIPPROG-strip}"
-rmprog="${RMPROG-rm}"
-mkdirprog="${MKDIRPROG-mkdir}"
-
-transformbasename=""
-transform_arg=""
-instcmd="$mvprog"
-chmodcmd="$chmodprog 0755"
-chowncmd=""
-chgrpcmd=""
-stripcmd=""
-rmcmd="$rmprog -f"
-mvcmd="$mvprog"
-src=""
-dst=""
-dir_arg=""
-
-while [ x"$1" != x ]; do
-    case $1 in
-       -c) instcmd="$cpprog"
-           shift
-           continue;;
-
-       -d) dir_arg=true
-           shift
-           continue;;
-
-       -m) chmodcmd="$chmodprog $2"
-           shift
-           shift
-           continue;;
-
-       -o) chowncmd="$chownprog $2"
-           shift
-           shift
-           continue;;
-
-       -g) chgrpcmd="$chgrpprog $2"
-           shift
-           shift
-           continue;;
-
-       -s) stripcmd="$stripprog"
-           shift
-           continue;;
-
-       -t=*) transformarg=`echo $1 | sed 's/-t=//'`
-           shift
-           continue;;
-
-       -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
-           shift
-           continue;;
-
-       *)  if [ x"$src" = x ]
-           then
-               src=$1
-           else
-               # this colon is to work around a 386BSD /bin/sh bug
-               :
-               dst=$1
-           fi
-           shift
-           continue;;
-    esac
-done
-
-if [ x"$src" = x ]
-then
-       echo "install:  no input file specified"
-       exit 1
-else
-       true
-fi
-
-if [ x"$dir_arg" != x ]; then
-       dst=$src
-       src=""
-
-       if [ -d $dst ]; then
-               instcmd=:
-       else
-               instcmd=mkdir
-       fi
-else
-
-# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
-# might cause directories to be created, which would be especially bad
-# if $src (and thus $dsttmp) contains '*'.
-
-       if [ -f $src -o -d $src ]
-       then
-               true
-       else
-               echo "install:  $src does not exist"
-               exit 1
-       fi
-
-       if [ x"$dst" = x ]
-       then
-               echo "install:  no destination specified"
-               exit 1
-       else
-               true
-       fi
-
-# If destination is a directory, append the input filename; if your system
-# does not like double slashes in filenames, you may need to add some logic
-
-       if [ -d $dst ]
-       then
-               dst="$dst"/`basename $src`
-       else
-               true
-       fi
-fi
-
-## this sed command emulates the dirname command
-dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
-
-# Make sure that the destination directory exists.
-#  this part is taken from Noah Friedman's mkinstalldirs script
-
-# Skip lots of stat calls in the usual case.
-if [ ! -d "$dstdir" ]; then
-defaultIFS='
-'
-IFS="${IFS-${defaultIFS}}"
-
-oIFS="${IFS}"
-# Some sh's can't handle IFS=/ for some reason.
-IFS='%'
-set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
-IFS="${oIFS}"
-
-pathcomp=''
-
-while [ $# -ne 0 ] ; do
-       pathcomp="${pathcomp}${1}"
-       shift
-
-       if [ ! -d "${pathcomp}" ] ;
-        then
-               $mkdirprog "${pathcomp}"
-       else
-               true
-       fi
-
-       pathcomp="${pathcomp}/"
-done
-fi
-
-if [ x"$dir_arg" != x ]
-then
-       $doit $instcmd $dst &&
-
-       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
-       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
-       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
-       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
-else
-
-# If we're going to rename the final executable, determine the name now.
-
-       if [ x"$transformarg" = x ]
-       then
-               dstfile=`basename $dst`
-       else
-               dstfile=`basename $dst $transformbasename |
-                       sed $transformarg`$transformbasename
-       fi
-
-# don't allow the sed command to completely eliminate the filename
-
-       if [ x"$dstfile" = x ]
-       then
-               dstfile=`basename $dst`
-       else
-               true
-       fi
-
-# Make a temp file name in the proper directory.
-
-       dsttmp=$dstdir/#inst.$$#
-
-# Move or copy the file name to the temp name
-
-       $doit $instcmd $src $dsttmp &&
-
-       trap "rm -f ${dsttmp}" 0 &&
-
-# and set any options; do chmod last to preserve setuid bits
-
-# If any of these fail, we abort the whole thing.  If we want to
-# ignore errors from any of these, just make sure not to ignore
-# errors from the above "$doit $instcmd $src $dsttmp" command.
-
-       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
-       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
-       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
-       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
-
-# Now rename the file to the real destination.
-
-       $doit $rmcmd -f $dstdir/$dstfile &&
-       $doit $mvcmd $dsttmp $dstdir/$dstfile
-
-fi &&
-
-
-exit 0
diff --git a/lispintro/lambda-1.eps b/lispintro/lambda-1.eps
deleted file mode 100644 (file)
index 5b1b5d0..0000000
+++ /dev/null
@@ -1,471 +0,0 @@
-%!
-%%BoundingBox: 33 710 173 759
-%%Title: lambda-diagram1
-%%CreationDate: Wed Mar  8 14:31:53 1995
-%%Creator: Tgif-2.16-p4 by William Chia-Wei Cheng (william@cs.UCLA.edu)
-%
-%      Due to bugs in Transcript, the 'PS-Adobe-' stuff is omitted from line 1
-%
-
-% Copyright (C) 1995, 1997, 2001, 2002, 2003, 2004, 2005, 2006, 2007
-%   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, 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; see the file COPYING.  If not, write to
-% the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-% Boston, MA 02110-1301, USA.
-
-/tgifdict 132 dict def
-tgifdict begin
-
-%
-%      Using a zero value radius for an ellipse or an arc would result
-%              in a non-invertible CTM matrix which causes problem when this
-%              when this PostScript is wrapped inside other routines, such as
-%              the multi.ps package from
-%              ftp.ucc.su.oz.au:/pub/ps_printing/multi.  You can overcome such
-%              error by uncommenting the sole line of the procedure below:
-%
-/tgif_min_radius
- {
-%    dup 0.01 lt { pop 0.01 } if
- } bind def
-
-/tgifellipsedict 6 dict def
-tgifellipsedict /mtrx matrix put
-
-/tgifellipse
- { tgifellipsedict begin
-      /yrad exch def
-      /xrad exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      xrad yrad scale
-      0 0 1 0 360 arc
-      savematrix setmatrix
-   end
- } def
-
-/tgifarrowtipdict 8 dict def
-tgifarrowtipdict /mtrx matrix put
-
-/tgifarrowtip
- { tgifarrowtipdict begin
-      /dy exch def
-      /dx exch def
-      /h exch def
-      /w exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      dy dx atan rotate
-      0 0 moveto
-      w neg h lineto
-      w neg h neg lineto
-      savematrix setmatrix
-   end
- } def
-
-/tgifarcdict 8 dict def
-tgifarcdict /mtrx matrix put
-
-/tgifarcn
- { tgifarcdict begin
-      /endangle exch def
-      /startangle exch def
-      /yrad exch def
-      /xrad exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      xrad yrad scale
-      0 0 1 startangle endangle arc
-      savematrix setmatrix
-   end
- } def
-
-/tgifarc
- { tgifarcdict begin
-      /endangle exch def
-      /startangle exch def
-      /yrad exch def
-      /xrad exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      xrad yrad scale
-      0 0 1 startangle endangle arcn
-      savematrix setmatrix
-   end
- } def
-
-/tgifsetuserscreendict 22 dict def
-tgifsetuserscreendict begin
-   /tempctm matrix def
-   /temprot matrix def
-   /tempscale matrix def
-
-   /concatprocs
-    { /proc2 exch cvlit def
-      /proc1 exch cvlit def
-      /newproc proc1 length proc2 length add array def
-      newproc 0 proc1 putinterval
-      newproc proc1 length proc2 putinterval
-      newproc cvx
-    } def
-   /resmatrix matrix def
-   /findresolution
-    { 72 0 resmatrix defaultmatrix dtransform
-      /yres exch def /xres exch def
-      xres dup mul yres dup mul add sqrt
-    } def
-end
-
-/tgifsetuserscreen
- { tgifsetuserscreendict begin
-      /spotfunction exch def
-      /screenangle exch def
-      /cellsize exch def
-
-      /m tempctm currentmatrix def
-      /rm screenangle temprot rotate def
-      /sm cellsize dup tempscale scale def
-
-      sm rm m m concatmatrix m concatmatrix pop
-
-      1 0 m dtransform /y1 exch def /x1 exch def
-
-      /veclength x1 dup mul y1 dup mul add sqrt def
-      /frequency findresolution veclength div def
-
-      /newscreenangle y1 x1 atan def
-
-      m 2 get m 1 get mul m 0 get m 3 get mul sub 0 gt
-
-      {{neg} /spotfunction load concatprocs
-         /spotfunction exch def
-      } if
-
-      frequency newscreenangle /spotfunction load setscreen
-   end
- } def
-
-/tgifsetpatterndict 18 dict def
-tgifsetpatterndict begin
-   /bitison
-    { /ybit exch def /xbit exch def
-      /bytevalue bstring ybit bwidth mul xbit 8 idiv add get def
-
-      /mask 1 7 xbit 8 mod sub bitshift def
-      bytevalue mask and 0 ne
-    } def
-end
-
-/tgifbitpatternspotfunction
- { tgifsetpatterndict begin
-      /y exch def /x exch def
-
-      /xindex x 1 add 2 div bpside mul cvi def
-      /yindex y 1 add 2 div bpside mul cvi def
-
-      xindex yindex bitison
-       { /onbits onbits 1 add def 1 }
-       { /offbits offbits 1 add def 0 }
-       ifelse
-   end
- } def
-
-/tgifsetpattern
- { tgifsetpatterndict begin
-      /cellsz exch def
-      /angle exch def
-      /bwidth exch def
-      /bpside exch def
-      /bstring exch def
-
-      /onbits 0 def /offbits 0 def
-      cellsz angle /tgifbitpatternspotfunction load tgifsetuserscreen
-      {} settransfer
-      offbits offbits onbits add div setgray
-   end
- } def
-
-/tgifxpmdict 4 dict def
-/tgifbwpicstr 1 string def
-/tgifcolorpicstr 3 string def
-
-/tgifsetpixels { tgifxpmdict begin /pixels exch def end } def
-
-/tgifsetpix { tgifxpmdict begin pixels 3 1 roll putinterval end } def
-
-/tgifbwspot
- { tgifxpmdict begin
-      /index exch def
-      tgifbwpicstr 0
-      pixels index 3 mul 3 getinterval aload pop
-      255 mul .114 mul exch 255 mul .587 mul add exch 255 mul .299 mul add
-      cvi put
-      tgifbwpicstr
-   end
- } def
-
-/tgifcolorspot
- { tgifxpmdict begin
-      /index exch def
-      pixels index 3 mul 3 getinterval aload pop
-      255 mul cvi tgifcolorpicstr 2 3 -1 roll put
-      255 mul cvi tgifcolorpicstr 1 3 -1 roll put
-      255 mul cvi tgifcolorpicstr 0 3 -1 roll put
-      tgifcolorpicstr
-   end
- } def
-
-/tgifnewcolorspot
- { tgifxpmdict begin
-      /index exch def
-      pixels index 3 mul 3 getinterval aload pop setrgbcolor
-   end
- } def
-
-/tgifcolordict 4 dict def
-
-/colorimage where
- { pop }
- { /colorimage
-   { tgifcolordict begin
-        pop pop pop pop pop
-        /ih exch def
-        /iw exch def
-        /x 0 def
-        /y 0 def
-        1 1 ih
-         { pop 1 1 iw
-            { pop currentfile
-              tgifbwpicstr readhexstring pop 0 get tgifnewcolorspot
-              x y moveto 1 0 rlineto 0 1 rlineto -1 0 rlineto
-              closepath fill
-              /x x 1 add def
-            } for
-           /y y 1 add def
-           /x 0 def
-         } for
-     end
-   } def
- } ifelse
-
-/tgifpatdict 10 dict def
-
-/tgifpatbyte
- { currentdict /retstr get exch
-   pat i cellsz mod get put
- } def
-
-/tgifpatproc
- { 0 1 widthlim {tgifpatbyte} for retstr
-   /i i 1 add def
- } def
-
-/tgifpatfill
- { tgifpatdict begin
-      /h exch def
-      /w exch def
-      /lty exch def
-      /ltx exch def
-      /cellsz exch def
-      /pat exch def
-
-      /widthlim w cellsz div cvi 1 sub def
-      /retstr widthlim 1 add string def
-      /i 0 def
-
-      ltx lty translate
-      w h true [1 0 0 1 0 0] {tgifpatproc} imagemask
-      ltx neg lty neg translate
-   end
- } def
-
-/pat1 <ffffffffffffffff> def
-/pat2 <0000000000000000> def
-/pat3 <8000000008000000> def
-/pat4 <8800000022000000> def
-/pat5 <8800220088002200> def
-/pat6 <8822882288228822> def
-/pat7 <aa55aa55aa55aa55> def
-/pat8 <77dd77dd77dd77dd> def
-/pat9 <77ffddff77ffddff> def
-/pat10 <77ffffff77ffffff> def
-/pat11 <7fffffff7fffffff> def
-/pat12 <8040200002040800> def
-/pat13 <40a00000040a0000> def
-/pat14 <ff888888ff888888> def
-/pat15 <ff808080ff080808> def
-/pat16 <f87422478f172271> def
-/pat17 <038448300c020101> def
-/pat18 <081c22c180010204> def
-/pat19 <8080413e080814e3> def
-/pat20 <8040201008040201> def
-/pat21 <8844221188442211> def
-/pat22 <77bbddee77bbddee> def
-/pat23 <c1e070381c0e0783> def
-/pat24 <7fbfdfeff7fbfdfe> def
-/pat25 <3e1f8fc7e3f1f87c> def
-/pat26 <0102040810204080> def
-/pat27 <1122448811224488> def
-/pat28 <eeddbb77eeddbb77> def
-/pat29 <83070e1c3870e0c1> def
-/pat30 <fefdfbf7efdfbf7f> def
-/pat31 <7cf8f1e3c78f1f3e> def
-
-/tgifcentertext { dup stringwidth pop 2 div neg 0 rmoveto } def
-
-/tgifrighttext { dup stringwidth pop neg 0 rmoveto } def
-
-/tgifreencsmalldict 12 dict def
-/tgifReEncodeSmall
- { tgifreencsmalldict begin
-      /newcodesandnames exch def
-      /newfontname exch def
-      /basefontname exch def
-
-      /basefontdict basefontname findfont def
-      /newfont basefontdict maxlength dict def
-
-      basefontdict
-      { exch dup /FID ne
-         { dup /Encoding eq
-            { exch dup length array copy newfont 3 1 roll put }
-            { exch newfont 3 1 roll put }
-            ifelse
-         }
-         { pop pop }
-         ifelse
-      }
-      forall
-
-      newfont /FontName newfontname put
-      newcodesandnames aload pop
-
-      newcodesandnames length 2 idiv
-      { newfont /Encoding get 3 1 roll put}
-      repeat
-
-      newfontname newfont definefont pop
-   end
- } def
-
-/tgifgray { 8 1 0 72 300 32 div div tgifsetpattern } bind def
-
-/tgifboxdict 6 dict def
-/tgifboxstroke
- { tgifboxdict begin
-      /pat def /w def /y2 exch def /x2 exch def /y1 exch def /x1 exch def
-      1.415 setmiterlimit
-      w 1 eq { w setlinewidth } if
-      pat pat1 ne pat pat2 ne and { gsave pat tgifgray } if
-      newpath x1 y1 moveto x2 y1 lineto x2 y2 lineto x1 y2 lineto closepath
-      pat pat2 eq { 1 setgray stroke 0 setgray } { stroke } ifelse
-      pat pat1 ne pat pat2 ne and { grestore } if
-      w 1 eq { 1 setlinewidth } if
-      1 setmiterlimit
-   end
- } def
-/tgifboxfill
- { tgifboxdict begin
-      /pat def /y2 exch def /x2 exch def /y1 exch def /x1 exch def
-      pat pat1 ne pat pat2 ne and { gsave pat tgifgray } if
-      newpath x1 y1 moveto x2 y1 lineto x2 y2 lineto x1 y2 lineto closepath
-      pat pat2 eq { 1 setgray fill 0 setgray } { fill } ifelse
-      pat pat1 ne pat pat2 ne and { grestore } if
-   end
- } def
-
-end
-
-%%PageBoundingBox: 33 710 173 759
-tgifdict begin
-/tgifsavedpage save def
-
-1 setmiterlimit
-1 setlinewidth
-
-0 setgray
-
-72 0 mul 72 11.00 mul translate
-72 128 div 100 mul 100 div dup neg scale
-
-gsave
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      63 75 moveto (\(multiply-by-seven 3\)) show
-   grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      80 80 moveto
-      96 96 lineto
-      224 96 lineto
-      240 80 lineto
-   stroke
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      264 119 moveto
-      -22 0 atan dup cos 8 mul 264 exch sub
-      exch sin 8 mul 97 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      264 97 8 3 0 -22 tgifarrowtip
-   closepath fill
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      160 103 moveto
-      160 119 lineto
-   stroke
-grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      112 139 moveto (function) show
-   grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      224 139 moveto (argument) show
-   grestore
-
-grestore
-tgifsavedpage restore
-end
-%MatchingCreationDate: Wed Mar  8 14:31:53 1995
diff --git a/lispintro/lambda-2.eps b/lispintro/lambda-2.eps
deleted file mode 100644 (file)
index 6288283..0000000
+++ /dev/null
@@ -1,471 +0,0 @@
-%!
-%%BoundingBox: 33 730 240 777
-%%Title: lambda-diagram2
-%%CreationDate: Wed Mar  8 14:33:09 1995
-%%Creator: Tgif-2.16-p4 by William Chia-Wei Cheng (william@cs.UCLA.edu)
-%
-%      Due to bugs in Transcript, the 'PS-Adobe-' stuff is omitted from line 1
-%
-
-% Copyright (C) 1995, 1997, 2001, 2002, 2003, 2004, 2005, 2006, 2007
-%   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, 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; see the file COPYING.  If not, write to
-% the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-% Boston, MA 02110-1301, USA.
-
-/tgifdict 132 dict def
-tgifdict begin
-
-%
-%      Using a zero value radius for an ellipse or an arc would result
-%              in a non-invertible CTM matrix which causes problem when this
-%              when this PostScript is wrapped inside other routines, such as
-%              the multi.ps package from
-%              ftp.ucc.su.oz.au:/pub/ps_printing/multi.  You can overcome such
-%              error by uncommenting the sole line of the procedure below:
-%
-/tgif_min_radius
- {
-%    dup 0.01 lt { pop 0.01 } if
- } bind def
-
-/tgifellipsedict 6 dict def
-tgifellipsedict /mtrx matrix put
-
-/tgifellipse
- { tgifellipsedict begin
-      /yrad exch def
-      /xrad exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      xrad yrad scale
-      0 0 1 0 360 arc
-      savematrix setmatrix
-   end
- } def
-
-/tgifarrowtipdict 8 dict def
-tgifarrowtipdict /mtrx matrix put
-
-/tgifarrowtip
- { tgifarrowtipdict begin
-      /dy exch def
-      /dx exch def
-      /h exch def
-      /w exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      dy dx atan rotate
-      0 0 moveto
-      w neg h lineto
-      w neg h neg lineto
-      savematrix setmatrix
-   end
- } def
-
-/tgifarcdict 8 dict def
-tgifarcdict /mtrx matrix put
-
-/tgifarcn
- { tgifarcdict begin
-      /endangle exch def
-      /startangle exch def
-      /yrad exch def
-      /xrad exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      xrad yrad scale
-      0 0 1 startangle endangle arc
-      savematrix setmatrix
-   end
- } def
-
-/tgifarc
- { tgifarcdict begin
-      /endangle exch def
-      /startangle exch def
-      /yrad exch def
-      /xrad exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      xrad yrad scale
-      0 0 1 startangle endangle arcn
-      savematrix setmatrix
-   end
- } def
-
-/tgifsetuserscreendict 22 dict def
-tgifsetuserscreendict begin
-   /tempctm matrix def
-   /temprot matrix def
-   /tempscale matrix def
-
-   /concatprocs
-    { /proc2 exch cvlit def
-      /proc1 exch cvlit def
-      /newproc proc1 length proc2 length add array def
-      newproc 0 proc1 putinterval
-      newproc proc1 length proc2 putinterval
-      newproc cvx
-    } def
-   /resmatrix matrix def
-   /findresolution
-    { 72 0 resmatrix defaultmatrix dtransform
-      /yres exch def /xres exch def
-      xres dup mul yres dup mul add sqrt
-    } def
-end
-
-/tgifsetuserscreen
- { tgifsetuserscreendict begin
-      /spotfunction exch def
-      /screenangle exch def
-      /cellsize exch def
-
-      /m tempctm currentmatrix def
-      /rm screenangle temprot rotate def
-      /sm cellsize dup tempscale scale def
-
-      sm rm m m concatmatrix m concatmatrix pop
-
-      1 0 m dtransform /y1 exch def /x1 exch def
-
-      /veclength x1 dup mul y1 dup mul add sqrt def
-      /frequency findresolution veclength div def
-
-      /newscreenangle y1 x1 atan def
-
-      m 2 get m 1 get mul m 0 get m 3 get mul sub 0 gt
-
-      {{neg} /spotfunction load concatprocs
-         /spotfunction exch def
-      } if
-
-      frequency newscreenangle /spotfunction load setscreen
-   end
- } def
-
-/tgifsetpatterndict 18 dict def
-tgifsetpatterndict begin
-   /bitison
-    { /ybit exch def /xbit exch def
-      /bytevalue bstring ybit bwidth mul xbit 8 idiv add get def
-
-      /mask 1 7 xbit 8 mod sub bitshift def
-      bytevalue mask and 0 ne
-    } def
-end
-
-/tgifbitpatternspotfunction
- { tgifsetpatterndict begin
-      /y exch def /x exch def
-
-      /xindex x 1 add 2 div bpside mul cvi def
-      /yindex y 1 add 2 div bpside mul cvi def
-
-      xindex yindex bitison
-       { /onbits onbits 1 add def 1 }
-       { /offbits offbits 1 add def 0 }
-       ifelse
-   end
- } def
-
-/tgifsetpattern
- { tgifsetpatterndict begin
-      /cellsz exch def
-      /angle exch def
-      /bwidth exch def
-      /bpside exch def
-      /bstring exch def
-
-      /onbits 0 def /offbits 0 def
-      cellsz angle /tgifbitpatternspotfunction load tgifsetuserscreen
-      {} settransfer
-      offbits offbits onbits add div setgray
-   end
- } def
-
-/tgifxpmdict 4 dict def
-/tgifbwpicstr 1 string def
-/tgifcolorpicstr 3 string def
-
-/tgifsetpixels { tgifxpmdict begin /pixels exch def end } def
-
-/tgifsetpix { tgifxpmdict begin pixels 3 1 roll putinterval end } def
-
-/tgifbwspot
- { tgifxpmdict begin
-      /index exch def
-      tgifbwpicstr 0
-      pixels index 3 mul 3 getinterval aload pop
-      255 mul .114 mul exch 255 mul .587 mul add exch 255 mul .299 mul add
-      cvi put
-      tgifbwpicstr
-   end
- } def
-
-/tgifcolorspot
- { tgifxpmdict begin
-      /index exch def
-      pixels index 3 mul 3 getinterval aload pop
-      255 mul cvi tgifcolorpicstr 2 3 -1 roll put
-      255 mul cvi tgifcolorpicstr 1 3 -1 roll put
-      255 mul cvi tgifcolorpicstr 0 3 -1 roll put
-      tgifcolorpicstr
-   end
- } def
-
-/tgifnewcolorspot
- { tgifxpmdict begin
-      /index exch def
-      pixels index 3 mul 3 getinterval aload pop setrgbcolor
-   end
- } def
-
-/tgifcolordict 4 dict def
-
-/colorimage where
- { pop }
- { /colorimage
-   { tgifcolordict begin
-        pop pop pop pop pop
-        /ih exch def
-        /iw exch def
-        /x 0 def
-        /y 0 def
-        1 1 ih
-         { pop 1 1 iw
-            { pop currentfile
-              tgifbwpicstr readhexstring pop 0 get tgifnewcolorspot
-              x y moveto 1 0 rlineto 0 1 rlineto -1 0 rlineto
-              closepath fill
-              /x x 1 add def
-            } for
-           /y y 1 add def
-           /x 0 def
-         } for
-     end
-   } def
- } ifelse
-
-/tgifpatdict 10 dict def
-
-/tgifpatbyte
- { currentdict /retstr get exch
-   pat i cellsz mod get put
- } def
-
-/tgifpatproc
- { 0 1 widthlim {tgifpatbyte} for retstr
-   /i i 1 add def
- } def
-
-/tgifpatfill
- { tgifpatdict begin
-      /h exch def
-      /w exch def
-      /lty exch def
-      /ltx exch def
-      /cellsz exch def
-      /pat exch def
-
-      /widthlim w cellsz div cvi 1 sub def
-      /retstr widthlim 1 add string def
-      /i 0 def
-
-      ltx lty translate
-      w h true [1 0 0 1 0 0] {tgifpatproc} imagemask
-      ltx neg lty neg translate
-   end
- } def
-
-/pat1 <ffffffffffffffff> def
-/pat2 <0000000000000000> def
-/pat3 <8000000008000000> def
-/pat4 <8800000022000000> def
-/pat5 <8800220088002200> def
-/pat6 <8822882288228822> def
-/pat7 <aa55aa55aa55aa55> def
-/pat8 <77dd77dd77dd77dd> def
-/pat9 <77ffddff77ffddff> def
-/pat10 <77ffffff77ffffff> def
-/pat11 <7fffffff7fffffff> def
-/pat12 <8040200002040800> def
-/pat13 <40a00000040a0000> def
-/pat14 <ff888888ff888888> def
-/pat15 <ff808080ff080808> def
-/pat16 <f87422478f172271> def
-/pat17 <038448300c020101> def
-/pat18 <081c22c180010204> def
-/pat19 <8080413e080814e3> def
-/pat20 <8040201008040201> def
-/pat21 <8844221188442211> def
-/pat22 <77bbddee77bbddee> def
-/pat23 <c1e070381c0e0783> def
-/pat24 <7fbfdfeff7fbfdfe> def
-/pat25 <3e1f8fc7e3f1f87c> def
-/pat26 <0102040810204080> def
-/pat27 <1122448811224488> def
-/pat28 <eeddbb77eeddbb77> def
-/pat29 <83070e1c3870e0c1> def
-/pat30 <fefdfbf7efdfbf7f> def
-/pat31 <7cf8f1e3c78f1f3e> def
-
-/tgifcentertext { dup stringwidth pop 2 div neg 0 rmoveto } def
-
-/tgifrighttext { dup stringwidth pop neg 0 rmoveto } def
-
-/tgifreencsmalldict 12 dict def
-/tgifReEncodeSmall
- { tgifreencsmalldict begin
-      /newcodesandnames exch def
-      /newfontname exch def
-      /basefontname exch def
-
-      /basefontdict basefontname findfont def
-      /newfont basefontdict maxlength dict def
-
-      basefontdict
-      { exch dup /FID ne
-         { dup /Encoding eq
-            { exch dup length array copy newfont 3 1 roll put }
-            { exch newfont 3 1 roll put }
-            ifelse
-         }
-         { pop pop }
-         ifelse
-      }
-      forall
-
-      newfont /FontName newfontname put
-      newcodesandnames aload pop
-
-      newcodesandnames length 2 idiv
-      { newfont /Encoding get 3 1 roll put}
-      repeat
-
-      newfontname newfont definefont pop
-   end
- } def
-
-/tgifgray { 8 1 0 72 300 32 div div tgifsetpattern } bind def
-
-/tgifboxdict 6 dict def
-/tgifboxstroke
- { tgifboxdict begin
-      /pat def /w def /y2 exch def /x2 exch def /y1 exch def /x1 exch def
-      1.415 setmiterlimit
-      w 1 eq { w setlinewidth } if
-      pat pat1 ne pat pat2 ne and { gsave pat tgifgray } if
-      newpath x1 y1 moveto x2 y1 lineto x2 y2 lineto x1 y2 lineto closepath
-      pat pat2 eq { 1 setgray stroke 0 setgray } { stroke } ifelse
-      pat pat1 ne pat pat2 ne and { grestore } if
-      w 1 eq { 1 setlinewidth } if
-      1 setmiterlimit
-   end
- } def
-/tgifboxfill
- { tgifboxdict begin
-      /pat def /y2 exch def /x2 exch def /y1 exch def /x1 exch def
-      pat pat1 ne pat pat2 ne and { gsave pat tgifgray } if
-      newpath x1 y1 moveto x2 y1 lineto x2 y2 lineto x1 y2 lineto closepath
-      pat pat2 eq { 1 setgray fill 0 setgray } { fill } ifelse
-      pat pat1 ne pat pat2 ne and { grestore } if
-   end
- } def
-
-end
-
-%%PageBoundingBox: 33 730 240 777
-tgifdict begin
-/tgifsavedpage save def
-
-1 setmiterlimit
-1 setlinewidth
-
-0 setgray
-
-72 0 mul 72 11.00 mul translate
-72 128 div 100 mul 100 div dup neg scale
-
-gsave
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      63 43 moveto (\(\(lambda \(number\) \(* 7 number\)\) 3\)) show
-   grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      80 48 moveto
-      96 64 lineto
-      336 64 lineto
-      353 49 lineto
-   stroke
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      395 85 moveto
-      -21 0 atan dup cos 8 mul 395 exch sub
-      exch sin 8 mul 64 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      395 64 8 3 0 -21 tgifarrowtip
-   closepath fill
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      208 69 moveto
-      208 85 lineto
-   stroke
-grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      112 102 moveto (anonymous function) show
-   grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      344 102 moveto (argument) show
-   grestore
-
-grestore
-tgifsavedpage restore
-end
-%MatchingCreationDate: Wed Mar  8 14:33:09 1995
diff --git a/lispintro/lambda-3.eps b/lispintro/lambda-3.eps
deleted file mode 100644 (file)
index 26f7d5d..0000000
+++ /dev/null
@@ -1,471 +0,0 @@
-%!
-%%BoundingBox: 33 728 211 777
-%%Title: lambda-diagram3
-%%CreationDate: Wed Mar  8 14:33:49 1995
-%%Creator: Tgif-2.16-p4 by William Chia-Wei Cheng (william@cs.UCLA.edu)
-%
-%      Due to bugs in Transcript, the 'PS-Adobe-' stuff is omitted from line 1
-%
-
-% Copyright (C) 1995, 1997, 2001, 2002, 2003, 2004, 2005, 2006, 2007
-%   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, 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; see the file COPYING.  If not, write to
-% the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-% Boston, MA 02110-1301, USA.
-
-/tgifdict 132 dict def
-tgifdict begin
-
-%
-%      Using a zero value radius for an ellipse or an arc would result
-%              in a non-invertible CTM matrix which causes problem when this
-%              when this PostScript is wrapped inside other routines, such as
-%              the multi.ps package from
-%              ftp.ucc.su.oz.au:/pub/ps_printing/multi.  You can overcome such
-%              error by uncommenting the sole line of the procedure below:
-%
-/tgif_min_radius
- {
-%    dup 0.01 lt { pop 0.01 } if
- } bind def
-
-/tgifellipsedict 6 dict def
-tgifellipsedict /mtrx matrix put
-
-/tgifellipse
- { tgifellipsedict begin
-      /yrad exch def
-      /xrad exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      xrad yrad scale
-      0 0 1 0 360 arc
-      savematrix setmatrix
-   end
- } def
-
-/tgifarrowtipdict 8 dict def
-tgifarrowtipdict /mtrx matrix put
-
-/tgifarrowtip
- { tgifarrowtipdict begin
-      /dy exch def
-      /dx exch def
-      /h exch def
-      /w exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      dy dx atan rotate
-      0 0 moveto
-      w neg h lineto
-      w neg h neg lineto
-      savematrix setmatrix
-   end
- } def
-
-/tgifarcdict 8 dict def
-tgifarcdict /mtrx matrix put
-
-/tgifarcn
- { tgifarcdict begin
-      /endangle exch def
-      /startangle exch def
-      /yrad exch def
-      /xrad exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      xrad yrad scale
-      0 0 1 startangle endangle arc
-      savematrix setmatrix
-   end
- } def
-
-/tgifarc
- { tgifarcdict begin
-      /endangle exch def
-      /startangle exch def
-      /yrad exch def
-      /xrad exch def
-      /y exch def
-      /x exch def
-      /savematrix mtrx currentmatrix def
-      x y translate
-      xrad yrad scale
-      0 0 1 startangle endangle arcn
-      savematrix setmatrix
-   end
- } def
-
-/tgifsetuserscreendict 22 dict def
-tgifsetuserscreendict begin
-   /tempctm matrix def
-   /temprot matrix def
-   /tempscale matrix def
-
-   /concatprocs
-    { /proc2 exch cvlit def
-      /proc1 exch cvlit def
-      /newproc proc1 length proc2 length add array def
-      newproc 0 proc1 putinterval
-      newproc proc1 length proc2 putinterval
-      newproc cvx
-    } def
-   /resmatrix matrix def
-   /findresolution
-    { 72 0 resmatrix defaultmatrix dtransform
-      /yres exch def /xres exch def
-      xres dup mul yres dup mul add sqrt
-    } def
-end
-
-/tgifsetuserscreen
- { tgifsetuserscreendict begin
-      /spotfunction exch def
-      /screenangle exch def
-      /cellsize exch def
-
-      /m tempctm currentmatrix def
-      /rm screenangle temprot rotate def
-      /sm cellsize dup tempscale scale def
-
-      sm rm m m concatmatrix m concatmatrix pop
-
-      1 0 m dtransform /y1 exch def /x1 exch def
-
-      /veclength x1 dup mul y1 dup mul add sqrt def
-      /frequency findresolution veclength div def
-
-      /newscreenangle y1 x1 atan def
-
-      m 2 get m 1 get mul m 0 get m 3 get mul sub 0 gt
-
-      {{neg} /spotfunction load concatprocs
-         /spotfunction exch def
-      } if
-
-      frequency newscreenangle /spotfunction load setscreen
-   end
- } def
-
-/tgifsetpatterndict 18 dict def
-tgifsetpatterndict begin
-   /bitison
-    { /ybit exch def /xbit exch def
-      /bytevalue bstring ybit bwidth mul xbit 8 idiv add get def
-
-      /mask 1 7 xbit 8 mod sub bitshift def
-      bytevalue mask and 0 ne
-    } def
-end
-
-/tgifbitpatternspotfunction
- { tgifsetpatterndict begin
-      /y exch def /x exch def
-
-      /xindex x 1 add 2 div bpside mul cvi def
-      /yindex y 1 add 2 div bpside mul cvi def
-
-      xindex yindex bitison
-       { /onbits onbits 1 add def 1 }
-       { /offbits offbits 1 add def 0 }
-       ifelse
-   end
- } def
-
-/tgifsetpattern
- { tgifsetpatterndict begin
-      /cellsz exch def
-      /angle exch def
-      /bwidth exch def
-      /bpside exch def
-      /bstring exch def
-
-      /onbits 0 def /offbits 0 def
-      cellsz angle /tgifbitpatternspotfunction load tgifsetuserscreen
-      {} settransfer
-      offbits offbits onbits add div setgray
-   end
- } def
-
-/tgifxpmdict 4 dict def
-/tgifbwpicstr 1 string def
-/tgifcolorpicstr 3 string def
-
-/tgifsetpixels { tgifxpmdict begin /pixels exch def end } def
-
-/tgifsetpix { tgifxpmdict begin pixels 3 1 roll putinterval end } def
-
-/tgifbwspot
- { tgifxpmdict begin
-      /index exch def
-      tgifbwpicstr 0
-      pixels index 3 mul 3 getinterval aload pop
-      255 mul .114 mul exch 255 mul .587 mul add exch 255 mul .299 mul add
-      cvi put
-      tgifbwpicstr
-   end
- } def
-
-/tgifcolorspot
- { tgifxpmdict begin
-      /index exch def
-      pixels index 3 mul 3 getinterval aload pop
-      255 mul cvi tgifcolorpicstr 2 3 -1 roll put
-      255 mul cvi tgifcolorpicstr 1 3 -1 roll put
-      255 mul cvi tgifcolorpicstr 0 3 -1 roll put
-      tgifcolorpicstr
-   end
- } def
-
-/tgifnewcolorspot
- { tgifxpmdict begin
-      /index exch def
-      pixels index 3 mul 3 getinterval aload pop setrgbcolor
-   end
- } def
-
-/tgifcolordict 4 dict def
-
-/colorimage where
- { pop }
- { /colorimage
-   { tgifcolordict begin
-        pop pop pop pop pop
-        /ih exch def
-        /iw exch def
-        /x 0 def
-        /y 0 def
-        1 1 ih
-         { pop 1 1 iw
-            { pop currentfile
-              tgifbwpicstr readhexstring pop 0 get tgifnewcolorspot
-              x y moveto 1 0 rlineto 0 1 rlineto -1 0 rlineto
-              closepath fill
-              /x x 1 add def
-            } for
-           /y y 1 add def
-           /x 0 def
-         } for
-     end
-   } def
- } ifelse
-
-/tgifpatdict 10 dict def
-
-/tgifpatbyte
- { currentdict /retstr get exch
-   pat i cellsz mod get put
- } def
-
-/tgifpatproc
- { 0 1 widthlim {tgifpatbyte} for retstr
-   /i i 1 add def
- } def
-
-/tgifpatfill
- { tgifpatdict begin
-      /h exch def
-      /w exch def
-      /lty exch def
-      /ltx exch def
-      /cellsz exch def
-      /pat exch def
-
-      /widthlim w cellsz div cvi 1 sub def
-      /retstr widthlim 1 add string def
-      /i 0 def
-
-      ltx lty translate
-      w h true [1 0 0 1 0 0] {tgifpatproc} imagemask
-      ltx neg lty neg translate
-   end
- } def
-
-/pat1 <ffffffffffffffff> def
-/pat2 <0000000000000000> def
-/pat3 <8000000008000000> def
-/pat4 <8800000022000000> def
-/pat5 <8800220088002200> def
-/pat6 <8822882288228822> def
-/pat7 <aa55aa55aa55aa55> def
-/pat8 <77dd77dd77dd77dd> def
-/pat9 <77ffddff77ffddff> def
-/pat10 <77ffffff77ffffff> def
-/pat11 <7fffffff7fffffff> def
-/pat12 <8040200002040800> def
-/pat13 <40a00000040a0000> def
-/pat14 <ff888888ff888888> def
-/pat15 <ff808080ff080808> def
-/pat16 <f87422478f172271> def
-/pat17 <038448300c020101> def
-/pat18 <081c22c180010204> def
-/pat19 <8080413e080814e3> def
-/pat20 <8040201008040201> def
-/pat21 <8844221188442211> def
-/pat22 <77bbddee77bbddee> def
-/pat23 <c1e070381c0e0783> def
-/pat24 <7fbfdfeff7fbfdfe> def
-/pat25 <3e1f8fc7e3f1f87c> def
-/pat26 <0102040810204080> def
-/pat27 <1122448811224488> def
-/pat28 <eeddbb77eeddbb77> def
-/pat29 <83070e1c3870e0c1> def
-/pat30 <fefdfbf7efdfbf7f> def
-/pat31 <7cf8f1e3c78f1f3e> def
-
-/tgifcentertext { dup stringwidth pop 2 div neg 0 rmoveto } def
-
-/tgifrighttext { dup stringwidth pop neg 0 rmoveto } def
-
-/tgifreencsmalldict 12 dict def
-/tgifReEncodeSmall
- { tgifreencsmalldict begin
-      /newcodesandnames exch def
-      /newfontname exch def
-      /basefontname exch def
-
-      /basefontdict basefontname findfont def
-      /newfont basefontdict maxlength dict def
-
-      basefontdict
-      { exch dup /FID ne
-         { dup /Encoding eq
-            { exch dup length array copy newfont 3 1 roll put }
-            { exch newfont 3 1 roll put }
-            ifelse
-         }
-         { pop pop }
-         ifelse
-      }
-      forall
-
-      newfont /FontName newfontname put
-      newcodesandnames aload pop
-
-      newcodesandnames length 2 idiv
-      { newfont /Encoding get 3 1 roll put}
-      repeat
-
-      newfontname newfont definefont pop
-   end
- } def
-
-/tgifgray { 8 1 0 72 300 32 div div tgifsetpattern } bind def
-
-/tgifboxdict 6 dict def
-/tgifboxstroke
- { tgifboxdict begin
-      /pat def /w def /y2 exch def /x2 exch def /y1 exch def /x1 exch def
-      1.415 setmiterlimit
-      w 1 eq { w setlinewidth } if
-      pat pat1 ne pat pat2 ne and { gsave pat tgifgray } if
-      newpath x1 y1 moveto x2 y1 lineto x2 y2 lineto x1 y2 lineto closepath
-      pat pat2 eq { 1 setgray stroke 0 setgray } { stroke } ifelse
-      pat pat1 ne pat pat2 ne and { grestore } if
-      w 1 eq { 1 setlinewidth } if
-      1 setmiterlimit
-   end
- } def
-/tgifboxfill
- { tgifboxdict begin
-      /pat def /y2 exch def /x2 exch def /y1 exch def /x1 exch def
-      pat pat1 ne pat pat2 ne and { gsave pat tgifgray } if
-      newpath x1 y1 moveto x2 y1 lineto x2 y2 lineto x1 y2 lineto closepath
-      pat pat2 eq { 1 setgray fill 0 setgray } { fill } ifelse
-      pat pat1 ne pat pat2 ne and { grestore } if
-   end
- } def
-
-end
-
-%%PageBoundingBox: 33 728 211 777
-tgifdict begin
-/tgifsavedpage save def
-
-1 setmiterlimit
-1 setlinewidth
-
-0 setgray
-
-72 0 mul 72 11.00 mul translate
-72 128 div 100 mul 100 div dup neg scale
-
-gsave
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      63 43 moveto (\(\(lambda \(arg\) \(/ arg 50\)\) 100\)) show
-   grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      80 48 moveto
-      96 64 lineto
-      284 64 lineto
-      299 48 lineto
-   stroke
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      354 86 moveto
-      -25 0 atan dup cos 8 mul 354 exch sub
-      exch sin 8 mul 61 exch sub lineto
-   stroke
-grestore
-gsave
-   newpath
-      354 61 8 3 0 -25 tgifarrowtip
-   closepath fill
-grestore
-
-% POLY/OPEN-SPLINE
-gsave
-   newpath
-      199 70 moveto
-      199 86 lineto
-   stroke
-grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      101 106 moveto (anonymous function) show
-   grestore
-
-% TEXT
-0 setgray
-/Courier findfont [17 0 0 -17 0 0] makefont setfont
-   gsave
-      293 106 moveto (argument) show
-   grestore
-
-grestore
-tgifsavedpage restore
-end
-%MatchingCreationDate: Wed Mar  8 14:33:49 1995
diff --git a/lispintro/makefile.w32-in b/lispintro/makefile.w32-in
deleted file mode 100644 (file)
index 07d51d2..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-#### -*- Makefile -*- for the Emacs Lisp Introduction manual.
-
-# Copyright (C) 2003, 2004, 2005, 2006, 2007 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, 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; see the file COPYING.  If not, write to
-# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-# Boston, MA 02110-1301, USA.
-
-srcdir = .
-
-infodir = $(srcdir)/../info
-
-INFO_SOURCES = $(srcdir)/emacs-lisp-intro.texi
-# The file name eintr must fit within 5 characters, to allow for
-# -NN extensions to fit into DOS 8+3 limits without clashing
-INFO_TARGETS = $(infodir)/eintr
-DVI_TARGETS = emacs-lisp-intro.dvi
-
-MAKEINFO = makeinfo
-INSTALL_INFO = install-info
-TEXI2DVI = texi2dvi
-DVIPS = dvips
-ENVADD = $(srcdir)\..\nt\envadd.bat "TEXINPUTS=$(srcdir);$(TEXINPUTS)" \
-        "MAKEINFO=$(MAKEINFO) -I$(srcdir)" /C
-
-.SUFFIXES: .dvi .ps .texi
-
-info: $(INFO_TARGETS)
-
-$(infodir)/dir:
-       $(INSTALL_INFO) --info-dir=$(infodir) $(INFO_TARGETS)
-
-dvi: $(DVI_TARGETS)
-
-$(infodir)/eintr: $(INFO_SOURCES)
-       $(MAKEINFO) -o $@ $(srcdir)/emacs-lisp-intro.texi
-
-emacs-lisp-intro.dvi: $(INFO_SOURCES)
-       $(ENVADD) $(TEXI2DVI) $(srcdir)/emacs-lisp-intro.texi
-
-emacs-lisp-intro.html: $(INFO_SOURCES)
-       $(MAKEINFO) --html -o $@ $(srcdir)/emacs-lisp-intro.texi
-
-.dvi.ps:
-       $(DVIPS) $< -o $@
-
-mostlyclean:
-       - $(DEL) *.log *.cp *.fn *.ky *.pg *.vr *.tp
-
-clean: mostlyclean
-       - $(DEL) *.dvi $(infodir)/eintr*
-
-distclean: clean
-
-maintainer-clean: distclean
-       - $(DEL) *.aux *.cps *.fns *.kys *.pgs *.vrs *.toc
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/lispintro/missing b/lispintro/missing
deleted file mode 100644 (file)
index 5b73d25..0000000
+++ /dev/null
@@ -1,135 +0,0 @@
-#! /bin/sh
-# Common stub for a few missing GNU programs while installing.
-# Copyright (C) 1996, 1997, 2001, 2002, 2003, 2004, 2005, 2006, 2007
-#   Free Software Foundation, Inc.
-# Franc,ois Pinard <pinard@iro.umontreal.ca>, 1996.
-
-# This program 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 2, or (at your option)
-# any later version.
-
-# This program 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 this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-# MA 02110-1301, USA.
-
-if test $# -eq 0; then
-  echo 1>&2 "Try \`$0 --help' for more information"
-  exit 1
-fi
-
-case "$1" in
-
-  -h|--h|--he|--hel|--help)
-    echo "\
-$0 [OPTION]... PROGRAM [ARGUMENT]...
-
-Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
-error status if there is no known handling for PROGRAM.
-
-Options:
-  -h, --help      display this help and exit
-  -v, --version   output version information and exit
-
-Supported PROGRAM values:
-  aclocal      touch file \`aclocal.m4'
-  autoconf     touch file \`configure'
-  autoheader   touch file \`config.h.in'
-  automake     touch all \`Makefile.in' files
-  bison        touch file \`y.tab.c'
-  makeinfo     touch the output file
-  yacc         touch file \`y.tab.c'"
-    ;;
-
-  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
-    echo "missing - GNU libit 0.0"
-    ;;
-
-  -*)
-    echo 1>&2 "$0: Unknown \`$1' option"
-    echo 1>&2 "Try \`$0 --help' for more information"
-    exit 1
-    ;;
-
-  aclocal)
-    echo 1>&2 "\
-WARNING: \`$1' is missing on your system.  You should only need it if
-         you modified \`acinclude.m4' or \`configure.in'.  You might want
-         to install the \`Automake' and \`Perl' packages.  Grab them from
-         any GNU archive site."
-    touch aclocal.m4
-    ;;
-
-  autoconf)
-    echo 1>&2 "\
-WARNING: \`$1' is missing on your system.  You should only need it if
-         you modified \`configure.in'.  You might want to install the
-         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
-         archive site."
-    touch configure
-    ;;
-
-  autoheader)
-    echo 1>&2 "\
-WARNING: \`$1' is missing on your system.  You should only need it if
-         you modified \`acconfig.h' or \`configure.in'.  You might want
-         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
-         from any GNU archive site."
-    touch config.h.in
-    ;;
-
-  automake)
-    echo 1>&2 "\
-WARNING: \`$1' is missing on your system.  You should only need it if
-         you modified \`Makefile.am', \`acinclude.m4' or \`configure.in'.
-         You might want to install the \`Automake' and \`Perl' packages.
-         Grab them from any GNU archive site."
-    find . -type f -name Makefile.am -print \
-      | sed 's/^\(.*\).am$/touch \1.in/' \
-      | sh
-    ;;
-
-  bison|yacc)
-    echo 1>&2 "\
-WARNING: \`$1' is missing on your system.  You should only need it if
-         you modified a \`.y' file.  You may need the \`Bison' package
-         in order for those modifications to take effect.  You can get
-         \`Bison' from any GNU archive site."
-    touch y.tab.c
-    ;;
-
-  makeinfo)
-    echo 1>&2 "\
-WARNING: \`$1' is missing on your system.  You should only need it if
-         you modified a \`.texi' or \`.texinfo' file, or any other file
-         indirectly affecting the aspect of the manual.  The spurious
-         call might also be the consequence of using a buggy \`make' (AIX,
-         DU, IRIX).  You might want to install the \`Texinfo' package or
-         the \`GNU make' package.  Grab either from any GNU archive site."
-    file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
-    if test -z "$file"; then
-      file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
-      file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
-    fi
-    touch $file
-    ;;
-
-  *)
-    echo 1>&2 "\
-WARNING: \`$1' is needed, and you do not seem to have it handy on your
-         system.  You might have modified some files without having the
-         proper tools for further handling them.  Check the \`README' file,
-         it often tells you about the needed prerequirements for installing
-         this package.  You may also peek at any GNU archive site, in case
-         some other package would contain this missing \`$1' program."
-    exit 1
-    ;;
-esac
-
-exit 0
diff --git a/lispintro/mkinstalldirs b/lispintro/mkinstalldirs
deleted file mode 100644 (file)
index f945dbf..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-#! /bin/sh
-# mkinstalldirs --- make directory hierarchy
-# Author: Noah Friedman <friedman@prep.ai.mit.edu>
-# Created: 1993-05-16
-# Public domain
-
-errstatus=0
-
-for file
-do
-   set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
-   shift
-
-   pathcomp=
-   for d
-   do
-     pathcomp="$pathcomp$d"
-     case "$pathcomp" in
-       -* ) pathcomp=./$pathcomp ;;
-     esac
-
-     if test ! -d "$pathcomp"; then
-        echo "mkdir $pathcomp" 1>&2
-
-        mkdir "$pathcomp" || lasterr=$?
-
-        if test ! -d "$pathcomp"; then
-         errstatus=$lasterr
-        fi
-     fi
-
-     pathcomp="$pathcomp/"
-   done
-done
-
-exit $errstatus
-
-# mkinstalldirs ends here
index 99f2d79110128128749522465f5ea56a3ec8f136..a2b00018d675a9fe5e89f410179d202028b9adeb 100755 (executable)
--- a/make-dist
+++ b/make-dist
@@ -154,10 +154,10 @@ echo Version numbers are $version and $shortversion
 
 if [ $update = yes ];
 then
-  if grep -s "@set EMACSVER  *${shortversion}" ./man/emacs.texi > /dev/null; then
+  if grep -s "@set EMACSVER  *${shortversion}" ./doc/emacs/emacs.texi > /dev/null; then
     true
   else
-    echo "You must update the version number in \`./man/emacs.texi'"
+    echo "You must update the version number in \`./doc/emacs/emacs.texi'"
     sleep 5
   fi
 fi
@@ -242,9 +242,10 @@ fi
 if [ $update = yes ];
 then
   echo "Updating Info files"
-  (cd man; make -f Makefile.in srcdir=. info)
-  (cd lispref; make -f Makefile.in srcdir=. info)
-  (cd lispintro; make -f Makefile.in SHELL=/bin/sh srcdir=. info VPATH=.)
+  (cd doc/emacs; make -f Makefile.in srcdir=. info)
+  (cd doc/misc; make -f Makefile.in srcdir=. info)
+  (cd doc/lispref; make -f Makefile.in srcdir=. info)
+  (cd doc/lispintro; make -f Makefile.in SHELL=/bin/sh srcdir=. info VPATH=.)
 
   echo "Updating finder, custom and autoload data"
   (cd lisp; make updates EMACS="$EMACS")
@@ -293,7 +294,7 @@ mkdir ${tempdir}
 ### tar file; this means that people can start reading the INSTALL and
 ### README while the rest of the tar file is still unpacking.  Whoopee.
 echo "Making links to top-level files"
-ln AUTHORS FTP INSTALL README BUGS CONTRIBUTE move-if-change ${tempdir}
+ln FTP INSTALL README BUGS move-if-change ${tempdir}
 ln ChangeLog Makefile.in configure configure.in ${tempdir}
 ln config.bat make-dist update-subdirs vpath.sed ${tempdir}
 ### Copy these files; they're cross-filesystem symlinks.
@@ -312,7 +313,7 @@ echo "Updating version number in README"
 
 
 echo "Creating subdirectories"
-for subdir in lisp site-lisp lispref lispintro \
+for subdir in lisp site-lisp \
              leim leim/CXTERM-DIC leim/MISC-DIC \
              leim/SKK-DIC leim/ja-dic leim/quail \
              src src/m src/s src/bitmaps lib-src oldXMenu lwlib \
@@ -322,7 +323,8 @@ for subdir in lisp site-lisp lispref lispintro \
              etc/images/icons etc/images/low-color etc/images/mail \
              etc/images/smilies etc/images/tree-widget \
              etc/images/tree-widget/default etc/images/tree-widget/folder \
-             etc/refcards etc/tutorials info man m4 msdos vms mac mac/inc \
+             etc/refcards etc/tutorials info doc doc/emacs doc/misc doc/man \
+             doc/lispref doc/lispintro m4 msdos vms mac mac/inc \
              mac/inc/sys mac/src mac/Emacs.app mac/Emacs.app/Contents \
              mac/Emacs.app/Contents/MacOS mac/Emacs.app/Contents/Resources \
              mac/Emacs.app/Contents/Resources/English.lproj
@@ -570,7 +572,6 @@ echo "Making links to \`lwlib'"
 echo "Making links to \`etc'"
 ### Don't distribute = files, TAGS, DOC files, backups, autosaves, or
 ### tex litter.
-### Don't distribute gfdl.1, since no man page references it.
 (cd etc
  files=`ls -d * | grep -v CVS | grep -v RCS | grep -v 'Old' | grep -v '^e$' \
         | grep -v '^charsets$' | grep -v '^images$' | grep -v '^refcards$' | grep -v '^tutorials$'`
@@ -592,7 +593,7 @@ echo "Making links to \`etc'"
    fi
  done
  cd ../${tempdir}/etc
- rm -f fns*.el gfdl.1
+ rm -f fns*.el
  rm -f DOC* *~ \#*\# *.dvi *.log *.orig *.rej *,v =* core
  rm -f TAGS)
 
@@ -639,44 +640,59 @@ echo "Making links to \`info'"
  ln emacs dummy~ ; ln emacs \#dummy\#
  rm -f *~ \#*\# core)
 
-echo "Making links to \`man'"
-(cd man
- ln *.texi *.aux *.cps *.fns *.kys *.vrs ../${tempdir}/man
- ln makefile.w32-in ../${tempdir}/man
- test -f README && ln README ../${tempdir}/man
- test -f Makefile.in && ln Makefile.in ../${tempdir}/man
- ln ChangeLog ../${tempdir}/man
- test -f split-man && ln split-man ../${tempdir}/man
- cp texinfo.tex ../${tempdir}/man
- cd ../${tempdir}/man
+echo "Making links to \`doc/emacs'"
+(cd doc/emacs
+ ln *.texi *.aux *.cps *.fns *.kys *.vrs ../../${tempdir}/doc/emacs
+ ln makefile.w32-in ../../${tempdir}/doc/emacs
+ test -f README && ln README ../../${tempdir}/doc/emacs
+ test -f Makefile.in && ln Makefile.in ../../${tempdir}/doc/emacs
+ ln ChangeLog ../../${tempdir}/doc/emacs
+ cp texinfo.tex ../../${tempdir}/doc/emacs
+ cd ../../${tempdir}/doc/emacs
  rm -f \#*\# =* *~ core emacs-index* *.Z *.z xmail
  rm -f emacs.?? termcap.?? gdb.?? *.log *.toc *.dvi *.oaux)
 
-echo "Making links to \`lispref'"
-(cd lispref
- ln `ls -1 *.texi` ../${tempdir}/lispref
- ln *.aux *.cps *.fns *.kys *.vrs ../${tempdir}/lispref
- ln *.txt *.el spellfile tindex.pl ../${tempdir}/lispref
- ln makefile.w32-in ../${tempdir}/lispref
- test -f README && ln README ../${tempdir}/lispref
- test -f Makefile.in && ln Makefile.in ../${tempdir}/lispref
- ln ChangeLog ../${tempdir}/lispref
- cd ../${tempdir}/lispref
+echo "Making links to \`doc/misc'"
+(cd doc/misc
+ ln *.texi *.aux *.cps *.fns *.kys *.vrs ../../${tempdir}/doc/misc
+ ln makefile.w32-in ../../${tempdir}/doc/misc
+ test -f README && ln README ../../${tempdir}/doc/misc
+ test -f Makefile.in && ln Makefile.in ../../${tempdir}/doc/misc
+ ln ChangeLog ../../${tempdir}/doc/misc
+ cp texinfo.tex ../../${tempdir}/doc/misc
+ cd ../../${tempdir}/doc/misc
+ rm -f \#*\# =* *~ core emacs-index* *.Z *.z xmail
+ rm -f emacs.?? termcap.?? gdb.?? *.log *.toc *.dvi *.oaux)
+
+echo "Making links to \`doc/lispref'"
+(cd doc/lispref
+ ln `ls -1 *.texi` ../../${tempdir}/doc/lispref
+ ln *.aux *.cps *.fns *.kys *.vrs ../../${tempdir}/doc/lispref
+ ln *.txt *.el spellfile tindex.pl ../../${tempdir}/doc/lispref
+ ln makefile.w32-in ../../${tempdir}/doc/lispref
+ test -f README && ln README ../../${tempdir}/doc/lispref
+ test -f Makefile.in && ln Makefile.in ../../${tempdir}/doc/lispref
+ ln ChangeLog ../../${tempdir}/doc/lispref
+ cd ../../${tempdir}/doc/lispref
  rm -f \#*\# =* *~ core elisp-index* *.Z *.z xmail
  rm -f elisp.?? *.log *.toc *.dvi *.oaux)
 
-echo "Making links to \`lispintro'"
-(cd lispintro
- ln *.texi *.aux *.cps *.fns *.kys *.vrs *.eps ../${tempdir}/lispintro
- ln makefile.w32-in ../${tempdir}/lispintro
- test -f texinfo.tex && ln texinfo.tex ../${tempdir}/lispintro
- test -f README && ln README ../${tempdir}/lispintro
- test -f Makefile.in && ln Makefile.in ../${tempdir}/lispintro
- ln ChangeLog ../${tempdir}/lispintro
- cd ../${tempdir}/lispintro
+echo "Making links to \`doc/lispintro'"
+(cd doc/lispintro
+ ln *.texi *.aux *.cps *.fns *.kys *.vrs *.eps ../../${tempdir}/doc/lispintro
+ ln makefile.w32-in ../../${tempdir}/doc/lispintro
+ test -f texinfo.tex && ln texinfo.tex ../../${tempdir}/doc/lispintro
+ test -f README && ln README ../../${tempdir}/doc/lispintro
+ test -f Makefile.in && ln Makefile.in ../../${tempdir}/doc/lispintro
+ ln ChangeLog ../../${tempdir}/doc/lispintro
+ cd ../../${tempdir}/doc/lispintro
  rm -f \#*\# =* *~ core *.Z *.z xmail
  rm -f emacs-lisp-intro.?? *.log *.toc *.dvi *.oaux)
 
+echo "Making links to \`doc/man'"
+(cd doc/man
+ ln *.1 ../../${tempdir}/doc/man)
+
 echo "Making links to \`vms'"
 (cd vms
  test -f README && ln README ../${tempdir}/vms
index 3ff56b474dd0fffad604ed7f44baeeb7c94a6db9..f3c7a7c5da68804a1bdf391127ba34aed33c3cca 100644 (file)
@@ -1,23 +1 @@
-*.aux
-*.cp
-*.cps
-*.dvi
-*.fn
-*.fns
-*.ky
-*.kys
-*.log
-*.op
-*.ops
-*.pdf
-*.pg
-*.pgs
-*.ps
-*.tmp
-*.toc
-*.tp
-*.tps
-*.vr
-*.vrs
 Makefile
-makefile