]> code.delx.au - gnu-emacs/commitdiff
Merge from emacs-23 branch
authorStefan Monnier <monnier@iro.umontreal.ca>
Wed, 31 Mar 2010 02:37:57 +0000 (22:37 -0400)
committerStefan Monnier <monnier@iro.umontreal.ca>
Wed, 31 Mar 2010 02:37:57 +0000 (22:37 -0400)
227 files changed:
.dir-locals.el
ChangeLog
Makefile.in
README
admin/CPP-DEFINES
admin/ChangeLog
admin/quick-install-emacs
config.bat
configure
configure.in
doc/emacs/ChangeLog
doc/emacs/building.texi
doc/emacs/emacs.texi
doc/emacs/mule.texi
doc/emacs/search.texi
doc/lispintro/ChangeLog
doc/lispref/ChangeLog
doc/lispref/book-spine.texinfo
doc/lispref/elisp.texi
doc/lispref/os.texi
doc/lispref/vol1.texi
doc/lispref/vol2.texi
doc/man/ChangeLog
doc/man/emacs.1
doc/misc/ChangeLog
doc/misc/auth.texi
doc/misc/faq.texi
doc/misc/gnus.texi
etc/ChangeLog
etc/HELLO
etc/NEWS
etc/NEWS.23 [new file with mode: 0644]
etc/TODO
etc/gnus/gnus-setup.ast
etc/gnus/news-server.ast
etc/images/custom/down.xpm
etc/images/custom/right.xpm
leim/ChangeLog
leim/Makefile.in
leim/makefile.w32-in
lib-src/ChangeLog
lib-src/Makefile.in
lib-src/makefile.w32-in
lisp/ChangeLog
lisp/Makefile.in
lisp/calculator.el
lisp/calendar/cal-french.el
lisp/cedet/ede/project-am.el
lisp/cedet/semantic/bovine/c.el
lisp/complete.el
lisp/cus-edit.el
lisp/desktop.el
lisp/diff-mode.el
lisp/dired-x.el
lisp/emacs-lisp/autoload.el
lisp/emacs-lisp/lisp-mnt.el
lisp/emulation/pc-select.el
lisp/epg-config.el
lisp/erc/ChangeLog
lisp/face-remap.el
lisp/facemenu.el
lisp/files.el
lisp/find-dired.el
lisp/finder.el
lisp/gnus/ChangeLog
lisp/gnus/auth-source.el
lisp/gnus/gmm-utils.el
lisp/gnus/gnus-agent.el
lisp/gnus/gnus-art.el
lisp/gnus/gnus-registry.el
lisp/gnus/gnus-sum.el
lisp/gnus/gnus-util.el
lisp/gnus/ietf-drums.el
lisp/gnus/mail-source.el
lisp/gnus/message.el
lisp/gnus/mm-decode.el
lisp/gnus/mm-encode.el
lisp/gnus/mm-util.el
lisp/gnus/mml-sec.el
lisp/gnus/mml.el
lisp/gnus/mml1991.el
lisp/gnus/mml2015.el
lisp/gnus/nneething.el
lisp/gnus/nnheader.el
lisp/gnus/nnimap.el
lisp/gnus/nnir.el
lisp/gnus/nntp.el
lisp/gnus/pop3.el
lisp/gnus/rfc2047.el
lisp/gnus/sieve-mode.el
lisp/gnus/spam-stat.el
lisp/hl-line.el
lisp/image-mode.el
lisp/image.el
lisp/info.el
lisp/ldefs-boot.el
lisp/log-edit.el
lisp/log-view.el
lisp/mail/emacsbug.el
lisp/mail/hashcash.el
lisp/mail/metamail.el
lisp/mail/supercite.el
lisp/mh-e/ChangeLog
lisp/midnight.el
lisp/minibuffer.el
lisp/mpc.el
lisp/net/ange-ftp.el
lisp/net/browse-url.el
lisp/net/goto-addr.el
lisp/net/hmac-def.el
lisp/net/hmac-md5.el
lisp/net/netrc.el
lisp/net/secrets.el [new file with mode: 0644]
lisp/net/tramp-imap.el
lisp/net/tramp.el
lisp/net/xesam.el
lisp/nxml/nxml-mode.el
lisp/obsolete/s-region.el [moved from lisp/s-region.el with 99% similarity]
lisp/org/ChangeLog
lisp/org/org.el
lisp/outline.el
lisp/password-cache.el
lisp/progmodes/compile.el
lisp/progmodes/gdb-mi.el [new file with mode: 0644]
lisp/progmodes/gdb-ui.el [deleted file]
lisp/progmodes/gud.el
lisp/progmodes/make-mode.el
lisp/progmodes/mixal-mode.el
lisp/ps-print.el
lisp/replace.el
lisp/reveal.el
lisp/subr.el
lisp/textmodes/picture.el
lisp/textmodes/rst.el
lisp/textmodes/table.el
lisp/textmodes/text-mode.el
lisp/uniquify.el
lisp/url/ChangeLog
lisp/url/url-http.el
lisp/url/url-vars.el
lisp/url/url.el
lisp/vc-annotate.el
lisp/vc-arch.el
lisp/vc-bzr.el
lisp/vc-cvs.el
lisp/vc-dir.el
lisp/vc-dispatcher.el
lisp/vc-git.el
lisp/vc-hg.el
lisp/vc-hooks.el
lisp/vc-mtn.el
lisp/vc-rcs.el
lisp/vc-sccs.el
lisp/vc-svn.el
lisp/vc.el
lisp/vcursor.el
lisp/version.el
lisp/view.el
lisp/whitespace.el
lisp/wid-edit.el
lwlib/ChangeLog
msdos/ChangeLog
msdos/sed1v2.inp
msdos/sed3.inp
msdos/sed3v2.inp
msdos/sedlisp.inp
nextstep/ChangeLog
nextstep/Cocoa/Emacs.base/Contents/Info.plist
nextstep/Cocoa/Emacs.base/Contents/Resources/English.lproj/InfoPlist.strings
nextstep/GNUstep/Emacs.base/Resources/Emacs.desktop
nextstep/GNUstep/Emacs.base/Resources/Info-gnustep.plist
nt/ChangeLog
nt/emacs.rc
nt/emacsclient.rc
oldXMenu/ChangeLog
src/.gdbinit
src/ChangeLog
src/Makefile.in
src/alloc.c
src/atimer.c
src/bidi.c [new file with mode: 0644]
src/buffer.c
src/buffer.h
src/cm.c
src/config.in
src/data.c
src/dispextern.h
src/dispnew.c
src/emacs.c
src/frame.c
src/keyboard.c
src/m/alpha.h
src/m/hp800.h
src/m/ibmrs6000.h
src/m/iris4d.h
src/m/vax.h
src/makefile.w32-in
src/process.c
src/regex.c
src/s/aix4-2.h
src/s/bsd-common.h
src/s/darwin.h
src/s/freebsd.h
src/s/gnu-linux.h
src/s/gnu.h
src/s/irix6-5.h
src/s/lynxos.h [deleted file]
src/s/netbsd.h
src/s/openbsd.h
src/s/sol2-3.h [deleted file]
src/s/sol2-4.h [deleted file]
src/s/sol2-5.h [deleted file]
src/s/sol2-6.h
src/s/unixware.h
src/s/usg5-4-2.h [deleted file]
src/s/usg5-4.h
src/syntax.c
src/syntax.h
src/syssignal.h
src/term.c
src/unexec.c
src/window.c
src/window.h
src/xdisp.c
src/xfns.c
test/ChangeLog
test/occur-testsuite.el [new file with mode: 0644]

index 1d934e8e66f8b2b64ddfce267f99ad0169aded77..12b85561ee8630fb8de63f12e81fd00fc6b0d62c 100644 (file)
@@ -4,6 +4,7 @@
  (change-log-mode . ((add-log-time-zone-rule . t)
                     (fill-column . 74)
                     (bug-reference-url-format . "http://debbugs.gnu.org/%s")
-                    (mode . bug-reference))))
+                    (mode . bug-reference)))
+ (diff-mode . ((mode . whitespace))))
 
 ;; arch-tag: fb93c160-e9fe-4184-aad1-e4f5daa11cbd
index 413c23953ed288f2985990bd4e52368cbd00abee..d8c440355a89dc0094c8db01d42483431ba1a2be 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,68 @@
+2010-03-30  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * configure.in: Remove all references to C_DEBUG_SWITCH.
+
+2010-03-27  Eli Zaretskii  <eliz@gnu.org>
+
+       * config.bat <lib-src>: Edit out lines that begin with several #
+       characters.
+
+2010-03-20  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * configure.in: Remove support for old UNIX System V systems and
+       for Unixware on non-x86 machines.
+
+       * configure.in: Remove support for Solaris on PPC and for old versions.
+
+       * configure.in: Remove non-working lynxos port.
+
+2010-03-19  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * .dir-locals.el (c-mode): Turn on whitespace-mode for diff-mode.
+
+2010-03-19  Glenn Morris  <rgm@gnu.org>
+
+       * configure.in (HAVE_LIBNCURSES): Add a description to make autoheader
+       happy.
+
+2010-03-18  Jan Djärv  <jan.h.d@swipnet.se>
+
+       * configure.in: Check for tputs and friends, abort if not
+       found (bug#5735).
+
+2010-03-18  Glenn Morris  <rgm@gnu.org>
+
+       * configure.in (--with-x-toolkit): In the help text, say which options
+       are synonyms.
+
+       * configure.in (--with-mmdf, --with-mail-unlink):
+       New options, off by default.
+       (--with-mailhost): New option to set default POP host.
+       (LIBXPM, LIBJPEG, LIBPNG, LIBTIFF, LIBGIF, LIBGPM, LIBS_MAIL)
+       (LIBHESIOD, LIBRESOLV, COM_ERRLIB, CRYPTOLIB, KRB5LIB, DESLIB, KRB4LIB):
+       New variables, substituted in Makefiles.
+       (try_libungif, ac_gif_lib_name): Replace with HAVE_GIF=maybe, LIBGIF.
+       (LIBGIF): Use AC_SUBST rather than AC_DEFINE.
+       (HAVE_LIBMAIL, HAVE_LIBLOCKFILE, HAVE_LIBCOM_ERR, HAVE_LIBCRYPTO)
+       (HAVE_LIBK5CRYPTO, HAVE_LIBKRB5, HAVE_LIBDES425, HAVE_LIBDES)
+       (HAVE_LIBKRB4, HAVE_LIBKRB): New AC_DEFINEs.
+
+2010-03-18  Tetsurou Okazaki  <okazaki@be.to>  (tiny change)
+
+       * Makefile.in (uninstall): Handle the case where archlibdir does not
+       exist.  (Bug#5720)
+
+2010-03-12  Eli Zaretskii  <eliz@gnu.org>
+
+       These changes remove termcap.c from the build on Posix platforms.
+       * configure.in <AC_CHECK_HEADERS>: Remove termcap.h.
+
+       * configure: Regenerated.
+
+2010-03-10  Chong Yidong  <cyd@stupidchicken.com>
+
+       * Branch for 23.2.
+
 2010-01-31  Juri Linkov  <juri@jurta.org>
 
        * .bzrignore: Add TAGS-LISP.
index 4c869cebf8367b40c990d779b4b07102d0bef47f..8942bc66878f2a75ed8c4f962b20c75285f78250 100644 (file)
@@ -667,7 +667,9 @@ uninstall:
            esac ;                                      \
          fi ;                                          \
        done
-       (cd $(DESTDIR)${archlibdir} && rm -f fns-*)
+       if [ -d $(DESTDIR)${archlibdir} ]; then \
+         (cd $(DESTDIR)${archlibdir} && rm -f fns-*) \
+       fi
        -rm -rf $(DESTDIR)${libexecdir}/emacs/${version}
        (cd $(DESTDIR)${infodir} && \
          for elt in $(INFO_FILES); do \
diff --git a/README b/README
index a98ac450810305ecce1777162887906c0f7dabed..2ccd5d7cb0db74a8926ccd54350c0256c44ccaf0 100644 (file)
--- a/README
+++ b/README
@@ -3,7 +3,7 @@ Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
 See the end of the file for license conditions.
 
 
-This directory tree holds version 23.1.94 of GNU Emacs, the extensible,
+This directory tree holds version 24.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
index 9e656c39aa16d94cfa5f49e63c09cad20ad3c49c..caf05a88ce51ade728fea0d9a47c3d7bfe4760c7 100644 (file)
@@ -75,9 +75,6 @@ NO_REMAP
 VIRT_ADDR_VARIES
 WORDS_BIG_ENDIAN
 
-** Not used anymore by any port, can be cleaned up
-NO_SOCK_SIGIO
-
 ** Misc macros
 USER_FULL_NAME   If defined, overrides the default pw->pw_gecos for getting at the full user name.  Only MSDOS overrides the default.
 
@@ -109,7 +106,6 @@ BSD_SYSTEM
 CLASH_DETECTION
 COFF_BSD_SYMBOLS
 CRT0_DUMMIES
-C_DEBUG_SWITCH
 C_SWITCH_MACHINE
 C_SWITCH_SYSTEM
 C_SWITCH_SYSTEM_TEMACS
@@ -237,7 +233,6 @@ LD_SWITCH_SYSTEM
 LD_SWITCH_SYSTEM_TEMACS
 LD_SWITCH_SYSTEM_tmp
 LD_SWITCH_X_DEFAULT
-LIBS_DEBUG
 LIBS_MACHINE
 LIBS_SYSTEM
 LIBS_TERMCAP
@@ -299,7 +294,7 @@ PTY_TTY_NAME_SPRINTF
 PURESIZE
 RUN_TIME_REMAP
 SA_RESTART
-SECTION_ALIGNMENT
+SECTION_ALIGNMENT  -- was only used by s/lynxos.h, maybe all code depending on it can be removed.
 SEGMENT_MASK
 SETPGRP_RELEASES_CTTY
 SETUP_SLAVE_PTY
index da7ef59e8e654f90a7ba69d2128e153ca3f5e07a..90ba61f785000f94e2ab310e8e4492e62bd20116 100644 (file)
@@ -1,3 +1,14 @@
+2010-03-10  Chong Yidong  <cyd@stupidchicken.com>
+
+       * Branch for 23.2.
+
+2010-03-10  Miles Bader  <miles@gnu.org>
+
+       * quick-install-emacs: Use more portable shell syntax.
+
+       * quick-install-emacs: (AVOID): Be more picky about files we avoid
+       installing.
+
 2010-02-14  Juanma Barranquero  <lekktu@gmail.com>
 
        * quick-install-emacs (PRUNED): Fix typo in message.
index 2fda74b0832623d1faf2c2e73ce9cdffc063fb54..b912ed4e3ff83c8aebf2a5c533c3856a40fd3909 100755 (executable)
@@ -31,7 +31,7 @@
 PUBLIC_LIBSRC_BINARIES='b2m emacsclient etags ctags ebrowse'
 PUBLIC_LIBSRC_SCRIPTS='grep-changelog rcs-checkin'
 
-AVOID="CVS -DIC README COPYING ChangeLog ~ [.]orig$ [.]rej$ Makefile makefile stamp-subdir [.]cvsignore [.]arch-ids [{]arch[}] [.][cho]$ make-docfile testfile test-distrib"
+AVOID="CVS -DIC README COPYING ChangeLog ~ [.]orig$ [.]rej$ Makefile$ Makefile.in$ Makefile.c$ makefile$ makefile.w32-in$ stamp-subdir [.]cvsignore [.]arch-ids [{]arch[}] [.][cho]$ make-docfile testfile test-distrib"
 
 # Prune old binaries lying around in the source tree
 PRUNE=no
@@ -120,7 +120,7 @@ Written by Miles Bader <miles@gnu.org>
 EOF
       exit 0
       ;;
-    -[^-]?*)
+    -[!-]?*)
       # split concatenated single-letter options apart
       FIRST="$1"; shift
       set -- `echo $FIRST | sed 's/-\(.\)\(.*\)/-\1 -\2/'` "$@"
index f2eb0262e6029a824a20eeb76791a2d4e6e5a0ef..5a0e9168fa3482eb8161634389deda2a8a007695 100644 (file)
@@ -222,7 +222,7 @@ rem   ----------------------------------------------------------------------
 Echo Configuring the library source directory...\r
 cd lib-src\r
 rem   Create "makefile" from "makefile.in".\r
-sed -e "1,/== start of cpp stuff ==/s@^#[      ].*$@@" <Makefile.in >junk.c\r
+sed -e "1,/== start of cpp stuff ==/s@^##*[    ].*$@@" <Makefile.in >junk.c\r
 gcc -E -traditional -I. -I../src junk.c | sed -e "s/^ /        /" -e "/^#/d" -e "/^[   \f]*$/d" >makefile.new\r
 If "%DJGPP_VER%" == "2" goto libsrc-v2\r
 sed -f ../msdos/sed3.inp <makefile.new >Makefile\r
index d14d02ac21776f9c2a9bc1d8e164a6e4e4c34ffc..7d0662ce34663498176d768e1d18001ab9e3ea99 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.62 for emacs 23.1.94.
+# Generated by GNU Autoconf 2.62 for emacs 24.0.50.
 #
 # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
 # 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
@@ -594,8 +594,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
 # Identity of this package.
 PACKAGE_NAME='emacs'
 PACKAGE_TARNAME='emacs'
-PACKAGE_VERSION='23.1.94'
-PACKAGE_STRING='emacs 23.1.94'
+PACKAGE_VERSION='24.0.50'
+PACKAGE_STRING='emacs 24.0.50'
 PACKAGE_BUGREPORT=''
 
 ac_unique_file="src/lisp.h"
@@ -728,14 +728,28 @@ M17N_FLT_CFLAGS
 M17N_FLT_LIBS
 FREETYPE_CFLAGS
 FREETYPE_LIBS
+LIBXPM
+LIBJPEG
+LIBPNG
+LIBTIFF
+LIBGIF
+LIBGPM
 ALLOCA
 liblockfile
+LIBS_MAIL
 LIBOBJS
 NEED_SETGID
 KMEM_GROUP
 GETLOADAVG_LIBS
 GETOPT_H
 GETOPTOBJS
+LIBHESIOD
+LIBRESOLV
+COM_ERRLIB
+CRYPTOLIB
+KRB5LIB
+DESLIB
+KRB4LIB
 version
 configuration
 canonical
@@ -775,6 +789,9 @@ with_pop
 with_kerberos
 with_kerberos5
 with_hesiod
+with_mmdf
+with_mail_unlink
+with_mailhost
 with_sound
 with_sync_input
 with_x_toolkit
@@ -1371,7 +1388,7 @@ if test "$ac_init_help" = "long"; then
   # 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 <<_ACEOF
-\`configure' configures emacs 23.1.94 to adapt to many kinds of systems.
+\`configure' configures emacs 24.0.50 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1445,7 +1462,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of emacs 23.1.94:";;
+     short | recursive ) echo "Configuration of emacs 24.0.50:";;
    esac
   cat <<\_ACEOF
 
@@ -1481,10 +1498,14 @@ Optional Packages:
   --with-kerberos         support Kerberos-authenticated POP
   --with-kerberos5        support Kerberos version 5 authenticated POP
   --with-hesiod           support Hesiod to get the POP server host
+  --with-mmdf             support MMDF mailboxes
+  --with-mail-unlink      unlink, rather than empty, mail spool after reading
+  --with-mailhost=HOSTNAME
+                          string giving default POP mail host
   --without-sound         don't compile with sound support
   --without-sync-input    process async input synchronously
-  --with-x-toolkit=KIT    use an X toolkit (KIT one of: yes, lucid, athena,
-                          motif, gtk, no)
+  --with-x-toolkit=KIT    use an X toolkit (KIT one of: yes or gtk, lucid or
+                          athena, motif, no)
   --without-xpm           don't compile with XPM image support
   --without-jpeg          don't compile with JPEG image support
   --without-tiff          don't compile with TIFF image support
@@ -1588,7 +1609,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-emacs configure 23.1.94
+emacs configure 24.0.50
 generated by GNU Autoconf 2.62
 
 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -1602,7 +1623,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by emacs $as_me 23.1.94, which was
+It was created by emacs $as_me 24.0.50, which was
 generated by GNU Autoconf 2.62.  Invocation command line was
 
   $ $0 $@
@@ -2071,6 +2092,49 @@ _ACEOF
 fi
 
 
+# Check whether --with-mmdf was given.
+if test "${with_mmdf+set}" = set; then
+  withval=$with_mmdf;
+else
+      with_mmdf=no
+fi
+
+if test "$with_mmdf" != no; then
+
+cat >>confdefs.h <<\_ACEOF
+#define MAIL_USE_MMDF 1
+_ACEOF
+
+fi
+
+
+# Check whether --with-mail-unlink was given.
+if test "${with_mail_unlink+set}" = set; then
+  withval=$with_mail_unlink;
+else
+      with_mail_unlink=no
+fi
+
+if test "$with_mail_unlink" != no; then
+
+cat >>confdefs.h <<\_ACEOF
+#define MAIL_UNLINK_SPOOL 1
+_ACEOF
+
+fi
+
+
+# Check whether --with-mailhost was given.
+if test "${with_mailhost+set}" = set; then
+  withval=$with_mailhost;
+cat >>confdefs.h <<_ACEOF
+#define MAILHOST "$withval"
+_ACEOF
+
+fi
+
+
+
 # Check whether --with-sound was given.
 if test "${with_sound+set}" = set; then
   withval=$with_sound;
@@ -6663,12 +6727,11 @@ fi
 
 
 
-
 
 
 for ac_header in sys/select.h sys/timeb.h sys/time.h unistd.h utime.h \
   linux/version.h sys/systeminfo.h termios.h limits.h string.h stdlib.h \
-  termcap.h stdio_ext.h fcntl.h strings.h coff.h pty.h sys/mman.h \
+  stdio_ext.h fcntl.h strings.h coff.h pty.h sys/mman.h \
   sys/param.h sys/vlimit.h sys/resource.h locale.h sys/_mbstate_t.h \
   sys/utsname.h pwd.h utmp.h
 do
@@ -14290,6 +14353,7 @@ fi
 
 ### Use -lXpm if available, unless `--with-xpm=no'.
 HAVE_XPM=no
+LIBXPM=
 if test "${HAVE_X11}" = "yes"; then
   if test "${with_xpm}" != "no"; then
     if test "${ac_cv_header_X11_xpm_h+set}" = set; then
@@ -14532,11 +14596,14 @@ cat >>confdefs.h <<\_ACEOF
 #define HAVE_XPM 1
 _ACEOF
 
+    LIBXPM=-lXpm
   fi
 fi
 
+
 ### Use -ljpeg if available, unless `--with-jpeg=no'.
 HAVE_JPEG=no
+LIBJPEG=
 if test "${HAVE_X11}" = "yes"; then
   if test "${with_jpeg}" != "no"; then
             if test "${ac_cv_header_jerror_h+set}" = set; then
 rm -f conftest*
 
   fi
+  if test "${HAVE_JPEG}" = "yes"; then
+    LIBJPEG=-ljpeg
+  fi
 fi
 
+
 ### Use -lpng if available, unless `--with-png=no'.
 HAVE_PNG=no
+LIBPNG=
 if test "${HAVE_X11}" = "yes"; then
   if test "${with_png}" != "no"; then
     # Debian unstable as of July 2003 has multiple libpngs, and puts png.h
@@ -15004,11 +15076,14 @@ cat >>confdefs.h <<\_ACEOF
 #define HAVE_PNG 1
 _ACEOF
 
+    LIBPNG="-lpng -lz -lm"
   fi
 fi
 
+
 ### Use -ltiff if available, unless `--with-tiff=no'.
 HAVE_TIFF=no
+LIBTIFF=
 if test "${HAVE_X11}" = "yes"; then
   if test "${with_tiff}" != "no"; then
     if test "${ac_cv_header_tiffio_h+set}" = set; then
@@ -15222,11 +15297,14 @@ cat >>confdefs.h <<\_ACEOF
 #define HAVE_TIFF 1
 _ACEOF
 
+        LIBTIFF=-ltiff
   fi
 fi
 
+
 ### Use -lgif or -lungif if available, unless `--with-gif=no'.
 HAVE_GIF=no
+LIBGIF=
 if test "${HAVE_X11}" = "yes" && test "${with_gif}" != "no"; then
   if test "${ac_cv_header_gif_lib_h+set}" = set; then
   { $as_echo "$as_me:$LINENO: checking for gif_lib.h" >&5
@@ -15426,7 +15504,7 @@ $as_echo "$ac_cv_lib_gif_EGifPutExtensionLast" >&6; }
 if test $ac_cv_lib_gif_EGifPutExtensionLast = yes; then
   HAVE_GIF=yes
 else
-  try_libungif=yes
+  HAVE_GIF=maybe
 fi
 
 fi
 
 
   if test "$HAVE_GIF" = yes; then
-      ac_gif_lib_name="-lgif"
-  fi
-
+    LIBGIF=-lgif
+  elif test "$HAVE_GIF" = maybe; then
 # If gif_lib.h but no libgif, try libungif.
-  if test x"$try_libungif" = xyes; then
     { $as_echo "$as_me:$LINENO: checking for EGifPutExtensionLast in -lungif" >&5
 $as_echo_n "checking for EGifPutExtensionLast in -lungif... " >&6; }
 if test "${ac_cv_lib_ungif_EGifPutExtensionLast+set}" = set; then
 $as_echo "$ac_cv_lib_ungif_EGifPutExtensionLast" >&6; }
 if test $ac_cv_lib_ungif_EGifPutExtensionLast = yes; then
   HAVE_GIF=yes
+else
+  HAVE_GIF=no
 fi
 
-
-    if test "$HAVE_GIF" = yes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define LIBGIF -lungif
-_ACEOF
-
-      ac_gif_lib_name="-lungif"
-    fi
+    test "$HAVE_GIF" = yes && LIBGIF=-lungif
   fi
 
   if test "${HAVE_GIF}" = "yes"; then
@@ -15528,6 +15598,7 @@ _ACEOF
   fi
 fi
 
+
 if test "${HAVE_X11}" = "yes"; then
   MISSING=""
   WITH_NO=""
@@ -15561,6 +15632,7 @@ fi
 
 ### Use -lgpm if available, unless `--with-gpm=no'.
 HAVE_GPM=no
+LIBGPM=
 if test "${with_gpm}" != "no"; then
   if test "${ac_cv_header_gpm_h+set}" = set; then
   { $as_echo "$as_me:$LINENO: checking for gpm.h" >&5
 fi
 
 
-fi
 
-if test "${HAVE_GPM}" = "yes"; then
+  if test "${HAVE_GPM}" = "yes"; then
 
 cat >>confdefs.h <<\_ACEOF
 #define HAVE_GPM 1
 _ACEOF
 
+    LIBGPM=-lgpm
+  fi
 fi
 
+
 if test "${ac_cv_header_malloc_malloc_h+set}" = set; then
   { $as_echo "$as_me:$LINENO: checking for malloc/malloc.h" >&5
 $as_echo_n "checking for malloc/malloc.h... " >&6; }
@@ -16689,7 +16763,6 @@ fi
 
 # Check for mail-locking functions in a "mail" library.  Probably this should
 # have the same check as for liblockfile below.
-
 { $as_echo "$as_me:$LINENO: checking for maillock in -lmail" >&5
 $as_echo_n "checking for maillock in -lmail... " >&6; }
 if test "${ac_cv_lib_mail_maillock+set}" = set; then
 { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_mail_maillock" >&5
 $as_echo "$ac_cv_lib_mail_maillock" >&6; }
 if test $ac_cv_lib_mail_maillock = yes; then
-  cat >>confdefs.h <<_ACEOF
+  have_mail=yes
+else
+  have_mail=no
+fi
+
+if test $have_mail = yes; then
+  LIBS_MAIL=-lmail
+  LIBS="$LIBS_MAIL $LIBS"
+
+cat >>confdefs.h <<\_ACEOF
 #define HAVE_LIBMAIL 1
 _ACEOF
 
-  LIBS="-lmail $LIBS"
-
+else
+  LIBS_MAIL=
 fi
-
-
 { $as_echo "$as_me:$LINENO: checking for maillock in -llockfile" >&5
 $as_echo_n "checking for maillock in -llockfile... " >&6; }
 if test "${ac_cv_lib_lockfile_maillock+set}" = set; then
 { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_lockfile_maillock" >&5
 $as_echo "$ac_cv_lib_lockfile_maillock" >&6; }
 if test $ac_cv_lib_lockfile_maillock = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBLOCKFILE 1
-_ACEOF
+  have_lockfile=yes
+else
+  have_lockfile=no
+fi
 
-  LIBS="-llockfile $LIBS"
+if test $have_lockfile = yes; then
+   LIBS_MAIL=-llockfile
+   LIBS="$LIBS_MAIL $LIBS"
 
-fi
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LIBLOCKFILE 1
+_ACEOF
 
+else
 # If we have the shared liblockfile, assume we must use it for mail
 # locking (e.g. Debian).  If we couldn't link against liblockfile
 # (no liblockfile.a installed), ensure that we don't need to.
-if test "$ac_cv_lib_lockfile_maillock" = no; then
       # Extract the first word of "liblockfile.so", so it can be a program name with args.
 set dummy liblockfile.so; ac_word=$2
 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
@@ -16890,7 +16975,6 @@ $as_echo "$as_me: error: Shared liblockfile found but can't link against it.
 This probably means that movemail could lose mail.
 There may be a \`development' package to install containing liblockfile." >&2;}
    { (exit 1); exit 1; }; }
-  else :
   fi
 fi
 
@@ -17208,6 +17292,7 @@ done
 
 
 
+
 
 
 for ac_func in gethostname getdomainname dup2 \
@@ -20973,14 +21058,14 @@ done
 # That is because we have not set up to link ncurses in lib-src.
 # It's better to believe a function is not available
 # than to expect to find it in ncurses.
-
-{ $as_echo "$as_me:$LINENO: checking for tparm in -lncurses" >&5
-$as_echo_n "checking for tparm in -lncurses... " >&6; }
-if test "${ac_cv_lib_ncurses_tparm+set}" = set; then
+# Also we need tputs and frieds to be able to build at all.
+have_tputs_et_al=true
+{ $as_echo "$as_me:$LINENO: checking for library containing tputs" >&5
+$as_echo_n "checking for library containing tputs... " >&6; }
+if test "${ac_cv_search_tputs+set}" = set; then
   $as_echo_n "(cached) " >&6
 else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lncurses  $LIBS"
+  ac_func_search_save_LIBS=$LIBS
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -20994,16 +21079,23 @@ cat >>conftest.$ac_ext <<_ACEOF
 #ifdef __cplusplus
 extern "C"
 #endif
-char tparm ();
+char tputs ();
 int
 main ()
 {
-return tparm ();
+return tputs ();
   ;
   return 0;
 }
 _ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
+for ac_lib in '' ncurses terminfo termcap; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  rm -f conftest.$ac_objext conftest$ac_exeext
 if { (ac_try="$ac_link"
 case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
@@ -21024,29 +21116,52 @@ $as_echo "$ac_try_echo") >&5
         test "$cross_compiling" = yes ||
         $as_test_x conftest$ac_exeext
        }; then
-  ac_cv_lib_ncurses_tparm=yes
+  ac_cv_search_tputs=$ac_res
 else
   $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-       ac_cv_lib_ncurses_tparm=no
+
 fi
 
 rm -rf conftest.dSYM
 rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+      conftest$ac_exeext
+  if test "${ac_cv_search_tputs+set}" = set; then
+  break
 fi
-{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_ncurses_tparm" >&5
-$as_echo "$ac_cv_lib_ncurses_tparm" >&6; }
-if test $ac_cv_lib_ncurses_tparm = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBNCURSES 1
-_ACEOF
+done
+if test "${ac_cv_search_tputs+set}" = set; then
+  :
+else
+  ac_cv_search_tputs=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_search_tputs" >&5
+$as_echo "$ac_cv_search_tputs" >&6; }
+ac_res=$ac_cv_search_tputs
+if test "$ac_res" != no; then
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
 
-  LIBS="-lncurses $LIBS"
+else
+  have_tputs_et_al=false
+fi
 
+if test "$have_tputs_et_al" != true; then
+  { { $as_echo "$as_me:$LINENO: error: I couldn't find termcap functions (tputs and friends).
+Maybe some development libraries/packages are missing?  Try installing
+libncurses-dev(el), libterminfo-dev(el) or similar." >&5
+$as_echo "$as_me: error: I couldn't find termcap functions (tputs and friends).
+Maybe some development libraries/packages are missing?  Try installing
+libncurses-dev(el), libterminfo-dev(el) or similar." >&2;}
+   { (exit 1); exit 1; }; }
 fi
+# Must define this when any termcap library is found.
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LIBNCURSES 1
+_ACEOF
 
 
 # Do we have res_init, for detecting changes in /etc/resolv.conf?
@@ -21172,8 +21287,9 @@ _ACEOF
 fi
 
 # Do we need the Hesiod library to provide the support routines?
+LIBHESIOD=
 if test "$with_hesiod" != no ; then
-  # Don't set $LIBS here -- see comments above.
+  # Don't set $LIBS here -- see comments above.  FIXME which comments?
   { $as_echo "$as_me:$LINENO: checking for res_send" >&5
 $as_echo_n "checking for res_send... " >&6; }
 if test "${ac_cv_func_res_send+set}" = set; then
 { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_hesiod_hes_getmailhost" >&5
 $as_echo "$ac_cv_lib_hesiod_hes_getmailhost" >&6; }
 if test $ac_cv_lib_hesiod_hes_getmailhost = yes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_LIBHESIOD 1
-_ACEOF
-
+  hesiod=yes
 else
   :
 fi
 
 fi
 
+
+  if test x"$hesiod" = xyes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LIBHESIOD 1
+_ACEOF
+
+    LIBHESIOD=-lhesiod
+  fi
 fi
 
+
 # Do we need libresolv (due to res_init or Hesiod)?
 if test "$resolv" = yes ; then
 
@@ -21672,12 +21794,21 @@ cat >>confdefs.h <<\_ACEOF
 #define HAVE_LIBRESOLV 1
 _ACEOF
 
+  LIBRESOLV=-lresolv
+else
+  LIBRESOLV=
 fi
 
+
 # These tell us which Kerberos-related libraries to use.
-if test "${with_kerberos}" != no; then
+COM_ERRLIB=
+CRYPTOLIB=
+KRB5LIB=
+DESLIB=
+KRB4LIB=
 
-{ $as_echo "$as_me:$LINENO: checking for com_err in -lcom_err" >&5
+if test "${with_kerberos}" != no; then
+  { $as_echo "$as_me:$LINENO: checking for com_err in -lcom_err" >&5
 $as_echo_n "checking for com_err in -lcom_err... " >&6; }
 if test "${ac_cv_lib_com_err_com_err+set}" = set; then
   $as_echo_n "(cached) " >&6
 { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_com_err_com_err" >&5
 $as_echo "$ac_cv_lib_com_err_com_err" >&6; }
 if test $ac_cv_lib_com_err_com_err = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBCOM_ERR 1
-_ACEOF
-
-  LIBS="-lcom_err $LIBS"
-
+  have_com_err=yes
+else
+  have_com_err=no
 fi
 
+  if test $have_com_err = yes; then
+    COM_ERRLIB=-lcom_err
+    LIBS="$COM_ERRLIB $LIBS"
 
-{ $as_echo "$as_me:$LINENO: checking for mit_des_cbc_encrypt in -lk5crypto" >&5
-$as_echo_n "checking for mit_des_cbc_encrypt in -lk5crypto... " >&6; }
-if test "${ac_cv_lib_k5crypto_mit_des_cbc_encrypt+set}" = set; then
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LIBCOM_ERR 1
+_ACEOF
+
+  fi
+  { $as_echo "$as_me:$LINENO: checking for mit_des_cbc_encrypt in -lcrypto" >&5
+$as_echo_n "checking for mit_des_cbc_encrypt in -lcrypto... " >&6; }
+if test "${ac_cv_lib_crypto_mit_des_cbc_encrypt+set}" = set; then
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
-LIBS="-lk5crypto  $LIBS"
+LIBS="-lcrypto  $LIBS"
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -21802,12 +21938,12 @@ $as_echo "$ac_try_echo") >&5
         test "$cross_compiling" = yes ||
         $as_test_x conftest$ac_exeext
        }; then
-  ac_cv_lib_k5crypto_mit_des_cbc_encrypt=yes
+  ac_cv_lib_crypto_mit_des_cbc_encrypt=yes
 else
   $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-       ac_cv_lib_k5crypto_mit_des_cbc_encrypt=no
+       ac_cv_lib_crypto_mit_des_cbc_encrypt=no
 fi
 
 rm -rf conftest.dSYM
@@ -21815,25 +21951,30 @@ rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_k5crypto_mit_des_cbc_encrypt" >&5
-$as_echo "$ac_cv_lib_k5crypto_mit_des_cbc_encrypt" >&6; }
-if test $ac_cv_lib_k5crypto_mit_des_cbc_encrypt = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBK5CRYPTO 1
-_ACEOF
-
-  LIBS="-lk5crypto $LIBS"
-
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_crypto_mit_des_cbc_encrypt" >&5
+$as_echo "$ac_cv_lib_crypto_mit_des_cbc_encrypt" >&6; }
+if test $ac_cv_lib_crypto_mit_des_cbc_encrypt = yes; then
+  have_crypto=yes
+else
+  have_crypto=no
 fi
 
+  if test $have_crypto = yes; then
+    CRYPTOLIB=-lcrypto
+    LIBS="$CRYPTOLIB $LIBS"
 
-{ $as_echo "$as_me:$LINENO: checking for mit_des_cbc_encrypt in -lcrypto" >&5
-$as_echo_n "checking for mit_des_cbc_encrypt in -lcrypto... " >&6; }
-if test "${ac_cv_lib_crypto_mit_des_cbc_encrypt+set}" = set; then
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LIBCRYPTO 1
+_ACEOF
+
+  fi
+  { $as_echo "$as_me:$LINENO: checking for mit_des_cbc_encrypt in -lk5crypto" >&5
+$as_echo_n "checking for mit_des_cbc_encrypt in -lk5crypto... " >&6; }
+if test "${ac_cv_lib_k5crypto_mit_des_cbc_encrypt+set}" = set; then
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
-LIBS="-lcrypto  $LIBS"
+LIBS="-lk5crypto  $LIBS"
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -21877,12 +22018,12 @@ $as_echo "$ac_try_echo") >&5
         test "$cross_compiling" = yes ||
         $as_test_x conftest$ac_exeext
        }; then
-  ac_cv_lib_crypto_mit_des_cbc_encrypt=yes
+  ac_cv_lib_k5crypto_mit_des_cbc_encrypt=yes
 else
   $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-       ac_cv_lib_crypto_mit_des_cbc_encrypt=no
+       ac_cv_lib_k5crypto_mit_des_cbc_encrypt=no
 fi
 
 rm -rf conftest.dSYM
@@ -21890,19 +22031,24 @@ rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_crypto_mit_des_cbc_encrypt" >&5
-$as_echo "$ac_cv_lib_crypto_mit_des_cbc_encrypt" >&6; }
-if test $ac_cv_lib_crypto_mit_des_cbc_encrypt = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBCRYPTO 1
-_ACEOF
-
-  LIBS="-lcrypto $LIBS"
-
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_k5crypto_mit_des_cbc_encrypt" >&5
+$as_echo "$ac_cv_lib_k5crypto_mit_des_cbc_encrypt" >&6; }
+if test $ac_cv_lib_k5crypto_mit_des_cbc_encrypt = yes; then
+  have_k5crypto=yes
+else
+  have_k5crypto=no
 fi
 
+  if test $have_k5crypto = yes; then
+    CRYPTOLIB=-lk5crypto
+    LIBS="$CRYPTOLIB $LIBS"
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LIBK5CRYPTO 1
+_ACEOF
 
-{ $as_echo "$as_me:$LINENO: checking for krb5_init_context in -lkrb5" >&5
+  fi
+  { $as_echo "$as_me:$LINENO: checking for krb5_init_context in -lkrb5" >&5
 $as_echo_n "checking for krb5_init_context in -lkrb5... " >&6; }
 if test "${ac_cv_lib_krb5_krb5_init_context+set}" = set; then
   $as_echo_n "(cached) " >&6
 { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_krb5_krb5_init_context" >&5
 $as_echo "$ac_cv_lib_krb5_krb5_init_context" >&6; }
 if test $ac_cv_lib_krb5_krb5_init_context = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBKRB5 1
-_ACEOF
-
-  LIBS="-lkrb5 $LIBS"
-
+  have_krb5=yes
+else
+  have_krb5=no
 fi
 
-  if test "${with_kerberos5}" = no; then
+  if test $have_krb5=yes; then
+    KRB5LIB=-lkrb5
+    LIBS="$KRB5LIB $LIBS"
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LIBKRB5 1
+_ACEOF
 
-{ $as_echo "$as_me:$LINENO: checking for des_cbc_encrypt in -ldes425" >&5
+  fi
+    if test "${with_kerberos5}" = no; then
+    { $as_echo "$as_me:$LINENO: checking for des_cbc_encrypt in -ldes425" >&5
 $as_echo_n "checking for des_cbc_encrypt in -ldes425... " >&6; }
 if test "${ac_cv_lib_des425_des_cbc_encrypt+set}" = set; then
   $as_echo_n "(cached) " >&6
 { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_des425_des_cbc_encrypt" >&5
 $as_echo "$ac_cv_lib_des425_des_cbc_encrypt" >&6; }
 if test $ac_cv_lib_des425_des_cbc_encrypt = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBDES425 1
-_ACEOF
+  have_des425=yes
+else
+  have_des425=no
+fi
 
-  LIBS="-ldes425 $LIBS"
+    if test $have_des425 = yes; then
+      DESLIB=-ldes425
+      LIBS="$DESLIB $LIBS"
 
-else
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LIBDES425 1
+_ACEOF
 
-{ $as_echo "$as_me:$LINENO: checking for des_cbc_encrypt in -ldes" >&5
+    else
+      { $as_echo "$as_me:$LINENO: checking for des_cbc_encrypt in -ldes" >&5
 $as_echo_n "checking for des_cbc_encrypt in -ldes... " >&6; }
 if test "${ac_cv_lib_des_des_cbc_encrypt+set}" = set; then
   $as_echo_n "(cached) " >&6
 { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_des_des_cbc_encrypt" >&5
 $as_echo "$ac_cv_lib_des_des_cbc_encrypt" >&6; }
 if test $ac_cv_lib_des_des_cbc_encrypt = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBDES 1
-_ACEOF
-
-  LIBS="-ldes $LIBS"
-
+  have_des=yes
+else
+  have_des=no
 fi
 
-fi
+      if test $have_des = yes; then
+        DESLIB=-ldes
+        LIBS="$DESLIB $LIBS"
 
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LIBDES 1
+_ACEOF
 
-{ $as_echo "$as_me:$LINENO: checking for krb_get_cred in -lkrb4" >&5
+      fi
+    fi
+    { $as_echo "$as_me:$LINENO: checking for krb_get_cred in -lkrb4" >&5
 $as_echo_n "checking for krb_get_cred in -lkrb4... " >&6; }
 if test "${ac_cv_lib_krb4_krb_get_cred+set}" = set; then
   $as_echo_n "(cached) " >&6
 { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_krb4_krb_get_cred" >&5
 $as_echo "$ac_cv_lib_krb4_krb_get_cred" >&6; }
 if test $ac_cv_lib_krb4_krb_get_cred = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBKRB4 1
-_ACEOF
+  have_krb4=yes
+else
+  have_krb4=no
+fi
 
-  LIBS="-lkrb4 $LIBS"
+    if test $have_krb4 = yes; then
+      KRB4LIB=-lkrb4
+      LIBS="$KRB4LIB $LIBS"
 
-else
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LIBKRB4 1
+_ACEOF
 
-{ $as_echo "$as_me:$LINENO: checking for krb_get_cred in -lkrb" >&5
+    else
+      { $as_echo "$as_me:$LINENO: checking for krb_get_cred in -lkrb" >&5
 $as_echo_n "checking for krb_get_cred in -lkrb... " >&6; }
 if test "${ac_cv_lib_krb_krb_get_cred+set}" = set; then
   $as_echo_n "(cached) " >&6
 { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_krb_krb_get_cred" >&5
 $as_echo "$ac_cv_lib_krb_krb_get_cred" >&6; }
 if test $ac_cv_lib_krb_krb_get_cred = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBKRB 1
-_ACEOF
-
-  LIBS="-lkrb $LIBS"
-
+  have_krb=yes
+else
+  have_krb=no
 fi
 
-fi
+      if test $have_krb = yes; then
+        KRB4LIB=-lkrb
+        LIBS="$KRB4LIB $LIBS"
 
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LIBKRB 1
+_ACEOF
+
+      fi
+    fi
   fi
 
   if test "${with_kerberos5}" != no; then
@@ -23660,6 +23832,12 @@ done
 
 fi
 
+
+
+
+
+
+
 # Solaris requires -lintl if you want strerror (which calls dgettext)
 # to return localized messages.
 
@@ -25755,7 +25933,7 @@ echo "  Does Emacs use -lXaw3d?                                 ${HAVE_XAW3D}"
 echo "  Does Emacs use -lXpm?                                   ${HAVE_XPM}"
 echo "  Does Emacs use -ljpeg?                                  ${HAVE_JPEG}"
 echo "  Does Emacs use -ltiff?                                  ${HAVE_TIFF}"
-echo "  Does Emacs use a gif library?                           ${HAVE_GIF} $ac_gif_lib_name"
+echo "  Does Emacs use a gif library?                           ${HAVE_GIF} $LIBGIF"
 echo "  Does Emacs use -lpng?                                   ${HAVE_PNG}"
 echo "  Does Emacs use -lrsvg-2?                                ${HAVE_RSVG}"
 echo "  Does Emacs use -lgpm?                                   ${HAVE_GPM}"
@@ -26259,7 +26437,7 @@ exec 6>&1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by emacs $as_me 23.1.94, which was
+This file was extended by emacs $as_me 24.0.50, which was
 generated by GNU Autoconf 2.62.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -26312,7 +26490,7 @@ Report bugs to <bug-autoconf@gnu.org>."
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_version="\\
-emacs config.status 23.1.94
+emacs config.status 24.0.50
 configured by $0, generated by GNU Autoconf 2.62,
   with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
 
index a361489d8a3c9cde7ffe9a68d4dff3bb1e00f135..fc7c0a93235d949b5c9516c1843d5cc0f5c77e0b 100644 (file)
@@ -22,7 +22,7 @@ dnl  You should have received a copy of the GNU General Public License
 dnl  along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
 
 AC_PREREQ(2.62)
-AC_INIT(emacs, 23.1.94)
+AC_INIT(emacs, 24.0.50)
 AC_CONFIG_HEADER(src/config.h:src/config.in)
 AC_CONFIG_SRCDIR(src/lisp.h)
 
@@ -91,10 +91,26 @@ if test "${with_kerberos5}" != no; then
 fi
 
 OPTION_DEFAULT_OFF([hesiod],[support Hesiod to get the POP server host])
+dnl FIXME hesiod support may not be present, so it seems like an error
+dnl to define, or at least use, this unconditionally.
 if test "$with_hesiod" != no; then
   AC_DEFINE(HESIOD, 1, [Define to support using a Hesiod database to find the POP server.])
 fi
 
+OPTION_DEFAULT_OFF([mmdf],[support MMDF mailboxes])
+if test "$with_mmdf" != no; then
+   AC_DEFINE(MAIL_USE_MMDF, 1, [Define to support MMDF mailboxes in movemail.])
+fi
+
+OPTION_DEFAULT_OFF([mail-unlink],[unlink, rather than empty, mail spool after reading])
+if test "$with_mail_unlink" != no; then
+   AC_DEFINE(MAIL_UNLINK_SPOOL, 1, [Define to unlink, rather than empty, mail spool after reading.])
+fi
+
+AC_ARG_WITH([mailhost],[AS_HELP_STRING([--with-mailhost=HOSTNAME],
+    [string giving default POP mail host])],
+    AC_DEFINE_UNQUOTED(MAILHOST, ["$withval"], [String giving fallback POP mail host.]))
+
 OPTION_DEFAULT_ON([sound],[don't compile with sound support])
 
 OPTION_DEFAULT_ON([sync-input],[process async input synchronously])
@@ -107,7 +123,7 @@ 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],[AS_HELP_STRING([--with-x-toolkit=KIT],
- [use an X toolkit (KIT one of: yes, lucid, athena, motif, gtk, no)])],
+ [use an X toolkit (KIT one of: yes or gtk, lucid or athena, motif, no)])],
 [        case "${withval}" in
            y | ye | yes )      val=gtk ;;
            n | no )            val=no  ;;
@@ -442,15 +458,6 @@ dnl see the `changequote' comment above.
     esac
   ;;
 
-  ## LynxOS ports
-  *-*-lynxos* )
-    opsys=lynxos
-    case "${canonical}" in
-      i[3456]86-*-lynxos*) machine=intel386 ;;
-      powerpc-*-lynxos*) machine=powerpc ;;
-    esac
-  ;;
-
   alpha*-*-linux-gnu* )
     machine=alpha opsys=gnu-linux
   ;;
@@ -534,30 +541,14 @@ dnl see the `changequote' comment above.
 
   *-sun-solaris* \
     | i[3456]86-*-solaris2* | i[3456]86-*-sunos5* \
-    | x86_64-*-solaris2*    | x86_64-*-sunos5*    \
-    | powerpc*-*-solaris2*  | rs6000-*-solaris2*)
+    | x86_64-*-solaris2*    | x86_64-*-sunos5*)
     case "${canonical}" in
       i[3456]86-*-* )     machine=intel386 ;;
       amd64-*-*|x86_64-*-*)    machine=amdx86-64 ;;
-      powerpc* | rs6000* )  machine=ibmrs6000 ;;
       sparc* )         machine=sparc ;;
       * )              unported=yes ;;
     esac
     case "${canonical}" in
-      *-sunos5.3* | *-solaris2.3* )
-               opsys=sol2-3
-               NON_GNU_CPP=/usr/ccs/lib/cpp
-               ;;
-      *-sunos5.4* | *-solaris2.4* )
-               opsys=sol2-4
-               NON_GNU_CPP=/usr/ccs/lib/cpp
-               RANLIB="ar -ts"
-               ;;
-      *-sunos5.5* | *-solaris2.5* )
-               opsys=sol2-5
-               NON_GNU_CPP=/usr/ccs/lib/cpp
-               RANLIB="ar -ts"
-               ;;
       *-sunos5.6* | *-solaris2.6* )
                opsys=sol2-6
                NON_GNU_CPP=/usr/ccs/lib/cpp
@@ -648,22 +639,6 @@ esac
 if test x"${opsys}" = x; then
   case "${canonical}" in
     *-gnu* )                           opsys=gnu ;;
-    *-sysv4.2uw* )                     opsys=unixware ;;
-    *-sysv5uw* )                       opsys=unixware ;;
-    *-sysv5OpenUNIX* )                 opsys=unixware ;;
-    *-sysv4.1* | *-sysvr4.1* )
-       NON_GNU_CPP=/usr/lib/cpp
-       opsys=usg5-4 ;;
-    *-sysv4.[2-9]* | *-sysvr4.[2-9]* )
-       if [ x$NON_GNU_CPP = x ]; then
-         if [ -f /usr/ccs/lib/cpp ]; then
-           NON_GNU_CPP=/usr/ccs/lib/cpp
-         else
-           NON_GNU_CPP=/lib/cpp
-         fi
-       fi
-       opsys=usg5-4-2 ;;
-    *-sysv4* | *-sysvr4* )             opsys=usg5-4 ;;
     * )
       unported=yes
     ;;
@@ -913,10 +888,6 @@ configure___ use_mmap_for_buffers=yes
 configure___ use_mmap_for_buffers=no
 #endif
 
-#ifndef C_DEBUG_SWITCH
-#define C_DEBUG_SWITCH -g
-#endif
-
 #ifndef C_OPTIMIZE_SWITCH
 #ifdef __GNUC__
 #define C_OPTIMIZE_SWITCH -O2
@@ -948,18 +919,18 @@ configure___ ld_switch_machine=LD_SWITCH_MACHINE
 
 /* Get the CFLAGS for tests in configure.  */
 #ifdef __GNUC__
-configure___ CFLAGS=C_DEBUG_SWITCH C_OPTIMIZE_SWITCH '${SPECIFIED_CFLAGS}'
+configure___ CFLAGS=C_OPTIMIZE_SWITCH '${SPECIFIED_CFLAGS}'
 #else
-configure___ CFLAGS=C_DEBUG_SWITCH '${SPECIFIED_CFLAGS}'
+configure___ CFLAGS='${SPECIFIED_CFLAGS}'
 #endif
 
 #else /* not THIS_IS_CONFIGURE */
 
 /* Get the CFLAGS for real compilation.  */
 #ifdef __GNUC__
-configure___ REAL_CFLAGS=C_DEBUG_SWITCH C_OPTIMIZE_SWITCH C_WARNINGS_SWITCH ${PROFILING_CFLAGS} '${SPECIFIED_CFLAGS}'
+configure___ REAL_CFLAGS=C_OPTIMIZE_SWITCH C_WARNINGS_SWITCH ${PROFILING_CFLAGS} '${SPECIFIED_CFLAGS}'
 #else
-configure___ REAL_CFLAGS=C_DEBUG_SWITCH '${SPECIFIED_CFLAGS}'
+configure___ REAL_CFLAGS='${SPECIFIED_CFLAGS}'
 #endif
 
 #endif /* not THIS_IS_CONFIGURE */
@@ -1104,7 +1075,7 @@ fi
 dnl checks for header files
 AC_CHECK_HEADERS(sys/select.h sys/timeb.h sys/time.h unistd.h utime.h \
   linux/version.h sys/systeminfo.h termios.h limits.h string.h stdlib.h \
-  termcap.h stdio_ext.h fcntl.h strings.h coff.h pty.h sys/mman.h \
+  stdio_ext.h fcntl.h strings.h coff.h pty.h sys/mman.h \
   sys/param.h sys/vlimit.h sys/resource.h locale.h sys/_mbstate_t.h \
   sys/utsname.h pwd.h utmp.h)
 
@@ -2078,6 +2049,7 @@ AC_SUBST(M17N_FLT_LIBS)
 
 ### Use -lXpm if available, unless `--with-xpm=no'.
 HAVE_XPM=no
+LIBXPM=
 if test "${HAVE_X11}" = "yes"; then
   if test "${with_xpm}" != "no"; then
     AC_CHECK_HEADER(X11/xpm.h,
@@ -2101,11 +2073,14 @@ no_return_alloc_pixels
 
   if test "${HAVE_XPM}" = "yes"; then
     AC_DEFINE(HAVE_XPM, 1, [Define to 1 if you have the Xpm libary (-lXpm).])
+    LIBXPM=-lXpm
   fi
 fi
+AC_SUBST(LIBXPM)
 
 ### Use -ljpeg if available, unless `--with-jpeg=no'.
 HAVE_JPEG=no
+LIBJPEG=
 if test "${HAVE_X11}" = "yes"; then
   if test "${with_jpeg}" != "no"; then
     dnl Checking for jpeglib.h can lose because of a redefinition of
@@ -2125,10 +2100,15 @@ if test "${HAVE_X11}" = "yes"; then
         [AC_MSG_WARN([libjpeg found, but not version 6b or later])
         HAVE_JPEG=no])
   fi
+  if test "${HAVE_JPEG}" = "yes"; then
+    LIBJPEG=-ljpeg
+  fi
 fi
+AC_SUBST(LIBJPEG)
 
 ### Use -lpng if available, unless `--with-png=no'.
 HAVE_PNG=no
+LIBPNG=
 if test "${HAVE_X11}" = "yes"; then
   if test "${with_png}" != "no"; then
     # Debian unstable as of July 2003 has multiple libpngs, and puts png.h
@@ -2141,11 +2121,14 @@ if test "${HAVE_X11}" = "yes"; then
 
   if test "${HAVE_PNG}" = "yes"; then
     AC_DEFINE(HAVE_PNG, 1, [Define to 1 if you have the png library (-lpng).])
+    LIBPNG="-lpng -lz -lm"
   fi
 fi
+AC_SUBST(LIBPNG)
 
 ### Use -ltiff if available, unless `--with-tiff=no'.
 HAVE_TIFF=no
+LIBTIFF=
 if test "${HAVE_X11}" = "yes"; then
   if test "${with_tiff}" != "no"; then
     AC_CHECK_HEADER(tiffio.h,
@@ -2157,35 +2140,34 @@ if test "${HAVE_X11}" = "yes"; then
 
   if test "${HAVE_TIFF}" = "yes"; then
     AC_DEFINE(HAVE_TIFF, 1, [Define to 1 if you have the tiff library (-ltiff).])
+    dnl FIXME -lz -lm, as per libpng?
+    LIBTIFF=-ltiff
   fi
 fi
+AC_SUBST(LIBTIFF)
 
 ### Use -lgif or -lungif if available, unless `--with-gif=no'.
 HAVE_GIF=no
+LIBGIF=
 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, HAVE_GIF=maybe)])
 
   if test "$HAVE_GIF" = yes; then
-      ac_gif_lib_name="-lgif"
-  fi
-
+    LIBGIF=-lgif
+  elif test "$HAVE_GIF" = maybe; then
 # If gif_lib.h but no libgif, try libungif.
-  if test x"$try_libungif" = xyes; then
-    AC_CHECK_LIB(ungif, EGifPutExtensionLast, HAVE_GIF=yes)
-
-    if test "$HAVE_GIF" = yes; then
-      AC_DEFINE(LIBGIF, -lungif, [Compiler option to link with the gif library (if not -lgif).])
-      ac_gif_lib_name="-lungif"
-    fi
+    AC_CHECK_LIB(ungif, EGifPutExtensionLast, HAVE_GIF=yes, HAVE_GIF=no)
+    test "$HAVE_GIF" = yes && LIBGIF=-lungif
   fi
 
   if test "${HAVE_GIF}" = "yes"; then
-    AC_DEFINE(HAVE_GIF, 1, [Define to 1 if you have a gif library (default -lgif; otherwise specify with LIBGIF).])
+    AC_DEFINE(HAVE_GIF, 1, [Define to 1 if you have a gif (or ungif) library.])
   fi
 fi
+AC_SUBST(LIBGIF)
 
 dnl Check for required libraries.
 if test "${HAVE_X11}" = "yes"; then
@@ -2214,14 +2196,17 @@ fi
 
 ### Use -lgpm if available, unless `--with-gpm=no'.
 HAVE_GPM=no
+LIBGPM=
 if test "${with_gpm}" != "no"; then
   AC_CHECK_HEADER(gpm.h,
     [AC_CHECK_LIB(gpm, Gpm_Open, HAVE_GPM=yes)])
-fi
 
-if test "${HAVE_GPM}" = "yes"; then
-  AC_DEFINE(HAVE_GPM, 1, [Define to 1 if you have the gpm library (-lgpm).])
+  if test "${HAVE_GPM}" = "yes"; then
+    AC_DEFINE(HAVE_GPM, 1, [Define to 1 if you have the gpm library (-lgpm).])
+    LIBGPM=-lgpm
+  fi
 fi
+AC_SUBST(LIBGPM)
 
 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.])])
@@ -2286,13 +2271,24 @@ AC_CHECK_LIB(m, sqrt)
 
 # Check for mail-locking functions in a "mail" library.  Probably this should
 # have the same check as for liblockfile below.
-AC_CHECK_LIB(mail, maillock)
+AC_CHECK_LIB(mail, maillock, have_mail=yes, have_mail=no)
+if test $have_mail = yes; then
+  LIBS_MAIL=-lmail
+  LIBS="$LIBS_MAIL $LIBS"
+  AC_DEFINE(HAVE_LIBMAIL, 1, [Define to 1 if you have the `mail' library (-lmail).])
+else
+  LIBS_MAIL=
+fi
 dnl Debian, at least:
-AC_CHECK_LIB(lockfile, maillock)
+AC_CHECK_LIB(lockfile, maillock, have_lockfile=yes, have_lockfile=no)
+if test $have_lockfile = yes; then
+   LIBS_MAIL=-llockfile
+   LIBS="$LIBS_MAIL $LIBS"
+   AC_DEFINE(HAVE_LIBLOCKFILE, 1, [Define to 1 if you have the `lockfile' library (-llockfile).])
+else
 # If we have the shared liblockfile, assume we must use it for mail
 # locking (e.g. Debian).  If we couldn't link against liblockfile
 # (no liblockfile.a installed), ensure that we don't need to.
-if test "$ac_cv_lib_lockfile_maillock" = no; then
   dnl This works for files generally, not just executables.
   dnl Should we look elsewhere for it?  Maybe examine /etc/ld.so.conf?
   AC_CHECK_PROG(liblockfile, liblockfile.so, yes, no,
@@ -2301,11 +2297,11 @@ if test "$ac_cv_lib_lockfile_maillock" = no; then
     AC_MSG_ERROR([Shared liblockfile found but can't link against it.
 This probably means that movemail could lose mail.
 There may be a `development' package to install containing liblockfile.])
-  else :
   fi
 fi
 AC_CHECK_FUNCS(touchlock)
 AC_CHECK_HEADERS(maillock.h)
+AC_SUBST(LIBS_MAIL)
 
 AC_CHECK_FUNCS(gethostname getdomainname dup2 \
 rename closedir mkdir rmdir sysinfo getrusage get_current_dir_name \
@@ -2352,7 +2348,17 @@ AC_CHECK_FUNCS(getpt)
 # That is because we have not set up to link ncurses in lib-src.
 # It's better to believe a function is not available
 # than to expect to find it in ncurses.
-AC_CHECK_LIB(ncurses, tparm)
+# Also we need tputs and frieds to be able to build at all.
+have_tputs_et_al=true
+AC_SEARCH_LIBS(tputs, [ncurses terminfo termcap], , have_tputs_et_al=false)
+if test "$have_tputs_et_al" != true; then
+  AC_MSG_ERROR([I couldn't find termcap functions (tputs and friends).
+Maybe some development libraries/packages are missing?  Try installing
+libncurses-dev(el), libterminfo-dev(el) or similar.])
+fi
+# Must define this when any termcap library is found.
+AC_DEFINE(HAVE_LIBNCURSES, 1,
+          [Define to 1 if you have the `ncurses' library (-lncurses).])
 
 # Do we have res_init, for detecting changes in /etc/resolv.conf?
 
@@ -2383,8 +2389,9 @@ if test "$have_res_init" = yes; then
 fi
 
 # Do we need the Hesiod library to provide the support routines?
+LIBHESIOD=
 if test "$with_hesiod" != no ; then
-  # Don't set $LIBS here -- see comments above.
+  # Don't set $LIBS here -- see comments above.  FIXME which comments?
   AC_CHECK_FUNC(res_send, , [AC_CHECK_FUNC(__res_send, ,
      [AC_CHECK_LIB(resolv, res_send, resolv=yes,
                  [AC_CHECK_LIB(resolv, __res_send, resolv=yes)])])])
@@ -2394,28 +2401,86 @@ if test "$with_hesiod" != no ; 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).])],
-       :, $RESOLVLIB)])
+       hesiod=yes, :, $RESOLVLIB)])
+
+  if test x"$hesiod" = xyes; then
+    AC_DEFINE(HAVE_LIBHESIOD, 1,
+              [Define to 1 if you have the hesiod library (-lhesiod).])
+    LIBHESIOD=-lhesiod
+  fi
 fi
+AC_SUBST(LIBHESIOD)
 
 # Do we need libresolv (due to res_init or Hesiod)?
 if test "$resolv" = yes ; then
   AC_DEFINE(HAVE_LIBRESOLV, 1,
             [Define to 1 if you have the resolv library (-lresolv).])
+  LIBRESOLV=-lresolv
+else
+  LIBRESOLV=
 fi
+AC_SUBST(LIBRESOLV)
 
 # These tell us which Kerberos-related libraries to use.
+COM_ERRLIB=
+CRYPTOLIB=
+KRB5LIB=
+DESLIB=
+KRB4LIB=
+
 if test "${with_kerberos}" != no; then
-  AC_CHECK_LIB(com_err, com_err)
-  AC_CHECK_LIB(k5crypto, mit_des_cbc_encrypt)
-  AC_CHECK_LIB(crypto, mit_des_cbc_encrypt)
-  AC_CHECK_LIB(krb5, krb5_init_context)
+  AC_CHECK_LIB(com_err, com_err, have_com_err=yes, have_com_err=no)
+  if test $have_com_err = yes; then
+    COM_ERRLIB=-lcom_err
+    LIBS="$COM_ERRLIB $LIBS"
+    AC_DEFINE(HAVE_LIBCOM_ERR, 1, [Define to 1 if you have the `com_err' library (-lcom_err).])
+  fi
+  AC_CHECK_LIB(crypto, mit_des_cbc_encrypt, have_crypto=yes, have_crypto=no)
+  if test $have_crypto = yes; then
+    CRYPTOLIB=-lcrypto
+    LIBS="$CRYPTOLIB $LIBS"
+    AC_DEFINE(HAVE_LIBCRYPTO, 1, [Define to 1 if you have the `crypto' library (-lcrypto).])
+  fi
+  AC_CHECK_LIB(k5crypto, mit_des_cbc_encrypt, have_k5crypto=yes, have_k5crypto=no)
+  if test $have_k5crypto = yes; then
+    CRYPTOLIB=-lk5crypto
+    LIBS="$CRYPTOLIB $LIBS"
+    AC_DEFINE(HAVE_LIBK5CRYPTO, 1, [Define to 1 if you have the `k5crypto' library (-lk5crypto).])
+  fi
+  AC_CHECK_LIB(krb5, krb5_init_context, have_krb5=yes, have_krb5=no)
+  if test $have_krb5=yes; then
+    KRB5LIB=-lkrb5
+    LIBS="$KRB5LIB $LIBS"
+    AC_DEFINE(HAVE_LIBKRB5, 1, [Define to 1 if you have the `krb5' library (-lkrb5).])
+  fi
+  dnl FIXME Simplify.  Does not match 22 logic, thanks to default_off?
   if test "${with_kerberos5}" = no; then
-    AC_CHECK_LIB(des425, 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(des425, des_cbc_encrypt, have_des425=yes, have_des425=no )
+    if test $have_des425 = yes; then
+      DESLIB=-ldes425
+      LIBS="$DESLIB $LIBS"
+      AC_DEFINE(HAVE_LIBDES425, 1, [Define to 1 if you have the `des425' library (-ldes425).])
+    else
+      AC_CHECK_LIB(des, des_cbc_encrypt, have_des=yes, have_des=no)
+      if test $have_des = yes; then
+        DESLIB=-ldes
+        LIBS="$DESLIB $LIBS"
+        AC_DEFINE(HAVE_LIBDES, 1, [Define to 1 if you have the `des' library (-ldes).])
+      fi
+    fi
+    AC_CHECK_LIB(krb4, krb_get_cred, have_krb4=yes, have_krb4=no)
+    if test $have_krb4 = yes; then
+      KRB4LIB=-lkrb4
+      LIBS="$KRB4LIB $LIBS"
+      AC_DEFINE(HAVE_LIBKRB4, 1, [Define to 1 if you have the `krb4' library (-lkrb4).])
+    else
+      AC_CHECK_LIB(krb, krb_get_cred, have_krb=yes, have_krb=no)
+      if test $have_krb = yes; then
+        KRB4LIB=-lkrb
+        LIBS="$KRB4LIB $LIBS"
+        AC_DEFINE(HAVE_LIBKRB, 1, [Define to 1 if you have the `krb' library (-lkrb).])
+      fi
+    fi
   fi
 
   if test "${with_kerberos5}" != no; then
@@ -2433,6 +2498,12 @@ if test "${with_kerberos}" != no; then
   AC_CHECK_HEADERS(com_err.h)
 fi
 
+AC_SUBST(COM_ERRLIB)
+AC_SUBST(CRYPTOLIB)
+AC_SUBST(KRB5LIB)
+AC_SUBST(DESLIB)
+AC_SUBST(KRB4LIB)
+
 # Solaris requires -lintl if you want strerror (which calls dgettext)
 # to return localized messages.
 AC_CHECK_LIB(intl, dgettext)
@@ -3009,7 +3080,7 @@ echo "  Does Emacs use -lXaw3d?                                 ${HAVE_XAW3D}"
 echo "  Does Emacs use -lXpm?                                   ${HAVE_XPM}"
 echo "  Does Emacs use -ljpeg?                                  ${HAVE_JPEG}"
 echo "  Does Emacs use -ltiff?                                  ${HAVE_TIFF}"
-echo "  Does Emacs use a gif library?                           ${HAVE_GIF} $ac_gif_lib_name"
+echo "  Does Emacs use a gif library?                           ${HAVE_GIF} $LIBGIF"
 echo "  Does Emacs use -lpng?                                   ${HAVE_PNG}"
 echo "  Does Emacs use -lrsvg-2?                                ${HAVE_RSVG}"
 echo "  Does Emacs use -lgpm?                                   ${HAVE_GPM}"
index 0ffd413c1f0d1ad16512c7bf09b25d24e50acb55..c0a0539a0184d9e3d5dc985277043d3b40c4590d 100644 (file)
@@ -6,13 +6,13 @@
        * basic.texi (Inserting Text): Add an index entry for "C-x 8 RET".
        Mention completion provided by `ucs-insert'.
 
-2010-03-28  Chong Yidong  <cyd@stupidchicken.com>
+2010-03-30  Chong Yidong  <cyd@stupidchicken.com>
 
        * sending.texi (Sending Mail): Note variables that may need
        customizing.
        (Mail Sending): Expand discussion of send-mail-function.
 
-2010-03-28  Chong Yidong  <cyd@stupidchicken.com>
+2010-03-30  Chong Yidong  <cyd@stupidchicken.com>
 
        Document Message mode as the default mail mode.
 
@@ -41,7 +41,7 @@
 
        * emacs.texi (Top):  Fix xrefs.
 
-2010-03-25  Chong Yidong  <cyd@stupidchicken.com>
+2010-03-30  Chong Yidong  <cyd@stupidchicken.com>
 
        * maintaining.texi (VC With A Merging VCS): C-x v v now creates a
        repository if there is none.
        * misc.texi (Navigation): Document doc-view-continuous.
        (Shell Ring): Document new M-r binding.  M-s is no longer bound.
 
+2010-03-30  Juri Linkov  <juri@jurta.org>
+
+       * search.texi (Other Repeating Search): Remove line that `occur'
+       can not handle multiline matches.
+
+2010-03-30  Eli Zaretskii  <eliz@gnu.org>
+
+       * mule.texi (International): Mention support of bidirectional editing.
+       (Bidirectional Editing): New section.
+
+2010-03-28  Nick Roberts  <nickrob@snap.net.nz>
+
+       * emacs.texi (Top): Update node names to those in building.texi.
+
+2010-03-27  Nick Roberts  <nickrob@snap.net.nz>
+
+       doc/emacs/building.texi: Describe restored GDB/MI fuctionality removed by 2009-12-29T07:15:34Z!nickrob@snap.net.nz.
+       doc/emacs/emacs.texi: Update node names for building.texi.
+
 2010-03-24  Glenn Morris  <rgm@gnu.org>
 
        * ack.texi (Acknowledgments):
        * xresources.texi (Table of Resources):
        * mule.texi (Defining Fontsets, Charsets): Update xrefs.
 
+2010-03-10  Chong Yidong  <cyd@stupidchicken.com>
+
+       * Branch for 23.2.
+
 2010-03-06  Chong Yidong  <cyd@stupidchicken.com>
 
        * custom.texi (Init Examples): Add xref to Locals.
index 6dbd5abf02635553ec21a6c9a31f9b11fc761f6a..8637641f9e13b9a2532d0a44b1188717aff467af 100644 (file)
@@ -853,18 +853,19 @@ use @kbd{M-x gud-gdb}.  You need to use text command mode to debug
 multiple programs within one Emacs session.
 
 @menu
-* GDB-UI Layout::               Control the number of displayed buffers.
+* GDB User Interface Layout::   Control the number of displayed buffers.
 * Source Buffers::              Use the mouse in the fringe/margin to
                                 control your program.
 * Breakpoints Buffer::          A breakpoint control panel.
+* Threads Buffer::              Displays your threads.
 * Stack Buffer::                Select a frame from the call stack.
-* Other GDB-UI Buffers::        Input/output, locals, registers,
+* Other GDB Buffers::           Input/output, locals, registers,
                                 assembler, threads and memory buffers.
 * Watch Expressions::           Monitor variable values in the speedbar.
-* Reverse Debugging::           Execute and reverse debug your program.
+* Multithreaded Debugging::     Debugging programs with several threads.
 @end menu
 
-@node GDB-UI Layout
+@node GDB User Interface Layout
 @subsubsection GDB User Interface Layout
 @cindex GDB User Interface layout
 
@@ -1014,10 +1015,92 @@ Visit the source line for the current breakpoint
 Visit the source line for the breakpoint you click on.
 @end table
 
+@vindex gdb-show-threads-by-default
 When @code{gdb-many-windows} is non-@code{nil}, the breakpoints buffer
 shares its window with the threads buffer.  To switch from one to the
 other click with @kbd{Mouse-1} on the relevant button in the header
-line.
+line.  If @code{gdb-show-threads-by-default} is non-@code{nil}, the
+threads buffer, rather than the breakpoints buffer, is shown at start
+up.
+
+@node Threads Buffer
+@subsubsection Threads Buffer
+
+@findex gdb-select-thread
+The threads buffer displays a summary of all threads currently in your
+program (@pxref{Threads, Threads, Debugging programs with multiple
+threads, gdb, The GNU debugger}).  Move point to any thread in the list
+and press @key{RET} to select it (@code{gdb-select-thread}) and
+display the associated source in the primary source buffer.
+Alternatively, click @kbd{Mouse-2} on a thread to select it.  Contents
+of all GDB buffers are updated whenever you select a thread.
+
+  You can customize variables under @code{gdb-buffers} group to select
+fields included in threads buffer.
+
+@table @code
+@item gdb-thread-buffer-verbose-names
+@vindex gdb-thread-buffer-verbose-names
+Show long thread names like @samp{Thread 0x4e2ab70 (LWP 1983)} in
+threads buffer.
+
+@item gdb-thread-buffer-arguments
+@vindex gdb-thread-buffer-arguments
+Show arguments of thread top frames in threads buffer.
+
+@item gdb-thread-buffer-locations
+@vindex gdb-thread-buffer-locations
+Show file information or library names in threads buffer.
+
+@item gdb-thread-buffer-addresses
+@vindex gdb-thread-buffer-addresses
+Show addresses for thread frames in threads buffer.
+@end table
+
+  It’s possible to observe information for several threads
+simultaneously (in addition to buffers which show information for
+currently selected thread) using the following keys from the threads
+buffer.
+
+@table @kbd
+@item d
+@kindex d @r{(GDB threads buffer)}
+@findex gdb-display-disassembly-for-thread
+Display disassembly buffer for the thread at current line.
+(@code{gdb-display-disassembly-for-thread})
+
+@item f
+@kindex f @r{(GDB threads buffer)}
+@findex gdb-display-stack-for-thread
+Display stack buffer for the thread at current line.
+(@code{gdb-display-stack-for-thread}).
+
+@item l
+@kindex l @r{(GDB threads buffer)}
+@findex gdb-display-locals-for-thread
+Display locals buffer for the thread at current line.
+(@code{gdb-display-locals-for-thread}).
+
+@item r
+@kindex r @r{(GDB threads buffer)}
+@findex gdb-display-registers-for-thread
+Display registers buffer for the thread at current line.
+(@code{gdb-display-registers-for-thread}).
+@end table
+
+Pressing their upper-case counterparts, @kbd{D}, @kbd{F} ,@kbd{L} and
+@kbd{R} displays the corresponding buffer in a new frame.
+
+  When you create a buffer showing information about some specific
+thread, it becomes bound to that thread and keeps showing actual
+information while you debug your program.  Every GDB buffer contains a
+number of thread it shows information for in its mode name.  Thread
+number is also included in the buffer name of bound buffers to prevent
+buffer names clashing.
+
+Further commands are available in the threads buffer which depend on the
+mode of GDB that is used for controlling execution of your program.
+(@pxref{Multithreaded Debugging, Stopping and Starting Multi-threaded Programs}).
 
 @node Stack Buffer
 @subsubsection Stack Buffer
@@ -1035,7 +1118,7 @@ that stack frame and type @key{RET} (@code{gdb-frames-select}), or click
 selecting a stack frame updates it to display the local variables of the
 new frame.
 
-@node Other GDB-UI Buffers
+@node Other GDB Buffers
 @subsubsection Other Buffers
 
 @table @asis
@@ -1079,21 +1162,6 @@ arrow points to the current instruction, and you can set and remove
 breakpoints as in a source buffer.  Breakpoint icons also appear in
 the fringe or margin.
 
-@item Threads Buffer
-@findex gdb-threads-select
-The threads buffer displays a summary of all threads currently in your
-program (@pxref{Threads, Threads, Debugging programs with multiple
-threads, gdb, The GNU debugger}).  Move point to any thread in the
-list and press @key{RET} to select it (@code{gdb-threads-select}) and
-display the associated source in the primary source buffer.
-Alternatively, click @kbd{Mouse-2} on a thread to select it.  If the
-locals buffer is visible, its contents update to display the variables
-that are local in the new thread.
-
-When there is more than one main thread and the threads buffer is
-present, Emacs displays the selected thread number in the mode line of
-many of the GDB-UI Buffers.
-
 @item Memory Buffer
 The memory buffer lets you examine sections of program memory
 (@pxref{Memory, Memory, Examining memory, gdb, The GNU debugger}).
@@ -1104,9 +1172,9 @@ displays.  Alternatively, use @kbd{S} or @kbd{N} respectively.  Click
 size for these data items.
 @end table
 
-When @code{gdb-many-windows} is non-@code{nil}, the threads buffer
-shares its window with the breakpoints buffer, and the locals buffer
-with the registers buffer.  To switch from one to the other click with
+When @code{gdb-many-windows} is non-@code{nil}, the locals buffer
+shares its window with the registers buffer, just like breakpoints
+and threads buffers. To switch from one to the other click with
 @kbd{Mouse-1} on the relevant button in the header line.
 
 @node Watch Expressions
@@ -1175,26 +1243,96 @@ expressions updates, set @code{gdb-speedbar-auto-raise} to
 non-@code{nil}.  This can be useful if you are debugging with a full
 screen Emacs frame.
 
-@node Reverse Debugging
-@subsubsection Reverse Debugging
-
-  The GDB tool bar shares many buttons with the other GUD debuggers
-for tasks like stepping and printing expressions.  It also has a
-further set of buttons that allow reverse debugging (@pxref{Process
-Record and Replay, , ,gdb, The GNU debugger}).  This is useful when it
-takes a long time to reproduce the conditions where your program fails
-or for transient problems, like race conditions in multi-threaded
-programs, where a failure might otherwise be hard to reproduce.
-
-To use reverse debugging, set a breakpoint slightly before the
-location of interest and run your program to that point.  Enable
-process recording by clicking on the record button.  At this point, a
-new set of buttons appear.  These buttons allow program execution in
-the reverse direction.  Run your program over the code where the
-problem occurs, and then use the new set of buttons to retrace your
-steps, examine values, and analyze the problem.  When analysis is
-complete, turn off process recording by clicking on the record button
-again.
+@node Multithreaded Debugging
+@subsubsection Stopping and Starting Multi-threaded Programs
+@cindex Multithreaded debugging in GDB
+
+@subsubheading All-stop Debugging
+
+In all-stop mode, whenever your program stops, @emph{all} threads of
+execution stop.  Likewise, whenever you restart the program, all
+threads start executing.  @xref{All-Stop Mode, , All-Stop Mode, gdb,
+The GNU debugger}.  You can enable this behaviour in Emacs by setting
+@code{gdb-non-stop-setting} to @code{nil} before starting a debugging
+session.
+
+@subsubheading Non-stop Debugging
+@cindex Non-stop debugging in GDB
+
+For some multi-threaded targets, GDB supports a further mode of
+operation in which you can examine stopped program threads in the
+debugger while other threads continue to execute freely.
+@xref{Non-Stop Mode, , Non-Stop Mode, gdb, The GNU debugger}.
+This is referred to as @dfn{non-stop} mode.
+
+Versions of GDB prior to 7.0 do not support non-stop mode and it does
+not work on all targets.  In such cases, Emacs uses all-stop mode
+regardless of the value of @code{gdb-non-stop-setting}.
+
+@vindex gdb-non-stop-setting
+If the variable @code{gdb-non-stop-setting} is non-@code{nil} (the
+default value), Emacs tries to start GDB in non-stop mode.  Note that
+GDB debugging session needs to be restarted for change of this setting
+to take effect.
+
+@vindex gdb-switch-when-another-stopped
+When a thread stops in non-stop mode, Emacs automatically switches to
+that thread.  It may be undesirable to allow switching of current
+thread when some other stopped thread is already selected.  Set
+@code{gdb-switch-when-another-stopped} to @code{nil} to prevent this.
+
+@vindex gdb-switch-reasons
+Emacs can decide whether or not to switch to the stopped thread
+depending on the reason which caused the stop.  Customize
+@code{gdb-switch-reasons} to select stop reasons which make Emacs
+switch thread.
+
+@vindex gdb-stopped-hooks
+The variable @code{gdb-stopped-hooks} allows you to execute your
+functions whenever some thread stops.
+
+  In non-stop mode, you can switch between different modes for GUD
+execution control commands.
+
+@vindex gdb-gud-control-all-threads
+@table @dfn
+@item Non-stop/A
+
+When @code{gdb-gud-control-all-threads} is @code{t} (the default
+value), interruption and continuation commands apply to all threads,
+so you can halt or continue all your threads with one command using
+@code{gud-stop-subjob} and @code{gud-cont}, respectively.  The
+@samp{Go} button is shown on the toolbar when at least one thread is
+stopped, whereas @samp{Stop} button is shown when at least one thread
+is running.
+
+@item Non-stop/T
+
+When @code{gdb-gud-control-all-threads} is @code{nil}, only the
+current thread is stopped/continued.  @samp{Go} and @samp{Stop}
+buttons on the GUD toolbar are shown depending on the state of current
+thread.
+@end table
+
+You can change the current value of @code{gdb-gud-control-all-threads}
+from the tool bar or from @samp{GUD->GDB-MI} menu.
+
+  Stepping commands always apply to the current thread.
+
+@subsubheading Fine Thread Control
+
+  In non-stop mode, you can interrupt/continue your threads without
+selecting them.  Hitting @kbd{i} in threads buffer interrupts thread
+under point, @kbd{c} continues it, @kbd{s} steps through.  More such
+commands may be added in the future.
+
+Combined with creating bound buffers for any thread, this allows you
+to change and track state of many threads in the same time.
+
+  Note that when you interrupt a thread, it stops with @samp{signal
+received} reason.  If that reason is included in your
+@code{gdb-switch-reasons} (it is by default), Emacs will switch to
+that thread.
 
 @node Executing Lisp
 @section Executing Lisp Expressions
index e480f45ec4e568111a211f9e838d806cbc86055f..6c7f611cf9338fc47606d17bb12c10f39c3a037c 100644 (file)
@@ -5,7 +5,7 @@
 
 @c The edition number appears in several places in this file
 @set EDITION   Sixteenth
-@set EMACSVER  23.1.94
+@set EMACSVER  24.0.50
 
 @copying
 This is the @value{EDITION} edition of the @cite{GNU Emacs Manual},@*
@@ -746,14 +746,16 @@ Running Debuggers Under Emacs
 
 GDB Graphical Interface
 
-* GDB-UI Layout::       Control the number of displayed buffers.
-* Source Buffers::      Use the mouse in the fringe/margin to
-                          control your program.
-* Breakpoints Buffer::  A breakpoint control panel.
-* Stack Buffer::        Select a frame from the call stack.
-* Other GDB-UI Buffers::Input/output, locals, registers,
-                          assembler, threads and memory buffers.
-* Watch Expressions::   Monitor variable values in the speedbar.
+* GDB User Interface Layout::   Control the number of displayed buffers.
+* Source Buffers::              Use the mouse in the fringe/margin to
+                                control your program.
+* Breakpoints Buffer::          A breakpoint control panel.
+* Threads Buffer::              Displays your threads.
+* Stack Buffer::                Select a frame from the call stack.
+* Other GDB Buffers::           Input/output, locals, registers,
+                                assembler, threads and memory buffers.
+* Watch Expressions::           Monitor variable values in the speedbar.
+* Multithreaded Debugging::     Debugging programs with several threads.
 
 Maintaining Large Programs
 
index 1104b2aa8174b190057775ddb3f3d040f4a59b21..be639f45b0aaebb64eeff8a4eb0dea2cd19d5a01 100644 (file)
@@ -66,6 +66,12 @@ displays (@pxref{Terminal Coding}).  If some characters are displayed
 incorrectly, refer to @ref{Undisplayable Characters}, which describes
 possible problems and explains how to solve them.
 
+@item
+Characters from scripts whose natural ordering of text is from right
+to left are reordered for display (@pxref{Bidirectional Editing}).
+These scripts include Arabic, Hebrew, Syriac, Thaana, and a few
+others.
+
 @item
 You can insert non-@acronym{ASCII} characters or search for them.  To do that,
 you can specify an input method (@pxref{Select Input Method}) suitable
@@ -107,6 +113,7 @@ to make sure Emacs interprets keyboard input correctly; see
 * Unibyte Mode::            You can pick one European character set
                               to use without multibyte characters.
 * Charsets::                How Emacs groups its internal character codes.
+* Bidirectional Editing::   Support for right-to-left scripts.
 @end menu
 
 @node International Chars
@@ -1659,6 +1666,84 @@ older Emacs versions.
 point before it and type @kbd{C-u C-x =} (@pxref{International
 Chars}).
 
+@node Bidirectional Editing
+@section Bidirectional Editing
+@cindex bidirectional editing
+@cindex right-to-left text
+
+  Emacs supports editing text written in scripts, such as Arabic and
+Hebrew, whose natural ordering of horizontal text for display is from
+right to left.  However, digits and Latin text embedded in these
+scripts are still displayed left to right.  It is also not uncommon to
+have small portions of text in Arabic or Hebrew embedded in otherwise
+Latin document, e.g., as comments and strings in a program source
+file.  For these reasons, text that uses these scripts is actually
+@dfn{bidirectional}: a mixture of runs of left-to-right and
+right-to-left characters.
+
+  This section describes the facilities and options provided by Emacs
+for editing bidirectional text.
+
+@cindex logical order
+@cindex visual order
+  Emacs stores right-to-left and bidirectional text in the so-called
+@dfn{logical} (or @dfn{reading}) order: the buffer or string position
+of the first character you read precedes that of the next character.
+Reordering of bidirectional text into the @dfn{visual} order happens
+at display time.  As result, character positions no longer increase
+monotonically with their positions on display.  Emacs implements the
+Unicode Bidirectional Algorithm described in the Unicode Standard
+Annex #9, for reordering of bidirectional text for display.
+
+@vindex bidi-display-reordering
+  The buffer-local variable @code{bidi-display-reordering} controls
+whether text in the buffer is reordered for display.  If its value is
+non-@code{nil}, Emacs reorders characters that have right-to-left
+directionality when they are displayed.  The default value is
+@code{nil}.
+
+  Each paragraph of bidirectional text can have its own @dfn{base
+direction}, either right-to-left or left-to-right.  (Paragraph
+boundaries are defined by the regular expressions
+@code{paragraph-start} and @code{paragraph-separate}, see
+@ref{Paragraphs}.)  Text in left-to-right paragraphs begins at the
+left margin of the window and is truncated or continued when it
+reaches the right margin.  By contrast, text in right-to-left
+paragraphs begins at the right margin and is continued or truncated at
+the left margin.
+
+@vindex bidi-paragraph-direction
+  Emacs determines the base direction of each paragraph dynamically,
+based on the text at the beginning of the paragraph.  However,
+sometimes a buffer may need to force a certain base direction for its
+paragraphs.  The variable @code{bidi-paragraph-direction}, if
+non-@code{nil}, disables the dynamic determination of the base
+direction, and instead forces all paragraphs in the buffer to have the
+direction specified by its buffer-local value.  The value can be either
+@code{right-to-left} or @code{left-to-right}.  Any other value is
+interpreted as @code{nil}.
+
+@cindex LRM
+@cindex RLM
+  Alternatively, you can control the base direction of a paragraph by
+inserting special formatting characters in front of the paragraph.
+The special character @code{RIGHT-TO-LEFT MARK}, or @sc{rlm}, forces
+the right-to-left direction on the following paragraph, while
+@code{LEFT-TO-RIGHT MARK}, or @sc{lrm} forces the left-to-right
+direction.  (You can use @kbd{C-x 8 RET} to insert these characters.)
+In a GUI session, the @sc{lrm} and @sc{rlm} characters display as
+blanks.
+
+  Because characters are reordered for display, Emacs commands that
+operate in the logical order or on stretches of buffer positions may
+produce unusual effects.  For example, @kbd{C-f} and @kbd{C-b}
+commands move point in the logical order, so the cursor will sometimes
+jump when point traverses reordered bidirectional text.  Similarly, a
+highlighted region covering a contiguous range of character positions
+may look discontinuous if the region spans reordered text.  This is
+normal and similar to behavior of other programs that support
+bidirectional text.
+
 @ignore
    arch-tag: 310ba60d-31ef-4ce7-91f1-f282dd57b6b3
 @end ignore
index 8c49a3fa699cdc71ad9a156ce7cdfad084785628..890dd48df9f6ad8869bd5b7496a8a377fc282b59 100644 (file)
@@ -1311,8 +1311,7 @@ Prompt for a regexp, and display a list showing each line in the
 buffer that contains a match for it.  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.
+displayed before and after each matching line.
 
 @kindex RET @r{(Occur mode)}
 @kindex o @r{(Occur mode)}
index e683cc1054fef9e15d27493e4b681b892abbf49b..23e5a6976b70ee9fff74968dcdd64abe71e9c49e 100644 (file)
@@ -1,3 +1,7 @@
+2010-03-10  Chong Yidong  <cyd@stupidchicken.com>
+
+       * Branch for 23.2.
+
 2010-02-16  Glenn Morris  <rgm@gnu.org>
 
        * emacs-lisp-intro.texi: Fix typo in name of `find-tag' command.
index fd5fe0e5262d71ed13987199121454e73f1f924d..21f400948dc1a87c3e8bfdf885299c45965085d9 100644 (file)
@@ -7,10 +7,18 @@
 
        * frames.texi (Cursor Parameters): Fix typo.  (Bug#5760)
 
-2010-03-21  Chong Yidong  <cyd@stupidchicken.com>
+2010-03-24  Chong Yidong  <cyd@stupidchicken.com>
 
        * processes.texi (Network Processes): Document seqpacket type.
 
+2010-03-20  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * os.texi (System Environment): Do not mention lynxos.
+
+2010-03-10  Chong Yidong  <cyd@stupidchicken.com>
+
+       * Branch for 23.2.
+
 2010-03-06  Chong Yidong  <cyd@stupidchicken.com>
 
        * objects.texi (Integer Type): Take note of the read syntax
index 097513778fd0b2b280cb818dc92fdb32727cc707..732df503ec012982e05b4eb69d83bd172e13c1fa 100644 (file)
@@ -11,7 +11,7 @@
 @center @titlefont{GNU Emacs Lisp Reference Manual}
 @sp 5
 @center GNU
-@center Emacs Version 23.1.94
+@center Emacs Version 24.0.50
 @center for Unix Users
 @sp 5
 
index aba6fa2ef149c9981a182a51fb338868f5626ade..8d20ed6a9701953b87fff5f3e10f33f0467e9856 100644 (file)
@@ -8,7 +8,7 @@
 @c Please remember to update the edition number in README as well.
 @c And also the copies in vol1.texi and vol2.texi.
 @set VERSION  3.0
-@set EMACSVER 23.1.94
+@set EMACSVER 24.0.50
 @set DATE July 2009
 
 @c in general, keep the following line commented out, unless doing a
index b0c241cf918a43070ba9266f910decd89d5b7c46..9fbc51ae12fd8f90a2f535d41d95702533c66f38 100644 (file)
@@ -786,9 +786,6 @@ Hewlett-Packard HPUX operating system.
 @item irix
 Silicon Graphics Irix system.
 
-@item lynxos 3.0.1
-LynxOS-3.0.1.
-
 @item ms-dos
 Microsoft MS-DOS ``operating system.''  Emacs compiled with DJGPP for
 MS-DOS binds @code{system-type} to @code{ms-dos} even when you run it on
index 9eb4fed6badd88aa78863715236bb2602d88ec54..a0590c3d282387e2961bded1bf702071c580d7bb 100644 (file)
@@ -27,7 +27,7 @@
 @c Version of the manual and of Emacs.
 @c Please remember to update the edition number in README as well.
 @set VERSION  3.0
-@set EMACSVER 23.1.94
+@set EMACSVER 24.0.50
 @set DATE July 2009
 
 @dircategory Emacs
index 01424c47cbda91c4d63d9630ac35e01e777bdcba..ad4c74611a84296b64900064c6379137d9a2b6d3 100644 (file)
@@ -27,7 +27,7 @@
 @c Version of the manual and of Emacs.
 @c Please remember to update the edition number in README as well.
 @set VERSION  3.0
-@set EMACSVER 23.1.94
+@set EMACSVER 24.0.50
 @set DATE July 2009
 
 @dircategory Emacs
index 84ce0044cea0ab36f6f166e8f92485c5a14f58bd..e9313979d9522130099ce1ef0e3e65b10b81b4a0 100644 (file)
@@ -1,3 +1,7 @@
+2010-03-10  Chong Yidong  <cyd@stupidchicken.com>
+
+       * Branch for 23.2.
+
 2010-01-09  Chong Yidong  <cyd@stupidchicken.com>
 
        * emacs.1: Copyedits.  Update options -Q, -mm and --daemon.  Remove
index 98ffcdbb77fd1067a944410ddd46b191a76536ea..15b7a73259bf77c89def0f425f59bc5607246ede 100644 (file)
@@ -1,5 +1,5 @@
 .\" See section COPYING for copyright and redistribution information.
-.TH EMACS 1 "2007 April 13" "GNU Emacs 23.1.94"
+.TH EMACS 1 "2007 April 13" "GNU Emacs 24.0.50"
 .
 .
 .SH NAME
index 1cf6cc8f6ffae85de6f2daf7ec73e09e279e5639..95dea96487d0b2e2d7e2ccad1913250a3aca4e08 100644 (file)
@@ -1,7 +1,21 @@
-2010-03-14  Michael Albinus  <michael.albinus@gmx.de>
+2010-03-31  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (MIME Commands): Update description of
+       gnus-article-browse-html-article.
+
+2010-03-27  Teodor Zlatanov  <tzz@lifelogs.com>
+
+       * auth.texi (Secret Service API): Add TODO node.
+       (Help for users): Explain the new source options for `auth-sources'.
+
+2010-03-24  Michael Albinus  <michael.albinus@gmx.de>
 
        * trampver.texi: Update release number.
 
+2010-03-10  Chong Yidong  <cyd@stupidchicken.com>
+
+       * Branch for 23.2.
+
 2010-03-03  Chong Yidong  <cyd@stupidchicken.com>
 
        * faq.texi (Escape sequences in shell output): Note that ansi-color is
index dd588be2a395d69589a9b7722e95754e4cb13c4d..a2c319c583f7b1660c75c19253db0b7ed77fd5bf 100644 (file)
@@ -57,6 +57,7 @@ It is a way for multiple applications to share a single configuration
 @menu
 * Overview::                    Overview of the auth-source library.
 * Help for users::              
+* Secret Service API::          
 * Help for developers::         
 * Index::                       
 * Function Index::              
@@ -68,15 +69,15 @@ It is a way for multiple applications to share a single configuration
 @chapter Overview
 
 The auth-source library is simply a way for Emacs and Gnus, among
-others, to find the answer to the old burning question ``I have a
-server name and a port, what are my user name and password?''
+others, to answer the old burning question ``I have a server name and
+a port, what are my user name and password?''
 
 The auth-source library actually supports more than just the user name
 (known as the login) or the password, but only those two are in use
-today in Emacs or Gnus.  Similarly, the auth-source library can in
-theory support multiple storage formats, but currently it only
-understands the classic ``netrc'' format, examples of which you can
-see later in this document.
+today in Emacs or Gnus.  Similarly, the auth-source library supports
+multiple storage formats, currently either the classic ``netrc''
+format, examples of which you can see later in this document, or the
+Secret Service API.
 
 @node Help for users
 @chapter Help for users
@@ -120,17 +121,21 @@ auth-source library is not loaded for some other reason.
 @defvar auth-sources
 
 The @code{auth-sources} variable tells the auth-source library where
-your netrc files live for a particular host and protocol.  While you
-can get fancy, the default and simplest configuration is:
+your netrc files or Secret Service API collection items live for a
+particular host and protocol.  While you can get fancy, the default
+and simplest configuration is:
 
 @lisp
+;;; old default: required :host and :protocol, not needed anymore
 (setq auth-sources '((:source "~/.authinfo.gpg" :host t :protocol t)))
+;;; mostly equivalent (see below about fallbacks) but shorter:
+(setq auth-sources '((:source "~/.authinfo.gpg")))
 @end lisp
 
 This says ``for any host and any protocol, use just that one file.''
-Sweet simplicity.  In fact, this is already the default, so unless you
-want to move your netrc file, it will just work if you have that
-file.  You may not, though, so make sure it exists.
+Sweet simplicity.  In fact, the latter is already the default, so
+unless you want to move your netrc file, it will just work if you have
+that file.  Make sure it exists.
 
 By adding multiple entries to @code{auth-sources} with a particular
 host or protocol, you can have specific netrc files for that host or
@@ -138,6 +143,35 @@ protocol.  Usually this is unnecessary but may make sense if you have
 shared netrc files or some other unusual setup (90% of Emacs users
 have unusual setups and the remaining 10% are @emph{really} unusual).
 
+Here's an example that uses the Secret Service API for all lookups,
+using the default collection:
+
+@lisp
+(setq auth-sources '((:source (:secrets default))))
+@end lisp
+
+And here's a mixed example, using two sources:
+
+@lisp
+(setq auth-sources '((:source (:secrets default) :host "myserver" :user "joe")
+                     (:source "~/.authinfo.gpg")))
+@end lisp
+
+The best match is determined by order (starts from the bottom) only
+for the first pass, where things are checked exactly.  In the example
+above, the first pass would find a single match for host
+@code{myserver}.  The netrc choice would fail because it matches any
+host and protocol implicitly (as a @emph{fallback}).  A specified
+value of @code{:host t} in @code{auth-sources} is considered a match
+on the first pass, unlike a missing @code{:host}.
+
+Now if you look for host @code{missing}, it won't match either source
+explicitly.  The second pass (the @emph{fallback} pass) will look at
+all the implicit matches and collect them.  They will be scored and
+returned sorted by score.  The score is based on the number of
+explicit parameters that matched. See the @code{auth-pick} function
+for details.
+
 @end defvar
 
 If you don't customize @code{auth-sources}, you'll have to live with
@@ -190,25 +224,32 @@ don't use a port entry, you match any Tramp method, as explained
 earlier.  Since Tramp has about 88 connection methods, this may be
 necessary if you have an unusual (see earlier comment on those) setup.
 
+@node Secret Service API
+@chapter Secret Service API
+
+TODO: how does it work generally, how does secrets.el work, some examples.
+
 @node Help for developers
 @chapter Help for developers
 
 The auth-source library only has one function for external use.
 
-@defun auth-source-user-or-password mode host port
+@defun auth-source-user-or-password mode host port &optional username
 
 Retrieve appropriate authentication tokens, determined by @var{mode},
-for host @var{host} and @var{port}.  If @code{auth-source-debug} is t,
-debugging messages will be printed.  Set @code{auth-source-debug} to a
-function to use that function for logging.  The parameters passed will
-be the same that the @code{message} function takes, that is, a string
+for host @var{host} and @var{port}.  If @var{username} is provided it
+will also be checked.  If @code{auth-source-debug} is t, debugging
+messages will be printed.  Set @code{auth-source-debug} to a function
+to use that function for logging.  The parameters passed will be the
+same that the @code{message} function takes, that is, a string
 formatting spec and optional parameters.
 
 If @var{mode} is a list of strings, the function will return a list of
 strings or @code{nil} objects (thus you can avoid parsing the netrc
-file more than once).  If it's a string, the function will return a
-string or a @code{nil} object.  Currently only the modes ``login'' and
-``password'' are recognized but more may be added in the future.
+file or checking the Secret Service API more than once).  If it's a
+string, the function will return a string or a @code{nil} object.
+Currently only the modes ``login'' and ``password'' are recognized but
+more may be added in the future.
 
 @var{host} is a string containing the host name.
 
@@ -216,6 +257,8 @@ string or a @code{nil} object.  Currently only the modes ``login'' and
 a port number.  It must be a string, corresponding to the port in the
 users' netrc files.
 
+@var{username} contains the user name (e.g. ``joe'') as a string.
+
 @example
 ;; IMAP example
 (setq auth (auth-source-user-or-password
index 4850dc0e3457816045a5d43cd8114dac9a862fc7..924240aeb536cbf0d6a28654ea64752cc0fd477c 100644 (file)
@@ -5,7 +5,7 @@
 @c %**end of header
 
 @c This is used in many places
-@set VER 23.1.94
+@set VER 24.0.50
 
 @c This file is maintained by Romain Francoise <rfrancoise@gnu.org>.
 @c Feel free to install changes without prior permission (but I'd
index 75720a94da189314b3d94a184a74c61220254815..cc0fb6e822e784b35e0124b7c8f478eaf691382b 100644 (file)
@@ -10506,17 +10506,24 @@ the same manner:
 @kindex K H (Summary)
 @findex gnus-article-browse-html-article
 View @samp{text/html} parts of the current article with a WWW browser.
-The message header is added to the beginning of every html part unless
-the prefix argument is given.
+Inline images embedded in a message using the @code{cid} scheme, as they
+are generally considered to be safe, will be processed properly.  The
+message header is added to the beginning of every @acronym{HTML} part
+unless the prefix argument is given.
 
-Warning: Spammers use links to images in HTML articles to verify whether
-you have read the message.  As this command passes the @acronym{HTML}
-content to the browser without eliminating these ``web bugs'' you should
-only use it for mails from trusted senders.
+Warning: Spammers use links to images (using the @code{http} scheme) in
+@acronym{HTML} articles to verify whether you have read the message.  As
+this command passes the @acronym{HTML} content to the browser without
+eliminating these ``web bugs'' you should only use it for mails from
+trusted senders.
 
 If you always want to display @acronym{HTML} parts in the browser, set
 @code{mm-text-html-renderer} to @code{nil}.
 
+This command creates temporary files to pass @acronym{HTML} contents
+including images if any to the browser, and deletes them when exiting
+the group (if you want).
+
 @item K b
 @kindex K b (Summary)
 Make all the @acronym{MIME} parts have buttons in front of them.  This is
index c468c45baa2cef24860188b63941d1f40bec1e1c..9e2f9b8f7d14bc0e4230e848a1830458cf9d3b00 100644 (file)
@@ -1,18 +1,45 @@
-2010-03-28  Chong Yidong  <cyd@stupidchicken.com>
+2010-03-30  Chong Yidong  <cyd@stupidchicken.com>
 
        * images/icons/hicolor/scalable/apps/emacs.svg: Put preamble after
        svg tag (Bug#5790).
 
-2010-03-27  Eli Zaretskii  <eliz@gnu.org>
+2010-03-30  Eli Zaretskii  <eliz@gnu.org>
 
        * PROBLEMS: Mention problems on MS-Windows with incompatible
        regex.h headers.
 
-2010-03-15  Francesc Rocher  <rocher@member.fsf.org>
+2010-03-28  Eli Zaretskii  <eliz@gnu.org>
+
+       * HELLO: Reorder Arabic and Hebrew into logical order, and
+       insert RLM before the opening paren, to make the display more
+       reasonable.  Add setting for bidi-display-reordering in the local
+       variables section.
+       * NEWS: Mention initial support for bidirectional editing.
+
+2010-03-24  Francesc Rocher  <rocher@member.fsf.org>
 
        * MORE.STUFF: Remove CEDET entry, now distributed as part of
        Emacs.
 
+2010-03-22  Teodor Zlatanov  <tzz@lifelogs.com>
+
+       * gnus/gnus-setup.ast: Add finish links to the top nodes.
+
+       * gnus/news-server.ast: Add some trivial validation.
+
+2010-03-13  Michael Albinus  <michael.albinus@gmx.de>
+
+       * NEWS: Add secrets.el.
+
+2010-03-12  Chong Yidong  <cyd@stupidchicken.com>
+
+       * images/custom/down.xpm, images/custom/right.xpm: Update images
+       to increase contrast on bright backgrounds.
+
+2010-03-10  Chong Yidong  <cyd@stupidchicken.com>
+
+       * Branch for 23.2.
+
 2010-03-06  Glenn Morris  <rgm@gnu.org>
 
        * srecode/default.srt (COPYRIGHT): Update template copyright to GPLv3+.
index 0f582f6c40866398b119837c5b6069c05da58d75..9e0c66a02410b6f2275080b8b7d33a7c63ba7a4c 100644 (file)
--- a/etc/HELLO
+++ b/etc/HELLO
@@ -16,7 +16,7 @@ Non-ASCII examples:
 LANGUAGE (NATIVE NAME) HELLO
 ---------------------- -----
 Amharic (\e$,1O M[MmN{\e(B)      \e$,1M`MKM]\e(B
-Arabic (\e,GIqjHQYdG\e(B)        \e,GecjdY\e(B \e,GeGdqSdG\e(B
+Arabic \e$,1ro\e(B(\e,GGdYQHjqI\e(B)       \e,GecjdY\e(B \e,GeGdqSdG\e(B
 Bengali (\e$,17,7>6b727>\e(B)    \e$,17(7.787M6u7>70\e(B
 Braille        \e$,2(3(1('('(5\e(B
 Burmese (\e$,1H9HYH;H4HYrlH9HL\e(B)      \e$,1H9H$HYrmH"H<HLH5HL\e(B
@@ -34,7 +34,7 @@ Georgian (\e$,1JEJ0J@J7J5J4J:J8\e(B)    \e$,1J2J0J;J0J@JOJ=J1J0\e(B
 German (Deutsch)       Guten Tag / Gr\e,A|_\e(B Gott
 Greek (\e,Fekkgmij\\e(B) \e,FCei\\e(B \e,Fsar\e(B
 Gujarati (\e$,19W:!9\9p9~9d: \e(B)       \e$,19h9n9x:-9d:'\e(B
-Hebrew (\e,Hzixar\e(B)   \e,Hylem\e(B
+Hebrew \e$,1ro\e(B(\e$,1-",q-(,y-*\e(B)    \e,Hylem\e(B
 Hungarian (magyar)     Sz\e,Bi\e(Bp j\e,Bs\e(B napot!
 Hindi (\e$,15y5\7f5B5f6 \e(B)      \e$,15h5n5x6-5d6'\e(B / \e$,15h5n5x6-5U5~5p\e(B \e$,16D\e(B
 Italian (italiano)     Ciao / Buon giorno
@@ -91,4 +91,5 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
 
 ;;; Local Variables:
 ;;; tab-width: 32
+;;; bidi-display-reordering: t
 ;;; End:
index 4fba24d9516a8198d72d23356134aa95b01fb5e1..febdcfdc5f46cf6f40f4cea18cc3005e2e650d24 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1,15 +1,15 @@
 GNU Emacs NEWS -- history of user-visible changes.
 
-Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+Copyright (C) 2010 Free Software Foundation, Inc.
 See the end of the file for license conditions.
 
 Please send Emacs bug reports to bug-gnu-emacs@gnu.org.
 If possible, use M-x report-emacs-bug.
 
-This file is about changes in Emacs version 23.
+This file is about changes in Emacs version 24.
 
-See files NEWS.22, NEWS.21, NEWS.20, NEWS.19, NEWS.18, and NEWS.1-17
-for changes in older Emacs versions.
+See files NEWS.23, NEWS.22, NEWS.21, NEWS.20, NEWS.19, NEWS.18,
+and NEWS.1-17 for changes in older Emacs versions.
 
 You can narrow news to a specific version by calling `view-emacs-news'
 with a prefix argument or by typing C-u C-h C-n.
@@ -22,2382 +22,131 @@ When you add a new item, please add it without either +++ or ---
 so we will look at it and add it to the manual.
 
 \f
-* Installation Changes in Emacs 23.2
+* Installation Changes in Emacs 24.1
 
-** New configure options for Emacs developers
-These are not new features; only the configure flags are new.
 ---
-*** --enable-profiling builds Emacs with profiling enabled.
-This might not work on all platforms.
----
-*** --enable-checking[=OPTIONS] builds emacs with extra runtime checks.
-
----
-** `make install' now consistently ignores umask, creating a
-world-readable install.
-
-** Emacs compiles with Gconf support, if it is detected.
-Use the configure option --without-gconf to disable this.
-
-* Startup Changes in Emacs 23.2
-+++
-** The command-line option -Q (--quick) also inhibits loading X resources.
-However, if Emacs is compiled with the Lucid or Motif toolkit, X
-resource settings for the graphical widgets are still applied.
-On Windows, the -Q option causes Emacs to ignore Registry settings,
-but environment variables set on the Registry are still honored.
-+++
-*** The new variable `inhibit-x-resources' shows whether X resources
-were loaded.
-
-+++
-** New command-line option -mm (--maximized) maximizes the initial frame.
-
-* Changes in Emacs 23.2
-
-+++
-** The maximum size of buffers (and the largest fixnum) is doubled.
-On typical 32bit systems, buffers can now be up to 512MB.
-
----
-** The default value of `trash-directory' is now nil.
-This means that `move-file-to-trash' trashes files according to
-freedesktop.org specifications, the same method used by the Gnome,
-KDE, and XFCE desktops.  (This change has no effect on Windows, which
-uses `system-move-file-to-trash' for trashing.)
-
-+++
-** The pointer now becomes invisible when typing.
-Customize `make-pointer-invisible' to disable this feature.
-
-** Font changes
-+++
-*** Emacs can use the system default monospaced font in Gnome.
-To enable this feature, set `font-use-system-font' to non-nil (it is
-nil by default).  If the system default changes, Emacs changes also.
-This feature requires Gconf support, which is automatically included
-at compile-time if configure detects the gconf libraries (you can
-disable this with the configure option --without-gconf).
----
-*** On X11, Emacs reacts to Xft changes made by configuration tools,
-via the XSETTINGS mechanism.  This includes antialias, hinting,
-hintstyle, RGBA, DPI and lcdfilter changes.
-
-+++
-** Killing a buffer with a running process now asks for confirmation.
-To remove this query, remove `process-kill-buffer-query-function' from
-`kill-buffer-query-functions', or set the appropriate process flag
-with `set-process-query-on-exit-flag'.
-
-** File-local variable changes
-+++
-*** Specifying a minor mode as a local variables enables that mode,
-unconditionally.  The previous behavior, toggling the mode, was
-neither reliable nor generally desirable.
-
-*** New commands for adding and removing file-local variables:
-`add-file-local-variable', `delete-file-local-variable',
-`add-file-local-variable-prop-line', and
-`delete-file-local-variable-prop-line'.
-
-*** New commands for adding and removing directory-local variables,
-and copying them to and from file-local variable lists:
-`add-dir-local-variable', `delete-dir-local-variable',
-`copy-dir-locals-to-file-locals',
-`copy-dir-locals-to-file-locals-prop-line' and
-`copy-file-locals-to-dir-locals'.
-
-** Internationalization changes
-+++
-*** Unibyte sessions are now considered obsolete.
-This refers to the EMACS_UNIBYTE environment variable as well as the
---unibyte, --multibyte, --no-multibyte, and --no-unibyte command line
-arguments.  Customizing enable-multibyte-characters and setting
-default-enable-multibyte-characters are also deprecated.
----
-*** New coding system `utf-8-hfs'.
-This is suitable for default-file-name-coding-system on Mac OS X; see
-international/ucs-normalize.el.
-
----
-** Function arguments in *Help* buffers are now shown in upper-case.
-Customize `help-downcase-arguments' to t to show them in lower-case.
-
-\f
-* Editing Changes in Emacs 23.2
-
-** Kill-ring and selection changes
-+++
-*** If `select-active-regions' is t, any active region automatically
-becomes the primary selection (for interaction with other window
-applications).  If you enable this, you might want to bind
-`mouse-yank-primary' to Mouse-2.
-+++
-*** When `save-interprogram-paste-before-kill' is non-nil, the kill
-commands save the interprogram-paste selection into the kill ring
-before doing anything else.  This avoids losing the selection.
-+++
-*** When `kill-do-not-save-duplicates' is non-nil, identical
-subsequent kills are not duplicated in the `kill-ring'.
-
-** Completion changes
-
-*** The new command `completion-at-point' provides mode-sensitive completion.
-+++
-*** tab-always-indent set to `complete' lets TAB do completion as well.
-+++
-*** The new completion-style `initials' is available.
-For instance, this can complete M-x lch to list-command-history.
----
-*** The new variable `completions-format' determines how completions
-are displayed in the *Completions* buffer.  If you set it to
-`vertical', completions are sorted vertically in columns.
-
-+++
-** The default value of `blink-matching-paren-distance' is increased.
-
----
-** M-n provides more default values in the minibuffer for commands
-that read file names.  These include the file name at point (when ffap
-is loaded without ffap-bindings), the file name on the current line
-(in Dired buffers), and the directory names of adjacent Dired windows
-(for Dired commands that operate on several directories, such as copy,
-rename, or diff).
-
-+++
-** M-r is bound to the new `move-to-window-line-top-bottom'.
-This moves point to the window center, top and bottom on successive
-invocations, in the same spirit as the C-l (recenter-top-bottom)
-command.
-
-+++
-** The new variable `recenter-positions' determines the default
-cycling order of C-l (`recenter-top-bottom').
-
-+++
-** The abbrevs file is now a file named abbrev_defs in
-user-emacs-directory; but the old location, ~/.abbrev_defs, is used if
-that file exists.
-\f
-* Changes in Specialized Modes and Packages in Emacs 23.2
-
-** The bookmark menu has a narrowing search via bookmark-bmenu-search.
-
-** LaTeX mode now provides completion (via completion-at-point).
-
----
-** sym-comp.el is now declared obsolete, superceded by completion-at-point.
-
-** lucid.el and levents.el are now declared obsolete.
-
-** pcomplete provides a new command `pcomplete-std-completion' which
-is similar to `pcomplete' but using the standard completion UI code.
-
-** Calc
-+++
-*** The Calc settings file is now a file named calc.el in
-user-emacs-directory; but the old location, ~/.calc.el, is used if
-that file exists.
----
-*** Graphing commands (`g f' etc.) now work on MS-Windows, if you have
-the native Windows port of Gnuplot version 3.8 or later installed.
-
-** Calendar and diary
-+++
-*** Fancy diary display is now the default.
-If you prefer the simple display, customize `diary-display-function'.
-+++
-*** The diary's fancy display now enables view-mode.
----
-*** The command `calendar-current-date' accepts an optional argument
-giving an offset from today.
-
-** Desktop
----
-*** The default value for `desktop-buffers-not-to-save' is nil.
-This means Desktop will try restoring all buffers, when you restart
-your Emacs session.  Also, `desktop-buffers-not-to-save' is only
-effective for buffers that have no associated file.  If you want to
-exempt buffers that do correspond to files, customize the value of
-`desktop-files-not-to-save' instead.
-
-** Dired
-+++
-*** The new variable `dired-auto-revert-buffer', if non-nil, causes
-Dired buffers to be reverted automatically on revisiting them.
-
-** DocView
-+++
-*** When `doc-view-continuous' is non-nil, scrolling a line
-on the page edge advances to the next/previous page.
-
-** GDB-UI
-
-*** Toolbar functionality for reverse debugging.  Display of STL
-collections as watch expressions.  These features require GDB 7.0
-or later.
-
-** Grep
-+++
-*** A new command `zrgrep' searches recursively in gzipped files.
-
-** Info
-
-*** The new command `Info-virtual-index' bound to "I" displays a menu of
-matched topics found in the index.
-
-*** The new command `info-finder' replaces finder.el with a virtual Info
-manual that generates an Info file which gives the same information
-through a menu structure.
-
-+++
-** Message mode is now the default mode for composing mail.
-
-The default for `mail-user-agent' is now message-user-agent, so the
-C-x m (`compose-mail') command uses Message mode instead of Mail mode.
-
-Message mode has been included in Emacs, as part of the Gnus package,
-for several years.  It provides several features that are absent in
-Mail mode, such as MIME handling.
-
----
-*** If the user has not customized mail-user-agent, `compose-mail'
-checks for Mail mode customizations, and issues a warning if these
-customizations are found.  This alerts users who may otherwise be
-unaware that their mail configuration has changed.
-
-To disable this check, set compose-mail-user-agent-warnings to nil.
-
-** The default value of mail-interactive is t, since Emacs 23.1.
-(This was not announced at the time.)  It means that when sending mail,
-Emacs will wait for the process sending mail to return.  If you
-experience delays when sending mail, you may wish to set this to nil.
-
-+++
-** nXML mode is now the default for editing XML files.
-
-** Shell (and other comint modes)
-+++
-*** M-s is no longer bound to `comint-next-matching-input'.
-+++
-*** M-r is now bound to `comint-history-isearch-backward-regexp'.
-This starts an incremental search of the comint/shell input history.
-+++
-*** ansi-color is now enabled by default in Shell mode.
-To disable it, set ansi-color-for-comint-mode to nil.
-
-** Tramp
-+++
-*** New connection methods "rsyncc", "imap" and "imaps".
-On systems which support GVFS-Fuse, Tramp offers also the new
-connection methods "dav", "davs", "obex" and "synce".
-
-** VC and related modes
-+++
-*** When using C-x v v or C-x v i on a unregistered file that is in a
-directory not controlled by any VCS, ask the user what VC backend to
-use to create a repository, create a new repository and register the
-file.
-+++
-*** New command `vc-root-print-log', bound to `C-x v L'.
-This displays a `*vc-change-log*' buffer showing the history of the
-version-controlled directory tree as a whole.
-+++
-*** New command `vc-root-diff', bound to `C-x v D'.
-This is similar to `vc-diff', but compares the entire directory tree
-of the current VC directory with its working revision.
-+++
-*** `C-x v l' and `C-x v L' do not show the full log by default.
-The number of entries shown can be chosen interactively with a prefix
-argument, or by customizing vc-log-show-limit.  The `*vc-change-log*'
-buffer now contains buttons at the end of the buffer, which can be
-used to increase the number of entries shown.  RCS, SCCS, and CVS do
-not support this feature.
----
-*** vc-annotate supports annotations through file copies and renames,
-it displays the old names for the files and it can show logs/diffs for
-the corresponding lines.  Currently only Git and Mercurial take
-advantage of this feature.
----
-*** The log command in vc-annotate can display a single log entry
-instead of redisplaying the full log.  The RCS, CVS and SCCS VC
-backends do not support this.
----
-*** When a file is not found, VC will not try to check it out of RCS anymore.
-
-*** Diff and log operations can be used from Dired buffers.
-
-*** vc-git changes
-
-**** The short log format for git makes use of the graph display, so
-it's not supported on git versions earlier than 1.5.
-
-**** Support for operating with stashes has been added to vc-dir: the stash list is
-displayed in the *vc-dir* header, stashes can be created, removed, applied and
-their content displayed.
-
-**** vc-dir displays the stash status
-
-**** vc-dir requires at least git-1.5.5.
-
-*** vc-bzr supports operating with shelves: the shelve list is
-displayed in the *vc-dir* header, shelves can be created, removed and applied.
----
-*** log-edit-strip-single-file-name controls whether or not single filenames
-are stripped when copying text from the ChangeLog to the *VC-Log* buffer.
-
-** Elint
----
-*** Elint now uses compilation-mode.
----
-*** Elint can now scan individual files and whole directories,
-and can be run in batch mode.
----
-*** Elint does a more thorough initialization, and recognizes more built-in
-functions and variables.  Customize `elint-scan-preloaded' if you want
-to sacrifice some accuracy for a faster startup.
----
-*** Elint attempts some basic understanding of featurep and (f)boundp tests.
----
-*** Customize `elint-ignored-warnings' to suppress some warnings.
-
-** Miscellaneous
-+++
-*** The new command `async-shell-command' bound globally to `M-&' executes
-the command asynchronously without the need to manually add ampersand to
-the end of the command.  Its output appears in the buffer `*Async Shell
-Command*'.
-+++
-*** Interactively `multi-isearch-buffers' and `multi-isearch-buffers-regexp'
-read buffer names to search, one by one, ended with RET.  With a prefix
-argument, they ask for a regexp, and search in buffers whose names match
-the specified regexp.  Interactively `multi-isearch-files' and
-`multi-isearch-files-regexp' read file names to search, one by one,
-ended with RET.  With a prefix argument, they ask for a wildcard, and
-search in file buffers whose file names match the specified wildcard.
-+++
-*** Autorevert Tail mode now works also for remote files.
-+++
-*** The new built-in commands `su' and `sudo' support Tramp.
-That means, they change `default-directory' to the new users value,
-and let commands run under that user permissions.  It works even when
-`default-directory' is already remote.  Calling the external commands
-is possible by `*su' or `*sudo', repectively.
----
-*** When running in a new enough xterm (newer than version 242), Emacs
-asks xterm what the background color is and it sets up faces
-accordingly for a dark background if needed (the current default is to
-consider the background light).
-
-\f
-* New Modes and Packages in Emacs 23.2
-
-** CEDET (the Collection of Emacs Development Tools) is now in Emacs.
-This is a collection of packages to aid with using Emacs as an IDE
-(integrated development environment):
-
-*** The Semantic package allows the use of parsers to intelligently
-edit and navigate source code.  Parsers for C/C++, Java, Javascript,
-and several other languages are included by default, and Semantic can
-also interface with external tools such as GNU Global and GNU Idutils.
-
-To enable Semantic, use the global minor mode `semantic-mode'.
-See the Semantic manual for details.
-
-*** EDE (Emacs Development Environment) is a package for managing code
-projects, including features such as automatic Makefile generation.
-
-To enable EDE, use the minor mode `global-ede-mode'.
-See the EDE manual for details.
-
-*** SRecode is a library for recoding Semantic tags back into source
-code.  It is currently used by some parts of Semantic and EDE; in the
-future, it may be used for code generation features.
-
-*** The EIEIO library implements a subset of the Common Lisp Object
-System (CLOS).  It is used by the other CEDET packages.
-
-** mpc.el is a front end for the Music Player Daemon.  Run it with M-x mpc.
-
-** htmlfontify.el turns a fontified Emacs buffer into an HTML page.
-
-+++
-** js.el is a new major mode for JavaScript files.
-
-** imap-hash.el is a new library to address IMAP mailboxes as hashtables.
-
-\f
-* Incompatible Lisp Changes in Emacs 23.2
-
-+++
-** The Lisp reader turns integers that are too large/small into floats.
-For instance, on machines where `536870911' is the largest integer,
-reading `536870912' gives the floating-point object `536870912.0'.
-
-This change only concerns the Lisp reader; it does not affect how
-actual integer objects overflow.
-
----
-** Several obsolete functions removed.
-The functions have been obsolete since Emacs 19, and are unlikely to
-be in use:
-
-  time-stamp-month-dd-yyyy, time-stamp-dd/mm/yyyy, time-stamp-mon-dd-yyyy
-  time-stamp-dd-mon-yy, time-stamp-yy/mm/dd, time-stamp-yyyy/mm/dd,
-  time-stamp-yyyy-mm-dd, time-stamp-yymmdd, time-stamp-hh:mm:ss,
-  time-stamp-hhmm, baud-rate
-
----
-** Support for generating Emacs 18 compatible bytecode (by setting
-the variable `byte-compile-compatibility') has been removed.
-
-** In image-mode.el `image-mode-maybe' is obsolete.  Instead, you can
-either use `image-mode' that displays an image file as the actual image
-inititally, or `image-mode-as-text' when you want to display an image file
-as text inititally.  `image-mode-as-text' is a combination of a non-image
-mode from `auto-mode-alist' (or Fundamental mode) and `image-minor-mode'.
-`image-minor-mode' provides `C-c C-c' key binding to toggle image display.
-`image-toggle-display-text' removes image properties.
-`image-toggle-display-image' adds image properties.
-`image-toggle-display' toggles between `image-mode-as-text' and
-`image-mode'.
-
-\f
-* Lisp changes in Emacs 23.2
-
-** All the default-FOO variables that hold the default value of the FOO
-variable, are now declared obsolete.
-
-** read-key is a function halfway between read-event and read-key-sequence.
-It reads a single key, but obeys input and escape sequence decoding.
-
-** Frame parameter changes
-+++
-*** You can give the `fullscreen' frame parameter the value `maximized'.
-This maximizes the frame.
-+++
-*** The new frame parameter `sticky' makes Emacs frames sticky in
-virtual desktops.
-
-** Completion changes
-
-*** completion-base-size is obsoleted by completion-base-position.
-This change causes a few backward incompatibilities, mostly with
-choose-completion-string-functions where the `mini-p' argument has
-been replaced by a `base-position' argument, and where the `base-size'
-argument is now always nil.
-
-*** New function `completion-in-region' to use the standard completion
-facilities on a particular region of text.
-+++
-*** The 4th arg to all-completions (aka hide-spaces) is declared obsolete.
-
-*** completion-annotate-function specifies how to compute annotations
-for completions displayed in *Completions*.
-
-** Minibuffer changes
----
-*** read-file-name-predicate is obsolete.  It was used to pass the predicate
-to read-file-name-internal because read-file-name-internal abused its `pred'
-argument to pass the current directory, but this hack is not needed
-any more.
-
-** Changes to file-manipulation functions
-+++
-*** `delete-directory' has an optional parameter RECURSIVE.
-+++
-*** New function `copy-directory', which copies a directory recursively.
-
-** called-interactively-p now takes one argument and replaces interactive-p
-which is now marked obsolete.
-
-** New function set-advertised-calling-convention makes it possible
-to obsolete arguments as well as make some arguments mandatory.
-
-** You can control which binding is preferentially shown in menus and
-docstrings by adding a `:advertised-binding' property to the corresponding
-command's symbol.  That property can hold a single binding or a list
-of bindings.
-
-** Network and process changes
-+++
-*** start-process-shell-command and start-file-process-shell-command
-now only take a single `command' argument.
-+++
-*** The new variable `process-file-side-effects' should be set to nil
-if a `process-file' call does not change a remote file.  This allows
-file name handlers such as Tramp to optimizations.
-+++
-*** make-network-process can now also create `seqpacket' Unix sockets.
-
-** Loading changes
----
-*** eval-next-after-load is obsolete.
-+++
-*** New hook `after-load-functions' run after loading an Elisp file.
-
-** Byte compilation changes
----
-*** Changing the file-names generated by byte-compilation by redefining
-the function `byte-compile-dest-file' before loading bytecomp.el is obsolete.
-Instead, customize byte-compile-dest-file-function.
----
-*** `byte-compile-warnings' has new members, `constants' and `suspicious'.
-
-** New macro with-silent-modifications to tweak text properties without
-affecting the buffer's modification state.
-
-+++
-** Hash tables have a new printed representation that is readable.
-The feature `hashtable-print-readable' identifies this new
-functionality.
-
-** New functions for performing Unicode normalization:
-ucs-normalize-NFD-region, ucs-normalize-NFD-string,
-ucs-normalize-NFC-region, ucs-normalize-NFC-string,
-ucs-normalize-NFKD-region, ucs-normalize-NFKD-string,
-ucs-normalize-NFKC-region, ucs-normalize-NFKC-string,
-ucs-normalize-HFS-NFD-region, ucs-normalize-HFS-NFD-string,
-ucs-normalize-HFS-NFC-region, ucs-normalize-HFS-NFC-string.
-
-+++
-** Face aliases can now be marked as obsolete, using the macro
-`define-obsolete-face-alias'.
-
-+++
-** New function `window-full-height-p', analogous to the full-width version.
-
-\f
-* Changes in Emacs 23.2 on non-free operating systems
-
----
-** On MS-Windows, `display-time' now displays the system load average
-as well as the time, as it does on GNU and Unix.
-
-\f
-* Installation Changes in Emacs 23.1
-
-** The default X toolkit is now Gtk+, rather than Lucid.
-The configure option `--with-gtk' has been removed.  Gtk is now the
-default toolkit, but you can use --with-x-toolkit=gtk if necessary.
-
-** New font code.
-Fonts are handled by new code capable of dealing with multiple font
-backends.  This uses the freetype and fontconfig libraries.
-
-*** Emacs now accepts font names supplied in the fontconfig format
-(e.g. "monospace-12:bold") and GTK format (e.g. "Monospace Bold 12").
-
-*** Added support for local fonts (fonts installed on the machine
-where Emacs is running).
-
-*** Added support for the Xft library for antialiasing.
-
-*** Added support for the otf library for complex text layout by
-OpenType fonts.
-
-*** Added support for the m17n library for text shaping.
-
-** Changes to image support
-
-*** configure now checks for libgif before libungif when searching for
-a GIF library.
-
-*** Emacs now supports the SVG image format through librsvg2.
-
-*** Emacs now supports multi-page TIFF images.
-
-** New NeXTSTEP-based port.
-This provides support for GNUstep (via the GNUstep libraries) and Mac
-OS X (via the Cocoa libraries).
-
-Specify --with-ns to configure for this.  By default, a self-contained
-app will be built (containing all lisp).  To install/share lisp with
-other emacsen (e.g. X11 build) use --disable-ns-self-contained.  See
-nextstep/README and nextstep/INSTALL in the Emacs source directory.
-
-** Mac OS X is no longer supported via Carbon.
-Use the NeXTSTEP port, described above.
-
-** The new configuration option "--with-dbus" enables D-Bus language
-bindings for Emacs.
-
-** Support for many obsolete platforms has been removed.
-See the list at the end of etc/MACHINES for details.
-
-*** Support for systems without alloca has been removed.
-
-*** Support for Sun windows has been removed.
-
-*** The `emacstool' utility has been removed.
-
-** The following platforms will be removed in a future Emacs version:
-If you are still using Emacs on one of these platforms, please email
-emacs-devel@gnu.org to inform the Emacs developers.
-
-*** Old GNU/Linux systems based on libc version 5.
-
-*** Old FreeBSD, NetBSD, and OpenBSD systems based on the COFF
-executable format.
-
-*** Solaris versions 2.6 and below.
-
-*** Solaris on IBM RS6000 machines.
-
-*** UNIX System V (the original SysV, not later platforms based on it).
-
-*** Unixware on non-x86 machines.
-
-*** Platforms not supporting shared libraries (i.e., requiring the
-NO_SHARED_LIBS compilation flag).
-
-** The configure options `--with-gcc', `--without-gcc' have been removed.
-Configure will use gcc by default.  Set the CC environment variable if
-you need control over which C compiler is used.
-
-** The refcards are now shipped as PDF files.
-
-** The manuals are now licensed under the GNU Free Documentation License v1.3,
-or any later version.
-
-** Emacs 23 comes with a new set of default icons.
-Various resolutions are available as etc/images/icons/hicolor/*/apps/emacs.png.
-The Emacs 22 icon is available as `emacs22.png' in the same location.
-\f
-* Changes in Emacs 23.1
-
-** Improved X Window System support
-
-*** Emacs now supports using both X displays and ttys in one session.
-With an Emacs server active (M-x server-start), `emacsclient -t'
-creates a tty frame connected to the running emacs server.  You can
-use any number of different ttys.  `emacsclient -c' creates a new X11
-frame on the current $DISPLAY (or a tty frame if $DISPLAY is not set).
-There may be problems if a display exits unexpectedly and Emacs is compiled
-with Gtk+, see etc/PROBLEMS.
-
-You can test for the presence of this feature in your Lisp code by
-testing for the `multi-tty' feature.
-
-*** Emacs starts in the background, as a daemon, when given the
---daemon command line argument.  It disconnects from the terminal and
-starts the server.  Clients can connect and create graphical or
-terminal frames using emacsclient.
-
-**** emacsclient starts emacs in daemon mode and connects to it when
---alternate-editor="" is used (or when the evironment variable
-ALTERNATE_EDITOR is set to "") and emacsclient cannot connect to an
-emacs server.
-
-*** The new command close-display-connection closes a connection to a
-remote display.  There are some bugs for Gtk+.  See etc/PROBLEMS.
-
-*** Emacs now supports the XEmbed specification.
-You can embed Emacs in another application on X11.  The new command line
-option --parent-id is used to pass the parent window id to Emacs.  See
-http://standards.freedesktop.org/xembed-spec/xembed-spec-latest.html
-for details about XEmbed.
-
-*** Emacs can now set the frame opacity.
-The opacity of a frame can be controlled by setting the `alpha' frame
-parameter.  This only takes effect on a compositing window manager for
-the X Window System, such as Compiz, Beryl and Compiz Fusion, on Mac
-OS X, or on Windows 2000 and later versions of Windows.
-
-The alpha parameter should be an integer between 0 (transparent) and
-100 (opaque), or a float number between 0.0 and 1.0.  It can also be a
-cons cell (ACTIVE . INACTIVE), where ACTIVE is the opacity of an
-active frame and INACTIVE is the opacity of non-active frames.
-
-The variable `frame-alpha-lower-limit' defines a lower bound for the
-opacity; the default is 20.
-
-** Internationalization changes
-
-*** The Emacs character set is now a superset of Unicode.
-(It has about four times the code space, which should be plenty).
-
-The internal encoding used for buffers and strings is now
-Unicode-based and called `utf-8-emacs' (`emacs-internal' is an alias
-for this).  This encoding is backward-compatible with Unicode's UTF-8
-encoding.  The internal encoding previously used by Emacs,
-`emacs-mule', is still available for reading and writing files.
-
-During byte-compilation, Emacs 23 uses `utf-8-emacs' to write files.
-As a result, byte-compiled files containing non-ASCII characters can't
-be read by earlier versions of Emacs.  Files compiled by Emacs 20, 21,
-or 22 are loaded correctly as `emacs-mule' (whether or not they
-contain multibyte characters).  This takes somewhat more time, so it
-may be worth recompiling existing .elc files which don't need to be
-shared with older Emacsen.
-
-*** There are new coding systems/aliases; see M-x list-coding-systems.
-
-*** There is a new charset implementation with many new charsets.
-See M-x list-character-sets.  New charsets can be defined conveniently
-as tables of unicodes.
-
-*** There are new language environments for Chinese-GBK,
-Chinese-GB18030, Khmer, Bengali, Punjabi, Gujarati, Oriya, Telugu,
-Sinhala, and TaiViet.
-
-*** The minor modes unify-8859-on-encoding-mode and
-unify-8859-on-decoding-mode are obsolete.
-
-*** `ucs-insert' is bound to `C-x 8 RET' and in addition to hex numbers
-accepts numbers in hash notation (e.g. #o21430 for octal, or #10r8984 for
-decimal).  It also accepts Unicode character names with completion.
-
-*** The `cyrillic-translit' input method supports many new characters.
-Common typographical characters available from Unicode were added to
-`cyrillic-translit': punctuation marks, accented characters, fractions,
-and others.
-
-** Emacs now supports serial port access on GNU/Linux, Unix, and
-Windows.  The new command `serial-term' starts an interactive terminal
-on a serial port.  The serial port can be configured at runtime with
-the mode-line mouse menu.
-
-** Menu Bar changes
-
-*** In the Options menu, the "Set Default Font" item applies the
-selected font to the `default' face on all frames, not just the
-current frame.  Furthermore, if Emacs is compiled with both GTK and
-Fontconfig support, the "Set Default Font" item uses the GTK font
-selection dialog instead of an Emacs pop-up menu.
-
-*** The font setting chosen by "Set Default Font" is saved if the
-"Save Options" item is used.
-
-*** The Tools menu contains a new Encryption/Decryption submenu.
-This contains commands provided by EasyPG, the newly-included
-interface to GnuPG (see New Modes and Packages).
-
-*** In the Options menu, the "Truncate Long Lines in the Buffer" entry
-has been replaced with a submenu offering three different ways to
-handle long lines: truncation, continuation at the window edge, and
-the new word wrapping behavior (see Editing Changes, below).
-
-*** Improvements to menus for major and minor modes
-More major and minor modes now have a mode specific menu, and existing
-mode menus have been improved to include more functionality.
-
-** Mode-line changes
-
-*** The mode-line displays a `@', instead of `-', if the
-default-directory for the current buffer is on a remote machine.
-
-*** The mode-line displays a mode menu when mouse-1 is clicked on a
-minor mode, in the same way as it already did for major modes.
-
-*** The `mode-line-emphasis' face is used to highlight certain
-mode-line information (e.g. waiting for a VC command to finish).
-
-*** The mode-line tooltips have been improved to provide more details.
-
-*** The VC, line/colum number and minor mode indicators on the mode
-line are now interactive: mouse-1 can be used on them to pop up a menu.
-
-** File deletion can make use of the Recycle Bin or system Trash folder.
-Set `delete-by-moving-to-trash' non-nil to use this.  Deleted files
-and directories will then be sent to the Recycle Bin on Windows, and
-to `trash-directory' on other systems.
-
-** Directory-local variables can now be defined.
-By default, Emacs looks in .dir-locals.el for directory-local
-variables.  For more information, see `dir-locals-set-directory-class'
-and `dir-locals-set-class-variables'.
-
-** Emacs can now use `auth-source' for authentication.
-`smtpmail' and `url' (Tramp and Gnus also) use `auth-source' to obtain
-login names and passwords.  The match, if found, is reported
-in *Messages* with the password blanked out.
-
-** `where-is-preferred-modifier' can specify your favorite modifier.
-
-\f
-* Startup Changes in Emacs 23.1
-
-** The option `inhibit-startup-screen' (with aliases to old names
-`inhibit-splash-screen' and `inhibit-startup-message') doesn't inhibit
-display of the initial message in the *scratch* buffer.  If you don't
-want to display the initial message in the *scratch* buffer at startup,
-you can set the option `initial-scratch-message' to nil.
-
-** New user option `initial-buffer-choice' specifies what to display
-after starting Emacs: startup screen, *scratch* buffer, visiting a
-file or directory.
-
-** New alias `argv' for `command-line-args-left'
-This is a convenience alias, so that one can write `(pop argv)'
-inside of --eval command line arguments in order to access
-following arguments.
-
-** The abbrev file is no longer read at startup in batch mode.
-
-** Emacs now supports invocation by an X session manager.
-It can save a session and restore it later.  See the documentation of
-the functions `emacs-session-save' and `emacs-session-restore'.
-(Actually, this feature was introduced with Emacs 22, but it was not
-documented.)
-\f
-* Incompatible Editing Changes in Emacs 23.1
-
-** In Dired, `dired-flag-garbage-files' is rebound from `&' to `%&'
-on the regexp command prefix map.
-
-** In Dired-x, all command guesses for ! are now added to the default
-list accessible by M-n instead of pushing all guesses temporarily into
-the history list.
-
-** In Isearch mode, a special case of typing `C-w' at the beginning of
-the minibuffer that toggles word search (i.e. using key sequences
-`C-s RET C-w' or `C-s M-e C-w') is obsolete.  You can use the global key
-`M-s w' to start word search, or type `M-s w' in Isearch mode to
-toggle word search.  To start nonincremental word search you can now use
-`M-s w RET' and `M-s w C-r RET' instead of `C-s RET C-w' and `C-r RET C-w'.
-
-** In Info, `Info-search' is unbound from `M-s' to allow using `M-s w'
-for word search as well as other search commands from the global prefix
-key `M-s'.  `Info-search' is still bound to `s', and also incremental
-search commands `C-s', `C-M-s', `C-r', `C-M-r' are available for searching
-through multiple Info nodes, together with their nonincremental versions
-`C-s RET', `C-r RET', `C-M-s RET', `C-M-r RET', `M-s w RET'.
-
-** In Text mode, `center-line' and `center-paragraph' are rebound from
-`M-s' and `M-S' to global keys `M-o M-s' and `M-o M-S' on the global
-prefix map `M-o', which is intended for such formatting commands.
-
-** The following input methods were removed in Emacs 22.2, but this was
-not advertised: danish-alt-postfix, esperanto-alt-postfix,
-finnish-alt-postfix, german-alt-postfix, icelandic-alt-postfix,
-norwegian-alt-postfix, scandinavian-alt-postfix, spanish-alt-postfix,
-and swedish-alt-postfix.  Use the versions without "alt-", which are
-identical.
-
-\f
-* Editing Changes in Emacs 23.1
-
-** The C-n and C-p line-motion commands now move by screen lines,
-taking continued lines and variable-width characters into account.
-Setting `line-move-visual' to nil reverts this to the previous
-behavior (i.e., motion by logical lines based on buffer contents
-alone).
-
-** C-x C-c now invokes `save-buffers-kill-terminal', and C-z now
-invokes `suspend-frame'.  These changes are for compatibility with the
-new multi-tty support (see `Improved X Window System support' above).
-
-** Mark changes
-
-*** Transient Mark mode is now on by default.
-
-*** mark-even-if-inactive now defaults to t
-
-*** When Transient Mark mode is on, C-SPC C-SPC pushes a mark without
-activating it.
-
-*** When Transient Mark mode is on, M-q now fills the region if the
-region is active.  Otherwise, it fills the current paragraph.
-
-*** When Transient Mark mode is on, M-$ now checks spelling of the
-region if the region is active.  Otherwise, it checks spelling of the
-word at point.
-
-*** When Transient Mark mode is on, TAB now indents the region if the
-region is active.
-
-*** The variable `use-empty-active-region' controls whether an empty
-active region in Transient Mark mode should make commands operate on
-that empty region.
-
-** Temporarily active regions
-
-*** The new variable shift-select-mode, non-nil by default, controls
-shift-selection.  When Shift Select mode is on, shift-translated
-motion keys (e.g. S-left and S-down) activate and extend a temporary
-region, similar to mouse-selection.
-
-*** Temporarily active regions, created using shift-selection or
-mouse-selection, are not necessarily deactivated in the next command.
-They are only deactivated after point motion commands that are not
-shift-translated, or after commands that would ordinarily deactivate
-the mark in Transient Mark mode (e.g., any command that modifies the
-buffer).
-
-** Minibuffer and completion changes
-
-*** Emacs may ask for confirmation before opening a non-existent file
-or buffer.  By default, Emacs requests confirmation if you type RET
-immediately after TAB, and the resulting input is not an existing file
-or buffer; this usually happens when the minibuffer input did not
-complete far enough and you entered RET by mistake.  In that case,
-Emacs puts the message "[Confirm]" in the minibuffer; type RET again
-to create the file or buffer.
-
-The new variable confirm-nonexistent-file-or-buffer determines whether
-Emacs asks for confirmation.  The default value is `after-completion'.
-If you change it to t, Emacs always asks for confirmation; if you
-change it to nil, Emacs never asks for confirmation.
-
-*** The rules for performing completion have been changed.
-When generating completion alternatives, Emacs now takes the
-minibuffer text after point, if any, into account: this text is
-treated as a substring of the remaining part of the completion
-alternative (i.e., the part not matched by the minibuffer text before
-point).  If no completion alternatives are found this way, Emacs
-attempts to perform partial-completion.  If still no completion
-alternatives are found, we fall back on the Emacs 22 rules for
-performing completion.
-
-The new variable `completion-styles' can be customized to choose your
-favorite completion style.
-
-*** When M-n in the minibuffer reaches the end of the list of defaults,
-it adds the completion list to the end, so next M-n continues putting
-completion items to the minibuffer.  The same principle applies to
-incremental search commands as well: C-s or C-M-s starts searching
-the default values and after the end of defaults they continue
-searching minibuffer completion items.
-
-*** Minibuffer input of shell commands now comes with completion.
-
-*** In the `C-x d' (Dired) prompt, typing M-n gives the visited file
-name of the current buffer.
-
-*** In the M-! (shell-command) prompt, M-n provides some default commands.
-These are guessed using the file extension of the current file, based
-on the file-handlers specified in the operating system's `mailcap'
-file.  The ! command in Dired (dired-do-shell-command) works
-similarly, using the file displayed on the current line.
-
-*** A list of regexp default values is available via M-n for `occur',
-`keep-lines', `flush-lines' and `how-many'.  This list includes the active
-region in transient-mark-mode, the word under the cursor, the last Isearch
-regexp, the last Isearch string and the last replacement regexp.
-
-*** When enable-recursive-minibuffers is non-nil, operations which use
-switch-to-buffer (such as C-x b and C-x C-f) do not fail any more when
-used in a minibuffer or a dedicated window.  Instead, they fallback on
-using pop-to-buffer, which will use some other window.  This change
-has no effect when enable-recursive-minibuffers is nil (the default).
-
-*** Isearch started in the minibuffer searches in the minibuffer history.
-Reverse Isearch commands (C-r, C-M-r) search in previous minibuffer
-history elements, and forward Isearch commands (C-s, C-M-s) search in
-next history elements.  When the reverse search reaches the first history
-element, it wraps to the last history element, and the forward search
-wraps to the first history element.  When the search is terminated, the
-history element containing the search string becomes the current.
-
-*** The variable read-file-name-completion-ignore-case overrides
-completion-ignore-case for file name completion.
-
-*** The variable read-buffer-completion-ignore-case overrides
-completion-ignore-case for buffer name completion.
-
-*** The new command `minibuffer-force-complete' chooses one of the
-possible completions, rather than stopping at the common prefix.
-
-*** If `completion-auto-help' is `lazy', Emacs shows the completions
-buffer only on the second attempt to complete.  This was already
-supported in `partial-completion-mode'.
-
-** Face changes
-
-*** S-down-mouse-1 now pops up a menu for changing the font and text
-size of the default face in the current buffer.  The face is changed
-via face remapping (see Lisp changes, below).
-
-*** New commands to change the default face size in the current buffer.
-To increase it, type `C-x C-+' or `C-x C-='.  To decrease it, type
-`C-x C--'.  To restore the default (global) face size, type `C-x C-0'.
-These work via Text Scale mode, a new minor mode.
-
-The final key in the above commands may be repeated without the
-leading `C-x', e.g. `C-x C-= C-= C-=' increases the face height by
-three steps.  Each step scales the height of the default face by the
-value of the variable `text-scale-mode-step'.
-
-*** The commands buffer-face-mode and buffer-face-set can be used to
-remap the default face in the current buffer.  See "Buffer Face mode",
-under New Modes and Packages.
-
-** Primary selection changes
-
-*** You can disable kill ring commands from accessing the primary
-selection by setting `x-select-enable-primary' to nil.
-
-** Continuation lines can now be wrapped at word boundaries
-(word-wrapping).  This is controlled by the new per-buffer variable
-`word-wrap'.  Word wrapping does not take place if continuation lines
-are not shown, e.g. if truncate-lines is non-nil.  The most convenient
-way to enable word-wrapping is using the new minor mode Visual Line
-mode; in addition to setting `word-wrap' to t, this rebinds some
-editing commands to work on screen lines rather than text lines.  See
-New Modes and Packages, below.
-
-** Window management changes
-
-*** truncate-partial-width-windows now accepts integer values, which
-specify a minimum window width for partial-width windows, below which
-lines are truncated.  The default has been changed to 50.
-
-*** The new command balance-windows-area balances windows both
-vertically and horizontally.
-
-*** pop-to-buffer now always sets input focus when the popped-to window
-is on a different frame.
-
-** Miscellaneous changes:
-
-*** C-l is bound to the new command recenter-top-bottom, rather than recenter.
-This moves the current line to window center, top and bottom on
-successive invocations.
-
-*** scroll-preserve-screen-position also preserves the column position.
-
-*** If `yank-pop-change-selection' is t, rotating the kill ring also
-updates the selection or clipboard to the current yank, just as M-w
-would do so with the text it copies to the kill ring.
-
-*** C-M-% now shows replacement as it would look in the buffer, with
-`\N' and `\&' substituted according to the match.  Old behavior can be
-restored by customizing `query-replace-show-replacement'.
-
-*** The command shell prompts for the default directory, when it is
-called with a prefix and the default directory is a remote file name.
-This is because some file name handlers (like ange-ftp) are not able to
-run processes remotely.
-
-*** The new command kill-matching-buffers kills buffers whose name
-matches a regexp.
-
-*** The value of comment-style now defaults to `indent'.
-Thefore, comment-start markers are inserted at the current indentation
-of the region to comment, rather than the leftmost column.
-
-*** The new commands `pp-macroexpand-expression' and
-`pp-macroexpand-last-sexp' pretty-print macro expansions.
-
-*** The new command `set-file-modes' allows to set file's mode bits.
-The mode bits can be specified in symbolic notation, like with GNU
-Coreutils, in addition to an octal number.  `chmod' is a new
-convenience alias for this function.
-
-*** `next-error-recenter' specifies how next-error should recenter the
-visited source file.  Its value can be a number (for example, 0 for
-top line, -1 for bottom line), or nil for no recentering.
-
-*** When typing in a password in the echo area, C-y yanks the current
-kill into the password.
-
-*** Tooltip frame parameters `font' and `color' in `tooltip-frame-parameters'
-are ignored.  Customize the `tooltip' face instead.
-
-*** `mkdir' is a new convenience alias for `make-directory'.
-\f
-* New Modes and Packages in Emacs 23.1
-
-** Auto Composition Mode is a minor mode that composes characters
-automatically when they are displayed.  It is globally on by default.
-It uses `auto-composition-function' (default `auto-compose-chars').
-
-** Bubbles, a new game, is similar to SameGame.
-
-** Buffer Face mode is a minor mode for remapping the default face in
-the current buffer.  The variable `buffer-face-mode-face' specifies
-the face to remap to.  The command `buffer-face-set' prompts for a
-face name, sets `buffer-face-mode-face' to it, and enables
-buffer-face-mode.  See "Face changes", under Editing Changes, for a
-description of face remapping.
-
-** butterfly flips the desired bit on the drive platter.
-See http://xkcd.com/378/
-
-** bug-reference.el provides clickable links to bug reports.
-
-** dbus.el provides D-Bus language bindings.
-D-Bus is an inter-process communication mechanism for applications
-residing on the same host.  See the manual for details.
-
-** DocView mode allows viewing of PDF, PostScript and DVI documents.
-One can also search for a regular expression in the document.  For
-details, see the commentary in doc-view.el.
-
-PDF and DVI files are now opened in Doc View mode by default.
-
-In Postcript mode, C-c C-c launches Doc View minor mode for viewing
-the postscript file.
-
-** EasyPG provides an interface to the GNU Privacy Guard (GnuPG).
-It includes a GnuPG keyring browser, cryptographic operations on
-regions and files, and automatic encryption of *.gpg files.  For
-details, see the EasyPG Assistant User's Manual.
-
-** json.el is a library for parsing and generating JSON
-(JavaScript Object Notation), a lightweight data-interchange format.
-
-** linum.el is a new minor mode to display line numbers for the
-current buffer.
-
-** mairix.el is an interface to mairix, a free tool for indexing and
-searching locally stored mail.  It allows you to query mairix and
-display the search results with Rmail, Gnus and VM.  Note that there
-is an existing Gnus back end, nnmairix.el, which should be used with
-Maildir/MH setups.
-
-** minibuffer-depth-indicate-mode shows the minibuffer depth in the prompt.
-
-** nXML Mode
-This is a new mode for editing XML documents.  It allows a schema to
-be associated with the XML document being edited, using Relax NG as
-the schema language.  The schema is used to provide two key features:
-
-*** Continuous validation.  nXML validates as you type, highlighting
-any invalid parts of your document.
-
-*** Completion.  nXML can assist you in entering an element name,
-attribute name or data value by using information about what is
-allowed by the schema in that context.
-
-** proced.el provides a Dired-like interface for operating on
-processes.  Proced makes an Emacs buffer containing a listing of the
-current processes.  You can use the normal Emacs commands to move
-around in this buffer, and special Proced commands to operate on the
-processes listed.  It is currently only functional on GNU/Linux,
-MS-Windows and Solaris.
-
-** Remember Mode is a mode for jotting down things to remember.
-Notes can be saved to a Diary file.  For details, see the Remember
-Manual.
-
-** RST mode is a major mode for editing reStructuredText files.
-
-** Ruby mode is a major mode for Ruby files.
-
-** Visual Line mode provides support for editing by visual lines.
-It turns on word-wrapping in the current buffer, and rebinds C-a, C-e,
-and C-k to commands that operate by visual lines instead of logical
-lines.  This is a more reliable replacement for longlines-mode.
-This can also be turned on using the menu bar, via
-Options -> Line Wrapping in this Buffer -> Word Wrap
-
-** xesam.el is an implementation of Xesam, an interface to (desktop)
-search engines like Beagle, Strigi, and Tracker.  The Xesam API
-requires D-Bus for communication.
-
-** zeroconf.el offers service discovery and service publishing
-interfaces according to the zeroconf specification.  It communicates
-with Avahi, a zeroconf implementation, via D-Bus messages on systems
-which have installed this software.
-
-** There is a new `whitespace' package.
-(The pre-existing one has been renamed to `old-whitespace'.)
-Now, besides reporting bogus blanks, the whitespace package has a
-minor mode and a global minor mode to visualize blanks (TAB, (HARD)
-SPACE and NEWLINE).  The visualization is made via faces and/or display
-table.  It can also indicate lines that extend beyond a given column,
-trailing blanks, and empty lines at the start or end of a buffer.
-See `whitespace-style' for more details.  The `whitespace-action' option
-specifies what to do when a buffer is visited, killed, or written.
-
-\f
-* Changes in Specialized Modes and Packages in Emacs 23.1
-
-** Abbrev has been rewritten in Elisp and extended with more flexibility.
-
-*** New functions: abbrev-get, abbrev-put, abbrev-table-get, abbrev-table-put,
-abbrev-table-p, abbrev-insert, abbrev-table-menu.
-
-*** Special hook `abbrev-expand-functions' obsoletes `pre-abbrev-expand-hook'.
-
-*** `make-abbrev-table', `define-abbrev', `define-abbrev-table' all take
-extra arguments for arbitrary properties.
-
-*** New variable `abbrev-minor-mode-table-alist'.
-
-*** `local-abbrev-table' can hold a list of abbrev-tables.
-
-*** Abbrevs have now the following special properties:
-`:count', `:system', `:enable-function', `:case-fixed'.
-
-*** Abbrev-tables have now the following special properties:
-`:parents', `:case-fixed', `:enable-function', `:regexp',
-`abbrev-table-modiff'.
-
-** Apropos
-
-*** `apropos-library' describes the elements defined in a given library.
-
-*** Set `apropos-compact-layout' is you want a more compact (but wider) layout.
-
-** Archive Mode has basic support to browse Rar archives.
-Note, however, that the free version of the unrar command only handles
-versions 1 and 2 of the Rar format.
-
-** BibTeX mode
-
-*** New command `bibtex-initialize' (re)initializes BibTeX buffers.
-
-*** New `bibtex-entry-format' options `whitespace', `braces', and
-`string', disabled by default.
-
-*** New variable `bibtex-cite-matcher-alist' contains rules to
-identify cited keys in BibTeX entries, used by `bibtex-find-crossref'.
-
-*** Command `bibtex-url' allows multiple URLs per entry.
-
-** Bookmarks
-
-*** bookmark.el saves bookmarks in a pre-Emacs-23-incompatible file format
-bookmark.el can read a .emacs.bmk file saved by an older Emacs, but an
-older Emacs cannot read one saved by Emacs 23.
-
-** Calendar and diary
-
-*** There is a new date style, `iso', essentially year/month/day.
-The variable `european-calendar-style' is obsolete - use `calendar-date-style'.
-Similarly, the commands `american-calendar' and `european-calendar'
-should be replaced by `calendar-set-date-style'.
-
-*** The calendar namespace has been rationalized.
-All functions and variables now begin with a `calendar-', `diary-', or
-`holiday-' prefix.  The various calendar systems have secondary
-prefixes, eg `calendar-french-'.  The old names you are likely to use
-directly still exist, for the time being, as aliases, but please start
-using the new names.
-
-*** The whitespace in the calendar layout can be customized.
-See the variables:
-calendar-left-margin, calendar-intermonth-spacing, calendar-column-width,
-calendar-day-header-width, and calendar-day-digit-width.
-
-*** Text (e.g. ISO weeks) can be displayed between the calendar months.
-See the variables calendar-intermonth-header and calendar-intermonth-text.
-
-*** The function `holiday-chinese' computes holidays on the Chinese calendar.
-It has been used to add items to the list `holiday-oriental-holidays'.
-
-*** `diary-remind' accepts a negative number -DAYS as a shorthand for
-the list (1 2 ... DAYS).
-
-** Change Log mode
-
-*** The new command C-c C-f (change-log-find-file) finds the file
-associated with the current log entry.
-
-*** The new command C-c C-c (change-log-goto-source) goes to the
-source code associated with a log entry.
-
-** Compile and grep modes
-
-*** The mode-line entry for the *compilation* and *grep* buffer is color coded.
-It has different colors for to show that: (a) the command is still
-running, (b) successful completion, (c) error.
-
-*** compilation-auto-jump-to-first-error tells `compile' to jump to
-the first error encountered during compilations.
-
-*** compilation-scroll-output accepts a new value, `first-error', which
-says to stop auto scrolling at the first error that occurs.
-
-*** The `cc' alias for C++ files in `grep-file-aliases' has been
-improved.  `hh' can be used to match C++ header files and `cchh' both
-C++ sources and headers.
-
-** Copyright
-
-*** You can specify your copyright holders' names.
-Only copyright lines with holders matching `copyright-names-regexp' are
-considered for update.
-
-*** Copyrights can be at the end of the buffer.
-This is controlled by `copyright-at-end-flag' (used by, e.g., change-log-mode).
-
-** Custom
-
-*** defcustom accepts new keyword arguments, `:safe' and `:risky', which
-set a variable's `safe-local-variable' and `risky-local-variable' property.
-
-** Diff mode
-
-*** diff-refine-hunk highlights word-level details of changes in a diff hunk.
-It's used automatically as you move through hunks, see
-diff-auto-refine-mode.  It is bound to `C-c C-b'.
-
-*** diff-add-change-log-entries-other-window iterates through the diff
-buffer and tries to create ChangeLog entries for each change.
-It is bound to `C-x 4 A'.
-
-*** Turning on `whitespace-mode' in a diff buffer will show trailing
-whitespace problems in the modified lines.
-
-** Dired
-
-*** In Dired, C-x C-q now runs the command wdired-change-to-wdired-mode,
-and C-x C-q in wdired-mode exits it with asking a question about
-saving changes.
-
-*** `&' runs the command `dired-do-async-shell-command' that executes
-the command asynchronously without the need to manually add ampersand
-to the end of the command.  Its output appears in the buffer `*Async Shell
-Command*'.
-
-*** `M-s f C-s' and `M-s f M-C-s' run Isearch that matches only at file names.
-When a new user option `dired-isearch-filenames' is t, then even ordinary
-Isearch started with `C-s' and `C-M-s' matches only at file names in the
-Dired buffer.  When `dired-isearch-filenames' is `dwim' then activation of
-file name Isearch depends on the position of point - if point is on a file
-name initially, then Isearch matches only file names, otherwise it matches
-everywhere in the Dired buffer.  You can toggle file names matching on or
-off by typing `M-s f' in Isearch mode.
-
-*** `M-s a C-s' and `M-s a M-C-s' run multi-file Isearch on the marked files.
-They visit the first marked file in the sequence and display the usual Isearch
-prompt for a string or a regexp where all Isearch commands are available.
-
-*** `Q' in Dired provides two new keys for multi-file replacement.
-The upper case key `Y' replaces all remaining matches in all remaining files
-with no more questions.  The upper case key `N' stops doing replacements
-in the current file and skips to the next file.  These multi-file keys
-are available for all commands that use `tags-query-replace'
-including `dired-do-query-replace-regexp', `vc-dir-query-replace-regexp',
-`reftex-query-replace-document'.
-
-** Fortran
-
-*** The line length of fixed-form Fortran is not fixed at 72 any more.
-Customize the variable `fortran-line-length' to change it.
-
-*** In Fortran mode, M-; is now bound to the standard comment-dwim,
-rather than fortran-indent-comment.
-
-*** (The increasingly misnamed) F90 mode supports Fortran 2003 syntax.
-
-** Gnus
-
-*** The Gnus package has been updated
-There are many news features, bug fixes and improvements; see the file
-GNUS-NEWS or the node "No Gnus" in the Gnus manual for details.
-
-*** In Emacs 23, Gnus uses Emacs' new internal coding system `utf-8-emacs' for
-saving articles drafts and ~/.newsrc.eld.  These file may not be read
-correctly in Emacs 22 and below.  If you want to Gnus across different Emacs
-versions, you may set `mm-auto-save-coding-system' to `emacs-mule'.
-
-*** Passwords are consistently loaded through `auth-source'
-Gnus can use `auth-source' for POP and IMAP passwords.  Also see that
-`smtpmail' and `url' support `auth-source' for SMTP and HTTP/HTTPS/RSS
-authentication respectively.
-
-** Help mode
-
-*** New macro `with-help-window' should set up help windows better
-than `with-output-to-temp-buffer' with `print-help-return-message'.
-
-*** New option `help-window-select' permits to customize whether help
-window shall be automatically selected when invoking help.
-
-*** New variable `help-window-point-marker' permits one to specify a new
-position for point in help window (for example in `view-lossage').
-
-** Isearch
-
-*** New command `isearch-forward-word' bound globally to `M-s w' starts
-incremental word search.  New command `isearch-toggle-word' bound to the
-same key `M-s w' in Isearch mode toggles word searching on or off
-while Isearch is active.
-
-*** New command `isearch-highlight-regexp' bound to `M-s h r' in Isearch
-mode runs `highlight-regexp' (`hi-lock-face-buffer') with the current
-search string as its regexp argument.  The same key `M-s h r' and
-other keys on the `M-s h' prefix are bound globally to the command
-`highlight-regexp' and other hi-lock commands.
-
-*** New command `isearch-occur' bound to `M-s o' in Isearch mode
-runs `occur' with the current search string.  The same key `M-s o'
-is bound globally to the command `occur'.
-
-*** Isearch can now search through multiple ChangeLog files.
-When running Isearch in a ChangeLog file, if the search fails,
-then another C-s tries searching the previous ChangeLog,
-if there is one (e.g. going from ChangeLog to ChangeLog.12).
-This is enabled if multi-isearch-search is non-nil.
+** There are new configure options:
+--with-mmdf, --with-mail-unlink, --with-mailhost.
+These provide no new functionality, they just remove the need to edit
+lib-src/Makefile by hand in order to use the associated features.
 
-*** Two new commands to start Isearch on a list of marked buffers
-for buff-menu.el and ibuffer.el are bound to the keys `M-s a C-s' and
-`M-s a M-C-s'.
-
-*** The part of an Isearch that failed to match is highlighted in
-`isearch-fail' face.
-
-*** `C-h C-h' in Isearch mode displays isearch-specific Help screen,
-`C-h b' displays all Isearch key bindings, `C-h k' displays the full
-documentation of the given Isearch key sequence, `C-h m' displays
-documentation of Isearch mode.  All the rest Help commands exit Isearch mode
-and execute their global definitions.
-
-*** When started in the minibuffer, Isearch searches in the minibuffer
-history.  See `Minibuffer changes', above.
-
-** MH-E
-
-*** Upgraded to MH-E version 8.2.  See MH-E-NEWS for details.
-
-** Python
-*** The file etc/emacs.py now supports both Python 2 and 3, meaning
-that either version can be used as inferior Python by python.el.
-
-*** Python mode now has `pdbtrack' functionality.  When using pdb to
-debug a Python program, pdbtrack notices the pdb prompt and displays
-the source file and line that the program is stopped at, much the same
-way as gud-mode does for debugging C programs with gdb.
-
-** Recentf
-
-*** The default value of `recentf-keep' prevents from checking of
-remote files, if there is no established connection to the
-corresponding remote host.
-
-** Rmail
-
-*** Rmail no longer converts the messages to Babyl format.
-Instead, it uses UNIX mbox format, both on disk and in Rmail buffers,
-and does conversion and decoding when a message is displayed.
-
-The first time you visit an Rmail file in Babyl format, Rmail
-automatically converts it to mbox format.  This is a one-time
-conversion, but it can take a few minutes, depending on how fast is
-your machine and on the size of the file.  You should find the rest of
-Rmail usage unaltered.
-
-However, M-x set-rmail-inbox-list now lasts only for one session
-because there is no way to save the list of inbox files in an
-mbox-format file.
-
-Also, whereas with Babyl format M-x find-file would switch to Rmail
-mode, with mbox format this is no longer the case (there being no way
-to add an "-*- rmail-*-" cookie to an mbox file).  Use C-u M-x rmail
-instead.
-
-If you have written any extensions to Rmail, they are likely to need
-updating.  Conceptually, the Rmail buffer that you see is no longer
-just a narrowed portion of the whole.  So you cannot access the whole
-of a message (or message collection) by a simple save-restriction and
-widen.  Instead, there are two buffers: the rmail-buffer, and the
-rmail-view-buffer.  The former is the buffer that you see, the latter
-is invisible.  Most of the time, the invisible `view' buffer contains
-the full contents of the Rmail file, and the Rmail buffer contains a
-decoded copy of the current message (with only a subset of the
-headers).  In this state, Rmail is said to be `swapped'.
-
-You may find the following functions useful:
-
-`rmail-get-header' and `rmail-set-header' get or set the value of a
-message header, whether or not it is currently visible.
-
-`rmail-apply-in-message' is a general purpose function that calls a
-function (with arguments) which you specify on the full text of a given
-message.  To further narrow to just the headers, search forward for "\n\n".
-
-*** The new command `rmail-mime' displays MIME messages.
-It is bound to `v' in Rmail buffers and summaries.  It displays plain
-text and multipart messages in a temporary buffer, and offers buttons
-to save attachments.
-
-*** The command `rmail-redecode-body' no longer accepts the optional arg RAW.
-Since Rmail now holds messages in their original undecoded form in a
-separate buffer, `rmail-redecode-body' no longer encodes the original
-message, and therefore there should be no need to avoid encoding it.
-
-*** The o command is now `rmail-output'.  It is an all-purpose command
-for copying messages from Rmail and appending them to files.  It
-handles Babyl-format files as well as mbox-format files, and it
-handles both kinds properly when they are visited in Emacs.  It always
-copies the full headers of the message.
+\f
+* Startup Changes in Emacs 24.1
 
-*** The C-o command is now `rmail-output-as-seen'.  It uses
-the message as displayed, appending it to an mbox file.
+\f
+* Changes in Emacs 24.1
 
-*** The modified status of the Rmail buffer is reported in the mode-line.
-Previously, this information was hidden.
+** auto-mode-case-fold is now enabled by default.
 
-** TeX modes
++++
+** Emacs now supports display and editing of bidirectional text.
+Warning: This is still very much experimental!  The existing support
+is minimal, and when it's turned on (see below), many features are
+likely to give unexpected results, or break, or even crash!  Use at
+your own risk!
 
-*** New option latex-indent-within-escaped-parens
-permits to customize indentation of LaTeX environments delimited
-by escaped parens.
+See the node "Bidirectional Editing" in the Emacs Manual for some
+initial documentation.
 
-** T-mouse Mode
+To turn this on in any given buffer, set the buffer-local variable
+`bidi-display-reordering' to a non-nil value.  The default is nil.
 
-*** If the gpm mouse server is running and t-mouse-mode is enabled,
-Emacs uses a Unix socket in a GNU/Linux console to talk to server,
-rather than faking events using the client program mev.  This C level
-approach provides mouse highlighting and help echoing in the
-minibuffer.
+The buffer-local variable `bidi-paragraph-direction', if non-nil,
+forces each paragraph in the buffer to have its base direction
+according to the value of this variable.  Possible values are
+`right-to-left' and `left-to-right'.  If the value is nil (the
+default), Emacs determines the base direction of each paragraph from
+its text, as specified by the Unicode Bidirectional Algorithm.
 
-** Tramp
+Reordering of bidirectional text for display in Emacs is a "Full
+bidirectionality" class implementation of the Unicode Bidirectional
+Algorithm.
 
-*** New connection methods.
-The new methods "plinkx", "plink2", "psftp", "sftp" and "fish" have
-been introduced.  There are also new so-called gateway methods
-"tunnel" and "socks".
+** GTK scroll-bars are now placed on the right by default.
+Use `set-scroll-bar-mode' to change this.
 
-*** IPv6 addresses.
-IPv6 addresses are supported now as host names.  They must be embedded
-in square brackets, like in "/ssh:[::1]:".
+\f
+* Editing Changes in Emacs 24.1
 
-*** Multihop syntax has been removed.
-The pseudo-method "multi" has been removed.  Instead, multi hops
-can be specified by the new variable `tramp-default-proxies-alist'.
+\f
+* Changes in Specialized Modes and Packages in Emacs 24.1
 
-*** More default settings.
-Default values can be set via the variables `tramp-default-user',
-`tramp-default-user-alist' and `tramp-default-host'.
+** mpc.el: Can use pseudo tags of the form tag1|tag2 as a union of two tags.
+** Customize
 
-*** Connection information is cached.
-In order to reduce connection setup, information about used
-connections is kept persistently in a file.  The name of this file is
-defined in the variable `tramp-persistency-file-name'.
+*** Customize buffers now contain a search field.
+The search is performed using `customize-apropos'.
+To turn off the search field, set custom-search-field to nil .
 
-*** Control of remote processes.
-Running processes on a remote host can be controlled by settings in
-`tramp-remote-path' and `tramp-remote-process-environment'.
+*** Custom options now start out hidden if at their default values.
+Use the arrow to the left of the option name to toggle visibility.
 
-*** Success of remote copy is checked.
-When the variable `file-precious-flag' is set, the success of a remote
-file copy is checked via the file's checksum.
+*** custom-buffer-sort-alphabetically now defaults to t.
 
-*** Passwords can be read from an authentification file.
-Tramp uses the package `auth-source' to read passwords from a file, if
-necessary.
+*** The color widget now has a "Choose" button, which allows you to
+choose a color via list-colors-display.
 
 ** VC and related modes
 
-*** VC now supports applying VC operations to a set of files at a time.
-This enables VC to work much more effectively with changeset-oriented
-version-control systems such as Subversion, GNU Arch, Mercurial, Git
-and Bzr.  VC will now pass a multiple-file commit to these systems as
-a single changeset.
-
-*** vc-dir is a new command that displays file names and their VC
-status.  It allows to apply various VC operations to a file, a
-directory or a set of files/directories.
-
-*** VC switches are no longer appended, rather the first non-nil value is used.
-(This was for the most part true in Emacs 22, but was not advertised).
-This is because there is an increasing variety of VC systems, and they
-do not all accept the same "common" options.  For example, a CVS diff
-command used to append the values of `vc-cvs-diff-switches',
-`vc-diff-switches', and `diff-switches'.  Now the first non-nil value
-from that sequence is used.  The special value `t' means "no switches".
-
-*** Clicking on the VC mode-line entry now pops the VC menu.
-
-*** The VC mode-line entry now has a tooltip that explains the VC file status.
-
-*** In VC Annotate mode, the key bindings have changed to use lower
-case keys instead of the upper case keys used in the past.
-
-*** In VC Annotate mode, for VC systems that support changesets, you can
-see the diff for the whole changeset (not only for the current file)
-by typing the D key.  Using the "Show changeset diff of revision at
-line" menu entry does the same thing.
+*** vc-dir for Bzr supports viewing shelve contents and shelving snapshots.
 
-*** In VC Annotate mode, you can type v to toggle the annotation visibility.
+*** Special markup can be added to log-edit buffers.
 
-*** In VC Annotate mode, you can type f to show the file revision on
-the current line.
+**** For Bzr, adding an
+Author: NAME
+line will add "--author NAME" to the "bzr commit" command.
 
-*** Asynchronous VC commands display [Waiting...] in the mode-line
-of the corresponding buffer as long as the asynchronous process is
-active.
+**** For Hg, adding an
+Author: NAME
+line will add "--user NAME" to the "hg commit" command.
 
-*** Log entries can be modified using the key "e" in log-view.
-For now only CVS, RCS, SCCS and SVN support this functionality.
-This is done by the `modify-change-comment' backend function.
+** Directory local variables can apply to file-less buffers.
+For example, adding "(diff-mode . ((mode . whitespace)))" to your
+.dir-locals.el file, will turn on `whitespace-mode' for *vc-diff*
+buffers.
 
-*** In log-view-mode, for VC systems that support changesets, you can
-see the diff for the whole changeset (not only for the current file)
-by typing the D key or using the "Changeset Diff" menu entry.
+** s-region.el is now declared obsolete, superceded by shift-select-mode
+enabled by default in 23.1.
 
-*** In Log Edit mode,  C-c C-d now shows the diff for the files involved.
+** gdb-mi
 
-*** vc-git supports the "git grep" command.
-
-*** VC Support for Meta-CVS has been removed for lack of a maintainer able
-to update it to the new VC.
-
-** Miscellaneous
-
-*** comint-mode uses `start-file-process' now (see Lisp Changes).
-If `default-directory' is a remote file name, subprocesses are started
-on the corresponding remote system.
-
-*** Eldoc highlights the function argument under point
-with the face `eldoc-highlight-function-argument'.
-
-*** In Etags, the --members option is now the default.
-Use --no-members if you want the old default behavior of not tagging
-struct members in C, members variables in C++ and variables in PHP.
-
-*** The `gdb' command only works with the graphical interface now.
-Use `gud-gdb' if you want the (old) text command mode.
-
-*** goto-address.el provides two new minor modes, goto-address-mode and
-goto-address-prog-mode, which buttonize URLS and email addresses.
-
-*** The new command `eshell/info' runs info in an eshell buffer.
-
-*** The new variable `ffap-rfc-directories' specifies a list of local
-directories in which `ffap-rfc' will first search for RFCs.
-
-*** hide-ifdef-mode allows shadowing ifdef-blocks instead of hiding them.
-See option `hide-ifdef-shadow' and function `hide-ifdef-toggle-shadowing'.
-
-*** `icomplete-prospects-height' now supercedes `icomplete-prospects-length'.
-
-*** Info displays breadcrumbs in the header of the page.
-See Info-breadcrumbs-depth to control it.
-
-*** net-utils has an `iwconfig' command, similar to the existing `ifconfig'.
-It is used to configure wireless interfaces.
-
-*** The pcmpl-unix package supports hostname completion for ssh and scp.
-
-*** sgml-electric-tag-pair-mode lets you simultaneously edit matched tag pairs.
-
-*** smerge-refine highlights word-level details of changes in conflict.
-It's used automatically as you move through conflicts, see
-smerge-auto-refine-mode.
-
-*** talk.el has been extended for multiple tty support.
-
-*** A new command `display-time-world' has been added to the Time
-package.  It creates a buffer with an updating time display using
-several time zones.
-
-*** The appearance of superscript and subscript in TeX is more customizable.
-See the documentation of the variables: tex-fontify-script,
-tex-font-script-display, tex-suscript-height-ratio, and
-tex-suscript-height-minimum.
-
-*** view-remove-frame-by-deleting is now by default t
-since users found iconification of view-mode frames distracting.
-
-*** WoMan tries to add locale-specific manual page directories to the
-search path.  This can be disabled by setting `woman-locale' to nil.
+*** GDB User Interface migrated to GDB Machine Interface and now
+supports multithread non-stop debugging and debugging of several
+threads simultaneously.
 
 \f
-* Changes in Emacs 23.1 on non-free operating systems
-
-** Case is now considered significant in completion on MS-Windows.
-The default value of `completion-ignore-case' is now nil on
-MS-Windows, the same as it is for other operating systems.  The
-variable doesn't apply to reading a file name -- in that case Emacs
-heeds `read-file-name-completion-ignore-case' instead.
-
-** IPv6 is supported on MS-Windows.
-Emacs now supports IPv6 on Windows XP and later, and earlier versions
-of Windows with third party IPv6 stacks installed.  In Emacs 22, IPv6 was
-supported on other platforms, but not on Windows due to using the winsock
-1.1 header file, even though Emacs was linking to the winsock 2 library.
-
-** Busy cursor (hourglass) now displays on MS-Windows.
-When Emacs is busy, an hourglass mouse cursor is displayed on Windows.
-In Emacs 22 only X supported the busy cursor.
+* New Modes and Packages in Emacs 24.1
 
-** Battery status is available on MS-Windows
-Emacs can now display the battery status in the mode-line when enabled with
-display-battery-mode or from the Options menu.  More verbose battery
-information is also available with the command `battery'.  In Emacs 22
-battery status was supported only on GNU/Linux and Mac.
-
-** More keys available on MS-Windows.
-Keys normally associated with IMEs, and some exotic keys not normally found
-on standard keyboards have been given names so they can be bound to functions
-inside Emacs.  If there are keys on your keyboard that have not been exposed
-to Emacs in the past, try C-h k to see if they are available now.
-
-Emacs can now bind functions to the extra buttons for media player and
-browser control present on some keyboards.  These buttons are disabled
-by default, since enabling them prevents their system-wide use when
-Emacs has focus.  To enable them, set the variable
-w32-pass-multimedia-buttons to nil.  See the doc string of that variable
-for the list of extra keys that are available.
-
-** BDF fonts no longer supported on MS-Windows.
-The font backend was completely rewritten for this release.  The focus
-on Windows has been getting acceptable performance and full unicode
-support, including complex script shaping for native Windows fonts.  A
-rewrite of the BDF font support has not happened due to lack of time
-and developers.  If demand still exists for such a backend even with
-the improved language support for native Windows fonts, future
-development in this direction will most likely be based on the
-freetype library, giving access to a wider range of font formats.
+** secrets.el is an implementation of the Secret Service API, an
+interface to password managers like GNOME Keyring or KDE Wallet.  The
+Secret Service API requires D-Bus for communication.
 
 \f
-* Incompatible Lisp Changes in Emacs 23.1
-
-** Variables cannot be both buffer-local and frame-local any more.
-
-** `functionp' returns nil for special forms.
-I.e., it only returns t for objects that can be passed to `funcall'.
-
-** The behavior of map-char-table has changed.  It may call the
-specified function with a cons (FROM . TO) as a key if characters in
-that range have the same value.
-
-** Process changes
-
-*** The function `dired-call-process' has been removed.
-
-*** The multibyteness of process filters is now determined by the
-coding-system used for decoding.  The functions
-`process-filter-multibyte-p' and `set-process-filter-multibyte' are
-obsolete.
-
-** The variable `byte-compile-warnings' can now be a list starting with `not',
-meaning to disable the specified warnings.  The meaning of this list
-may therefore be the reverse of what you expect (of course, this is
-only an issue if you make use of the new `not' syntax).  Rather than
-checking/manipulating elements directly, use the new functions
-`byte-compile-warning-enabled-p', `byte-compile-disable-warning', and
-`byte-compile-enable-warning.'
-
-** `mode-name' is no longer guaranteed to be a string.
-Use `(format-mode-line mode-name)' to ensure a string value.
-
-** The function x-font-family-list has been removed.
-Use the new function font-family-list (see Lisp Changes, below).
-
-** Internationalization changes
-
-*** The value of the function `charset-id' is now always 0.
-
-*** The functions `register-char-codings' and `coding-system-spec'
-have been removed.
-
-*** The cpXXX coding systems are now supported automatically.
-The functions cp-...-codepage, which you had to use in Emacs 22 to
-enable support for these coding systems, have been deleted.
-
-*** The following features have been removed.  They were used for
-displaying various scripts with specific fonts, and are no longer
-needed now that OpenType font support is available:
-
-**** `devanagari' and `devan-util', and all associated devanagari-* and
-dev-* functions and variables (formerly used for Devanagari script).
-
-**** `kannada' and `knd-util', and all associated kannada-* and knd-*
-functions and variables (formerly used for Kannada script).
-
-**** `malayalam' and `mlm-util', and all associated malayalam-* and
-mlm-* functions and variables (formerly used for Malayalam script).
-
-**** `tamil' and `tml-util, and all associated tamil-* and tml-*
-functions and variables (formerly used for Tamil script).
-
-*** The meaning of NAME argument of `set-fontset-font' is changed.
-Previously nil is accepted as the default fontset.  Now, nil is for
-the fontset of the selected frame and t is for the default fontset.
-
-*** The meaning of FONTSET argument of `print-fontset' is changed.
-Now, nil is for the fontset of the selected frame and t is for the
-default fontset.
-
-** If a function in write-region-annotate-functions returns with a
-different buffer current, Emacs no longer kills that buffer
-automatically.  This behavior existed in previous versions of Emacs,
-but was undocumented.  To kill a buffer after write-region, give the
-variable `write-region-post-annotation-function' a buffer-local value
-of `kill-buffer'.
-
-** The variable temp-file-name-pattern has been removed.
-This variable was only used by call-process-region, which now uses
-temporary-file-directory instead.
-
-** The COUNT and SYSTEM-FLAG arguments to define-abbrev have been
-removed.  The function now takes extra arguments for specifying
-arbitrary abbrev properties.
-
-** end-of-defun-function is now guaranteed to work only when called
-from the start of a defun.  It must now leave point exactly at the end
-of defun, since `end-of-defun' now itself moves forward over
-whitespace after calling it.
+* Incompatible Lisp Changes in Emacs 24.1
 
 \f
-* Lisp Changes in Emacs 23.1
-
-** The new variable `generate-autoload-cookie' controls the magic comment
-string used by `update-file-autoloads' to find autoloaded forms.  The
-variable `generated-autoload-file' similarly controls the name of the
-file where `update-file-autoloads' writes the calls to `autoload'.
-The default values are ";;;###autoload" and `loaddefs.el',
-respectively.
-
-** New primitives `list-system-processes' and `process-attributes'
-let Lisp programs access the processes that are running on the local
-machine.  See the doc strings of these functions for more details.
-Not all platforms support accessing this information; on those that
-don't, these primitives will return nil.
-
-** New variable `user-emacs-directory'.
-Use this instead of "~/.emacs.d".
-
-** If a local hook function has a non-nil `permanent-local-hook'
-property, `kill-all-local-variables' does not remove it from the local
-value of the hook variable; it remains even if you change major modes.
-
-** `frame-inherited-parameters' lets new frames inherit parameters from
-the selected frame.
-
-** New keymap `input-decode-map' overrides like key-translation-map, but
-applies before function-key-map.  Also it is terminal-local contrary to
-key-translation-map.  Terminal-specific key-sequences are generally added to
-this map rather than to function-key-map now.
-
-** `ignore-errors' is now a standard macro (does not require the CL package).
-
-** `interprogram-paste-function' can now return one string or a list
-of strings.  In the latter case, Emacs puts the second and following
-strings on the kill ring.
-
-** In `condition-case', a handler can specify "let the debugger run first".
-You do this by writing `debug' in the list of conditions to be handled,
-like this:
-
-    (condition-case nil
-       (foo bar)
-      ((debug error) nil))
-
-** clone-indirect-buffer now runs the clone-indirect-buffer-hook.
-
-** `beginning-of-defun-function' now takes one argument, the count given to
-`beginning-of-defun'.  (N.B. `end-of-defun-function' doesn't take any
-arguments.)
-
-** `file-remote-p' has new optional parameters IDENTIFICATION and CONNECTED.
-IDENTIFICATION specifies which part of the remote identifier has to be
-returned.  With CONNECTED passed non-nil, it is checked whether a
-remote connection has been established already.
-
-** The new macro `declare-function' suppresses compiler warnings about
-undefined functions.
-
-** Changes to interactive function handling
-
-*** The new interactive spec code ^ says to first call
-handle-shift-selection if shift-select-mode is non-nil, before reading
-the command arguments.  This is used for shift-selection (see above).
-
-*** Built-in functions can now have an interactive specification that
-is not a prompt string.  If the `intspec' parameter of a `DEFUN'
-starts with a `(', the string is evaluated as a Lisp form.
-
-*** The interactive-form of a function can be added post-facto via the
-`interactive-form' symbol property.  Mostly useful to add complex
-interactive forms to subroutines.
-
-** Region changes
-
-*** Commands should use `use-region-p' to test whether there is
-an active region that they should operate on.
-
-*** `region-active-p' returns non-nil when Transient Mark mode is
-enabled and the mark is active.  Most commands that act specially on
-the active region in Transient Mark mode should use `use-region-p'
-instead of `region-active-p', because `use-region-p' obeys the new
-user option `use-empty-active-region' (see Editing Changes, above).
-
-*** If a command sets `transient-mark-mode' to (only . OLDVAL), that
-means to activate transient-mark-mode temporarily, until the next
-unshifted point motion command or mark deactivation.  Afterwards,
-reset transient-mark-mode to the value OLDVAL.  The values `only' and
-`identity', introduced in Emacs 22, are now deprecated.
-
-** Emacs session information
-
-*** The new variables `before-init-time' and `after-init-time' record the
-value of `current-time' before and after Emacs loads the init files.
-
-*** The new function `emacs-uptime' returns the uptime of an Emacs instance.
-
-*** The new function `emacs-init-time' returns the duration of the
-Emacs initialization.
-
-** Changes affecting display-buffer
-
-*** display-buffer tries to be smarter when splitting windows.
-The new option split-window-preferred-function lets you specify your own
-function to pop up new windows.  Its default value split-window-sensibly
-can split a window either vertically or horizontally, whichever seems
-more suitable in the current configuration.  You can tune the behavior
-of split-window-sensibly by customizing split-height-threshold and the
-new option split-width-threshold.  Both options now take the value nil
-to inhibit splitting in one direction.  Setting split-width-threshold to
-nil inhibits horizontal splitting and gets you the behavior of Emacs 22
-in this respect.  In any case, display-buffer may now split the largest
-window vertically even when it is not as wide as the containing frame.
-
-*** If pop-up-frames has the value `graphic-only', display-buffer only
-makes a separate frame on graphic displays.
-
-*** select-frame and set-frame-selected-window have a new optional
-argument NORECORD.  If non-nil, this will avoid messing with the order
-of recently selected windows and the buffer list.
-
-** Window parameters can now be defined.
-These are analogous to frame parameters, but are associated with
-individual windows.
-
-*** The new functions window-parameters, window-parameter, and
-set-window-parameter are used to query and set window parameters.
-
-** Minibuffer and completion changes
-
-*** A list of default values can be specified for the DEFAULT argument of
-functions `read-from-minibuffer', `read-string', `read-command',
-`read-variable', `read-buffer', `completing-read'.  Elements of this list
-are available for inserting into the minibuffer by typing `M-n'.
-For empty input these functions return the first element of this list.
-
-*** New function `read-regexp' uses the regexp history and some useful
-regexp defaults (string at point, last Isearch/replacement regexp/string)
-via M-n when reading a regexp in the minibuffer.
-
-*** minibuffer-local-must-match-filename-map is now named
-minibuffer-local-filename-must-match-map.
-
-*** The `require-match' argument to `completing-read' accepts the new
-values `confirm-only' and `confirm-after-completion'.
-
-** Search and replacement changes
-
-*** The regexp form \(?<num>:<regexp>\) specifies the group number explicitly.
-
-*** New function `match-substitute-replacement' returns the result of
-`replace-match' without actually using it in the buffer.
-
-*** The new variable `replace-search-function' determines the function
-to use for searching in query-replace and replace-string.  The
-function it specifies is called by `perform-replace' when its 4th
-argument is nil.
-
-*** The new variable `replace-re-search-function' determines the
-function to use for searching in `query-replace-regexp',
-`replace-regexp', `query-replace-regexp-eval', and
-`map-query-replace-regexp'.  The function it specifies is called by
-`perform-replace' when its 4th argument is non-nil.
-
-*** New keymap `search-map' bound to `M-s' provides global bindings
-for search related commands.
-
-*** New keymap `multi-query-replace-map' contains additonal keys bound
-to `automatic-all' and `exit-current' for multi-buffer interactive replacement.
-
-*** The variable `inhibit-changing-match-data', if non-nil, prevents
-the search and match primitives from changing the match data.
+* Lisp changes in Emacs 24.1
 
-*** New functions `word-search-forward-lax' and `word-search-backward-lax'.
-These are like `word-search-forward and `word-search-backward', except
-that the end of the search string need not match a word boundary,
-unless it ends in whitespace.
+** New completion style `substring'.
 
-** File handling changes
+** Image API
 
-*** set-file-modes is now interactive and can take the mode value in
-symbolic notation thanks to auxiliary functions.
+*** When the image type is one of listed in `image-animated-types'
+and the number of sub-images in the image is more then one, then the
+new function `create-animated-image' creates an animated image where
+sub-images are displayed successively with the duration defined by
+`image-animate-max-time' and the delay between sub-images defined
+by the Graphic Control Extension of the image.
 
-*** file-local-variables-alist stores an alist of file-local
-variables defined in the current buffer.
-
-** Face-remapping
-
-*** Each face can be remapped to a different face definition using the
-variable `face-remapping-alist'.  This is an alist that maps faces to
-replacement definitions (which can be face names, lists of face names,
-or attribute/value plists.  If this variable is buffer-local, the
-remapping occurs only in that buffer.
-
-*** text-scale-mode remaps the default face to a larger or smaller
-size in the current buffer.  This feature is used by the Buffer Face
-menu and the new `C-x C-+', `C-x C--', and `C-x C-0' commands (see
-Editing Changes, above).
-
-*** New functions:
-
-**** `face-remap-add-relative' adds a face remapping entry to the
-current buffer.
-
-**** ``face-remap-remove-relative' removes a face remapping entry from
-the current buffer.
-
-**** `face-remap-reset-base' restores a face to its global definition.
-
-**** `face-remap-set-base' sets the base remapping of a face.
-
-** Process changes
-
-*** The new function `start-file-process' is similar to `start-process',
-but obeys file handlers.  The file handler is chosen based on
-`default-directory'.  The functions `start-file-process-shell-command'
-and `process-file-shell-command' are also new; they call internally
-`start-file-process' and `process-file', respectively.
-
-*** The new function `process-lines' executes an external program and
-returns its output as a list of lines.
-
-** Character code, representation, and charset changes.
-
-*** In multibyte buffers and strings, characters are represented by
-UTF-8 byte sequences.  The character code space is now 0x0..0x3FFFFF
-with no gap; code points 0x0..0x10FFFF are Unicode characters of the
-same code points, while code points 0x3FFF80..0x3FFFFF are raw 8-bit
-bytes.
-
-*** Generic characters no longer exist.
-
-*** The concept of a charset has changed.  A single character may
-belong to multiple charsets (e.g. a-grave, U+00E0, belongs to charsets
-unicode, iso-8859-1, iso-8859-3, etc).
-
-**** The dimension of a charset is now 1, 2, 3, or 4, and the size of
-each dimension is no longer limited to 94 or 96.
-
-**** A dynamic charset priority list is used to infer the charset of
-characters for display.
-
-*** The functions `split-char' and `make-char' now accept up to 4
-positional codes instead of just 2.
-
-*** The functions `encode-char' and `decode-char' now accept any character sets.
-
-*** The function `define-charset' now accepts a completely different
-form of arguments (old-style arguments still work).
-
-*** The value of the function `char-charset' depends on the current
-priorities of charsets.
-
-*** The function get-char-code-property now accepts many Unicode base
-character properties.  They are `name', `general-category',
-`canonical-combining-class', `bidi-class', `decomposition',
-`decimal-digit-value', `digit-value', `numeric-value', `mirrored',
-`old-name', `iso-10646-comment', `uppercase', `lowercase', and
-`titlecase'.
-
-*** The functions `modify-syntax-entry' and `modify-category-entry' now
-accept a cons of characters as the first argument, and modify all
-entries in that range of characters.
-
-*** Use of `translation-table-for-input' for character code unification
-is now obsolete, since Emacs 23.1 and later uses Unicode as basis for
-internal representation of characters.
-
-*** New functions:
-
-**** `characterp' returns t if and only if the argument is a character.
-This replaces `char-valid-p', which is now obsolete.
-
-**** `max-char' returns the maximum character code (currently #x3FFFFF).
-
-**** `define-charset-alias' defines an alias of a charset.
-
-**** `set-charset-priority' sets priorities of charsets.
-
-**** `charset-priority-list' returns a prioritized list of charsets.
-
-**** `unibyte-string' makes a unibyte string from bytes.
-
-**** `define-char-code-property' defines a character code property.
-
-**** `char-code-property-description' returns the description string of
-a character code property.
-
-*** New variables:
-
-**** `find-word-boundary-function-table' is a char-table of functions to
-search for a word boundary.
-
-**** `char-script-table' is a char-table of script names.
-
-**** `char-width-table' is a char-table of character widths.
-
-**** `print-charset-text-property' controls how to handle `charset' text
-property on printing a string.
-
-**** `printable-chars' is a char-table of printable characters.
-
-** Code conversion changes
-
-*** The new function `define-coding-system' should be used to define a
-coding system instead of `make-coding-system' (which is now obsolete).
-
-*** The functions `encode-coding-region' and `decode-coding-region'
-have an optional 4th argument to specify where the result of
-conversion should go.
-
-*** The functions `encode-coding-string' and `decode-coding-string'
-have an optional 4th argument specifying a buffer to store the result
-of conversion.
-
-*** The new variable `inhibit-null-byte-detection' controls whether to
-consider text with null bytes as binary data.  By default, it is
-`nil', and Emacs uses `no-conversion' for any text containing null
-bytes.
-
-*** The functions `set-coding-priority' and `make-coding-system' are obsolete.
-
-*** New functions:
-
-**** `with-coding-priority' executes Lisp code using the specified
-coding system priority order.
-
-**** `check-coding-systems-region' checks if the text in the region is
-encodable by the specified coding systems.
-
-**** `coding-system-aliases' returns a list of aliases of a coding system.
-
-**** `coding-system-charset-list' returns a list of charsets supported
-by a coding system.
-
-**** `coding-system-priority-list' returns a list of coding systems
-ordered by their priorities.
-
-**** `set-coding-system-priority' sets priorities of coding systems.
-
-**** `coding-system-from-name' returns a coding system matching with
-the argument name.
-
-** There is a new input method, Robin, different from Quail.
-It has three functionalities:
- i) a simple input method (converts an ASCII sequence into a string).
-ii) converts an existing buffer substring into another string
-iii) reverse conversion (each character produced by a
-robin rule can hold the original ASCII sequence as a char-code-property)
-
-*** The new function `robin-define-package' defines a Robin package.
-
-*** The new function `robin-modify-package' modifies an existing Robin package.
-
-*** The new function `robin-use-package' starts using a Robin package
-as an input method.
-
-*** The new function `string-to-unibyte' is like `string-as-unibyte'
-but signals an error if STRING contains a non-ASCII, non-eight-bit
-character.
-
-** Changes related to the new font backend
-
-*** Which font backends to use can be specified by the X resource
-"FontBackend".  For instance, to use both X core fonts and Xft fonts:
-
-Emacs.FontBackend: x,xft
-
-If this resource is not set, Emacs tries to use all font backends
-available on your graphic device.
-
-*** New frame parameter `font-backend' specifies a list of
-font-backends supported by the frame's graphic device.  On X, they are
-currently `x' and `xft'.
-
-*** The function `set-fontset-font' now accepts a script name as the
-second argument, and has an optional 5th argument to control how to
-set the font.
-
-*** New functions:
-
-**** `fontp' checks if the argument is a font-spec or font-entity.
-
-**** `font-spec' creates a new font-spec object.
-
-**** `font-get' returns a font property value.
-
-**** `font-put' sets a font property value.
-
-**** `font-face-attributes' returns a plist of face attributes set by a font.
-
-**** `list-fonts' returns a list of font-entities matching a font spec.
-
-**** `find-font' returns the font-entity best matching the given font spec.
-
-**** `font-family-list' returns a list of family names of available fonts.
-
-**** `font-xlfd-name' returns an XLFD name of a given font spec, font
-entity, or font object.
-
-**** `clear-font-cache' clears all font caches.
-
-** Changes related to multiple-terminal (multi-tty) support
-
-*** $TERM is now set to `dumb' for subprocesses.  If you want to know the
-$TERM inherited by Emacs you will have to look inside initial-environment.
-
-*** $DISPLAY is now dynamically inherited from the frame's `display'.
-
-*** The `window-system' variable is now frame-local.  The new
-`initial-window-system' variable contains the `window-system' value
-for the first frame.  `window-system' is also now a function that
-takes a frame argument.
-
-*** The `keyboard-translate-table' variable and the terminal and
-keyboard coding systems are now terminal-local.
-
-*** You can specify a terminal device (`tty' parameter) and a terminal
-type (`tty-type' parameter) to `make-terminal-frame'.
-
-*** The function `make-frame-on-display' now works during a tty
-session.
-
-*** A new `terminal' data type.
-The functions `get-device-terminal', `terminal-parameters',
-`terminal-parameter', `set-terminal-parameter' use this data type.
-
-*** Function key sequences are now mapped using `local-function-key-map',
-a new variable.  This inherits from the global variable function-key-map,
-which is not used directly any more.
-
-*** New hooks:
-
-**** before-hack-local-variables-hook is called after setting new
-variable file-local-variables-alist, and before actually applying the
-file-local variables.
-
-**** `suspend-tty-functions' and `resume-tty-functions' are called
-after a tty frame has been suspended or resumed, respectively.  The
-functions are called with the terminal id of the frame being
-suspended/resumed as a parameter.
-
-**** The special hook `delete-terminal-functions' is called before
-deleting a terminal.
-
-*** New functions:
-
-**** `delete-terminal'
-
-**** `suspend-tty'
-
-**** `resume-tty'.
-
-*** `initial-environment' holds the environment inherited from Emacs's parent.
-
-** Redisplay changes
-
-*** For underlined characters, the distance between the underline and
-the baseline is controlled by a new variable, `underline-minimum-offset'.
-
-*** You can now pass the value of the `invisible' property to
-invisible-p to check whether it would cause the text to be invisible.
-This is convenient when checking invisibility of text with no buffer
-position (e.g. in before/after-strings).
-
-*** `clear-image-cache' can be told to flush only images of a specific file.
-
-*** `vertical-motion' can now be given a goal column.
-It now accepts a cons cell (COLS . LINES) in its first argument, which
-says to stop, where possible, at a pixel x-position equal to COLS
-times the default column width.
-
-*** redisplay-end-trigger-functions, set-window-redisplay-end-trigger,
-and window-redisplay-end-trigger are obsolete.  Use `jit-lock-register'
-instead.
-
-*** The new variables `wrap-prefix' and `line-prefix' specify display
-specs which are appended at display-time to every continuation line
-and non-continuation line, respectively.  In addition, Emacs
-recognizes the `wrap-prefix' and `line-prefix' text or overlay
-properties; these have the same effects as the variables of the same
-name, but take precedence.
-
-** The Lisp interpreter now treats non-breaking space as whitespace.
-
-** Miscellaneous new functions
-
-*** `apply-partially' performs a "curried" application of a function.
-
-*** `buffer-swap-text' swaps text between two buffers.  This can be
-useful for modes such as tar-mode, archive-mode, RMAIL.
-
-*** `combine-and-quote-strings' produces a single string from a list of strings
-sticking a separator string in between each pair, and quoting those
-strings that include the separator as their substring.  Useful for
-consing shell command lines from the individual arguments.
-
-*** `custom-note-var-changed' tells Custom to treat the change in a
-certain variable as having been made within Custom.
-
-*** `face-all-attributes' returns an alist describing all the basic
-attributes of a given face.
-
-*** `format-seconds' converts a number of seconds into a readable
-string of days, hours, etc.
-
-*** `image-refresh' refreshes all images associated with a given image
-specification.
-
-*** `locate-user-emacs-file' helps packages to select the appropriate
-place to save user-specific files.  It defaults to `user-emacs-directory'
-unless the file already exists at $HOME.
-
-*** `read-color' reads a color name using the minibuffer.
-
-*** `read-shell-command' does what its name says, with completion.  It
-uses the minibuffer-local-shell-command-map for that.
-
-*** `split-string-and-unquote' splits a string into a list of substrings
-on the boundaries of a given delimiter, and unquotes the substrings that
-are quoted.  Useful for taking apart shell commands.
-
-*** The two new functions `looking-at-p' and `string-match-p' can do
-the same matching as `looking-at' and `string-match' without changing
-the match data.
-
-*** The two new functions `make-serial-process' and
-`serial-process-configure' provide a Lisp interface to the new serial
-port support (see Emacs changes, above).
-
-** Miscellaneous new variables
-
-*** `auto-save-include-big-deletions', if non-nil, means auto-save is
-not turned off automatically after a big deletion.
-
-*** `read-circle', if nil, disables the reading of recursive Lisp
-structures using the #N= and #N# syntax.
-
-*** `this-command-keys-shift-translated' is non-nil if the key
-sequence invoking the current command was found by shift-translation.
-
-*** `window-point-insertion-type' determines the insertion-type of the
-marker used for window-point.
-
-*** bookmark provides `bookmark-make-record-function' so special major
-modes like Info can teach bookmark.el how to save and restore the
-relevant data.
-
-*** `fill-forward-paragraph-function' specifies which function the
-filling code should use to find paragraph boundaries.
+** Progress reporters can now "spin".
+The MIN-VALUE and MAX-VALUE arguments of `make-progress-reporter' can
+now be nil, or omitted.  This makes a "non-numeric" reporter.  Each
+time you call `progress-reporter-update' on that progress reporter,
+with a nil or omitted VALUE argument, the reporter message is
+displayed with a "spinning bar".
 
 \f
-* New Packages for Lisp Programming in Emacs 23.1
-
-** The new package avl-tree.el deals with the AVL tree data structure.
-
-** The new package check-declare.el verifies the accuracy of
-declare-function macros (see Lisp Changes, above).
-
-** find-cmd.el can build `find' commands using lisp syntax.
-
-** The package misearch.el has been added.  It allows Isearch to search
-through multiple buffers.  A variable `multi-isearch-next-buffer-function'
-defines the function to call to get the next buffer to search in the series
-of multiple buffers.  Top-level functions `multi-isearch-buffers',
-`multi-isearch-buffers-regexp', `multi-isearch-files' and
-`multi-isearch-files-regexp' accept a single argument that specifies
-a list of buffers/files to search for a string/regexp.
-
-** The new major mode `special-mode' is intended as a parent for
-major modes such as those that set the "'mode-class 'special" property.
+* Changes in Emacs 24.1 on non-free operating systems
 
 \f
 ----------------------------------------------------------------------
@@ -2421,5 +170,3 @@ Local variables:
 mode: outline
 paragraph-separate: "[         \f]*$"
 end:
-
-arch-tag: e759449d-88b3-4de4-9900-3a6c3dfa23e2
diff --git a/etc/NEWS.23 b/etc/NEWS.23
new file mode 100644 (file)
index 0000000..4fba24d
--- /dev/null
@@ -0,0 +1,2425 @@
+GNU Emacs NEWS -- history of user-visible changes.
+
+Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+See the end of the file for license conditions.
+
+Please send Emacs bug reports to bug-gnu-emacs@gnu.org.
+If possible, use M-x report-emacs-bug.
+
+This file is about changes in Emacs version 23.
+
+See files NEWS.22, NEWS.21, NEWS.20, NEWS.19, NEWS.18, and NEWS.1-17
+for changes in older Emacs versions.
+
+You can narrow news to a specific version by calling `view-emacs-news'
+with a prefix argument or by typing C-u C-h C-n.
+
+
+Temporary note:
+ +++ indicates that the appropriate manual has already been updated.
+ --- means no change in the manuals is called for.
+When you add a new item, please add it without either +++ or ---
+so we will look at it and add it to the manual.
+
+\f
+* Installation Changes in Emacs 23.2
+
+** New configure options for Emacs developers
+These are not new features; only the configure flags are new.
+---
+*** --enable-profiling builds Emacs with profiling enabled.
+This might not work on all platforms.
+---
+*** --enable-checking[=OPTIONS] builds emacs with extra runtime checks.
+
+---
+** `make install' now consistently ignores umask, creating a
+world-readable install.
+
+** Emacs compiles with Gconf support, if it is detected.
+Use the configure option --without-gconf to disable this.
+
+* Startup Changes in Emacs 23.2
++++
+** The command-line option -Q (--quick) also inhibits loading X resources.
+However, if Emacs is compiled with the Lucid or Motif toolkit, X
+resource settings for the graphical widgets are still applied.
+On Windows, the -Q option causes Emacs to ignore Registry settings,
+but environment variables set on the Registry are still honored.
++++
+*** The new variable `inhibit-x-resources' shows whether X resources
+were loaded.
+
++++
+** New command-line option -mm (--maximized) maximizes the initial frame.
+
+* Changes in Emacs 23.2
+
++++
+** The maximum size of buffers (and the largest fixnum) is doubled.
+On typical 32bit systems, buffers can now be up to 512MB.
+
+---
+** The default value of `trash-directory' is now nil.
+This means that `move-file-to-trash' trashes files according to
+freedesktop.org specifications, the same method used by the Gnome,
+KDE, and XFCE desktops.  (This change has no effect on Windows, which
+uses `system-move-file-to-trash' for trashing.)
+
++++
+** The pointer now becomes invisible when typing.
+Customize `make-pointer-invisible' to disable this feature.
+
+** Font changes
++++
+*** Emacs can use the system default monospaced font in Gnome.
+To enable this feature, set `font-use-system-font' to non-nil (it is
+nil by default).  If the system default changes, Emacs changes also.
+This feature requires Gconf support, which is automatically included
+at compile-time if configure detects the gconf libraries (you can
+disable this with the configure option --without-gconf).
+---
+*** On X11, Emacs reacts to Xft changes made by configuration tools,
+via the XSETTINGS mechanism.  This includes antialias, hinting,
+hintstyle, RGBA, DPI and lcdfilter changes.
+
++++
+** Killing a buffer with a running process now asks for confirmation.
+To remove this query, remove `process-kill-buffer-query-function' from
+`kill-buffer-query-functions', or set the appropriate process flag
+with `set-process-query-on-exit-flag'.
+
+** File-local variable changes
++++
+*** Specifying a minor mode as a local variables enables that mode,
+unconditionally.  The previous behavior, toggling the mode, was
+neither reliable nor generally desirable.
+
+*** New commands for adding and removing file-local variables:
+`add-file-local-variable', `delete-file-local-variable',
+`add-file-local-variable-prop-line', and
+`delete-file-local-variable-prop-line'.
+
+*** New commands for adding and removing directory-local variables,
+and copying them to and from file-local variable lists:
+`add-dir-local-variable', `delete-dir-local-variable',
+`copy-dir-locals-to-file-locals',
+`copy-dir-locals-to-file-locals-prop-line' and
+`copy-file-locals-to-dir-locals'.
+
+** Internationalization changes
++++
+*** Unibyte sessions are now considered obsolete.
+This refers to the EMACS_UNIBYTE environment variable as well as the
+--unibyte, --multibyte, --no-multibyte, and --no-unibyte command line
+arguments.  Customizing enable-multibyte-characters and setting
+default-enable-multibyte-characters are also deprecated.
+---
+*** New coding system `utf-8-hfs'.
+This is suitable for default-file-name-coding-system on Mac OS X; see
+international/ucs-normalize.el.
+
+---
+** Function arguments in *Help* buffers are now shown in upper-case.
+Customize `help-downcase-arguments' to t to show them in lower-case.
+
+\f
+* Editing Changes in Emacs 23.2
+
+** Kill-ring and selection changes
++++
+*** If `select-active-regions' is t, any active region automatically
+becomes the primary selection (for interaction with other window
+applications).  If you enable this, you might want to bind
+`mouse-yank-primary' to Mouse-2.
++++
+*** When `save-interprogram-paste-before-kill' is non-nil, the kill
+commands save the interprogram-paste selection into the kill ring
+before doing anything else.  This avoids losing the selection.
++++
+*** When `kill-do-not-save-duplicates' is non-nil, identical
+subsequent kills are not duplicated in the `kill-ring'.
+
+** Completion changes
+
+*** The new command `completion-at-point' provides mode-sensitive completion.
++++
+*** tab-always-indent set to `complete' lets TAB do completion as well.
++++
+*** The new completion-style `initials' is available.
+For instance, this can complete M-x lch to list-command-history.
+---
+*** The new variable `completions-format' determines how completions
+are displayed in the *Completions* buffer.  If you set it to
+`vertical', completions are sorted vertically in columns.
+
++++
+** The default value of `blink-matching-paren-distance' is increased.
+
+---
+** M-n provides more default values in the minibuffer for commands
+that read file names.  These include the file name at point (when ffap
+is loaded without ffap-bindings), the file name on the current line
+(in Dired buffers), and the directory names of adjacent Dired windows
+(for Dired commands that operate on several directories, such as copy,
+rename, or diff).
+
++++
+** M-r is bound to the new `move-to-window-line-top-bottom'.
+This moves point to the window center, top and bottom on successive
+invocations, in the same spirit as the C-l (recenter-top-bottom)
+command.
+
++++
+** The new variable `recenter-positions' determines the default
+cycling order of C-l (`recenter-top-bottom').
+
++++
+** The abbrevs file is now a file named abbrev_defs in
+user-emacs-directory; but the old location, ~/.abbrev_defs, is used if
+that file exists.
+\f
+* Changes in Specialized Modes and Packages in Emacs 23.2
+
+** The bookmark menu has a narrowing search via bookmark-bmenu-search.
+
+** LaTeX mode now provides completion (via completion-at-point).
+
+---
+** sym-comp.el is now declared obsolete, superceded by completion-at-point.
+
+** lucid.el and levents.el are now declared obsolete.
+
+** pcomplete provides a new command `pcomplete-std-completion' which
+is similar to `pcomplete' but using the standard completion UI code.
+
+** Calc
++++
+*** The Calc settings file is now a file named calc.el in
+user-emacs-directory; but the old location, ~/.calc.el, is used if
+that file exists.
+---
+*** Graphing commands (`g f' etc.) now work on MS-Windows, if you have
+the native Windows port of Gnuplot version 3.8 or later installed.
+
+** Calendar and diary
++++
+*** Fancy diary display is now the default.
+If you prefer the simple display, customize `diary-display-function'.
++++
+*** The diary's fancy display now enables view-mode.
+---
+*** The command `calendar-current-date' accepts an optional argument
+giving an offset from today.
+
+** Desktop
+---
+*** The default value for `desktop-buffers-not-to-save' is nil.
+This means Desktop will try restoring all buffers, when you restart
+your Emacs session.  Also, `desktop-buffers-not-to-save' is only
+effective for buffers that have no associated file.  If you want to
+exempt buffers that do correspond to files, customize the value of
+`desktop-files-not-to-save' instead.
+
+** Dired
++++
+*** The new variable `dired-auto-revert-buffer', if non-nil, causes
+Dired buffers to be reverted automatically on revisiting them.
+
+** DocView
++++
+*** When `doc-view-continuous' is non-nil, scrolling a line
+on the page edge advances to the next/previous page.
+
+** GDB-UI
+
+*** Toolbar functionality for reverse debugging.  Display of STL
+collections as watch expressions.  These features require GDB 7.0
+or later.
+
+** Grep
++++
+*** A new command `zrgrep' searches recursively in gzipped files.
+
+** Info
+
+*** The new command `Info-virtual-index' bound to "I" displays a menu of
+matched topics found in the index.
+
+*** The new command `info-finder' replaces finder.el with a virtual Info
+manual that generates an Info file which gives the same information
+through a menu structure.
+
++++
+** Message mode is now the default mode for composing mail.
+
+The default for `mail-user-agent' is now message-user-agent, so the
+C-x m (`compose-mail') command uses Message mode instead of Mail mode.
+
+Message mode has been included in Emacs, as part of the Gnus package,
+for several years.  It provides several features that are absent in
+Mail mode, such as MIME handling.
+
+---
+*** If the user has not customized mail-user-agent, `compose-mail'
+checks for Mail mode customizations, and issues a warning if these
+customizations are found.  This alerts users who may otherwise be
+unaware that their mail configuration has changed.
+
+To disable this check, set compose-mail-user-agent-warnings to nil.
+
+** The default value of mail-interactive is t, since Emacs 23.1.
+(This was not announced at the time.)  It means that when sending mail,
+Emacs will wait for the process sending mail to return.  If you
+experience delays when sending mail, you may wish to set this to nil.
+
++++
+** nXML mode is now the default for editing XML files.
+
+** Shell (and other comint modes)
++++
+*** M-s is no longer bound to `comint-next-matching-input'.
++++
+*** M-r is now bound to `comint-history-isearch-backward-regexp'.
+This starts an incremental search of the comint/shell input history.
++++
+*** ansi-color is now enabled by default in Shell mode.
+To disable it, set ansi-color-for-comint-mode to nil.
+
+** Tramp
++++
+*** New connection methods "rsyncc", "imap" and "imaps".
+On systems which support GVFS-Fuse, Tramp offers also the new
+connection methods "dav", "davs", "obex" and "synce".
+
+** VC and related modes
++++
+*** When using C-x v v or C-x v i on a unregistered file that is in a
+directory not controlled by any VCS, ask the user what VC backend to
+use to create a repository, create a new repository and register the
+file.
++++
+*** New command `vc-root-print-log', bound to `C-x v L'.
+This displays a `*vc-change-log*' buffer showing the history of the
+version-controlled directory tree as a whole.
++++
+*** New command `vc-root-diff', bound to `C-x v D'.
+This is similar to `vc-diff', but compares the entire directory tree
+of the current VC directory with its working revision.
++++
+*** `C-x v l' and `C-x v L' do not show the full log by default.
+The number of entries shown can be chosen interactively with a prefix
+argument, or by customizing vc-log-show-limit.  The `*vc-change-log*'
+buffer now contains buttons at the end of the buffer, which can be
+used to increase the number of entries shown.  RCS, SCCS, and CVS do
+not support this feature.
+---
+*** vc-annotate supports annotations through file copies and renames,
+it displays the old names for the files and it can show logs/diffs for
+the corresponding lines.  Currently only Git and Mercurial take
+advantage of this feature.
+---
+*** The log command in vc-annotate can display a single log entry
+instead of redisplaying the full log.  The RCS, CVS and SCCS VC
+backends do not support this.
+---
+*** When a file is not found, VC will not try to check it out of RCS anymore.
+
+*** Diff and log operations can be used from Dired buffers.
+
+*** vc-git changes
+
+**** The short log format for git makes use of the graph display, so
+it's not supported on git versions earlier than 1.5.
+
+**** Support for operating with stashes has been added to vc-dir: the stash list is
+displayed in the *vc-dir* header, stashes can be created, removed, applied and
+their content displayed.
+
+**** vc-dir displays the stash status
+
+**** vc-dir requires at least git-1.5.5.
+
+*** vc-bzr supports operating with shelves: the shelve list is
+displayed in the *vc-dir* header, shelves can be created, removed and applied.
+---
+*** log-edit-strip-single-file-name controls whether or not single filenames
+are stripped when copying text from the ChangeLog to the *VC-Log* buffer.
+
+** Elint
+---
+*** Elint now uses compilation-mode.
+---
+*** Elint can now scan individual files and whole directories,
+and can be run in batch mode.
+---
+*** Elint does a more thorough initialization, and recognizes more built-in
+functions and variables.  Customize `elint-scan-preloaded' if you want
+to sacrifice some accuracy for a faster startup.
+---
+*** Elint attempts some basic understanding of featurep and (f)boundp tests.
+---
+*** Customize `elint-ignored-warnings' to suppress some warnings.
+
+** Miscellaneous
++++
+*** The new command `async-shell-command' bound globally to `M-&' executes
+the command asynchronously without the need to manually add ampersand to
+the end of the command.  Its output appears in the buffer `*Async Shell
+Command*'.
++++
+*** Interactively `multi-isearch-buffers' and `multi-isearch-buffers-regexp'
+read buffer names to search, one by one, ended with RET.  With a prefix
+argument, they ask for a regexp, and search in buffers whose names match
+the specified regexp.  Interactively `multi-isearch-files' and
+`multi-isearch-files-regexp' read file names to search, one by one,
+ended with RET.  With a prefix argument, they ask for a wildcard, and
+search in file buffers whose file names match the specified wildcard.
++++
+*** Autorevert Tail mode now works also for remote files.
++++
+*** The new built-in commands `su' and `sudo' support Tramp.
+That means, they change `default-directory' to the new users value,
+and let commands run under that user permissions.  It works even when
+`default-directory' is already remote.  Calling the external commands
+is possible by `*su' or `*sudo', repectively.
+---
+*** When running in a new enough xterm (newer than version 242), Emacs
+asks xterm what the background color is and it sets up faces
+accordingly for a dark background if needed (the current default is to
+consider the background light).
+
+\f
+* New Modes and Packages in Emacs 23.2
+
+** CEDET (the Collection of Emacs Development Tools) is now in Emacs.
+This is a collection of packages to aid with using Emacs as an IDE
+(integrated development environment):
+
+*** The Semantic package allows the use of parsers to intelligently
+edit and navigate source code.  Parsers for C/C++, Java, Javascript,
+and several other languages are included by default, and Semantic can
+also interface with external tools such as GNU Global and GNU Idutils.
+
+To enable Semantic, use the global minor mode `semantic-mode'.
+See the Semantic manual for details.
+
+*** EDE (Emacs Development Environment) is a package for managing code
+projects, including features such as automatic Makefile generation.
+
+To enable EDE, use the minor mode `global-ede-mode'.
+See the EDE manual for details.
+
+*** SRecode is a library for recoding Semantic tags back into source
+code.  It is currently used by some parts of Semantic and EDE; in the
+future, it may be used for code generation features.
+
+*** The EIEIO library implements a subset of the Common Lisp Object
+System (CLOS).  It is used by the other CEDET packages.
+
+** mpc.el is a front end for the Music Player Daemon.  Run it with M-x mpc.
+
+** htmlfontify.el turns a fontified Emacs buffer into an HTML page.
+
++++
+** js.el is a new major mode for JavaScript files.
+
+** imap-hash.el is a new library to address IMAP mailboxes as hashtables.
+
+\f
+* Incompatible Lisp Changes in Emacs 23.2
+
++++
+** The Lisp reader turns integers that are too large/small into floats.
+For instance, on machines where `536870911' is the largest integer,
+reading `536870912' gives the floating-point object `536870912.0'.
+
+This change only concerns the Lisp reader; it does not affect how
+actual integer objects overflow.
+
+---
+** Several obsolete functions removed.
+The functions have been obsolete since Emacs 19, and are unlikely to
+be in use:
+
+  time-stamp-month-dd-yyyy, time-stamp-dd/mm/yyyy, time-stamp-mon-dd-yyyy
+  time-stamp-dd-mon-yy, time-stamp-yy/mm/dd, time-stamp-yyyy/mm/dd,
+  time-stamp-yyyy-mm-dd, time-stamp-yymmdd, time-stamp-hh:mm:ss,
+  time-stamp-hhmm, baud-rate
+
+---
+** Support for generating Emacs 18 compatible bytecode (by setting
+the variable `byte-compile-compatibility') has been removed.
+
+** In image-mode.el `image-mode-maybe' is obsolete.  Instead, you can
+either use `image-mode' that displays an image file as the actual image
+inititally, or `image-mode-as-text' when you want to display an image file
+as text inititally.  `image-mode-as-text' is a combination of a non-image
+mode from `auto-mode-alist' (or Fundamental mode) and `image-minor-mode'.
+`image-minor-mode' provides `C-c C-c' key binding to toggle image display.
+`image-toggle-display-text' removes image properties.
+`image-toggle-display-image' adds image properties.
+`image-toggle-display' toggles between `image-mode-as-text' and
+`image-mode'.
+
+\f
+* Lisp changes in Emacs 23.2
+
+** All the default-FOO variables that hold the default value of the FOO
+variable, are now declared obsolete.
+
+** read-key is a function halfway between read-event and read-key-sequence.
+It reads a single key, but obeys input and escape sequence decoding.
+
+** Frame parameter changes
++++
+*** You can give the `fullscreen' frame parameter the value `maximized'.
+This maximizes the frame.
++++
+*** The new frame parameter `sticky' makes Emacs frames sticky in
+virtual desktops.
+
+** Completion changes
+
+*** completion-base-size is obsoleted by completion-base-position.
+This change causes a few backward incompatibilities, mostly with
+choose-completion-string-functions where the `mini-p' argument has
+been replaced by a `base-position' argument, and where the `base-size'
+argument is now always nil.
+
+*** New function `completion-in-region' to use the standard completion
+facilities on a particular region of text.
++++
+*** The 4th arg to all-completions (aka hide-spaces) is declared obsolete.
+
+*** completion-annotate-function specifies how to compute annotations
+for completions displayed in *Completions*.
+
+** Minibuffer changes
+---
+*** read-file-name-predicate is obsolete.  It was used to pass the predicate
+to read-file-name-internal because read-file-name-internal abused its `pred'
+argument to pass the current directory, but this hack is not needed
+any more.
+
+** Changes to file-manipulation functions
++++
+*** `delete-directory' has an optional parameter RECURSIVE.
++++
+*** New function `copy-directory', which copies a directory recursively.
+
+** called-interactively-p now takes one argument and replaces interactive-p
+which is now marked obsolete.
+
+** New function set-advertised-calling-convention makes it possible
+to obsolete arguments as well as make some arguments mandatory.
+
+** You can control which binding is preferentially shown in menus and
+docstrings by adding a `:advertised-binding' property to the corresponding
+command's symbol.  That property can hold a single binding or a list
+of bindings.
+
+** Network and process changes
++++
+*** start-process-shell-command and start-file-process-shell-command
+now only take a single `command' argument.
++++
+*** The new variable `process-file-side-effects' should be set to nil
+if a `process-file' call does not change a remote file.  This allows
+file name handlers such as Tramp to optimizations.
++++
+*** make-network-process can now also create `seqpacket' Unix sockets.
+
+** Loading changes
+---
+*** eval-next-after-load is obsolete.
++++
+*** New hook `after-load-functions' run after loading an Elisp file.
+
+** Byte compilation changes
+---
+*** Changing the file-names generated by byte-compilation by redefining
+the function `byte-compile-dest-file' before loading bytecomp.el is obsolete.
+Instead, customize byte-compile-dest-file-function.
+---
+*** `byte-compile-warnings' has new members, `constants' and `suspicious'.
+
+** New macro with-silent-modifications to tweak text properties without
+affecting the buffer's modification state.
+
++++
+** Hash tables have a new printed representation that is readable.
+The feature `hashtable-print-readable' identifies this new
+functionality.
+
+** New functions for performing Unicode normalization:
+ucs-normalize-NFD-region, ucs-normalize-NFD-string,
+ucs-normalize-NFC-region, ucs-normalize-NFC-string,
+ucs-normalize-NFKD-region, ucs-normalize-NFKD-string,
+ucs-normalize-NFKC-region, ucs-normalize-NFKC-string,
+ucs-normalize-HFS-NFD-region, ucs-normalize-HFS-NFD-string,
+ucs-normalize-HFS-NFC-region, ucs-normalize-HFS-NFC-string.
+
++++
+** Face aliases can now be marked as obsolete, using the macro
+`define-obsolete-face-alias'.
+
++++
+** New function `window-full-height-p', analogous to the full-width version.
+
+\f
+* Changes in Emacs 23.2 on non-free operating systems
+
+---
+** On MS-Windows, `display-time' now displays the system load average
+as well as the time, as it does on GNU and Unix.
+
+\f
+* Installation Changes in Emacs 23.1
+
+** The default X toolkit is now Gtk+, rather than Lucid.
+The configure option `--with-gtk' has been removed.  Gtk is now the
+default toolkit, but you can use --with-x-toolkit=gtk if necessary.
+
+** New font code.
+Fonts are handled by new code capable of dealing with multiple font
+backends.  This uses the freetype and fontconfig libraries.
+
+*** Emacs now accepts font names supplied in the fontconfig format
+(e.g. "monospace-12:bold") and GTK format (e.g. "Monospace Bold 12").
+
+*** Added support for local fonts (fonts installed on the machine
+where Emacs is running).
+
+*** Added support for the Xft library for antialiasing.
+
+*** Added support for the otf library for complex text layout by
+OpenType fonts.
+
+*** Added support for the m17n library for text shaping.
+
+** Changes to image support
+
+*** configure now checks for libgif before libungif when searching for
+a GIF library.
+
+*** Emacs now supports the SVG image format through librsvg2.
+
+*** Emacs now supports multi-page TIFF images.
+
+** New NeXTSTEP-based port.
+This provides support for GNUstep (via the GNUstep libraries) and Mac
+OS X (via the Cocoa libraries).
+
+Specify --with-ns to configure for this.  By default, a self-contained
+app will be built (containing all lisp).  To install/share lisp with
+other emacsen (e.g. X11 build) use --disable-ns-self-contained.  See
+nextstep/README and nextstep/INSTALL in the Emacs source directory.
+
+** Mac OS X is no longer supported via Carbon.
+Use the NeXTSTEP port, described above.
+
+** The new configuration option "--with-dbus" enables D-Bus language
+bindings for Emacs.
+
+** Support for many obsolete platforms has been removed.
+See the list at the end of etc/MACHINES for details.
+
+*** Support for systems without alloca has been removed.
+
+*** Support for Sun windows has been removed.
+
+*** The `emacstool' utility has been removed.
+
+** The following platforms will be removed in a future Emacs version:
+If you are still using Emacs on one of these platforms, please email
+emacs-devel@gnu.org to inform the Emacs developers.
+
+*** Old GNU/Linux systems based on libc version 5.
+
+*** Old FreeBSD, NetBSD, and OpenBSD systems based on the COFF
+executable format.
+
+*** Solaris versions 2.6 and below.
+
+*** Solaris on IBM RS6000 machines.
+
+*** UNIX System V (the original SysV, not later platforms based on it).
+
+*** Unixware on non-x86 machines.
+
+*** Platforms not supporting shared libraries (i.e., requiring the
+NO_SHARED_LIBS compilation flag).
+
+** The configure options `--with-gcc', `--without-gcc' have been removed.
+Configure will use gcc by default.  Set the CC environment variable if
+you need control over which C compiler is used.
+
+** The refcards are now shipped as PDF files.
+
+** The manuals are now licensed under the GNU Free Documentation License v1.3,
+or any later version.
+
+** Emacs 23 comes with a new set of default icons.
+Various resolutions are available as etc/images/icons/hicolor/*/apps/emacs.png.
+The Emacs 22 icon is available as `emacs22.png' in the same location.
+\f
+* Changes in Emacs 23.1
+
+** Improved X Window System support
+
+*** Emacs now supports using both X displays and ttys in one session.
+With an Emacs server active (M-x server-start), `emacsclient -t'
+creates a tty frame connected to the running emacs server.  You can
+use any number of different ttys.  `emacsclient -c' creates a new X11
+frame on the current $DISPLAY (or a tty frame if $DISPLAY is not set).
+There may be problems if a display exits unexpectedly and Emacs is compiled
+with Gtk+, see etc/PROBLEMS.
+
+You can test for the presence of this feature in your Lisp code by
+testing for the `multi-tty' feature.
+
+*** Emacs starts in the background, as a daemon, when given the
+--daemon command line argument.  It disconnects from the terminal and
+starts the server.  Clients can connect and create graphical or
+terminal frames using emacsclient.
+
+**** emacsclient starts emacs in daemon mode and connects to it when
+--alternate-editor="" is used (or when the evironment variable
+ALTERNATE_EDITOR is set to "") and emacsclient cannot connect to an
+emacs server.
+
+*** The new command close-display-connection closes a connection to a
+remote display.  There are some bugs for Gtk+.  See etc/PROBLEMS.
+
+*** Emacs now supports the XEmbed specification.
+You can embed Emacs in another application on X11.  The new command line
+option --parent-id is used to pass the parent window id to Emacs.  See
+http://standards.freedesktop.org/xembed-spec/xembed-spec-latest.html
+for details about XEmbed.
+
+*** Emacs can now set the frame opacity.
+The opacity of a frame can be controlled by setting the `alpha' frame
+parameter.  This only takes effect on a compositing window manager for
+the X Window System, such as Compiz, Beryl and Compiz Fusion, on Mac
+OS X, or on Windows 2000 and later versions of Windows.
+
+The alpha parameter should be an integer between 0 (transparent) and
+100 (opaque), or a float number between 0.0 and 1.0.  It can also be a
+cons cell (ACTIVE . INACTIVE), where ACTIVE is the opacity of an
+active frame and INACTIVE is the opacity of non-active frames.
+
+The variable `frame-alpha-lower-limit' defines a lower bound for the
+opacity; the default is 20.
+
+** Internationalization changes
+
+*** The Emacs character set is now a superset of Unicode.
+(It has about four times the code space, which should be plenty).
+
+The internal encoding used for buffers and strings is now
+Unicode-based and called `utf-8-emacs' (`emacs-internal' is an alias
+for this).  This encoding is backward-compatible with Unicode's UTF-8
+encoding.  The internal encoding previously used by Emacs,
+`emacs-mule', is still available for reading and writing files.
+
+During byte-compilation, Emacs 23 uses `utf-8-emacs' to write files.
+As a result, byte-compiled files containing non-ASCII characters can't
+be read by earlier versions of Emacs.  Files compiled by Emacs 20, 21,
+or 22 are loaded correctly as `emacs-mule' (whether or not they
+contain multibyte characters).  This takes somewhat more time, so it
+may be worth recompiling existing .elc files which don't need to be
+shared with older Emacsen.
+
+*** There are new coding systems/aliases; see M-x list-coding-systems.
+
+*** There is a new charset implementation with many new charsets.
+See M-x list-character-sets.  New charsets can be defined conveniently
+as tables of unicodes.
+
+*** There are new language environments for Chinese-GBK,
+Chinese-GB18030, Khmer, Bengali, Punjabi, Gujarati, Oriya, Telugu,
+Sinhala, and TaiViet.
+
+*** The minor modes unify-8859-on-encoding-mode and
+unify-8859-on-decoding-mode are obsolete.
+
+*** `ucs-insert' is bound to `C-x 8 RET' and in addition to hex numbers
+accepts numbers in hash notation (e.g. #o21430 for octal, or #10r8984 for
+decimal).  It also accepts Unicode character names with completion.
+
+*** The `cyrillic-translit' input method supports many new characters.
+Common typographical characters available from Unicode were added to
+`cyrillic-translit': punctuation marks, accented characters, fractions,
+and others.
+
+** Emacs now supports serial port access on GNU/Linux, Unix, and
+Windows.  The new command `serial-term' starts an interactive terminal
+on a serial port.  The serial port can be configured at runtime with
+the mode-line mouse menu.
+
+** Menu Bar changes
+
+*** In the Options menu, the "Set Default Font" item applies the
+selected font to the `default' face on all frames, not just the
+current frame.  Furthermore, if Emacs is compiled with both GTK and
+Fontconfig support, the "Set Default Font" item uses the GTK font
+selection dialog instead of an Emacs pop-up menu.
+
+*** The font setting chosen by "Set Default Font" is saved if the
+"Save Options" item is used.
+
+*** The Tools menu contains a new Encryption/Decryption submenu.
+This contains commands provided by EasyPG, the newly-included
+interface to GnuPG (see New Modes and Packages).
+
+*** In the Options menu, the "Truncate Long Lines in the Buffer" entry
+has been replaced with a submenu offering three different ways to
+handle long lines: truncation, continuation at the window edge, and
+the new word wrapping behavior (see Editing Changes, below).
+
+*** Improvements to menus for major and minor modes
+More major and minor modes now have a mode specific menu, and existing
+mode menus have been improved to include more functionality.
+
+** Mode-line changes
+
+*** The mode-line displays a `@', instead of `-', if the
+default-directory for the current buffer is on a remote machine.
+
+*** The mode-line displays a mode menu when mouse-1 is clicked on a
+minor mode, in the same way as it already did for major modes.
+
+*** The `mode-line-emphasis' face is used to highlight certain
+mode-line information (e.g. waiting for a VC command to finish).
+
+*** The mode-line tooltips have been improved to provide more details.
+
+*** The VC, line/colum number and minor mode indicators on the mode
+line are now interactive: mouse-1 can be used on them to pop up a menu.
+
+** File deletion can make use of the Recycle Bin or system Trash folder.
+Set `delete-by-moving-to-trash' non-nil to use this.  Deleted files
+and directories will then be sent to the Recycle Bin on Windows, and
+to `trash-directory' on other systems.
+
+** Directory-local variables can now be defined.
+By default, Emacs looks in .dir-locals.el for directory-local
+variables.  For more information, see `dir-locals-set-directory-class'
+and `dir-locals-set-class-variables'.
+
+** Emacs can now use `auth-source' for authentication.
+`smtpmail' and `url' (Tramp and Gnus also) use `auth-source' to obtain
+login names and passwords.  The match, if found, is reported
+in *Messages* with the password blanked out.
+
+** `where-is-preferred-modifier' can specify your favorite modifier.
+
+\f
+* Startup Changes in Emacs 23.1
+
+** The option `inhibit-startup-screen' (with aliases to old names
+`inhibit-splash-screen' and `inhibit-startup-message') doesn't inhibit
+display of the initial message in the *scratch* buffer.  If you don't
+want to display the initial message in the *scratch* buffer at startup,
+you can set the option `initial-scratch-message' to nil.
+
+** New user option `initial-buffer-choice' specifies what to display
+after starting Emacs: startup screen, *scratch* buffer, visiting a
+file or directory.
+
+** New alias `argv' for `command-line-args-left'
+This is a convenience alias, so that one can write `(pop argv)'
+inside of --eval command line arguments in order to access
+following arguments.
+
+** The abbrev file is no longer read at startup in batch mode.
+
+** Emacs now supports invocation by an X session manager.
+It can save a session and restore it later.  See the documentation of
+the functions `emacs-session-save' and `emacs-session-restore'.
+(Actually, this feature was introduced with Emacs 22, but it was not
+documented.)
+\f
+* Incompatible Editing Changes in Emacs 23.1
+
+** In Dired, `dired-flag-garbage-files' is rebound from `&' to `%&'
+on the regexp command prefix map.
+
+** In Dired-x, all command guesses for ! are now added to the default
+list accessible by M-n instead of pushing all guesses temporarily into
+the history list.
+
+** In Isearch mode, a special case of typing `C-w' at the beginning of
+the minibuffer that toggles word search (i.e. using key sequences
+`C-s RET C-w' or `C-s M-e C-w') is obsolete.  You can use the global key
+`M-s w' to start word search, or type `M-s w' in Isearch mode to
+toggle word search.  To start nonincremental word search you can now use
+`M-s w RET' and `M-s w C-r RET' instead of `C-s RET C-w' and `C-r RET C-w'.
+
+** In Info, `Info-search' is unbound from `M-s' to allow using `M-s w'
+for word search as well as other search commands from the global prefix
+key `M-s'.  `Info-search' is still bound to `s', and also incremental
+search commands `C-s', `C-M-s', `C-r', `C-M-r' are available for searching
+through multiple Info nodes, together with their nonincremental versions
+`C-s RET', `C-r RET', `C-M-s RET', `C-M-r RET', `M-s w RET'.
+
+** In Text mode, `center-line' and `center-paragraph' are rebound from
+`M-s' and `M-S' to global keys `M-o M-s' and `M-o M-S' on the global
+prefix map `M-o', which is intended for such formatting commands.
+
+** The following input methods were removed in Emacs 22.2, but this was
+not advertised: danish-alt-postfix, esperanto-alt-postfix,
+finnish-alt-postfix, german-alt-postfix, icelandic-alt-postfix,
+norwegian-alt-postfix, scandinavian-alt-postfix, spanish-alt-postfix,
+and swedish-alt-postfix.  Use the versions without "alt-", which are
+identical.
+
+\f
+* Editing Changes in Emacs 23.1
+
+** The C-n and C-p line-motion commands now move by screen lines,
+taking continued lines and variable-width characters into account.
+Setting `line-move-visual' to nil reverts this to the previous
+behavior (i.e., motion by logical lines based on buffer contents
+alone).
+
+** C-x C-c now invokes `save-buffers-kill-terminal', and C-z now
+invokes `suspend-frame'.  These changes are for compatibility with the
+new multi-tty support (see `Improved X Window System support' above).
+
+** Mark changes
+
+*** Transient Mark mode is now on by default.
+
+*** mark-even-if-inactive now defaults to t
+
+*** When Transient Mark mode is on, C-SPC C-SPC pushes a mark without
+activating it.
+
+*** When Transient Mark mode is on, M-q now fills the region if the
+region is active.  Otherwise, it fills the current paragraph.
+
+*** When Transient Mark mode is on, M-$ now checks spelling of the
+region if the region is active.  Otherwise, it checks spelling of the
+word at point.
+
+*** When Transient Mark mode is on, TAB now indents the region if the
+region is active.
+
+*** The variable `use-empty-active-region' controls whether an empty
+active region in Transient Mark mode should make commands operate on
+that empty region.
+
+** Temporarily active regions
+
+*** The new variable shift-select-mode, non-nil by default, controls
+shift-selection.  When Shift Select mode is on, shift-translated
+motion keys (e.g. S-left and S-down) activate and extend a temporary
+region, similar to mouse-selection.
+
+*** Temporarily active regions, created using shift-selection or
+mouse-selection, are not necessarily deactivated in the next command.
+They are only deactivated after point motion commands that are not
+shift-translated, or after commands that would ordinarily deactivate
+the mark in Transient Mark mode (e.g., any command that modifies the
+buffer).
+
+** Minibuffer and completion changes
+
+*** Emacs may ask for confirmation before opening a non-existent file
+or buffer.  By default, Emacs requests confirmation if you type RET
+immediately after TAB, and the resulting input is not an existing file
+or buffer; this usually happens when the minibuffer input did not
+complete far enough and you entered RET by mistake.  In that case,
+Emacs puts the message "[Confirm]" in the minibuffer; type RET again
+to create the file or buffer.
+
+The new variable confirm-nonexistent-file-or-buffer determines whether
+Emacs asks for confirmation.  The default value is `after-completion'.
+If you change it to t, Emacs always asks for confirmation; if you
+change it to nil, Emacs never asks for confirmation.
+
+*** The rules for performing completion have been changed.
+When generating completion alternatives, Emacs now takes the
+minibuffer text after point, if any, into account: this text is
+treated as a substring of the remaining part of the completion
+alternative (i.e., the part not matched by the minibuffer text before
+point).  If no completion alternatives are found this way, Emacs
+attempts to perform partial-completion.  If still no completion
+alternatives are found, we fall back on the Emacs 22 rules for
+performing completion.
+
+The new variable `completion-styles' can be customized to choose your
+favorite completion style.
+
+*** When M-n in the minibuffer reaches the end of the list of defaults,
+it adds the completion list to the end, so next M-n continues putting
+completion items to the minibuffer.  The same principle applies to
+incremental search commands as well: C-s or C-M-s starts searching
+the default values and after the end of defaults they continue
+searching minibuffer completion items.
+
+*** Minibuffer input of shell commands now comes with completion.
+
+*** In the `C-x d' (Dired) prompt, typing M-n gives the visited file
+name of the current buffer.
+
+*** In the M-! (shell-command) prompt, M-n provides some default commands.
+These are guessed using the file extension of the current file, based
+on the file-handlers specified in the operating system's `mailcap'
+file.  The ! command in Dired (dired-do-shell-command) works
+similarly, using the file displayed on the current line.
+
+*** A list of regexp default values is available via M-n for `occur',
+`keep-lines', `flush-lines' and `how-many'.  This list includes the active
+region in transient-mark-mode, the word under the cursor, the last Isearch
+regexp, the last Isearch string and the last replacement regexp.
+
+*** When enable-recursive-minibuffers is non-nil, operations which use
+switch-to-buffer (such as C-x b and C-x C-f) do not fail any more when
+used in a minibuffer or a dedicated window.  Instead, they fallback on
+using pop-to-buffer, which will use some other window.  This change
+has no effect when enable-recursive-minibuffers is nil (the default).
+
+*** Isearch started in the minibuffer searches in the minibuffer history.
+Reverse Isearch commands (C-r, C-M-r) search in previous minibuffer
+history elements, and forward Isearch commands (C-s, C-M-s) search in
+next history elements.  When the reverse search reaches the first history
+element, it wraps to the last history element, and the forward search
+wraps to the first history element.  When the search is terminated, the
+history element containing the search string becomes the current.
+
+*** The variable read-file-name-completion-ignore-case overrides
+completion-ignore-case for file name completion.
+
+*** The variable read-buffer-completion-ignore-case overrides
+completion-ignore-case for buffer name completion.
+
+*** The new command `minibuffer-force-complete' chooses one of the
+possible completions, rather than stopping at the common prefix.
+
+*** If `completion-auto-help' is `lazy', Emacs shows the completions
+buffer only on the second attempt to complete.  This was already
+supported in `partial-completion-mode'.
+
+** Face changes
+
+*** S-down-mouse-1 now pops up a menu for changing the font and text
+size of the default face in the current buffer.  The face is changed
+via face remapping (see Lisp changes, below).
+
+*** New commands to change the default face size in the current buffer.
+To increase it, type `C-x C-+' or `C-x C-='.  To decrease it, type
+`C-x C--'.  To restore the default (global) face size, type `C-x C-0'.
+These work via Text Scale mode, a new minor mode.
+
+The final key in the above commands may be repeated without the
+leading `C-x', e.g. `C-x C-= C-= C-=' increases the face height by
+three steps.  Each step scales the height of the default face by the
+value of the variable `text-scale-mode-step'.
+
+*** The commands buffer-face-mode and buffer-face-set can be used to
+remap the default face in the current buffer.  See "Buffer Face mode",
+under New Modes and Packages.
+
+** Primary selection changes
+
+*** You can disable kill ring commands from accessing the primary
+selection by setting `x-select-enable-primary' to nil.
+
+** Continuation lines can now be wrapped at word boundaries
+(word-wrapping).  This is controlled by the new per-buffer variable
+`word-wrap'.  Word wrapping does not take place if continuation lines
+are not shown, e.g. if truncate-lines is non-nil.  The most convenient
+way to enable word-wrapping is using the new minor mode Visual Line
+mode; in addition to setting `word-wrap' to t, this rebinds some
+editing commands to work on screen lines rather than text lines.  See
+New Modes and Packages, below.
+
+** Window management changes
+
+*** truncate-partial-width-windows now accepts integer values, which
+specify a minimum window width for partial-width windows, below which
+lines are truncated.  The default has been changed to 50.
+
+*** The new command balance-windows-area balances windows both
+vertically and horizontally.
+
+*** pop-to-buffer now always sets input focus when the popped-to window
+is on a different frame.
+
+** Miscellaneous changes:
+
+*** C-l is bound to the new command recenter-top-bottom, rather than recenter.
+This moves the current line to window center, top and bottom on
+successive invocations.
+
+*** scroll-preserve-screen-position also preserves the column position.
+
+*** If `yank-pop-change-selection' is t, rotating the kill ring also
+updates the selection or clipboard to the current yank, just as M-w
+would do so with the text it copies to the kill ring.
+
+*** C-M-% now shows replacement as it would look in the buffer, with
+`\N' and `\&' substituted according to the match.  Old behavior can be
+restored by customizing `query-replace-show-replacement'.
+
+*** The command shell prompts for the default directory, when it is
+called with a prefix and the default directory is a remote file name.
+This is because some file name handlers (like ange-ftp) are not able to
+run processes remotely.
+
+*** The new command kill-matching-buffers kills buffers whose name
+matches a regexp.
+
+*** The value of comment-style now defaults to `indent'.
+Thefore, comment-start markers are inserted at the current indentation
+of the region to comment, rather than the leftmost column.
+
+*** The new commands `pp-macroexpand-expression' and
+`pp-macroexpand-last-sexp' pretty-print macro expansions.
+
+*** The new command `set-file-modes' allows to set file's mode bits.
+The mode bits can be specified in symbolic notation, like with GNU
+Coreutils, in addition to an octal number.  `chmod' is a new
+convenience alias for this function.
+
+*** `next-error-recenter' specifies how next-error should recenter the
+visited source file.  Its value can be a number (for example, 0 for
+top line, -1 for bottom line), or nil for no recentering.
+
+*** When typing in a password in the echo area, C-y yanks the current
+kill into the password.
+
+*** Tooltip frame parameters `font' and `color' in `tooltip-frame-parameters'
+are ignored.  Customize the `tooltip' face instead.
+
+*** `mkdir' is a new convenience alias for `make-directory'.
+\f
+* New Modes and Packages in Emacs 23.1
+
+** Auto Composition Mode is a minor mode that composes characters
+automatically when they are displayed.  It is globally on by default.
+It uses `auto-composition-function' (default `auto-compose-chars').
+
+** Bubbles, a new game, is similar to SameGame.
+
+** Buffer Face mode is a minor mode for remapping the default face in
+the current buffer.  The variable `buffer-face-mode-face' specifies
+the face to remap to.  The command `buffer-face-set' prompts for a
+face name, sets `buffer-face-mode-face' to it, and enables
+buffer-face-mode.  See "Face changes", under Editing Changes, for a
+description of face remapping.
+
+** butterfly flips the desired bit on the drive platter.
+See http://xkcd.com/378/
+
+** bug-reference.el provides clickable links to bug reports.
+
+** dbus.el provides D-Bus language bindings.
+D-Bus is an inter-process communication mechanism for applications
+residing on the same host.  See the manual for details.
+
+** DocView mode allows viewing of PDF, PostScript and DVI documents.
+One can also search for a regular expression in the document.  For
+details, see the commentary in doc-view.el.
+
+PDF and DVI files are now opened in Doc View mode by default.
+
+In Postcript mode, C-c C-c launches Doc View minor mode for viewing
+the postscript file.
+
+** EasyPG provides an interface to the GNU Privacy Guard (GnuPG).
+It includes a GnuPG keyring browser, cryptographic operations on
+regions and files, and automatic encryption of *.gpg files.  For
+details, see the EasyPG Assistant User's Manual.
+
+** json.el is a library for parsing and generating JSON
+(JavaScript Object Notation), a lightweight data-interchange format.
+
+** linum.el is a new minor mode to display line numbers for the
+current buffer.
+
+** mairix.el is an interface to mairix, a free tool for indexing and
+searching locally stored mail.  It allows you to query mairix and
+display the search results with Rmail, Gnus and VM.  Note that there
+is an existing Gnus back end, nnmairix.el, which should be used with
+Maildir/MH setups.
+
+** minibuffer-depth-indicate-mode shows the minibuffer depth in the prompt.
+
+** nXML Mode
+This is a new mode for editing XML documents.  It allows a schema to
+be associated with the XML document being edited, using Relax NG as
+the schema language.  The schema is used to provide two key features:
+
+*** Continuous validation.  nXML validates as you type, highlighting
+any invalid parts of your document.
+
+*** Completion.  nXML can assist you in entering an element name,
+attribute name or data value by using information about what is
+allowed by the schema in that context.
+
+** proced.el provides a Dired-like interface for operating on
+processes.  Proced makes an Emacs buffer containing a listing of the
+current processes.  You can use the normal Emacs commands to move
+around in this buffer, and special Proced commands to operate on the
+processes listed.  It is currently only functional on GNU/Linux,
+MS-Windows and Solaris.
+
+** Remember Mode is a mode for jotting down things to remember.
+Notes can be saved to a Diary file.  For details, see the Remember
+Manual.
+
+** RST mode is a major mode for editing reStructuredText files.
+
+** Ruby mode is a major mode for Ruby files.
+
+** Visual Line mode provides support for editing by visual lines.
+It turns on word-wrapping in the current buffer, and rebinds C-a, C-e,
+and C-k to commands that operate by visual lines instead of logical
+lines.  This is a more reliable replacement for longlines-mode.
+This can also be turned on using the menu bar, via
+Options -> Line Wrapping in this Buffer -> Word Wrap
+
+** xesam.el is an implementation of Xesam, an interface to (desktop)
+search engines like Beagle, Strigi, and Tracker.  The Xesam API
+requires D-Bus for communication.
+
+** zeroconf.el offers service discovery and service publishing
+interfaces according to the zeroconf specification.  It communicates
+with Avahi, a zeroconf implementation, via D-Bus messages on systems
+which have installed this software.
+
+** There is a new `whitespace' package.
+(The pre-existing one has been renamed to `old-whitespace'.)
+Now, besides reporting bogus blanks, the whitespace package has a
+minor mode and a global minor mode to visualize blanks (TAB, (HARD)
+SPACE and NEWLINE).  The visualization is made via faces and/or display
+table.  It can also indicate lines that extend beyond a given column,
+trailing blanks, and empty lines at the start or end of a buffer.
+See `whitespace-style' for more details.  The `whitespace-action' option
+specifies what to do when a buffer is visited, killed, or written.
+
+\f
+* Changes in Specialized Modes and Packages in Emacs 23.1
+
+** Abbrev has been rewritten in Elisp and extended with more flexibility.
+
+*** New functions: abbrev-get, abbrev-put, abbrev-table-get, abbrev-table-put,
+abbrev-table-p, abbrev-insert, abbrev-table-menu.
+
+*** Special hook `abbrev-expand-functions' obsoletes `pre-abbrev-expand-hook'.
+
+*** `make-abbrev-table', `define-abbrev', `define-abbrev-table' all take
+extra arguments for arbitrary properties.
+
+*** New variable `abbrev-minor-mode-table-alist'.
+
+*** `local-abbrev-table' can hold a list of abbrev-tables.
+
+*** Abbrevs have now the following special properties:
+`:count', `:system', `:enable-function', `:case-fixed'.
+
+*** Abbrev-tables have now the following special properties:
+`:parents', `:case-fixed', `:enable-function', `:regexp',
+`abbrev-table-modiff'.
+
+** Apropos
+
+*** `apropos-library' describes the elements defined in a given library.
+
+*** Set `apropos-compact-layout' is you want a more compact (but wider) layout.
+
+** Archive Mode has basic support to browse Rar archives.
+Note, however, that the free version of the unrar command only handles
+versions 1 and 2 of the Rar format.
+
+** BibTeX mode
+
+*** New command `bibtex-initialize' (re)initializes BibTeX buffers.
+
+*** New `bibtex-entry-format' options `whitespace', `braces', and
+`string', disabled by default.
+
+*** New variable `bibtex-cite-matcher-alist' contains rules to
+identify cited keys in BibTeX entries, used by `bibtex-find-crossref'.
+
+*** Command `bibtex-url' allows multiple URLs per entry.
+
+** Bookmarks
+
+*** bookmark.el saves bookmarks in a pre-Emacs-23-incompatible file format
+bookmark.el can read a .emacs.bmk file saved by an older Emacs, but an
+older Emacs cannot read one saved by Emacs 23.
+
+** Calendar and diary
+
+*** There is a new date style, `iso', essentially year/month/day.
+The variable `european-calendar-style' is obsolete - use `calendar-date-style'.
+Similarly, the commands `american-calendar' and `european-calendar'
+should be replaced by `calendar-set-date-style'.
+
+*** The calendar namespace has been rationalized.
+All functions and variables now begin with a `calendar-', `diary-', or
+`holiday-' prefix.  The various calendar systems have secondary
+prefixes, eg `calendar-french-'.  The old names you are likely to use
+directly still exist, for the time being, as aliases, but please start
+using the new names.
+
+*** The whitespace in the calendar layout can be customized.
+See the variables:
+calendar-left-margin, calendar-intermonth-spacing, calendar-column-width,
+calendar-day-header-width, and calendar-day-digit-width.
+
+*** Text (e.g. ISO weeks) can be displayed between the calendar months.
+See the variables calendar-intermonth-header and calendar-intermonth-text.
+
+*** The function `holiday-chinese' computes holidays on the Chinese calendar.
+It has been used to add items to the list `holiday-oriental-holidays'.
+
+*** `diary-remind' accepts a negative number -DAYS as a shorthand for
+the list (1 2 ... DAYS).
+
+** Change Log mode
+
+*** The new command C-c C-f (change-log-find-file) finds the file
+associated with the current log entry.
+
+*** The new command C-c C-c (change-log-goto-source) goes to the
+source code associated with a log entry.
+
+** Compile and grep modes
+
+*** The mode-line entry for the *compilation* and *grep* buffer is color coded.
+It has different colors for to show that: (a) the command is still
+running, (b) successful completion, (c) error.
+
+*** compilation-auto-jump-to-first-error tells `compile' to jump to
+the first error encountered during compilations.
+
+*** compilation-scroll-output accepts a new value, `first-error', which
+says to stop auto scrolling at the first error that occurs.
+
+*** The `cc' alias for C++ files in `grep-file-aliases' has been
+improved.  `hh' can be used to match C++ header files and `cchh' both
+C++ sources and headers.
+
+** Copyright
+
+*** You can specify your copyright holders' names.
+Only copyright lines with holders matching `copyright-names-regexp' are
+considered for update.
+
+*** Copyrights can be at the end of the buffer.
+This is controlled by `copyright-at-end-flag' (used by, e.g., change-log-mode).
+
+** Custom
+
+*** defcustom accepts new keyword arguments, `:safe' and `:risky', which
+set a variable's `safe-local-variable' and `risky-local-variable' property.
+
+** Diff mode
+
+*** diff-refine-hunk highlights word-level details of changes in a diff hunk.
+It's used automatically as you move through hunks, see
+diff-auto-refine-mode.  It is bound to `C-c C-b'.
+
+*** diff-add-change-log-entries-other-window iterates through the diff
+buffer and tries to create ChangeLog entries for each change.
+It is bound to `C-x 4 A'.
+
+*** Turning on `whitespace-mode' in a diff buffer will show trailing
+whitespace problems in the modified lines.
+
+** Dired
+
+*** In Dired, C-x C-q now runs the command wdired-change-to-wdired-mode,
+and C-x C-q in wdired-mode exits it with asking a question about
+saving changes.
+
+*** `&' runs the command `dired-do-async-shell-command' that executes
+the command asynchronously without the need to manually add ampersand
+to the end of the command.  Its output appears in the buffer `*Async Shell
+Command*'.
+
+*** `M-s f C-s' and `M-s f M-C-s' run Isearch that matches only at file names.
+When a new user option `dired-isearch-filenames' is t, then even ordinary
+Isearch started with `C-s' and `C-M-s' matches only at file names in the
+Dired buffer.  When `dired-isearch-filenames' is `dwim' then activation of
+file name Isearch depends on the position of point - if point is on a file
+name initially, then Isearch matches only file names, otherwise it matches
+everywhere in the Dired buffer.  You can toggle file names matching on or
+off by typing `M-s f' in Isearch mode.
+
+*** `M-s a C-s' and `M-s a M-C-s' run multi-file Isearch on the marked files.
+They visit the first marked file in the sequence and display the usual Isearch
+prompt for a string or a regexp where all Isearch commands are available.
+
+*** `Q' in Dired provides two new keys for multi-file replacement.
+The upper case key `Y' replaces all remaining matches in all remaining files
+with no more questions.  The upper case key `N' stops doing replacements
+in the current file and skips to the next file.  These multi-file keys
+are available for all commands that use `tags-query-replace'
+including `dired-do-query-replace-regexp', `vc-dir-query-replace-regexp',
+`reftex-query-replace-document'.
+
+** Fortran
+
+*** The line length of fixed-form Fortran is not fixed at 72 any more.
+Customize the variable `fortran-line-length' to change it.
+
+*** In Fortran mode, M-; is now bound to the standard comment-dwim,
+rather than fortran-indent-comment.
+
+*** (The increasingly misnamed) F90 mode supports Fortran 2003 syntax.
+
+** Gnus
+
+*** The Gnus package has been updated
+There are many news features, bug fixes and improvements; see the file
+GNUS-NEWS or the node "No Gnus" in the Gnus manual for details.
+
+*** In Emacs 23, Gnus uses Emacs' new internal coding system `utf-8-emacs' for
+saving articles drafts and ~/.newsrc.eld.  These file may not be read
+correctly in Emacs 22 and below.  If you want to Gnus across different Emacs
+versions, you may set `mm-auto-save-coding-system' to `emacs-mule'.
+
+*** Passwords are consistently loaded through `auth-source'
+Gnus can use `auth-source' for POP and IMAP passwords.  Also see that
+`smtpmail' and `url' support `auth-source' for SMTP and HTTP/HTTPS/RSS
+authentication respectively.
+
+** Help mode
+
+*** New macro `with-help-window' should set up help windows better
+than `with-output-to-temp-buffer' with `print-help-return-message'.
+
+*** New option `help-window-select' permits to customize whether help
+window shall be automatically selected when invoking help.
+
+*** New variable `help-window-point-marker' permits one to specify a new
+position for point in help window (for example in `view-lossage').
+
+** Isearch
+
+*** New command `isearch-forward-word' bound globally to `M-s w' starts
+incremental word search.  New command `isearch-toggle-word' bound to the
+same key `M-s w' in Isearch mode toggles word searching on or off
+while Isearch is active.
+
+*** New command `isearch-highlight-regexp' bound to `M-s h r' in Isearch
+mode runs `highlight-regexp' (`hi-lock-face-buffer') with the current
+search string as its regexp argument.  The same key `M-s h r' and
+other keys on the `M-s h' prefix are bound globally to the command
+`highlight-regexp' and other hi-lock commands.
+
+*** New command `isearch-occur' bound to `M-s o' in Isearch mode
+runs `occur' with the current search string.  The same key `M-s o'
+is bound globally to the command `occur'.
+
+*** Isearch can now search through multiple ChangeLog files.
+When running Isearch in a ChangeLog file, if the search fails,
+then another C-s tries searching the previous ChangeLog,
+if there is one (e.g. going from ChangeLog to ChangeLog.12).
+This is enabled if multi-isearch-search is non-nil.
+
+*** Two new commands to start Isearch on a list of marked buffers
+for buff-menu.el and ibuffer.el are bound to the keys `M-s a C-s' and
+`M-s a M-C-s'.
+
+*** The part of an Isearch that failed to match is highlighted in
+`isearch-fail' face.
+
+*** `C-h C-h' in Isearch mode displays isearch-specific Help screen,
+`C-h b' displays all Isearch key bindings, `C-h k' displays the full
+documentation of the given Isearch key sequence, `C-h m' displays
+documentation of Isearch mode.  All the rest Help commands exit Isearch mode
+and execute their global definitions.
+
+*** When started in the minibuffer, Isearch searches in the minibuffer
+history.  See `Minibuffer changes', above.
+
+** MH-E
+
+*** Upgraded to MH-E version 8.2.  See MH-E-NEWS for details.
+
+** Python
+*** The file etc/emacs.py now supports both Python 2 and 3, meaning
+that either version can be used as inferior Python by python.el.
+
+*** Python mode now has `pdbtrack' functionality.  When using pdb to
+debug a Python program, pdbtrack notices the pdb prompt and displays
+the source file and line that the program is stopped at, much the same
+way as gud-mode does for debugging C programs with gdb.
+
+** Recentf
+
+*** The default value of `recentf-keep' prevents from checking of
+remote files, if there is no established connection to the
+corresponding remote host.
+
+** Rmail
+
+*** Rmail no longer converts the messages to Babyl format.
+Instead, it uses UNIX mbox format, both on disk and in Rmail buffers,
+and does conversion and decoding when a message is displayed.
+
+The first time you visit an Rmail file in Babyl format, Rmail
+automatically converts it to mbox format.  This is a one-time
+conversion, but it can take a few minutes, depending on how fast is
+your machine and on the size of the file.  You should find the rest of
+Rmail usage unaltered.
+
+However, M-x set-rmail-inbox-list now lasts only for one session
+because there is no way to save the list of inbox files in an
+mbox-format file.
+
+Also, whereas with Babyl format M-x find-file would switch to Rmail
+mode, with mbox format this is no longer the case (there being no way
+to add an "-*- rmail-*-" cookie to an mbox file).  Use C-u M-x rmail
+instead.
+
+If you have written any extensions to Rmail, they are likely to need
+updating.  Conceptually, the Rmail buffer that you see is no longer
+just a narrowed portion of the whole.  So you cannot access the whole
+of a message (or message collection) by a simple save-restriction and
+widen.  Instead, there are two buffers: the rmail-buffer, and the
+rmail-view-buffer.  The former is the buffer that you see, the latter
+is invisible.  Most of the time, the invisible `view' buffer contains
+the full contents of the Rmail file, and the Rmail buffer contains a
+decoded copy of the current message (with only a subset of the
+headers).  In this state, Rmail is said to be `swapped'.
+
+You may find the following functions useful:
+
+`rmail-get-header' and `rmail-set-header' get or set the value of a
+message header, whether or not it is currently visible.
+
+`rmail-apply-in-message' is a general purpose function that calls a
+function (with arguments) which you specify on the full text of a given
+message.  To further narrow to just the headers, search forward for "\n\n".
+
+*** The new command `rmail-mime' displays MIME messages.
+It is bound to `v' in Rmail buffers and summaries.  It displays plain
+text and multipart messages in a temporary buffer, and offers buttons
+to save attachments.
+
+*** The command `rmail-redecode-body' no longer accepts the optional arg RAW.
+Since Rmail now holds messages in their original undecoded form in a
+separate buffer, `rmail-redecode-body' no longer encodes the original
+message, and therefore there should be no need to avoid encoding it.
+
+*** The o command is now `rmail-output'.  It is an all-purpose command
+for copying messages from Rmail and appending them to files.  It
+handles Babyl-format files as well as mbox-format files, and it
+handles both kinds properly when they are visited in Emacs.  It always
+copies the full headers of the message.
+
+*** The C-o command is now `rmail-output-as-seen'.  It uses
+the message as displayed, appending it to an mbox file.
+
+*** The modified status of the Rmail buffer is reported in the mode-line.
+Previously, this information was hidden.
+
+** TeX modes
+
+*** New option latex-indent-within-escaped-parens
+permits to customize indentation of LaTeX environments delimited
+by escaped parens.
+
+** T-mouse Mode
+
+*** If the gpm mouse server is running and t-mouse-mode is enabled,
+Emacs uses a Unix socket in a GNU/Linux console to talk to server,
+rather than faking events using the client program mev.  This C level
+approach provides mouse highlighting and help echoing in the
+minibuffer.
+
+** Tramp
+
+*** New connection methods.
+The new methods "plinkx", "plink2", "psftp", "sftp" and "fish" have
+been introduced.  There are also new so-called gateway methods
+"tunnel" and "socks".
+
+*** IPv6 addresses.
+IPv6 addresses are supported now as host names.  They must be embedded
+in square brackets, like in "/ssh:[::1]:".
+
+*** Multihop syntax has been removed.
+The pseudo-method "multi" has been removed.  Instead, multi hops
+can be specified by the new variable `tramp-default-proxies-alist'.
+
+*** More default settings.
+Default values can be set via the variables `tramp-default-user',
+`tramp-default-user-alist' and `tramp-default-host'.
+
+*** Connection information is cached.
+In order to reduce connection setup, information about used
+connections is kept persistently in a file.  The name of this file is
+defined in the variable `tramp-persistency-file-name'.
+
+*** Control of remote processes.
+Running processes on a remote host can be controlled by settings in
+`tramp-remote-path' and `tramp-remote-process-environment'.
+
+*** Success of remote copy is checked.
+When the variable `file-precious-flag' is set, the success of a remote
+file copy is checked via the file's checksum.
+
+*** Passwords can be read from an authentification file.
+Tramp uses the package `auth-source' to read passwords from a file, if
+necessary.
+
+** VC and related modes
+
+*** VC now supports applying VC operations to a set of files at a time.
+This enables VC to work much more effectively with changeset-oriented
+version-control systems such as Subversion, GNU Arch, Mercurial, Git
+and Bzr.  VC will now pass a multiple-file commit to these systems as
+a single changeset.
+
+*** vc-dir is a new command that displays file names and their VC
+status.  It allows to apply various VC operations to a file, a
+directory or a set of files/directories.
+
+*** VC switches are no longer appended, rather the first non-nil value is used.
+(This was for the most part true in Emacs 22, but was not advertised).
+This is because there is an increasing variety of VC systems, and they
+do not all accept the same "common" options.  For example, a CVS diff
+command used to append the values of `vc-cvs-diff-switches',
+`vc-diff-switches', and `diff-switches'.  Now the first non-nil value
+from that sequence is used.  The special value `t' means "no switches".
+
+*** Clicking on the VC mode-line entry now pops the VC menu.
+
+*** The VC mode-line entry now has a tooltip that explains the VC file status.
+
+*** In VC Annotate mode, the key bindings have changed to use lower
+case keys instead of the upper case keys used in the past.
+
+*** In VC Annotate mode, for VC systems that support changesets, you can
+see the diff for the whole changeset (not only for the current file)
+by typing the D key.  Using the "Show changeset diff of revision at
+line" menu entry does the same thing.
+
+*** In VC Annotate mode, you can type v to toggle the annotation visibility.
+
+*** In VC Annotate mode, you can type f to show the file revision on
+the current line.
+
+*** Asynchronous VC commands display [Waiting...] in the mode-line
+of the corresponding buffer as long as the asynchronous process is
+active.
+
+*** Log entries can be modified using the key "e" in log-view.
+For now only CVS, RCS, SCCS and SVN support this functionality.
+This is done by the `modify-change-comment' backend function.
+
+*** In log-view-mode, for VC systems that support changesets, you can
+see the diff for the whole changeset (not only for the current file)
+by typing the D key or using the "Changeset Diff" menu entry.
+
+*** In Log Edit mode,  C-c C-d now shows the diff for the files involved.
+
+*** vc-git supports the "git grep" command.
+
+*** VC Support for Meta-CVS has been removed for lack of a maintainer able
+to update it to the new VC.
+
+** Miscellaneous
+
+*** comint-mode uses `start-file-process' now (see Lisp Changes).
+If `default-directory' is a remote file name, subprocesses are started
+on the corresponding remote system.
+
+*** Eldoc highlights the function argument under point
+with the face `eldoc-highlight-function-argument'.
+
+*** In Etags, the --members option is now the default.
+Use --no-members if you want the old default behavior of not tagging
+struct members in C, members variables in C++ and variables in PHP.
+
+*** The `gdb' command only works with the graphical interface now.
+Use `gud-gdb' if you want the (old) text command mode.
+
+*** goto-address.el provides two new minor modes, goto-address-mode and
+goto-address-prog-mode, which buttonize URLS and email addresses.
+
+*** The new command `eshell/info' runs info in an eshell buffer.
+
+*** The new variable `ffap-rfc-directories' specifies a list of local
+directories in which `ffap-rfc' will first search for RFCs.
+
+*** hide-ifdef-mode allows shadowing ifdef-blocks instead of hiding them.
+See option `hide-ifdef-shadow' and function `hide-ifdef-toggle-shadowing'.
+
+*** `icomplete-prospects-height' now supercedes `icomplete-prospects-length'.
+
+*** Info displays breadcrumbs in the header of the page.
+See Info-breadcrumbs-depth to control it.
+
+*** net-utils has an `iwconfig' command, similar to the existing `ifconfig'.
+It is used to configure wireless interfaces.
+
+*** The pcmpl-unix package supports hostname completion for ssh and scp.
+
+*** sgml-electric-tag-pair-mode lets you simultaneously edit matched tag pairs.
+
+*** smerge-refine highlights word-level details of changes in conflict.
+It's used automatically as you move through conflicts, see
+smerge-auto-refine-mode.
+
+*** talk.el has been extended for multiple tty support.
+
+*** A new command `display-time-world' has been added to the Time
+package.  It creates a buffer with an updating time display using
+several time zones.
+
+*** The appearance of superscript and subscript in TeX is more customizable.
+See the documentation of the variables: tex-fontify-script,
+tex-font-script-display, tex-suscript-height-ratio, and
+tex-suscript-height-minimum.
+
+*** view-remove-frame-by-deleting is now by default t
+since users found iconification of view-mode frames distracting.
+
+*** WoMan tries to add locale-specific manual page directories to the
+search path.  This can be disabled by setting `woman-locale' to nil.
+
+\f
+* Changes in Emacs 23.1 on non-free operating systems
+
+** Case is now considered significant in completion on MS-Windows.
+The default value of `completion-ignore-case' is now nil on
+MS-Windows, the same as it is for other operating systems.  The
+variable doesn't apply to reading a file name -- in that case Emacs
+heeds `read-file-name-completion-ignore-case' instead.
+
+** IPv6 is supported on MS-Windows.
+Emacs now supports IPv6 on Windows XP and later, and earlier versions
+of Windows with third party IPv6 stacks installed.  In Emacs 22, IPv6 was
+supported on other platforms, but not on Windows due to using the winsock
+1.1 header file, even though Emacs was linking to the winsock 2 library.
+
+** Busy cursor (hourglass) now displays on MS-Windows.
+When Emacs is busy, an hourglass mouse cursor is displayed on Windows.
+In Emacs 22 only X supported the busy cursor.
+
+** Battery status is available on MS-Windows
+Emacs can now display the battery status in the mode-line when enabled with
+display-battery-mode or from the Options menu.  More verbose battery
+information is also available with the command `battery'.  In Emacs 22
+battery status was supported only on GNU/Linux and Mac.
+
+** More keys available on MS-Windows.
+Keys normally associated with IMEs, and some exotic keys not normally found
+on standard keyboards have been given names so they can be bound to functions
+inside Emacs.  If there are keys on your keyboard that have not been exposed
+to Emacs in the past, try C-h k to see if they are available now.
+
+Emacs can now bind functions to the extra buttons for media player and
+browser control present on some keyboards.  These buttons are disabled
+by default, since enabling them prevents their system-wide use when
+Emacs has focus.  To enable them, set the variable
+w32-pass-multimedia-buttons to nil.  See the doc string of that variable
+for the list of extra keys that are available.
+
+** BDF fonts no longer supported on MS-Windows.
+The font backend was completely rewritten for this release.  The focus
+on Windows has been getting acceptable performance and full unicode
+support, including complex script shaping for native Windows fonts.  A
+rewrite of the BDF font support has not happened due to lack of time
+and developers.  If demand still exists for such a backend even with
+the improved language support for native Windows fonts, future
+development in this direction will most likely be based on the
+freetype library, giving access to a wider range of font formats.
+
+\f
+* Incompatible Lisp Changes in Emacs 23.1
+
+** Variables cannot be both buffer-local and frame-local any more.
+
+** `functionp' returns nil for special forms.
+I.e., it only returns t for objects that can be passed to `funcall'.
+
+** The behavior of map-char-table has changed.  It may call the
+specified function with a cons (FROM . TO) as a key if characters in
+that range have the same value.
+
+** Process changes
+
+*** The function `dired-call-process' has been removed.
+
+*** The multibyteness of process filters is now determined by the
+coding-system used for decoding.  The functions
+`process-filter-multibyte-p' and `set-process-filter-multibyte' are
+obsolete.
+
+** The variable `byte-compile-warnings' can now be a list starting with `not',
+meaning to disable the specified warnings.  The meaning of this list
+may therefore be the reverse of what you expect (of course, this is
+only an issue if you make use of the new `not' syntax).  Rather than
+checking/manipulating elements directly, use the new functions
+`byte-compile-warning-enabled-p', `byte-compile-disable-warning', and
+`byte-compile-enable-warning.'
+
+** `mode-name' is no longer guaranteed to be a string.
+Use `(format-mode-line mode-name)' to ensure a string value.
+
+** The function x-font-family-list has been removed.
+Use the new function font-family-list (see Lisp Changes, below).
+
+** Internationalization changes
+
+*** The value of the function `charset-id' is now always 0.
+
+*** The functions `register-char-codings' and `coding-system-spec'
+have been removed.
+
+*** The cpXXX coding systems are now supported automatically.
+The functions cp-...-codepage, which you had to use in Emacs 22 to
+enable support for these coding systems, have been deleted.
+
+*** The following features have been removed.  They were used for
+displaying various scripts with specific fonts, and are no longer
+needed now that OpenType font support is available:
+
+**** `devanagari' and `devan-util', and all associated devanagari-* and
+dev-* functions and variables (formerly used for Devanagari script).
+
+**** `kannada' and `knd-util', and all associated kannada-* and knd-*
+functions and variables (formerly used for Kannada script).
+
+**** `malayalam' and `mlm-util', and all associated malayalam-* and
+mlm-* functions and variables (formerly used for Malayalam script).
+
+**** `tamil' and `tml-util, and all associated tamil-* and tml-*
+functions and variables (formerly used for Tamil script).
+
+*** The meaning of NAME argument of `set-fontset-font' is changed.
+Previously nil is accepted as the default fontset.  Now, nil is for
+the fontset of the selected frame and t is for the default fontset.
+
+*** The meaning of FONTSET argument of `print-fontset' is changed.
+Now, nil is for the fontset of the selected frame and t is for the
+default fontset.
+
+** If a function in write-region-annotate-functions returns with a
+different buffer current, Emacs no longer kills that buffer
+automatically.  This behavior existed in previous versions of Emacs,
+but was undocumented.  To kill a buffer after write-region, give the
+variable `write-region-post-annotation-function' a buffer-local value
+of `kill-buffer'.
+
+** The variable temp-file-name-pattern has been removed.
+This variable was only used by call-process-region, which now uses
+temporary-file-directory instead.
+
+** The COUNT and SYSTEM-FLAG arguments to define-abbrev have been
+removed.  The function now takes extra arguments for specifying
+arbitrary abbrev properties.
+
+** end-of-defun-function is now guaranteed to work only when called
+from the start of a defun.  It must now leave point exactly at the end
+of defun, since `end-of-defun' now itself moves forward over
+whitespace after calling it.
+
+\f
+* Lisp Changes in Emacs 23.1
+
+** The new variable `generate-autoload-cookie' controls the magic comment
+string used by `update-file-autoloads' to find autoloaded forms.  The
+variable `generated-autoload-file' similarly controls the name of the
+file where `update-file-autoloads' writes the calls to `autoload'.
+The default values are ";;;###autoload" and `loaddefs.el',
+respectively.
+
+** New primitives `list-system-processes' and `process-attributes'
+let Lisp programs access the processes that are running on the local
+machine.  See the doc strings of these functions for more details.
+Not all platforms support accessing this information; on those that
+don't, these primitives will return nil.
+
+** New variable `user-emacs-directory'.
+Use this instead of "~/.emacs.d".
+
+** If a local hook function has a non-nil `permanent-local-hook'
+property, `kill-all-local-variables' does not remove it from the local
+value of the hook variable; it remains even if you change major modes.
+
+** `frame-inherited-parameters' lets new frames inherit parameters from
+the selected frame.
+
+** New keymap `input-decode-map' overrides like key-translation-map, but
+applies before function-key-map.  Also it is terminal-local contrary to
+key-translation-map.  Terminal-specific key-sequences are generally added to
+this map rather than to function-key-map now.
+
+** `ignore-errors' is now a standard macro (does not require the CL package).
+
+** `interprogram-paste-function' can now return one string or a list
+of strings.  In the latter case, Emacs puts the second and following
+strings on the kill ring.
+
+** In `condition-case', a handler can specify "let the debugger run first".
+You do this by writing `debug' in the list of conditions to be handled,
+like this:
+
+    (condition-case nil
+       (foo bar)
+      ((debug error) nil))
+
+** clone-indirect-buffer now runs the clone-indirect-buffer-hook.
+
+** `beginning-of-defun-function' now takes one argument, the count given to
+`beginning-of-defun'.  (N.B. `end-of-defun-function' doesn't take any
+arguments.)
+
+** `file-remote-p' has new optional parameters IDENTIFICATION and CONNECTED.
+IDENTIFICATION specifies which part of the remote identifier has to be
+returned.  With CONNECTED passed non-nil, it is checked whether a
+remote connection has been established already.
+
+** The new macro `declare-function' suppresses compiler warnings about
+undefined functions.
+
+** Changes to interactive function handling
+
+*** The new interactive spec code ^ says to first call
+handle-shift-selection if shift-select-mode is non-nil, before reading
+the command arguments.  This is used for shift-selection (see above).
+
+*** Built-in functions can now have an interactive specification that
+is not a prompt string.  If the `intspec' parameter of a `DEFUN'
+starts with a `(', the string is evaluated as a Lisp form.
+
+*** The interactive-form of a function can be added post-facto via the
+`interactive-form' symbol property.  Mostly useful to add complex
+interactive forms to subroutines.
+
+** Region changes
+
+*** Commands should use `use-region-p' to test whether there is
+an active region that they should operate on.
+
+*** `region-active-p' returns non-nil when Transient Mark mode is
+enabled and the mark is active.  Most commands that act specially on
+the active region in Transient Mark mode should use `use-region-p'
+instead of `region-active-p', because `use-region-p' obeys the new
+user option `use-empty-active-region' (see Editing Changes, above).
+
+*** If a command sets `transient-mark-mode' to (only . OLDVAL), that
+means to activate transient-mark-mode temporarily, until the next
+unshifted point motion command or mark deactivation.  Afterwards,
+reset transient-mark-mode to the value OLDVAL.  The values `only' and
+`identity', introduced in Emacs 22, are now deprecated.
+
+** Emacs session information
+
+*** The new variables `before-init-time' and `after-init-time' record the
+value of `current-time' before and after Emacs loads the init files.
+
+*** The new function `emacs-uptime' returns the uptime of an Emacs instance.
+
+*** The new function `emacs-init-time' returns the duration of the
+Emacs initialization.
+
+** Changes affecting display-buffer
+
+*** display-buffer tries to be smarter when splitting windows.
+The new option split-window-preferred-function lets you specify your own
+function to pop up new windows.  Its default value split-window-sensibly
+can split a window either vertically or horizontally, whichever seems
+more suitable in the current configuration.  You can tune the behavior
+of split-window-sensibly by customizing split-height-threshold and the
+new option split-width-threshold.  Both options now take the value nil
+to inhibit splitting in one direction.  Setting split-width-threshold to
+nil inhibits horizontal splitting and gets you the behavior of Emacs 22
+in this respect.  In any case, display-buffer may now split the largest
+window vertically even when it is not as wide as the containing frame.
+
+*** If pop-up-frames has the value `graphic-only', display-buffer only
+makes a separate frame on graphic displays.
+
+*** select-frame and set-frame-selected-window have a new optional
+argument NORECORD.  If non-nil, this will avoid messing with the order
+of recently selected windows and the buffer list.
+
+** Window parameters can now be defined.
+These are analogous to frame parameters, but are associated with
+individual windows.
+
+*** The new functions window-parameters, window-parameter, and
+set-window-parameter are used to query and set window parameters.
+
+** Minibuffer and completion changes
+
+*** A list of default values can be specified for the DEFAULT argument of
+functions `read-from-minibuffer', `read-string', `read-command',
+`read-variable', `read-buffer', `completing-read'.  Elements of this list
+are available for inserting into the minibuffer by typing `M-n'.
+For empty input these functions return the first element of this list.
+
+*** New function `read-regexp' uses the regexp history and some useful
+regexp defaults (string at point, last Isearch/replacement regexp/string)
+via M-n when reading a regexp in the minibuffer.
+
+*** minibuffer-local-must-match-filename-map is now named
+minibuffer-local-filename-must-match-map.
+
+*** The `require-match' argument to `completing-read' accepts the new
+values `confirm-only' and `confirm-after-completion'.
+
+** Search and replacement changes
+
+*** The regexp form \(?<num>:<regexp>\) specifies the group number explicitly.
+
+*** New function `match-substitute-replacement' returns the result of
+`replace-match' without actually using it in the buffer.
+
+*** The new variable `replace-search-function' determines the function
+to use for searching in query-replace and replace-string.  The
+function it specifies is called by `perform-replace' when its 4th
+argument is nil.
+
+*** The new variable `replace-re-search-function' determines the
+function to use for searching in `query-replace-regexp',
+`replace-regexp', `query-replace-regexp-eval', and
+`map-query-replace-regexp'.  The function it specifies is called by
+`perform-replace' when its 4th argument is non-nil.
+
+*** New keymap `search-map' bound to `M-s' provides global bindings
+for search related commands.
+
+*** New keymap `multi-query-replace-map' contains additonal keys bound
+to `automatic-all' and `exit-current' for multi-buffer interactive replacement.
+
+*** The variable `inhibit-changing-match-data', if non-nil, prevents
+the search and match primitives from changing the match data.
+
+*** New functions `word-search-forward-lax' and `word-search-backward-lax'.
+These are like `word-search-forward and `word-search-backward', except
+that the end of the search string need not match a word boundary,
+unless it ends in whitespace.
+
+** File handling changes
+
+*** set-file-modes is now interactive and can take the mode value in
+symbolic notation thanks to auxiliary functions.
+
+*** file-local-variables-alist stores an alist of file-local
+variables defined in the current buffer.
+
+** Face-remapping
+
+*** Each face can be remapped to a different face definition using the
+variable `face-remapping-alist'.  This is an alist that maps faces to
+replacement definitions (which can be face names, lists of face names,
+or attribute/value plists.  If this variable is buffer-local, the
+remapping occurs only in that buffer.
+
+*** text-scale-mode remaps the default face to a larger or smaller
+size in the current buffer.  This feature is used by the Buffer Face
+menu and the new `C-x C-+', `C-x C--', and `C-x C-0' commands (see
+Editing Changes, above).
+
+*** New functions:
+
+**** `face-remap-add-relative' adds a face remapping entry to the
+current buffer.
+
+**** ``face-remap-remove-relative' removes a face remapping entry from
+the current buffer.
+
+**** `face-remap-reset-base' restores a face to its global definition.
+
+**** `face-remap-set-base' sets the base remapping of a face.
+
+** Process changes
+
+*** The new function `start-file-process' is similar to `start-process',
+but obeys file handlers.  The file handler is chosen based on
+`default-directory'.  The functions `start-file-process-shell-command'
+and `process-file-shell-command' are also new; they call internally
+`start-file-process' and `process-file', respectively.
+
+*** The new function `process-lines' executes an external program and
+returns its output as a list of lines.
+
+** Character code, representation, and charset changes.
+
+*** In multibyte buffers and strings, characters are represented by
+UTF-8 byte sequences.  The character code space is now 0x0..0x3FFFFF
+with no gap; code points 0x0..0x10FFFF are Unicode characters of the
+same code points, while code points 0x3FFF80..0x3FFFFF are raw 8-bit
+bytes.
+
+*** Generic characters no longer exist.
+
+*** The concept of a charset has changed.  A single character may
+belong to multiple charsets (e.g. a-grave, U+00E0, belongs to charsets
+unicode, iso-8859-1, iso-8859-3, etc).
+
+**** The dimension of a charset is now 1, 2, 3, or 4, and the size of
+each dimension is no longer limited to 94 or 96.
+
+**** A dynamic charset priority list is used to infer the charset of
+characters for display.
+
+*** The functions `split-char' and `make-char' now accept up to 4
+positional codes instead of just 2.
+
+*** The functions `encode-char' and `decode-char' now accept any character sets.
+
+*** The function `define-charset' now accepts a completely different
+form of arguments (old-style arguments still work).
+
+*** The value of the function `char-charset' depends on the current
+priorities of charsets.
+
+*** The function get-char-code-property now accepts many Unicode base
+character properties.  They are `name', `general-category',
+`canonical-combining-class', `bidi-class', `decomposition',
+`decimal-digit-value', `digit-value', `numeric-value', `mirrored',
+`old-name', `iso-10646-comment', `uppercase', `lowercase', and
+`titlecase'.
+
+*** The functions `modify-syntax-entry' and `modify-category-entry' now
+accept a cons of characters as the first argument, and modify all
+entries in that range of characters.
+
+*** Use of `translation-table-for-input' for character code unification
+is now obsolete, since Emacs 23.1 and later uses Unicode as basis for
+internal representation of characters.
+
+*** New functions:
+
+**** `characterp' returns t if and only if the argument is a character.
+This replaces `char-valid-p', which is now obsolete.
+
+**** `max-char' returns the maximum character code (currently #x3FFFFF).
+
+**** `define-charset-alias' defines an alias of a charset.
+
+**** `set-charset-priority' sets priorities of charsets.
+
+**** `charset-priority-list' returns a prioritized list of charsets.
+
+**** `unibyte-string' makes a unibyte string from bytes.
+
+**** `define-char-code-property' defines a character code property.
+
+**** `char-code-property-description' returns the description string of
+a character code property.
+
+*** New variables:
+
+**** `find-word-boundary-function-table' is a char-table of functions to
+search for a word boundary.
+
+**** `char-script-table' is a char-table of script names.
+
+**** `char-width-table' is a char-table of character widths.
+
+**** `print-charset-text-property' controls how to handle `charset' text
+property on printing a string.
+
+**** `printable-chars' is a char-table of printable characters.
+
+** Code conversion changes
+
+*** The new function `define-coding-system' should be used to define a
+coding system instead of `make-coding-system' (which is now obsolete).
+
+*** The functions `encode-coding-region' and `decode-coding-region'
+have an optional 4th argument to specify where the result of
+conversion should go.
+
+*** The functions `encode-coding-string' and `decode-coding-string'
+have an optional 4th argument specifying a buffer to store the result
+of conversion.
+
+*** The new variable `inhibit-null-byte-detection' controls whether to
+consider text with null bytes as binary data.  By default, it is
+`nil', and Emacs uses `no-conversion' for any text containing null
+bytes.
+
+*** The functions `set-coding-priority' and `make-coding-system' are obsolete.
+
+*** New functions:
+
+**** `with-coding-priority' executes Lisp code using the specified
+coding system priority order.
+
+**** `check-coding-systems-region' checks if the text in the region is
+encodable by the specified coding systems.
+
+**** `coding-system-aliases' returns a list of aliases of a coding system.
+
+**** `coding-system-charset-list' returns a list of charsets supported
+by a coding system.
+
+**** `coding-system-priority-list' returns a list of coding systems
+ordered by their priorities.
+
+**** `set-coding-system-priority' sets priorities of coding systems.
+
+**** `coding-system-from-name' returns a coding system matching with
+the argument name.
+
+** There is a new input method, Robin, different from Quail.
+It has three functionalities:
+ i) a simple input method (converts an ASCII sequence into a string).
+ii) converts an existing buffer substring into another string
+iii) reverse conversion (each character produced by a
+robin rule can hold the original ASCII sequence as a char-code-property)
+
+*** The new function `robin-define-package' defines a Robin package.
+
+*** The new function `robin-modify-package' modifies an existing Robin package.
+
+*** The new function `robin-use-package' starts using a Robin package
+as an input method.
+
+*** The new function `string-to-unibyte' is like `string-as-unibyte'
+but signals an error if STRING contains a non-ASCII, non-eight-bit
+character.
+
+** Changes related to the new font backend
+
+*** Which font backends to use can be specified by the X resource
+"FontBackend".  For instance, to use both X core fonts and Xft fonts:
+
+Emacs.FontBackend: x,xft
+
+If this resource is not set, Emacs tries to use all font backends
+available on your graphic device.
+
+*** New frame parameter `font-backend' specifies a list of
+font-backends supported by the frame's graphic device.  On X, they are
+currently `x' and `xft'.
+
+*** The function `set-fontset-font' now accepts a script name as the
+second argument, and has an optional 5th argument to control how to
+set the font.
+
+*** New functions:
+
+**** `fontp' checks if the argument is a font-spec or font-entity.
+
+**** `font-spec' creates a new font-spec object.
+
+**** `font-get' returns a font property value.
+
+**** `font-put' sets a font property value.
+
+**** `font-face-attributes' returns a plist of face attributes set by a font.
+
+**** `list-fonts' returns a list of font-entities matching a font spec.
+
+**** `find-font' returns the font-entity best matching the given font spec.
+
+**** `font-family-list' returns a list of family names of available fonts.
+
+**** `font-xlfd-name' returns an XLFD name of a given font spec, font
+entity, or font object.
+
+**** `clear-font-cache' clears all font caches.
+
+** Changes related to multiple-terminal (multi-tty) support
+
+*** $TERM is now set to `dumb' for subprocesses.  If you want to know the
+$TERM inherited by Emacs you will have to look inside initial-environment.
+
+*** $DISPLAY is now dynamically inherited from the frame's `display'.
+
+*** The `window-system' variable is now frame-local.  The new
+`initial-window-system' variable contains the `window-system' value
+for the first frame.  `window-system' is also now a function that
+takes a frame argument.
+
+*** The `keyboard-translate-table' variable and the terminal and
+keyboard coding systems are now terminal-local.
+
+*** You can specify a terminal device (`tty' parameter) and a terminal
+type (`tty-type' parameter) to `make-terminal-frame'.
+
+*** The function `make-frame-on-display' now works during a tty
+session.
+
+*** A new `terminal' data type.
+The functions `get-device-terminal', `terminal-parameters',
+`terminal-parameter', `set-terminal-parameter' use this data type.
+
+*** Function key sequences are now mapped using `local-function-key-map',
+a new variable.  This inherits from the global variable function-key-map,
+which is not used directly any more.
+
+*** New hooks:
+
+**** before-hack-local-variables-hook is called after setting new
+variable file-local-variables-alist, and before actually applying the
+file-local variables.
+
+**** `suspend-tty-functions' and `resume-tty-functions' are called
+after a tty frame has been suspended or resumed, respectively.  The
+functions are called with the terminal id of the frame being
+suspended/resumed as a parameter.
+
+**** The special hook `delete-terminal-functions' is called before
+deleting a terminal.
+
+*** New functions:
+
+**** `delete-terminal'
+
+**** `suspend-tty'
+
+**** `resume-tty'.
+
+*** `initial-environment' holds the environment inherited from Emacs's parent.
+
+** Redisplay changes
+
+*** For underlined characters, the distance between the underline and
+the baseline is controlled by a new variable, `underline-minimum-offset'.
+
+*** You can now pass the value of the `invisible' property to
+invisible-p to check whether it would cause the text to be invisible.
+This is convenient when checking invisibility of text with no buffer
+position (e.g. in before/after-strings).
+
+*** `clear-image-cache' can be told to flush only images of a specific file.
+
+*** `vertical-motion' can now be given a goal column.
+It now accepts a cons cell (COLS . LINES) in its first argument, which
+says to stop, where possible, at a pixel x-position equal to COLS
+times the default column width.
+
+*** redisplay-end-trigger-functions, set-window-redisplay-end-trigger,
+and window-redisplay-end-trigger are obsolete.  Use `jit-lock-register'
+instead.
+
+*** The new variables `wrap-prefix' and `line-prefix' specify display
+specs which are appended at display-time to every continuation line
+and non-continuation line, respectively.  In addition, Emacs
+recognizes the `wrap-prefix' and `line-prefix' text or overlay
+properties; these have the same effects as the variables of the same
+name, but take precedence.
+
+** The Lisp interpreter now treats non-breaking space as whitespace.
+
+** Miscellaneous new functions
+
+*** `apply-partially' performs a "curried" application of a function.
+
+*** `buffer-swap-text' swaps text between two buffers.  This can be
+useful for modes such as tar-mode, archive-mode, RMAIL.
+
+*** `combine-and-quote-strings' produces a single string from a list of strings
+sticking a separator string in between each pair, and quoting those
+strings that include the separator as their substring.  Useful for
+consing shell command lines from the individual arguments.
+
+*** `custom-note-var-changed' tells Custom to treat the change in a
+certain variable as having been made within Custom.
+
+*** `face-all-attributes' returns an alist describing all the basic
+attributes of a given face.
+
+*** `format-seconds' converts a number of seconds into a readable
+string of days, hours, etc.
+
+*** `image-refresh' refreshes all images associated with a given image
+specification.
+
+*** `locate-user-emacs-file' helps packages to select the appropriate
+place to save user-specific files.  It defaults to `user-emacs-directory'
+unless the file already exists at $HOME.
+
+*** `read-color' reads a color name using the minibuffer.
+
+*** `read-shell-command' does what its name says, with completion.  It
+uses the minibuffer-local-shell-command-map for that.
+
+*** `split-string-and-unquote' splits a string into a list of substrings
+on the boundaries of a given delimiter, and unquotes the substrings that
+are quoted.  Useful for taking apart shell commands.
+
+*** The two new functions `looking-at-p' and `string-match-p' can do
+the same matching as `looking-at' and `string-match' without changing
+the match data.
+
+*** The two new functions `make-serial-process' and
+`serial-process-configure' provide a Lisp interface to the new serial
+port support (see Emacs changes, above).
+
+** Miscellaneous new variables
+
+*** `auto-save-include-big-deletions', if non-nil, means auto-save is
+not turned off automatically after a big deletion.
+
+*** `read-circle', if nil, disables the reading of recursive Lisp
+structures using the #N= and #N# syntax.
+
+*** `this-command-keys-shift-translated' is non-nil if the key
+sequence invoking the current command was found by shift-translation.
+
+*** `window-point-insertion-type' determines the insertion-type of the
+marker used for window-point.
+
+*** bookmark provides `bookmark-make-record-function' so special major
+modes like Info can teach bookmark.el how to save and restore the
+relevant data.
+
+*** `fill-forward-paragraph-function' specifies which function the
+filling code should use to find paragraph boundaries.
+
+\f
+* New Packages for Lisp Programming in Emacs 23.1
+
+** The new package avl-tree.el deals with the AVL tree data structure.
+
+** The new package check-declare.el verifies the accuracy of
+declare-function macros (see Lisp Changes, above).
+
+** find-cmd.el can build `find' commands using lisp syntax.
+
+** The package misearch.el has been added.  It allows Isearch to search
+through multiple buffers.  A variable `multi-isearch-next-buffer-function'
+defines the function to call to get the next buffer to search in the series
+of multiple buffers.  Top-level functions `multi-isearch-buffers',
+`multi-isearch-buffers-regexp', `multi-isearch-files' and
+`multi-isearch-files-regexp' accept a single argument that specifies
+a list of buffers/files to search for a string/regexp.
+
+** The new major mode `special-mode' is intended as a parent for
+major modes such as those that set the "'mode-class 'special" property.
+
+\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 of the License, or
+(at your option) any later version.
+
+GNU Emacs is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+
+\f
+Local variables:
+mode: outline
+paragraph-separate: "[         \f]*$"
+end:
+
+arch-tag: e759449d-88b3-4de4-9900-3a6c3dfa23e2
index 7a585e2c23084016876a411db3dbca42fcd8b573..f21d105b2cd89b19c2152292c17a2d23d2484742 100644 (file)
--- a/etc/TODO
+++ b/etc/TODO
@@ -12,7 +12,46 @@ it best.  Since Emacs is an FSF-copyrighted package, please be
 prepared to sign legal papers to transfer the copyright on your work
 to the FSF.
 
-* Simple tasks. These don't require much emacs knowledge, they are
+* Tentative plan for Emacs-24
+
+** Bidi
+** lexbind: I haven't checked the status of the code recently, so
+  I don't know how realistic it is to include it.  But it's been around
+  for a long time, and I trust Miles, so I have hope.
+** concurrency: including it as an "experimental" compile-time option
+  sounds good.  Of course there might still be big questions around
+  "which form of concurrency" we'll want.
+** Overhaul of customize: sounds wonderful.
+** some kind of color-theme: agreed.
+** better support for dynamic embedded graphics: I like this idea (my
+  mpc.el code could use it for the volume widget), tho I wonder if the
+  resulting efficiency will be sufficient.
+** Spread Semantic.
+** Improve the "code snippets" support: consolidate skeleton.el, tempo.el,
+  and expand.el (any other?) and then advertise/use/improve it.
+** Improve VC: yes, there's a lot of work to be done there :-(
+  And most of it could/should make it into Emacs-23.3.
+** package manager.
+
+** Random things that cross my mind right now that I'd like to see (some of
+them from my local hacks), but it's not obvious at all whether they'll
+make it.
+*** multiple inheritance for keymaps (to get rid of the
+  fix_submap_inheritance hack and to more cleanly express the
+  relationship between minibuffer-local-*-map): I've had this locally
+  for a long time, but the details of the semantics is somewhat ... delicate.
+*** prog-mode (a parent-mode, like text-mode).  Could/should provide
+  a better fill-paragraph default that uses syntax-tables to recognize
+  string/comment boundaries.
+*** provide more completion-at-point-functions.  Make existing
+  in-buffer completion use completion-at-point.
+*** "functional" function-key-map that would make it easy to add (and
+  remove) mappings like "FOO-mouse-4 -> FOO-scroll-down",
+  "FOO-tab -> ?\FOO-\t", "uppercase -> lowercase", "[fringe KEY...] ->
+  [KEY]", "H-FOO -> M-FOO", "C-x C-y FOO -> H-FOO", ...
+
+
+* Simple tasks. These don't require much Emacs knowledge, they are
 suitable for anyone from beginners to experts.
 
 ** Convert modes that use view-mode to be derived from special-mode instead.
@@ -66,9 +105,6 @@ for users to customize.
 
 ** erase-buffer should perhaps disregard read-only properties of text.
 
-** Make occur correctly handle matches that span more than one line,
-   as well as overlapping matches.
-
 ** Fix the kill/yank treatment of invisible text.  At the moment,
   invisible text is placed in the kill-ring, so that the contents of
   the ring may not correspond to the text as displayed to the user.
@@ -92,8 +128,6 @@ for users to customize.
 
 ** Enhance scroll-bar to handle tall line (similar to line-move).
 
-** Make occur handle multi-line matches cleanly with context.
-
 ** In Custom buffers, put the option that turns a mode on or off first,
   using a heuristic of some kind?
 
index 2893c40b24522a0aa2f5e542690af24ea59b498c..31eeee024e147dbdeb98aa8286ded91ff2e941b5 100644 (file)
@@ -33,6 +33,8 @@ Your mail can be downloaded into Gnus in several ways, choose one:
 
 @end text
 
+@next 'finish
+
 @node Setting up a NNTP server
 
 @text
@@ -40,6 +42,8 @@ TODO: this will be a real link.
 Run M-x assistant and use the news-server.ast file as input.
 @end text
 
+@next 'finish
+
 \f
 @c Local variables:
 @c mode: texinfo
index 294f92382d9f4cad1ec78b85faa603fc1bce9b77..432f71a50f08e1a01a2fc9ceca8409561ae53be7 100644 (file)
@@ -2,9 +2,9 @@
 
 
 @node Setting up the news server name and port number
-@variable server :string (gnus-getenv-nntpserver)
+@variable server :string (or (gnus-getenv-nntpserver) "your-server-here")
 @variable port :number 119
-@validate (assistant-validate-connect-to-server server port)
+@validate (or (assistant-validate-connect-to-server server port) (y-or-n-p "Do you want to use the server anyway, although you can't confirm it's valid?"))
 @result gnus-select-method (list 'nntp server (list 'nntp-server port))
 @text
 Usenet news is usually read from your Internet service prodider's news
@@ -14,10 +14,10 @@ As a guess, the name of the server might be news.yourisp.com.
 
 Server name: @variable{server}
 Port number: @variable{port}
+
 @end text
 @next t "User name and password"
 
-
 @node User name and password
 @type interstitial
 @next 
index 4ddb255bc4436c1e51b2a942c8ad0edd769beea2..9977d4991876686f24874c72005a0f266d83a2c6 100644 (file)
@@ -1,19 +1,16 @@
 /* XPM */
 static char * down_xpm[] = {
-"8 12 4 1",
+"9 9 4 1",
 "      c none",
-".     c gray90",
-"X     c gray45",
-"O     c gray75",
-"........",
-".OOOOOOX",
-" .OOOOX ",
-" .OOOOX ",
-"  .OOX  ",
-"  .OOX  ",
-"   OX   ",
-"   OX   ",
-"        ",
-"        ",
-"        ",
-"        "};
+".     c black",
+"x     c gray45",
+"+     c white",
+".........",
+".x+++++x.",
+" .+++++. ",
+" .x+++x. ",
+"  .+++.  ",
+"  .x+x.  ",
+"   .+.   ",
+"   .x.   ",
+"    .    "};
index c75f7e74058e8f8df86f731e7fa3281d9b8490d9..a105af025e962395cb7d48cc4322e53ece10af30 100644 (file)
@@ -1,19 +1,16 @@
 /* XPM */
 static char * right_xpm[] = {
-"8 12 4 1",
+"9 9 4 1",
 "      c none",
-".     c gray90",
-"X     c gray45",
-"O     c gray75",
-"..      ",
-"..O.    ",
-"..OOO.  ",
-"..OOOOOX",
-"..OOOOXX",
-"..OOXX  ",
-"..XX    ",
-"OO      ",
-"        ",
-"        ",
-"        ",
-"        " };
+".     c black",
+"x     c gray45",
+"+     c white",
+"..       ",
+".x..     ",
+".++x..   ",
+".++++x.. ",
+".++++++x.",
+".++++x.. ",
+".++x..   ",
+".x..     ",
+"..       "};
index 176db63c42d80cca99d0293e5e7b72a730e084f7..9dd41d3bafae4c44eef106a2af286cc622dba588 100644 (file)
@@ -1,3 +1,21 @@
+2010-03-27  Eli Zaretskii  <eliz@gnu.org>
+
+       * makefile.w32-in ($(TIT), $(MISC_DIC), leim-list.el): Enclose the
+       argument of "-l" in $(ARGQUOTE), in case it includes blanks or
+       other special characters.
+
+2010-03-18  Glenn Morris  <rgm@gnu.org>
+
+       * Makefile.in (maintainer-clean): Use bootstrap-clean.
+       (extraclean): Fix deletion patterns.
+
+       * Makefile.in (dot): Remove, since ../ is used throughout the
+       other Makefiles.
+
+2010-03-10  Chong Yidong  <cyd@stupidchicken.com>
+
+       * Branch for 23.2.
+
 2010-02-16  Kenichi Handa  <handa@m17n.org>
 
        * SKK-DIC/SKK-JISYO.L: Updated to the latest version.
index 244063bb2c42caaeb51baf79e3876532d5e1474c..f0fba8d24624ed98fd6ed1f07e96e9c92e30ffa8 100644 (file)
@@ -40,14 +40,11 @@ INSTALLDIR=$(DESTDIR)${datadir}/emacs/${version}/leim
 
 GZIP_PROG = @GZIP_PROG@
 
-# On IBM RS6000, double-dot gets screwed up.
-dot = .
-
 # Which Emacs to use to convert TIT files to Emacs Lisp files,
 # byte-compile Emacs Lisp files, and generate the file leim-list.el.
-BUILT-EMACS = ${dot}${dot}/src/emacs
+BUILT-EMACS = ../src/emacs
 
-buildlisppath=${srcdir}/${dot}${dot}/lisp
+buildlisppath=${srcdir}/../lisp
 
 # How to run Emacs.
 RUN-EMACS = EMACSLOADPATH=$(buildlisppath) LC_ALL=C \
@@ -161,7 +158,7 @@ all: ${BUILT-EMACS} ${SUBDIRS} leim-list.el ${WORLD}
 
 # To ensure that we can run Emacs.  This target is ignored (never
 # being hit) if a user changes default value of EMACS.
-${dot}${dot}/src/emacs:
+../src/emacs:
        cd ../src; ${MAKE} ${MFLAGS} emacs
 
 ${SUBDIRS}:
@@ -224,7 +221,7 @@ MV_DIRS = for i in $$dir; do rm -fr `basename "$$i"` ; mv "$$i" . ; done
 
 install: all
        if [ ! -d ${INSTALLDIR} ] ; then \
-          umask 022; ${srcdir}/${dot}${dot}/mkinstalldirs ${INSTALLDIR}; \
+          umask 022; ${srcdir}/../mkinstalldirs ${INSTALLDIR}; \
        else true; fi
        if [ x`(cd ${INSTALLDIR} && /bin/pwd)` != x`(/bin/pwd)` ] ; then \
          rm -f ${INSTALLDIR}/leim-list.el; \
@@ -278,16 +275,17 @@ clean mostlyclean:
 # bootstrapping should not leave non-fresh .elc files behind.
 bootstrap-clean: clean
        rm -f ${WORLD}
+## FIXME some compiled files go to srcdir, some don't?
+#      cd ${srcdir}; rm -f *.elc */*.elc
 
 distclean: clean
        if test -f stamp-subdir; then rm -rf ${SUBDIRS} stamp-subdir; fi
        rm -f Makefile
 
-maintainer-clean: distclean
-       rm -f ${WORLD}
+maintainer-clean: distclean bootstrap-clean
 
 extraclean: maintainer-clean
-       -rm -f *~ \#* m/?*~ s/?*~
+       -rm -f *~ \#* */*~ */\#*
 
 .PHONY: check-declare
 
index c36e98af61808a1eac28bdc34b8200b3240fc1f5..dbebc32602cf8d47aa4a4e911b303a1448045add 100644 (file)
@@ -170,17 +170,21 @@ $(SUBDIRS):
 # WARNING: Do NOT split the part inside $(ARGQUOTE)s into multiple lines as
 #          this can break with GNU Make 3.81 and later if sh.exe is used.
 $(TIT):
-       $(RUN_EMACS) -l $(buildlisppath)/international/titdic-cnv \
+       $(RUN_EMACS) -l \
+           $(ARGQUOTE)$(buildlisppath)/international/titdic-cnv$(ARGQUOTE) \
            --eval $(ARGQUOTE)(batch-titdic-convert t)$(ARGQUOTE) \
            -dir quail $(srcdir)/CXTERM-DIC
-       $(RUN_EMACS)  -l $(buildlisppath)/international/quail \
+       $(RUN_EMACS)  -l \
+           $(ARGQUOTE)$(buildlisppath)/international/quail$(ARGQUOTE) \
            -f batch-byte-compile $(TIT:.elc=.el)
 
 # Rule to generate quail/*.el from MISC_DIC/*.tit.
 $(MISC_DIC):
-       $(RUN_EMACS) -l $(buildlisppath)/international/titdic-cnv \
+       $(RUN_EMACS) -l \
+           $(ARGQUOTE)$(buildlisppath)/international/titdic-cnv$(ARGQUOTE) \
            -f batch-miscdic-convert -dir quail $(srcdir)/MISC-DIC
-       $(RUN_EMACS)  -l $(buildlisppath)/international/quail \
+       $(RUN_EMACS)  -l \
+           $(ARGQUOTE)$(buildlisppath)/international/quail$(ARGQUOTE) \
            -f batch-byte-compile $(MISC_DIC:.elc=.el)
 
 #
@@ -188,7 +192,8 @@ $(MISC_DIC):
 #          this can break with GNU Make 3.81 and later if sh.exe is used.
 leim-list.el: $(SUBDIRS) $(WORLD) $(srcdir)/leim-ext.el
        - $(DEL) leim-list.el
-       $(RUN_EMACS) -l $(buildlisppath)/international/quail \
+       $(RUN_EMACS) -l \
+           $(ARGQUOTE)$(buildlisppath)/international/quail$(ARGQUOTE) \
            --eval $(ARGQUOTE)(update-leim-list-file $(DQUOTE).$(DQUOTE))$(ARGQUOTE)
        $(RUN_EMACS) --eval $(ARGQUOTE)(w32-append-code-lines $(DQUOTE)$@$(DQUOTE) $(DQUOTE)$(srcdir)/leim-ext.el$(DQUOTE))$(ARGQUOTE)
 
index caa7f3cfc8036bfcd059c9463ce06702b3461ff3..4e9c7e19ff77ffced0f0a0243013b0804d7c00ab 100644 (file)
@@ -1,7 +1,25 @@
-2010-03-19  Tetsurou Okazaki  <okazaki@be.to>  (tiny change)
+2010-03-20  Glenn Morris  <rgm@gnu.org>
 
-       * Makefile.in (uninstall): Handle the case where archlibdir does
-       not exist.  (Bug#5720)
+       * Makefile.in (KRB4LIB, DESLIB, KRB5LIB, CRYPTOLIB, COM_ERRLIB)
+       (LIBHESIOD, LIBRESOLV): Make previous change a bit more friendly by
+       defining these as Makefile variables.
+       (LIBS_MOVE): Add LIBS_MAIL into this.
+       (movemail${EXEEXT}): Just use LIBS_MOVE, not LIBS_MAIL as well.
+
+2010-03-18  Glenn Morris  <rgm@gnu.org>
+
+       * Makefile.in (KRB4LIB, DESLIB, KRB5LIB, CRYPTOLIB, COM_ERRLIB)
+       (HESIODLIB, LIBS_MAIL): Set using autoconf rather than cpp.
+       (BASE_CFLAGS): Remove (identical to CPP_CFLAGS).
+
+2010-03-18  Tetsurou Okazaki  <okazaki@be.to>  (tiny change)
+
+       * Makefile.in (uninstall): Handle the case where archlibdir does not
+       exist.  (Bug#5720)
+
+2010-03-10  Chong Yidong  <cyd@stupidchicken.com>
+
+       * Branch for 23.2.
 
 2010-02-20  Kevin Ryde  <user42@zip.com.au>
 
index 0353c4412fb723eae7a4d22f894e45f1c9b8fb10..1e3d68680738edc713ec7b48f20896c003296878 100644 (file)
@@ -1,6 +1,7 @@
 # Makefile for lib-src subdirectory in GNU Emacs.
 # Copyright (C) 1985, 1987, 1988, 1993, 1994, 2001, 2002, 2003, 2004,
-#               2005, 2006, 2007, 2008, 2009, 2010  Free Software Foundation, Inc.
+#               2005, 2006, 2007, 2008, 2009, 2010
+#               Free Software Foundation, Inc.
 
 # This file is part of GNU Emacs.
 
@@ -122,22 +123,34 @@ SCRIPTS= rcs2log vcdiff
 
 EXECUTABLES= ${UTILITIES} ${INSTALLABLES} ${SCRIPTS} ${INSTALLABLE_SCRIPTS}
 
-# Additional -D flags for movemail (add to MOVE_FLAGS if desired):
-# MAIL_USE_POP         Support mail retrieval from a POP mailbox.
-# MAIL_USE_MMDF                Support MMDF mailboxes.
-# MAIL_USE_FLOCK       Use flock for file locking (see the comments
-#                      about locking in movemail.c)
-# MAIL_UNLINK_SPOOL    Unlink the user's spool mailbox after reading
-#                      it (instead of just emptying it).
-# KERBEROS             Support Kerberized POP.
-# KRB5                 Support Kerberos Version 5 pop instead of
-#                      Version 4 (define this in addition to
-#                      KERBEROS).
-# HESIOD               Support Hesiod lookups of user mailboxes.
-# MAILHOST             A string, the host name of the default POP
-#                      mail host for the site.
+# Specify additional -D flags for movemail. Options:
+# -DMAIL_USE_FLOCK or -DMAIL_USE_LOCKF (use flock or lockf for file locking).
+# See the comments about locking in movemail.c.  Normally the values
+# in ../src/[ms]/*.h should be correct and you should not need to do anything.
+# If neither flag is set, blessmail is used.
 MOVE_FLAGS=
 
+## -lkrb if HAVE_LIBKRB or -lkrb4 if HAVE_LIBKRB4
+KRB4LIB=@KRB4LIB@
+## -ldes if HAVE_LIBDES or -ldes425 if HAVE_LIBDES425
+DESLIB=@DESLIB@
+## -lkrb5 if HAVE_LIBKRB5
+KRB5LIB=@KRB5LIB@
+## -lk5crypto if HAVE_LIBK5CRYPTO or -lcrypto if HAVE_LIBCRYPTO
+CRYPTOLIB=@CRYPTOLIB@
+## -lcom_err if HAVE_LIBCOM_ERR
+COM_ERRLIB=@COM_ERRLIB@
+## -lhesiod if HAVE_LIBHESIOD
+LIBHESIOD=@LIBHESIOD@
+## -lresolv if HAVE_LIBRESOLV
+LIBRESOLV=@LIBRESOLV@
+## -llockfile if HAVE_LIBLOCKFILE or -lmail if HAVE_LIBMAIL
+LIBS_MAIL=@LIBS_MAIL@
+
+## Extra libraries to use when linking movemail.
+LIBS_MOVE = $(LIBS_MAIL) $(KRB4LIB) $(DESLIB) $(KRB5LIB) $(CRYPTOLIB) $(COM_ERRLIB) $(LIBHESIOD) $(LIBRESOLV)
+
+
 # ========================== start of cpp stuff =======================
 /* From here on, comments must be done in C syntax.  */
 
@@ -176,72 +189,17 @@ MOVE_FLAGS=
 #define BLESSMAIL
 #endif
 
-#ifdef KERBEROS
-# ifdef HAVE_LIBKRB
-    KRB4LIB = -lkrb
-# else
-#  ifdef HAVE_LIBKRB4
-     KRB4LIB = -lkrb4
-#  endif
-# endif
-# ifdef HAVE_LIBDES
-    DESLIB = -ldes
-# else
-#  ifdef HAVE_LIBDES425
-    DESLIB = -ldes425
-#  endif
-# endif
-# ifdef HAVE_LIBKRB5
-    KRB5LIB = -lkrb5
-# endif
-# ifdef HAVE_LIBK5CRYPTO
-    CRYPTOLIB = -lk5crypto
-# else
-#  ifdef HAVE_LIBCRYPTO
-    CRYPTOLIB = -lcrypto
-#  endif
-# endif
-# ifdef HAVE_LIBCOM_ERR
-    COM_ERRLIB = -lcom_err
-# endif
-#endif /* KERBEROS */
-
-/* If HESIOD is defined, set this to "-lhesiod". */
-#ifdef HAVE_LIBHESIOD
-# ifdef HAVE_LIBRESOLV
-    HESIODLIB= -lhesiod -lresolv
-# else
-    HESIODLIB= -lhesiod
-# endif
-#endif
-
-LIBS_MOVE=$(KRB4LIB) $(DESLIB) $(KRB5LIB) $(CRYPTOLIB) $(COM_ERRLIB) $(HESIODLIB)
-
-#ifdef HAVE_LIBLOCKFILE
-LIBS_MAIL=-llockfile
-#else
-#ifdef HAVE_LIBMAIL
-LIBS_MAIL=-lmail
-#endif
-#endif
-
 LOADLIBES=LIBS_SYSTEM LIBS_MACHINE
 
-/* We need to #define emacs to get the right versions of some files.
-   Some other files - those shared with other GNU utilities - need
-   HAVE_CONFIG_H #defined before they know they can take advantage of
-   the information in ../src/config.h.  */
+/* Those files shared with other GNU utilities need HAVE_CONFIG_H
+   defined before they know they can take advantage of the information
+   in ../src/config.h.  */
 ALL_CFLAGS = C_SWITCH_SYSTEM C_SWITCH_MACHINE -DHAVE_CONFIG_H \
    -I. -I../src -I${srcdir} -I${srcdir}/../src ${LDFLAGS} ${CPPFLAGS} ${CFLAGS}
 LINK_CFLAGS = C_SWITCH_SYSTEM C_SWITCH_MACHINE -DHAVE_CONFIG_H \
    -I. -I../src -I${srcdir} -I${srcdir}/../src ${LDFLAGS} ${CFLAGS}
 CPP_CFLAGS = C_SWITCH_SYSTEM C_SWITCH_MACHINE -DHAVE_CONFIG_H \
    -I. -I../src -I${srcdir} -I${srcdir}/../src ${CPPFLAGS} ${CFLAGS}
-/* This was all of CPP_CFLAGS except -Demacs.
-   Now that -Demacs has been deleted from CPP_CFLAGS,
-   this is actually the same as CPP_CFLAGS, but let\'s not delete it yet.  */
-BASE_CFLAGS = C_SWITCH_SYSTEM C_SWITCH_MACHINE -DHAVE_CONFIG_H \
-   -I. -I../src -I${srcdir} -I${srcdir}/../src ${CPPFLAGS} ${CFLAGS}
 \f
 .SUFFIXES: .m
 
@@ -338,8 +296,10 @@ uninstall:
        for file in ${INSTALLABLES} ${INSTALLABLE_SCRIPTS}; do \
          rm -f $(DESTDIR)${bindir}/`echo $${file} | sed '$(TRANSFORM)'` ; \
        done)
-       (cd $(DESTDIR)${archlibdir} && \
-        rm -f ${UTILITIES} ${INSTALLABLES} ${SCRIPTS} ${INSTALLABLE_SCRIPTS})
+       if [ -d $(DESTDIR)${archlibdir} ]; then \
+         (cd $(DESTDIR)${archlibdir} && \
+          rm -f ${UTILITIES} ${INSTALLABLES} ${SCRIPTS} ${INSTALLABLE_SCRIPTS}) \
+       fi
 
 mostlyclean:
        -rm -f core *.o getopt.h getopt.h-t
@@ -392,7 +352,7 @@ REGEXPOBJ = regex.o
 REGEXPDEPS = $(REGEXPOBJ) $(srcdir)/../src/regex.h
 
 regex.o: $(srcdir)/../src/regex.c $(srcdir)/../src/regex.h ../src/config.h
-       ${CC} -c ${BASE_CFLAGS} -DCONFIG_BROKETS -DINHIBIT_STRING_HEADER ${srcdir}/../src/regex.c
+       ${CC} -c ${CPP_CFLAGS} -DCONFIG_BROKETS -DINHIBIT_STRING_HEADER ${srcdir}/../src/regex.c
 
 etags${EXEEXT}: ${srcdir}/etags.c $(GETOPTDEPS) $(REGEXPDEPS) ../src/config.h
        $(CC) ${ALL_CFLAGS} -DEMACS_NAME="\"GNU Emacs\"" -DVERSION="\"${version}\"" ${srcdir}/etags.c $(GETOPTOBJS) $(REGEXPOBJ) $(LOADLIBES) -o etags
@@ -422,8 +382,9 @@ b2m${EXEEXT}: ${srcdir}/b2m.c ../src/config.h $(GETOPTDEPS)
           $(GETOPTOBJS) $(LOADLIBES) -o b2m
 
 movemail${EXEEXT}: movemail.o pop.o $(GETOPTDEPS)
-       $(CC) ${LINK_CFLAGS} ${MOVE_FLAGS} movemail.o pop.o $(GETOPTOBJS) $(LOADLIBES) $(LIBS_MAIL) $(LIBS_MOVE) -o movemail
+       $(CC) ${LINK_CFLAGS} ${MOVE_FLAGS} movemail.o pop.o $(GETOPTOBJS) $(LOADLIBES) $(LIBS_MOVE) -o movemail
 
+/*  We need to define emacs to get the right version of something (what?).  */
 movemail.o: ${srcdir}/movemail.c ../src/config.h $(GETOPT_H)
        $(CC) -c ${CPP_CFLAGS} ${MOVE_FLAGS} ${srcdir}/movemail.c
 
index b59273ef33dd90d37333ec01819d7340bc41895d..14130d2e525e4e597df5f49f3a3d6026fba9c992 100644 (file)
@@ -22,7 +22,7 @@ ALL = make-docfile hexl ctags etags movemail ebrowse sorted-doc digest-doc emacs
 
 .PHONY: $(ALL)
 
-VERSION                = 23.1.94
+VERSION                = 24.0.50
 
 LOCAL_FLAGS    = -DWINDOWSNT -DDOS_NT -DSTDC_HEADERS=1 -DNO_LDAV=1 \
                  -DNO_ARCHIVES=1 -DHAVE_CONFIG_H=1 -I../nt/inc \
index bd287df28d04324e87393a6cc48a93ba3668dd54..e98ea81ee125c4ff77b5af6edacbf00d8ad4c90a 100644 (file)
@@ -1,9 +1,9 @@
-2010-03-30  Tomas Abrahamsson  <tab@lysator.liu.se>
+2010-03-31  Tomas Abrahamsson  <tab@lysator.liu.se>
 
        * textmodes/artist.el (artist-mode): Fix typo in docstring.
        Reported by Alex Schröder <kensanata@gmail.com>.  (Bug#5807)
 
-2010-03-30  Kenichi Handa  <handa@m17n.org>
+2010-03-31  Kenichi Handa  <handa@m17n.org>
 
        * language/sinhala.el (composition-function-table): Fix regexp for
        the new Unicode specification.
        (telugu-composable-pattern): New variables to cope with the new
        Unicode specification.  Use them in composition-function-table.
 
-2010-03-29  Stefan Monnier  <monnier@iro.umontreal.ca>
+2010-03-31  Stefan Monnier  <monnier@iro.umontreal.ca>
 
        Make tmm-menubar work for the Buffers menu again.
        * tmm.el (tmm-prompt): Also handle keymap entries in the form of
        vectors rather than cons cells, as used in menu-bar-update-buffers.
 
-2010-03-28  Chong Yidong  <cyd@stupidchicken.com>
+2010-03-31  Chong Yidong  <cyd@stupidchicken.com>
 
        * progmodes/js.el (js-auto-indent-flag, js-mode-map)
        (js-insert-and-indent): Revert 2009-08-15 change, restoring
 
        * mail/sendmail.el (mail-default-directory): Doc fix.
 
-2010-03-27  Chong Yidong  <cyd@stupidchicken.com>
+2010-03-31  Chong Yidong  <cyd@stupidchicken.com>
 
        * mail/sendmail.el (mail-default-directory): Doc fix.
 
-2010-03-27  Eli Zaretskii  <eliz@gnu.org>
+2010-03-31  Eli Zaretskii  <eliz@gnu.org>
 
        * subr.el (version-regexp-alist, version-to-list)
        (version-list-<, version-list-=, version-list-<=)
        (version-list-not-zero, version<, version<=, version=): Doc fix.
        (Bug#5744).
 
-2010-03-26  YAMAMOTO Mitsuharu  <mituharu@math.s.chiba-u.ac.jp>
-            Nick Roberts  <nickrob@snap.net.nz>
-
-       * progmodes/gdb-ui.el (gdb-apple-test): New function.
-       (gdb-init-1): Use it.
-
-2010-02-10  Dan Nicolaescu  <dann@ics.uci.edu>
+2010-02-31  Dan Nicolaescu  <dann@ics.uci.edu>
 
        * vc.el (vc-root-diff): Doc fix.
 
-2010-03-25  Chong Yidong  <cyd@stupidchicken.com>
+2010-03-31  Chong Yidong  <cyd@stupidchicken.com>
 
        * vc.el (vc-print-log, vc-print-root-log): Doc fix.
 
        * simple.el (append-to-buffer): Fix last change.
 
-2010-03-24  Chong Yidong  <cyd@stupidchicken.com>
+2010-03-31  Chong Yidong  <cyd@stupidchicken.com>
 
        * simple.el (append-to-buffer): Ensure that point is preserved if
        BUFFER is the current buffer.  Suggested by YAMAMOTO Mitsuharu.
        (Bug#5749)
 
+2010-03-31  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * files.el (auto-mode-case-fold): Change default to t.
+
+2010-03-30  Juri Linkov  <juri@jurta.org>
+
+       * dired-x.el (dired-omit-mode): Doc fix.
+
+2010-03-30  Juri Linkov  <juri@jurta.org>
+
+       * replace.el (occur-accumulate-lines): Move occur-engine related
+       functions `occur-accumulate-lines' and `occur-engine-add-prefix'
+       to be located after `occur-engine'.
+
+2010-03-30  Juri Linkov  <juri@jurta.org>
+
+       Make occur handle multi-line matches cleanly with context.
+       http://lists.gnu.org/archive/html/emacs-devel/2010-03/msg01280.html
+
+       * replace.el (occur-accumulate-lines): Add optional arg `pt'.
+       (occur-engine): Add local variables `ret', `prev-after-lines',
+       `prev-lines'.  Use more arguments for `occur-context-lines'.
+       Set first elem of its returned list to `data', and the second elem
+       to `prev-after-lines'.  Don't print the separator line.
+       In the end, print remaining context after-lines.
+       (occur-context-lines): Add new arguments `begpt', `endpt',
+       `lines', `prev-lines', `prev-after-lines'.  Rewrite to combine
+       after-lines of the previous match with before-lines of the
+       current match and not overlap them.  Return a list with two
+       values: the output line and the list of context after-lines.
+
+2010-03-30  Juri Linkov  <juri@jurta.org>
+
+       * replace.el (occur-accumulate-lines): Fix a bug where the first
+       context line at the beginning of the buffer was missing.
+
+2010-03-30  Eli Zaretskii  <eliz@gnu.org>
+
+       * files.el: Make bidi-display-reordering safe variable for boolean
+       values.
+
+2010-03-29  Phil Hagelberg  <phil@evri.com>
+           Chong Yidong  <cyd@stupidchicken.com>
+
+       * subr.el: Extend progress reporters to perform "spinning".
+       (progress-reporter-update, progress-reporter-do-update): Handle
+       non-numeric value arguments.
+       (progress-reporter--pulse-characters): New var.
+
+2010-03-28  Chong Yidong  <cyd@stupidchicken.com>
+
+       * progmodes/compile.el (compilation-start): Fix regexp detection
+       of initial cd command (Bug#5771).
+
+2010-03-28  Stefan Guath  <stefan@automata.se>  (tiny change)
+
+       * find-dired.el (find-dired): Use read-directory-name (Bug#5777).
+
+2010-03-27  Nick Roberts  <nickrob@snap.net.nz>
+
+       Restore GDB/MI fuctionality removed by 2009-12-29T07:15:34Z!nickrob@snap.net.nz.
+        * lisp/progmodes/gdb-mi.el: Restored.
+       * lisp/progmodes/gdb-ui.el: Removed.
+       * lisp/progmodes/gud.el: Re-accommodated for gdb-mi.el.
+
+2010-03-25  Glenn Morris  <rgm@gnu.org>
+
+       * desktop.el (desktop-save-buffer-p): Don't mistakenly include
+       all dired buffers, even tramp ones.  (Bug#5755)
+
+2010-03-25  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       Add "union tags" in mpc.el.
+       * mpc.el: Remove backward compatibility code.
+       (mpc-browser-tags): Change default.
+       (mpc--find-memoize-union-tags): New var.
+       (mpc-cmd-flush, mpc-cmd-special-tag-p): New fun.
+       (mpc-cmd-find): Handle the case where the playlist does not exist.
+       Handle union-tags.
+       (mpc-cmd-list): Use mpc-cmd-special-tag-p.  Handle union-tags.
+       (mpc-cmd-add): Use mpc-cmd-flush.
+       (mpc-tagbrowser-tag-name): New fun.
+       (mpc-tagbrowser-buf): Use it.
+       (mpc-songs-refresh): Use cond.  Move to point-min as a fallback.
+
 2010-03-24  Stefan Monnier  <monnier@iro.umontreal.ca>
 
+       Misc cleanup.
+       * progmodes/make-mode.el (makefile-bsdmake-rule-action-regex):
+       Use replace-regexp-in-string.
+       (makefile-mode-abbrev-table): Merge defvar and define-abbrev-table.
+       (makefile-imake-mode-syntax-table): Move init into defvar.
+       (makefile-mode): Use define-derived-mode.
+
        * progmodes/make-mode.el (makefile-rule-action-regex): Backtrack less.
        (makefile-make-font-lock-keywords): Adjust rule since submatch 1 may
        not be present any more.
 
        * cedet/srecode/table.el (srecode-template-table): Fix docstring typo.
 
-2010-03-23  Glenn Morris  <rgm@gnu.org>
+2010-03-24  Glenn Morris  <rgm@gnu.org>
 
        * textmodes/flyspell.el (sgml-lexical-context): Autoload it (Bug#5752).
 
-2010-03-21  Chong Yidong  <cyd@stupidchicken.com>
+2010-03-24  Chong Yidong  <cyd@stupidchicken.com>
 
        * indent.el (indent-for-tab-command): Doc fix.
 
-2010-03-22  Alan Mackenzie  <acm@muc.de>
+2010-03-24  Alan Mackenzie  <acm@muc.de>
 
        * progmodes/cc-engine.el (c-remove-stale-state-cache):
        Fix off-by-one error.  Fixes bug #5747.
 
-2010-03-22  Juanma Barranquero  <lekktu@gmail.com>
+2010-03-24  Juanma Barranquero  <lekktu@gmail.com>
 
        * image-dired.el (image-dired-display-thumbs): Fix typo in docstring.
        (image-dired-read-comment): Doc fix.
        (reftex-cite-punctuation, reftex-search-unrecursed-path-first)
        (reftex-highlight-selection): Fix typos in docstrings.
 
-2010-03-19  Juanma Barranquero  <lekktu@gmail.com>
+2010-03-24  Juanma Barranquero  <lekktu@gmail.com>
 
        * minibuffer.el (completion-in-region-functions): Fix docstring typos.
 
-2010-03-18  Glenn Morris  <rgm@gnu.org>
+2010-03-24  Glenn Morris  <rgm@gnu.org>
 
        * mail/rmail.el (rmail-highlight-face): Restore option deleted
        2008-02-13 without comment; mark it obsolete.
        (rmail-highlight-headers): Use rmail-highlight-face once more.
 
-2010-03-16  Chong Yidong  <cyd@stupidchicken.com>
+2010-03-24  Chong Yidong  <cyd@stupidchicken.com>
 
        * woman.el (woman2-process-escapes): Only consume the newline if
        the filler character is on a line by itself (Bug#5729).
 
-2010-03-16  Kenichi Handa  <handa@m17n.org>
+2010-03-24  Kenichi Handa  <handa@m17n.org>
 
        * language/indian.el (devanagari-composable-pattern): Add more
        consonants.
 
-2010-03-14  Michael Albinus  <michael.albinus@gmx.de>
+2010-03-24  Michael Albinus  <michael.albinus@gmx.de>
 
        * net/trampver.el: Update release number.
 
-2010-03-13  Glenn Morris  <rgm@gnu.org>
+2010-03-24  Glenn Morris  <rgm@gnu.org>
 
        * Makefile.in (ELCFILES): Add cedet/semantic/imenu.el.
 
-2010-03-13  Michael Albinus  <michael.albinus@gmx.de>
+2010-03-24  Michael Albinus  <michael.albinus@gmx.de>
 
        * net/tramp.el (tramp-find-executable):
        Use `tramp-get-connection-buffer'.  Make the regexp for checking
        (tramp-open-connection-setup-interactive-shell): Remove workaround
        for OpenSolaris bug, it is not needed anymore.
 
-2010-03-13  Eric M. Ludlam  <zappo@gnu.org>
+2010-03-24  Eric M. Ludlam  <zappo@gnu.org>
 
        * cedet/semantic/imenu.el: New file, from the CEDET repository
        (Bug#5412).
 
-2010-03-12  Glenn Morris  <rgm@gnu.org>
+2010-03-24  Glenn Morris  <rgm@gnu.org>
 
        * emacs-lisp/cl-macs.el (defsubst*): Add autoload cookie.  (Bug#4427)
 
-2010-03-11  Wilson Snyder  <wsnyder@wsnyder.org>
+2010-03-24  Wilson Snyder  <wsnyder@wsnyder.org>
 
        * files.el (auto-mode-alist): Accept more verilog file patterns.
 
-2010-03-09  Miles Bader  <miles@gnu.org>>
+2010-03-24  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * vc-dir.el (vc-dir-headers): Abbreviate the working dir.
+
+2010-03-24  Glenn Morris  <rgm@gnu.org>
+
+       * vc-bzr.el (vc-bzr-log-edit-mode): Add --fixes support to
+       log-edit-before-checkin-process.
+
+       * vc.el (vc-modify-change-comment): Pass MODE to vc-start-logentry.
+
+       * vc.el, vc-bzr.el, vc-hg.el (log-edit-mode): Declare.
+
+       * vc-dispatcher.el (vc-start-logentry): Doc fix.
+       (log-view-process-buffer, log-edit-extra-flags): Declare.
+
+       * log-edit.el (log-edit-before-checkin-process): Doc fix.
+
+       * cedet/semantic/bovine/c.el (semantic-c-describe-environment):
+       Consistently check ede-object is bound throughout.
+
+       * cedet/ede/project-am.el (ede-shell-run-something): Declare.
+
+2010-03-23  Sam Steingold  <sds@gnu.org>
+
+       Fix bug#5620: recalculate all markers on compilation buffer
+       modifications, not on file modifications.
+       * progmodes/compile.el (buffer-modtime): New buffer-local variable:
+       the buffer modification time, for buffers not associated with files.
+       (compilation-mode): Create it.
+       (compilation-filter): Update it.
+       (compilation-next-error-function): Use it instead of
+       `visited-file-modtime' for timestamp.
+
+2010-03-23  Juri Linkov  <juri@jurta.org>
+
+       Implement Occur multi-line matches.
+       http://lists.gnu.org/archive/html/emacs-devel/2010-03/msg01044.html
+
+       * replace.el (occur): Doc fix.
+       (occur-engine): Set `begpt' to the beginning of the first line.
+       Set `endpt' to the end of the last match line.  At first, count
+       line numbers between `origpt' and `begpt'.  Split out code from
+       `out-line' variable to new let-bindings `match-prefix' and
+       `match-str'.  In `out-line' add non-numeric prefix to all
+       non-first lines of multi-line matches.  Finally, count lines
+       between `begpt' and `endpt' and add to `lines'.
+
+2010-03-23  Juri Linkov  <juri@jurta.org>
+
+       * replace.el (occur-accumulate-lines, occur-engine):
+       Use `occur-engine-line' instead of duplicate code.
+       (occur-engine-line): New function created from duplicate code
+       in `occur-accumulate-lines' and `occur-engine'.
+
+       * replace.el (occur-engine-line): Add optional arg `keep-props'.
+       (occur-accumulate-lines, occur-engine): Add arg `keep-props'.
+
+2010-03-23  Juri Linkov  <juri@jurta.org>
+
+       * finder.el: Remove TODO tasks.
+
+       * info.el (Info-finder-find-node): Add node "all"
+       with all package info.  Handle a list of multiple keywords
+       separated by comma.
+       (info-finder): In interactive use with a prefix argument,
+       use `completing-read-multiple' to read a list of keywords
+       separated by comma.
+
+2010-03-23  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       Add a new completion style `substring'.
+       * minibuffer.el (completion-basic--pattern): New function.
+       (completion-basic-try-completion, completion-basic-all-completions):
+       Use it.
+       (completion-substring--all-completions)
+       (completion-substring-try-completion)
+       (completion-substring-all-completions): New functions.
+       (completion-styles-alist): New style `substring'.
+
+2010-03-22  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       Get rid of .elc files after removal of the corresponding .el.
+       * Makefile.in (compile-clean): New target.
+       (compile-main): Use it.
+
+2010-03-22  Jan Djärv  <jan.h.d@swipnet.se>
+
+       * Makefile.in (compile-main): cd to $(lisp) in a sub-shell, so we
+       don't do make there.  When compiling with separate object dir, there
+       is no Makefile there.
+
+2010-03-22  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       Get rid of the ELCFILES abomination, again.
+       * Makefile.in (update-elclist, ELCFILES, compile-last): Remove.
+       (all, compile): Don't call compile-last.
+       (compile-main): Build the "elcfiles" list dynamically.
+       (compile-targets): New (internal) target.
+
+2010-03-21  Andreas Schwab  <schwab@linux-m68k.org>
+
+       * Makefile.in (top_srcdir): Define.
+       (abs_top_builddir): Define.
+       (srcdir): Don't append `/..'.
+       (EMACS): Use ${abs_top_builddir}.
+       (all, compile, compile-always, compile-last): Don't set emacswd.
+       (update-subdirs, update-authors): Use $(top_srcdir) instead of
+       $(srcdir).
+       (lisp): Use $(srcdir) instead of @srcdir@.
+
+2010-03-21  Juri Linkov  <juri@jurta.org>
+
+       Fix message of multi-line occur regexps and multi-buffer header lines.
+       http://lists.gnu.org/archive/html/emacs-devel/2010-03/msg00457.html
+
+       * replace.el (occur-1): Don't display regexp if it is longer
+       than window-width.  Use `query-replace-descr' to display regexp.
+       (occur-engine): Don't display regexp in the buffer header for
+       multi-buffer occur.  Display a separate header line with total
+       match count and regexp for multi-buffer occur.
+       Use `query-replace-descr' to display regexp.
+
+2010-03-20  Teodor Zlatanov  <tzz@lifelogs.com>
+
+       * net/secrets.el: Fix parenthesis.
+       (secrets-enabled): Fix parenthesis.
+
+2010-03-20  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       Use more relative file and directory names.
+       * Makefile.in (EMACS): Arrange for it to work when we chdir.
+       (setwins, setwins_almost, setwins_for_subdirs):
+       Don't `cd'; output relative names.
+       (all, compile, compile-always, compile-last): Set emacswd.
+       (custom-deps, finder-data, autoloads, update-subdirs, compile-last):
+       Just cd to the lisp source dir so we can use relative file names.
+
+       * outline.el (hide-sublevels): Unfix the paren non-typo! (bug#5738).
+
+2010-03-20  Glenn Morris  <rgm@gnu.org>
+
+       * textmodes/rst.el: Use faces for font-lock customization, and make the
+       old -face variables obsolete.
+       (rst-block, rst-external, rst-definition, rst-directive, rst-comment)
+       (rst-emphasis1, rst-emphasis2, rst-literal, rst-reference): New faces.
+       (rst-block-face, rst-external-face, rst-definition-face)
+       (rst-directive-face, rst-comment-face, rst-emphasis1-face)
+       (rst-emphasis2-face, rst-literal-face, rst-reference-face):
+       Make obsolete.
+       (rst-font-lock-keywords-function): Update for above changes.
+
+2010-03-20  Juri Linkov  <juri@jurta.org>
+
+       * s-region.el:
+       * obsolete/s-region.el: Move to obsolete.
+
+2010-03-19  Juanma Barranquero  <lekktu@gmail.com>
+
+       * vc-dispatcher.el (vc-do-command): Remove reference to `vc-path'.
+
+2010-03-19  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * vc-hooks.el (vc-path): Remove variable and obsolete declaration.
+
+2010-03-19  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       Add special markup processing for commit logs.
+       * log-edit.el (log-edit-extra-flags): New variable.
+       (log-edit): Add new argument MODE.  Use that mode when non-nil
+       instead of the log-view-mode.
+       (log-view-process-buffer): New function.
+
+       * vc.el: Document that the checkin method takes optional
+       arguments.  Document new backend specific method: log-view-mode.
+       (vc-default-log-edit-mode): New function.
+       (vc-checkin): Use a backend specific log-view-mode.
+       Pass extra arguments to the checkin method.
+       (vc-modify-change-comment): Pass a dummy extra argument.
+
+       * vc-dispatcher.el (vc-log-edit): Add a mode argument, pass it to
+       log-edit.
+       (vc-start-logentry): Add a mode argument, pass it to vc-log-edit.
+       (vc-finish-logentry): Process the log buffer before passing it
+       down.  Pass log-edit-extra-flags.
+
+       * vc-bzr.el (vc-bzr-checkin): Pass extra arguments to the commit
+       command.
+       (log-edit-extra-flags, log-edit-before-checkin-process): New declarations.
+
+       * vc-hg.el (vc-hg-checkin): Pass extra arguments to the commit
+       command.
+       (log-edit-extra-flags, log-edit-before-checkin-process): New declarations.
+       (vc-hg-log-edit-mode): New derived mode.
+
+       * vc-arch.el (vc-arch-checkin):
+       * vc-cvs.el (vc-cvs-checkin):
+       * vc-git.el (vc-git-checkin):
+       * vc-mtn.el (vc-mtn-checkin):
+       * vc-rcs.el (vc-rcs-checkin):
+       * vc-sccs.el (vc-sccs-checkin):
+       * vc-svn.el (vc-svn-checkin): Add an optional ignored argument.
+
+2010-03-19  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * outline.el (hide-sublevels): Don't hide trailing newline (and fix
+       parent typo).
+
+2010-03-19  Glenn Morris  <rgm@gnu.org>
+
+       * password-cache.el (password-cache, password-cache-expiry): Autoload.
+
+2010-03-18  Glenn Morris  <rgm@gnu.org>
+
+       * emacs-lisp/autoload.el (autoload-rubric): Doc fix.
+
+       * replace.el (query-replace-history): Give it a doc string.
+       (map-query-replace-regexp): Use query-replace-from-history-variable
+       and query-replace-to-history-variable.
+
+       * mail/hashcash.el (declare-function): Remove duplicate definition.
+
+       * mail/emacsbug.el (report-emacs-bug-pretest-address):
+       Make it an obsolete alias for report-emacs-bug-address.
+       (message-strip-special-text-properties): Declare.
+       (report-emacs-bug): Remove test for a pretest bug address.
+       Combine message-mode-specific code.
+
+       * mail/supercite.el: Don't require sendmail.
+       (mh-in-header-p): Declare rather than using with-no-warnings.
+       (sc-no-blank-line-or-header): Use rfc822-goto-eoh rather than
+       mail-header-end.  Don't bind mysterious variable `kill-lines-magic'.
+
+       * calendar/cal-french.el: Convert to utf-8.
+
+       * files.el (interpreter-mode-alist): Use emacs-lisp-mode for
+       Emacs scripts.
+
+2010-03-16  Michael Albinus  <michael.albinus@gmx.de>
+
+       * net/secrets.el (secrets-enabled): New variable.  Use it instead
+       of a subfeature.
+
+2010-03-15  Michael Albinus  <michael.albinus@gmx.de>
+
+       * net/secrets.el (top): Register the D-Bus signals only when the
+       service "org.freedesktop.secrets" can be pinged.
+       Provide subfeature `enabled'.
+
+2010-03-14  Juri Linkov  <juri@jurta.org>
+
+       Add finder unknown keywords.
+
+       * finder.el (finder-unknown-keywords): New function.
+
+       * info.el (Info-finder-find-node): Use `finder-unknown-keywords'
+       to create a Finder node with unknown keywords.
+
+2010-03-14  Juri Linkov  <juri@jurta.org>
+
+       * finder.el (finder-compile-keywords): Replace `princ' with
+       `prin1' on a list of symbols interned from keyword strings.
+
+       * emacs-lisp/lisp-mnt.el (lm-keywords-list): If `keywords' contains
+       a comma, then split keywords using a comma and optional whitespace.
+       Otherwise, split by whitespace.
+
+       * complete.el:
+       * face-remap.el:
+       * log-view.el:
+       * net/hmac-def.el:
+       * net/hmac-md5.el:
+       * net/netrc.el:
+       * progmodes/mixal-mode.el: Fix keywords.
+
+2010-03-13  Michael Albinus  <michael.albinus@gmx.de>
+
+       * Makefile.in (ELCFILES): Add net/secrets.elc.
+
+       * net/secrets.el: New file.
+
+2010-03-12  Chong Yidong  <cyd@stupidchicken.com>
+
+       * facemenu.el (list-colors-display, list-colors-print): New arg
+       callback.  Use it to allow selecting colors.
+
+       * wid-edit.el (widget-image-insert): Insert image prop even if the
+       current display is non-graphic.
+       (widget-field-value-set): New fun.
+       (editable-field): Use it.
+       (widget-field-value-get): Clean up unused var.
+       (widget-color-value-create, widget-color--choose-action): New
+       funs.  Allow using list-colors-display to choose color.
+
+2010-03-12  Chong Yidong  <cyd@stupidchicken.com>
+
+       * cus-edit.el: Resort topmost custom groups.
+       (custom-buffer-sort-alphabetically): Default to t.
+       (customize-apropos): Use apropos-parse-pattern.
+       (custom-search-field): New var.
+       (custom-buffer-create-internal): Add custom-apropos search field.
+       (custom-add-parent-links): Don't display parent doc.
+       (custom-group-value-create): Don't sort top-level custom group.
+       (custom-magic-value-create): Show visibility button before option
+       name.
+
+       (custom-variable-state): New fun, from custom-variable-state-set.
+       (custom-variable-state-set): Use it.
+       (custom-group-value-create): Hide options with standard values
+       using the :hidden-states property.  Use progress reporter.
+
+       (custom-show): Simplify.
+       (custom-visibility): Disable images by default.
+       (custom-variable): New property :hidden-states.
+       (custom-variable-value-create): Enable images for
+       custom-visibility widgets.  Use :hidden-states property to
+       determine initial visibility.
+
+       * wid-edit.el (widget-image-find): Give images center ascent.
+       (visibility): Add :on-image and :off-image properties.
+       (widget-visibility-value-create): Use them.
+
+2010-03-12  Chong Yidong  <cyd@stupidchicken.com>
+
+       * cus-edit.el (processes): Remove from development group.
+       (oop, hypermedia): Delete group.
+       (comm): Promote to top-level group.
+
+       * net/browse-url.el (browse-url):
+       * net/xesam.el (xesam):
+       * net/tramp.el (tramp):
+       * net/goto-addr.el (goto-address):
+       * net/ange-ftp.el (ange-ftp): Put in comm group.
+
+       * view.el (view): Remove from editing group.
+
+       * uniquify.el (uniquify): Put in files group.
+
+       * net/browse-url.el (browse-url):
+       * ps-print.el (postscript): Put in external group.
+
+       * cus-edit.el (outlines):
+       * textmodes/text-mode.el (text-mode-hook):
+       * textmodes/table.el (table):
+       * textmodes/picture.el (picture):
+       * outline.el (outlines): Put in wp group.
+
+       * nxml/nxml-mode.el (nxml): Remove from wp group.
+
+       * net/tramp-imap.el (tramp-imap): Put in tramp group.
+
+       * mail/metamail.el (metamail): Remove from hypermedia group.
+
+       * cus-edit.el (abbrev):
+       * whitespace.el (whitespace):
+       * vcursor.el (vcursor):
+       * reveal.el (reveal):
+       * hl-line.el (hl-line): Put in convenience group.
+
+       * epg-config.el (epg): Put in data group.
+
+       * emulation/pc-select.el (pc-select): Put in emulations group.
+
+       * calculator.el (calculator): Put in applications group.
+
+2010-03-12  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       Add .dir-locals.el support for file-less buffers.
+       * files.el (hack-local-variables): Split out code to apply local
+       variable settings ...
+       (hack-local-variables-apply): ... here.  New function.
+       (hack-dir-local-variables): Use the default directory for when the
+       buffer does not have an associated file.
+       (hack-dir-local-variables-non-file-buffer): New function.
+       * diff-mode.el (diff-mode):
+       * vc-annotate.el (vc-annotate-mode):
+       * vc-dir.el (vc-dir-mode):
+       * log-edit.el (log-edit-mode):
+       * log-view.el (log-view-mode): Call hack-dir-local-variables-non-file-buffer.
+
+2010-03-12  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       Add support for shelving snapshots and for showing shelves.
+       * vc-bzr.el (vc-bzr-shelve-show, vc-bzr-shelve-show-at-point)
+       (vc-bzr-shelve-apply-and-keep-at-point, vc-bzr-shelve-snapshot):
+       New functions.
+       (vc-bzr-shelve-map, vc-bzr-shelve-menu-map)
+       (vc-bzr-extra-menu-map): Map them.
+
+2010-03-11  Glenn Morris  <rgm@gnu.org>
+
+       * cus-edit.el (customize-changed-options-previous-release):
+       Bump to 23.1.
+
+       * image.el (image-animate-max-time): Fix :version tag.
+
+2010-03-10  Chong Yidong  <cyd@stupidchicken.com>
+
+       * Branch for 23.2.
+
+2010-03-10  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * vc-git.el (vc-git-revision-table): Include remote branches.
+
+2010-03-10  Kim F. Storm  <storm@cua.dk>
+
+       Animated image API.
+       http://lists.gnu.org/archive/html/emacs-devel/2010-03/msg00211.html
+
+       * image.el (image-animate-max-time): New defcustom.
+       (image-animated-types): New defconst.
+       (create-animated-image, image-animate-timer)
+       (image-animate-start, image-animate-stop, image-animate-timeout)
+       (image-animated-p): New functions.
+
+       * image-mode.el (image-toggle-display-image):
+       Replace `create-image' with `create-animated-image'.
+
+2010-03-09  Miles Bader  <Miles Bader <miles@gnu.org>>
 
        * vc-git.el (vc-git-print-log): Use "tformat:" for shortlog,
        instead of "format:"; this ensures that the output is
index f9dc1710cc34792eb96d66eb34e1a597a8964bcc..e4a211399aa73bc8ca01260e08b787a347a92379 100644 (file)
 
 SHELL = /bin/sh
 
-lisp=@srcdir@
-VPATH=@srcdir@
-srcdir=@srcdir@/..
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+abs_top_builddir = @abs_top_builddir@
+lisp = $(srcdir)
+VPATH = $(srcdir)
 
 # You can specify a different executable on the make command line,
 # e.g. "make EMACS=../src/emacs ...".
 
-EMACS = ../src/emacs
+# We sometimes change directory before running Emacs (typically when
+# building out-of-tree, we chdir to the source directory), so we need
+# to use an absolute file name.
+EMACS = ${abs_top_builddir}/src/emacs
 
 # Command line flags for Emacs.  This must include --multibyte,
 # otherwise some files will not compile.
@@ -80,28 +85,28 @@ emacs = EMACSLOADPATH=$(lisp) LC_ALL=C $(EMACS) $(EMACSOPT)
 
 # Common command to find subdirectories
 
-setwins=subdirs=`(cd $$wd; find . -type d -print)`; \
+setwins=subdirs=`(find . -type d -print)`; \
        for file in $$subdirs; do \
           case $$file in */Old | */RCS | */CVS | */CVS/* | */.* | */.*/* | */=* ) ;; \
-               *) wins="$$wins $$wd/$$file" ;; \
+               *) wins="$$wins $$file" ;; \
           esac; \
         done
 
 # Find all subdirectories except `obsolete' and `term'.
 
-setwins_almost=subdirs=`(cd $$wd; find . -type d -print)`; \
+setwins_almost=subdirs=`(find . -type d -print)`; \
        for file in $$subdirs; do \
           case $$file in */Old | */RCS | */CVS | */CVS/* | */.* | */.*/* | */=* | */obsolete | */term ) ;; \
-               *) wins="$$wins $$wd/$$file" ;; \
+               *) wins="$$wins $$file" ;; \
           esac; \
         done
 
 # Find all subdirectories in which we might want to create subdirs.el
 
-setwins_for_subdirs=subdirs=`(cd $$wd; find . -type d -print)`; \
+setwins_for_subdirs=subdirs=`(find . -type d -print)`; \
        for file in $$subdirs; do \
           case $$file in */Old | */RCS | */CVS | */CVS/* | */.* | */.*/* | */=* | */cedet* ) ;; \
-               *) wins="$$wins $$wd/$$file" ;; \
+               *) wins="$$wins $$file" ;; \
           esac; \
         done
 
@@ -110,8 +115,6 @@ setwins_for_subdirs=subdirs=`(cd $$wd; find . -type d -print)`; \
 # cus-load and finder-inf are not explicitly requested by anything, so
 # we add them here to make sure they get built.
 all: compile-main $(lisp)/cus-load.el $(lisp)/finder-inf.el
-       @: Let us check that we byte-compiled all the files.
-       $(MAKE) $(MFLAGS) compile-last EMACS=$(EMACS)
 
 doit:
 
@@ -132,14 +135,14 @@ doit:
 $(lisp)/cus-load.el:
        $(MAKE) $(MFLAGS) custom-deps
 custom-deps: doit
-       wd=$(lisp); $(setwins_almost); \
+       cd $(lisp); $(setwins_almost); \
        echo Directories: $$wins; \
        $(emacs) -l cus-dep --eval '(setq generated-custom-dependencies-file "$(lisp)/cus-load.el")' -f custom-make-dependencies $$wins
 
 $(lisp)/finder-inf.el:
        $(MAKE) $(MFLAGS) finder-data
 finder-data: doit
-       wd=$(lisp); $(setwins_almost); \
+       cd $(lisp); $(setwins_almost); \
        echo Directories: $$wins; \
        $(emacs) -l finder --eval '(setq generated-finder-keywords-file "$(lisp)/finder-inf.el")' -f finder-compile-keywords-make-dist $$wins
 
@@ -149,7 +152,7 @@ autoloads: $(LOADDEFS) doit
        chmod +w $(lisp)/ps-print.el $(lisp)/emulation/tpu-edt.el \
          $(lisp)/emacs-lisp/cl-loaddefs.el $(lisp)/mail/rmail.el \
          $(lisp)/dired.el $(lisp)/ibuffer.el
-       wd=$(lisp); $(setwins_almost); \
+       cd $(lisp); $(setwins_almost); \
        echo Directories: $$wins; \
        $(emacs) -l autoload --eval '(setq generated-autoload-file "$(lisp)/loaddefs.el")' -f batch-update-autoloads $$wins
 
@@ -158,9 +161,9 @@ autoloads: $(LOADDEFS) doit
 $(lisp)/subdirs.el:
        $(MAKE) $(MFLAGS) update-subdirs
 update-subdirs: doit
-       wd=$(lisp); $(setwins_for_subdirs); \
+       cd $(lisp); $(setwins_for_subdirs); \
        for file in $$wins; do \
-          $(srcdir)/update-subdirs $$file; \
+          $(top_srcdir)/update-subdirs $$file; \
        done;
 
 updates: update-subdirs autoloads finder-data custom-deps
@@ -174,1290 +177,12 @@ cvs-update: bzr-update
 # Update the AUTHORS file.
 
 update-authors:
-       $(emacs) -l authors -f batch-update-authors $(srcdir)/etc/AUTHORS $(srcdir)
+       $(emacs) -l authors -f batch-update-authors $(top_srcdir)/etc/AUTHORS $(top_srcdir)
 
 TAGS TAGS-LISP: $(lisptagsfiles1) $(lisptagsfiles2) $(lisptagsfiles3) $(lisptagsfiles4)
        els=`echo $(lisptagsfiles1) $(lisptagsfiles2) $(lisptagsfiles3) $(lisptagsfiles4) | sed -e "s,$(lisp)/[^ ]*loaddefs[^ ]*,," -e "s,$(lisp)/ldefs-boot[^ ]*,,"`; \
        ${ETAGS} -o $@ $$els
 
-.PHONY: update-elclist
-
-## Post-bootstrap, find the list of .elc files and use sed to update
-## ELCFILES in Makefile.in.
-## Errors in the final sed are non-fatal, since they have no effect on
-## building Emacs.  chmod +w is for CVSREAD=1.
-## "echo" is non-portable with regards to backslashes, eg between zsh
-## and bash.  Hence the use of sed on line 2 below (line 1 seems to be OK).
-## http://lists.gnu.org/archive/html/emacs-devel/2008-05/msg01535.html
-update-elclist:
-       echo "/^ELCFILES/,/^$$/c\\" > temp.sed
-       echo "ELCFILES =" | sed -e 's/$$/ \\\\\\/' >> temp.sed
-       LC_COLLATE=C ls $(lisp)/*.elc $(lisp)/*/*.elc $(lisp)/*/*/*.elc $(lisp)/*/*/*/*.elc | sed -e "s|^$(lisp)|       \$$(lisp)|" -e 's/$$/ \\\\\\/' -e '$$ s/ \\\\//' >> temp.sed
-       echo "" >> temp.sed
-       -sed -f temp.sed $(lisp)/Makefile.in > temp-elcfiles || rm temp-elcfiles
-       rm temp.sed
-       @test -f temp-elcfiles || echo "Maintainer warning: failed to update Makefile.in.  You can ignore this if you are not an Emacs developer."
-       if test -f temp-elcfiles; then \
-         chmod +w $(lisp)/Makefile.in; \
-         mv -f temp-elcfiles $(lisp)/Makefile.in; \
-       fi
-       -(LC_COLLATE=C ls $(lisp)/*.elc $(lisp)/*/*.elc $(lisp)/*/*/*.elc $(lisp)/*/*/*/*.elc | sed 's/elc$$/el/';  \
-         LC_COLLATE=C ls $(lisp)/*.el $(lisp)/*/*.el $(lisp)/*/*/*.el $(lisp)/*/*/*/*.el; \
-         LC_COLLATE=C ls $(lisp)/*.el $(lisp)/*/*.el $(lisp)/*/*/*.el $(lisp)/*/*/*/*.el) |       \
-            sort | uniq -u | while read extra; do                         \
-                echo "Found left over byte-compiled file: $${extra}c !!" ;\
-            done
-
-## Explicitly list the .elc files, for the sake of parallel builds.
-## http://lists.gnu.org/archive/html/bug-gnu-emacs/2008-05/msg00016.html
-## This can probably be done more elegantly, but needs to be portable.
-ELCFILES = \
-       $(lisp)/abbrev.elc \
-       $(lisp)/abbrevlist.elc \
-       $(lisp)/add-log.elc \
-       $(lisp)/align.elc \
-       $(lisp)/allout.elc \
-       $(lisp)/ansi-color.elc \
-       $(lisp)/apropos.elc \
-       $(lisp)/arc-mode.elc \
-       $(lisp)/array.elc \
-       $(lisp)/autoarg.elc \
-       $(lisp)/autoinsert.elc \
-       $(lisp)/autorevert.elc \
-       $(lisp)/avoid.elc \
-       $(lisp)/battery.elc \
-       $(lisp)/bindings.elc \
-       $(lisp)/bookmark.elc \
-       $(lisp)/bs.elc \
-       $(lisp)/buff-menu.elc \
-       $(lisp)/button.elc \
-       $(lisp)/calc/calc-aent.elc \
-       $(lisp)/calc/calc-alg.elc \
-       $(lisp)/calc/calc-arith.elc \
-       $(lisp)/calc/calc-bin.elc \
-       $(lisp)/calc/calc-comb.elc \
-       $(lisp)/calc/calc-cplx.elc \
-       $(lisp)/calc/calc-embed.elc \
-       $(lisp)/calc/calc-ext.elc \
-       $(lisp)/calc/calc-fin.elc \
-       $(lisp)/calc/calc-forms.elc \
-       $(lisp)/calc/calc-frac.elc \
-       $(lisp)/calc/calc-funcs.elc \
-       $(lisp)/calc/calc-graph.elc \
-       $(lisp)/calc/calc-help.elc \
-       $(lisp)/calc/calc-incom.elc \
-       $(lisp)/calc/calc-keypd.elc \
-       $(lisp)/calc/calc-lang.elc \
-       $(lisp)/calc/calc-macs.elc \
-       $(lisp)/calc/calc-map.elc \
-       $(lisp)/calc/calc-math.elc \
-       $(lisp)/calc/calc-menu.elc \
-       $(lisp)/calc/calc-misc.elc \
-       $(lisp)/calc/calc-mode.elc \
-       $(lisp)/calc/calc-mtx.elc \
-       $(lisp)/calc/calc-nlfit.elc \
-       $(lisp)/calc/calc-poly.elc \
-       $(lisp)/calc/calc-prog.elc \
-       $(lisp)/calc/calc-rewr.elc \
-       $(lisp)/calc/calc-rules.elc \
-       $(lisp)/calc/calc-sel.elc \
-       $(lisp)/calc/calc-stat.elc \
-       $(lisp)/calc/calc-store.elc \
-       $(lisp)/calc/calc-stuff.elc \
-       $(lisp)/calc/calc-trail.elc \
-       $(lisp)/calc/calc-undo.elc \
-       $(lisp)/calc/calc-units.elc \
-       $(lisp)/calc/calc-vec.elc \
-       $(lisp)/calc/calc-yank.elc \
-       $(lisp)/calc/calc.elc \
-       $(lisp)/calc/calcalg2.elc \
-       $(lisp)/calc/calcalg3.elc \
-       $(lisp)/calc/calccomp.elc \
-       $(lisp)/calc/calcsel2.elc \
-       $(lisp)/calculator.elc \
-       $(lisp)/calendar/appt.elc \
-       $(lisp)/calendar/cal-bahai.elc \
-       $(lisp)/calendar/cal-china.elc \
-       $(lisp)/calendar/cal-coptic.elc \
-       $(lisp)/calendar/cal-dst.elc \
-       $(lisp)/calendar/cal-french.elc \
-       $(lisp)/calendar/cal-hebrew.elc \
-       $(lisp)/calendar/cal-html.elc \
-       $(lisp)/calendar/cal-islam.elc \
-       $(lisp)/calendar/cal-iso.elc \
-       $(lisp)/calendar/cal-julian.elc \
-       $(lisp)/calendar/cal-mayan.elc \
-       $(lisp)/calendar/cal-menu.elc \
-       $(lisp)/calendar/cal-move.elc \
-       $(lisp)/calendar/cal-persia.elc \
-       $(lisp)/calendar/cal-tex.elc \
-       $(lisp)/calendar/cal-x.elc \
-       $(lisp)/calendar/calendar.elc \
-       $(lisp)/calendar/diary-lib.elc \
-       $(lisp)/calendar/holidays.elc \
-       $(lisp)/calendar/icalendar.elc \
-       $(lisp)/calendar/lunar.elc \
-       $(lisp)/calendar/parse-time.elc \
-       $(lisp)/calendar/solar.elc \
-       $(lisp)/calendar/time-date.elc \
-       $(lisp)/calendar/timeclock.elc \
-       $(lisp)/calendar/todo-mode.elc \
-       $(lisp)/case-table.elc \
-       $(lisp)/cdl.elc \
-       $(lisp)/cedet/cedet-cscope.elc \
-       $(lisp)/cedet/cedet-files.elc \
-       $(lisp)/cedet/cedet-global.elc \
-       $(lisp)/cedet/cedet-idutils.elc \
-       $(lisp)/cedet/cedet.elc \
-       $(lisp)/cedet/data-debug.elc \
-       $(lisp)/cedet/ede.elc \
-       $(lisp)/cedet/ede/autoconf-edit.elc \
-       $(lisp)/cedet/ede/cpp-root.elc \
-       $(lisp)/cedet/ede/dired.elc \
-       $(lisp)/cedet/ede/emacs.elc \
-       $(lisp)/cedet/ede/files.elc \
-       $(lisp)/cedet/ede/linux.elc \
-       $(lisp)/cedet/ede/locate.elc \
-       $(lisp)/cedet/ede/make.elc \
-       $(lisp)/cedet/ede/makefile-edit.elc \
-       $(lisp)/cedet/ede/pconf.elc \
-       $(lisp)/cedet/ede/pmake.elc \
-       $(lisp)/cedet/ede/proj-archive.elc \
-       $(lisp)/cedet/ede/proj-aux.elc \
-       $(lisp)/cedet/ede/proj-comp.elc \
-       $(lisp)/cedet/ede/proj-elisp.elc \
-       $(lisp)/cedet/ede/proj-info.elc \
-       $(lisp)/cedet/ede/proj-misc.elc \
-       $(lisp)/cedet/ede/proj-obj.elc \
-       $(lisp)/cedet/ede/proj-prog.elc \
-       $(lisp)/cedet/ede/proj-scheme.elc \
-       $(lisp)/cedet/ede/proj-shared.elc \
-       $(lisp)/cedet/ede/proj.elc \
-       $(lisp)/cedet/ede/project-am.elc \
-       $(lisp)/cedet/ede/shell.elc \
-       $(lisp)/cedet/ede/simple.elc \
-       $(lisp)/cedet/ede/source.elc \
-       $(lisp)/cedet/ede/speedbar.elc \
-       $(lisp)/cedet/ede/srecode.elc \
-       $(lisp)/cedet/ede/system.elc \
-       $(lisp)/cedet/ede/util.elc \
-       $(lisp)/cedet/inversion.elc \
-       $(lisp)/cedet/mode-local.elc \
-       $(lisp)/cedet/pulse.elc \
-       $(lisp)/cedet/semantic.elc \
-       $(lisp)/cedet/semantic/analyze.elc \
-       $(lisp)/cedet/semantic/analyze/complete.elc \
-       $(lisp)/cedet/semantic/analyze/debug.elc \
-       $(lisp)/cedet/semantic/analyze/fcn.elc \
-       $(lisp)/cedet/semantic/analyze/refs.elc \
-       $(lisp)/cedet/semantic/bovine.elc \
-       $(lisp)/cedet/semantic/bovine/c-by.elc \
-       $(lisp)/cedet/semantic/bovine/c.elc \
-       $(lisp)/cedet/semantic/bovine/debug.elc \
-       $(lisp)/cedet/semantic/bovine/el.elc \
-       $(lisp)/cedet/semantic/bovine/gcc.elc \
-       $(lisp)/cedet/semantic/bovine/make-by.elc \
-       $(lisp)/cedet/semantic/bovine/make.elc \
-       $(lisp)/cedet/semantic/bovine/scm-by.elc \
-       $(lisp)/cedet/semantic/bovine/scm.elc \
-       $(lisp)/cedet/semantic/chart.elc \
-       $(lisp)/cedet/semantic/complete.elc \
-       $(lisp)/cedet/semantic/ctxt.elc \
-       $(lisp)/cedet/semantic/db-debug.elc \
-       $(lisp)/cedet/semantic/db-ebrowse.elc \
-       $(lisp)/cedet/semantic/db-el.elc \
-       $(lisp)/cedet/semantic/db-file.elc \
-       $(lisp)/cedet/semantic/db-find.elc \
-       $(lisp)/cedet/semantic/db-global.elc \
-       $(lisp)/cedet/semantic/db-javascript.elc \
-       $(lisp)/cedet/semantic/db-mode.elc \
-       $(lisp)/cedet/semantic/db-ref.elc \
-       $(lisp)/cedet/semantic/db-typecache.elc \
-       $(lisp)/cedet/semantic/db.elc \
-       $(lisp)/cedet/semantic/debug.elc \
-       $(lisp)/cedet/semantic/decorate.elc \
-       $(lisp)/cedet/semantic/decorate/include.elc \
-       $(lisp)/cedet/semantic/decorate/mode.elc \
-       $(lisp)/cedet/semantic/dep.elc \
-       $(lisp)/cedet/semantic/doc.elc \
-       $(lisp)/cedet/semantic/ede-grammar.elc \
-       $(lisp)/cedet/semantic/edit.elc \
-       $(lisp)/cedet/semantic/find.elc \
-       $(lisp)/cedet/semantic/format.elc \
-       $(lisp)/cedet/semantic/fw.elc \
-       $(lisp)/cedet/semantic/grammar-wy.elc \
-       $(lisp)/cedet/semantic/grammar.elc \
-       $(lisp)/cedet/semantic/html.elc \
-       $(lisp)/cedet/semantic/ia-sb.elc \
-       $(lisp)/cedet/semantic/ia.elc \
-       $(lisp)/cedet/semantic/idle.elc \
-       $(lisp)/cedet/semantic/imenu.elc \
-       $(lisp)/cedet/semantic/java.elc \
-       $(lisp)/cedet/semantic/lex-spp.elc \
-       $(lisp)/cedet/semantic/lex.elc \
-       $(lisp)/cedet/semantic/mru-bookmark.elc \
-       $(lisp)/cedet/semantic/sb.elc \
-       $(lisp)/cedet/semantic/scope.elc \
-       $(lisp)/cedet/semantic/senator.elc \
-       $(lisp)/cedet/semantic/sort.elc \
-       $(lisp)/cedet/semantic/symref.elc \
-       $(lisp)/cedet/semantic/symref/cscope.elc \
-       $(lisp)/cedet/semantic/symref/filter.elc \
-       $(lisp)/cedet/semantic/symref/global.elc \
-       $(lisp)/cedet/semantic/symref/grep.elc \
-       $(lisp)/cedet/semantic/symref/idutils.elc \
-       $(lisp)/cedet/semantic/symref/list.elc \
-       $(lisp)/cedet/semantic/tag-file.elc \
-       $(lisp)/cedet/semantic/tag-ls.elc \
-       $(lisp)/cedet/semantic/tag-write.elc \
-       $(lisp)/cedet/semantic/tag.elc \
-       $(lisp)/cedet/semantic/texi.elc \
-       $(lisp)/cedet/semantic/util-modes.elc \
-       $(lisp)/cedet/semantic/util.elc \
-       $(lisp)/cedet/semantic/wisent.elc \
-       $(lisp)/cedet/semantic/wisent/comp.elc \
-       $(lisp)/cedet/semantic/wisent/java-tags.elc \
-       $(lisp)/cedet/semantic/wisent/javascript.elc \
-       $(lisp)/cedet/semantic/wisent/javat-wy.elc \
-       $(lisp)/cedet/semantic/wisent/js-wy.elc \
-       $(lisp)/cedet/semantic/wisent/python-wy.elc \
-       $(lisp)/cedet/semantic/wisent/python.elc \
-       $(lisp)/cedet/semantic/wisent/wisent.elc \
-       $(lisp)/cedet/srecode.elc \
-       $(lisp)/cedet/srecode/args.elc \
-       $(lisp)/cedet/srecode/compile.elc \
-       $(lisp)/cedet/srecode/cpp.elc \
-       $(lisp)/cedet/srecode/ctxt.elc \
-       $(lisp)/cedet/srecode/dictionary.elc \
-       $(lisp)/cedet/srecode/document.elc \
-       $(lisp)/cedet/srecode/el.elc \
-       $(lisp)/cedet/srecode/expandproto.elc \
-       $(lisp)/cedet/srecode/extract.elc \
-       $(lisp)/cedet/srecode/fields.elc \
-       $(lisp)/cedet/srecode/filters.elc \
-       $(lisp)/cedet/srecode/find.elc \
-       $(lisp)/cedet/srecode/getset.elc \
-       $(lisp)/cedet/srecode/insert.elc \
-       $(lisp)/cedet/srecode/java.elc \
-       $(lisp)/cedet/srecode/map.elc \
-       $(lisp)/cedet/srecode/mode.elc \
-       $(lisp)/cedet/srecode/semantic.elc \
-       $(lisp)/cedet/srecode/srt-mode.elc \
-       $(lisp)/cedet/srecode/srt-wy.elc \
-       $(lisp)/cedet/srecode/srt.elc \
-       $(lisp)/cedet/srecode/table.elc \
-       $(lisp)/cedet/srecode/template.elc \
-       $(lisp)/cedet/srecode/texi.elc \
-       $(lisp)/chistory.elc \
-       $(lisp)/cmuscheme.elc \
-       $(lisp)/comint.elc \
-       $(lisp)/compare-w.elc \
-       $(lisp)/complete.elc \
-       $(lisp)/completion.elc \
-       $(lisp)/composite.elc \
-       $(lisp)/cus-dep.elc \
-       $(lisp)/cus-edit.elc \
-       $(lisp)/cus-face.elc \
-       $(lisp)/cus-start.elc \
-       $(lisp)/cus-theme.elc \
-       $(lisp)/custom.elc \
-       $(lisp)/cvs-status.elc \
-       $(lisp)/dabbrev.elc \
-       $(lisp)/delim-col.elc \
-       $(lisp)/delsel.elc \
-       $(lisp)/descr-text.elc \
-       $(lisp)/desktop.elc \
-       $(lisp)/dframe.elc \
-       $(lisp)/diff-mode.elc \
-       $(lisp)/diff.elc \
-       $(lisp)/dired-aux.elc \
-       $(lisp)/dired-x.elc \
-       $(lisp)/dired.elc \
-       $(lisp)/dirtrack.elc \
-       $(lisp)/disp-table.elc \
-       $(lisp)/dnd.elc \
-       $(lisp)/doc-view.elc \
-       $(lisp)/dos-fns.elc \
-       $(lisp)/dos-vars.elc \
-       $(lisp)/dos-w32.elc \
-       $(lisp)/double.elc \
-       $(lisp)/ebuff-menu.elc \
-       $(lisp)/echistory.elc \
-       $(lisp)/ediff-diff.elc \
-       $(lisp)/ediff-help.elc \
-       $(lisp)/ediff-hook.elc \
-       $(lisp)/ediff-init.elc \
-       $(lisp)/ediff-merg.elc \
-       $(lisp)/ediff-mult.elc \
-       $(lisp)/ediff-ptch.elc \
-       $(lisp)/ediff-util.elc \
-       $(lisp)/ediff-vers.elc \
-       $(lisp)/ediff-wind.elc \
-       $(lisp)/ediff.elc \
-       $(lisp)/edmacro.elc \
-       $(lisp)/ehelp.elc \
-       $(lisp)/electric.elc \
-       $(lisp)/elide-head.elc \
-       $(lisp)/emacs-lisp/advice.elc \
-       $(lisp)/emacs-lisp/assoc.elc \
-       $(lisp)/emacs-lisp/authors.elc \
-       $(lisp)/emacs-lisp/autoload.elc \
-       $(lisp)/emacs-lisp/avl-tree.elc \
-       $(lisp)/emacs-lisp/backquote.elc \
-       $(lisp)/emacs-lisp/benchmark.elc \
-       $(lisp)/emacs-lisp/bindat.elc \
-       $(lisp)/emacs-lisp/byte-opt.elc \
-       $(lisp)/emacs-lisp/byte-run.elc \
-       $(lisp)/emacs-lisp/bytecomp.elc \
-       $(lisp)/emacs-lisp/chart.elc \
-       $(lisp)/emacs-lisp/check-declare.elc \
-       $(lisp)/emacs-lisp/checkdoc.elc \
-       $(lisp)/emacs-lisp/cl-compat.elc \
-       $(lisp)/emacs-lisp/cl-extra.elc \
-       $(lisp)/emacs-lisp/cl-indent.elc \
-       $(lisp)/emacs-lisp/cl-macs.elc \
-       $(lisp)/emacs-lisp/cl-seq.elc \
-       $(lisp)/emacs-lisp/cl.elc \
-       $(lisp)/emacs-lisp/copyright.elc \
-       $(lisp)/emacs-lisp/crm.elc \
-       $(lisp)/emacs-lisp/cust-print.elc \
-       $(lisp)/emacs-lisp/debug.elc \
-       $(lisp)/emacs-lisp/derived.elc \
-       $(lisp)/emacs-lisp/disass.elc \
-       $(lisp)/emacs-lisp/easy-mmode.elc \
-       $(lisp)/emacs-lisp/easymenu.elc \
-       $(lisp)/emacs-lisp/edebug.elc \
-       $(lisp)/emacs-lisp/eieio-base.elc \
-       $(lisp)/emacs-lisp/eieio-comp.elc \
-       $(lisp)/emacs-lisp/eieio-custom.elc \
-       $(lisp)/emacs-lisp/eieio-datadebug.elc \
-       $(lisp)/emacs-lisp/eieio-opt.elc \
-       $(lisp)/emacs-lisp/eieio-speedbar.elc \
-       $(lisp)/emacs-lisp/eieio.elc \
-       $(lisp)/emacs-lisp/eldoc.elc \
-       $(lisp)/emacs-lisp/elint.elc \
-       $(lisp)/emacs-lisp/elp.elc \
-       $(lisp)/emacs-lisp/ewoc.elc \
-       $(lisp)/emacs-lisp/find-func.elc \
-       $(lisp)/emacs-lisp/find-gc.elc \
-       $(lisp)/emacs-lisp/float-sup.elc \
-       $(lisp)/emacs-lisp/generic.elc \
-       $(lisp)/emacs-lisp/gulp.elc \
-       $(lisp)/emacs-lisp/helper.elc \
-       $(lisp)/emacs-lisp/lisp-mnt.elc \
-       $(lisp)/emacs-lisp/lisp-mode.elc \
-       $(lisp)/emacs-lisp/lisp.elc \
-       $(lisp)/emacs-lisp/lmenu.elc \
-       $(lisp)/emacs-lisp/macroexp.elc \
-       $(lisp)/emacs-lisp/map-ynp.elc \
-       $(lisp)/emacs-lisp/pp.elc \
-       $(lisp)/emacs-lisp/re-builder.elc \
-       $(lisp)/emacs-lisp/regexp-opt.elc \
-       $(lisp)/emacs-lisp/regi.elc \
-       $(lisp)/emacs-lisp/ring.elc \
-       $(lisp)/emacs-lisp/rx.elc \
-       $(lisp)/emacs-lisp/shadow.elc \
-       $(lisp)/emacs-lisp/sregex.elc \
-       $(lisp)/emacs-lisp/syntax.elc \
-       $(lisp)/emacs-lisp/tcover-ses.elc \
-       $(lisp)/emacs-lisp/tcover-unsafep.elc \
-       $(lisp)/emacs-lisp/testcover.elc \
-       $(lisp)/emacs-lisp/timer.elc \
-       $(lisp)/emacs-lisp/tq.elc \
-       $(lisp)/emacs-lisp/trace.elc \
-       $(lisp)/emacs-lisp/unsafep.elc \
-       $(lisp)/emacs-lisp/warnings.elc \
-       $(lisp)/emacs-lock.elc \
-       $(lisp)/emerge.elc \
-       $(lisp)/emulation/crisp.elc \
-       $(lisp)/emulation/cua-base.elc \
-       $(lisp)/emulation/cua-gmrk.elc \
-       $(lisp)/emulation/cua-rect.elc \
-       $(lisp)/emulation/edt-lk201.elc \
-       $(lisp)/emulation/edt-mapper.elc \
-       $(lisp)/emulation/edt-pc.elc \
-       $(lisp)/emulation/edt-vt100.elc \
-       $(lisp)/emulation/edt.elc \
-       $(lisp)/emulation/keypad.elc \
-       $(lisp)/emulation/pc-mode.elc \
-       $(lisp)/emulation/pc-select.elc \
-       $(lisp)/emulation/tpu-edt.elc \
-       $(lisp)/emulation/tpu-extras.elc \
-       $(lisp)/emulation/tpu-mapper.elc \
-       $(lisp)/emulation/vi.elc \
-       $(lisp)/emulation/vip.elc \
-       $(lisp)/emulation/viper-cmd.elc \
-       $(lisp)/emulation/viper-ex.elc \
-       $(lisp)/emulation/viper-init.elc \
-       $(lisp)/emulation/viper-keym.elc \
-       $(lisp)/emulation/viper-macs.elc \
-       $(lisp)/emulation/viper-mous.elc \
-       $(lisp)/emulation/viper-util.elc \
-       $(lisp)/emulation/viper.elc \
-       $(lisp)/emulation/ws-mode.elc \
-       $(lisp)/env.elc \
-       $(lisp)/epa-dired.elc \
-       $(lisp)/epa-file.elc \
-       $(lisp)/epa-hook.elc \
-       $(lisp)/epa-mail.elc \
-       $(lisp)/epa.elc \
-       $(lisp)/epg-config.elc \
-       $(lisp)/epg.elc \
-       $(lisp)/erc/erc-autoaway.elc \
-       $(lisp)/erc/erc-backend.elc \
-       $(lisp)/erc/erc-button.elc \
-       $(lisp)/erc/erc-capab.elc \
-       $(lisp)/erc/erc-compat.elc \
-       $(lisp)/erc/erc-dcc.elc \
-       $(lisp)/erc/erc-ezbounce.elc \
-       $(lisp)/erc/erc-fill.elc \
-       $(lisp)/erc/erc-goodies.elc \
-       $(lisp)/erc/erc-hecomplete.elc \
-       $(lisp)/erc/erc-ibuffer.elc \
-       $(lisp)/erc/erc-identd.elc \
-       $(lisp)/erc/erc-imenu.elc \
-       $(lisp)/erc/erc-join.elc \
-       $(lisp)/erc/erc-lang.elc \
-       $(lisp)/erc/erc-list.elc \
-       $(lisp)/erc/erc-log.elc \
-       $(lisp)/erc/erc-match.elc \
-       $(lisp)/erc/erc-menu.elc \
-       $(lisp)/erc/erc-netsplit.elc \
-       $(lisp)/erc/erc-networks.elc \
-       $(lisp)/erc/erc-notify.elc \
-       $(lisp)/erc/erc-page.elc \
-       $(lisp)/erc/erc-pcomplete.elc \
-       $(lisp)/erc/erc-replace.elc \
-       $(lisp)/erc/erc-ring.elc \
-       $(lisp)/erc/erc-services.elc \
-       $(lisp)/erc/erc-sound.elc \
-       $(lisp)/erc/erc-speedbar.elc \
-       $(lisp)/erc/erc-spelling.elc \
-       $(lisp)/erc/erc-stamp.elc \
-       $(lisp)/erc/erc-track.elc \
-       $(lisp)/erc/erc-truncate.elc \
-       $(lisp)/erc/erc-xdcc.elc \
-       $(lisp)/erc/erc.elc \
-       $(lisp)/eshell/em-alias.elc \
-       $(lisp)/eshell/em-banner.elc \
-       $(lisp)/eshell/em-basic.elc \
-       $(lisp)/eshell/em-cmpl.elc \
-       $(lisp)/eshell/em-dirs.elc \
-       $(lisp)/eshell/em-glob.elc \
-       $(lisp)/eshell/em-hist.elc \
-       $(lisp)/eshell/em-ls.elc \
-       $(lisp)/eshell/em-pred.elc \
-       $(lisp)/eshell/em-prompt.elc \
-       $(lisp)/eshell/em-rebind.elc \
-       $(lisp)/eshell/em-script.elc \
-       $(lisp)/eshell/em-smart.elc \
-       $(lisp)/eshell/em-term.elc \
-       $(lisp)/eshell/em-unix.elc \
-       $(lisp)/eshell/em-xtra.elc \
-       $(lisp)/eshell/esh-arg.elc \
-       $(lisp)/eshell/esh-cmd.elc \
-       $(lisp)/eshell/esh-ext.elc \
-       $(lisp)/eshell/esh-io.elc \
-       $(lisp)/eshell/esh-mode.elc \
-       $(lisp)/eshell/esh-module.elc \
-       $(lisp)/eshell/esh-opt.elc \
-       $(lisp)/eshell/esh-proc.elc \
-       $(lisp)/eshell/esh-test.elc \
-       $(lisp)/eshell/esh-util.elc \
-       $(lisp)/eshell/esh-var.elc \
-       $(lisp)/eshell/eshell.elc \
-       $(lisp)/expand.elc \
-       $(lisp)/ezimage.elc \
-       $(lisp)/face-remap.elc \
-       $(lisp)/facemenu.elc \
-       $(lisp)/faces.elc \
-       $(lisp)/ffap.elc \
-       $(lisp)/filecache.elc \
-       $(lisp)/files-x.elc \
-       $(lisp)/files.elc \
-       $(lisp)/filesets.elc \
-       $(lisp)/find-cmd.elc \
-       $(lisp)/find-dired.elc \
-       $(lisp)/find-file.elc \
-       $(lisp)/find-lisp.elc \
-       $(lisp)/finder.elc \
-       $(lisp)/flow-ctrl.elc \
-       $(lisp)/foldout.elc \
-       $(lisp)/follow.elc \
-       $(lisp)/font-core.elc \
-       $(lisp)/font-lock.elc \
-       $(lisp)/font-setting.elc \
-       $(lisp)/format-spec.elc \
-       $(lisp)/format.elc \
-       $(lisp)/forms.elc \
-       $(lisp)/frame.elc \
-       $(lisp)/fringe.elc \
-       $(lisp)/generic-x.elc \
-       $(lisp)/gnus/auth-source.elc \
-       $(lisp)/gnus/canlock.elc \
-       $(lisp)/gnus/compface.elc \
-       $(lisp)/gnus/deuglify.elc \
-       $(lisp)/gnus/earcon.elc \
-       $(lisp)/gnus/ecomplete.elc \
-       $(lisp)/gnus/flow-fill.elc \
-       $(lisp)/gnus/gmm-utils.elc \
-       $(lisp)/gnus/gnus-agent.elc \
-       $(lisp)/gnus/gnus-art.elc \
-       $(lisp)/gnus/gnus-async.elc \
-       $(lisp)/gnus/gnus-audio.elc \
-       $(lisp)/gnus/gnus-bcklg.elc \
-       $(lisp)/gnus/gnus-bookmark.elc \
-       $(lisp)/gnus/gnus-cache.elc \
-       $(lisp)/gnus/gnus-cite.elc \
-       $(lisp)/gnus/gnus-cus.elc \
-       $(lisp)/gnus/gnus-delay.elc \
-       $(lisp)/gnus/gnus-demon.elc \
-       $(lisp)/gnus/gnus-diary.elc \
-       $(lisp)/gnus/gnus-dired.elc \
-       $(lisp)/gnus/gnus-draft.elc \
-       $(lisp)/gnus/gnus-dup.elc \
-       $(lisp)/gnus/gnus-eform.elc \
-       $(lisp)/gnus/gnus-ems.elc \
-       $(lisp)/gnus/gnus-fun.elc \
-       $(lisp)/gnus/gnus-group.elc \
-       $(lisp)/gnus/gnus-int.elc \
-       $(lisp)/gnus/gnus-kill.elc \
-       $(lisp)/gnus/gnus-logic.elc \
-       $(lisp)/gnus/gnus-mh.elc \
-       $(lisp)/gnus/gnus-ml.elc \
-       $(lisp)/gnus/gnus-mlspl.elc \
-       $(lisp)/gnus/gnus-move.elc \
-       $(lisp)/gnus/gnus-msg.elc \
-       $(lisp)/gnus/gnus-nocem.elc \
-       $(lisp)/gnus/gnus-picon.elc \
-       $(lisp)/gnus/gnus-range.elc \
-       $(lisp)/gnus/gnus-registry.elc \
-       $(lisp)/gnus/gnus-salt.elc \
-       $(lisp)/gnus/gnus-score.elc \
-       $(lisp)/gnus/gnus-setup.elc \
-       $(lisp)/gnus/gnus-sieve.elc \
-       $(lisp)/gnus/gnus-soup.elc \
-       $(lisp)/gnus/gnus-spec.elc \
-       $(lisp)/gnus/gnus-srvr.elc \
-       $(lisp)/gnus/gnus-start.elc \
-       $(lisp)/gnus/gnus-sum.elc \
-       $(lisp)/gnus/gnus-topic.elc \
-       $(lisp)/gnus/gnus-undo.elc \
-       $(lisp)/gnus/gnus-util.elc \
-       $(lisp)/gnus/gnus-uu.elc \
-       $(lisp)/gnus/gnus-vm.elc \
-       $(lisp)/gnus/gnus-win.elc \
-       $(lisp)/gnus/gnus.elc \
-       $(lisp)/gnus/html2text.elc \
-       $(lisp)/gnus/ietf-drums.elc \
-       $(lisp)/gnus/legacy-gnus-agent.elc \
-       $(lisp)/gnus/mail-parse.elc \
-       $(lisp)/gnus/mail-prsvr.elc \
-       $(lisp)/gnus/mail-source.elc \
-       $(lisp)/gnus/mailcap.elc \
-       $(lisp)/gnus/message.elc \
-       $(lisp)/gnus/messcompat.elc \
-       $(lisp)/gnus/mm-bodies.elc \
-       $(lisp)/gnus/mm-decode.elc \
-       $(lisp)/gnus/mm-encode.elc \
-       $(lisp)/gnus/mm-extern.elc \
-       $(lisp)/gnus/mm-partial.elc \
-       $(lisp)/gnus/mm-url.elc \
-       $(lisp)/gnus/mm-util.elc \
-       $(lisp)/gnus/mm-uu.elc \
-       $(lisp)/gnus/mm-view.elc \
-       $(lisp)/gnus/mml-sec.elc \
-       $(lisp)/gnus/mml-smime.elc \
-       $(lisp)/gnus/mml.elc \
-       $(lisp)/gnus/mml1991.elc \
-       $(lisp)/gnus/mml2015.elc \
-       $(lisp)/gnus/nnagent.elc \
-       $(lisp)/gnus/nnbabyl.elc \
-       $(lisp)/gnus/nndb.elc \
-       $(lisp)/gnus/nndiary.elc \
-       $(lisp)/gnus/nndir.elc \
-       $(lisp)/gnus/nndoc.elc \
-       $(lisp)/gnus/nndraft.elc \
-       $(lisp)/gnus/nneething.elc \
-       $(lisp)/gnus/nnfolder.elc \
-       $(lisp)/gnus/nngateway.elc \
-       $(lisp)/gnus/nnheader.elc \
-       $(lisp)/gnus/nnimap.elc \
-       $(lisp)/gnus/nnir.elc \
-       $(lisp)/gnus/nnkiboze.elc \
-       $(lisp)/gnus/nnlistserv.elc \
-       $(lisp)/gnus/nnmail.elc \
-       $(lisp)/gnus/nnmaildir.elc \
-       $(lisp)/gnus/nnmairix.elc \
-       $(lisp)/gnus/nnmbox.elc \
-       $(lisp)/gnus/nnmh.elc \
-       $(lisp)/gnus/nnml.elc \
-       $(lisp)/gnus/nnnil.elc \
-       $(lisp)/gnus/nnoo.elc \
-       $(lisp)/gnus/nnrss.elc \
-       $(lisp)/gnus/nnslashdot.elc \
-       $(lisp)/gnus/nnsoup.elc \
-       $(lisp)/gnus/nnspool.elc \
-       $(lisp)/gnus/nntp.elc \
-       $(lisp)/gnus/nnultimate.elc \
-       $(lisp)/gnus/nnvirtual.elc \
-       $(lisp)/gnus/nnwarchive.elc \
-       $(lisp)/gnus/nnweb.elc \
-       $(lisp)/gnus/nnwfm.elc \
-       $(lisp)/gnus/pop3.elc \
-       $(lisp)/gnus/qp.elc \
-       $(lisp)/gnus/rfc1843.elc \
-       $(lisp)/gnus/rfc2045.elc \
-       $(lisp)/gnus/rfc2047.elc \
-       $(lisp)/gnus/rfc2104.elc \
-       $(lisp)/gnus/rfc2231.elc \
-       $(lisp)/gnus/score-mode.elc \
-       $(lisp)/gnus/sieve-manage.elc \
-       $(lisp)/gnus/sieve-mode.elc \
-       $(lisp)/gnus/sieve.elc \
-       $(lisp)/gnus/smiley.elc \
-       $(lisp)/gnus/smime.elc \
-       $(lisp)/gnus/spam-report.elc \
-       $(lisp)/gnus/spam-stat.elc \
-       $(lisp)/gnus/spam-wash.elc \
-       $(lisp)/gnus/spam.elc \
-       $(lisp)/gnus/starttls.elc \
-       $(lisp)/gnus/utf7.elc \
-       $(lisp)/gnus/webmail.elc \
-       $(lisp)/gnus/yenc.elc \
-       $(lisp)/gs.elc \
-       $(lisp)/help-at-pt.elc \
-       $(lisp)/help-fns.elc \
-       $(lisp)/help-macro.elc \
-       $(lisp)/help-mode.elc \
-       $(lisp)/help.elc \
-       $(lisp)/hex-util.elc \
-       $(lisp)/hexl.elc \
-       $(lisp)/hfy-cmap.elc \
-       $(lisp)/hi-lock.elc \
-       $(lisp)/hilit-chg.elc \
-       $(lisp)/hippie-exp.elc \
-       $(lisp)/hl-line.elc \
-       $(lisp)/htmlfontify.elc \
-       $(lisp)/ibuf-ext.elc \
-       $(lisp)/ibuf-macs.elc \
-       $(lisp)/ibuffer.elc \
-       $(lisp)/icomplete.elc \
-       $(lisp)/ido.elc \
-       $(lisp)/ielm.elc \
-       $(lisp)/iimage.elc \
-       $(lisp)/image-dired.elc \
-       $(lisp)/image-file.elc \
-       $(lisp)/image-mode.elc \
-       $(lisp)/image.elc \
-       $(lisp)/imenu.elc \
-       $(lisp)/indent.elc \
-       $(lisp)/info-look.elc \
-       $(lisp)/info-xref.elc \
-       $(lisp)/info.elc \
-       $(lisp)/informat.elc \
-       $(lisp)/international/ccl.elc \
-       $(lisp)/international/characters.elc \
-       $(lisp)/international/fontset.elc \
-       $(lisp)/international/isearch-x.elc \
-       $(lisp)/international/iso-ascii.elc \
-       $(lisp)/international/iso-cvt.elc \
-       $(lisp)/international/iso-transl.elc \
-       $(lisp)/international/ja-dic-cnv.elc \
-       $(lisp)/international/ja-dic-utl.elc \
-       $(lisp)/international/kinsoku.elc \
-       $(lisp)/international/kkc.elc \
-       $(lisp)/international/latexenc.elc \
-       $(lisp)/international/latin1-disp.elc \
-       $(lisp)/international/mule-cmds.elc \
-       $(lisp)/international/mule-conf.elc \
-       $(lisp)/international/mule-diag.elc \
-       $(lisp)/international/mule-util.elc \
-       $(lisp)/international/mule.elc \
-       $(lisp)/international/ogonek.elc \
-       $(lisp)/international/quail.elc \
-       $(lisp)/international/robin.elc \
-       $(lisp)/international/titdic-cnv.elc \
-       $(lisp)/international/ucs-normalize.elc \
-       $(lisp)/international/utf-7.elc \
-       $(lisp)/isearch.elc \
-       $(lisp)/isearchb.elc \
-       $(lisp)/iswitchb.elc \
-       $(lisp)/jit-lock.elc \
-       $(lisp)/jka-cmpr-hook.elc \
-       $(lisp)/jka-compr.elc \
-       $(lisp)/json.elc \
-       $(lisp)/kermit.elc \
-       $(lisp)/kmacro.elc \
-       $(lisp)/language/china-util.elc \
-       $(lisp)/language/chinese.elc \
-       $(lisp)/language/cyril-util.elc \
-       $(lisp)/language/cyrillic.elc \
-       $(lisp)/language/ethio-util.elc \
-       $(lisp)/language/ethiopic.elc \
-       $(lisp)/language/european.elc \
-       $(lisp)/language/hanja-util.elc \
-       $(lisp)/language/ind-util.elc \
-       $(lisp)/language/indian.elc \
-       $(lisp)/language/japan-util.elc \
-       $(lisp)/language/korea-util.elc \
-       $(lisp)/language/lao-util.elc \
-       $(lisp)/language/thai-util.elc \
-       $(lisp)/language/thai-word.elc \
-       $(lisp)/language/tibet-util.elc \
-       $(lisp)/language/tibetan.elc \
-       $(lisp)/language/tv-util.elc \
-       $(lisp)/language/viet-util.elc \
-       $(lisp)/language/vietnamese.elc \
-       $(lisp)/ledit.elc \
-       $(lisp)/linum.elc \
-       $(lisp)/loadhist.elc \
-       $(lisp)/locate.elc \
-       $(lisp)/log-edit.elc \
-       $(lisp)/log-view.elc \
-       $(lisp)/longlines.elc \
-       $(lisp)/lpr.elc \
-       $(lisp)/ls-lisp.elc \
-       $(lisp)/macros.elc \
-       $(lisp)/mail/binhex.elc \
-       $(lisp)/mail/emacsbug.elc \
-       $(lisp)/mail/feedmail.elc \
-       $(lisp)/mail/footnote.elc \
-       $(lisp)/mail/hashcash.elc \
-       $(lisp)/mail/mail-extr.elc \
-       $(lisp)/mail/mail-hist.elc \
-       $(lisp)/mail/mail-utils.elc \
-       $(lisp)/mail/mailabbrev.elc \
-       $(lisp)/mail/mailalias.elc \
-       $(lisp)/mail/mailclient.elc \
-       $(lisp)/mail/mailheader.elc \
-       $(lisp)/mail/mailpost.elc \
-       $(lisp)/mail/metamail.elc \
-       $(lisp)/mail/mspools.elc \
-       $(lisp)/mail/reporter.elc \
-       $(lisp)/mail/rfc2368.elc \
-       $(lisp)/mail/rfc822.elc \
-       $(lisp)/mail/rmail-spam-filter.elc \
-       $(lisp)/mail/rmail.elc \
-       $(lisp)/mail/rmailedit.elc \
-       $(lisp)/mail/rmailkwd.elc \
-       $(lisp)/mail/rmailmm.elc \
-       $(lisp)/mail/rmailmsc.elc \
-       $(lisp)/mail/rmailout.elc \
-       $(lisp)/mail/rmailsort.elc \
-       $(lisp)/mail/rmailsum.elc \
-       $(lisp)/mail/sendmail.elc \
-       $(lisp)/mail/smtpmail.elc \
-       $(lisp)/mail/supercite.elc \
-       $(lisp)/mail/uce.elc \
-       $(lisp)/mail/undigest.elc \
-       $(lisp)/mail/unrmail.elc \
-       $(lisp)/mail/uudecode.elc \
-       $(lisp)/makesum.elc \
-       $(lisp)/man.elc \
-       $(lisp)/master.elc \
-       $(lisp)/mb-depth.elc \
-       $(lisp)/md4.elc \
-       $(lisp)/menu-bar.elc \
-       $(lisp)/mh-e/mh-alias.elc \
-       $(lisp)/mh-e/mh-buffers.elc \
-       $(lisp)/mh-e/mh-comp.elc \
-       $(lisp)/mh-e/mh-e.elc \
-       $(lisp)/mh-e/mh-folder.elc \
-       $(lisp)/mh-e/mh-funcs.elc \
-       $(lisp)/mh-e/mh-identity.elc \
-       $(lisp)/mh-e/mh-inc.elc \
-       $(lisp)/mh-e/mh-junk.elc \
-       $(lisp)/mh-e/mh-letter.elc \
-       $(lisp)/mh-e/mh-limit.elc \
-       $(lisp)/mh-e/mh-mime.elc \
-       $(lisp)/mh-e/mh-print.elc \
-       $(lisp)/mh-e/mh-scan.elc \
-       $(lisp)/mh-e/mh-search.elc \
-       $(lisp)/mh-e/mh-seq.elc \
-       $(lisp)/mh-e/mh-show.elc \
-       $(lisp)/mh-e/mh-speed.elc \
-       $(lisp)/mh-e/mh-thread.elc \
-       $(lisp)/mh-e/mh-tool-bar.elc \
-       $(lisp)/mh-e/mh-utils.elc \
-       $(lisp)/mh-e/mh-xface.elc \
-       $(lisp)/midnight.elc \
-       $(lisp)/minibuf-eldef.elc \
-       $(lisp)/minibuffer.elc \
-       $(lisp)/misc.elc \
-       $(lisp)/misearch.elc \
-       $(lisp)/mouse-copy.elc \
-       $(lisp)/mouse-drag.elc \
-       $(lisp)/mouse-sel.elc \
-       $(lisp)/mouse.elc \
-       $(lisp)/mpc.elc \
-       $(lisp)/msb.elc \
-       $(lisp)/mwheel.elc \
-       $(lisp)/net/ange-ftp.elc \
-       $(lisp)/net/browse-url.elc \
-       $(lisp)/net/dbus.elc \
-       $(lisp)/net/dig.elc \
-       $(lisp)/net/dns.elc \
-       $(lisp)/net/eudc-bob.elc \
-       $(lisp)/net/eudc-export.elc \
-       $(lisp)/net/eudc-hotlist.elc \
-       $(lisp)/net/eudc-vars.elc \
-       $(lisp)/net/eudc.elc \
-       $(lisp)/net/eudcb-bbdb.elc \
-       $(lisp)/net/eudcb-ldap.elc \
-       $(lisp)/net/eudcb-mab.elc \
-       $(lisp)/net/eudcb-ph.elc \
-       $(lisp)/net/goto-addr.elc \
-       $(lisp)/net/hmac-def.elc \
-       $(lisp)/net/hmac-md5.elc \
-       $(lisp)/net/imap-hash.elc \
-       $(lisp)/net/imap.elc \
-       $(lisp)/net/ldap.elc \
-       $(lisp)/net/mairix.elc \
-       $(lisp)/net/net-utils.elc \
-       $(lisp)/net/netrc.elc \
-       $(lisp)/net/newst-backend.elc \
-       $(lisp)/net/newst-plainview.elc \
-       $(lisp)/net/newst-reader.elc \
-       $(lisp)/net/newst-ticker.elc \
-       $(lisp)/net/newst-treeview.elc \
-       $(lisp)/net/newsticker.elc \
-       $(lisp)/net/ntlm.elc \
-       $(lisp)/net/quickurl.elc \
-       $(lisp)/net/rcirc.elc \
-       $(lisp)/net/rcompile.elc \
-       $(lisp)/net/rlogin.elc \
-       $(lisp)/net/sasl-cram.elc \
-       $(lisp)/net/sasl-digest.elc \
-       $(lisp)/net/sasl-ntlm.elc \
-       $(lisp)/net/sasl.elc \
-       $(lisp)/net/snmp-mode.elc \
-       $(lisp)/net/socks.elc \
-       $(lisp)/net/telnet.elc \
-       $(lisp)/net/tls.elc \
-       $(lisp)/net/tramp-cache.elc \
-       $(lisp)/net/tramp-cmds.elc \
-       $(lisp)/net/tramp-compat.elc \
-       $(lisp)/net/tramp-fish.elc \
-       $(lisp)/net/tramp-ftp.elc \
-       $(lisp)/net/tramp-gvfs.elc \
-       $(lisp)/net/tramp-gw.elc \
-       $(lisp)/net/tramp-imap.elc \
-       $(lisp)/net/tramp-smb.elc \
-       $(lisp)/net/tramp-uu.elc \
-       $(lisp)/net/tramp.elc \
-       $(lisp)/net/trampver.elc \
-       $(lisp)/net/webjump.elc \
-       $(lisp)/net/xesam.elc \
-       $(lisp)/net/zeroconf.elc \
-       $(lisp)/newcomment.elc \
-       $(lisp)/novice.elc \
-       $(lisp)/nxml/nxml-enc.elc \
-       $(lisp)/nxml/nxml-glyph.elc \
-       $(lisp)/nxml/nxml-maint.elc \
-       $(lisp)/nxml/nxml-mode.elc \
-       $(lisp)/nxml/nxml-ns.elc \
-       $(lisp)/nxml/nxml-outln.elc \
-       $(lisp)/nxml/nxml-parse.elc \
-       $(lisp)/nxml/nxml-rap.elc \
-       $(lisp)/nxml/nxml-uchnm.elc \
-       $(lisp)/nxml/nxml-util.elc \
-       $(lisp)/nxml/rng-cmpct.elc \
-       $(lisp)/nxml/rng-dt.elc \
-       $(lisp)/nxml/rng-loc.elc \
-       $(lisp)/nxml/rng-maint.elc \
-       $(lisp)/nxml/rng-match.elc \
-       $(lisp)/nxml/rng-nxml.elc \
-       $(lisp)/nxml/rng-parse.elc \
-       $(lisp)/nxml/rng-pttrn.elc \
-       $(lisp)/nxml/rng-uri.elc \
-       $(lisp)/nxml/rng-util.elc \
-       $(lisp)/nxml/rng-valid.elc \
-       $(lisp)/nxml/rng-xsd.elc \
-       $(lisp)/nxml/xmltok.elc \
-       $(lisp)/nxml/xsd-regexp.elc \
-       $(lisp)/obsolete/awk-mode.elc \
-       $(lisp)/obsolete/fast-lock.elc \
-       $(lisp)/obsolete/iso-acc.elc \
-       $(lisp)/obsolete/iso-insert.elc \
-       $(lisp)/obsolete/iso-swed.elc \
-       $(lisp)/obsolete/lazy-lock.elc \
-       $(lisp)/obsolete/levents.elc \
-       $(lisp)/obsolete/lucid.elc \
-       $(lisp)/obsolete/old-whitespace.elc \
-       $(lisp)/obsolete/options.elc \
-       $(lisp)/obsolete/resume.elc \
-       $(lisp)/obsolete/rnews.elc \
-       $(lisp)/obsolete/rnewspost.elc \
-       $(lisp)/obsolete/sc.elc \
-       $(lisp)/obsolete/scribe.elc \
-       $(lisp)/obsolete/swedish.elc \
-       $(lisp)/obsolete/sym-comp.elc \
-       $(lisp)/obsolete/vc-mcvs.elc \
-       $(lisp)/obsolete/x-menu.elc \
-       $(lisp)/org/org-agenda.elc \
-       $(lisp)/org/org-archive.elc \
-       $(lisp)/org/org-ascii.elc \
-       $(lisp)/org/org-attach.elc \
-       $(lisp)/org/org-bbdb.elc \
-       $(lisp)/org/org-bibtex.elc \
-       $(lisp)/org/org-clock.elc \
-       $(lisp)/org/org-colview.elc \
-       $(lisp)/org/org-compat.elc \
-       $(lisp)/org/org-crypt.elc \
-       $(lisp)/org/org-datetree.elc \
-       $(lisp)/org/org-docbook.elc \
-       $(lisp)/org/org-exp-blocks.elc \
-       $(lisp)/org/org-exp.elc \
-       $(lisp)/org/org-faces.elc \
-       $(lisp)/org/org-feed.elc \
-       $(lisp)/org/org-footnote.elc \
-       $(lisp)/org/org-freemind.elc \
-       $(lisp)/org/org-gnus.elc \
-       $(lisp)/org/org-habit.elc \
-       $(lisp)/org/org-html.elc \
-       $(lisp)/org/org-icalendar.elc \
-       $(lisp)/org/org-id.elc \
-       $(lisp)/org/org-indent.elc \
-       $(lisp)/org/org-info.elc \
-       $(lisp)/org/org-inlinetask.elc \
-       $(lisp)/org/org-install.elc \
-       $(lisp)/org/org-irc.elc \
-       $(lisp)/org/org-jsinfo.elc \
-       $(lisp)/org/org-latex.elc \
-       $(lisp)/org/org-list.elc \
-       $(lisp)/org/org-mac-message.elc \
-       $(lisp)/org/org-macs.elc \
-       $(lisp)/org/org-mew.elc \
-       $(lisp)/org/org-mhe.elc \
-       $(lisp)/org/org-mobile.elc \
-       $(lisp)/org/org-mouse.elc \
-       $(lisp)/org/org-plot.elc \
-       $(lisp)/org/org-protocol.elc \
-       $(lisp)/org/org-publish.elc \
-       $(lisp)/org/org-remember.elc \
-       $(lisp)/org/org-rmail.elc \
-       $(lisp)/org/org-src.elc \
-       $(lisp)/org/org-table.elc \
-       $(lisp)/org/org-timer.elc \
-       $(lisp)/org/org-vm.elc \
-       $(lisp)/org/org-w3m.elc \
-       $(lisp)/org/org-wl.elc \
-       $(lisp)/org/org-xoxo.elc \
-       $(lisp)/org/org.elc \
-       $(lisp)/outline.elc \
-       $(lisp)/paren.elc \
-       $(lisp)/password-cache.elc \
-       $(lisp)/pcmpl-cvs.elc \
-       $(lisp)/pcmpl-gnu.elc \
-       $(lisp)/pcmpl-linux.elc \
-       $(lisp)/pcmpl-rpm.elc \
-       $(lisp)/pcmpl-unix.elc \
-       $(lisp)/pcomplete.elc \
-       $(lisp)/pcvs-defs.elc \
-       $(lisp)/pcvs-info.elc \
-       $(lisp)/pcvs-parse.elc \
-       $(lisp)/pcvs-util.elc \
-       $(lisp)/pcvs.elc \
-       $(lisp)/pgg-def.elc \
-       $(lisp)/pgg-gpg.elc \
-       $(lisp)/pgg-parse.elc \
-       $(lisp)/pgg-pgp.elc \
-       $(lisp)/pgg-pgp5.elc \
-       $(lisp)/pgg.elc \
-       $(lisp)/play/5x5.elc \
-       $(lisp)/play/animate.elc \
-       $(lisp)/play/blackbox.elc \
-       $(lisp)/play/bubbles.elc \
-       $(lisp)/play/cookie1.elc \
-       $(lisp)/play/decipher.elc \
-       $(lisp)/play/dissociate.elc \
-       $(lisp)/play/doctor.elc \
-       $(lisp)/play/dunnet.elc \
-       $(lisp)/play/fortune.elc \
-       $(lisp)/play/gamegrid.elc \
-       $(lisp)/play/gametree.elc \
-       $(lisp)/play/gomoku.elc \
-       $(lisp)/play/handwrite.elc \
-       $(lisp)/play/hanoi.elc \
-       $(lisp)/play/landmark.elc \
-       $(lisp)/play/life.elc \
-       $(lisp)/play/meese.elc \
-       $(lisp)/play/morse.elc \
-       $(lisp)/play/mpuz.elc \
-       $(lisp)/play/pong.elc \
-       $(lisp)/play/snake.elc \
-       $(lisp)/play/solitaire.elc \
-       $(lisp)/play/spook.elc \
-       $(lisp)/play/studly.elc \
-       $(lisp)/play/tetris.elc \
-       $(lisp)/play/yow.elc \
-       $(lisp)/play/zone.elc \
-       $(lisp)/printing.elc \
-       $(lisp)/proced.elc \
-       $(lisp)/progmodes/ada-mode.elc \
-       $(lisp)/progmodes/ada-prj.elc \
-       $(lisp)/progmodes/ada-stmt.elc \
-       $(lisp)/progmodes/ada-xref.elc \
-       $(lisp)/progmodes/antlr-mode.elc \
-       $(lisp)/progmodes/asm-mode.elc \
-       $(lisp)/progmodes/autoconf.elc \
-       $(lisp)/progmodes/bug-reference.elc \
-       $(lisp)/progmodes/cap-words.elc \
-       $(lisp)/progmodes/cc-align.elc \
-       $(lisp)/progmodes/cc-awk.elc \
-       $(lisp)/progmodes/cc-bytecomp.elc \
-       $(lisp)/progmodes/cc-cmds.elc \
-       $(lisp)/progmodes/cc-compat.elc \
-       $(lisp)/progmodes/cc-defs.elc \
-       $(lisp)/progmodes/cc-engine.elc \
-       $(lisp)/progmodes/cc-fonts.elc \
-       $(lisp)/progmodes/cc-langs.elc \
-       $(lisp)/progmodes/cc-menus.elc \
-       $(lisp)/progmodes/cc-mode.elc \
-       $(lisp)/progmodes/cc-styles.elc \
-       $(lisp)/progmodes/cc-vars.elc \
-       $(lisp)/progmodes/cfengine.elc \
-       $(lisp)/progmodes/cmacexp.elc \
-       $(lisp)/progmodes/compile.elc \
-       $(lisp)/progmodes/cperl-mode.elc \
-       $(lisp)/progmodes/cpp.elc \
-       $(lisp)/progmodes/cwarn.elc \
-       $(lisp)/progmodes/dcl-mode.elc \
-       $(lisp)/progmodes/delphi.elc \
-       $(lisp)/progmodes/ebnf-abn.elc \
-       $(lisp)/progmodes/ebnf-bnf.elc \
-       $(lisp)/progmodes/ebnf-dtd.elc \
-       $(lisp)/progmodes/ebnf-ebx.elc \
-       $(lisp)/progmodes/ebnf-iso.elc \
-       $(lisp)/progmodes/ebnf-otz.elc \
-       $(lisp)/progmodes/ebnf-yac.elc \
-       $(lisp)/progmodes/ebnf2ps.elc \
-       $(lisp)/progmodes/ebrowse.elc \
-       $(lisp)/progmodes/etags.elc \
-       $(lisp)/progmodes/executable.elc \
-       $(lisp)/progmodes/f90.elc \
-       $(lisp)/progmodes/flymake.elc \
-       $(lisp)/progmodes/fortran.elc \
-       $(lisp)/progmodes/gdb-ui.elc \
-       $(lisp)/progmodes/glasses.elc \
-       $(lisp)/progmodes/grep.elc \
-       $(lisp)/progmodes/gud.elc \
-       $(lisp)/progmodes/hideif.elc \
-       $(lisp)/progmodes/hideshow.elc \
-       $(lisp)/progmodes/icon.elc \
-       $(lisp)/progmodes/idlw-complete-structtag.elc \
-       $(lisp)/progmodes/idlw-help.elc \
-       $(lisp)/progmodes/idlw-shell.elc \
-       $(lisp)/progmodes/idlw-toolbar.elc \
-       $(lisp)/progmodes/idlwave.elc \
-       $(lisp)/progmodes/inf-lisp.elc \
-       $(lisp)/progmodes/js.elc \
-       $(lisp)/progmodes/ld-script.elc \
-       $(lisp)/progmodes/m4-mode.elc \
-       $(lisp)/progmodes/make-mode.elc \
-       $(lisp)/progmodes/mantemp.elc \
-       $(lisp)/progmodes/meta-mode.elc \
-       $(lisp)/progmodes/mixal-mode.elc \
-       $(lisp)/progmodes/modula2.elc \
-       $(lisp)/progmodes/octave-inf.elc \
-       $(lisp)/progmodes/octave-mod.elc \
-       $(lisp)/progmodes/pascal.elc \
-       $(lisp)/progmodes/perl-mode.elc \
-       $(lisp)/progmodes/prolog.elc \
-       $(lisp)/progmodes/ps-mode.elc \
-       $(lisp)/progmodes/python.elc \
-       $(lisp)/progmodes/ruby-mode.elc \
-       $(lisp)/progmodes/scheme.elc \
-       $(lisp)/progmodes/sh-script.elc \
-       $(lisp)/progmodes/simula.elc \
-       $(lisp)/progmodes/sql.elc \
-       $(lisp)/progmodes/subword.elc \
-       $(lisp)/progmodes/tcl.elc \
-       $(lisp)/progmodes/vera-mode.elc \
-       $(lisp)/progmodes/verilog-mode.elc \
-       $(lisp)/progmodes/vhdl-mode.elc \
-       $(lisp)/progmodes/which-func.elc \
-       $(lisp)/progmodes/xscheme.elc \
-       $(lisp)/ps-bdf.elc \
-       $(lisp)/ps-def.elc \
-       $(lisp)/ps-mule.elc \
-       $(lisp)/ps-print.elc \
-       $(lisp)/ps-samp.elc \
-       $(lisp)/recentf.elc \
-       $(lisp)/rect.elc \
-       $(lisp)/register.elc \
-       $(lisp)/repeat.elc \
-       $(lisp)/replace.elc \
-       $(lisp)/reposition.elc \
-       $(lisp)/reveal.elc \
-       $(lisp)/rfn-eshadow.elc \
-       $(lisp)/rot13.elc \
-       $(lisp)/ruler-mode.elc \
-       $(lisp)/s-region.elc \
-       $(lisp)/savehist.elc \
-       $(lisp)/saveplace.elc \
-       $(lisp)/sb-image.elc \
-       $(lisp)/scroll-all.elc \
-       $(lisp)/scroll-bar.elc \
-       $(lisp)/scroll-lock.elc \
-       $(lisp)/select.elc \
-       $(lisp)/server.elc \
-       $(lisp)/ses.elc \
-       $(lisp)/sha1.elc \
-       $(lisp)/shadowfile.elc \
-       $(lisp)/shell.elc \
-       $(lisp)/simple.elc \
-       $(lisp)/skeleton.elc \
-       $(lisp)/smerge-mode.elc \
-       $(lisp)/sort.elc \
-       $(lisp)/soundex.elc \
-       $(lisp)/speedbar.elc \
-       $(lisp)/startup.elc \
-       $(lisp)/strokes.elc \
-       $(lisp)/subr.elc \
-       $(lisp)/t-mouse.elc \
-       $(lisp)/tabify.elc \
-       $(lisp)/talk.elc \
-       $(lisp)/tar-mode.elc \
-       $(lisp)/tempo.elc \
-       $(lisp)/term.elc \
-       $(lisp)/term/common-win.elc \
-       $(lisp)/term/internal.elc \
-       $(lisp)/term/ns-win.elc \
-       $(lisp)/term/pc-win.elc \
-       $(lisp)/term/rxvt.elc \
-       $(lisp)/term/sun.elc \
-       $(lisp)/term/sup-mouse.elc \
-       $(lisp)/term/tty-colors.elc \
-       $(lisp)/term/tvi970.elc \
-       $(lisp)/term/vt100.elc \
-       $(lisp)/term/w32-win.elc \
-       $(lisp)/term/w32console.elc \
-       $(lisp)/term/x-win.elc \
-       $(lisp)/term/xterm.elc \
-       $(lisp)/terminal.elc \
-       $(lisp)/textmodes/artist.elc \
-       $(lisp)/textmodes/bib-mode.elc \
-       $(lisp)/textmodes/bibtex-style.elc \
-       $(lisp)/textmodes/bibtex.elc \
-       $(lisp)/textmodes/conf-mode.elc \
-       $(lisp)/textmodes/css-mode.elc \
-       $(lisp)/textmodes/dns-mode.elc \
-       $(lisp)/textmodes/enriched.elc \
-       $(lisp)/textmodes/fill.elc \
-       $(lisp)/textmodes/flyspell.elc \
-       $(lisp)/textmodes/ispell.elc \
-       $(lisp)/textmodes/makeinfo.elc \
-       $(lisp)/textmodes/nroff-mode.elc \
-       $(lisp)/textmodes/page-ext.elc \
-       $(lisp)/textmodes/page.elc \
-       $(lisp)/textmodes/paragraphs.elc \
-       $(lisp)/textmodes/picture.elc \
-       $(lisp)/textmodes/po.elc \
-       $(lisp)/textmodes/refbib.elc \
-       $(lisp)/textmodes/refer.elc \
-       $(lisp)/textmodes/refill.elc \
-       $(lisp)/textmodes/reftex-auc.elc \
-       $(lisp)/textmodes/reftex-cite.elc \
-       $(lisp)/textmodes/reftex-dcr.elc \
-       $(lisp)/textmodes/reftex-global.elc \
-       $(lisp)/textmodes/reftex-index.elc \
-       $(lisp)/textmodes/reftex-parse.elc \
-       $(lisp)/textmodes/reftex-ref.elc \
-       $(lisp)/textmodes/reftex-sel.elc \
-       $(lisp)/textmodes/reftex-toc.elc \
-       $(lisp)/textmodes/reftex-vars.elc \
-       $(lisp)/textmodes/reftex.elc \
-       $(lisp)/textmodes/remember.elc \
-       $(lisp)/textmodes/rst.elc \
-       $(lisp)/textmodes/sgml-mode.elc \
-       $(lisp)/textmodes/spell.elc \
-       $(lisp)/textmodes/table.elc \
-       $(lisp)/textmodes/tex-mode.elc \
-       $(lisp)/textmodes/texinfmt.elc \
-       $(lisp)/textmodes/texinfo.elc \
-       $(lisp)/textmodes/texnfo-upd.elc \
-       $(lisp)/textmodes/text-mode.elc \
-       $(lisp)/textmodes/tildify.elc \
-       $(lisp)/textmodes/two-column.elc \
-       $(lisp)/textmodes/underline.elc \
-       $(lisp)/thingatpt.elc \
-       $(lisp)/thumbs.elc \
-       $(lisp)/time-stamp.elc \
-       $(lisp)/time.elc \
-       $(lisp)/timezone.elc \
-       $(lisp)/tmm.elc \
-       $(lisp)/tool-bar.elc \
-       $(lisp)/tooltip.elc \
-       $(lisp)/tree-widget.elc \
-       $(lisp)/tutorial.elc \
-       $(lisp)/type-break.elc \
-       $(lisp)/uniquify.elc \
-       $(lisp)/url/url-about.elc \
-       $(lisp)/url/url-auth.elc \
-       $(lisp)/url/url-cache.elc \
-       $(lisp)/url/url-cid.elc \
-       $(lisp)/url/url-cookie.elc \
-       $(lisp)/url/url-dav.elc \
-       $(lisp)/url/url-dired.elc \
-       $(lisp)/url/url-expand.elc \
-       $(lisp)/url/url-file.elc \
-       $(lisp)/url/url-ftp.elc \
-       $(lisp)/url/url-gw.elc \
-       $(lisp)/url/url-handlers.elc \
-       $(lisp)/url/url-history.elc \
-       $(lisp)/url/url-http.elc \
-       $(lisp)/url/url-imap.elc \
-       $(lisp)/url/url-irc.elc \
-       $(lisp)/url/url-ldap.elc \
-       $(lisp)/url/url-mailto.elc \
-       $(lisp)/url/url-methods.elc \
-       $(lisp)/url/url-misc.elc \
-       $(lisp)/url/url-news.elc \
-       $(lisp)/url/url-nfs.elc \
-       $(lisp)/url/url-ns.elc \
-       $(lisp)/url/url-parse.elc \
-       $(lisp)/url/url-privacy.elc \
-       $(lisp)/url/url-proxy.elc \
-       $(lisp)/url/url-util.elc \
-       $(lisp)/url/url-vars.elc \
-       $(lisp)/url/url.elc \
-       $(lisp)/userlock.elc \
-       $(lisp)/vc-annotate.elc \
-       $(lisp)/vc-arch.elc \
-       $(lisp)/vc-bzr.elc \
-       $(lisp)/vc-cvs.elc \
-       $(lisp)/vc-dav.elc \
-       $(lisp)/vc-dir.elc \
-       $(lisp)/vc-dispatcher.elc \
-       $(lisp)/vc-git.elc \
-       $(lisp)/vc-hg.elc \
-       $(lisp)/vc-hooks.elc \
-       $(lisp)/vc-mtn.elc \
-       $(lisp)/vc-rcs.elc \
-       $(lisp)/vc-sccs.elc \
-       $(lisp)/vc-svn.elc \
-       $(lisp)/vc.elc \
-       $(lisp)/vcursor.elc \
-       $(lisp)/view.elc \
-       $(lisp)/vt-control.elc \
-       $(lisp)/vt100-led.elc \
-       $(lisp)/w32-fns.elc \
-       $(lisp)/w32-vars.elc \
-       $(lisp)/wdired.elc \
-       $(lisp)/whitespace.elc \
-       $(lisp)/wid-browse.elc \
-       $(lisp)/wid-edit.elc \
-       $(lisp)/widget.elc \
-       $(lisp)/windmove.elc \
-       $(lisp)/window.elc \
-       $(lisp)/winner.elc \
-       $(lisp)/woman.elc \
-       $(lisp)/x-dnd.elc \
-       $(lisp)/xml.elc \
-       $(lisp)/xt-mouse.elc
-
 # The src/Makefile.in has its own set of dependencies and when they decide
 # that one Lisp file needs to be re-compiled, we had better recompile it as
 # well, otherwise every subsequent make will again call us, until we finally
@@ -1486,17 +211,53 @@ compile-onefile:
 
 # An old-fashioned suffix rule, which, according to the GNU Make manual,
 # cannot have prerequisites.
-# Note that if a .el file is removed from the repository without
-# updating ELCFILES, make will abort.
 .el.elc:
        @echo Compiling $<
        @$(emacs) $(BYTE_COMPILE_EXTRA_FLAGS) -f batch-byte-compile $<
 
-.PHONY: compile-first compile-main compile-last compile compile-always
+.PHONY: compile-first compile-main compile compile-always
 
 compile-first: $(COMPILE_FIRST)
 
-compile-main: $(ELCFILES)
+# In `compile-main' we could directly do
+#    ... | xargs $(MAKE) $(MFLAGS) EMACS="$(EMACS)"
+# and it works, but it generates a lot of messages like
+#    make[2]: Â« gnus/gnus-mlspl.elc Â» is up to date.
+# so instead, we use "xargs echo" to split the list of file into manageable
+# chunks and then use an intermediate `compile-targets' target so the
+# actual targets (the .elc files) are not mentioned as targets on the
+# make command line.
+
+
+.PHONY: compile-targets
+# TARGETS is set dynamically in the recursive call from `compile-main'.
+compile-targets: $(TARGETS)
+
+# Compile all the Elisp files that need it.  Beware: it approximates
+# `no-byte-compile', so watch out for false-positives!
+compile-main: compile-clean
+       @(cd $(lisp); $(setwins); \
+       els=`echo "$$wins " | sed -e 's|/\./|/|g' -e 's|/\. | |g' -e 's| |/*.el |g'`; \
+       for el in $$els; do \
+         test -f $$el || continue; \
+         test ! -f $${el}c && GREP_OPTIONS= grep '^;.*no-byte-compile: t' $$el > /dev/null && continue; \
+         echo "$${el}c"; \
+       done | xargs echo) | \
+       while read chunk; do \
+         $(MAKE) $(MFLAGS) compile-targets EMACS="$(EMACS)" TARGETS="$$chunk"; \
+       done
+
+.PHONY: compile-clean
+# Erase left-over .elc files that do not have a corresponding .el file.
+compile-clean:
+       @cd $(lisp); $(setwins); \
+       elcs=`echo "$$wins " | sed -e 's|/\./|/|g' -e 's|/\. | |g' -e 's| |/*.elc |g'`; \
+       for el in $$(echo $$elcs | sed -e 's/\.elc/\.el/g'); do \
+         if test -f "$$el" -o \! -f "$${el}c"; then :; else \
+           echo rm "$${el}c"; \
+           rm "$${el}c"; \
+         fi \
+       done
 
 # Compile all Lisp files, but don't recompile those that are up to
 # date.  Some .el files don't get compiled because they set the
@@ -1506,10 +267,6 @@ compile-main: $(ELCFILES)
 # sub-makes that run rules that use it, for the sake of some non-GNU makes.
 compile: $(LOADDEFS) autoloads compile-first
        $(MAKE) $(MFLAGS) compile-main EMACS=$(EMACS)
-       $(MAKE) $(MFLAGS) compile-last EMACS=$(EMACS)
-
-## Doing this causes make install to dump another emacs.
-#      $(MAKE) $(MFLAGS) update-elclist
 
 # Compile all Lisp files.  This is like `compile' but compiles files
 # unconditionally.  Some files don't actually get compiled because they
@@ -1518,20 +275,6 @@ compile-always: doit
        cd $(lisp); rm -f *.elc */*.elc */*/*.elc */*/*/*.elc
        $(MAKE) $(MFLAGS) compile EMACS=$(EMACS)
 
-## In case any files are missing from ELCFILES.
-compile-last:
-       @wd=$(lisp); $(setwins); \
-       els=`echo "$$wins " | sed -e 's|/\./|/|g' -e 's|/\. | |g' -e 's| |/*.el |g'`; \
-       for el in $$els; do \
-         test -f $$el || continue; \
-         test -f $${el}c && continue; \
-         GREP_OPTIONS= grep 'no-byte-compile: t' $$el > /dev/null && continue; \
-         sel=`echo $$el | sed "s|^$(lisp)|\\$$(lisp)|"`; \
-         echo "Maintainer warning: $$sel missing from \$$ELCFILES?"; \
-         echo "Compiling $$el"; \
-         $(emacs) $(BYTE_COMPILE_EXTRA_FLAGS) -f batch-byte-compile $$el || exit 1; \
-       done
-
 compile-calc:
        for el in $(lisp)/calc/*.el; do \
          echo Compiling $$el; \
@@ -1551,8 +294,7 @@ compile-after-backup: backup-compiled-files compile-always
 
 # Recompile all Lisp files which are newer than their .elc files and compile
 # new ones.
-# This has the same effect as compile-main (followed up with compile-last,
-# if ELCFILES is out of date).  recompile has some advantages:
+# This has the same effect as compile-main.  recompile has some advantages:
 # i) It is faster (on a single processor), since it only has to start
 # Emacs once.  It was 33% faster on a test with a random 10% of the .el
 # files needing recompilation.
index d1b9b517e5fe38765b5c01bd2eea49d27ea6d9df..a20efdbc12264d3b71f234870d60afde373933d9 100644 (file)
@@ -54,7 +54,7 @@
   :prefix "calculator"
   :version "21.1"
   :group 'tools
-  :group 'convenience)
+  :group 'applications)
 
 (defcustom calculator-electric-mode nil
   "Run `calculator' electrically, in the echo area.
index 1ee290f5aa95c1636a1d765382332a3d53f8149b..9b252eb3dc4d97d4d6d4ccf860a35488226cfa02 100644 (file)
@@ -1,7 +1,8 @@
 ;;; cal-french.el --- calendar functions for the French Revolutionary calendar
 
 ;; Copyright (C) 1988, 1989, 1992, 1994, 1995, 1997, 2001, 2002, 2003,
-;;   2004, 2005, 2006, 2007, 2008, 2009, 2010  Free Software Foundation, Inc.
+;;   2004, 2005, 2006, 2007, 2008, 2009, 2010
+;;   Free Software Foundation, Inc.
 
 ;; Author: Edward M. Reingold <reingold@cs.uiuc.edu>
 ;; Maintainer: Glenn Morris <rgm@gnu.org>
@@ -40,8 +41,8 @@
   "Array of month names in the French calendar.")
 
 (defconst calendar-french-multibyte-month-name-array
-  ["Vendémiaire" "Brumaire" "Frimaire" "Nivôse" "Pluviôse" "Ventôse"
-   "Germinal" "Floréal" "Prairial" "Messidor" "Thermidor" "Fructidor"]
+  ["Vendémiaire" "Brumaire" "Frimaire" "Nivôse" "Pluviôse" "Ventôse"
+   "Germinal" "Floréal" "Prairial" "Messidor" "Thermidor" "Fructidor"]
   "Array of multibyte month names in the French calendar.")
 
 (defconst calendar-french-day-name-array
@@ -55,8 +56,8 @@
   "Array of special day names in the French calendar.")
 
 (defconst calendar-french-multibyte-special-days-array
-  ["de la Vertu" "du Génie" "du Travail" "de la Raison" "des Récompenses"
-   "de la Révolution"]
+  ["de la Vertu" "du Génie" "du Travail" "de la Raison" "des Récompenses"
+   "de la Révolution"]
   "Array of multibyte special day names in the French calendar.")
 
 (defun calendar-french-accents-p ()
@@ -174,13 +175,13 @@ Defaults to today's date if DATE is not given."
     (cond
      ((< y 1) "")
      ((= m 13) (format (if (calendar-french-accents-p)
-                           "Jour %s de l'Année %d de la Révolution"
+                           "Jour %s de l'Année %d de la Révolution"
                          "Jour %s de l'Anne'e %d de la Re'volution")
                        (aref (calendar-french-special-days-array) (1- d))
                        y))
      (t (format
          (if (calendar-french-accents-p)
-             "%d %s an %d de la Révolution"
+             "%d %s an %d de la Révolution"
            "%d %s an %d de la Re'volution")
          d
          (aref (calendar-french-month-name-array) (1- m))
@@ -208,7 +209,7 @@ Echo French Revolutionary date unless NOECHO is non-nil."
           (year (progn
                   (calendar-read
                    (if (calendar-french-accents-p)
-                       "Année de la Révolution (>0): "
+                       "Année de la Révolution (>0): "
                      "Anne'e de la Re'volution (>0): ")
                    (lambda (x) (> x 0))
                    (number-to-string
@@ -264,5 +265,9 @@ Echo French Revolutionary date unless NOECHO is non-nil."
 
 (provide 'cal-french)
 
+;; Local Variables:
+;; coding: utf-8
+;; End:
+
 ;; arch-tag: 7e8045a3-8609-46b5-9cde-cf40ce541cf9
 ;;; cal-french.el ends here
index e126e4c0175f7247f1706680574d78821cdcd9f9..3eb1f9c21839e976a8cd475cacc6d4c8d492b126 100644 (file)
@@ -402,6 +402,8 @@ Argument COMMAND is the command to use for compiling the target."
          (funcall project-am-debug-target-function cmd))
       (kill-buffer tb))))
 
+(declare-function ede-shell-run-something "ede/shell")
+
 (defmethod project-run-target ((obj project-am-objectcode))
   "Run the current project target in comint buffer."
   (let ((tb (get-buffer-create " *padt*"))
index 1f8b96afe0d514ed691ae5e69121e0906fb9f628..aab87f7eb250a10c3bdc3de7c4245720e01a22aa 100644 (file)
@@ -1761,8 +1761,9 @@ DO NOT return the list of tags encompassing point."
 
       (when (arrayp semantic-lex-spp-project-macro-symbol-obarray)
        (princ "\n  Project symbol map:\n")
-       (princ "      Your project symbol map is derived from the EDE object:\n      ")
-       (princ (object-print ede-object))
+       (when (and (boundp 'ede-object) ede-object)
+         (princ "      Your project symbol map is derived from the EDE object:\n      ")
+         (princ (object-print ede-object)))
        (princ "\n\n")
        (let ((macros nil))
          (mapatoms
index ba78820a49ffa7c014382eddbdec4f56a8ee5e71..38315245f1475930d2f8dc7d584cabaf8691e46d 100644 (file)
@@ -5,6 +5,7 @@
 
 ;; Author: Dave Gillespie <daveg@synaptics.com>
 ;; Keywords: abbrev convenience
+;;
 ;; Special thanks to Hallvard Furuseth for his many ideas and contributions.
 
 ;; This file is part of GNU Emacs.
index b815e31f31cb37a0b3ecaf4364b020b6b8c75bf8..399a6992f41644a3f452ba47a9f8eab4ed53c1e8 100644 (file)
   "Basic text editing facilities."
   :group 'emacs)
 
+(defgroup convenience nil
+  "Convenience features for faster editing."
+  :group 'emacs)
+
+(defgroup files nil
+  "Support for editing files."
+  :group 'emacs)
+
+(defgroup wp nil
+  "Support for editing text files."
+  :tag "Text"
+  :group 'emacs)
+
+(defgroup data nil
+  "Support for editing binary data files."
+  :group 'emacs)
+
 (defgroup abbrev nil
   "Abbreviation handling, typing shortcuts, macros."
   :tag "Abbreviations"
-  :group 'editing)
+  :group 'convenience)
 
 (defgroup matching nil
   "Various sorts of searching and matching."
 
 (defgroup outlines nil
   "Support for hierarchical outlining."
-  :group 'editing)
+  :group 'wp)
 
 (defgroup external nil
   "Interfacing to external utilities."
   :group 'emacs)
 
+(defgroup comm nil
+  "Communications, networking, and remote access to files."
+  :tag "Communication"
+  :group 'emacs)
+
 (defgroup processes nil
   "Process, subshell, compilation, and job control support."
-  :group 'external
-  :group 'development)
-
-(defgroup convenience nil
-  "Convenience features for faster editing."
-  :group 'emacs)
+  :group 'external)
 
 (defgroup programming nil
   "Support for programming in other languages."
   "Programming tools."
   :group 'programming)
 
-(defgroup oop nil
-  "Support for object-oriented programming."
-  :group 'programming)
-
 (defgroup applications nil
   "Applications written in Emacs."
   :group 'emacs)
   "Fitting Emacs with its environment."
   :group 'emacs)
 
-(defgroup comm nil
-  "Communications, networking, remote access to files."
-  :tag "Communication"
-  :group 'environment)
-
 (defgroup hardware nil
   "Support for interfacing with miscellaneous hardware."
   :group 'environment)
   "Support for Emacs frames and window systems."
   :group 'environment)
 
-(defgroup data nil
-  "Support for editing files of data."
-  :group 'emacs)
-
-(defgroup files nil
-  "Support for editing files."
-  :group 'emacs)
-
-(defgroup wp nil
-  "Word processing."
-  :group 'emacs)
-
 (defgroup tex nil
   "Code related to the TeX formatter."
   :link '(custom-group-link :tag "Font Lock Faces group" font-lock-faces)
   "Support for multiple fonts."
   :group 'emacs)
 
-(defgroup hypermedia nil
-  "Support for links between text or other media types."
-  :group 'emacs)
-
 (defgroup help nil
   "Support for on-line help systems."
   :group 'emacs)
@@ -680,8 +672,8 @@ If `last', order groups after non-groups."
   :group 'custom-browse)
 
 ;;;###autoload
-(defcustom custom-buffer-sort-alphabetically nil
-  "If non-nil, sort each customization group alphabetically in Custom buffer."
+(defcustom custom-buffer-sort-alphabetically t
+  "Whether to sort customization groups alphabetically in Custom buffer."
   :type 'boolean
   :group 'custom-buffer)
 
@@ -1136,7 +1128,7 @@ Show the buffer in another window, but don't select it."
     (unless (eq symbol basevar)
       (message "`%s' is an alias for `%s'" symbol basevar))))
 
-(defvar customize-changed-options-previous-release "22.1"
+(defvar customize-changed-options-previous-release "23.1"
   "Version for `customize-changed-options' to refer back to by default.")
 
 ;; Packages will update this variable, so make it available.
@@ -1382,42 +1374,52 @@ suggest to customize that face, if it's customizable."
       (custom-buffer-create (custom-sort-items found t nil)
                            "*Customize Saved*"))))
 
+(declare-function apropos-parse-pattern "apropos" (pattern))
+
 ;;;###autoload
-(defun customize-apropos (regexp &optional all)
-  "Customize all loaded options, faces and groups matching REGEXP.
-If ALL is `options', include only options.
-If ALL is `faces', include only faces.
-If ALL is `groups', include only groups.
-If ALL is t (interactively, with prefix arg), include variables
+(defun customize-apropos (pattern &optional type)
+  "Customize all loaded options, faces and groups matching PATTERN.
+PATTERN can be a word, a list of words (separated by spaces),
+or a regexp (using some regexp special characters).  If it is a word,
+search for matches for that word as a substring.  If it is a list of words,
+search for matches for any two (or more) of those words.
+
+If TYPE is `options', include only options.
+If TYPE is `faces', include only faces.
+If TYPE is `groups', include only groups.
+If TYPE is t (interactively, with prefix arg), include variables
 that are not customizable options, as well as faces and groups
 \(but we recommend using `apropos-variable' instead)."
-  (interactive "sCustomize (regexp): \nP")
-  (let ((found nil))
-    (mapatoms (lambda (symbol)
-               (when (string-match regexp (symbol-name symbol))
-                 (when (and (not (memq all '(faces options)))
-                            (get symbol 'custom-group))
-                   (push (list symbol 'custom-group) found))
-                 (when (and (not (memq all '(options groups)))
-                            (custom-facep symbol))
-                   (push (list symbol 'custom-face) found))
-                 (when (and (not (memq all '(groups faces)))
-                            (boundp symbol)
-                            (eq (indirect-variable symbol) symbol)
-                            (or (get symbol 'saved-value)
-                                (custom-variable-p symbol)
-                                (and (not (memq all '(nil options)))
-                                     (get symbol 'variable-documentation))))
-                   (push (list symbol 'custom-variable) found)))))
+  (interactive (list (apropos-read-pattern "symbol") current-prefix-arg))
+  (require 'apropos)
+  (apropos-parse-pattern pattern)
+  (let (found tests)
+    (mapatoms
+     `(lambda (symbol)
+       (when (string-match apropos-regexp (symbol-name symbol))
+         ,(if (not (memq type '(faces options)))
+              '(if (get symbol 'custom-group)
+                   (push (list symbol 'custom-group) found)))
+         ,(if (not (memq type '(options groups)))
+              '(if (custom-facep symbol)
+                   (push (list symbol 'custom-face) found)))
+         ,(if (not (memq type '(groups faces)))
+              `(if (and (boundp symbol)
+                        (eq (indirect-variable symbol) symbol)
+                        (or (get symbol 'saved-value)
+                            (custom-variable-p symbol)
+                            ,(if (not (memq type '(nil options)))
+                                 '(get symbol 'variable-documentation))))
+                   (push (list symbol 'custom-variable) found))))))
     (if (not found)
        (error "No %s matching %s"
-               (if (eq all t)
-                   "items"
-                 (format "customizable %s"
-                         (if (memq all '(options faces groups))
-                             (symbol-name all)
-                           "items")))
-               regexp)
+              (if (eq type t)
+                  "items"
+                (format "customizable %s"
+                        (if (memq type '(options faces groups))
+                            (symbol-name type)
+                          "items")))
+              pattern)
       (custom-buffer-create
        (custom-sort-items found t custom-buffer-order-groups)
        "*Customize Apropos*"))))
@@ -1540,6 +1542,12 @@ This button will have a menu with all three reset operations."
 (defvar custom-button-pressed nil
   "Face used for pressed buttons in customization buffers.")
 
+(defcustom custom-search-field t
+  "If non-nil, show a search field in Custom buffers."
+  :type 'boolean
+  :version "24.1"
+  :group 'custom-buffer)
+
 (defcustom custom-raised-buttons (not (equal (face-valid-attribute-values :box)
                                             '(("unspecified" . unspecified))))
   "If non-nil, indicate active buttons in a `raised-button' style.
@@ -1563,14 +1571,9 @@ Otherwise use brackets."
   (let ((init-file (or custom-file user-init-file)))
     ;; Insert verbose help at the top of the custom buffer.
     (when custom-buffer-verbose-help
-      (widget-insert "Editing a setting changes only the text in this buffer."
-                    (if init-file
-                        "
-To apply your changes, use the Save or Set buttons.
-Saving a change normally works by editing your init file."
-                      "
-Currently, these settings cannot be saved for future Emacs sessions,
-possibly because you started Emacs with `-q'.")
+      (widget-insert (if init-file
+                        "To apply changes, use the Save or Set buttons."
+                      "Custom settings cannot be saved; maybe you started Emacs with `-q'.")
                     "\nFor details, see ")
       (widget-create 'custom-manual
                     :tag "Saving Customizations"
@@ -1582,6 +1585,26 @@ possibly because you started Emacs with `-q'.")
                     "(emacs)Top")
       (widget-insert "."))
     (widget-insert "\n")
+
+    ;; Insert the search field.
+    (when custom-search-field
+      (widget-insert "\n")
+      (let* ((echo "Search for custom items")
+            (search-widget
+             (widget-create
+              'editable-field
+              :size 40 :help-echo echo
+              :action `(lambda (widget &optional event)
+                         (customize-apropos (widget-value widget))))))
+       (widget-insert " ")
+       (widget-create-child-and-convert
+        search-widget 'push-button
+        :tag "Search"
+        :help-echo echo :action
+        (lambda (widget &optional event)
+          (customize-apropos (widget-value (widget-get widget :parent)))))
+       (widget-insert "\n")))
+
     ;; The custom command buttons are also in the toolbar, so for a
     ;; time they were not inserted in the buffer if the toolbar was in use.
     ;; But it can be a little confusing for the buffer layout to
@@ -1589,10 +1612,9 @@ possibly because you started Emacs with `-q'.")
     ;; mention that a custom buffer can in theory be created in a
     ;; frame with a toolbar, then later viewed in one without.
     ;; So now the buttons are always inserted in the buffer.  (Bug#1326)
-;;;    (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"))
+       (widget-insert "
+ Operate on all settings in this buffer:\n"))
     (let ((button (lambda (tag action active help icon)
                    (widget-insert " ")
                    (if (eval active)
@@ -1988,63 +2010,64 @@ and `face'."
                   (nth 3 entry)))
         (form (widget-get parent :custom-form))
         children)
-    (while (string-match "\\`\\(.*\\)%c\\(.*\\)\\'" text)
-      (setq text (concat (match-string 1 text)
-                        (symbol-name category)
-                        (match-string 2 text))))
-    (when (and custom-magic-show
-              (or (not hidden)
-                  (memq category custom-magic-show-hidden)))
-      (insert "   ")
+    (unless (eq state 'hidden)
+      (while (string-match "\\`\\(.*\\)%c\\(.*\\)\\'" text)
+       (setq text (concat (match-string 1 text)
+                          (symbol-name category)
+                          (match-string 2 text))))
+      (when (and custom-magic-show
+                (or (not hidden)
+                    (memq category custom-magic-show-hidden)))
+       (insert "   ")
+       (when (and (eq category 'group)
+                  (not (and (eq custom-buffer-style 'links)
+                            (> (widget-get parent :custom-level) 1))))
+         (insert-char ?\  (* custom-buffer-indent
+                             (widget-get parent :custom-level))))
+       (push (widget-create-child-and-convert
+              widget 'choice-item
+              :help-echo "Change the state of this item."
+              :format (if hidden "%t" "%[%t%]")
+              :button-prefix 'widget-push-button-prefix
+              :button-suffix 'widget-push-button-suffix
+              :mouse-down-action 'widget-magic-mouse-down-action
+              :tag "State")
+             children)
+       (insert ": ")
+       (let ((start (point)))
+         (if (eq custom-magic-show 'long)
+             (insert text)
+           (insert (symbol-name state)))
+         (cond ((eq form 'lisp)
+                (insert " (lisp)"))
+               ((eq form 'mismatch)
+                (insert " (mismatch)")))
+         (put-text-property start (point) 'face 'custom-state))
+       (insert "\n"))
       (when (and (eq category 'group)
                 (not (and (eq custom-buffer-style 'links)
                           (> (widget-get parent :custom-level) 1))))
        (insert-char ?\  (* custom-buffer-indent
                            (widget-get parent :custom-level))))
-      (push (widget-create-child-and-convert
-            widget 'choice-item
-            :help-echo "Change the state of this item."
-            :format (if hidden "%t" "%[%t%]")
-            :button-prefix 'widget-push-button-prefix
-            :button-suffix 'widget-push-button-suffix
-            :mouse-down-action 'widget-magic-mouse-down-action
-            :tag "State")
-           children)
-      (insert ": ")
-      (let ((start (point)))
-       (if (eq custom-magic-show 'long)
-           (insert text)
-         (insert (symbol-name state)))
-       (cond ((eq form 'lisp)
-              (insert " (lisp)"))
-             ((eq form 'mismatch)
-              (insert " (mismatch)")))
-       (put-text-property start (point) 'face 'custom-state))
-      (insert "\n"))
-    (when (and (eq category 'group)
-              (not (and (eq custom-buffer-style 'links)
-                        (> (widget-get parent :custom-level) 1))))
-      (insert-char ?\  (* custom-buffer-indent
-                         (widget-get parent :custom-level))))
-    (when custom-magic-show-button
-      (when custom-magic-show
-       (let ((indent (widget-get parent :indent)))
-         (when indent
-           (insert-char ?  indent))))
-      (push (widget-create-child-and-convert
-            widget 'choice-item
-            :mouse-down-action 'widget-magic-mouse-down-action
-            :button-face face
-            :button-prefix ""
-            :button-suffix ""
-            :help-echo "Change the state."
-            :format (if hidden "%t" "%[%t%]")
-            :tag (if (memq form '(lisp mismatch))
-                     (concat "(" magic ")")
-                   (concat "[" magic "]")))
-           children)
-      (insert " "))
-    (widget-put widget :children children)))
+      (when custom-magic-show-button
+       (when custom-magic-show
+         (let ((indent (widget-get parent :indent)))
+           (when indent
+             (insert-char ?  indent))))
+       (push (widget-create-child-and-convert
+              widget 'choice-item
+              :mouse-down-action 'widget-magic-mouse-down-action
+              :button-face face
+              :button-prefix ""
+              :button-suffix ""
+              :help-echo "Change the state."
+              :format (if hidden "%t" "%[%t%]")
+              :tag (if (memq form '(lisp mismatch))
+                       (concat "(" magic ")")
+                     (concat "[" magic "]")))
+             children)
+       (insert " "))
+      (widget-put widget :children children))))
 
 (defun custom-magic-reset (widget)
   "Redraw the :custom-magic property of WIDGET."
@@ -2206,12 +2229,9 @@ and `face'."
 (defun custom-show (widget value)
   "Non-nil if WIDGET should be shown with VALUE by default."
   (let ((show (widget-get widget :custom-show)))
-    (cond ((null show)
-          nil)
-         ((eq t show)
-          t)
-         (t
-          (funcall show widget value)))))
+    (if (functionp show)
+       (funcall show widget value)
+      show)))
 
 (defun custom-load-widget (widget)
   "Load all dependencies for WIDGET."
@@ -2289,8 +2309,7 @@ Insert PREFIX first if non-nil."
               (insert ", "))))
       (widget-put widget :buttons buttons))))
 
-(defun custom-add-parent-links (widget &optional initial-string
-                                      doc-initial-string)
+(defun custom-add-parent-links (widget &optional initial-string doc-initial-string)
   "Add \"Parent groups: ...\" to WIDGET if the group has parents.
 The value is non-nil if any parents were found.
 If INITIAL-STRING is non-nil, use that rather than \"Parent groups:\"."
@@ -2309,36 +2328,6 @@ If INITIAL-STRING is non-nil, use that rather than \"Parent groups:\"."
                         symbol)
                        buttons)
                  (setq parents (cons symbol parents)))))
-    (and (null (get name 'custom-links)) ;No links of its own.
-         (= (length parents) 1)         ;A single parent.
-         (let* ((links (delq nil (mapcar (lambda (w)
-                                          (unless (eq (widget-type w)
-                                                      'custom-group-link)
-                                            w))
-                                        (get (car parents) 'custom-links))))
-                (many (> (length links) 2)))
-           (when links
-             (let ((pt (point))
-                   (left-margin (+ left-margin 2)))
-              (insert "\n" (or doc-initial-string "Group documentation:") " ")
-              (while links
-                (push (widget-create-child-and-convert
-                       widget (car links)
-                       :button-face 'custom-link
-                       :mouse-face 'highlight
-                       :pressed-face 'highlight)
-                      buttons)
-                (setq links (cdr links))
-                (cond ((null links)
-                       (insert ".\n"))
-                      ((null (cdr links))
-                       (if many
-                           (insert ", and ")
-                         (insert " and ")))
-                      (t
-                        (insert ", "))))
-               (fill-region-as-paragraph pt (point))
-               (delete-to-left-margin (1+ pt) (+ pt 2))))))
     (if parents
         (insert "\n")
       (delete-region start (point)))
@@ -2413,8 +2402,6 @@ If INITIAL-STRING is non-nil, use that rather than \"Parent groups:\"."
 
 ;;; The `custom-variable' Widget.
 
-;; When this was underlined blue, users confused it with a
-;; Mosaic-style hyperlink...
 (defface custom-variable-tag
   `((((class color)
       (background dark))
@@ -2459,7 +2446,11 @@ However, setting it through Custom sets the default value.")
     (documentation-property variable 'variable-documentation)))
 
 (define-widget 'custom-variable 'custom
-  "Customize variable."
+  "A widget for displaying a Custom variable.
+
+The following property has a special meaning for this widget:
+:hidden-states - A list of widget states for which the widget's initial
+                 contents should be hidden."
   :format "%v"
   :help-echo "Set or reset this variable."
   :documentation-property #'custom-variable-documentation
@@ -2469,6 +2460,7 @@ However, setting it through Custom sets the default value.")
   :custom-form nil ; defaults to value of `custom-variable-default-form'
   :value-create 'custom-variable-value-create
   :action 'custom-variable-action
+  :hidden-states '(standard)
   :custom-set 'custom-variable-set
   :custom-mark-to-save 'custom-variable-mark-to-save
   :custom-reset-current 'custom-redraw
@@ -2503,7 +2495,6 @@ try matching its doc string against `custom-guess-doc-alist'."
   (let* ((buttons (widget-get widget :buttons))
         (children (widget-get widget :children))
         (form (widget-get widget :custom-form))
-        (state (widget-get widget :custom-state))
         (symbol (widget-get widget :value))
         (tag (widget-get widget :tag))
         (type (custom-variable-type symbol))
@@ -2513,17 +2504,17 @@ try matching its doc string against `custom-guess-doc-alist'."
         (last (widget-get widget :custom-last))
         (value (if (default-boundp symbol)
                    (funcall get symbol)
-                 (widget-get conv :value))))
-    ;; If the widget is new, the child determines whether it is hidden.
-    (cond (state)
-         ((custom-show type value)
-          (setq state 'unknown))
-         (t
-          (setq state 'hidden)))
+                 (widget-get conv :value)))
+        (state (or (widget-get widget :custom-state)
+                   (if (memq (custom-variable-state symbol value)
+                             (widget-get widget :hidden-states))
+                       'hidden))))
+
     ;; If we don't know the state, see if we need to edit it in lisp form.
+    (unless state
+      (setq state (if (custom-show type value) 'unknown 'hidden)))
     (when (eq state 'unknown)
       (unless (widget-apply conv :match value)
-       ;; (widget-apply (widget-convert type) :match value)
        (setq form 'mismatch)))
     ;; Now we can create the child widget.
     (cond ((eq custom-buffer-style 'tree)
@@ -2536,21 +2527,36 @@ try matching its doc string against `custom-guess-doc-alist'."
          ((eq state 'hidden)
           ;; Indicate hidden value.
           (push (widget-create-child-and-convert
-                 widget 'item
-                 :format "%{%t%}: "
-                 :sample-face 'custom-variable-tag
-                 :tag tag
-                 :parent widget)
-                buttons)
-          (push (widget-create-child-and-convert
-                 widget 'visibility
+                 widget 'custom-visibility
                  :help-echo "Show the value of this option."
+                 :on-image "down"
+                 :on "Hide"
+                 :off-image "right"
                  :off "Show Value"
                  :action 'custom-toggle-parent
                  nil)
+                buttons)
+          (insert " ")
+          (push (widget-create-child-and-convert
+                 widget 'item
+                 :format "%{%t%} "
+                 :sample-face 'custom-variable-tag
+                 :tag tag
+                 :parent widget)
                 buttons))
          ((memq form '(lisp mismatch))
           ;; In lisp mode edit the saved value when possible.
+          (push (widget-create-child-and-convert
+                 widget 'custom-visibility
+                 :help-echo "Hide the value of this option."
+                 :on "Hide"
+                 :off "Show"
+                 :on-image "down"
+                 :off-image "right"
+                 :action 'custom-toggle-parent
+                 t)
+                buttons)
+          (insert " ")
           (let* ((value (cond ((get symbol 'saved-value)
                                (car (get symbol 'saved-value)))
                               ((get symbol 'standard-value)
@@ -2560,15 +2566,6 @@ try matching its doc string against `custom-guess-doc-alist'."
                               (t
                                (custom-quote (widget-get conv :value))))))
             (insert (symbol-name symbol) ": ")
-            (push (widget-create-child-and-convert
-                   widget 'visibility
-                   :help-echo "Hide the value of this option."
-                   :on "Hide Value"
-                   :off "Show Value"
-                   :action 'custom-toggle-parent
-                   t)
-                  buttons)
-            (insert " ")
             (push (widget-create-child-and-convert
                    widget 'sexp
                    :button-face 'custom-variable-button-face
@@ -2579,6 +2576,17 @@ try matching its doc string against `custom-guess-doc-alist'."
                   children)))
          (t
           ;; Edit mode.
+          (push (widget-create-child-and-convert
+                 widget 'custom-visibility
+                 :help-echo "Hide or show this option."
+                 :on "Hide"
+                 :off "Show"
+                 :on-image "down"
+                 :off-image "right"
+                 :action 'custom-toggle-parent
+                 t)
+                buttons)
+          (insert " ")
           (let* ((format (widget-get type :format))
                  tag-format value-format)
             (unless (string-match ":" format)
@@ -2595,15 +2603,6 @@ try matching its doc string against `custom-guess-doc-alist'."
                    :sample-face 'custom-variable-tag
                    tag)
                   buttons)
-            (insert " ")
-            (push (widget-create-child-and-convert
-                   widget 'visibility
-                   :help-echo "Hide the value of this option."
-                   :on "Hide Value"
-                   :off "Show Value"
-                   :action 'custom-toggle-parent
-                   t)
-                  buttons)
             (push (widget-create-child-and-convert
                    widget type
                    :format value-format
@@ -2635,7 +2634,7 @@ try matching its doc string against `custom-guess-doc-alist'."
          ;; Don't push it !!! Custom assumes that the first child is the
          ;; value one.
          (setq children (append children (list comment-widget)))))
-      ;; Update the rest of the properties properties.
+      ;; Update the rest of the properties.
       (widget-put widget :custom-form form)
       (widget-put widget :children children)
       ;; Now update the state.
@@ -2658,61 +2657,69 @@ try matching its doc string against `custom-guess-doc-alist'."
   (apply 'widget-apply (car (widget-get (widget-get widget :parent) :children))
         :mouse-down-action args))
 
-(defun custom-variable-state-set (widget)
-  "Set the state of WIDGET."
-  (let* ((symbol (widget-value widget))
-        (get (or (get symbol 'custom-get) 'default-value))
+(defun custom-variable-state (symbol val)
+  "Return the state of SYMBOL if its value is VAL.
+If SYMBOL has a non-nil `custom-get' property, it overrides VAL.
+Possible return values are `standard', `saved', `set', `themed',
+`changed', and `rogue'."
+  (let* ((get (or (get symbol 'custom-get) 'default-value))
         (value (if (default-boundp symbol)
                    (funcall get symbol)
-                 (widget-get widget :value)))
+                 val))
         (comment (get symbol 'variable-comment))
         tmp
-        temp
-        (state (cond ((progn (setq tmp (get symbol 'customized-value))
-                             (setq temp
-                                   (get symbol 'customized-variable-comment))
-                             (or tmp temp))
-                      (if (condition-case nil
-                              (and (equal value (eval (car tmp)))
-                                   (equal comment temp))
-                            (error nil))
-                          'set
-                        'changed))
-                     ((progn (setq tmp (get symbol 'theme-value))
-                             (setq temp (get symbol 'saved-variable-comment))
-                             (or tmp temp))
-                      (if (condition-case nil
-                              (and (equal comment temp)
-                                   (equal value
-                                          (eval
-                                           (car (custom-variable-theme-value
-                                                 symbol)))))
-                            (error nil))
-                          (cond
-                           ((eq (caar tmp) 'user) 'saved)
-                           ((eq (caar tmp) 'changed)
-                             (if (condition-case nil
-                                     (and (null comment)
-                                          (equal value
-                                                 (eval
-                                                  (car (get symbol 'standard-value)))))
-                                   (error nil))
-                                 ;; The value was originally set outside
-                                 ;; custom, but it was set to the standard
-                                 ;; value (probably an autoloaded defcustom).
-                                 'standard
-                               'changed))
-                           (t 'themed))
-                        'changed))
-                     ((setq tmp (get symbol 'standard-value))
-                      (if (condition-case nil
-                              (and (equal value (eval (car tmp)))
-                                   (equal comment nil))
-                            (error nil))
-                          'standard
-                        'changed))
-                     (t 'rogue))))
-    (widget-put widget :custom-state state)))
+        temp)
+    (cond ((progn (setq tmp (get symbol 'customized-value))
+                 (setq temp
+                       (get symbol 'customized-variable-comment))
+                 (or tmp temp))
+          (if (condition-case nil
+                  (and (equal value (eval (car tmp)))
+                       (equal comment temp))
+                (error nil))
+              'set
+            'changed))
+         ((progn (setq tmp (get symbol 'theme-value))
+                 (setq temp (get symbol 'saved-variable-comment))
+                 (or tmp temp))
+          (if (condition-case nil
+                  (and (equal comment temp)
+                       (equal value
+                              (eval
+                               (car (custom-variable-theme-value
+                                     symbol)))))
+                (error nil))
+              (cond
+               ((eq (caar tmp) 'user) 'saved)
+               ((eq (caar tmp) 'changed)
+                (if (condition-case nil
+                        (and (null comment)
+                             (equal value
+                                    (eval
+                                     (car (get symbol 'standard-value)))))
+                      (error nil))
+                    ;; The value was originally set outside
+                    ;; custom, but it was set to the standard
+                    ;; value (probably an autoloaded defcustom).
+                    'standard
+                  'changed))
+               (t 'themed))
+            'changed))
+         ((setq tmp (get symbol 'standard-value))
+          (if (condition-case nil
+                  (and (equal value (eval (car tmp)))
+                       (equal comment nil))
+                (error nil))
+              'standard
+            'changed))
+         (t 'rogue))))
+
+(defun custom-variable-state-set (widget &optional state)
+  "Set the state of WIDGET to STATE.
+If STATE is nil, the value is computed by `custom-variable-state'."
+  (widget-put widget :custom-state
+             (or state (custom-variable-state (widget-value widget)
+                                              (widget-get widget :value)))))
 
 (defun custom-variable-standard-value (widget)
   (get (widget-value widget) 'standard-value))
@@ -2998,7 +3005,9 @@ to switch between two values."
   :button-face 'custom-visibility
   :pressed-face 'custom-visibility
   :mouse-face 'highlight
-  :pressed-face 'highlight)
+  :pressed-face 'highlight
+  :on-image nil
+  :off-image nil)
 
 (defface custom-visibility
   '((t :height 0.8 :inherit link))
@@ -3345,6 +3354,18 @@ SPEC must be a full face spec."
           (insert " " tag "\n")
           (widget-put widget :buttons buttons))
          (t
+          ;; Visibility.
+          (push (widget-create-child-and-convert
+                 widget 'custom-visibility
+                 :help-echo "Hide or show this face."
+                 :on "Hide"
+                 :off "Show"
+                 :on-image "down"
+                 :off-image "right"
+                 :action 'custom-toggle-parent
+                 (not (eq state 'hidden)))
+                buttons)
+          (insert " ")
           ;; Create tag.
           (insert tag)
           (widget-specify-sample widget begin (point))
@@ -3359,16 +3380,6 @@ SPEC must be a full face spec."
                                                  :sample-face symbol
                                                  :tag "sample")
                 buttons)
-          ;; Visibility.
-          (insert " ")
-          (push (widget-create-child-and-convert
-                 widget 'visibility
-                 :help-echo "Hide or show this face."
-                 :on "Hide Face"
-                 :off "Show Face"
-                 :action 'custom-toggle-parent
-                 (not (eq state 'hidden)))
-                buttons)
           ;; Magic.
           (insert "\n")
           (let ((magic (widget-create-child-and-convert
@@ -3920,8 +3931,11 @@ If GROUPS-ONLY non-nil, return only those members that are groups."
             (insert " " tag "\n")
             (widget-put widget :buttons buttons)
             (message "Creating group...")
-            (let* ((members (custom-sort-items members
-                             custom-browse-sort-alphabetically
+            (let* ((members (custom-sort-items
+                             members
+                             ;; Never sort the top-level custom group.
+                             (unless (eq symbol 'emacs)
+                               custom-browse-sort-alphabetically)
                              custom-browse-order-groups))
                    (prefixes (widget-get widget :custom-prefixes))
                    (custom-prefix-list (custom-prefix-add symbol prefixes))
@@ -3979,17 +3993,21 @@ If GROUPS-ONLY non-nil, return only those members that are groups."
 
          ;; Nested style.
          (t                            ;Visible.
+          ;; Draw a horizontal line (this works for both graphical
+          ;; and text displays):
+          (let ((p (point)))
+            (insert "\n")
+            (put-text-property p (1+ p) 'face '(:underline t))
+            (overlay-put (make-overlay p (1+ p))
+                         'before-string
+                         (propertize "\n" 'face '(:underline t)
+                                     'display '(space :align-to 999))))
+
           ;; Add parent groups references above the group.
-          (if t    ;;; This should test that the buffer
-                   ;;; was made to display a group.
-              (when (eq level 1)
-                (if (custom-add-parent-links widget
-                                             "Parent groups:"
-                                             "Parent group documentation:")
-                    (insert "\n"))))
-          ;; Create level indicator.
+          (when (eq level 1)
+            (if (custom-add-parent-links widget "Parent groups:")
+                (insert "\n")))
           (insert-char ?\  (* custom-buffer-indent (1- level)))
-          (insert "/- ")
           ;; Create tag.
           (let ((start (point)))
             (insert tag " group: ")
@@ -4009,12 +4027,7 @@ If GROUPS-ONLY non-nil, return only those members that are groups."
                    (not (eq state 'hidden)))
                   buttons)
             (insert " "))
-          ;; Create more dashes.
-          ;; Use 76 instead of 75 to compensate for the temporary "<"
-          ;; added by `widget-insert'.
-          (insert-char ?- (- 76 (current-column)
-                             (* custom-buffer-indent level)))
-          (insert "\\\n")
+          (insert "\n")
           ;; Create magic button.
           (let ((magic (widget-create-child-and-convert
                         widget 'custom-magic
@@ -4040,43 +4053,50 @@ If GROUPS-ONLY non-nil, return only those members that are groups."
                                             ?\ ))
           ;; Members.
           (message "Creating group...")
-          (let* ((members (custom-sort-items members
-                                             custom-buffer-sort-alphabetically
-                                             custom-buffer-order-groups))
+          (let* ((members (custom-sort-items
+                           members
+                           ;; Never sort the top-level custom group.
+                           (unless (eq symbol 'emacs)
+                             custom-buffer-sort-alphabetically)
+                           custom-buffer-order-groups))
                  (prefixes (widget-get widget :custom-prefixes))
                  (custom-prefix-list (custom-prefix-add symbol prefixes))
-                 (length (length members))
+                 (len (length members))
                  (count 0)
-                 (children (mapcar (lambda (entry)
-                                     (widget-insert "\n")
-                                     (message "\
-Creating group members... %2d%%"
-                                              (/ (* 100.0 count) length))
-                                     (setq count (1+ count))
-                                     (prog1
-                                         (widget-create-child-and-convert
-                                          widget (nth 1 entry)
-                                          :group widget
-                                          :tag (custom-unlispify-tag-name
-                                                (nth 0 entry))
-                                          :custom-prefixes custom-prefix-list
-                                          :custom-level (1+ level)
-                                          :value (nth 0 entry))
-                                       (unless (eq (preceding-char) ?\n)
-                                         (widget-insert "\n"))))
-                                   members)))
-            (message "Creating group magic...")
+                 (reporter (make-progress-reporter
+                            "Creating group entries..." 0 len))
+                 children)
+            (setq children
+                  (mapcar
+                   (lambda (entry)
+                     (widget-insert "\n")
+                     (progress-reporter-update reporter (setq count (1+ count)))
+                     (let ((sym (nth 0 entry))
+                           (type (nth 1 entry))
+                           hidden-p)
+                       (prog1
+                           (widget-create-child-and-convert
+                            widget type
+                            :group widget
+                            :tag (custom-unlispify-tag-name sym)
+                            :custom-prefixes custom-prefix-list
+                            :custom-level (1+ level)
+                            :value sym)
+                         (unless (eq (preceding-char) ?\n)
+                           (widget-insert "\n")))))
+                   members))
             (mapc 'custom-magic-reset children)
-            (message "Creating group state...")
             (widget-put widget :children children)
             (custom-group-state-update widget)
-            (message "Creating group... done"))
+            (progress-reporter-done reporter))
           ;; End line
-          (insert "\n")
-          (insert-char ?\  (* custom-buffer-indent (1- level)))
-          (insert "\\- " (widget-get widget :tag) " group end ")
-          (insert-char ?- (- 75 (current-column) (* custom-buffer-indent level)))
-          (insert "/\n")))))
+          (let ((p (point)))
+            (insert "\n")
+            (put-text-property p (1+ p) 'face '(:underline t))
+            (overlay-put (make-overlay p (1+ p))
+                         'before-string
+                         (propertize "\n" 'face '(:underline t)
+                                     'display '(space :align-to 999))))))))
 
 (defvar custom-group-menu
   `(("Set for Current Session" custom-group-set
index 33e8cb1745fd279005fb42e1576c25cf8537a5fa..0e6153cfe47a4c68d73554554667bf6ba5ac8372 100644 (file)
@@ -1,7 +1,8 @@
 ;;; desktop.el --- save partial status of Emacs when killed
 
 ;; Copyright (C) 1993, 1994, 1995, 1997, 2000, 2001, 2002, 2003,
-;;   2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+;;   2004, 2005, 2006, 2007, 2008, 2009, 2010
+;;   Free Software Foundation, Inc.
 
 ;; Author: Morten Welinder <terra@diku.dk>
 ;; Keywords: convenience
@@ -811,19 +812,23 @@ which means to truncate VAR's value to at most MAX-SIZE elements
 FILENAME is the visited file name, BUFNAME is the buffer name, and
 MODE is the major mode.
 \n\(fn FILENAME BUFNAME MODE)"
-  (let ((case-fold-search nil))
+  (let ((case-fold-search nil)
+        dired-skip)
     (and (not (and (stringp desktop-buffers-not-to-save)
                   (not filename)
                   (string-match desktop-buffers-not-to-save bufname)))
          (not (memq mode desktop-modes-not-to-save))
+         ;; FIXME this is broken if desktop-files-not-to-save is nil.
          (or (and filename
                  (stringp desktop-files-not-to-save)
                   (not (string-match desktop-files-not-to-save filename)))
              (and (eq mode 'dired-mode)
                   (with-current-buffer bufname
-                    (not (string-match desktop-files-not-to-save
-                                       default-directory))))
+                    (not (setq dired-skip
+                               (string-match desktop-files-not-to-save
+                                             default-directory)))))
              (and (null filename)
+                  (null dired-skip)     ; bug#5755
                  (with-current-buffer bufname desktop-save-buffer))))))
 
 ;; ----------------------------------------------------------------------------
index 27f8318f91c6e81d6fb1f1b2acfb0489d21efad6..75ea98ba911794b4c785122cb977305650e9a870 100644 (file)
@@ -1287,7 +1287,9 @@ a diff with \\[diff-reverse-direction].
   (set (make-local-variable 'add-log-current-defun-function)
        'diff-current-defun)
   (set (make-local-variable 'add-log-buffer-file-name-function)
-       (lambda () (diff-find-file-name nil 'noprompt))))
+       (lambda () (diff-find-file-name nil 'noprompt)))
+  (unless (buffer-file-name)
+    (hack-dir-local-variables-non-file-buffer)))
 
 ;;;###autoload
 (define-minor-mode diff-minor-mode
index f919840e65da9903f7a1ea2a386d8e9b9f35767e..aba4b7a7a9d33b9472694b1b2ccaa4c6b0c08088 100644 (file)
@@ -163,7 +163,13 @@ With numeric ARG, enable Dired-Omit mode if ARG is positive, disable
 otherwise.  Enabling and disabling is buffer-local.
 If enabled, \"uninteresting\" files are not listed.
 Uninteresting files are those whose filenames match regexp `dired-omit-files',
-plus those ending with extensions in `dired-omit-extensions'."
+plus those ending with extensions in `dired-omit-extensions'.
+
+To enable omitting in every Dired buffer, you can put in your ~/.emacs
+
+  (add-hook 'dired-mode-hook (lambda () (dired-omit-mode 1)))
+
+See Info node `(dired-x) Omitting Variables' for more information."
   :group 'dired-x
   (if dired-omit-mode
       ;; This will mention how many lines were omitted:
index c985aae07b6f493a5b5ed1907764a6a19ac4f63b..044969799b07392fd0366fcc52359ae67b2c9af0 100644 (file)
@@ -1,7 +1,8 @@
 ;; autoload.el --- maintain autoloads in loaddefs.el
 
 ;; Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2001, 2002, 2003,
-;;   2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+;;   2004, 2005, 2006, 2007, 2008, 2009, 2010
+;;   Free Software Foundation, Inc.
 
 ;; Author: Roland McGrath <roland@gnu.org>
 ;; Keywords: maint
@@ -258,14 +259,17 @@ put the output in."
 TYPE (default \"autoloads\") is a string stating the type of
 information contained in FILE.  If FEATURE is non-nil, FILE
 will provide a feature.  FEATURE may be a string naming the
-feature, otherwise it will be based on FILE's name."
+feature, otherwise it will be based on FILE's name.
+
+At present, a feature is in fact always provided, but this should
+not be relied upon."
   (let ((basename (file-name-nondirectory file)))
     (concat ";;; " basename
            " --- automatically extracted " (or type "autoloads") "\n"
            ";;\n"
            ";;; Code:\n\n"
            "\f\n"
-           ;; This is used outside of autoload.el.
+           ;; This is used outside of autoload.el, eg cus-dep, finder.
            "(provide '"
            (if (stringp feature)
                feature
index 8a1c753f5f68f683cfe86c4da892c87590b836bf..10b7baf294fe5b236b98921958ef87b33d01271b 100644 (file)
@@ -458,7 +458,9 @@ each line."
   "Return list of keywords given in file FILE."
   (let ((keywords (lm-keywords file)))
     (if keywords
-       (split-string keywords "[, \t\n]+" t))))
+       (if (string-match-p "," keywords)
+           (split-string keywords ",[ \t\n]*" t)
+         (split-string keywords "[ \t\n]+" t)))))
 
 (defvar finder-known-keywords)
 (defun lm-keywords-finder-p (&optional file)
index 45c3840bdd2df7a9eabdf64b2d66e96b15745fa5..175999b6e37936c1abb1115866d767143b4d164e 100644 (file)
@@ -82,8 +82,7 @@
 (defgroup pc-select nil
   "Emulate pc bindings."
   :prefix "pc-select"
-  :group 'editing-basics
-  :group 'convenience)
+  :group 'emulations)
 
 (defcustom pc-select-override-scroll-error t
   "*Non-nil means don't generate error on scrolling past edge of buffer.
index 3cdf2ff3ffacd9c2a1c20b575deaab21cb1e95e9..ddbdd3541ade2497e10c5d27064ee0576b9f5a80 100644 (file)
@@ -34,7 +34,7 @@
 (defgroup epg ()
   "The EasyPG library."
   :version "23.1"
-  :group 'emacs)
+  :group 'data)
 
 (defcustom epg-gpg-program "gpg"
   "The `gpg' executable."
index c192b3400b4a06cd8880faa7e6ddd0934dc71330..18fc5f188a99abfe1172d70bb222be7b6578db3f 100644 (file)
@@ -1,3 +1,7 @@
+2010-03-10  Chong Yidong  <cyd@stupidchicken.com>
+
+       * Branch for 23.2.
+
 2010-02-07  Vivek Dasmohapatra  <vivek@etla.org>
 
        * erc-services.el (erc-nickserv-alist): Fix defcustom type (Bug#5520).
index c8fdfff85888c8e2b2c5d662e1b25de5d50cc8a0..5067221585b06f19d285454040a86efd27da3f7b 100644 (file)
@@ -3,7 +3,7 @@
 ;; Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
 ;;
 ;; Author: Miles Bader <miles@gnu.org>
-;; Keywords: faces face remapping display user commands
+;; Keywords: faces, face remapping, display, user commands
 ;;
 ;; This file is part of GNU Emacs.
 ;;
index 6f9e679976350bc315bd4acf8c62255b287e7a45..b7c9f3590957f0b88e1bfc1ec4399c01d9481180 100644 (file)
@@ -479,12 +479,20 @@ These special properties include `invisible', `intangible' and `read-only'."
        nil
       col)))
 
-(defun list-colors-display (&optional list buffer-name)
+
+(defun list-colors-display (&optional list buffer-name callback)
   "Display names of defined colors, and show what they look like.
 If the optional argument LIST is non-nil, it should be a list of
 colors to display.  Otherwise, this command computes a list of
-colors that the current display can handle.  If the optional
-argument BUFFER-NAME is nil, it defaults to *Colors*."
+colors that the current display can handle.
+
+If the optional argument BUFFER-NAME is nil, it defaults to
+*Colors*.
+
+If the optional argument CALLBACK is non-nil, it should be a
+function to call each time the user types RET or clicks on a
+color.  The function should accept a single argument, the color
+name."
   (interactive)
   (when (and (null list) (> (display-color-cells) 0))
     (setq list (list-colors-duplicates (defined-colors)))
@@ -493,49 +501,57 @@ argument BUFFER-NAME is nil, it defaults to *Colors*."
       (let ((lc (nthcdr (1- (display-color-cells)) list)))
        (if lc
            (setcdr lc nil)))))
-  (with-help-window (or buffer-name "*Colors*")
-    (with-current-buffer standard-output
+  (let ((buf (get-buffer-create "*Colors*")))
+    (with-current-buffer buf
+      (erase-buffer)
       (setq truncate-lines t)
-      (if temp-buffer-show-function
-         (list-colors-print list)
-       ;; Call list-colors-print from temp-buffer-show-hook
-       ;; to get the right value of window-width in list-colors-print
-       ;; after the buffer is displayed.
-       (add-hook 'temp-buffer-show-hook
-                 (lambda ()
-                   (set-buffer-modified-p
-                    (prog1 (buffer-modified-p)
-                      (list-colors-print list))))
-                 nil t)))))
-
-(defun list-colors-print (list)
-  (dolist (color list)
-    (if (consp color)
-       (if (cdr color)
-           (setq color (sort color (lambda (a b)
-                                     (string< (downcase a)
-                                              (downcase b))))))
-      (setq color (list color)))
-    (put-text-property
-     (prog1 (point)
-       (insert (car color))
-       (indent-to 22))
-     (point)
-     'face (list ':background (car color)))
-    (put-text-property
-     (prog1 (point)
-       (insert " " (if (cdr color)
-                      (mapconcat 'identity (cdr color) ", ")
-                    (car color))))
-     (point)
-     'face (list ':foreground (car color)))
-    (indent-to (max (- (window-width) 8) 44))
-    (insert (apply 'format "#%02x%02x%02x"
-                  (mapcar (lambda (c) (lsh c -8))
-                          (color-values (car color)))))
-
-    (insert "\n"))
-  (goto-char (point-min)))
+      (list-colors-print list callback)
+      (set-buffer-modified-p nil))
+    (pop-to-buffer buf))
+  (if callback
+      (message "Click on a color to select it.")))
+
+(defun list-colors-print (list &optional callback)
+  (let ((callback-fn
+        (if callback
+            `(lambda (button)
+               (funcall ,callback (button-get button 'color-name))))))
+    (dolist (color list)
+      (if (consp color)
+         (if (cdr color)
+             (setq color (sort color (lambda (a b)
+                                       (string< (downcase a)
+                                                (downcase b))))))
+       (setq color (list color)))
+      (let* ((opoint (point))
+            (color-values (color-values (car color)))
+            (light-p (>= (apply 'max color-values)
+                         (* (car (color-values "white")) .5))))
+       (insert (car color))
+       (indent-to 22)
+       (put-text-property opoint (point) 'face `(:background ,(car color)))
+       (put-text-property
+        (prog1 (point)
+          (insert " " (if (cdr color)
+                          (mapconcat 'identity (cdr color) ", ")
+                        (car color))))
+        (point)
+        'face (list :foreground (car color)))
+       (indent-to (max (- (window-width) 8) 44))
+       (insert (apply 'format "#%02x%02x%02x"
+                      (mapcar (lambda (c) (lsh c -8))
+                              color-values)))
+       (when callback
+         (make-text-button
+          opoint (point)
+          'follow-link t
+          'mouse-face (list :background (car color)
+                            :foreground (if light-p "black" "white"))
+          'color-name (car color)
+          'action callback-fn)))
+      (insert "\n"))
+    (goto-char (point-min))))
+
 
 (defun list-colors-duplicates (&optional list)
   "Return a list of colors with grouped duplicate colors.
index 99fa7ddf1b573acd256bde273b083854ebc4bbbb..b341fe710767333e02a8f82c68f08fecc746bc4e 100644 (file)
@@ -1,8 +1,8 @@
 ;;; files.el --- file input and output commands for Emacs
 
 ;; Copyright (C) 1985, 1986, 1987, 1992, 1993, 1994, 1995, 1996,
-;;   1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
-;;   2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+;;   1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+;;   2007, 2008, 2009, 2010  Free Software Foundation, Inc.
 
 ;; Maintainer: FSF
 
@@ -2159,7 +2159,7 @@ in that case, this function acts as if `enable-local-variables' were t."
   (if (fboundp 'ucs-set-table-for-input) ; don't lose when building
       (ucs-set-table-for-input)))
 
-(defcustom auto-mode-case-fold nil
+(defcustom auto-mode-case-fold t
   "Non-nil means to try second pass through `auto-mode-alist'.
 This means that if the first case-sensitive search through the alist fails
 to find a matching major mode, a second case-insensitive search is made.
@@ -2404,7 +2404,8 @@ and `magic-mode-alist', which determines modes based on file contents.")
      ("pg" . text-mode)
      ("make" . makefile-gmake-mode)            ; Debian uses this
      ("guile" . scheme-mode)
-     ("clisp" . lisp-mode)))
+     ("clisp" . lisp-mode)
+     ("emacs" . emacs-lisp-mode)))
   "Alist mapping interpreter names to major modes.
 This is used for files whose first lines match `auto-mode-interpreter-regexp'.
 Each element looks like (INTERPRETER . MODE).
@@ -2767,14 +2768,15 @@ asking you for confirmation."
 
 (mapc (lambda (pair)
        (put (car pair) 'safe-local-variable (cdr pair)))
-      '((buffer-read-only     . booleanp)   ;; C source code
-       (default-directory    . stringp)    ;; C source code
-       (fill-column          . integerp)   ;; C source code
-       (indent-tabs-mode     . booleanp)   ;; C source code
-       (left-margin          . integerp)   ;; C source code
-       (no-update-autoloads  . booleanp)
-       (tab-width            . integerp)   ;; C source code
-       (truncate-lines       . booleanp))) ;; C source code
+      '((buffer-read-only        . booleanp)   ;; C source code
+       (default-directory       . stringp)    ;; C source code
+       (fill-column             . integerp)   ;; C source code
+       (indent-tabs-mode        . booleanp)   ;; C source code
+       (left-margin             . integerp)   ;; C source code
+       (no-update-autoloads     . booleanp)
+       (tab-width               . integerp)   ;; C source code
+       (truncate-lines          . booleanp)   ;; C source code
+       (bidi-display-reordering . booleanp))) ;; C source code
 
 (put 'c-set-style 'safe-local-eval-function t)
 
@@ -3112,14 +3114,17 @@ is specified, returning t if it is specified."
          ;; Otherwise, set the variables.
          (enable-local-variables
           (hack-local-variables-filter result nil)
-          (when file-local-variables-alist
-            ;; Any 'evals must run in the Right sequence.
-            (setq file-local-variables-alist
-                  (nreverse file-local-variables-alist))
-            (run-hooks 'before-hack-local-variables-hook)
-            (dolist (elt file-local-variables-alist)
-              (hack-one-local-variable (car elt) (cdr elt))))
-          (run-hooks 'hack-local-variables-hook)))))
+          (hack-local-variables-apply)))))
+
+(defun hack-local-variables-apply ()
+  (when file-local-variables-alist
+    ;; Any 'evals must run in the Right sequence.
+    (setq file-local-variables-alist
+         (nreverse file-local-variables-alist))
+    (run-hooks 'before-hack-local-variables-hook)
+    (dolist (elt file-local-variables-alist)
+      (hack-one-local-variable (car elt) (cdr elt))))
+  (run-hooks 'hack-local-variables-hook))
 
 (defun safe-local-variable-p (sym val)
   "Non-nil if SYM is safe as a file-local variable with value VAL.
@@ -3413,15 +3418,14 @@ is found.  Returns the new class name."
 Store the directory-local variables in `dir-local-variables-alist'
 and `file-local-variables-alist', without applying them."
   (when (and enable-local-variables
-            (buffer-file-name)
-            (not (file-remote-p (buffer-file-name))))
+            (not (file-remote-p (or (buffer-file-name) default-directory))))
     ;; Find the variables file.
-    (let ((variables-file (dir-locals-find-file (buffer-file-name)))
+    (let ((variables-file (dir-locals-find-file (or (buffer-file-name) default-directory)))
          (class nil)
          (dir-name nil))
       (cond
        ((stringp variables-file)
-       (setq dir-name (file-name-directory (buffer-file-name)))
+       (setq dir-name (if (buffer-file-name) (file-name-directory (buffer-file-name)) default-directory))
        (setq class (dir-locals-read-from-file variables-file)))
        ((consp variables-file)
        (setq dir-name (nth 0 variables-file))
@@ -3438,6 +3442,10 @@ and `file-local-variables-alist', without applying them."
              (push elt dir-local-variables-alist))
            (hack-local-variables-filter variables dir-name)))))))
 
+(defun hack-dir-local-variables-non-file-buffer ()
+  (hack-dir-local-variables)
+  (hack-local-variables-apply))
+
 \f
 (defcustom change-major-mode-with-file-name t
   "Non-nil means \\[write-file] should set the major mode from the file name.
index 9458fdfec434b8ea63db846643c8ecf2435010d9..0c8229c8f7aee91810137ca4529540428d788241 100644 (file)
@@ -99,7 +99,7 @@ The command run (after changing into DIR) is
 
 except that the variable `find-ls-option' specifies what to use
 as the final argument."
-  (interactive (list (read-file-name "Run find in directory: " nil "" t)
+  (interactive (list (read-directory-name "Run find in directory: " nil "" t)
                     (read-string "Run find (with args): " find-args
                                  '(find-args-history . 1))))
   (let ((dired-buffers dired-buffers))
index 682fc1d4ae2f0c245e1ab4c3bdd6ff753070215f..2de8e2e01a725c60e16626557534cff728fa112a 100644 (file)
 
 ;; This mode uses the Keywords library header to provide code-finding
 ;; services by keyword.
-;;
-;; Things to do:
-;;    1. Support multiple keywords per search.  This could be extremely hairy;
-;; there doesn't seem to be any way to get completing-read to exit on
-;; an EOL with no substring pending, which is what we'd want to end the loop.
-;;    2. Search by string in synopsis line?
-;;    3. Function to check finder-package-info for unknown keywords.
 
 ;;; Code:
 
@@ -182,7 +175,7 @@ no arguments compiles from `load-path'."
                            f)))
                 (prin1 summary (current-buffer))
                 (insert "\n        ")
-                (princ keywords (current-buffer))
+                (prin1 (mapcar 'intern keywords) (current-buffer))
                 (insert ")\n")))
            (directory-files d nil
                              ;; Allow compressed files also.  FIXME:
@@ -230,6 +223,29 @@ no arguments compiles from `load-path'."
      '(mouse-face highlight
                  help-echo finder-help-echo))))
 
+(defun finder-unknown-keywords ()
+  "Return an alist of unknown keywords and number of their occurences.
+Unknown are keywords that are present in `finder-package-info'
+but absent in `finder-known-keywords'."
+  (let ((unknown-keywords-hash (make-hash-table)))
+    ;; Prepare a hash where key is a keyword
+    ;; and value is the number of keyword occurences.
+    (mapc (lambda (package)
+           (mapc (lambda (keyword)
+                   (unless (assq keyword finder-known-keywords)
+                     (puthash keyword
+                              (1+ (gethash keyword unknown-keywords-hash 0))
+                              unknown-keywords-hash)))
+                 (nth 2 package)))
+         finder-package-info)
+    ;; Make an alist from the hash and sort by the keyword name.
+    (sort (let (unknown-keywords-list)
+           (maphash (lambda (key value)
+                      (push (cons key value) unknown-keywords-list))
+                    unknown-keywords-hash)
+           unknown-keywords-list)
+         (lambda (a b) (string< (car a) (car b))))))
+
 ;;;###autoload
 (defun finder-list-keywords ()
   "Display descriptions of the keywords in the Finder buffer."
index 0106e6212c5911fb84ce315836046a47ac93912e..a6c9a1557d65faf0dc41c2128afe538e7a8749ae 100644 (file)
@@ -1,14 +1,50 @@
+2010-03-30  Chong Yidong  <cyd@stupidchicken.com>
+
+       * message.el (message-default-mail-headers):
+       (message-default-headers): Carry the value mail-default-headers over
+       into message-default-mail-headers, rather than message-default-headers.
+
+2010-03-30  Martin Stjernholm  <mast@lysator.liu.se>
+
+       * mm-decode.el (mm-add-meta-html-tag): Add option to override the
+       charset.
+
+       * gnus-art.el (gnus-article-browse-html-parts): Force the correct
+       charset into the <meta> tag when the article is encoded to utf-8.
+
+2010-03-30  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus-art.el (gnus-article-browse-delete-temp-files):
+       Delete directories as well.
+       (gnus-article-browse-html-parts): Work for images that do not specify
+       file names; delete temp directory when quitting; insert header at the
+       right place; use file: scheme for image files.
+
+2010-03-30  Eric Schulte  <schulte.eric@gmail.com>
+
+       * gnus-art.el (gnus-article-browse-html-save-cid-image): New function.
+       (gnus-article-browse-html-parts): Use it to make temporary cid image
+       files in addition to html file so that browser may display them.
+
 2010-03-29  Katsumi Yamaoka  <yamaoka@jpl.org>
 
        * mm-decode.el (mm-add-meta-html-tag): Fix regexp matching meta tag.
 
-2010-03-27  Chong Yidong  <cyd@stupidchicken.com>
+2010-03-29  Teodor Zlatanov  <tzz@lifelogs.com>
 
-       * message.el (message-default-mail-headers):
-       (message-default-headers): Carry the value mail-default-headers over
-       into message-default-mail-headers, rather than message-default-headers.
+       * auth-source.el (auth-source-pick): Fix for non-secrets specifier.
+
+2010-03-27  Teodor Zlatanov  <tzz@lifelogs.com>
 
-2010-03-22  Juanma Barranquero  <lekktu@gmail.com>
+       * auth-source.el (auth-sources): Change default to be simpler.
+       Explain about Secret Service API sources.  Improve Customize options.
+       (auth-source-pick): Change to accept any number of search parameters.
+       Implement fallbacks iteratively, not recursively.  Add scoring on the
+       second pass and sort by score.  Call Secret Service API when needed.
+       (auth-source-user-or-password): Use it.  Call Secret Service API
+       directly when needed to get the user name and the password.
+
+2010-03-24  Juanma Barranquero  <lekktu@gmail.com>
 
        * message.el (message-interactive): Doc fix.
        (message-qmail-inject-args): Reflow.
 
        * smiley.el (smiley-buffer): Fix typo in docstring.
 
+2010-03-24  Glenn Morris  <rgm@gnu.org>
+
+       * mail-source.el (gnus-message): Declare.
+       (mail-source-delete-old-incoming): Require gnus-util.
+
+2010-03-23  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus-art.el (canlock-verify): Autoload it for Emacs 21.
+
+       * message.el (ecomplete-setup): Autoload it for Emacs <23.
+
+       * mml-sec.el (mml-secure-cache-passphrase): Default to t that is
+       password-cache's default if it is not bound.
+       (mml-secure-passphrase-cache-expiry): Default to 16 that is
+       password-cache-expiry's default if it is not bound.
+
+       * pop3.el (pop3-list): Don't use 3rd arg of `split-string' which is not
+       available in Emacs 21.
+
+2010-03-23  Teodor Zlatanov  <tzz@lifelogs.com>
+
+       * auth-source.el (auth-sources): Fix up definition so extra parameters
+       are always inline.
+
+2010-03-22  Martin Stjernholm  <mast@lysator.liu.se>
+
+       * nnimap.el (nnimap-verify-uidvalidity): Fixed bug where uidvalidity
+       wasn't updated after mismatch.  Clear cached mailbox info correctly
+       when uidvalidity changes.
+       (nnimap-group-prefixed-name): New function to avoid some code
+       duplication.
+       (nnimap-verify-uidvalidity, nnimap-group-overview-filename)
+       (nnimap-request-group): Use it.
+       (nnimap-retrieve-groups, nnimap-verify-uidvalidity)
+       (nnimap-update-unseen): Significantly improved speed of Gnus startup
+       with many imap folders.  This is done by caching the group status from
+       the imap server persistently in a group parameter `imap-status'. (This
+       was cached before too if `nnimap-retrieve-groups-asynchronous' was set,
+       but not persistently, so every Gnus startup was still very slow.)
+
+2010-03-20  Teodor Zlatanov  <tzz@lifelogs.com>
+
+       * auth-source.el: Set up autoloads.  Bump to 23.2 because of the
+       secrets.el dependency.
+       (auth-sources): Add optional user name.  Add secrets.el configuration
+       choice (unused right now).
+
+2010-03-20  Teodor Zlatanov  <tzz@lifelogs.com>
+
+       * gnus-sum.el (gnus-summary-make-menu-bar): Let
+       `gnus-registry-install-shortcuts' fill in the functions.
+
+       * gnus-registry.el (gnus-summary-misc-menu): Declare to avoid
+       warnings.
+       (gnus-registry-misc-menus): Variable to hold registry mark menus.
+       (gnus-registry-install-shortcuts): Populate and use it in a
+       `gnus-summary-menu-hook' lambda, under "Gnus"->"Registry Marks".
+
+2010-03-20  Martin Stjernholm  <mast@lysator.liu.se>
+
+       * nnimap.el (nnimap-decode-group-name, nnimap-encode-group-name):
+       In-place substitutions for the group name encoding/decoding.
+       (nnimap-find-minmax-uid, nnimap-possibly-change-group)
+       (nnimap-retrieve-headers-progress, nnimap-possibly-change-group)
+       (nnimap-retrieve-headers-progress, nnimap-request-article-part)
+       (nnimap-update-unseen, nnimap-request-list)
+       (nnimap-retrieve-groups, nnimap-request-update-info-internal)
+       (nnimap-request-set-mark, nnimap-split-to-groups)
+       (nnimap-split-articles, nnimap-request-newgroups)
+       (nnimap-request-create-group, nnimap-request-accept-article)
+       (nnimap-request-delete-group, nnimap-request-rename-group)
+       (nnimap-acl-get, nnimap-acl-edit): Use them.  Replace `mbx' with
+       `encoded-mbx' for consistency.
+       (nnimap-close-group): Call `imap-current-mailbox' instead of using the
+       variable `imap-current-mailbox'.
+
+       * gnus-agent.el (gnus-agent-fetch-articles, gnus-agent-fetch-headers)
+       (gnus-agent-regenerate-group): Use `gnus-agent-decoded-group-name'.
+
+2010-03-20  Bojan Petrovic  <bpetrovi@f.bg.ac.rs>
+
+       * pop3.el (pop3-display-message-size-flag): Display message size byte
+       counts during POP3 download.
+       (pop3-movemail): Use it.
+       (pop3-list): Implement listing of available messages.
+
+2010-03-20  Mark Triggs  <mst@dishevelled.net>  (tiny change)
+
+       * nnir.el (nnir-get-article-nov-override-function): New function to
+       override the normal NOV retrieval.
+       (nnir-retrieve-headers): Use it.
+
+2010-03-19  Michael Albinus  <michael.albinus@gmx.de>
+
+       * auth-source.el (netrc-machine-user-or-password): Autoload.
+
+2010-03-19  Glenn Morris  <rgm@gnu.org>
+
+       Stop message.el from loading about 40 libraries it doesn't always need.
+       The general approach is to autoload rather than require, and to
+       require in the specific functions rather than the file.  (Bug#5642)
+
+       * gmm-utils.el: Don't require wid-edit.
+       (widget-create-child-value, widget-convert, widget-default-get):
+       Autoload.
+
+       * gnus-util.el: Don't require time-date, netrc.
+       (message-fetch-field, gnus-group-name-decode): Declare rather than
+       autoloading.
+       (gnus-fetch-field): Require message.
+       (gnus-decode-newsgroups): Require gnus-group.
+
+       * ietf-drums.el: Don't require time-date.
+
+       * message.el: Don't require hashcash, canlock, ecomplete.
+       Do require mail-utils.  Require nnheader only when compiling.
+       (smtpmail-default-smtp-server): Remove declaration.
+       (message-send-mail-function): Check smtpmail-default-smtp-server
+       is bound rather than requiring smtpmail.
+       (message-auto-save-directory, message-insert-signature): Use
+       expand-file-name rather than nnheader-concat.
+       (nnheader-insert-file-contents): Autoload.
+       (hashcash-wait-async): Declare.
+       (message-send-mail): Only call gnus-setup-posting-charset if
+       gnus-group-posting-charset-alist is bound.  Require hashcash if needed.
+       (message-send-mail-with-sendmail): Require sendmail.
+       (canlock-password, canlock-password-for-verify): Declare.
+       (message-canlock-password): Require canlock.
+       (nnheader-get-report): Autoload.
+       (gnus-setup-posting-charset): Declare.
+       (message-send-news): Require gnus-msg.
+       (message-make-references, message-make-in-reply-to): Use mail-header-id
+       rather than the alias mail-header-message-id.
+       (ecomplete-add-item, ecomplete-save): Declare.
+       (message-put-addresses-in-ecomplete): Require ecomplete.
+       (ecomplete-display-matches): Autoload.
+
+       * mm-decode.el: Don't require mailcap, gnus-util.
+       (gnus-map-function, gnus-replace-in-string, gnus-read-shell-command)
+       (message-fetch-field, mailcap-parse-mailcaps, mailcap-mime-info):
+       Autoload.
+       (mailcap-mime-extensions): Declare.
+
+       * mm-encode.el: Don't require mailcap.
+       (mailcap-extension-to-mime): Autoload.
+
+       * mml-sec.el: Don't require password-cache.
+
+       * mml.el (gnus-setup-posting-charset): Declare rather than autoload.
+       (mailcap-parse-mimetypes, mailcap-mime-types): Declare.
+       (mml-minibuffer-read-type): Require mailcap.
+       (mml-preview): Require gnus-msg.
+
+       * mml1991.el: Require password-cache.
+       (password-cache-expiry): Remove declaration.
+
+       * mml2015.el: Require password-cache.
+       (password-cache-expiry): Remove declaration.
+
+       * nneething.el (mailcap): Require mailcap.
+
+       * nnheader.el: (declare-function): Add compatibility stub.
+       (message-remove-header): Declare rather than autoload.
+       (nnheader-replace-header): Require message.
+
+       * nnimap.el (declare-function): Add compatibility stub.
+       (netrc-parse, netrc-machine-user-or-password): Declare.
+       (nnimap-open-connection): Require netrc.
+
+       * nntp.el (declare-function): Add compatibility stub.
+       (netrc-parse, netrc-machine, netrc-get): Declare.
+       (nntp-send-authinfo): Require netrc.
+
+       * rfc2047.el: Don't require qp.
+       (quoted-printable-encode-region, quoted-printable-decode-string):
+       Autoload.
+
+       * sieve-mode.el: Don't require easymenu.
+       (easy-menu-add-item): Autoload it.
+
+       * spam-stat.el (time-to-number-of-days): Autoload it.
+
+2010-03-17  Kevin Ryde  <user42@zip.com.au>
+
+       * mml.el (mml-read-tag): Unquote values with `read' to reverse
+       prin1 in mml-insert-tag (just stripping the quotes gave wrong
+       value if any backslash escapes).
+
+2010-03-15  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * mm-util.el (mm-charset-to-coding-system): Use coding-system-from-name
+       if it is available.  (bug#5647)
+
 2010-02-26  Glenn Morris  <rgm@gnu.org>
 
        * message.el (message-send-mail-function): Change the default, so that
index 284e6e911bdd3cce5adb6a5658756bf80e2a44d7..a5e323c03952f114fc40e41cdd7e57a572ca56ab 100644 (file)
 (require 'gnus-util)
 
 (eval-when-compile (require 'cl))
-(eval-when-compile (require 'netrc))
+(autoload 'netrc-machine-user-or-password "netrc")
+(autoload 'secrets-search-items "secrets")
+(autoload 'secrets-get-alias "secrets")
+(autoload 'secrets-get-attribute "secrets")
+(autoload 'secrets-get-secret "secrets")
 
 (defgroup auth-source nil
   "Authentication sources."
@@ -49,7 +53,7 @@
   "List of authentication protocols and their names"
 
   :group 'auth-source
-  :version "23.1" ;; No Gnus
+  :version "23.2" ;; No Gnus
   :type '(repeat :tag "Authentication Protocols"
                 (cons :tag "Protocol Entry"
                       (symbol :tag "Protocol")
@@ -57,6 +61,7 @@
                               (string :tag "Name")))))
 
 ;;; generate all the protocols in a format Customize can use
+;;; TODO: generate on the fly from auth-source-protocols
 (defconst auth-source-protocols-customize
   (mapcar (lambda (a)
            (let ((p (car-safe a)))
@@ -71,7 +76,7 @@
 (defcustom auth-source-do-cache t
   "Whether auth-source should cache information."
   :group 'auth-source
-  :version "23.1" ;; No Gnus
+  :version "23.2" ;; No Gnus
   :type `boolean)
 
 (defcustom auth-source-debug nil
@@ -85,8 +90,8 @@ If the value is t, debug messages are logged with `message'.
 If the value is a function, debug messages are logged by calling
  that function using the same arguments as `message'."
   :group 'auth-source
-  :version "23.1" ;; No Gnus
-  :type        `(choice 
+  :version "23.2" ;; No Gnus
+  :type        `(choice
          :tag "auth-source debugging mode"
          (const :tag "Log using `message' to the *Messages* buffer" t)
          (function :tag "Function that takes arguments like `message'")
@@ -96,29 +101,51 @@ If the value is a function, debug messages are logged by calling
   "Whether auth-source should hide passwords in log messages.
 Only relevant if `auth-source-debug' is not nil."
   :group 'auth-source
-  :version "23.1" ;; No Gnus
+  :version "23.2" ;; No Gnus
   :type `boolean)
 
-(defcustom auth-sources '((:source "~/.authinfo.gpg" :host t :protocol t))
+(defcustom auth-sources '((:source "~/.authinfo.gpg"))
   "List of authentication sources.
 
-Each entry is the authentication type with optional properties."
+The default will get login and password information from a .gpg
+file, which you should set up with the EPA/EPG packages to be
+encrypted.  See the auth.info manual for details.
+
+Each entry is the authentication type with optional properties.
+
+It's best to customize this with `M-x customize-variable' because the choices
+can get pretty complex."
   :group 'auth-source
-  :version "23.1" ;; No Gnus
+  :version "23.2" ;; No Gnus
   :type `(repeat :tag "Authentication Sources"
                 (list :tag "Source definition"
                       (const :format "" :value :source)
-                      (string :tag "Authentication Source")
-                      (const :format "" :value :host)
-                      (choice :tag "Host (machine) choice"
-                              (const :tag "Any" t)
-                              (regexp :tag "Host (machine) regular expression (TODO)")
-                              (const :tag "Fallback" nil))
-                      (const :format "" :value :protocol)
-                      (choice :tag "Protocol"
-                              (const :tag "Any" t)
-                              (const :tag "Fallback" nil)
-                              ,@auth-source-protocols-customize))))
+                      (choice :tag "Authentication backend choice"
+                              (string :tag "Authentication Source (file)")
+                              (list :tag "secrets.el (Secret Service API/KWallet/GNOME KeyRing)" 
+                                     (const :format "" :value :secrets)
+                                     (choice :tag "Collection to use"
+                                             (string :tag "Collection name")
+                                             (const :tag "Default" 'default)
+                                             (const :tag "Login" "login")
+                                             (const :tag "Temporary" "session"))))
+                      (repeat :tag "Extra Parameters" :inline t
+                              (choice :tag "Extra parameter"
+                                      (list :tag "Host (omit to match as a fallback)"
+                                            (const :format "" :value :host)
+                                            (choice :tag "Host (machine) choice"
+                                                    (const :tag "Any" t)
+                                                    (regexp :tag "Host (machine) regular expression")))
+                                      (list :tag "Protocol (omit to match as a fallback)"
+                                            (const :format "" :value :protocol)
+                                            (choice :tag "Protocol"
+                                                    (const :tag "Any" t)
+                                                    ,@auth-source-protocols-customize))
+                                      (list :tag "User  (omit to match as a fallback)" :inline t
+                                            (const :format "" :value :user)
+                                            (choice :tag "Personality or username"
+                                                    (const :tag "Any" t)
+                                                    (string :tag "Specific user name"))))))))
 
 ;; temp for debugging
 ;; (unintern 'auth-source-protocols)
@@ -129,7 +156,7 @@ Each entry is the authentication type with optional properties."
 ;; (customize-variable 'auth-source-protocols)
 ;; (setq auth-source-protocols nil)
 ;; (format "%S" auth-source-protocols)
-;; (auth-source-pick "a" 'imap)
+;; (auth-source-pick nil :host "a" :port 'imap)
 ;; (auth-source-user-or-password "login" "imap.myhost.com" 'imap)
 ;; (auth-source-user-or-password "password" "imap.myhost.com" 'imap)
 ;; (auth-source-user-or-password-imap "login" "imap.myhost.com")
@@ -145,31 +172,125 @@ Each entry is the authentication type with optional properties."
   ;; we also check the value
   (when auth-source-debug
     (let ((logger (if (functionp auth-source-debug)
-                     auth-source-debug 
+                     auth-source-debug
                    'message)))
       (apply logger msg))))
 
-(defun auth-source-pick (host protocol &optional fallback)
-  "Parse `auth-sources' for HOST, and PROTOCOL matches.
+;; (auth-source-pick nil :host "any" :protocol 'imap :user "joe")
+;; (auth-source-pick t :host "any" :protocol 'imap :user "joe")
+;; (setq auth-sources '((:source (:secrets default) :host t :protocol t :user "joe") 
+;;                  (:source (:secrets "session") :host t :protocol t :user "joe") 
+;;                  (:source (:secrets "login") :host t :protocol t)
+;;                  (:source "~/.authinfo.gpg" :host t :protocol t)))
+
+;; (setq auth-sources '((:source (:secrets default) :host t :protocol t :user "joe") 
+;;                  (:source (:secrets "session") :host t :protocol t :user "joe") 
+;;                  (:source (:secrets "login") :host t :protocol t)
+;;                  ))
+
+;; (setq auth-sources '((:source "~/.authinfo.gpg" :host t :protocol t)))
 
-Returns fallback choices (where PROTOCOL or HOST are nil) with FALLBACK t."
-  (interactive "sHost: \nsProtocol: \n") ;for testing
+(defun auth-source-pick (&rest spec)
+  "Parse `auth-sources' for matches of the SPEC plist.
+
+Common keys are :host, :protocol, and :user.  A value of t in
+SPEC means to always succeed in the match.  A string value is
+matched as a regex.
+
+The first pass skips fallback choices.  If no choices are found
+on the first pass, a second pass is made including the fallback
+choices.
+
+For string (filename) sources, fallback choices are those where
+PROTOCOL or HOST are nil.
+
+For secrets.el collections, the :host and :protocol keys are not
+checked for fallback choices."
   (let (choices)
-    (dolist (choice auth-sources)
-      (let ((h (plist-get choice :host))
-           (p (plist-get choice :protocol)))
-       (when (and
-              (or (equal t h)
-                  (and (stringp h) (string-match h host))
-                  (and fallback (equal h nil)))
-              (or (equal t p)
-                  (and (symbolp p) (equal p protocol))
-                  (and fallback (equal p nil))))
-         (push choice choices))))
-    (if choices
-       choices
-      (unless fallback
-       (auth-source-pick host protocol t)))))
+    (dolist (fallback '(nil t))
+      (let ((keys (loop for i below (length spec) by 2
+                       collect (nth i spec)))
+           (default-session-fallback "login"))
+       (dolist (choice auth-sources)
+         (let* ((s (plist-get choice :source))
+                ;; this is only set for Secret Service API specs (see secrets.el)
+                (coll (and (consp s) (plist-get s :secrets)))
+                (score 0))
+           (cond
+            (coll                              ; use secrets.el here
+             (when (eq coll 'default)
+               (setq coll (secrets-get-alias "default"))
+               (unless coll 
+                 (auth-source-do-debug
+                  "No 'default' alias.  Trying collection '%s'."
+                  default-session-fallback)
+                 (setq coll default-session-fallback)))
+             (let* ((coll-search (cond
+                                  ((stringp coll) coll)
+                                  
+                                  ;; when the collection is nil:
+                                  ;; in fallback mode, accept it as any
+                                  ;; otherwise, hope to fail
+                                  ((null coll) (if fallback
+                                                   nil
+                                                 " *fallback-fail*"))))
+                    ;; assemble a search query for secrets-search-items
+                    ;; in fallback mode, host and protocol are not checked
+                    (other-search (loop for k
+                                        in (if fallback
+                                               (remove :host 
+                                                       (remove :protocol keys))
+                                             keys)
+                                        append (list
+                                                k
+                                                ;; convert symbols to a string
+                                                (let ((v (plist-get spec k)))
+                                                  (if (stringp v)
+                                                      v
+                                                    (prin1-to-string v))))))
+                    ;; the score is based on how exact the search was, 
+                    ;; plus base score = 1 for any match
+                    (score (1+ (length other-search)))
+                    (results (apply 'secrets-search-items
+                                    coll-search
+                                    other-search)))
+               (auth-source-do-debug
+                "auth-source-pick: got items %s in collection '%s' + %s"
+                results coll-search other-search)
+               ;; put the results in the choices variable
+               (dolist (result results)
+                 (setq choices (cons (list score
+                                           `(:source secrets
+                                                     :item ,result
+                                                     :collection ,coll
+                                                     :search ,coll-search
+                                                     ,@other-search))
+                                     choices)))))
+            ;; this is any non-secrets spec (currently means a string filename)
+            (t
+             (let ((match t))
+               (dolist (k keys)
+                 (let* ((v (plist-get spec k))
+                        (choicev (plist-get choice k)))
+                   (setq match
+                         (and match
+                              (or (eq t choicev) ; source always matches spec key
+                                  ;; source key gives regex to match against spec
+                                  (and (stringp choicev) (string-match choicev v))
+                                  ;; source key gives symbol to match against spec
+                                  (and (symbolp choicev) (eq choicev v))
+                                  ;; in fallback mode, missing source key is OK
+                                  fallback)))
+                   (when match (incf score)))) ; increment the score for each match
+
+               ;; now if the whole iteration resulted in a match:
+               (when match
+                 (setq choices (cons (list score choice) choices))))))))
+       ;; when there were matches, skip the second pass
+       (when choices (return choices))))
+
+      ;; return the results sorted by score
+      (mapcar 'cadr (sort choices (lambda (x y) (> (car x) (car y)))))))
 
 (defun auth-source-forget-user-or-password (mode host protocol)
   (interactive "slogin/password: \nsHost: \nsProtocol: \n") ;for testing
@@ -180,44 +301,81 @@ Returns fallback choices (where PROTOCOL or HOST are nil) with FALLBACK t."
   (interactive)
   (setq auth-source-cache (make-hash-table :test 'equal)))
 
-(defun auth-source-user-or-password (mode host protocol)
+;; (progn
+;;   (auth-source-forget-all-cached)
+;;   (list
+;;    (auth-source-user-or-password '("login" "password") "imap.myhost.com" "other")
+;;    (auth-source-user-or-password '("login" "password") "imap.myhost.com" "other" "tzz")
+;;    (auth-source-user-or-password '("login" "password") "imap.myhost.com" "other" "joe")))
+
+(defun auth-source-user-or-password (mode host protocol &optional username)
   "Find MODE (string or list of strings) matching HOST and PROTOCOL.
+
+USERNAME is optional and will be used as \"login\" in a search
+across the Secret Service API (see secrets.el) if the resulting
+items don't have a username.  This means that if you search for
+username \"joe\" and it matches an item but the item doesn't have
+a :user attribute, the username \"joe\" will be returned.
+
 MODE can be \"login\" or \"password\" for example."
   (auth-source-do-debug
-   "auth-source-user-or-password: get %s for %s (%s)"
-   mode host protocol)
+   "auth-source-user-or-password: get %s for %s (%s) + user=%s"
+   mode host protocol username)
   (let* ((listy (listp mode))
         (mode (if listy mode (list mode)))
-        (cname (format "%s %s:%s" mode host protocol))
+        (extras (when username `(:user ,username)))
+        (cname (format "%s %s:%s %s" mode host protocol extras))
+        (search (list :host host :protocol protocol))
+        (search (if username (append search (list :user username)) search))
         (found (gethash cname auth-source-cache)))
     (if found
        (progn
          (auth-source-do-debug
-          "auth-source-user-or-password: cached %s=%s for %s (%s)"
+          "auth-source-user-or-password: cached %s=%s for %s (%s) + %s"
           mode
           ;; don't show the password
-          (if (and (member "password" mode) auth-source-hide-passwords) "SECRET" found)
-          host protocol)
-         found)
-      (dolist (choice (auth-source-pick host protocol))
-       (setq found (netrc-machine-user-or-password
-                    mode
-                    (plist-get choice :source)
-                    (list host)
-                    (list (format "%s" protocol))
-                    (auth-source-protocol-defaults protocol)))
+          (if (and (member "password" mode) auth-source-hide-passwords)
+              "SECRET"
+            found)
+          host protocol extras)
+         found)                        ; return the found data
+      ;; else, if not found
+      (dolist (choice (apply 'auth-source-pick search))
+       (setq found (cond
+                    ;; the secrets.el spec
+                    ((eq (plist-get choice :source) 'secrets)
+                     (let ((coll (plist-get choice :search))
+                           (item (plist-get choice :item)))
+                       (mapcar (lambda (m)
+                                 (if (equal "password" m)
+                                     (secrets-get-secret coll item)
+                                   ;; the user name is either
+                                   (or
+                                    ;; the secret's attribute :user, or
+                                    (secrets-get-attribute coll item :user)
+                                    ;; the originally requested :user
+                                    username
+                                    "unknown-user")))
+                               mode)))
+                    (t         ; anything else is netrc
+                     (netrc-machine-user-or-password
+                      mode
+                      (plist-get choice :source)
+                      (list host)
+                      (list (format "%s" protocol))
+                      (auth-source-protocol-defaults protocol)))))
        (when found
          (auth-source-do-debug
-          "auth-source-user-or-password: found %s=%s for %s (%s)"
+          "auth-source-user-or-password: found %s=%s for %s (%s) + %s"
           mode
           ;; don't show the password
           (if (and (member "password" mode) auth-source-hide-passwords) "SECRET" found)
-          host protocol)
+          host protocol extras)
          (setq found (if listy found (car-safe found)))
          (when auth-source-do-cache
            (puthash cname found auth-source-cache)))
        (return found)))))
-
+  
 (defun auth-source-protocol-defaults (protocol)
   "Return a list of default ports and names for PROTOCOL."
   (cdr-safe (assoc protocol auth-source-protocols)))
index b44d3c08c4aa55fb0dc7b1a2b8960ff9788eef1a..640eb50a0229d76adf74838f8f1bdad08b1846c4 100644 (file)
@@ -28,8 +28,6 @@
 
 ;;; Code:
 
-(require 'wid-edit)
-
 (defgroup gmm nil
   "Utility functions for Gnus, Message and MML."
   :prefix "gmm-"
@@ -95,6 +93,10 @@ ARGS are passed to `message'."
   "Non-nil if SYMBOL is a widget."
   (get symbol 'widget-type))
 
+(autoload 'widget-create-child-value "wid-edit")
+(autoload 'widget-convert "wid-edit")
+(autoload 'widget-default-get "wid-edit")
+
 ;; Copy of the `nnmail-lazy' code from `nnmail.el':
 (define-widget 'gmm-lazy 'default
   "Base widget for recursive datastructures.
index f385c71069bcf03bbd101e58488c39379ca7e34d..17f1d0cdb1fd34828551f285acdcca273ffb77a7 100644 (file)
@@ -1583,7 +1583,8 @@ downloaded into the agent."
           (setq selected-sets (nreverse selected-sets))
 
           (gnus-make-directory dir)
-          (gnus-message 7 "Fetching articles for %s..." group)
+         (gnus-message 7 "Fetching articles for %s..."
+                       (gnus-agent-decoded-group-name group))
 
           (unwind-protect
               (while (setq articles (pop selected-sets))
@@ -1594,7 +1595,8 @@ downloaded into the agent."
                     (let (article)
                       (while (setq article (pop articles))
                         (gnus-message 10 "Fetching article %s for %s..."
-                                      article group)
+                                     article
+                                     (gnus-agent-decoded-group-name group))
                         (when (or
                                (gnus-backlog-request-article group article
                                                              nntp-server-buffer)
@@ -1942,7 +1944,8 @@ article numbers will be returned."
 
         (if articles
             (progn
-              (gnus-message 7 "Fetching headers for %s..." group)
+             (gnus-message 7 "Fetching headers for %s..."
+                           (gnus-agent-decoded-group-name group))
 
               ;; Fetch them.
               (gnus-make-directory (nnheader-translate-file-chars
@@ -3904,7 +3907,7 @@ If REREAD is not nil, downloaded articles are marked as unread."
                     (sit-for 1)
                     t)))))
   (when group
-    (gnus-message 5 "Regenerating in %s" group)
+    (gnus-message 5 "Regenerating in %s" (gnus-agent-decoded-group-name group))
     (let* ((gnus-command-method (or gnus-command-method
                                    (gnus-find-method-for-group group)))
           (file (gnus-agent-article-name ".overview" group))
@@ -3981,7 +3984,8 @@ If REREAD is not nil, downloaded articles are marked as unread."
                      (or (not nov-arts)
                          (> (car downloaded) (car nov-arts))))
                 ;; This entry is missing from the overview file
-                (gnus-message 3 "Regenerating NOV %s %d..." group
+                (gnus-message 3 "Regenerating NOV %s %d..."
+                              (gnus-agent-decoded-group-name group)
                               (car downloaded))
                 (let ((file (concat dir (number-to-string (car downloaded)))))
                   (mm-with-unibyte-buffer
index 1a66404f841037e0d09c00b29c2795a8b14a5596..086eb47d76cdcf4630bec8f5ea3359c8c8b1c6ec 100644 (file)
@@ -2819,12 +2819,43 @@ summary buffer."
                     ;; `how' is neither `nil', `ask' nor `t' (i.e. `file'):
                     (gnus-y-or-n-p
                      (format "Delete temporary HTML file `%s'? " file))))
-       (delete-file file)))
+       (if (file-directory-p file)
+           (gnus-delete-directory file)
+         (delete-file file))))
     ;; Also remove file from the list when not deleted or if file doesn't
     ;; exist anymore.
     (setq gnus-article-browse-html-temp-list nil))
   gnus-article-browse-html-temp-list)
 
+(defun gnus-article-browse-html-save-cid-image (cid dir)
+  "Save CID contents to a file in DIR.  Return file name."
+  (save-match-data
+    (gnus-with-article-buffer
+      (let (cid-handle cid-tmp-file cid-type)
+       (mapc
+        (lambda (handle)
+          (when (and (listp handle)
+                     (stringp (car (last handle)))
+                     (string= (format "<%s>" cid)
+                              (car (last handle))))
+            (setq cid-handle handle)
+            (setq cid-tmp-file
+                  (expand-file-name
+                   (or (mail-content-type-get
+                        (mm-handle-disposition handle) 'filename)
+                       (mail-content-type-get
+                        (setq cid-type (mm-handle-type handle)) 'name)
+                       (concat (make-temp-name "cid")
+                               (or (car (rassoc (car cid-type)
+                                                mailcap-mime-extensions))
+                                   "")))
+                   dir))))
+        gnus-article-mime-handles)
+       (when (and cid-handle cid-tmp-file)
+         (mm-save-part-to-file cid-handle
+                               cid-tmp-file)
+         (concat "file://" cid-tmp-file))))))
+
 (defun gnus-article-browse-html-parts (list &optional header)
   "View all \"text/html\" parts from LIST.
 Recurse into multiparts.  The optional HEADER that should be a decoded
@@ -2862,7 +2893,8 @@ message header will be added to the bodies of the \"text/html\" parts."
             ;; Add a meta html tag to specify charset and a header.
             (cond
              (header
-              (let (title eheader body hcharset coding)
+              (let (title eheader body hcharset coding force-charset
+                          cid-image-dir)
                 (with-temp-buffer
                   (mm-enable-multibyte)
                   (setq case-fold-search t)
@@ -2886,7 +2918,8 @@ message header will be added to the bodies of the \"text/html\" parts."
                             title (when title
                                     (mm-encode-coding-string title charset))
                             body (mm-encode-coding-string (mm-get-part handle)
-                                                          charset))
+                                                          charset)
+                            force-charset t)
                     (setq hcharset (mm-find-mime-charset-region (point-min)
                                                                 (point-max)))
                     (cond ((= (length hcharset) 1)
@@ -2917,7 +2950,8 @@ message header will be added to the bodies of the \"text/html\" parts."
                                       body (mm-encode-coding-string
                                             (mm-decode-coding-string
                                              (mm-get-part handle) body)
-                                            charset))))
+                                            charset)
+                                      force-charset t)))
                           (setq charset hcharset
                                 eheader (mm-encode-coding-string
                                          (buffer-string) coding)
@@ -2931,7 +2965,7 @@ message header will be added to the bodies of the \"text/html\" parts."
                   (mm-disable-multibyte)
                   (insert body)
                   (when charset
-                    (mm-add-meta-html-tag handle charset))
+                    (mm-add-meta-html-tag handle charset force-charset))
                   (when title
                     (goto-char (point-min))
                     (unless (search-forward "<title>" nil t)
@@ -2943,6 +2977,18 @@ message header will be added to the bodies of the \"text/html\" parts."
                       (re-search-forward
                        "</head\\(?:\\s-+[^>]+\\|\\s-*\\)>\\s-*" nil t))
                   (insert eheader)
+                  ;; resolve cid images
+                  (while (re-search-forward
+                          "<img src=\"\\(cid:\\([^\"]+\\)\\)\""
+                          nil t)
+                    (unless cid-image-dir
+                      (setq cid-image-dir (make-temp-file "cid" t))
+                      (add-to-list 'gnus-article-browse-html-temp-list
+                                   cid-image-dir))
+                    (replace-match
+                     (gnus-article-browse-html-save-cid-image
+                      (match-string 2) cid-image-dir)
+                     nil nil nil 1))
                   (mm-write-region (point-min) (point-max)
                                    tmp-file nil nil nil 'binary t))))
              (charset
@@ -4192,6 +4238,8 @@ If variable `gnus-use-long-file-name' is non-nil, it is
                  (put-text-property (match-end 0) (point-max)
                                     'face eface)))))))))
 
+(autoload 'canlock-verify "canlock" nil t) ;; for Emacs 21.
+
 (defun article-verify-cancel-lock ()
   "Verify Cancel-Lock header."
   (interactive)
index e77b66e150d54a51879df4591359e4e262145af6..db10440116bf80660f0456bc26e2a86e580f8955 100644 (file)
@@ -60,6 +60,7 @@
 (require 'gnus-sum)
 (require 'gnus-util)
 (require 'nnmail)
+(require 'easymenu)
 
 (defvar gnus-adaptive-word-syntax-table)
 
@@ -137,6 +138,10 @@ references.'"
                 (const :tag "Always Install" t)
                 (const :tag "Ask Me" ask)))
 
+(defvar gnus-summary-misc-menu) ;; Avoid byte compiler warning.
+
+(defvar gnus-registry-misc-menus nil)  ; ugly way to keep the menus
+
 (defcustom gnus-registry-clean-empty t
   "Whether the empty registry entries should be deleted.
 Registry entries are considered empty when they have no groups
@@ -764,7 +769,8 @@ FUNCTION should take two parameters, a mark symbol and the cell value."
   "Install the keyboard shortcuts and menus for the registry.
 Uses `gnus-registry-marks' to find what shortcuts to install."
   (let (keys-plist)
-    (gnus-registry-do-marks 
+    (setq gnus-registry-misc-menus nil)
+    (gnus-registry-do-marks
      :char
      (lambda (mark data)
        (let ((function-format
@@ -813,19 +819,34 @@ Uses `gnus-registry-marks' to find what shortcuts to install."
                    ;; all this just to get the mark, I must be doing it wrong
                    (intern ,(symbol-name mark))
                    articles ,remove t)
+                  (gnus-message
+                   9 
+                   "Applying mark %s to %d articles"
+                   ,(symbol-name mark) (length articles))
                   (dolist (article articles)
                     (gnus-summary-update-article 
-                     article 
+                     article
                      (assoc article (gnus-data-list nil)))))))
             (push (intern function-name) keys-plist)
-            (push shortcut keys-plist)
-            (gnus-message 
+            (push shortcut keys-plist)      
+            (push (vector (format "%s %s"
+                                  (upcase-initials variant-name)
+                                  (symbol-name mark))
+                          (intern function-name) t)
+                  gnus-registry-misc-menus)
+            (gnus-message
              9 
              "Defined mark handling function %s" 
              function-name))))))
     (gnus-define-keys-1
-     '(gnus-registry-mark-map "M" gnus-summary-mark-map) 
-     keys-plist)))
+     '(gnus-registry-mark-map "M" gnus-summary-mark-map)
+     keys-plist)
+    (add-hook 'gnus-summary-menu-hook
+             (lambda ()
+               (easy-menu-add-item 
+                gnus-summary-misc-menu
+                nil 
+                (cons "Registry Marks" gnus-registry-misc-menus))))))
 
 ;;; use like this:
 ;;; (defalias 'gnus-user-format-function-M 
index 2464b132839d5cf4394a951c9a1954c19b04beb4..608224e436d61d75d4bb45d001e89ff738e7fd9b 100644 (file)
@@ -2635,17 +2635,6 @@ gnus-summary-show-article-from-menu-as-charset-%s" cs))))
         ["Set expirable mark" gnus-summary-mark-as-expirable t]
         ["Set bookmark" gnus-summary-set-bookmark t]
         ["Remove bookmark" gnus-summary-remove-bookmark t])
-       ("Registry Mark"
-        ["Important"     gnus-registry-set-article-Important-mark    t]
-        ["Not Important" gnus-registry-remove-article-Important-mark t]
-        ["Work"          gnus-registry-set-article-Work-mark         t]
-        ["Not Work"      gnus-registry-remove-article-Work-mark      t]
-        ["Later"         gnus-registry-set-article-Later-mark        t]
-        ["Not Later"     gnus-registry-remove-article-Later-mark     t]
-        ["Personal"      gnus-registry-set-article-Personal-mark     t]
-        ["Not Personal"  gnus-registry-remove-article-Personal-mark  t]
-        ["To Do"         gnus-registry-set-article-To-Do-mark        t]
-        ["Not To Do"     gnus-registry-remove-article-To-Do-mark     t])
        ("Limit to"
         ["Marks..." gnus-summary-limit-to-marks t]
         ["Subject..." gnus-summary-limit-to-subject t]
@@ -2691,6 +2680,7 @@ gnus-summary-show-article-from-menu-as-charset-%s" cs))))
           gnus-newsgroup-process-stack]
          ["Save" gnus-summary-save-process-mark t]
          ["Run command on marked..." gnus-summary-universal-argument t]))
+       ("Registry Marks")
        ("Scroll article"
         ["Page forward" gnus-summary-next-page
          ,@(if (featurep 'xemacs) '(t)
index d101047280cbc28593e2ad522ca7abc8803e1975..f011cda31a4e193e00a7711d08ae6b1a9ce3ce76 100644 (file)
 (defvar gnus-original-article-buffer)
 (defvar gnus-user-agent)
 
-(require 'time-date)
-(require 'netrc)
-
-(autoload 'message-fetch-field "message")
 (autoload 'gnus-get-buffer-window "gnus-win")
 (autoload 'nnheader-narrow-to-headers "nnheader")
 (autoload 'nnheader-replace-chars-in-string "nnheader")
@@ -206,8 +202,11 @@ Uses `gnus-extract-address-components'."
 Uses `gnus-extract-address-components'."
   (nth 1 (gnus-extract-address-components from)))
 
+(declare-function message-fetch-field "message" (header &optional not-all))
+
 (defun gnus-fetch-field (field)
   "Return the value of the header FIELD of current article."
+  (require 'message)
   (save-excursion
     (save-restriction
       (let ((inhibit-point-motion-hooks t))
@@ -228,13 +227,14 @@ Uses `gnus-extract-address-components'."
                   (point)))))
 
 (declare-function gnus-find-method-for-group "gnus" (group &optional info))
-(autoload 'gnus-group-name-decode "gnus-group")
+(declare-function gnus-group-name-decode "gnus-group" (string charset))
 (declare-function gnus-group-name-charset "gnus-group" (method group))
 ;; gnus-group requires gnus-int which requires message.
 (declare-function message-tokenize-header "message"
                   (header &optional separator))
 
 (defun gnus-decode-newsgroups (newsgroups group &optional method)
+  (require 'gnus-group)
   (let ((method (or method (gnus-find-method-for-group group))))
     (mapconcat (lambda (group)
                 (gnus-group-name-decode group (gnus-group-name-charset
index 87012405ef9d4aa78086720c93d8a8cb9242086b..ffcb6fa60e0490b52f9226d6d66a4edde223ccdc 100644 (file)
@@ -39,7 +39,6 @@
 ;;; Code:
 
 (eval-when-compile (require 'cl))
-(require 'time-date)
 (require 'mm-util)
 
 (defvar ietf-drums-no-ws-ctl-token "\001-\010\013\014\016-\037\177"
index 44edd70363809612dbdafc50055a653b64e377c7..46f9169a6a3d467328660dc1041d175cc22d9945 100644 (file)
@@ -1,7 +1,7 @@
 ;;; mail-source.el --- functions for fetching mail
 
-;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004,
-;;   2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+;;   2008, 2009, 2010  Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 ;; Keywords: news, mail
@@ -574,10 +574,13 @@ Return the number of files that were found."
                      (error "Cannot get new mail"))
                    0)))))))))
 
+(declare-function gnus-message "gnus-util" (level &rest args))
+
 (defun mail-source-delete-old-incoming (&optional age confirm)
   "Remove incoming files older than AGE days.
 If CONFIRM is non-nil, ask for confirmation before removing a file."
   (interactive "P")
+  (require 'gnus-util)
   (let* ((high2days (/ 65536.0 60 60 24));; convert high bits to days
         (low2days  (/ 1.0 65536.0))     ;; convert low bits to days
         (diff (if (natnump age) age 30));; fallback, if no valid AGE given
index 27266f8aec14f59bebff9d2aa5c66ebd1a2e377f..7a96d2480b431ce80cbfd64d80c9261043d67774 100644 (file)
 (eval-when-compile
   (require 'cl))
 
-(require 'hashcash)
-(require 'canlock)
 (require 'mailheader)
 (require 'gmm-utils)
-(require 'nnheader)
+(require 'mail-utils)
+;; Only for the trivial macros mail-header-from, mail-header-date
+;; mail-header-references, mail-header-subject, mail-header-id
+(eval-when-compile (require 'nnheader))
 ;; This is apparently necessary even though things are autoloaded.
 ;; Because we dynamically bind mail-abbrev-mode-regexp, we'd better
 ;; require mailabbrev here.
@@ -48,7 +49,6 @@
 (require 'mail-parse)
 (require 'mml)
 (require 'rfc822)
-(require 'ecomplete)
 
 (autoload 'mailclient-send-it "mailclient") ;; Emacs 22 or contrib/
 
@@ -655,8 +655,6 @@ Done before generating the new subject of a forward."
   :link '(custom-manual "(message)Canceling News")
   :type 'string)
 
-(defvar smtpmail-default-smtp-server)
-
 (defun message-send-mail-function ()
   "Return suitable value for the variable `message-send-mail-function'."
   (cond ((and (require 'sendmail)
@@ -665,14 +663,13 @@ Done before generating the new subject of a forward."
              (executable-find sendmail-program))
         'message-send-mail-with-sendmail)
        ((and (locate-library "smtpmail")
-             (require 'smtpmail)
+             (boundp 'smtpmail-default-smtp-server)
              smtpmail-default-smtp-server)
         'message-smtpmail-send-it)
        ((locate-library "mailclient")
         'message-send-mail-with-mailclient)
        (t
-        (lambda ()
-          (error "Don't know how to send mail.  Please customize `message-send-mail-function'")))))
+        (error "Don't know how to send mail.  Please customize `message-send-mail-function'"))))
 
 ;; Useful to set in site-init.el
 (defcustom message-send-mail-function
@@ -1280,7 +1277,7 @@ text and it replaces `self-insert-command' with the other command, e.g.
   :type '(repeat function))
 
 (defcustom message-auto-save-directory
-  (file-name-as-directory (nnheader-concat message-directory "drafts"))
+  (file-name-as-directory (expand-file-name "drafts" message-directory))
   "*Directory where Message auto-saves buffers if Gnus isn't running.
 If nil, Message won't auto-save."
   :group 'message-buffers
@@ -1956,6 +1953,8 @@ is used by default."
                 (setq paren nil))))
        (nreverse elems)))))
 
+(autoload 'nnheader-insert-file-contents "nnheader")
+
 (defun message-mail-file-mbox-p (file)
   "Say whether FILE looks like a Unix mbox file."
   (when (and (file-exists-p file)
@@ -2849,6 +2848,8 @@ See also `message-forbidden-properties'."
          (inhibit-read-only t))
       (remove-text-properties begin end message-forbidden-properties))))
 
+(autoload 'ecomplete-setup "ecomplete") ;; for Emacs <23.
+
 ;;;###autoload
 (define-derived-mode message-mode text-mode "Message"
   "Major mode for editing mail and news to be sent.
@@ -3408,8 +3409,8 @@ Message buffers and is not meant to be called directly."
                                ;; if message-signature-file contains a path.
                                (not (file-name-directory
                                      message-signature-file)))
-                          (nnheader-concat message-signature-directory
-                                           message-signature-file)
+                          (expand-file-name message-signature-file
+                                            message-signature-directory)
                         message-signature-file))
                 (file-exists-p signature-file))))
     (when signature
@@ -4412,6 +4413,8 @@ This function could be useful in `message-setup-hook'."
            (erase-buffer)))
       (kill-buffer tembuf))))
 
+(declare-function hashcash-wait-async "hashcash" (&optional buffer))
+
 (defun message-send-mail (&optional arg)
   (require 'mail-utils)
   (let* ((tembuf (message-generate-new-buffer-clone-locals " message temp"))
@@ -4419,14 +4422,26 @@ This function could be useful in `message-setup-hook'."
         (news (message-news-p))
         (mailbuf (current-buffer))
         (message-this-is-mail t)
+        ;; gnus-setup-posting-charset is autoloaded in mml.el (FIXME
+        ;; maybe it should not be), which this file requires.  Hence
+        ;; the fboundp test is always true.  Loading it from gnus-msg
+        ;; loads many Gnus files (Bug#5642).  If
+        ;; gnus-group-posting-charset-alist hasn't been customized,
+        ;; this is just going to return nil anyway.  FIXME it would
+        ;; be good to improve this further, because even if g-g-p-c-a
+        ;; has been customized, that is likely to just be for news.
+        ;; Eg either move the definition from gnus-msg, or separate out
+        ;; the mail and news parts.
         (message-posting-charset
-         (if (fboundp 'gnus-setup-posting-charset)
+         (if (and (fboundp 'gnus-setup-posting-charset)
+                  (boundp 'gnus-group-posting-charset-alist))
              (gnus-setup-posting-charset nil)
            message-posting-charset))
         (headers message-required-mail-headers))
     (when (and message-generate-hashcash
               (not (eq message-generate-hashcash 'opportunistic)))
       (message "Generating hashcash...")
+      (require 'hashcash)
       ;; Wait for calculations already started to finish...
       (hashcash-wait-async)
       ;; ...and do calculations not already done.  mail-add-payment
@@ -4548,6 +4563,7 @@ If you always want Gnus to send messages in one piece, set
 
 (defun message-send-mail-with-sendmail ()
   "Send off the prepared buffer with sendmail."
+  (require 'sendmail)
   (let ((errbuf (if message-interactive
                    (message-generate-new-buffer-clone-locals
                     " sendmail errors")
@@ -4711,10 +4727,14 @@ Do not use this for anything important, it is cryptographically weak."
                  (prin1-to-string (recent-keys))
                  (prin1-to-string (garbage-collect))))))
 
+(defvar canlock-password)
+(defvar canlock-password-for-verify)
+
 (defun message-canlock-password ()
   "The password used by message for cancel locks.
 This is the value of `canlock-password', if that option is non-nil.
 Otherwise, generate and save a value for `canlock-password' first."
+  (require 'canlock)
   (unless canlock-password
     (customize-save-variable 'canlock-password (message-canlock-generate))
     (setq canlock-password-for-verify canlock-password))
@@ -4725,7 +4745,12 @@ Otherwise, generate and save a value for `canlock-password' first."
     (message-canlock-password)
     (canlock-insert-header)))
 
+(autoload 'nnheader-get-report "nnheader")
+
+(declare-function gnus-setup-posting-charset "gnus-msg" (group))
+
 (defun message-send-news (&optional arg)
+  (require 'gnus-msg)
   (let* ((tembuf (message-generate-new-buffer-clone-locals " *message temp*"))
         (case-fold-search nil)
         (method (if (functionp message-post-method)
@@ -5464,7 +5489,7 @@ In posting styles use `(\"Expires\" (make-expires-date 30))'."
 (defun message-make-references ()
   "Return the References header for this message."
   (when message-reply-headers
-    (let ((message-id (mail-header-message-id message-reply-headers))
+    (let ((message-id (mail-header-id message-reply-headers))
          (references (mail-header-references message-reply-headers)))
       (if (or references message-id)
          (concat (or references "") (and references " ")
@@ -5476,7 +5501,7 @@ In posting styles use `(\"Expires\" (make-expires-date 30))'."
   (when message-reply-headers
     (let ((from (mail-header-from message-reply-headers))
          (date (mail-header-date message-reply-headers))
-         (msg-id (mail-header-message-id message-reply-headers)))
+         (msg-id (mail-header-id message-reply-headers)))
       (when from
        (let ((name (mail-extract-address-components from)))
          (concat
@@ -8001,7 +8026,11 @@ From headers in the original article."
        (not result)
       result)))
 
+(declare-function ecomplete-add-item "ecomplete" (type key text))
+(declare-function ecomplete-save "ecomplete" ())
+
 (defun message-put-addresses-in-ecomplete ()
+  (require 'ecomplete)
   (dolist (header '("to" "cc" "from" "reply-to"))
     (let ((value (message-field-value header)))
       (dolist (string (mail-header-parse-addresses value 'raw))
@@ -8012,6 +8041,8 @@ From headers in the original article."
                            string))))
   (ecomplete-save))
 
+(autoload 'ecomplete-display-matches "ecomplete")
+
 (defun message-display-abbrev (&optional choose)
   "Display the next possible abbrev for the text before point."
   (interactive (list t))
index ac05362ec0ce08abf3b04331447e3766c5967bec..171afac31ffec210a92525eee0943a5fd96c7d65 100644 (file)
   (unless (fboundp 'declare-function) (defmacro declare-function (&rest r))))
 
 (require 'mail-parse)
-(require 'mailcap)
 (require 'mm-bodies)
-(require 'gnus-util)
 (eval-when-compile (require 'cl)
                   (require 'term))
 
+(autoload 'gnus-map-function "gnus-util")
+(autoload 'gnus-replace-in-string "gnus-util")
+(autoload 'gnus-read-shell-command "gnus-util")
+
 (autoload 'mm-inline-partial "mm-partial")
 (autoload 'mm-inline-external-body "mm-extern")
 (autoload 'mm-extern-cache-contents "mm-extern")
@@ -550,6 +552,8 @@ Postpone undisplaying of viewers for types in
     (message "Destroying external MIME viewers")
     (mm-destroy-parts mm-postponed-undisplay-list)))
 
+(autoload 'message-fetch-field "message")
+
 (defun mm-dissect-buffer (&optional no-strict-mime loose-mime from)
   "Dissect the current buffer and return a list of MIME handles."
   (save-excursion
@@ -688,6 +692,9 @@ Postpone undisplaying of viewers for types in
          (goto-char (point-max)))
       (mapcar 'mm-display-parts handle))))
 
+(autoload 'mailcap-parse-mailcaps "mailcap")
+(autoload 'mailcap-mime-info "mailcap")
+
 (defun mm-display-part (handle &optional no-default)
   "Display the MIME part represented by HANDLE.
 Returns nil if the part is removed; inline if displayed inline;
@@ -747,6 +754,7 @@ external if displayed external."
                 handle 'mailcap-save-binary-file)))))))))
 
 (declare-function gnus-configure-windows "gnus-win" (setting &optional force))
+(defvar mailcap-mime-extensions)       ; mailcap-mime-info autoloads
 
 (defun mm-display-external (handle method)
   "Display HANDLE using METHOD."
@@ -1250,11 +1258,11 @@ PROMPT overrides the default one used to ask user for a file name."
           (mm-save-part-to-file handle file)
           file))))
 
-(defun mm-add-meta-html-tag (handle &optional charset)
+(defun mm-add-meta-html-tag (handle &optional charset force-charset)
   "Add meta html tag to specify CHARSET of HANDLE in the current buffer.
 CHARSET defaults to the one HANDLE specifies.  Existing meta tag that
-specifies charset will not be modified.  Return t if meta tag is added
-or replaced."
+specifies charset will not be modified unless FORCE-CHARSET is non-nil.
+Return t if meta tag is added or replaced."
   (when (equal (mm-handle-media-type handle) "text/html")
     (when (or charset
              (setq charset (mail-content-type-get (mm-handle-type handle)
@@ -1266,7 +1274,8 @@ or replaced."
        (if (re-search-forward "\
 <meta\\s-+http-equiv=[\"']?content-type[\"']?\\s-+content=[\"']\
 text/\\(\\sw+\\)\\(?:\;\\s-*charset=\\(.+\\)\\)?[\"'][^>]*>" nil t)
-           (if (and (match-beginning 2)
+           (if (and (not force-charset)
+                    (match-beginning 2)
                     (string-match "\\`html\\'" (match-string 1)))
                ;; Don't modify existing meta tag.
                nil
index a32927b8ae38c11587d72a2d998a3523a91abd2b..0d609e56cbbb7277c49d910766a2a85d299bf351 100644 (file)
@@ -26,7 +26,7 @@
 
 (eval-when-compile (require 'cl))
 (require 'mail-parse)
-(require 'mailcap)
+(autoload 'mailcap-extension-to-mime "mailcap")
 (autoload 'mm-body-7-or-8 "mm-bodies")
 (autoload 'mm-long-lines-p "mm-bodies")
 
index 8dc232e757297739c116bc9c65a6b441ef99d692..aa2be153b0f95f0d1e7adc1be594c2ba81582249 100644 (file)
@@ -566,6 +566,9 @@ is not available."
 ;;;     (eq charset (coding-system-get charset 'mime-charset))
         )
     charset)
+   ;; Use coding system Emacs knows.
+   ((and (fboundp 'coding-system-from-name)
+        (coding-system-from-name charset)))
    ;; Eval expressions from `mm-charset-eval-alist'
    ((let* ((el (assq charset mm-charset-eval-alist))
           (cs (car el))
index 98142298c0481ee409531b4f13fae8be8ee9dde4..35155b89ac2e00638d588446d02a191e982dfb2e 100644 (file)
 
 (eval-when-compile (require 'cl))
 
-(if (locate-library "password-cache")
-    (require 'password-cache)
-  (require 'password))
-
 (autoload 'mml2015-sign "mml2015")
 (autoload 'mml2015-encrypt "mml2015")
 (autoload 'mml1991-sign "mml1991")
@@ -109,12 +105,18 @@ details."
   :group 'message
   :type 'boolean)
 
-(defcustom mml-secure-cache-passphrase password-cache
+(defcustom mml-secure-cache-passphrase
+  (if (boundp 'password-cache)
+      password-cache
+    t)
   "If t, cache passphrase."
   :group 'message
   :type 'boolean)
 
-(defcustom mml-secure-passphrase-cache-expiry password-cache-expiry
+(defcustom mml-secure-passphrase-cache-expiry
+  (if (boundp 'password-cache-expiry)
+      password-cache-expiry
+    16)
   "How many seconds the passphrase is cached.
 Whether the passphrase is cached at all is controlled by
 `mml-secure-cache-passphrase'."
index 091a0ed90bd7b5e0cfa5f4c285835ab981f16f35..f262dc6b3cbdd4342342c43df171b52f8f5f9910 100644 (file)
@@ -35,7 +35,7 @@
 (eval-when-compile (require 'cl))
 
 (autoload 'message-make-message-id "message")
-(autoload 'gnus-setup-posting-charset "gnus-msg")
+(declare-function gnus-setup-posting-charset "gnus-msg" (group))
 (autoload 'gnus-make-local-hook "gnus-util")
 (autoload 'message-fetch-field "message")
 (autoload 'message-mark-active-p "message")
@@ -392,8 +392,8 @@ A message part needs to be split into %d charset parts.  Really send? "
       (skip-chars-forward "= \t\n")
       (setq val (buffer-substring-no-properties
                 (point) (progn (forward-sexp 1) (point))))
-      (when (string-match "^\"\\(.*\\)\"$" val)
-       (setq val (match-string 1 val)))
+      (when (string-match "\\`\"" val)
+       (setq val (read val))) ;; inverse of prin1 in mml-insert-tag
       (push (cons (intern elem) val) contents)
       (skip-chars-forward " \t\n"))
     (goto-char (match-end 0))
@@ -1173,7 +1173,11 @@ If not set, `default-directory' will be used."
       (error "Permission denied: %s" file))
     file))
 
+(declare-function mailcap-parse-mimetypes "mailcap" (&optional path force))
+(declare-function mailcap-mime-types "mailcap" ())
+
 (defun mml-minibuffer-read-type (name &optional default)
+  (require 'mailcap)
   (mailcap-parse-mimetypes)
   (let* ((default (or default
                      (mm-default-file-encoding name)
@@ -1445,6 +1449,7 @@ or the `pop-to-buffer' function."
   (setq mml-preview-buffer (generate-new-buffer
                            (concat (if raw "*Raw MIME preview of "
                                      "*MIME preview of ") (buffer-name))))
+  (require 'gnus-msg)                ; for gnus-setup-posting-charset
   (save-excursion
     (let* ((buf (current-buffer))
           (message-options message-options)
index c523dccc05564ec8995b6e5d70f57c364a4cb740..a3ada29fa66abe8118e719df12e1479f367fc8d7 100644 (file)
 
 ;; For Emacs < 22.2.
 (eval-and-compile
-  (unless (fboundp 'declare-function) (defmacro declare-function (&rest r))))
+  (unless (fboundp 'declare-function) (defmacro declare-function (&rest r)))
+
+  (if (locate-library "password-cache")
+      (require 'password-cache)
+    (require 'password)))
 
 (eval-when-compile
   (require 'cl)
@@ -329,7 +333,6 @@ Whether the passphrase is cached at all is controlled by
 ;; epg wrapper
 
 (defvar epg-user-id-alist)
-(defvar password-cache-expiry)
 
 (autoload 'epg-make-context "epg")
 (autoload 'epg-passphrase-callback-function "epg")
index 65cf1a8f426c840636c9bbf7c38e5860a653944d..6725709c04456d93ef038328d4d362c2e7ccdee2 100644 (file)
 
 ;; For Emacs < 22.2.
 (eval-and-compile
-  (unless (fboundp 'declare-function) (defmacro declare-function (&rest r))))
+  (unless (fboundp 'declare-function) (defmacro declare-function (&rest r)))
+
+  (if (locate-library "password-cache")
+      (require 'password-cache)
+    (require 'password)))
 
 (eval-when-compile (require 'cl))
 (require 'mm-decode)
@@ -986,8 +990,6 @@ Whether the passphrase is cached at all is controlled by
 (autoload 'epg-expand-group "epg-config")
 (autoload 'epa-select-keys "epa")
 
-(defvar password-cache-expiry)
-
 (defvar mml2015-epg-secret-key-id-list nil)
 
 (defun mml2015-epg-passphrase-callback (context key-id ignore)
index f92c47eba044b16a6b8bd619e404e3511fa076ce..2a80d867e5679386be01b257f51899f62602d598 100644 (file)
@@ -28,6 +28,7 @@
 
 (eval-when-compile (require 'cl))
 
+(require 'mailcap)
 (require 'nnheader)
 (require 'nnmail)
 (require 'nnoo)
index f3283022db9cd765429b270aa75190c51185663f..6a24f21efc1d2dcd91523132ce842668c6381686 100644 (file)
@@ -27,6 +27,8 @@
 
 ;;; Code:
 
+(eval-and-compile
+  (unless (fboundp 'declare-function) (defmacro declare-function (&rest r))))
 (eval-when-compile (require 'cl))
 
 (defvar nnmail-extra-headers)
@@ -121,7 +123,6 @@ on your system, you could say something like:
 
 (autoload 'nnmail-message-id "nnmail")
 (autoload 'mail-position-on-field "sendmail")
-(autoload 'message-remove-header "message")
 (autoload 'gnus-buffer-live-p "gnus-util")
 
 ;;; Header access macros.
@@ -662,8 +663,12 @@ the line could be found."
       ;; without inserting extra newline.
       (fill-region-as-paragraph begin (1+ (point))))))
 
+(declare-function message-remove-header "message"
+                 (header &optional is-regexp first reverse))
+
 (defun nnheader-replace-header (header new-value)
   "Remove HEADER and insert the NEW-VALUE."
+  (require 'message)
   (save-excursion
     (save-restriction
       (nnheader-narrow-to-headers)
index 6d97c060a9675cbeafcfceda1af8e269b88b7c1f..c76169cb2b7e23b72af4b18f3be82017cf33ee9a 100644 (file)
 
 ;;; Code:
 
+;; For Emacs < 22.2.
+(eval-and-compile
+  (unless (fboundp 'declare-function) (defmacro declare-function (&rest r))))
+
 (require 'imap)
 (require 'nnoo)
 (require 'nnmail)
@@ -497,6 +501,20 @@ See also `nnimap-log'."
 
 ;; Utility functions:
 
+(defsubst nnimap-decode-group-name (group)
+  (and group
+       (gnus-group-decoded-name group)))
+
+(defsubst nnimap-encode-group-name (group)
+  (and group
+       (mm-encode-coding-string group (gnus-group-name-charset nil group))))
+
+(defun nnimap-group-prefixed-name (group &optional server)
+  (gnus-group-prefixed-name group
+                           (gnus-server-to-method
+                            (format "nnimap:%s"
+                                    (or server nnimap-current-server)))))
+
 (defsubst nnimap-get-server-buffer (server)
   "Return buffer for SERVER, if nil use current server."
   (cadr (assoc (or server nnimap-current-server) nnimap-server-buffer-alist)))
@@ -517,9 +535,7 @@ If SERVER is nil, uses the current server."
 
 (defun nnimap-verify-uidvalidity (group server)
   "Verify stored uidvalidity match current one in GROUP on SERVER."
-  (let* ((gnusgroup (gnus-group-prefixed-name
-                    group (gnus-server-to-method
-                           (format "nnimap:%s" server))))
+  (let* ((gnusgroup (nnimap-group-prefixed-name group server))
         (new-uidvalidity (imap-mailbox-get 'uidvalidity))
         (old-uidvalidity (gnus-group-get-parameter gnusgroup 'uidvalidity))
         (dir (file-name-as-directory (expand-file-name nnimap-directory)))
@@ -540,10 +556,18 @@ If SERVER is nil, uses the current server."
     (if old-uidvalidity
        (if (not (equal old-uidvalidity new-uidvalidity))
            ;; uidvalidity clash
-           (gnus-delete-file file)
-         (gnus-group-set-parameter gnusgroup 'uidvalidity new-uidvalidity)
+           (progn
+             (gnus-group-set-parameter gnusgroup 'uidvalidity new-uidvalidity)
+             (gnus-group-remove-parameter gnusgroup 'imap-status)
+             (gnus-sethash (gnus-group-prefixed-name group server)
+                           nil nnimap-mailbox-info)
+             (gnus-delete-file file))
          t)
       (gnus-group-add-parameter gnusgroup (cons 'uidvalidity new-uidvalidity))
+      (gnus-group-remove-parameter gnusgroup 'imap-status)
+      (gnus-sethash                    ; Maybe not necessary here.
+       (gnus-group-prefixed-name group server)
+       nil nnimap-mailbox-info)
       t)))
 
 (defun nnimap-before-find-minmax-bugworkaround ()
@@ -559,36 +583,39 @@ If SERVER is nil, uses the current server."
   "Find lowest and highest active article number in GROUP.
 If EXAMINE is non-nil the group is selected read-only."
   (with-current-buffer nnimap-server-buffer
-    (when (or (string= group (imap-current-mailbox))
-             (imap-mailbox-select group examine))
-      (let (minuid maxuid)
-       (when (> (imap-mailbox-get 'exists) 0)
-         (imap-fetch-safe '("1,*" . "1,*:*") "UID" nil 'nouidfetch)
-         (imap-message-map (lambda (uid Uid)
-                             (setq minuid (if minuid (min minuid uid) uid)
-                                   maxuid (if maxuid (max maxuid uid) uid)))
-                           'UID))
-       (list (imap-mailbox-get 'exists) minuid maxuid)))))
+    (let ((decoded-group (nnimap-decode-group-name group)))
+      (when (or (string= decoded-group (imap-current-mailbox))
+               (imap-mailbox-select decoded-group examine))
+       (let (minuid maxuid)
+         (when (> (imap-mailbox-get 'exists) 0)
+           (imap-fetch-safe '("1,*" . "1,*:*") "UID" nil 'nouidfetch)
+           (imap-message-map (lambda (uid Uid)
+                               (setq minuid (if minuid (min minuid uid) uid)
+                                     maxuid (if maxuid (max maxuid uid) uid)))
+                             'UID))
+         (list (imap-mailbox-get 'exists) minuid maxuid))))))
 
 (defun nnimap-possibly-change-group (group &optional server)
   "Make GROUP the current group, and SERVER the current server."
   (when (nnimap-possibly-change-server server)
-    (with-current-buffer nnimap-server-buffer
-      (if (or (null group) (imap-current-mailbox-p group))
-         imap-current-mailbox
-       (if (imap-mailbox-select group)
-           (if (or (nnimap-verify-uidvalidity
-                    group (or server nnimap-current-server))
-                   (zerop (imap-mailbox-get 'exists group))
-                   t ;; for OGnus to see if ignoring uidvalidity
-                   ;; changes has any bad effects.
-                   (yes-or-no-p
-                    (format
-                     "nnimap: Group %s is not uidvalid.  Continue? " group)))
-               imap-current-mailbox
-             (imap-mailbox-unselect)
-             (error "nnimap: Group %s is not uid-valid" group))
-         (nnheader-report 'nnimap (imap-error-text)))))))
+    (let ((decoded-group (nnimap-decode-group-name group)))
+      (with-current-buffer nnimap-server-buffer
+       (if (or (null group) (imap-current-mailbox-p decoded-group))
+           imap-current-mailbox        ; Note: utf-7 encoded.
+         (if (imap-mailbox-select decoded-group)
+             (if (or (nnimap-verify-uidvalidity
+                      group (or server nnimap-current-server))
+                     (zerop (imap-mailbox-get 'exists decoded-group))
+                     t ;; for OGnus to see if ignoring uidvalidity
+                     ;; changes has any bad effects.
+                     (yes-or-no-p
+                      (format
+                       "nnimap: Group %s is not uidvalid.  Continue? "
+                       decoded-group)))
+                 imap-current-mailbox  ; Note: utf-7 encoded.
+               (imap-mailbox-unselect)
+               (error "nnimap: Group %s is not uid-valid" decoded-group))
+           (nnheader-report 'nnimap (imap-error-text))))))))
 
 (defun nnimap-replace-whitespace (string)
   "Return STRING with all whitespace replaced with space."
@@ -614,7 +641,7 @@ If EXAMINE is non-nil the group is selected read-only."
     (let (headers lines chars uid mbx)
       (with-current-buffer nnimap-server-buffer
        (setq uid imap-current-message
-             mbx imap-current-mailbox
+             mbx (nnimap-encode-group-name (imap-current-mailbox))
              headers (if (imap-capability 'IMAP4rev1)
                           ;; xxx don't just use car? alist doesn't contain
                           ;; anything else now, but it might...
@@ -661,9 +688,7 @@ If EXAMINE is non-nil the group is selected read-only."
   "Make file name for GROUP on SERVER."
   (let* ((dir (file-name-as-directory (expand-file-name nnimap-directory)))
         (uidvalidity (gnus-group-get-parameter
-                      (gnus-group-prefixed-name
-                       group (gnus-server-to-method
-                              (format "nnimap:%s" server)))
+                      (nnimap-group-prefixed-name group server)
                       'uidvalidity))
         (name (nnheader-translate-file-chars
                (concat nnimap-nov-file-name
@@ -789,12 +814,17 @@ If EXAMINE is non-nil the group is selected read-only."
            (nnheader-nov-delete-outside-range low high))))
       'nov)))
 
+(declare-function netrc-parse "netrc" (file))
+(declare-function netrc-machine-user-or-password "netrc"
+                 (mode authinfo-file-or-list machines ports defaults))
+
 (defun nnimap-open-connection (server)
   ;; Note: `nnimap-open-server' that calls this function binds
   ;; `imap-logout-timeout' to `nnimap-logout-timeout'.
   (if (not (imap-open nnimap-address nnimap-server-port nnimap-stream
                      nnimap-authenticator nnimap-server-buffer))
       (nnheader-report 'nnimap "Can't open connection to server %s" server)
+    (require 'netrc)
     (unless (or (imap-capability 'IMAP4 nnimap-server-buffer)
                (imap-capability 'IMAP4rev1 nnimap-server-buffer))
       (imap-close nnimap-server-buffer)
@@ -805,7 +835,7 @@ If EXAMINE is non-nil the group is selected read-only."
           (port (if nnimap-server-port
                     (int-to-string nnimap-server-port)
                   "imap"))
-          (auth-info 
+          (auth-info
            (auth-source-user-or-password '("login" "password") server port))
           (auth-user (nth 0 auth-info))
           (auth-passwd (nth 1 auth-info))
@@ -955,8 +985,10 @@ function is generally only called when Gnus is shutting down."
                     article)))
       (when article
        (gnus-message 10 "nnimap: Fetching (part of) article %d from %s..."
-                     article (or group imap-current-mailbox
-                                 gnus-newsgroup-name))
+                     article (or (nnimap-decode-group-name group)
+                                 (imap-current-mailbox)
+                                 (nnimap-decode-group-name
+                                  gnus-newsgroup-name)))
        (if (not nnheader-callback-function)
            (with-current-buffer (or to-buffer nntp-server-buffer)
              (erase-buffer)
@@ -970,11 +1002,15 @@ function is generally only called when Gnus is shutting down."
              (nnheader-ms-strip-cr)
              (gnus-message
               10 "nnimap: Fetching (part of) article %d from %s...done"
-              article (or group imap-current-mailbox gnus-newsgroup-name))
+              article (or (nnimap-decode-group-name group)
+                          (imap-current-mailbox)
+                          (nnimap-decode-group-name gnus-newsgroup-name)))
              (if (bobp)
                  (nnheader-report 'nnimap "No such article %d in %s: %s"
-                                  article (or group imap-current-mailbox
-                                              gnus-newsgroup-name)
+                                  article (or (nnimap-decode-group-name group)
+                                              (imap-current-mailbox)
+                                              (nnimap-decode-group-name
+                                               gnus-newsgroup-name))
                                   (imap-error-text nnimap-server-buffer))
                (cons group article)))
          (add-hook 'imap-fetch-data-hook
@@ -1011,8 +1047,7 @@ function is generally only called when Gnus is shutting down."
 (deffoo nnimap-request-group (group &optional server fast)
   (nnimap-request-update-info-internal
    group
-   (gnus-get-info (gnus-group-prefixed-name
-                  group (gnus-server-to-method (format "nnimap:%s" server))))
+   (gnus-get-info (nnimap-group-prefixed-name group server))
    server)
   (when (nnimap-possibly-change-group group server)
     (nnimap-before-find-minmax-bugworkaround)
@@ -1035,8 +1070,8 @@ function is generally only called when Gnus is shutting down."
    (let ((old (gnus-gethash-safe (gnus-group-prefixed-name group server)
                                 nnimap-mailbox-info)))
      (list (nth 0 old) (nth 1 old)
-          (imap-mailbox-status group 'unseen nnimap-server-buffer)
-          (nth 3 old)))
+          (imap-mailbox-status (nnimap-decode-group-name group)
+                               'unseen nnimap-server-buffer)))
    nnimap-mailbox-info))
 
 (defun nnimap-close-group (group &optional server)
@@ -1051,7 +1086,7 @@ function is generally only called when Gnus is shutting down."
                    (imap-mailbox-close nnimap-close-asynchronous))))
        (ask (if (and (imap-search "DELETED")
                      (gnus-y-or-n-p (format "Expunge articles in group `%s'? "
-                                            imap-current-mailbox)))
+                                            (imap-current-mailbox))))
                 (progn
                   (imap-mailbox-expunge nnimap-close-asynchronous)
                   (unless nnimap-dont-close
@@ -1080,11 +1115,12 @@ function is generally only called when Gnus is shutting down."
        (dolist (mbx (funcall nnimap-request-list-method
                              (cdr pattern) (car pattern)))
          (or (member "\\NoSelect" (imap-mailbox-get 'list-flags mbx))
-             (let ((info (nnimap-find-minmax-uid mbx 'examine)))
+             (let* ((encoded-mbx (nnimap-encode-group-name mbx))
+                    (info (nnimap-find-minmax-uid encoded-mbx 'examine)))
                (when info
                  (with-current-buffer nntp-server-buffer
                    (insert (format "\"%s\" %d %d y\n"
-                                   mbx (or (nth 2 info) 0)
+                                   encoded-mbx (or (nth 2 info) 0)
                                    (max 1 (or (nth 1 info) 1)))))))))))
     (gnus-message 5 "nnimap: Generating active list%s...done"
                  (if (> (length server) 0) (concat " for " server) ""))
@@ -1134,73 +1170,88 @@ function is generally only called when Gnus is shutting down."
     (with-current-buffer nntp-server-buffer
       (erase-buffer)
       (nnimap-before-find-minmax-bugworkaround)
-      (let (asyncgroups slowgroups)
+      (let (asyncgroups slowgroups decoded-group)
        (if (null nnimap-retrieve-groups-asynchronous)
            (setq slowgroups groups)
          (dolist (group groups)
-           (gnus-message 9 "nnimap: Quickly checking mailbox %s" group)
-           (add-to-list (if (gnus-gethash-safe
-                             (gnus-group-prefixed-name group server)
-                             nnimap-mailbox-info)
+           (setq decoded-group (nnimap-decode-group-name group))
+           (gnus-message 9 "nnimap: Quickly checking mailbox %s"
+                         decoded-group)
+           (add-to-list (if (gnus-group-get-parameter
+                             (nnimap-group-prefixed-name group)
+                             'imap-status)
                             'asyncgroups
                           'slowgroups)
                         (list group (imap-mailbox-status-asynch
-                                     group '(uidvalidity uidnext unseen)
+                                     decoded-group
+                                     '(uidvalidity uidnext unseen)
                                      nnimap-server-buffer))))
          (dolist (asyncgroup asyncgroups)
-           (let ((group (nth 0 asyncgroup))
-                 (tag   (nth 1 asyncgroup))
-                 new old)
+           (let* ((group (nth 0 asyncgroup))
+                  (tag   (nth 1 asyncgroup))
+                  (gnusgroup (nnimap-group-prefixed-name group))
+                  (saved-uidvalidity (gnus-group-get-parameter gnusgroup
+                                                               'uidvalidity))
+                  (saved-imap-status (gnus-group-get-parameter gnusgroup
+                                                               'imap-status))
+                  (saved-info (and saved-imap-status
+                                   (split-string saved-imap-status " "))))
+             (setq decoded-group (nnimap-decode-group-name group))
              (when (imap-ok-p (imap-wait-for-tag tag nnimap-server-buffer))
-               (if (or (not (string=
-                             (nth 0 (gnus-gethash (gnus-group-prefixed-name
-                                                   group server)
-                                                  nnimap-mailbox-info))
-                             (imap-mailbox-get 'uidvalidity group
+               (if (or (not (equal
+                             saved-uidvalidity
+                             (imap-mailbox-get 'uidvalidity decoded-group
                                                nnimap-server-buffer)))
-                       (not (string=
-                             (nth 1 (gnus-gethash (gnus-group-prefixed-name
-                                                   group server)
-                                                  nnimap-mailbox-info))
-                             (imap-mailbox-get 'uidnext group
+                       (not (equal
+                             (nth 0 saved-info)
+                             (imap-mailbox-get 'uidnext decoded-group
                                                nnimap-server-buffer))))
                    (push (list group) slowgroups)
-                 (insert (nth 3 (gnus-gethash (gnus-group-prefixed-name
-                                               group server)
-                                              nnimap-mailbox-info))))))))
+                 (gnus-sethash
+                  (gnus-group-prefixed-name group server)
+                  (list (imap-mailbox-get 'uidvalidity
+                                          decoded-group nnimap-server-buffer)
+                        (imap-mailbox-get 'uidnext
+                                          decoded-group nnimap-server-buffer)
+                        (imap-mailbox-get 'unseen
+                                          decoded-group nnimap-server-buffer))
+                  nnimap-mailbox-info)
+                 (insert (format "\"%s\" %s %s y\n" group
+                                 (nth 2 saved-info)
+                                 (nth 1 saved-info))))))))
        (dolist (group slowgroups)
          (if nnimap-retrieve-groups-asynchronous
              (setq group (car group)))
-         (gnus-message 7 "nnimap: Mailbox %s modified" group)
-         (imap-mailbox-put 'uidnext nil group nnimap-server-buffer)
-         (or (member "\\NoSelect" (imap-mailbox-get 'list-flags group
+         (setq decoded-group (nnimap-decode-group-name group))
+         (gnus-message 7 "nnimap: Mailbox %s modified" decoded-group)
+         (or (member "\\NoSelect" (imap-mailbox-get 'list-flags decoded-group
                                                     nnimap-server-buffer))
-             (let* ((info (nnimap-find-minmax-uid group 'examine))
-                    (str (format "\"%s\" %d %d y\n" group
-                                 (or (nth 2 info) 0)
-                                 (max 1 (or (nth 1 info) 1)))))
-               (when (> (or (imap-mailbox-get 'recent group
+             (let* ((gnusgroup (nnimap-group-prefixed-name group))
+                    (status (imap-mailbox-status
+                             decoded-group '(uidvalidity uidnext unseen)
+                             nnimap-server-buffer))
+                    (info (nnimap-find-minmax-uid group 'examine))
+                    (min-uid (max 1 (or (nth 1 info) 1)))
+                    (max-uid (or (nth 2 info) 0)))
+               (when (> (or (imap-mailbox-get 'recent decoded-group
                                               nnimap-server-buffer) 0)
                         0)
-                 (push (list (cons group 0)) nnmail-split-history))
-               (insert str)
-               (when nnimap-retrieve-groups-asynchronous
-                 (gnus-sethash
-                  (gnus-group-prefixed-name group server)
-                  (list (or (imap-mailbox-get
-                             'uidvalidity group nnimap-server-buffer)
-                            (imap-mailbox-status
-                             group 'uidvalidity nnimap-server-buffer))
-                        (or (imap-mailbox-get
-                             'uidnext group nnimap-server-buffer)
-                            (imap-mailbox-status
-                             group 'uidnext nnimap-server-buffer))
-                        (or (imap-mailbox-get
-                             'unseen group nnimap-server-buffer)
-                            (imap-mailbox-status
-                             group 'unseen nnimap-server-buffer))
-                        str)
-                  nnimap-mailbox-info)))))))
+                 (push (list (cons decoded-group 0)) nnmail-split-history))
+               (insert (format "\"%s\" %d %d y\n" group max-uid min-uid))
+               (gnus-sethash
+                (gnus-group-prefixed-name group server)
+                status
+                nnimap-mailbox-info)
+               (if (not (equal (nth 0 status)
+                               (gnus-group-get-parameter gnusgroup
+                                                         'uidvalidity)))
+                   (nnimap-verify-uidvalidity group nnimap-current-server))
+               ;; The imap-status parameter is a string on the form
+               ;; "<uidnext> <min-uid> <max-uid>".
+               (gnus-group-add-parameter
+                gnusgroup
+                (cons 'imap-status
+                      (format "%s %s %s" (nth 1 status) min-uid max-uid))))))))
     (gnus-message 5 "nnimap: Checking mailboxes...done")
     'active))
 
@@ -1209,7 +1260,7 @@ function is generally only called when Gnus is shutting down."
     (when info ;; xxx what does this mean? should we create a info?
       (with-current-buffer nnimap-server-buffer
        (gnus-message 5 "nnimap: Updating info for %s..."
-                     (gnus-info-group info))
+                     (nnimap-decode-group-name (gnus-info-group info)))
 
        (when (nnimap-mark-permanent-p 'read)
          (let (seen unseen)
@@ -1255,7 +1306,7 @@ function is generally only called when Gnus is shutting down."
           t))
 
        (gnus-message 5 "nnimap: Updating info for %s...done"
-                     (gnus-info-group info))
+                     (nnimap-decode-group-name (gnus-info-group info)))
 
        info))))
 
@@ -1268,7 +1319,8 @@ function is generally only called when Gnus is shutting down."
   (when (nnimap-possibly-change-group group server)
     (with-current-buffer nnimap-server-buffer
       (let (action)
-       (gnus-message 7 "nnimap: Setting marks in %s..." group)
+       (gnus-message 7 "nnimap: Setting marks in %s..."
+                     (nnimap-decode-group-name group))
        (while (setq action (pop actions))
          (let ((range (nth 0 action))
                (what  (nth 1 action))
@@ -1309,7 +1361,8 @@ function is generally only called when Gnus is shutting down."
                     (imap-message-flags-set
                      (imap-range-to-message-set range)
                      (nnimap-mark-to-flag marks nil t)))))))
-       (gnus-message 7 "nnimap: Setting marks in %s...done" group))))
+       (gnus-message 7 "nnimap: Setting marks in %s...done"
+                     (nnimap-decode-group-name group)))))
   nil)
 
 (defun nnimap-split-fancy ()
@@ -1320,6 +1373,7 @@ function is generally only called when Gnus is shutting down."
 (defun nnimap-split-to-groups (rules)
   ;; tries to match all rules in nnimap-split-rule against content of
   ;; nntp-server-buffer, returns a list of groups that matched.
+  ;; Note: This function takes and returns decoded group names.
   (with-current-buffer nntp-server-buffer
     ;; Fold continuation lines.
     (goto-char (point-min))
@@ -1372,12 +1426,16 @@ function is generally only called when Gnus is shutting down."
     (list nnimap-split-inbox)))
 
 (defun nnimap-split-articles (&optional group server)
+  ;; Note: Assumes decoded group names in nnimap-split-inbox,
+  ;; nnimap-split-rule, nnimap-split-fancy, and nnmail-split-history.
   (when (nnimap-possibly-change-server server)
     (with-current-buffer nnimap-server-buffer
-      (let (rule inbox removeorig (inboxes (nnimap-split-find-inbox server)))
+      (let (rule inbox removeorig
+           (inboxes (nnimap-split-find-inbox server)))
        ;; iterate over inboxes
        (while (and (setq inbox (pop inboxes))
-                   (nnimap-possibly-change-group inbox)) ;; SELECT
+                   (nnimap-possibly-change-group
+                    (nnimap-encode-group-name inbox))) ;; SELECT
          ;; find split rule for this server / inbox
          (when (setq rule (nnimap-split-find-rule server inbox))
            ;; iterate over articles
@@ -1406,7 +1464,7 @@ function is generally only called when Gnus is shutting down."
                               (and (setq msgid
                                          (nnmail-fetch-field "message-id"))
                                    (nnmail-cache-insert msgid
-                                                        to-group
+                                                        (nnimap-encode-group-name to-group)
                                                         (nnmail-fetch-field "subject"))))))
                         ;; Add the group-art list to the history list.
                         (push (list (cons to-group 0)) nnmail-split-history))
@@ -1449,10 +1507,11 @@ function is generally only called when Gnus is shutting down."
                  (if (string= (downcase mailbox) "\\noselect")
                      (throw 'found t)))
                nil)
-             (let ((info (nnimap-find-minmax-uid mbx 'examine)))
+             (let* ((encoded-mbx (nnimap-encode-group-name mbx))
+                    (info (nnimap-find-minmax-uid encoded-mbx 'examine)))
                (when info
                  (insert (format "\"%s\" %d %d y\n"
-                                 mbx (or (nth 2 info) 0)
+                                 encoded-mbx (or (nth 2 info) 0)
                                  (max 1 (or (nth 1 info) 1)))))))))
       (gnus-message 5 "nnimap: Listing subscribed mailboxes%s%s...done"
                    (if (> (length server) 0) " on " "") server))
@@ -1460,10 +1519,11 @@ function is generally only called when Gnus is shutting down."
 
 (deffoo nnimap-request-create-group (group &optional server args)
   (when (nnimap-possibly-change-server server)
-    (or (imap-mailbox-status group 'uidvalidity nnimap-server-buffer)
-       (imap-mailbox-create group nnimap-server-buffer)
-       (nnheader-report 'nnimap "%S"
-                        (imap-error-text nnimap-server-buffer)))))
+    (let ((decoded-group (nnimap-decode-group-name group)))
+      (or (imap-mailbox-status decoded-group 'uidvalidity nnimap-server-buffer)
+         (imap-mailbox-create decoded-group nnimap-server-buffer)
+         (nnheader-report 'nnimap "%S"
+                          (imap-error-text nnimap-server-buffer))))))
 
 (defun nnimap-time-substract (time1 time2)
   "Return TIME for TIME1 - TIME2."
@@ -1594,7 +1654,8 @@ function is generally only called when Gnus is shutting down."
                          nnimap-current-move-group)
                         (imap-message-copy (number-to-string
                                             nnimap-current-move-article)
-                                           group 'dontcreate nil
+                                           (nnimap-decode-group-name group)
+                                           'dontcreate nil
                                            nnimap-server-buffer))
                  (with-current-buffer (current-buffer)
                    (goto-char (point-min))
@@ -1614,13 +1675,15 @@ function is generally only called when Gnus is shutting down."
                  ;; this 'or' is for Cyrus server bug
                  (or (null (imap-current-mailbox nnimap-server-buffer))
                      (imap-mailbox-unselect nnimap-server-buffer))
-                 (imap-message-append group (current-buffer) nil nil
+                 (imap-message-append (nnimap-decode-group-name group)
+                                      (current-buffer) nil nil
                                       nnimap-server-buffer)))
          (cons group (nth 1 uid))
        (nnheader-report 'nnimap (imap-error-text nnimap-server-buffer))))))
 
 (deffoo nnimap-request-delete-group (group force &optional server)
   (when (nnimap-possibly-change-server server)
+    (setq group (nnimap-decode-group-name group))
     (when (string= group (imap-current-mailbox nnimap-server-buffer))
       (imap-mailbox-unselect nnimap-server-buffer))
     (with-current-buffer nnimap-server-buffer
@@ -1632,7 +1695,9 @@ function is generally only called when Gnus is shutting down."
 
 (deffoo nnimap-request-rename-group (group new-name &optional server)
   (when (nnimap-possibly-change-server server)
-    (imap-mailbox-rename group new-name nnimap-server-buffer)))
+    (imap-mailbox-rename (nnimap-decode-group-name group)
+                        (nnimap-decode-group-name new-name)
+                        nnimap-server-buffer)))
 
 (defun nnimap-expunge (mailbox server)
   (when (nnimap-possibly-change-group mailbox server)
@@ -1641,7 +1706,8 @@ function is generally only called when Gnus is shutting down."
 (defun nnimap-acl-get (mailbox server)
   (when (nnimap-possibly-change-server server)
     (and (imap-capability 'ACL nnimap-server-buffer)
-        (imap-mailbox-acl-get mailbox nnimap-server-buffer))))
+        (imap-mailbox-acl-get (nnimap-decode-group-name mailbox)
+                              nnimap-server-buffer))))
 
 (defun nnimap-acl-edit (mailbox method old-acls new-acls)
   (when (nnimap-possibly-change-server (cadr method))
@@ -1651,7 +1717,8 @@ function is generally only called when Gnus is shutting down."
       ;; delete all removed identifiers
       (mapc (lambda (old-acl)
              (unless (assoc (car old-acl) new-acls)
-               (or (imap-mailbox-acl-delete (car old-acl) mailbox)
+               (or (imap-mailbox-acl-delete (car old-acl)
+                                            (nnimap-decode-group-name mailbox))
                    (error "Can't delete ACL for %s" (car old-acl)))))
            old-acls)
       ;; set all changed acl's
@@ -1660,7 +1727,8 @@ function is generally only called when Gnus is shutting down."
                    (old-rights (cdr (assoc (car new-acl) old-acls))))
                (unless (and old-rights new-rights
                             (string= old-rights new-rights))
-                 (or (imap-mailbox-acl-set (car new-acl) new-rights mailbox)
+                 (or (imap-mailbox-acl-set (car new-acl) new-rights
+                                           (nnimap-decode-group-name mailbox))
                      (error "Can't set ACL for %s to %s" (car new-acl)
                             new-rights)))))
            new-acls)
index 02685c7594c8dbdce1bd4a1cdd0ffb870da9e2ff..5475506746a212d2111b03c54d3324c95a0eabe5 100644 (file)
 (defvar nnir-imap-search-argument-history ()
   "The history for querying search options in nnir")
 
+(defvar nnir-get-article-nov-override-function nil
+  "If non-nil, a function that will be passed each search result.  This
+should return a message's headers in NOV format.
+
+If this variable is nil, or if the provided function returns nil for a search
+result, `gnus-retrieve-headers' will be called instead.")
+
+
 ;;; Developer Extension Variable:
 
 (defvar nnir-engines
@@ -779,25 +787,31 @@ and show thread that contains this article."
        (nnir-possibly-change-server server)
         (let ((gnus-override-method
               (gnus-server-to-method server)))
-         (case (setq foo (gnus-retrieve-headers (list artno) artfullgroup nil))
-           (nov
-            (goto-char (point-min))
-            (setq novitem (nnheader-parse-nov))
-            (unless novitem
-              (pop-to-buffer nntp-server-buffer)
-              (error
-               "nnheader-parse-nov returned nil for article %s in group %s"
-               artno artfullgroup)))
-           (headers
-            (goto-char (point-min))
-            (setq novitem (nnheader-parse-head))
-            (unless novitem
-              (pop-to-buffer nntp-server-buffer)
-              (error
-               "nnheader-parse-head returned nil for article %s in group %s"
-               artno artfullgroup)))
-           (t (error "Unknown header type %s while requesting article %s of group %s"
-                     foo artno artfullgroup))))
+         ;; if nnir-get-article-nov-override-function is set, use it
+         (if nnir-get-article-nov-override-function
+             (setq novitem (funcall nnir-get-article-nov-override-function
+                                    artitem))
+         ;; else, set novitem through nnheader-parse-nov/nnheader-parse-head
+           (case (setq foo (gnus-retrieve-headers (list artno) 
+                                                  artfullgroup nil))
+             (nov
+              (goto-char (point-min))
+              (setq novitem (nnheader-parse-nov))
+              (unless novitem
+                (pop-to-buffer nntp-server-buffer)
+                (error
+                 "nnheader-parse-nov returned nil for article %s in group %s"
+                 artno artfullgroup)))
+             (headers
+              (goto-char (point-min))
+              (setq novitem (nnheader-parse-head))
+              (unless novitem
+                (pop-to-buffer nntp-server-buffer)
+                (error
+                 "nnheader-parse-head returned nil for article %s in group %s"
+                 artno artfullgroup)))
+             (t (error "Unknown header type %s while requesting article %s of group %s"
+                       foo artno artfullgroup)))))
        ;; replace article number in original group with article number
         ;; in nnir group
         (mail-header-set-number novitem art)
index 6e42a1fa31de1040d31721e139c89428fdeb8391..03e0168de49ed6f5209cfb538788533597265e1c 100644 (file)
 
 ;;; Code:
 
+;; For Emacs < 22.2.
+(eval-and-compile
+  (unless (fboundp 'declare-function) (defmacro declare-function (&rest r))))
+
 (require 'nnheader)
 (require 'nnoo)
 (require 'gnus-util)
@@ -1168,6 +1172,11 @@ It will make innd servers spawn an nnrpd process to allow actual article
 reading."
   (nntp-send-command "^.*\n" "MODE READER"))
 
+(declare-function netrc-parse "netrc" (file))
+(declare-function netrc-machine "netrc"
+                 (list machine &optional port defaultport))
+(declare-function netrc-get "netrc" (alist type))
+
 (defun nntp-send-authinfo (&optional send-if-force)
   "Send the AUTHINFO to the nntp server.
 It will look in the \"~/.authinfo\" file for matching entries.  If
@@ -1176,10 +1185,11 @@ and a password.
 
 If SEND-IF-FORCE, only send authinfo to the server if the
 .authinfo file has the FORCE token."
+  (require 'netrc)
   (let* ((list (netrc-parse nntp-authinfo-file))
         (alist (netrc-machine list nntp-address "nntp"))
         (force (or (netrc-get alist "force") nntp-authinfo-force))
-        (auth-info 
+        (auth-info
          (auth-source-user-or-password '("login" "password") nntp-address "nntp"))
         (auth-user (nth 0 auth-info))
         (auth-passwd (nth 1 auth-info))
index b3012b4b19892a82e31f614ec4ce59f0260cb6c9..20f7ba34b3cd5556118700f0cdb1c0c9d93880c5 100644 (file)
@@ -98,6 +98,12 @@ thing can fall apart and leave you with a corrupt mailbox."
   :type 'boolean
   :group 'pop3)
 
+(defcustom pop3-display-message-size-flag t
+  "*If non-nil, display the size of the message that is being fetched."
+  :version "22.1" ;; Oort Gnus
+  :type 'boolean
+  :group 'pop3) 
+
 (defvar pop3-timestamp nil
   "Timestamp returned when initially connected to the POP server.
 Used for APOP authentication.")
@@ -135,6 +141,7 @@ Shorter values mean quicker response, but are more CPU intensive.")
         (crashbuf (get-buffer-create " *pop3-retr*"))
         (n 1)
         message-count
+        message-sizes
         (pop3-password pop3-password))
     ;; for debugging only
     (if pop3-debug (switch-to-buffer (process-buffer process)))
@@ -149,10 +156,18 @@ Shorter values mean quicker response, but are more CPU intensive.")
           (pop3-pass process))
          (t (error "Invalid POP3 authentication scheme")))
     (setq message-count (car (pop3-stat process)))
+    (when (and pop3-display-message-size-flag
+              (> message-count 0))
+      (setq message-sizes (pop3-list process)))
     (unwind-protect
        (while (<= n message-count)
-         (message "Retrieving message %d of %d from %s..."
-                  n message-count pop3-mailhost)
+         (if pop3-display-message-size-flag
+             (message "Retrieving message %d of %d from %s... (%.1fk)"
+                      n message-count pop3-mailhost
+                      (/ (cdr (assoc n message-sizes))
+                         1024.0))
+           (message "Retrieving message %d of %d from %s..."
+                    n message-count pop3-mailhost))      
          (pop3-retr process n crashbuf)
          (save-excursion
            (set-buffer crashbuf)
@@ -451,8 +466,28 @@ If NOW, use that time instead."
     ))
 
 (defun pop3-list (process &optional msg)
-  "Scan listing of available messages.
-This function currently does nothing.")
+  "If MSG is nil, return an alist of (MESSAGE-ID . SIZE) pairs.
+Otherwise, return the size of the message-id MSG"
+  (pop3-send-command process (if msg 
+                                (format "LIST %d" msg)
+                              "LIST"))
+  (let ((response (pop3-read-response process t)))
+    (if msg
+       (string-to-number (nth 2 (split-string response " ")))
+      (let ((start pop3-read-point) end)
+       (save-excursion
+         (set-buffer (process-buffer process))
+         (while (not (re-search-forward "^\\.\r\n" nil t))
+           (pop3-accept-process-output process)
+           (goto-char start))
+         (setq pop3-read-point (point-marker))
+         (goto-char (match-beginning 0))
+         (setq end (point-marker))
+         (mapcar #'(lambda (s) (let ((split (split-string s " ")))
+                                 (cons (string-to-number (nth 0 split))
+                                       (string-to-number (nth 1 split)))))
+                 (delete "" (split-string (buffer-substring start end)
+                                          "\r\n"))))))))
 
 (defun pop3-retr (process msg crashbuf)
   "Retrieve message-id MSG to buffer CRASHBUF."
index 793aa1f32dcd9626e65b02b7286194b0a2c50734..e13dffccdac405c752e8d2b383ff4f73917bd781 100644 (file)
@@ -31,7 +31,6 @@
   (require 'cl))
 (defvar message-posting-charset)
 
-(require 'qp)
 (require 'mm-util)
 (require 'ietf-drums)
 ;; Fixme: Avoid this (used for mail-parse-charset) mm dependence on gnus.
@@ -827,6 +826,8 @@ Point moves to the end of the region."
   "Base64-encode the header contained in STRING."
   (base64-encode-string string t))
 
+(autoload 'quoted-printable-encode-region "qp")
+
 (defun rfc2047-q-encode-string (string)
   "Quoted-printable-encode the header in STRING."
   (mm-with-unibyte-buffer
@@ -929,6 +930,8 @@ only be used for decoding, not for encoding."
        'raw-text
       cs)))
 
+(autoload 'quoted-printable-decode-string "qp")
+
 (defun rfc2047-decode-encoded-words (words)
   "Decode successive encoded-words in WORDS and return a decoded string.
 Each element of WORDS looks like (CHARSET ENCODING ENCODED-TEXT
index 99ec57ce38b357172c44597a1cfeb0f88db0e24f..f765589e7a0929bc0b72f46398aa83255d032fad 100644 (file)
@@ -1,7 +1,7 @@
 ;;; sieve-mode.el --- Sieve code editing commands for Emacs
 
-;; Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
-;;   Free Software Foundation, Inc.
+;; Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
+;;   2010  Free Software Foundation, Inc.
 
 ;; Author: Simon Josefsson <simon@josefsson.org>
 
@@ -49,7 +49,6 @@
 
 (autoload 'sieve-manage "sieve")
 (autoload 'sieve-upload "sieve")
-(require 'easymenu)
 (eval-when-compile
   (require 'font-lock))
 
   "Menubar used in sieve mode.")
 
 ;; Code for Sieve editing mode.
+(autoload 'easy-menu-add-item "easymenu")
 
 ;;;###autoload
 (define-derived-mode sieve-mode c-mode "Sieve"
index 45c596539c98c23754f120a15e8c077e8084fc23..69fc2016a650ed7acb8a682b06587a1a04984630 100644 (file)
@@ -1,6 +1,7 @@
 ;;; spam-stat.el --- detecting spam based on statistics
 
-;; Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+;; Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
+;;   2010  Free Software Foundation, Inc.
 
 ;; Author: Alex Schroeder <alex@gnu.org>
 ;; Keywords: network
@@ -557,6 +558,8 @@ check the variable `spam-stat-score-data'."
     (when (re-search-forward "^Xref:.*\n" nil t)
       (delete-region (match-beginning 0) (match-end 0)))))
 
+(autoload 'time-to-number-of-days "time-date")
+
 (defun spam-stat-process-directory (dir func)
   "Process all the regular files in directory DIR using function FUNC."
   (let* ((files (directory-files dir t "^[^.]"))
index 1ce4f25af70b329daf3e2db0b6eee8c0c7108c6c..755ff69645397ffdcdccd4e2a7665e68f30e5984 100644 (file)
@@ -72,7 +72,7 @@
 (defgroup hl-line nil
   "Highlight the current line."
   :version "21.1"
-  :group 'editing)
+  :group 'convenience)
 
 (defface hl-line
   '((t :inherit highlight))
index 5b785f0031eae0c136116cf00ab738aa2b253e4e..6169fa4cb715b8e6ed04f9d46ed717eed98a3aa7 100644 (file)
@@ -466,7 +466,7 @@ was inserted."
                            (buffer-substring-no-properties (point-min) (point-max)))
                         filename))
         (type (image-type file-or-data nil data-p))
-        (image (create-image file-or-data type data-p))
+        (image (create-animated-image file-or-data type data-p))
         (props
          `(display ,image
                    intangible ,image
index 944c6135e23af3453e513c7fb698b330295c424d..83ab6288e9a60fc32bbf0586a94b9086004926a0 100644 (file)
@@ -1,7 +1,7 @@
 ;;; image.el --- image API
 
-;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003,
-;;   2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+;;   2007, 2008, 2009, 2010  Free Software Foundation, Inc.
 
 ;; Maintainer: FSF
 ;; Keywords: multimedia
@@ -584,7 +584,111 @@ Example:
   (declare (doc-string 3))
   `(defvar ,symbol (find-image ',specs) ,doc))
 
+\f
+;;; Animated image API
 
+(defcustom image-animate-max-time 30
+  "Time in seconds to animate images."
+  :type 'integer
+  :version "24.1"
+  :group 'image)
+
+(defconst image-animated-types '(gif)
+  "List of supported animated image types.")
+
+;;;###autoload
+(defun create-animated-image (file-or-data &optional type data-p &rest props)
+  "Create an animated image.
+FILE-OR-DATA 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,
+use its file extension as image type.
+Optional DATA-P non-nil means FILE-OR-DATA is a string containing image data.
+Optional PROPS are additional image attributes to assign to the image,
+like, e.g. `:mask MASK'.
+Value is the image created, or nil if images of type TYPE are not supported.
+
+Images should not be larger than specified by `max-image-size'."
+  (setq type (image-type file-or-data type data-p))
+  (when (image-type-available-p type)
+    (let* ((animate (memq type image-animated-types))
+          (image
+           (append (list 'image :type type (if data-p :data :file) file-or-data)
+                   (if animate '(:index 0 :mask heuristic))
+                   props)))
+      (if animate
+         (image-animate-start image))
+      image)))
+
+(defun image-animate-timer (image)
+  "Return the animation timer for image IMAGE."
+  ;; See cancel-function-timers
+  (let ((tail timer-list) timer)
+    (while tail
+      (setq timer (car tail)
+           tail (cdr tail))
+      (if (and (eq (aref timer 5) #'image-animate-timeout)
+              (consp (aref timer 6))
+              (eq (car (aref timer 6)) image))
+         (setq tail nil)
+       (setq timer nil)))
+    timer))
+
+(defun image-animate-start (image &optional max-time)
+  "Start animation of image IMAGE.
+Optional second arg MAX-TIME is number of seconds to animate image,
+or t to animate infinitely."
+  (let ((anim (image-animated-p image))
+       timer tmo)
+    (when anim
+      (if (setq timer (image-animate-timer image))
+         (setcar (nthcdr 3 (aref timer 6)) max-time)
+       (setq tmo (* (cdr anim) 0.01))
+       (setq max-time (or max-time image-animate-max-time))
+       (run-with-timer tmo nil #'image-animate-timeout
+                       image 1 (car anim)
+                       (if (numberp max-time)
+                           (- max-time tmo)
+                         max-time))))))
+
+(defun image-animate-stop (image)
+  "Stop animation of image."
+  (let ((timer (image-animate-timer image)))
+    (when timer
+      (cancel-timer timer))))
+
+(defun image-animate-timeout (image ino count time-left)
+  (if (>= ino count)
+      (setq ino 0))
+  (plist-put (cdr image) :index ino)
+  (force-window-update)
+  (let ((anim (image-animated-p image)) tmo)
+    (when anim
+      (setq tmo (* (cdr anim) 0.01))
+      (unless (and (= ino 0) (numberp time-left) (< time-left tmo))
+       (run-with-timer tmo nil #'image-animate-timeout
+                       image (1+ ino) count
+                       (if (numberp time-left)
+                           (- time-left tmo)
+                         time-left))))))
+
+(defun image-animated-p (image)
+  "Return non-nil if image is animated.
+Actually, return value is a cons (IMAGES . DELAY) where IMAGES
+is the number of sub-images in the animated image, and DELAY
+is the delay in 100ths of a second until the next sub-image
+shall be displayed."
+  (cond
+   ((eq (plist-get (cdr image) :type) 'gif)
+    (let* ((extdata (image-extension-data image))
+          (images (plist-get extdata 'count))
+          (anim (plist-get extdata #xF9)))
+      (and (integerp images) (> images 1)
+          (stringp anim) (>= (length anim) 4)
+          (cons images (+ (aref anim 1) (* (aref anim 2) 256))))))))
+
+\f
 (provide 'image)
 
 ;; arch-tag: 8e76a07b-eb48-4f3e-a7a0-1a7ba9f096b3
index a1ce05d6292a93aedc38cffcd472a1f7e7ac730a..df892d499dc703dedb493e075a5d5767667304cd 100644 (file)
@@ -3343,6 +3343,7 @@ Build a menu of the possible matches."
 (defvar finder-known-keywords)
 (defvar finder-package-info)
 (declare-function find-library-name "find-func" (library))
+(declare-function finder-unknown-keywords "finder" ())
 (declare-function lm-commentary "lisp-mnt" (&optional file))
 
 (defun Info-finder-find-node (filename nodename &optional no-going-back)
@@ -3361,7 +3362,38 @@ Build a menu of the possible matches."
         (insert (format "* %-14s %s.\n"
                         (concat (symbol-name keyword) "::")
                         (cdr assoc)))))
-     finder-known-keywords))
+     (append '((all . "All package info")
+              (unknown . "unknown keywords"))
+          finder-known-keywords)))
+   ((equal nodename "unknown")
+    ;; Display unknown keywords
+    (insert (format "\n\^_\nFile: %s,  Node: %s,  Up: Top\n\n"
+                   Info-finder-file nodename))
+    (insert "Finder Unknown Keywords\n")
+    (insert "***********************\n\n")
+    (insert "* Menu:\n\n")
+    (mapc
+     (lambda (assoc)
+       (insert (format "* %-14s %s.\n"
+                      (concat (symbol-name (car assoc)) "::")
+                      (cdr assoc))))
+     (finder-unknown-keywords)))
+   ((equal nodename "all")
+    ;; Display all package info.
+    (insert (format "\n\^_\nFile: %s,  Node: %s,  Up: Top\n\n"
+                   Info-finder-file nodename))
+    (insert "Finder Package Info\n")
+    (insert "*******************\n\n")
+    (mapc (lambda (package)
+           (insert (format "%s - %s\n"
+                           (format "*Note %s::" (nth 0 package))
+                           (nth 1 package)))
+           (insert "Keywords: "
+                   (mapconcat (lambda (keyword)
+                                (format "*Note %s::" (symbol-name keyword)))
+                              (nth 2 package) ", ")
+                   "\n\n"))
+         finder-package-info))
    ((string-match-p "\\.el\\'" nodename)
     ;; Display commentary section
     (insert (format "\n\^_\nFile: %s,  Node: %s,  Up: Top\n\n"
@@ -3386,6 +3418,7 @@ Build a menu of the possible matches."
           (buffer-string))))))
    (t
     ;; Display packages that match the keyword
+    ;; or the list of keywords separated by comma.
     (insert (format "\n\^_\nFile: %s,  Node: %s,  Up: Top\n\n"
                    Info-finder-file nodename))
     (insert "Finder Packages\n")
@@ -3393,21 +3426,39 @@ Build a menu of the possible matches."
     (insert
      "The following packages match the keyword `" nodename "':\n\n")
     (insert "* Menu:\n\n")
-    (let ((id (intern nodename)))
+    (let ((keywords
+          (mapcar 'intern (if (string-match-p "," nodename)
+                              (split-string nodename ",[ \t\n]*" t)
+                            (list nodename)))))
       (mapc
-       (lambda (x)
-        (when (memq id (cadr (cdr x)))
+       (lambda (package)
+        (unless (memq nil (mapcar (lambda (k) (memq k (nth 2 package)))
+                                  keywords))
           (insert (format "* %-16s %s.\n"
-                          (concat (car x) "::")
-                          (cadr x)))))
+                          (concat (nth 0 package) "::")
+                          (nth 1 package)))))
        finder-package-info)))))
 
 ;;;###autoload
-(defun info-finder ()
-  "Display descriptions of the keywords in the Finder virtual manual."
-  (interactive)
+(defun info-finder (&optional keywords)
+  "Display descriptions of the keywords in the Finder virtual manual.
+In interactive use, a prefix argument directs this command to read
+a list of keywords separated by comma.  After that, it displays a node
+with a list packages that contain all specified keywords."
+  (interactive
+   (when current-prefix-arg
+     (require 'finder)
+     (list
+      (completing-read-multiple
+       "Keywords (separated by comma): "
+       (mapcar 'symbol-name (mapcar 'car (append finder-known-keywords
+                                                (finder-unknown-keywords))))
+       nil t))))
   (require 'finder)
-  (Info-find-node Info-finder-file "Top"))
+  (if keywords
+      (Info-find-node Info-finder-file (mapconcat 'identity keywords ", "))
+    (Info-find-node Info-finder-file "Top")))
+
 \f
 (defun Info-undefined ()
   "Make command be undefined in Info."
index c60b644753ca9c274c6b68427d18d0ca1f71983f..493f1a7b5772f72a050d0ee6b84aba22cfa65231 100644 (file)
@@ -5,7 +5,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" (19352 21350))
+;;;;;;  "play/5x5.el" (19279 5151))
 ;;; Generated autoloads from play/5x5.el
 
 (autoload '5x5 "5x5" "\
@@ -65,7 +65,7 @@ should return a grid vector array that is the new solution.
 ;;;***
 \f
 ;;;### (autoloads (list-one-abbrev-table) "abbrevlist" "abbrevlist.el"
-;;;;;;  (19352 21350))
+;;;;;;  (19279 5148))
 ;;; Generated autoloads from abbrevlist.el
 
 (autoload 'list-one-abbrev-table "abbrevlist" "\
@@ -76,7 +76,7 @@ Display alphabetical listing of ABBREV-TABLE in buffer OUTPUT-BUFFER.
 ;;;***
 \f
 ;;;### (autoloads (ada-mode ada-add-extensions) "ada-mode" "progmodes/ada-mode.el"
-;;;;;;  (19352 21362))
+;;;;;;  (19313 15414))
 ;;; Generated autoloads from progmodes/ada-mode.el
 
 (autoload 'ada-add-extensions "ada-mode" "\
@@ -96,7 +96,7 @@ Ada mode is the major mode for editing Ada code.
 ;;;***
 \f
 ;;;### (autoloads (ada-header) "ada-stmt" "progmodes/ada-stmt.el"
-;;;;;;  (19352 21350))
+;;;;;;  (19279 38446))
 ;;; Generated autoloads from progmodes/ada-stmt.el
 
 (autoload 'ada-header "ada-stmt" "\
@@ -107,7 +107,7 @@ Insert a descriptive header at the top of the file.
 ;;;***
 \f
 ;;;### (autoloads (ada-find-file) "ada-xref" "progmodes/ada-xref.el"
-;;;;;;  (19352 21350))
+;;;;;;  (19279 38446))
 ;;; Generated autoloads from progmodes/ada-xref.el
 
 (autoload 'ada-find-file "ada-xref" "\
@@ -121,8 +121,8 @@ Completion is available.
 ;;;### (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" (19352
-;;;;;;  21350))
+;;;;;;  add-log-current-defun-function) "add-log" "add-log.el" (19279
+;;;;;;  5148))
 ;;; Generated autoloads from add-log.el
 
 (put 'change-log-default-name 'safe-local-variable 'string-or-null-p)
@@ -261,7 +261,7 @@ old-style time formats for entries are supported.
 \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" (19352 21362))
+;;;;;;  "advice" "emacs-lisp/advice.el" (19323 49698))
 ;;; Generated autoloads from emacs-lisp/advice.el
 
 (defvar ad-redefinition-action 'warn "\
@@ -404,7 +404,7 @@ usage: (defadvice FUNCTION (CLASS NAME [POSITION] [ARGLIST] FLAG...)
 \f
 ;;;### (autoloads (align-newline-and-indent align-unhighlight-rule
 ;;;;;;  align-highlight-rule align-current align-entire align-regexp
-;;;;;;  align) "align" "align.el" (19352 21350))
+;;;;;;  align) "align" "align.el" (19279 5148))
 ;;; Generated autoloads from align.el
 
 (autoload 'align "align" "\
@@ -494,7 +494,7 @@ A replacement function for `newline-and-indent', aligning as it goes.
 ;;;***
 \f
 ;;;### (autoloads (outlineify-sticky allout-mode) "allout" "allout.el"
-;;;;;;  (19352 21350))
+;;;;;;  (19279 5148))
 ;;; Generated autoloads from allout.el
 
 (put 'allout-use-hanging-indents 'safe-local-variable (if (fboundp 'booleanp) 'booleanp '(lambda (x) (member x '(t nil)))))
@@ -801,7 +801,7 @@ setup for auto-startup.
 ;;;***
 \f
 ;;;### (autoloads (ange-ftp-hook-function ange-ftp-reread-dir) "ange-ftp"
-;;;;;;  "net/ange-ftp.el" (19352 21362))
+;;;;;;  "net/ange-ftp.el" (19356 10801))
 ;;; Generated autoloads from net/ange-ftp.el
 
 (defalias 'ange-ftp-re-read-dir 'ange-ftp-reread-dir)
@@ -823,7 +823,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (animate-birthday-present animate-sequence animate-string)
-;;;;;;  "animate" "play/animate.el" (19352 21350))
+;;;;;;  "animate" "play/animate.el" (19279 5151))
 ;;; Generated autoloads from play/animate.el
 
 (autoload 'animate-string "animate" "\
@@ -851,7 +851,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" (19352 21350))
+;;;;;;  "ansi-color" "ansi-color.el" (19279 5148))
 ;;; Generated autoloads from ansi-color.el
 
 (autoload 'ansi-color-for-comint-mode-on "ansi-color" "\
@@ -877,7 +877,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" (19352 21350))
+;;;;;;  "antlr-mode" "progmodes/antlr-mode.el" (19279 5151))
 ;;; Generated autoloads from progmodes/antlr-mode.el
 
 (autoload 'antlr-show-makefile-rules "antlr-mode" "\
@@ -914,7 +914,7 @@ Used in `antlr-mode'.  Also a useful function in `java-mode-hook'.
 ;;;***
 \f
 ;;;### (autoloads (appt-activate appt-make-list appt-delete appt-add)
-;;;;;;  "appt" "calendar/appt.el" (19352 21350))
+;;;;;;  "appt" "calendar/appt.el" (19279 5149))
 ;;; Generated autoloads from calendar/appt.el
 
 (autoload 'appt-add "appt" "\
@@ -954,7 +954,7 @@ ARG is positive, otherwise off.
 \f
 ;;;### (autoloads (apropos-documentation apropos-value apropos-library
 ;;;;;;  apropos apropos-documentation-property apropos-command apropos-variable
-;;;;;;  apropos-read-pattern) "apropos" "apropos.el" (19352 21350))
+;;;;;;  apropos-read-pattern) "apropos" "apropos.el" (19279 5148))
 ;;; Generated autoloads from apropos.el
 
 (autoload 'apropos-read-pattern "apropos" "\
@@ -1057,8 +1057,8 @@ Returns list of symbols and documentation found.
 
 ;;;***
 \f
-;;;### (autoloads (archive-mode) "arc-mode" "arc-mode.el" (19352
-;;;;;;  21362))
+;;;### (autoloads (archive-mode) "arc-mode" "arc-mode.el" (19321
+;;;;;;  4517))
 ;;; Generated autoloads from arc-mode.el
 
 (autoload 'archive-mode "arc-mode" "\
@@ -1078,7 +1078,7 @@ archive.
 
 ;;;***
 \f
-;;;### (autoloads (array-mode) "array" "array.el" (19352 21350))
+;;;### (autoloads (array-mode) "array" "array.el" (19279 5148))
 ;;; Generated autoloads from array.el
 
 (autoload 'array-mode "array" "\
@@ -1149,8 +1149,8 @@ Entering array mode calls the function `array-mode-hook'.
 
 ;;;***
 \f
-;;;### (autoloads (artist-mode) "artist" "textmodes/artist.el" (19352
-;;;;;;  21362))
+;;;### (autoloads (artist-mode) "artist" "textmodes/artist.el" (19321
+;;;;;;  4517))
 ;;; Generated autoloads from textmodes/artist.el
 
 (autoload 'artist-mode "artist" "\
@@ -1356,8 +1356,8 @@ Keymap summary
 
 ;;;***
 \f
-;;;### (autoloads (asm-mode) "asm-mode" "progmodes/asm-mode.el" (19352
-;;;;;;  21350))
+;;;### (autoloads (asm-mode) "asm-mode" "progmodes/asm-mode.el" (19279
+;;;;;;  5151))
 ;;; Generated autoloads from progmodes/asm-mode.el
 
 (autoload 'asm-mode "asm-mode" "\
@@ -1385,7 +1385,7 @@ Special commands:
 ;;;***
 \f
 ;;;### (autoloads (autoarg-kp-mode autoarg-mode) "autoarg" "autoarg.el"
-;;;;;;  (19352 21350))
+;;;;;;  (19279 5148))
 ;;; Generated autoloads from autoarg.el
 
 (defvar autoarg-mode nil "\
@@ -1439,7 +1439,7 @@ etc. to supply digit arguments.
 ;;;***
 \f
 ;;;### (autoloads (autoconf-mode) "autoconf" "progmodes/autoconf.el"
-;;;;;;  (19352 21350))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from progmodes/autoconf.el
 
 (autoload 'autoconf-mode "autoconf" "\
@@ -1450,7 +1450,7 @@ Major mode for editing Autoconf configure.in files.
 ;;;***
 \f
 ;;;### (autoloads (auto-insert-mode define-auto-insert auto-insert)
-;;;;;;  "autoinsert" "autoinsert.el" (19352 21350))
+;;;;;;  "autoinsert" "autoinsert.el" (19279 5148))
 ;;; Generated autoloads from autoinsert.el
 
 (autoload 'auto-insert "autoinsert" "\
@@ -1489,7 +1489,7 @@ 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"
-;;;;;;  (19352 21350))
+;;;;;;  (19365 25156))
 ;;; Generated autoloads from emacs-lisp/autoload.el
 
 (put 'generated-autoload-file 'safe-local-variable 'stringp)
@@ -1528,7 +1528,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" (19352 21350))
+;;;;;;  "autorevert" "autorevert.el" (19279 5148))
 ;;; Generated autoloads from autorevert.el
 
 (autoload 'auto-revert-mode "autorevert" "\
@@ -1609,7 +1609,7 @@ specifies in the mode line.
 ;;;***
 \f
 ;;;### (autoloads (mouse-avoidance-mode mouse-avoidance-mode) "avoid"
-;;;;;;  "avoid.el" (19352 21350))
+;;;;;;  "avoid.el" (19279 5148))
 ;;; Generated autoloads from avoid.el
 
 (defvar mouse-avoidance-mode nil "\
@@ -1650,7 +1650,7 @@ definition of \"random distance\".)
 ;;;***
 \f
 ;;;### (autoloads (display-battery-mode battery) "battery" "battery.el"
-;;;;;;  (19352 21350))
+;;;;;;  (19279 5148))
 ;;; Generated autoloads from battery.el
  (put 'battery-mode-line-string 'risky-local-variable t)
 
@@ -1682,7 +1682,7 @@ seconds.
 ;;;***
 \f
 ;;;### (autoloads (benchmark benchmark-run-compiled benchmark-run)
-;;;;;;  "benchmark" "emacs-lisp/benchmark.el" (19352 21350))
+;;;;;;  "benchmark" "emacs-lisp/benchmark.el" (19279 5149))
 ;;; Generated autoloads from emacs-lisp/benchmark.el
 
 (autoload 'benchmark-run "benchmark" "\
@@ -1715,7 +1715,7 @@ For non-interactive use see also `benchmark-run' and
 ;;;***
 \f
 ;;;### (autoloads (bibtex-search-entry bibtex-mode bibtex-initialize)
-;;;;;;  "bibtex" "textmodes/bibtex.el" (19352 21350))
+;;;;;;  "bibtex" "textmodes/bibtex.el" (19279 38446))
 ;;; Generated autoloads from textmodes/bibtex.el
 
 (autoload 'bibtex-initialize "bibtex" "\
@@ -1802,7 +1802,7 @@ mode is not `bibtex-mode', START is nil, and DISPLAY is t.
 ;;;***
 \f
 ;;;### (autoloads (bibtex-style-mode) "bibtex-style" "textmodes/bibtex-style.el"
-;;;;;;  (19352 21350))
+;;;;;;  (19279 5152))
 ;;; Generated autoloads from textmodes/bibtex-style.el
  (add-to-list 'auto-mode-alist (cons (purecopy "\\.bst\\'") 'bibtex-style-mode))
 
@@ -1815,7 +1815,7 @@ Major mode for editing BibTeX style files.
 \f
 ;;;### (autoloads (binhex-decode-region binhex-decode-region-external
 ;;;;;;  binhex-decode-region-internal) "binhex" "mail/binhex.el"
-;;;;;;  (19352 21350))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from mail/binhex.el
 
 (defconst binhex-begin-line "^:...............................................................$")
@@ -1838,8 +1838,8 @@ Binhex decode region between START and END.
 
 ;;;***
 \f
-;;;### (autoloads (blackbox) "blackbox" "play/blackbox.el" (19352
-;;;;;;  21350))
+;;;### (autoloads (blackbox) "blackbox" "play/blackbox.el" (19279
+;;;;;;  5151))
 ;;; Generated autoloads from play/blackbox.el
 
 (autoload 'blackbox "blackbox" "\
@@ -1962,7 +1962,7 @@ a reflection.
 ;;;;;;  bookmark-save bookmark-write bookmark-delete bookmark-insert
 ;;;;;;  bookmark-rename bookmark-insert-location bookmark-relocate
 ;;;;;;  bookmark-jump-other-window bookmark-jump bookmark-set) "bookmark"
-;;;;;;  "bookmark.el" (19352 21362))
+;;;;;;  "bookmark.el" (19326 6129))
 ;;; Generated autoloads from bookmark.el
  (define-key ctl-x-r-map "b" 'bookmark-jump)
  (define-key ctl-x-r-map "m" 'bookmark-set)
@@ -2169,7 +2169,7 @@ Incremental search of bookmarks, hiding the non-matches as we go.
 ;;;;;;  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"
-;;;;;;  (19352 21350))
+;;;;;;  (19356 10801))
 ;;; Generated autoloads from net/browse-url.el
 
 (defvar browse-url-browser-function (cond ((memq system-type '(windows-nt ms-dos cygwin)) 'browse-url-default-windows-browser) ((memq system-type '(darwin)) 'browse-url-default-macosx-browser) (t 'browse-url-default-browser)) "\
@@ -2499,8 +2499,8 @@ from `browse-url-elinks-wrapper'.
 
 ;;;***
 \f
-;;;### (autoloads (snarf-bruces bruce) "bruce" "play/bruce.el" (19352
-;;;;;;  21350))
+;;;### (autoloads (snarf-bruces bruce) "bruce" "play/bruce.el" (19279
+;;;;;;  5151))
 ;;; Generated autoloads from play/bruce.el
 
 (autoload 'bruce "bruce" "\
@@ -2516,7 +2516,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" (19352 21350))
+;;;;;;  "bs" "bs.el" (19279 5148))
 ;;; Generated autoloads from bs.el
 
 (autoload 'bs-cycle-next "bs" "\
@@ -2556,7 +2556,7 @@ name of buffer configuration.
 
 ;;;***
 \f
-;;;### (autoloads (bubbles) "bubbles" "play/bubbles.el" (19352 21350))
+;;;### (autoloads (bubbles) "bubbles" "play/bubbles.el" (19279 5151))
 ;;; Generated autoloads from play/bubbles.el
 
 (autoload 'bubbles "bubbles" "\
@@ -2578,7 +2578,7 @@ columns on its right towards the left.
 ;;;***
 \f
 ;;;### (autoloads (bug-reference-prog-mode bug-reference-mode) "bug-reference"
-;;;;;;  "progmodes/bug-reference.el" (19352 21350))
+;;;;;;  "progmodes/bug-reference.el" (19279 5151))
 ;;; Generated autoloads from progmodes/bug-reference.el
 
 (put 'bug-reference-url-format 'safe-local-variable 'stringp)
@@ -2600,7 +2600,7 @@ Like `bug-reference-mode', but only buttonize in comments and strings.
 ;;;;;;  compile-defun byte-compile-file byte-recompile-directory
 ;;;;;;  byte-force-recompile byte-compile-enable-warning byte-compile-disable-warning
 ;;;;;;  byte-compile-warnings-safe-p) "bytecomp" "emacs-lisp/bytecomp.el"
-;;;;;;  (19352 21350))
+;;;;;;  (19279 5149))
 ;;; 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)
@@ -2724,8 +2724,8 @@ and corresponding effects.
 
 ;;;***
 \f
-;;;### (autoloads nil "cal-china" "calendar/cal-china.el" (19352
-;;;;;;  21350))
+;;;### (autoloads nil "cal-china" "calendar/cal-china.el" (19279
+;;;;;;  5149))
 ;;; Generated autoloads from calendar/cal-china.el
 
 (put 'calendar-chinese-time-zone 'risky-local-variable t)
@@ -2734,7 +2734,7 @@ and corresponding effects.
 
 ;;;***
 \f
-;;;### (autoloads nil "cal-dst" "calendar/cal-dst.el" (19352 21350))
+;;;### (autoloads nil "cal-dst" "calendar/cal-dst.el" (19279 5149))
 ;;; Generated autoloads from calendar/cal-dst.el
 
 (put 'calendar-daylight-savings-starts 'risky-local-variable t)
@@ -2746,7 +2746,7 @@ and corresponding effects.
 ;;;***
 \f
 ;;;### (autoloads (calendar-hebrew-list-yahrzeits) "cal-hebrew" "calendar/cal-hebrew.el"
-;;;;;;  (19352 21360))
+;;;;;;  (19345 41626))
 ;;; Generated autoloads from calendar/cal-hebrew.el
 
 (autoload 'calendar-hebrew-list-yahrzeits "cal-hebrew" "\
@@ -2762,8 +2762,8 @@ from the cursor position.
 \f
 ;;;### (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" "calc/calc.el" (19352
-;;;;;;  21350))
+;;;;;;  full-calc calc calc-dispatch) "calc" "calc/calc.el" (19282
+;;;;;;  55646))
 ;;; Generated autoloads from calc/calc.el
  (define-key ctl-x-map "*" 'calc-dispatch)
 
@@ -2845,8 +2845,8 @@ See Info node `(calc)Defining Functions'.
 
 ;;;***
 \f
-;;;### (autoloads (calculator) "calculator" "calculator.el" (19352
-;;;;;;  21359))
+;;;### (autoloads (calculator) "calculator" "calculator.el" (19356
+;;;;;;  10801))
 ;;; Generated autoloads from calculator.el
 
 (autoload 'calculator "calculator" "\
@@ -2857,8 +2857,8 @@ See the documentation for `calculator-mode' for more information.
 
 ;;;***
 \f
-;;;### (autoloads (calendar) "calendar" "calendar/calendar.el" (19352
-;;;;;;  21350))
+;;;### (autoloads (calendar) "calendar" "calendar/calendar.el" (19279
+;;;;;;  5149))
 ;;; Generated autoloads from calendar/calendar.el
 
 (autoload 'calendar "calendar" "\
@@ -2902,7 +2902,7 @@ This function is suitable for execution in a .emacs file.
 ;;;***
 \f
 ;;;### (autoloads (canlock-verify canlock-insert-header) "canlock"
-;;;;;;  "gnus/canlock.el" (19352 21350))
+;;;;;;  "gnus/canlock.el" (19279 5150))
 ;;; Generated autoloads from gnus/canlock.el
 
 (autoload 'canlock-insert-header "canlock" "\
@@ -2920,7 +2920,7 @@ it fails.
 ;;;***
 \f
 ;;;### (autoloads (capitalized-words-mode) "cap-words" "progmodes/cap-words.el"
-;;;;;;  (19352 21350))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from progmodes/cap-words.el
 
 (autoload 'capitalized-words-mode "cap-words" "\
@@ -2955,15 +2955,15 @@ Obsoletes `c-forward-into-nomenclature'.
 
 ;;;***
 \f
-;;;### (autoloads nil "cc-compat" "progmodes/cc-compat.el" (19352
-;;;;;;  21350))
+;;;### (autoloads nil "cc-compat" "progmodes/cc-compat.el" (19279
+;;;;;;  5151))
 ;;; 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"
-;;;;;;  (19352 21360))
+;;;;;;  (19370 36541))
 ;;; Generated autoloads from progmodes/cc-engine.el
 
 (autoload 'c-guess-basic-syntax "cc-engine" "\
@@ -2975,7 +2975,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"
-;;;;;;  (19352 21360))
+;;;;;;  (19338 9841))
 ;;; Generated autoloads from progmodes/cc-mode.el
 
 (autoload 'c-initialize-cc-mode "cc-mode" "\
@@ -3135,7 +3135,7 @@ Key bindings:
 ;;;***
 \f
 ;;;### (autoloads (c-set-offset c-add-style c-set-style) "cc-styles"
-;;;;;;  "progmodes/cc-styles.el" (19352 21350))
+;;;;;;  "progmodes/cc-styles.el" (19279 5151))
 ;;; Generated autoloads from progmodes/cc-styles.el
 
 (autoload 'c-set-style "cc-styles" "\
@@ -3186,7 +3186,7 @@ and exists only for compatibility reasons.
 
 ;;;***
 \f
-;;;### (autoloads nil "cc-vars" "progmodes/cc-vars.el" (19352 21350))
+;;;### (autoloads nil "cc-vars" "progmodes/cc-vars.el" (19279 5151))
 ;;; Generated autoloads from progmodes/cc-vars.el
 (put 'c-basic-offset 'safe-local-variable 'integerp)
 (put 'c-backslash-column 'safe-local-variable 'integerp)
@@ -3196,7 +3196,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"
-;;;;;;  (19352 21350))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from international/ccl.el
 
 (autoload 'ccl-compile "ccl" "\
@@ -3455,7 +3455,7 @@ See the documentation of `define-ccl-program' for the detail of CCL program.
 ;;;***
 \f
 ;;;### (autoloads (cfengine-mode) "cfengine" "progmodes/cfengine.el"
-;;;;;;  (19352 21350))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from progmodes/cfengine.el
 
 (autoload 'cfengine-mode "cfengine" "\
@@ -3470,7 +3470,7 @@ to the action header.
 ;;;***
 \f
 ;;;### (autoloads (check-declare-directory check-declare-file) "check-declare"
-;;;;;;  "emacs-lisp/check-declare.el" (19352 21351))
+;;;;;;  "emacs-lisp/check-declare.el" (19279 5149))
 ;;; Generated autoloads from emacs-lisp/check-declare.el
 
 (autoload 'check-declare-file "check-declare" "\
@@ -3495,7 +3495,7 @@ Returns non-nil if any false statements are found.
 ;;;;;;  checkdoc-comments checkdoc-continue checkdoc-start checkdoc-current-buffer
 ;;;;;;  checkdoc-eval-current-buffer checkdoc-message-interactive
 ;;;;;;  checkdoc-interactive checkdoc checkdoc-list-of-strings-p)
-;;;;;;  "checkdoc" "emacs-lisp/checkdoc.el" (19352 21351))
+;;;;;;  "checkdoc" "emacs-lisp/checkdoc.el" (19279 5149))
 ;;; Generated autoloads from emacs-lisp/checkdoc.el
 (put 'checkdoc-force-docstrings-flag 'safe-local-variable 'booleanp)
 (put 'checkdoc-force-history-flag 'safe-local-variable 'booleanp)
@@ -3690,7 +3690,7 @@ checking of documentation strings.
 \f
 ;;;### (autoloads (pre-write-encode-hz post-read-decode-hz encode-hz-buffer
 ;;;;;;  encode-hz-region decode-hz-buffer decode-hz-region) "china-util"
-;;;;;;  "language/china-util.el" (19352 21351))
+;;;;;;  "language/china-util.el" (19279 5150))
 ;;; Generated autoloads from language/china-util.el
 
 (autoload 'decode-hz-region "china-util" "\
@@ -3728,7 +3728,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (command-history list-command-history repeat-matching-complex-command)
-;;;;;;  "chistory" "chistory.el" (19352 21351))
+;;;;;;  "chistory" "chistory.el" (19279 5148))
 ;;; Generated autoloads from chistory.el
 
 (autoload 'repeat-matching-complex-command "chistory" "\
@@ -3767,7 +3767,7 @@ and runs the normal hook `command-history-hook'.
 
 ;;;***
 \f
-;;;### (autoloads nil "cl" "emacs-lisp/cl.el" (19352 21351))
+;;;### (autoloads nil "cl" "emacs-lisp/cl.el" (19279 5149))
 ;;; Generated autoloads from emacs-lisp/cl.el
 
 (defvar custom-print-functions nil "\
@@ -3783,7 +3783,7 @@ a future Emacs interpreter will be able to use it.")
 ;;;***
 \f
 ;;;### (autoloads (common-lisp-indent-function) "cl-indent" "emacs-lisp/cl-indent.el"
-;;;;;;  (19352 21351))
+;;;;;;  (19279 5149))
 ;;; Generated autoloads from emacs-lisp/cl-indent.el
 
 (autoload 'common-lisp-indent-function "cl-indent" "\
@@ -3862,7 +3862,7 @@ For example, the function `case' has an indent property
 ;;;***
 \f
 ;;;### (autoloads (c-macro-expand) "cmacexp" "progmodes/cmacexp.el"
-;;;;;;  (19352 21352))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from progmodes/cmacexp.el
 
 (autoload 'c-macro-expand "cmacexp" "\
@@ -3882,8 +3882,8 @@ For use inside Lisp programs, see also `c-macro-expansion'.
 
 ;;;***
 \f
-;;;### (autoloads (run-scheme) "cmuscheme" "cmuscheme.el" (19352
-;;;;;;  21352))
+;;;### (autoloads (run-scheme) "cmuscheme" "cmuscheme.el" (19279
+;;;;;;  5148))
 ;;; Generated autoloads from cmuscheme.el
 
 (autoload 'run-scheme "cmuscheme" "\
@@ -3907,7 +3907,7 @@ is run).
 ;;;### (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"
-;;;;;;  (19352 21352))
+;;;;;;  (19279 5148))
 ;;; Generated autoloads from comint.el
 
 (defvar comint-output-filter-functions '(comint-postoutput-scroll-to-bottom comint-watch-for-password-prompt) "\
@@ -3999,8 +3999,8 @@ REGEXP-GROUP is the regular expression group in REGEXP to use.
 
 ;;;***
 \f
-;;;### (autoloads (compare-windows) "compare-w" "compare-w.el" (19352
-;;;;;;  21352))
+;;;### (autoloads (compare-windows) "compare-w" "compare-w.el" (19279
+;;;;;;  5148))
 ;;; Generated autoloads from compare-w.el
 
 (autoload 'compare-windows "compare-w" "\
@@ -4037,8 +4037,8 @@ 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-start-hook
-;;;;;;  compilation-mode-hook) "compile" "progmodes/compile.el" (19352
-;;;;;;  21360))
+;;;;;;  compilation-mode-hook) "compile" "progmodes/compile.el" (19375
+;;;;;;  49830))
 ;;; Generated autoloads from progmodes/compile.el
 
 (defvar compilation-mode-hook nil "\
@@ -4216,7 +4216,7 @@ This is the value of `next-error-function' in Compilation buffers.
 ;;;***
 \f
 ;;;### (autoloads (partial-completion-mode) "complete" "complete.el"
-;;;;;;  (19352 21352))
+;;;;;;  (19358 54001))
 ;;; Generated autoloads from complete.el
 
 (defvar partial-completion-mode nil "\
@@ -4258,7 +4258,7 @@ second TAB brings up the `*Completions*' buffer.
 ;;;***
 \f
 ;;;### (autoloads (dynamic-completion-mode) "completion" "completion.el"
-;;;;;;  (19352 21352))
+;;;;;;  (19279 5148))
 ;;; Generated autoloads from completion.el
 
 (defvar dynamic-completion-mode nil "\
@@ -4280,7 +4280,7 @@ Enable dynamic word-completion.
 ;;;### (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"
-;;;;;;  (19352 21353))
+;;;;;;  (19279 5152))
 ;;; Generated autoloads from textmodes/conf-mode.el
 
 (autoload 'conf-mode "conf-mode" "\
@@ -4436,7 +4436,7 @@ For details see `conf-mode'.  Example:
 ;;;***
 \f
 ;;;### (autoloads (shuffle-vector cookie-snarf cookie-insert cookie)
-;;;;;;  "cookie1" "play/cookie1.el" (19352 21353))
+;;;;;;  "cookie1" "play/cookie1.el" (19279 5151))
 ;;; Generated autoloads from play/cookie1.el
 
 (autoload 'cookie "cookie1" "\
@@ -4468,8 +4468,8 @@ Randomly permute the elements of VECTOR (all permutations equally likely).
 ;;;***
 \f
 ;;;### (autoloads (copyright-update-directory copyright copyright-fix-years
-;;;;;;  copyright-update) "copyright" "emacs-lisp/copyright.el" (19352
-;;;;;;  21353))
+;;;;;;  copyright-update) "copyright" "emacs-lisp/copyright.el" (19279
+;;;;;;  5149))
 ;;; Generated autoloads from emacs-lisp/copyright.el
 
 (autoload 'copyright-update "copyright" "\
@@ -4502,7 +4502,7 @@ Update copyright notice for all files in DIRECTORY matching MATCH.
 ;;;***
 \f
 ;;;### (autoloads (cperl-perldoc-at-point cperl-perldoc cperl-mode)
-;;;;;;  "cperl-mode" "progmodes/cperl-mode.el" (19352 21353))
+;;;;;;  "cperl-mode" "progmodes/cperl-mode.el" (19279 5151))
 ;;; Generated autoloads from progmodes/cperl-mode.el
 (put 'cperl-indent-level 'safe-local-variable 'integerp)
 (put 'cperl-brace-offset 'safe-local-variable 'integerp)
@@ -4701,7 +4701,7 @@ Run a `perldoc' on the word around point.
 ;;;***
 \f
 ;;;### (autoloads (cpp-parse-edit cpp-highlight-buffer) "cpp" "progmodes/cpp.el"
-;;;;;;  (19352 21353))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from progmodes/cpp.el
 
 (autoload 'cpp-highlight-buffer "cpp" "\
@@ -4720,7 +4720,7 @@ Edit display information for cpp conditionals.
 ;;;***
 \f
 ;;;### (autoloads (crisp-mode crisp-mode) "crisp" "emulation/crisp.el"
-;;;;;;  (19352 21353))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from emulation/crisp.el
 
 (defvar crisp-mode nil "\
@@ -4744,7 +4744,7 @@ With ARG, turn CRiSP mode on if ARG is positive, off otherwise.
 ;;;***
 \f
 ;;;### (autoloads (completing-read-multiple) "crm" "emacs-lisp/crm.el"
-;;;;;;  (19352 21353))
+;;;;;;  (19279 5149))
 ;;; Generated autoloads from emacs-lisp/crm.el
 
 (autoload 'completing-read-multiple "crm" "\
@@ -4779,8 +4779,8 @@ INHERIT-INPUT-METHOD.
 
 ;;;***
 \f
-;;;### (autoloads (css-mode) "css-mode" "textmodes/css-mode.el" (19352
-;;;;;;  21353))
+;;;### (autoloads (css-mode) "css-mode" "textmodes/css-mode.el" (19279
+;;;;;;  5152))
 ;;; Generated autoloads from textmodes/css-mode.el
  (add-to-list 'auto-mode-alist (cons (purecopy "\\.css\\'") 'css-mode))
 
@@ -4792,7 +4792,7 @@ Major mode to edit Cascading Style Sheets.
 ;;;***
 \f
 ;;;### (autoloads (cua-selection-mode cua-mode) "cua-base" "emulation/cua-base.el"
-;;;;;;  (19352 21353))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from emulation/cua-base.el
 
 (defvar cua-mode nil "\
@@ -4851,7 +4851,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"
-;;;;;;  (19352 21362))
+;;;;;;  (19356 10801))
 ;;; Generated autoloads from cus-edit.el
 
 (defvar custom-browse-sort-alphabetically nil "\
@@ -4859,8 +4859,8 @@ If non-nil, sort customization group alphabetically in `custom-browse'.")
 
 (custom-autoload 'custom-browse-sort-alphabetically "cus-edit" t)
 
-(defvar custom-buffer-sort-alphabetically nil "\
-If non-nil, sort each customization group alphabetically in Custom buffer.")
+(defvar custom-buffer-sort-alphabetically t "\
+Whether to sort customization groups alphabetically in Custom buffer.")
 
 (custom-autoload 'custom-buffer-sort-alphabetically "cus-edit" t)
 
@@ -5036,15 +5036,20 @@ Customize all already saved user options.
 \(fn)" t nil)
 
 (autoload 'customize-apropos "cus-edit" "\
-Customize all loaded options, faces and groups matching REGEXP.
-If ALL is `options', include only options.
-If ALL is `faces', include only faces.
-If ALL is `groups', include only groups.
-If ALL is t (interactively, with prefix arg), include variables
+Customize all loaded options, faces and groups matching PATTERN.
+PATTERN can be a word, a list of words (separated by spaces),
+or a regexp (using some regexp special characters).  If it is a word,
+search for matches for that word as a substring.  If it is a list of words,
+search for matches for any two (or more) of those words.
+
+If TYPE is `options', include only options.
+If TYPE is `faces', include only faces.
+If TYPE is `groups', include only groups.
+If TYPE is t (interactively, with prefix arg), include variables
 that are not customizable options, as well as faces and groups
 \(but we recommend using `apropos-variable' instead).
 
-\(fn REGEXP &optional ALL)" t nil)
+\(fn PATTERN &optional TYPE)" t nil)
 
 (autoload 'customize-apropos-options "cus-edit" "\
 Customize all loaded customizable options matching REGEXP.
@@ -5149,7 +5154,7 @@ The format is suitable for use with `easy-menu-define'.
 ;;;***
 \f
 ;;;### (autoloads (customize-create-theme) "cus-theme" "cus-theme.el"
-;;;;;;  (19352 21353))
+;;;;;;  (19279 5148))
 ;;; Generated autoloads from cus-theme.el
 
 (autoload 'customize-create-theme "cus-theme" "\
@@ -5160,7 +5165,7 @@ Create a custom theme.
 ;;;***
 \f
 ;;;### (autoloads (cvs-status-mode) "cvs-status" "cvs-status.el"
-;;;;;;  (19352 21353))
+;;;;;;  (19279 5148))
 ;;; Generated autoloads from cvs-status.el
 
 (autoload 'cvs-status-mode "cvs-status" "\
@@ -5171,7 +5176,7 @@ Mode used for cvs status output.
 ;;;***
 \f
 ;;;### (autoloads (global-cwarn-mode turn-on-cwarn-mode cwarn-mode)
-;;;;;;  "cwarn" "progmodes/cwarn.el" (19352 21353))
+;;;;;;  "cwarn" "progmodes/cwarn.el" (19279 5151))
 ;;; Generated autoloads from progmodes/cwarn.el
 
 (autoload 'cwarn-mode "cwarn" "\
@@ -5218,7 +5223,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"
-;;;;;;  (19352 21353))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from language/cyril-util.el
 
 (autoload 'cyrillic-encode-koi8-r-char "cyril-util" "\
@@ -5247,7 +5252,7 @@ If the argument is nil, we return the display table to its standard state.
 ;;;***
 \f
 ;;;### (autoloads (dabbrev-expand dabbrev-completion) "dabbrev" "dabbrev.el"
-;;;;;;  (19352 21353))
+;;;;;;  (19279 5148))
 ;;; Generated autoloads from dabbrev.el
 (put 'dabbrev-case-fold-search 'risky-local-variable t)
 (put 'dabbrev-case-replace 'risky-local-variable t)
@@ -5294,7 +5299,7 @@ See also `dabbrev-abbrev-char-regexp' and \\[dabbrev-completion].
 ;;;***
 \f
 ;;;### (autoloads (data-debug-new-buffer) "data-debug" "cedet/data-debug.el"
-;;;;;;  (19352 21362))
+;;;;;;  (19323 49698))
 ;;; Generated autoloads from cedet/data-debug.el
 
 (autoload 'data-debug-new-buffer "data-debug" "\
@@ -5304,8 +5309,8 @@ Create a new data-debug buffer with NAME.
 
 ;;;***
 \f
-;;;### (autoloads (dbus-handle-event) "dbus" "net/dbus.el" (19352
-;;;;;;  21361))
+;;;### (autoloads (dbus-handle-event) "dbus" "net/dbus.el" (19345
+;;;;;;  41626))
 ;;; Generated autoloads from net/dbus.el
 
 (autoload 'dbus-handle-event "dbus" "\
@@ -5318,8 +5323,8 @@ If the HANDLER returns an `dbus-error', it is propagated as return message.
 
 ;;;***
 \f
-;;;### (autoloads (dcl-mode) "dcl-mode" "progmodes/dcl-mode.el" (19352
-;;;;;;  21353))
+;;;### (autoloads (dcl-mode) "dcl-mode" "progmodes/dcl-mode.el" (19279
+;;;;;;  5151))
 ;;; Generated autoloads from progmodes/dcl-mode.el
 
 (autoload 'dcl-mode "dcl-mode" "\
@@ -5446,7 +5451,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" (19352 21353))
+;;;;;;  "emacs-lisp/debug.el" (19279 5149))
 ;;; Generated autoloads from emacs-lisp/debug.el
 
 (setq debugger 'debug)
@@ -5490,7 +5495,7 @@ To specify a nil argument interactively, exit with an empty minibuffer.
 ;;;***
 \f
 ;;;### (autoloads (decipher-mode decipher) "decipher" "play/decipher.el"
-;;;;;;  (19352 21353))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from play/decipher.el
 
 (autoload 'decipher "decipher" "\
@@ -5519,8 +5524,8 @@ The most useful commands are:
 ;;;***
 \f
 ;;;### (autoloads (delimit-columns-rectangle delimit-columns-region
-;;;;;;  delimit-columns-customize) "delim-col" "delim-col.el" (19352
-;;;;;;  21362))
+;;;;;;  delimit-columns-customize) "delim-col" "delim-col.el" (19323
+;;;;;;  49698))
 ;;; Generated autoloads from delim-col.el
 
 (autoload 'delimit-columns-customize "delim-col" "\
@@ -5544,8 +5549,8 @@ START and END delimits the corners of text rectangle.
 
 ;;;***
 \f
-;;;### (autoloads (delphi-mode) "delphi" "progmodes/delphi.el" (19352
-;;;;;;  21353))
+;;;### (autoloads (delphi-mode) "delphi" "progmodes/delphi.el" (19279
+;;;;;;  38446))
 ;;; Generated autoloads from progmodes/delphi.el
 
 (autoload 'delphi-mode "delphi" "\
@@ -5596,8 +5601,8 @@ no args, if that value is non-nil.
 
 ;;;***
 \f
-;;;### (autoloads (delete-selection-mode) "delsel" "delsel.el" (19352
-;;;;;;  21353))
+;;;### (autoloads (delete-selection-mode) "delsel" "delsel.el" (19279
+;;;;;;  5148))
 ;;; Generated autoloads from delsel.el
 
 (defalias 'pending-delete-mode 'delete-selection-mode)
@@ -5626,7 +5631,7 @@ any selection.
 ;;;***
 \f
 ;;;### (autoloads (derived-mode-init-mode-variables define-derived-mode)
-;;;;;;  "derived" "emacs-lisp/derived.el" (19352 21353))
+;;;;;;  "derived" "emacs-lisp/derived.el" (19279 5149))
 ;;; Generated autoloads from emacs-lisp/derived.el
 
 (autoload 'define-derived-mode "derived" "\
@@ -5691,7 +5696,7 @@ the first time the mode is used.
 ;;;***
 \f
 ;;;### (autoloads (describe-char describe-text-properties) "descr-text"
-;;;;;;  "descr-text.el" (19352 21353))
+;;;;;;  "descr-text.el" (19279 5148))
 ;;; Generated autoloads from descr-text.el
 
 (autoload 'describe-text-properties "descr-text" "\
@@ -5719,7 +5724,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" (19352 21353))
+;;;;;;  "desktop.el" (19372 27330))
 ;;; Generated autoloads from desktop.el
 
 (defvar desktop-save-mode nil "\
@@ -5903,7 +5908,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" (19352 21353))
+;;;;;;  "deuglify" "gnus/deuglify.el" (19279 5150))
 ;;; Generated autoloads from gnus/deuglify.el
 
 (autoload 'gnus-article-outlook-unwrap-lines "deuglify" "\
@@ -5936,7 +5941,7 @@ Deuglify broken Outlook (Express) articles and redisplay.
 ;;;***
 \f
 ;;;### (autoloads (diary-mode diary-mail-entries diary) "diary-lib"
-;;;;;;  "calendar/diary-lib.el" (19352 21360))
+;;;;;;  "calendar/diary-lib.el" (19299 25154))
 ;;; Generated autoloads from calendar/diary-lib.el
 
 (autoload 'diary "diary-lib" "\
@@ -5979,7 +5984,7 @@ Major mode for editing the diary file.
 ;;;***
 \f
 ;;;### (autoloads (diff-backup diff diff-command diff-switches) "diff"
-;;;;;;  "diff.el" (19352 21353))
+;;;;;;  "diff.el" (19279 5148))
 ;;; Generated autoloads from diff.el
 
 (defvar diff-switches (purecopy "-c") "\
@@ -6017,7 +6022,7 @@ With prefix arg, prompt for diff switches.
 ;;;***
 \f
 ;;;### (autoloads (diff-minor-mode diff-mode) "diff-mode" "diff-mode.el"
-;;;;;;  (19352 21353))
+;;;;;;  (19356 10801))
 ;;; Generated autoloads from diff-mode.el
 
 (autoload 'diff-mode "diff-mode" "\
@@ -6045,7 +6050,7 @@ Minor mode for viewing/editing context diffs.
 
 ;;;***
 \f
-;;;### (autoloads (dig) "dig" "net/dig.el" (19352 21353))
+;;;### (autoloads (dig) "dig" "net/dig.el" (19279 5151))
 ;;; Generated autoloads from net/dig.el
 
 (autoload 'dig "dig" "\
@@ -6058,7 +6063,7 @@ Optional arguments are passed to `dig-invoke'.
 \f
 ;;;### (autoloads (dired-mode dired-auto-revert-buffer dired-noselect
 ;;;;;;  dired-other-frame dired-other-window dired dired-trivial-filenames
-;;;;;;  dired-listing-switches) "dired" "dired.el" (19352 21360))
+;;;;;;  dired-listing-switches) "dired" "dired.el" (19313 15414))
 ;;; Generated autoloads from dired.el
 
 (defvar dired-listing-switches (purecopy "-al") "\
@@ -6203,7 +6208,7 @@ Keybindings:
 ;;;***
 \f
 ;;;### (autoloads (dirtrack dirtrack-mode) "dirtrack" "dirtrack.el"
-;;;;;;  (19352 21360))
+;;;;;;  (19299 25154))
 ;;; Generated autoloads from dirtrack.el
 
 (autoload 'dirtrack-mode "dirtrack" "\
@@ -6229,8 +6234,8 @@ function `dirtrack-debug-mode' to turn on debugging output.
 
 ;;;***
 \f
-;;;### (autoloads (disassemble) "disass" "emacs-lisp/disass.el" (19352
-;;;;;;  21353))
+;;;### (autoloads (disassemble) "disass" "emacs-lisp/disass.el" (19279
+;;;;;;  5149))
 ;;; Generated autoloads from emacs-lisp/disass.el
 
 (autoload 'disassemble "disass" "\
@@ -6249,7 +6254,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" (19352 21353))
+;;;;;;  "disp-table" "disp-table.el" (19279 5148))
 ;;; Generated autoloads from disp-table.el
 
 (autoload 'make-display-table "disp-table" "\
@@ -6361,7 +6366,7 @@ in `.emacs'.
 ;;;***
 \f
 ;;;### (autoloads (dissociated-press) "dissociate" "play/dissociate.el"
-;;;;;;  (19352 21353))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from play/dissociate.el
 
 (autoload 'dissociated-press "dissociate" "\
@@ -6377,7 +6382,7 @@ Default is 2.
 
 ;;;***
 \f
-;;;### (autoloads (dnd-protocol-alist) "dnd" "dnd.el" (19352 21353))
+;;;### (autoloads (dnd-protocol-alist) "dnd" "dnd.el" (19279 5148))
 ;;; Generated autoloads from dnd.el
 
 (defvar dnd-protocol-alist `((,(purecopy "^file:///") . dnd-open-local-file) (,(purecopy "^file://") . dnd-open-file) (,(purecopy "^file:") . dnd-open-local-file) (,(purecopy "^\\(https?\\|ftp\\|file\\|nfs\\)://") . dnd-open-file)) "\
@@ -6398,7 +6403,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" (19352 21353))
+;;;;;;  "textmodes/dns-mode.el" (19279 5152))
 ;;; Generated autoloads from textmodes/dns-mode.el
 
 (autoload 'dns-mode "dns-mode" "\
@@ -6423,7 +6428,7 @@ Locate SOA record and increment the serial field.
 ;;;***
 \f
 ;;;### (autoloads (doc-view-bookmark-jump doc-view-minor-mode doc-view-mode
-;;;;;;  doc-view-mode-p) "doc-view" "doc-view.el" (19352 21362))
+;;;;;;  doc-view-mode-p) "doc-view" "doc-view.el" (19323 49698))
 ;;; Generated autoloads from doc-view.el
 
 (autoload 'doc-view-mode-p "doc-view" "\
@@ -6458,7 +6463,7 @@ Not documented
 
 ;;;***
 \f
-;;;### (autoloads (doctor) "doctor" "play/doctor.el" (19352 21353))
+;;;### (autoloads (doctor) "doctor" "play/doctor.el" (19279 5151))
 ;;; Generated autoloads from play/doctor.el
 
 (autoload 'doctor "doctor" "\
@@ -6468,7 +6473,7 @@ Switch to *doctor* buffer and start giving psychotherapy.
 
 ;;;***
 \f
-;;;### (autoloads (double-mode) "double" "double.el" (19352 21353))
+;;;### (autoloads (double-mode) "double" "double.el" (19279 5148))
 ;;; Generated autoloads from double.el
 
 (autoload 'double-mode "double" "\
@@ -6483,7 +6488,7 @@ when pressed twice.  See variable `double-map' for details.
 
 ;;;***
 \f
-;;;### (autoloads (dunnet) "dunnet" "play/dunnet.el" (19352 21353))
+;;;### (autoloads (dunnet) "dunnet" "play/dunnet.el" (19279 5151))
 ;;; Generated autoloads from play/dunnet.el
 
 (autoload 'dunnet "dunnet" "\
@@ -6494,7 +6499,7 @@ Switch to *dungeon* buffer and start game.
 ;;;***
 \f
 ;;;### (autoloads (gnus-earcon-display) "earcon" "gnus/earcon.el"
-;;;;;;  (19352 21353))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from gnus/earcon.el
 
 (autoload 'gnus-earcon-display "earcon" "\
@@ -6506,7 +6511,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" (19352 21353))
+;;;;;;  "emacs-lisp/easy-mmode.el" (19279 5149))
 ;;; Generated autoloads from emacs-lisp/easy-mmode.el
 
 (defalias 'easy-mmode-define-minor-mode 'define-minor-mode)
@@ -6611,8 +6616,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" (19352
-;;;;;;  21353))
+;;;;;;  easy-menu-define) "easymenu" "emacs-lisp/easymenu.el" (19279
+;;;;;;  5149))
 ;;; Generated autoloads from emacs-lisp/easymenu.el
 
 (put 'easy-menu-define 'lisp-indent-function 'defun)
@@ -6766,7 +6771,7 @@ To implement dynamic menus, either call this from
 ;;;;;;  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" (19352 21353))
+;;;;;;  "progmodes/ebnf2ps.el" (19279 5151))
 ;;; Generated autoloads from progmodes/ebnf2ps.el
 
 (autoload 'ebnf-customize "ebnf2ps" "\
@@ -7040,8 +7045,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" (19352
-;;;;;;  21353))
+;;;;;;  ebrowse-tree-mode) "ebrowse" "progmodes/ebrowse.el" (19279
+;;;;;;  5151))
 ;;; Generated autoloads from progmodes/ebrowse.el
 
 (autoload 'ebrowse-tree-mode "ebrowse" "\
@@ -7192,7 +7197,7 @@ Display statistics for a class tree.
 ;;;***
 \f
 ;;;### (autoloads (electric-buffer-list) "ebuff-menu" "ebuff-menu.el"
-;;;;;;  (19352 21353))
+;;;;;;  (19279 5148))
 ;;; Generated autoloads from ebuff-menu.el
 
 (autoload 'electric-buffer-list "ebuff-menu" "\
@@ -7217,7 +7222,7 @@ Run hooks in `electric-buffer-menu-mode-hook' on entry.
 ;;;***
 \f
 ;;;### (autoloads (Electric-command-history-redo-expression) "echistory"
-;;;;;;  "echistory.el" (19352 21353))
+;;;;;;  "echistory.el" (19279 5148))
 ;;; Generated autoloads from echistory.el
 
 (autoload 'Electric-command-history-redo-expression "echistory" "\
@@ -7229,7 +7234,7 @@ With prefix arg NOCONFIRM, execute current line as-is without editing.
 ;;;***
 \f
 ;;;### (autoloads (ecomplete-setup) "ecomplete" "gnus/ecomplete.el"
-;;;;;;  (19352 21353))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from gnus/ecomplete.el
 
 (autoload 'ecomplete-setup "ecomplete" "\
@@ -7239,7 +7244,7 @@ Not documented
 
 ;;;***
 \f
-;;;### (autoloads (global-ede-mode) "ede" "cedet/ede.el" (19352 21362))
+;;;### (autoloads (global-ede-mode) "ede" "cedet/ede.el" (19323 49698))
 ;;; Generated autoloads from cedet/ede.el
 
 (defvar global-ede-mode nil "\
@@ -7265,7 +7270,7 @@ an EDE controlled project.
 \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" (19352 21353))
+;;;;;;  "emacs-lisp/edebug.el" (19279 5149))
 ;;; Generated autoloads from emacs-lisp/edebug.el
 
 (defvar edebug-all-defs nil "\
@@ -7338,7 +7343,7 @@ Toggle edebugging of all forms.
 ;;;;;;  ediff-merge-directories-with-ancestor ediff-merge-directories
 ;;;;;;  ediff-directories3 ediff-directory-revisions ediff-directories
 ;;;;;;  ediff-buffers3 ediff-buffers ediff-backup ediff-current-file
-;;;;;;  ediff-files3 ediff-files) "ediff" "ediff.el" (19352 21353))
+;;;;;;  ediff-files3 ediff-files) "ediff" "ediff.el" (19279 5148))
 ;;; Generated autoloads from ediff.el
 
 (autoload 'ediff-files "ediff" "\
@@ -7570,7 +7575,7 @@ With optional NODE, goes to that node.
 ;;;***
 \f
 ;;;### (autoloads (ediff-customize) "ediff-help" "ediff-help.el"
-;;;;;;  (19352 21353))
+;;;;;;  (19279 5148))
 ;;; Generated autoloads from ediff-help.el
 
 (autoload 'ediff-customize "ediff-help" "\
@@ -7581,7 +7586,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (ediff-show-registry) "ediff-mult" "ediff-mult.el"
-;;;;;;  (19352 21353))
+;;;;;;  (19279 5148))
 ;;; Generated autoloads from ediff-mult.el
 
 (autoload 'ediff-show-registry "ediff-mult" "\
@@ -7594,7 +7599,7 @@ Display Ediff's registry.
 ;;;***
 \f
 ;;;### (autoloads (ediff-toggle-use-toolbar ediff-toggle-multiframe)
-;;;;;;  "ediff-util" "ediff-util.el" (19352 21360))
+;;;;;;  "ediff-util" "ediff-util.el" (19313 15414))
 ;;; Generated autoloads from ediff-util.el
 
 (autoload 'ediff-toggle-multiframe "ediff-util" "\
@@ -7615,7 +7620,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"
-;;;;;;  (19352 21353))
+;;;;;;  (19279 5148))
 ;;; Generated autoloads from edmacro.el
 
 (defvar edmacro-eight-bits nil "\
@@ -7668,7 +7673,7 @@ or nil, use a compact 80-column format.
 ;;;***
 \f
 ;;;### (autoloads (edt-emulation-on edt-set-scroll-margins) "edt"
-;;;;;;  "emulation/edt.el" (19352 21353))
+;;;;;;  "emulation/edt.el" (19281 39617))
 ;;; Generated autoloads from emulation/edt.el
 
 (autoload 'edt-set-scroll-margins "edt" "\
@@ -7686,7 +7691,7 @@ Turn on EDT Emulation.
 ;;;***
 \f
 ;;;### (autoloads (electric-helpify with-electric-help) "ehelp" "ehelp.el"
-;;;;;;  (19352 21353))
+;;;;;;  (19279 5148))
 ;;; Generated autoloads from ehelp.el
 
 (autoload 'with-electric-help "ehelp" "\
@@ -7723,7 +7728,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (turn-on-eldoc-mode eldoc-mode eldoc-minor-mode-string)
-;;;;;;  "eldoc" "emacs-lisp/eldoc.el" (19352 21353))
+;;;;;;  "eldoc" "emacs-lisp/eldoc.el" (19279 5149))
 ;;; Generated autoloads from emacs-lisp/eldoc.el
 
 (defvar eldoc-minor-mode-string (purecopy " ElDoc") "\
@@ -7766,8 +7771,8 @@ Emacs Lisp mode) that support ElDoc.")
 
 ;;;***
 \f
-;;;### (autoloads (elide-head) "elide-head" "elide-head.el" (19352
-;;;;;;  21353))
+;;;### (autoloads (elide-head) "elide-head" "elide-head.el" (19279
+;;;;;;  5148))
 ;;; Generated autoloads from elide-head.el
 
 (autoload 'elide-head "elide-head" "\
@@ -7784,7 +7789,7 @@ This is suitable as an entry on `find-file-hook' or appropriate mode hooks.
 \f
 ;;;### (autoloads (elint-initialize elint-defun elint-current-buffer
 ;;;;;;  elint-directory elint-file) "elint" "emacs-lisp/elint.el"
-;;;;;;  (19352 21361))
+;;;;;;  (19338 9840))
 ;;; Generated autoloads from emacs-lisp/elint.el
 
 (autoload 'elint-file "elint" "\
@@ -7820,8 +7825,8 @@ optional prefix argument REINIT is non-nil.
 ;;;***
 \f
 ;;;### (autoloads (elp-results elp-instrument-package elp-instrument-list
-;;;;;;  elp-instrument-function) "elp" "emacs-lisp/elp.el" (19352
-;;;;;;  21353))
+;;;;;;  elp-instrument-function) "elp" "emacs-lisp/elp.el" (19279
+;;;;;;  5149))
 ;;; Generated autoloads from emacs-lisp/elp.el
 
 (autoload 'elp-instrument-function "elp" "\
@@ -7856,7 +7861,7 @@ displayed.
 ;;;***
 \f
 ;;;### (autoloads (report-emacs-bug) "emacsbug" "mail/emacsbug.el"
-;;;;;;  (19352 21353))
+;;;;;;  (19365 25156))
 ;;; Generated autoloads from mail/emacsbug.el
 
 (autoload 'report-emacs-bug "emacsbug" "\
@@ -7871,7 +7876,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" (19352 21353))
+;;;;;;  "emerge.el" (19256 49601))
 ;;; Generated autoloads from emerge.el
 
 (autoload 'emerge-files "emerge" "\
@@ -7932,7 +7937,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (enriched-decode enriched-encode enriched-mode)
-;;;;;;  "enriched" "textmodes/enriched.el" (19352 21353))
+;;;;;;  "enriched" "textmodes/enriched.el" (19279 5152))
 ;;; Generated autoloads from textmodes/enriched.el
 
 (autoload 'enriched-mode "enriched" "\
@@ -7967,8 +7972,8 @@ Not documented
 ;;;;;;  epa-sign-region epa-verify-cleartext-in-region epa-verify-region
 ;;;;;;  epa-decrypt-armor-in-region epa-decrypt-region epa-encrypt-file
 ;;;;;;  epa-sign-file epa-verify-file epa-decrypt-file epa-select-keys
-;;;;;;  epa-list-secret-keys epa-list-keys) "epa" "epa.el" (19352
-;;;;;;  21353))
+;;;;;;  epa-list-secret-keys epa-list-keys) "epa" "epa.el" (19279
+;;;;;;  5148))
 ;;; Generated autoloads from epa.el
 
 (autoload 'epa-list-keys "epa" "\
@@ -8141,7 +8146,7 @@ Insert selected KEYS after the point.
 ;;;***
 \f
 ;;;### (autoloads (epa-dired-do-encrypt epa-dired-do-sign epa-dired-do-verify
-;;;;;;  epa-dired-do-decrypt) "epa-dired" "epa-dired.el" (19352 21353))
+;;;;;;  epa-dired-do-decrypt) "epa-dired" "epa-dired.el" (19279 5148))
 ;;; Generated autoloads from epa-dired.el
 
 (autoload 'epa-dired-do-decrypt "epa-dired" "\
@@ -8167,7 +8172,7 @@ Encrypt marked files.
 ;;;***
 \f
 ;;;### (autoloads (epa-file-disable epa-file-enable epa-file-handler)
-;;;;;;  "epa-file" "epa-file.el" (19352 21353))
+;;;;;;  "epa-file" "epa-file.el" (19279 5148))
 ;;; Generated autoloads from epa-file.el
 
 (autoload 'epa-file-handler "epa-file" "\
@@ -8189,7 +8194,7 @@ Not documented
 \f
 ;;;### (autoloads (epa-global-mail-mode epa-mail-import-keys epa-mail-encrypt
 ;;;;;;  epa-mail-sign epa-mail-verify epa-mail-decrypt epa-mail-mode)
-;;;;;;  "epa-mail" "epa-mail.el" (19352 21353))
+;;;;;;  "epa-mail" "epa-mail.el" (19279 5148))
 ;;; Generated autoloads from epa-mail.el
 
 (autoload 'epa-mail-mode "epa-mail" "\
@@ -8253,7 +8258,7 @@ Minor mode to hook EasyPG into Mail mode.
 
 ;;;***
 \f
-;;;### (autoloads (epg-make-context) "epg" "epg.el" (19352 21353))
+;;;### (autoloads (epg-make-context) "epg" "epg.el" (19279 5148))
 ;;; Generated autoloads from epg.el
 
 (autoload 'epg-make-context "epg" "\
@@ -8264,7 +8269,7 @@ Return a context object.
 ;;;***
 \f
 ;;;### (autoloads (epg-expand-group epg-check-configuration epg-configuration)
-;;;;;;  "epg-config" "epg-config.el" (19352 21353))
+;;;;;;  "epg-config" "epg-config.el" (19356 10801))
 ;;; Generated autoloads from epg-config.el
 
 (autoload 'epg-configuration "epg-config" "\
@@ -8285,7 +8290,7 @@ Look at CONFIG and try to expand GROUP.
 ;;;***
 \f
 ;;;### (autoloads (erc-handle-irc-url erc erc-select-read-args) "erc"
-;;;;;;  "erc/erc.el" (19352 21360))
+;;;;;;  "erc/erc.el" (19299 25154))
 ;;; Generated autoloads from erc/erc.el
 
 (autoload 'erc-select-read-args "erc" "\
@@ -8327,33 +8332,33 @@ Otherwise, connect to HOST:PORT as USER and /join CHANNEL.
 
 ;;;***
 \f
-;;;### (autoloads nil "erc-autoaway" "erc/erc-autoaway.el" (19352
-;;;;;;  21353))
+;;;### (autoloads nil "erc-autoaway" "erc/erc-autoaway.el" (19279
+;;;;;;  5150))
 ;;; Generated autoloads from erc/erc-autoaway.el
  (autoload 'erc-autoaway-mode "erc-autoaway")
 
 ;;;***
 \f
-;;;### (autoloads nil "erc-button" "erc/erc-button.el" (19352 21353))
+;;;### (autoloads nil "erc-button" "erc/erc-button.el" (19279 5150))
 ;;; Generated autoloads from erc/erc-button.el
  (autoload 'erc-button-mode "erc-button" nil t)
 
 ;;;***
 \f
-;;;### (autoloads nil "erc-capab" "erc/erc-capab.el" (19352 21353))
+;;;### (autoloads nil "erc-capab" "erc/erc-capab.el" (19279 5150))
 ;;; 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" (19352 21353))
+;;;### (autoloads nil "erc-compat" "erc/erc-compat.el" (19279 5150))
 ;;; 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" (19352 21353))
+;;;;;;  "erc-dcc" "erc/erc-dcc.el" (19279 5150))
 ;;; Generated autoloads from erc/erc-dcc.el
  (autoload 'erc-dcc-mode "erc-dcc")
 
@@ -8386,7 +8391,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"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from erc/erc-ezbounce.el
 
 (autoload 'erc-cmd-ezb "erc-ezbounce" "\
@@ -8448,8 +8453,8 @@ Add EZBouncer convenience functions to ERC.
 
 ;;;***
 \f
-;;;### (autoloads (erc-fill) "erc-fill" "erc/erc-fill.el" (19352
-;;;;;;  21354))
+;;;### (autoloads (erc-fill) "erc-fill" "erc/erc-fill.el" (19279
+;;;;;;  5150))
 ;;; Generated autoloads from erc/erc-fill.el
  (autoload 'erc-fill-mode "erc-fill" nil t)
 
@@ -8461,15 +8466,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" (19352
-;;;;;;  21354))
+;;;### (autoloads nil "erc-hecomplete" "erc/erc-hecomplete.el" (19279
+;;;;;;  5150))
 ;;; 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" (19352 21354))
+;;;;;;  "erc/erc-identd.el" (19279 5150))
 ;;; Generated autoloads from erc/erc-identd.el
  (autoload 'erc-identd-mode "erc-identd")
 
@@ -8491,7 +8496,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (erc-create-imenu-index) "erc-imenu" "erc/erc-imenu.el"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from erc/erc-imenu.el
 
 (autoload 'erc-create-imenu-index "erc-imenu" "\
@@ -8501,20 +8506,20 @@ Not documented
 
 ;;;***
 \f
-;;;### (autoloads nil "erc-join" "erc/erc-join.el" (19352 21354))
+;;;### (autoloads nil "erc-join" "erc/erc-join.el" (19279 5150))
 ;;; Generated autoloads from erc/erc-join.el
  (autoload 'erc-autojoin-mode "erc-join" nil t)
 
 ;;;***
 \f
-;;;### (autoloads nil "erc-list" "erc/erc-list.el" (19352 21354))
+;;;### (autoloads nil "erc-list" "erc/erc-list.el" (19279 5150))
 ;;; Generated autoloads from erc/erc-list.el
  (autoload 'erc-list-mode "erc-list")
 
 ;;;***
 \f
 ;;;### (autoloads (erc-save-buffer-in-logs erc-logging-enabled) "erc-log"
-;;;;;;  "erc/erc-log.el" (19352 21354))
+;;;;;;  "erc/erc-log.el" (19279 5150))
 ;;; Generated autoloads from erc/erc-log.el
  (autoload 'erc-log-mode "erc-log" nil t)
 
@@ -8546,7 +8551,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"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from erc/erc-match.el
  (autoload 'erc-match-mode "erc-match")
 
@@ -8592,14 +8597,14 @@ Delete dangerous-host interactively to `erc-dangerous-hosts'.
 
 ;;;***
 \f
-;;;### (autoloads nil "erc-menu" "erc/erc-menu.el" (19352 21354))
+;;;### (autoloads nil "erc-menu" "erc/erc-menu.el" (19279 5150))
 ;;; 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"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from erc/erc-netsplit.el
  (autoload 'erc-netsplit-mode "erc-netsplit")
 
@@ -8611,7 +8616,7 @@ Show who's gone.
 ;;;***
 \f
 ;;;### (autoloads (erc-server-select erc-determine-network) "erc-networks"
-;;;;;;  "erc/erc-networks.el" (19352 21354))
+;;;;;;  "erc/erc-networks.el" (19279 5150))
 ;;; Generated autoloads from erc/erc-networks.el
 
 (autoload 'erc-determine-network "erc-networks" "\
@@ -8629,7 +8634,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" (19352 21354))
+;;;;;;  "erc/erc-notify.el" (19279 5150))
 ;;; Generated autoloads from erc/erc-notify.el
  (autoload 'erc-notify-mode "erc-notify" nil t)
 
@@ -8647,33 +8652,33 @@ Not documented
 
 ;;;***
 \f
-;;;### (autoloads nil "erc-page" "erc/erc-page.el" (19352 21354))
+;;;### (autoloads nil "erc-page" "erc/erc-page.el" (19279 5150))
 ;;; Generated autoloads from erc/erc-page.el
  (autoload 'erc-page-mode "erc-page")
 
 ;;;***
 \f
-;;;### (autoloads nil "erc-pcomplete" "erc/erc-pcomplete.el" (19352
-;;;;;;  21354))
+;;;### (autoloads nil "erc-pcomplete" "erc/erc-pcomplete.el" (19279
+;;;;;;  5150))
 ;;; Generated autoloads from erc/erc-pcomplete.el
  (autoload 'erc-completion-mode "erc-pcomplete" nil t)
 
 ;;;***
 \f
-;;;### (autoloads nil "erc-replace" "erc/erc-replace.el" (19352 21354))
+;;;### (autoloads nil "erc-replace" "erc/erc-replace.el" (19279 5150))
 ;;; Generated autoloads from erc/erc-replace.el
  (autoload 'erc-replace-mode "erc-replace")
 
 ;;;***
 \f
-;;;### (autoloads nil "erc-ring" "erc/erc-ring.el" (19352 21354))
+;;;### (autoloads nil "erc-ring" "erc/erc-ring.el" (19279 5150))
 ;;; 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" (19352 21362))
+;;;;;;  "erc-services" "erc/erc-services.el" (19313 15414))
 ;;; Generated autoloads from erc/erc-services.el
  (autoload 'erc-services-mode "erc-services" nil t)
 
@@ -8690,14 +8695,14 @@ When called interactively, read the password using `read-passwd'.
 
 ;;;***
 \f
-;;;### (autoloads nil "erc-sound" "erc/erc-sound.el" (19352 21354))
+;;;### (autoloads nil "erc-sound" "erc/erc-sound.el" (19279 5150))
 ;;; Generated autoloads from erc/erc-sound.el
  (autoload 'erc-sound-mode "erc-sound")
 
 ;;;***
 \f
 ;;;### (autoloads (erc-speedbar-browser) "erc-speedbar" "erc/erc-speedbar.el"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from erc/erc-speedbar.el
 
 (autoload 'erc-speedbar-browser "erc-speedbar" "\
@@ -8708,21 +8713,21 @@ This will add a speedbar major display mode.
 
 ;;;***
 \f
-;;;### (autoloads nil "erc-spelling" "erc/erc-spelling.el" (19352
-;;;;;;  21354))
+;;;### (autoloads nil "erc-spelling" "erc/erc-spelling.el" (19279
+;;;;;;  5150))
 ;;; Generated autoloads from erc/erc-spelling.el
  (autoload 'erc-spelling-mode "erc-spelling" nil t)
 
 ;;;***
 \f
-;;;### (autoloads nil "erc-stamp" "erc/erc-stamp.el" (19352 21354))
+;;;### (autoloads nil "erc-stamp" "erc/erc-stamp.el" (19279 5150))
 ;;; 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"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from erc/erc-track.el
 
 (defvar erc-track-minor-mode nil "\
@@ -8745,7 +8750,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" (19352 21354))
+;;;;;;  "erc-truncate" "erc/erc-truncate.el" (19279 5150))
 ;;; Generated autoloads from erc/erc-truncate.el
  (autoload 'erc-truncate-mode "erc-truncate" nil t)
 
@@ -8765,7 +8770,7 @@ Meant to be used in hooks, like `erc-insert-post-hook'.
 ;;;***
 \f
 ;;;### (autoloads (erc-xdcc-add-file) "erc-xdcc" "erc/erc-xdcc.el"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from erc/erc-xdcc.el
  (autoload 'erc-xdcc-mode "erc-xdcc")
 
@@ -8776,8 +8781,8 @@ Add a file to `erc-xdcc-files'.
 
 ;;;***
 \f
-;;;### (autoloads (eshell-mode) "esh-mode" "eshell/esh-mode.el" (19352
-;;;;;;  21354))
+;;;### (autoloads (eshell-mode) "esh-mode" "eshell/esh-mode.el" (19279
+;;;;;;  5150))
 ;;; Generated autoloads from eshell/esh-mode.el
 
 (autoload 'eshell-mode "esh-mode" "\
@@ -8789,8 +8794,8 @@ Emacs shell interactive mode.
 
 ;;;***
 \f
-;;;### (autoloads (eshell-test) "esh-test" "eshell/esh-test.el" (19352
-;;;;;;  21354))
+;;;### (autoloads (eshell-test) "esh-test" "eshell/esh-test.el" (19279
+;;;;;;  5150))
 ;;; Generated autoloads from eshell/esh-test.el
 
 (autoload 'eshell-test "esh-test" "\
@@ -8801,7 +8806,7 @@ Test Eshell to verify that it works as expected.
 ;;;***
 \f
 ;;;### (autoloads (eshell-command-result eshell-command eshell) "eshell"
-;;;;;;  "eshell/eshell.el" (19352 21361))
+;;;;;;  "eshell/eshell.el" (19330 37505))
 ;;; Generated autoloads from eshell/eshell.el
 
 (autoload 'eshell "eshell" "\
@@ -8842,7 +8847,7 @@ corresponding to a successful execution.
 ;;;;;;  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"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from progmodes/etags.el
 
 (defvar tags-file-name nil "\
@@ -9150,7 +9155,7 @@ for \\[find-tag] (which see).
 ;;;;;;  ethio-fidel-to-sera-marker ethio-fidel-to-sera-region ethio-fidel-to-sera-buffer
 ;;;;;;  ethio-sera-to-fidel-marker ethio-sera-to-fidel-region ethio-sera-to-fidel-buffer
 ;;;;;;  setup-ethiopic-environment-internal) "ethio-util" "language/ethio-util.el"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from language/ethio-util.el
 
 (autoload 'setup-ethiopic-environment-internal "ethio-util" "\
@@ -9320,7 +9325,7 @@ Not documented
 \f
 ;;;### (autoloads (eudc-load-eudc eudc-query-form eudc-expand-inline
 ;;;;;;  eudc-get-phone eudc-get-email eudc-set-server) "eudc" "net/eudc.el"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from net/eudc.el
 
 (autoload 'eudc-set-server "eudc" "\
@@ -9376,7 +9381,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" (19352 21354))
+;;;;;;  "eudc-bob" "net/eudc-bob.el" (19279 5151))
 ;;; Generated autoloads from net/eudc-bob.el
 
 (autoload 'eudc-display-generic-binary "eudc-bob" "\
@@ -9412,7 +9417,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" (19352 21354))
+;;;;;;  "eudc-export" "net/eudc-export.el" (19279 5151))
 ;;; Generated autoloads from net/eudc-export.el
 
 (autoload 'eudc-insert-record-at-point-into-bbdb "eudc-export" "\
@@ -9429,7 +9434,7 @@ Call `eudc-insert-record-at-point-into-bbdb' if on a record.
 ;;;***
 \f
 ;;;### (autoloads (eudc-edit-hotlist) "eudc-hotlist" "net/eudc-hotlist.el"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from net/eudc-hotlist.el
 
 (autoload 'eudc-edit-hotlist "eudc-hotlist" "\
@@ -9439,8 +9444,8 @@ Edit the hotlist of directory servers in a specialized buffer.
 
 ;;;***
 \f
-;;;### (autoloads (ewoc-create) "ewoc" "emacs-lisp/ewoc.el" (19352
-;;;;;;  21354))
+;;;### (autoloads (ewoc-create) "ewoc" "emacs-lisp/ewoc.el" (19279
+;;;;;;  5149))
 ;;; Generated autoloads from emacs-lisp/ewoc.el
 
 (autoload 'ewoc-create "ewoc" "\
@@ -9469,7 +9474,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"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from progmodes/executable.el
 
 (autoload 'executable-command-find-posix-p "executable" "\
@@ -9512,7 +9517,7 @@ file modes.
 \f
 ;;;### (autoloads (expand-jump-to-next-slot expand-jump-to-previous-slot
 ;;;;;;  expand-abbrev-hook expand-add-abbrevs) "expand" "expand.el"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 5148))
 ;;; Generated autoloads from expand.el
 
 (autoload 'expand-add-abbrevs "expand" "\
@@ -9561,7 +9566,7 @@ This is used only in conjunction with `expand-add-abbrevs'.
 
 ;;;***
 \f
-;;;### (autoloads (f90-mode) "f90" "progmodes/f90.el" (19352 21362))
+;;;### (autoloads (f90-mode) "f90" "progmodes/f90.el" (19326 6129))
 ;;; Generated autoloads from progmodes/f90.el
 
 (autoload 'f90-mode "f90" "\
@@ -9627,8 +9632,8 @@ with no args, if that value is non-nil.
 ;;;### (autoloads (variable-pitch-mode buffer-face-toggle buffer-face-set
 ;;;;;;  buffer-face-mode text-scale-adjust text-scale-decrease text-scale-increase
 ;;;;;;  text-scale-set face-remap-set-base face-remap-reset-base
-;;;;;;  face-remap-add-relative) "face-remap" "face-remap.el" (19352
-;;;;;;  21354))
+;;;;;;  face-remap-add-relative) "face-remap" "face-remap.el" (19358
+;;;;;;  54001))
 ;;; Generated autoloads from face-remap.el
 
 (autoload 'face-remap-add-relative "face-remap" "\
@@ -9768,7 +9773,7 @@ Besides the choice of face, it is the same as `buffer-face-mode'.
 \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" (19352 21354))
+;;;;;;  feedmail-send-it) "feedmail" "mail/feedmail.el" (19256 49601))
 ;;; Generated autoloads from mail/feedmail.el
 
 (autoload 'feedmail-send-it "feedmail" "\
@@ -9822,7 +9827,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" (19352 21362))
+;;;;;;  find-file-at-point ffap-next) "ffap" "ffap.el" (19321 4517))
 ;;; Generated autoloads from ffap.el
 
 (autoload 'ffap-next "ffap" "\
@@ -9886,7 +9891,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" (19352 21354))
+;;;;;;  "filecache" "filecache.el" (19279 5148))
 ;;; Generated autoloads from filecache.el
 
 (autoload 'file-cache-add-directory "filecache" "\
@@ -9946,7 +9951,7 @@ the name is considered already unique; only the second substitution
 ;;;;;;  copy-file-locals-to-dir-locals delete-dir-local-variable
 ;;;;;;  add-dir-local-variable delete-file-local-variable-prop-line
 ;;;;;;  add-file-local-variable-prop-line delete-file-local-variable
-;;;;;;  add-file-local-variable) "files-x" "files-x.el" (19352 21354))
+;;;;;;  add-file-local-variable) "files-x" "files-x.el" (19279 5148))
 ;;; Generated autoloads from files-x.el
 
 (autoload 'add-file-local-variable "files-x" "\
@@ -10011,8 +10016,8 @@ Copy directory-local variables to the -*- line.
 
 ;;;***
 \f
-;;;### (autoloads (filesets-init) "filesets" "filesets.el" (19352
-;;;;;;  21354))
+;;;### (autoloads (filesets-init) "filesets" "filesets.el" (19279
+;;;;;;  5148))
 ;;; Generated autoloads from filesets.el
 
 (autoload 'filesets-init "filesets" "\
@@ -10023,7 +10028,7 @@ Set up hooks, load the cache file -- if existing -- and build the menu.
 
 ;;;***
 \f
-;;;### (autoloads (find-cmd) "find-cmd" "find-cmd.el" (19352 21354))
+;;;### (autoloads (find-cmd) "find-cmd" "find-cmd.el" (19279 38446))
 ;;; Generated autoloads from find-cmd.el
 
 (autoload 'find-cmd "find-cmd" "\
@@ -10044,7 +10049,7 @@ result is a string that should be ready for the command line.
 \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"
-;;;;;;  (19352 21354))
+;;;;;;  (19375 49830))
 ;;; Generated autoloads from find-dired.el
 
 (defvar find-ls-option (if (eq system-type 'berkeley-unix) (purecopy '("-ls" . "-gilsb")) (purecopy '("-exec ls -ld {} \\;" . "-ld"))) "\
@@ -10105,7 +10110,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"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 5148))
 ;;; Generated autoloads from find-file.el
 
 (defvar ff-special-constructs `((,(purecopy "^#\\s *\\(include\\|import\\)\\s +[<\"]\\(.*\\)[>\"]") lambda nil (buffer-substring (match-beginning 2) (match-end 2)))) "\
@@ -10199,7 +10204,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" (19352 21354))
+;;;;;;  "emacs-lisp/find-func.el" (19279 5149))
 ;;; Generated autoloads from emacs-lisp/find-func.el
 
 (autoload 'find-library "find-func" "\
@@ -10354,7 +10359,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" (19352 21354))
+;;;;;;  find-lisp-find-dired) "find-lisp" "find-lisp.el" (19279 5148))
 ;;; Generated autoloads from find-lisp.el
 
 (autoload 'find-lisp-find-dired "find-lisp" "\
@@ -10375,7 +10380,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" (19352 21354))
+;;;;;;  "finder" "finder.el" (19368 35187))
 ;;; Generated autoloads from finder.el
 
 (autoload 'finder-list-keywords "finder" "\
@@ -10397,7 +10402,7 @@ Find packages matching a given keyword.
 ;;;***
 \f
 ;;;### (autoloads (enable-flow-control-on enable-flow-control) "flow-ctrl"
-;;;;;;  "flow-ctrl.el" (19352 21354))
+;;;;;;  "flow-ctrl.el" (19279 5148))
 ;;; Generated autoloads from flow-ctrl.el
 
 (autoload 'enable-flow-control "flow-ctrl" "\
@@ -10419,7 +10424,7 @@ to get the effect of a C-q.
 ;;;***
 \f
 ;;;### (autoloads (fill-flowed fill-flowed-encode) "flow-fill" "gnus/flow-fill.el"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from gnus/flow-fill.el
 
 (autoload 'fill-flowed-encode "flow-fill" "\
@@ -10435,7 +10440,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (flymake-mode-off flymake-mode-on flymake-mode)
-;;;;;;  "flymake" "progmodes/flymake.el" (19352 21360))
+;;;;;;  "flymake" "progmodes/flymake.el" (19299 25155))
 ;;; Generated autoloads from progmodes/flymake.el
 
 (autoload 'flymake-mode "flymake" "\
@@ -10459,7 +10464,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" (19352 21362))
+;;;;;;  "flyspell" "textmodes/flyspell.el" (19370 36541))
 ;;; Generated autoloads from textmodes/flyspell.el
 
 (autoload 'flyspell-prog-mode "flyspell" "\
@@ -10529,7 +10534,7 @@ Flyspell whole buffer.
 \f
 ;;;### (autoloads (follow-delete-other-windows-and-split follow-mode
 ;;;;;;  turn-off-follow-mode turn-on-follow-mode) "follow" "follow.el"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 5148))
 ;;; Generated autoloads from follow.el
 
 (autoload 'turn-on-follow-mode "follow" "\
@@ -10602,8 +10607,8 @@ in your `~/.emacs' file, replacing [f7] by your favourite key:
 
 ;;;***
 \f
-;;;### (autoloads (footnote-mode) "footnote" "mail/footnote.el" (19352
-;;;;;;  21354))
+;;;### (autoloads (footnote-mode) "footnote" "mail/footnote.el" (19279
+;;;;;;  5150))
 ;;; Generated autoloads from mail/footnote.el
 
 (autoload 'footnote-mode "footnote" "\
@@ -10617,7 +10622,7 @@ started, play around with the following keys:
 ;;;***
 \f
 ;;;### (autoloads (forms-find-file-other-window forms-find-file forms-mode)
-;;;;;;  "forms" "forms.el" (19352 21354))
+;;;;;;  "forms" "forms.el" (19279 5148))
 ;;; Generated autoloads from forms.el
 
 (autoload 'forms-mode "forms" "\
@@ -10654,7 +10659,7 @@ Visit a file in Forms mode in other window.
 ;;;***
 \f
 ;;;### (autoloads (fortran-mode) "fortran" "progmodes/fortran.el"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from progmodes/fortran.el
 
 (autoload 'fortran-mode "fortran" "\
@@ -10732,7 +10737,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" (19352 21354))
+;;;;;;  fortune-add-fortune) "fortune" "play/fortune.el" (19279 5151))
 ;;; Generated autoloads from play/fortune.el
 
 (autoload 'fortune-add-fortune "fortune" "\
@@ -10781,14 +10786,19 @@ and choose the directory as the fortune-file.
 
 ;;;***
 \f
-;;;### (autoloads (gdb-enable-debug gdb) "gdb-ui" "progmodes/gdb-ui.el"
-;;;;;;  (19352 21362))
-;;; Generated autoloads from progmodes/gdb-ui.el
+;;;### (autoloads (gdb gdb-enable-debug) "gdb-mi" "progmodes/gdb-mi.el"
+;;;;;;  (19375 49830))
+;;; Generated autoloads from progmodes/gdb-mi.el
 
-(autoload 'gdb "gdb-ui" "\
+(defvar gdb-enable-debug nil "\
+Non-nil means record the process input and output in `gdb-debug-log'.")
+
+(custom-autoload 'gdb-enable-debug "gdb-mi" t)
+
+(autoload 'gdb "gdb-mi" "\
 Run gdb on program FILE in buffer *gud-FILE*.
-The directory containing FILE becomes the initial working
-directory and source-file directory for your debugger.
+The directory containing FILE becomes the initial working directory
+and source-file directory for your debugger.
 
 If `gdb-many-windows' is nil (the default value) then gdb just
 pops up the GUD buffer unless `gdb-show-main' is t.  In this case
@@ -10796,10 +10806,8 @@ it starts with two windows: one displaying the GUD buffer and the
 other with the source file with the main routine of the inferior.
 
 If `gdb-many-windows' is t, regardless of the value of
-`gdb-show-main', the layout below will appear unless
-`gdb-use-separate-io-buffer' is nil when the source buffer
-occupies the full width of the frame.  Keybindings are shown in
-some of the buffers.
+`gdb-show-main', the layout below will appear.  Keybindings are
+shown in some of the buffers.
 
 Watch expressions appear in the speedbar/slowbar.
 
@@ -10811,37 +10819,37 @@ The following commands help control operation :
 See Info node `(emacs)GDB Graphical Interface' for a more
 detailed description of this mode.
 
+
 +----------------------------------------------------------------------+
 |                               GDB Toolbar                            |
 +-----------------------------------+----------------------------------+
-|  GUD buffer (I/O of GDB)          |  Locals buffer                   |
-|-----------------------------------+----------------------------------+
+| GUD buffer (I/O of GDB)           | Locals buffer                    |
+|                                   |                                  |
 |                                   |                                  |
-|  Source buffer                    |  I/O buffer for debugged program |
 |                                   |                                  |
-|-----------------------------------+----------------------------------+
-|  Stack buffer                     |  Breakpoints/threads buffer      |
 +-----------------------------------+----------------------------------+
-
-The option \"--annotate=3\" must be included in this value.  To
-run GDB in text command mode, use `gud-gdb'.  You need to use
-text command mode to debug multiple programs within one Emacs
-session.
+| Source buffer                     | I/O buffer (of debugged program) |
+|                                   | (comint-mode)                    |
+|                                   |                                  |
+|                                   |                                  |
+|                                   |                                  |
+|                                   |                                  |
+|                                   |                                  |
+|                                   |                                  |
++-----------------------------------+----------------------------------+
+| Stack buffer                      | Breakpoints buffer               |
+| RET      gdb-select-frame         | SPC    gdb-toggle-breakpoint     |
+|                                   | RET    gdb-goto-breakpoint       |
+|                                   | D      gdb-delete-breakpoint     |
++-----------------------------------+----------------------------------+
 
 \(fn COMMAND-LINE)" t nil)
 
-(defalias 'gdba 'gdb)
-
-(defvar gdb-enable-debug nil "\
-Non-nil means record the process input and output in `gdb-debug-log'.")
-
-(custom-autoload 'gdb-enable-debug "gdb-ui" t)
-
 ;;;***
 \f
 ;;;### (autoloads (generic-make-keywords-list generic-mode generic-mode-internal
-;;;;;;  define-generic-mode) "generic" "emacs-lisp/generic.el" (19352
-;;;;;;  21354))
+;;;;;;  define-generic-mode) "generic" "emacs-lisp/generic.el" (19279
+;;;;;;  5149))
 ;;; Generated autoloads from emacs-lisp/generic.el
 
 (defvar generic-mode-list nil "\
@@ -10916,7 +10924,7 @@ regular expression that can be used as an element of
 ;;;***
 \f
 ;;;### (autoloads (glasses-mode) "glasses" "progmodes/glasses.el"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from progmodes/glasses.el
 
 (autoload 'glasses-mode "glasses" "\
@@ -10930,7 +10938,7 @@ at places they belong to.
 \f
 ;;;### (autoloads (gmm-tool-bar-from-list gmm-widget-p gmm-error
 ;;;;;;  gmm-message gmm-regexp-concat) "gmm-utils" "gnus/gmm-utils.el"
-;;;;;;  (19352 21354))
+;;;;;;  (19365 25156))
 ;;; Generated autoloads from gnus/gmm-utils.el
 
 (autoload 'gmm-regexp-concat "gmm-utils" "\
@@ -10985,7 +10993,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" (19352 21354))
+;;;;;;  gnus-slave-no-server) "gnus" "gnus/gnus.el" (19279 5150))
 ;;; Generated autoloads from gnus/gnus.el
 (when (fboundp 'custom-autoload)
  (custom-autoload 'gnus-select-method "gnus"))
@@ -11038,7 +11046,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" (19352 21354))
+;;;;;;  "gnus/gnus-agent.el" (19368 35187))
 ;;; Generated autoloads from gnus/gnus-agent.el
 
 (autoload 'gnus-unplugged "gnus-agent" "\
@@ -11129,7 +11137,7 @@ If CLEAN, obsolete (ignore).
 ;;;***
 \f
 ;;;### (autoloads (gnus-article-prepare-display) "gnus-art" "gnus/gnus-art.el"
-;;;;;;  (19352 21361))
+;;;;;;  (19368 35187))
 ;;; Generated autoloads from gnus/gnus-art.el
 
 (autoload 'gnus-article-prepare-display "gnus-art" "\
@@ -11140,7 +11148,7 @@ Make the current buffer look like a nice article.
 ;;;***
 \f
 ;;;### (autoloads (gnus-audio-play) "gnus-audio" "gnus/gnus-audio.el"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from gnus/gnus-audio.el
 
 (autoload 'gnus-audio-play "gnus-audio" "\
@@ -11151,7 +11159,7 @@ Play a sound FILE through the speaker.
 ;;;***
 \f
 ;;;### (autoloads (gnus-bookmark-bmenu-list gnus-bookmark-jump gnus-bookmark-set)
-;;;;;;  "gnus-bookmark" "gnus/gnus-bookmark.el" (19352 21354))
+;;;;;;  "gnus-bookmark" "gnus/gnus-bookmark.el" (19279 5150))
 ;;; Generated autoloads from gnus/gnus-bookmark.el
 
 (autoload 'gnus-bookmark-set "gnus-bookmark" "\
@@ -11176,8 +11184,8 @@ deletion, or > if it is flagged for displaying.
 \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" (19352
-;;;;;;  21354))
+;;;;;;  gnus-jog-cache) "gnus-cache" "gnus/gnus-cache.el" (19279
+;;;;;;  5150))
 ;;; Generated autoloads from gnus/gnus-cache.el
 
 (autoload 'gnus-jog-cache "gnus-cache" "\
@@ -11219,7 +11227,7 @@ supported.
 ;;;***
 \f
 ;;;### (autoloads (gnus-delay-initialize gnus-delay-send-queue gnus-delay-article)
-;;;;;;  "gnus-delay" "gnus/gnus-delay.el" (19352 21354))
+;;;;;;  "gnus-delay" "gnus/gnus-delay.el" (19279 5150))
 ;;; Generated autoloads from gnus/gnus-delay.el
 
 (autoload 'gnus-delay-article "gnus-delay" "\
@@ -11255,7 +11263,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" (19352 21354))
+;;;;;;  "gnus-diary" "gnus/gnus-diary.el" (19279 38446))
 ;;; Generated autoloads from gnus/gnus-diary.el
 
 (autoload 'gnus-user-format-function-d "gnus-diary" "\
@@ -11271,7 +11279,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (turn-on-gnus-dired-mode) "gnus-dired" "gnus/gnus-dired.el"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from gnus/gnus-dired.el
 
 (autoload 'turn-on-gnus-dired-mode "gnus-dired" "\
@@ -11282,7 +11290,7 @@ Convenience method to turn on gnus-dired-mode.
 ;;;***
 \f
 ;;;### (autoloads (gnus-draft-reminder) "gnus-draft" "gnus/gnus-draft.el"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from gnus/gnus-draft.el
 
 (autoload 'gnus-draft-reminder "gnus-draft" "\
@@ -11294,8 +11302,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" (19352
-;;;;;;  21354))
+;;;;;;  gnus-random-x-face) "gnus-fun" "gnus/gnus-fun.el" (19279
+;;;;;;  5150))
 ;;; Generated autoloads from gnus/gnus-fun.el
 
 (autoload 'gnus-random-x-face "gnus-fun" "\
@@ -11340,7 +11348,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" (19352 21354))
+;;;;;;  "gnus-group" "gnus/gnus-group.el" (19279 5150))
 ;;; Generated autoloads from gnus/gnus-group.el
 
 (autoload 'gnus-fetch-group "gnus-group" "\
@@ -11358,7 +11366,7 @@ Pop up a frame and enter GROUP.
 ;;;***
 \f
 ;;;### (autoloads (gnus-batch-score) "gnus-kill" "gnus/gnus-kill.el"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from gnus/gnus-kill.el
 
 (defalias 'gnus-batch-kill 'gnus-batch-score)
@@ -11373,7 +11381,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"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from gnus/gnus-ml.el
 
 (autoload 'turn-on-gnus-mailing-list-mode "gnus-ml" "\
@@ -11398,7 +11406,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"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from gnus/gnus-mlspl.el
 
 (autoload 'gnus-group-split-setup "gnus-mlspl" "\
@@ -11499,7 +11507,7 @@ Calling (gnus-group-split-fancy nil nil \"mail.others\") returns:
 ;;;***
 \f
 ;;;### (autoloads (gnus-change-server) "gnus-move" "gnus/gnus-move.el"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from gnus/gnus-move.el
 
 (autoload 'gnus-change-server "gnus-move" "\
@@ -11511,7 +11519,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" (19352 21354))
+;;;;;;  "gnus-msg" "gnus/gnus-msg.el" (19279 5150))
 ;;; Generated autoloads from gnus/gnus-msg.el
 
 (autoload 'gnus-msg-mail "gnus-msg" "\
@@ -11536,7 +11544,7 @@ Like `message-reply'.
 ;;;***
 \f
 ;;;### (autoloads (gnus-nocem-load-cache gnus-nocem-scan-groups)
-;;;;;;  "gnus-nocem" "gnus/gnus-nocem.el" (19352 21354))
+;;;;;;  "gnus-nocem" "gnus/gnus-nocem.el" (19279 5150))
 ;;; Generated autoloads from gnus/gnus-nocem.el
 
 (autoload 'gnus-nocem-scan-groups "gnus-nocem" "\
@@ -11553,7 +11561,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"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from gnus/gnus-picon.el
 
 (autoload 'gnus-treat-from-picon "gnus-picon" "\
@@ -11580,7 +11588,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" (19352 21354))
+;;;;;;  "gnus/gnus-range.el" (19279 5150))
 ;;; Generated autoloads from gnus/gnus-range.el
 
 (autoload 'gnus-sorted-difference "gnus-range" "\
@@ -11648,7 +11656,7 @@ Add NUM into sorted LIST by side effect.
 ;;;***
 \f
 ;;;### (autoloads (gnus-registry-install-hooks gnus-registry-initialize)
-;;;;;;  "gnus-registry" "gnus/gnus-registry.el" (19352 21354))
+;;;;;;  "gnus-registry" "gnus/gnus-registry.el" (19368 35187))
 ;;; Generated autoloads from gnus/gnus-registry.el
 
 (autoload 'gnus-registry-initialize "gnus-registry" "\
@@ -11664,8 +11672,8 @@ Install the registry hooks.
 ;;;***
 \f
 ;;;### (autoloads (gnus-sieve-article-add-rule gnus-sieve-generate
-;;;;;;  gnus-sieve-update) "gnus-sieve" "gnus/gnus-sieve.el" (19352
-;;;;;;  21354))
+;;;;;;  gnus-sieve-update) "gnus-sieve" "gnus/gnus-sieve.el" (19279
+;;;;;;  5150))
 ;;; Generated autoloads from gnus/gnus-sieve.el
 
 (autoload 'gnus-sieve-update "gnus-sieve" "\
@@ -11693,7 +11701,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (gnus-batch-brew-soup) "gnus-soup" "gnus/gnus-soup.el"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from gnus/gnus-soup.el
 
 (autoload 'gnus-batch-brew-soup "gnus-soup" "\
@@ -11713,7 +11721,7 @@ Note -- this function hasn't been implemented yet.
 ;;;***
 \f
 ;;;### (autoloads (gnus-update-format) "gnus-spec" "gnus/gnus-spec.el"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from gnus/gnus-spec.el
 
 (autoload 'gnus-update-format "gnus-spec" "\
@@ -11724,8 +11732,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" (19352
-;;;;;;  21354))
+;;;;;;  gnus-declare-backend) "gnus-start" "gnus/gnus-start.el" (19279
+;;;;;;  5150))
 ;;; Generated autoloads from gnus/gnus-start.el
 
 (autoload 'gnus-declare-backend "gnus-start" "\
@@ -11741,7 +11749,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (gnus-add-configuration) "gnus-win" "gnus/gnus-win.el"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from gnus/gnus-win.el
 
 (autoload 'gnus-add-configuration "gnus-win" "\
@@ -11751,7 +11759,7 @@ Add the window configuration CONF to `gnus-buffer-configuration'.
 
 ;;;***
 \f
-;;;### (autoloads (gomoku) "gomoku" "play/gomoku.el" (19352 21354))
+;;;### (autoloads (gomoku) "gomoku" "play/gomoku.el" (19279 5151))
 ;;; Generated autoloads from play/gomoku.el
 
 (autoload 'gomoku "gomoku" "\
@@ -11778,8 +11786,8 @@ Use \\[describe-mode] for more info.
 ;;;***
 \f
 ;;;### (autoloads (goto-address-prog-mode goto-address-mode goto-address
-;;;;;;  goto-address-at-point) "goto-addr" "net/goto-addr.el" (19352
-;;;;;;  21354))
+;;;;;;  goto-address-at-point) "goto-addr" "net/goto-addr.el" (19356
+;;;;;;  10801))
 ;;; Generated autoloads from net/goto-addr.el
 
 (define-obsolete-function-alias 'goto-address-at-mouse 'goto-address-at-point "22.1")
@@ -11819,7 +11827,7 @@ Turn on `goto-address-mode', but only in comments and strings.
 \f
 ;;;### (autoloads (zrgrep 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" (19352 21360))
+;;;;;;  grep-window-height) "grep" "progmodes/grep.el" (19304 5068))
 ;;; Generated autoloads from progmodes/grep.el
 
 (defvar grep-window-height nil "\
@@ -11975,7 +11983,7 @@ file name to `*.gz', and sets `grep-highlight-matches' to `always'.
 
 ;;;***
 \f
-;;;### (autoloads (gs-load-image) "gs" "gs.el" (19352 21354))
+;;;### (autoloads (gs-load-image) "gs" "gs.el" (19279 5148))
 ;;; Generated autoloads from gs.el
 
 (autoload 'gs-load-image "gs" "\
@@ -11989,7 +11997,7 @@ the form \"WINDOW-ID PIXMAP-ID\".  Value is non-nil if successful.
 ;;;***
 \f
 ;;;### (autoloads (gud-tooltip-mode gdb-script-mode jdb pdb perldb
-;;;;;;  xdb dbx sdb gud-gdb) "gud" "progmodes/gud.el" (19352 21354))
+;;;;;;  xdb dbx sdb gud-gdb) "gud" "progmodes/gud.el" (19374 384))
 ;;; Generated autoloads from progmodes/gud.el
 
 (autoload 'gud-gdb "gud" "\
@@ -12077,8 +12085,8 @@ Toggle the display of GUD tooltips.
 
 ;;;***
 \f
-;;;### (autoloads (handwrite) "handwrite" "play/handwrite.el" (19352
-;;;;;;  21354))
+;;;### (autoloads (handwrite) "handwrite" "play/handwrite.el" (19279
+;;;;;;  5151))
 ;;; Generated autoloads from play/handwrite.el
 
 (autoload 'handwrite "handwrite" "\
@@ -12096,7 +12104,7 @@ Variables: handwrite-linespace     (default 12)
 ;;;***
 \f
 ;;;### (autoloads (hanoi-unix-64 hanoi-unix hanoi) "hanoi" "play/hanoi.el"
-;;;;;;  (19352 21354))
+;;;;;;  (19256 49601))
 ;;; Generated autoloads from play/hanoi.el
 
 (autoload 'hanoi "hanoi" "\
@@ -12125,7 +12133,7 @@ to be updated.
 \f
 ;;;### (autoloads (mail-check-payment mail-add-payment-async mail-add-payment
 ;;;;;;  hashcash-verify-payment hashcash-insert-payment-async hashcash-insert-payment)
-;;;;;;  "hashcash" "mail/hashcash.el" (19352 21354))
+;;;;;;  "hashcash" "mail/hashcash.el" (19365 25156))
 ;;; Generated autoloads from mail/hashcash.el
 
 (autoload 'hashcash-insert-payment "hashcash" "\
@@ -12170,7 +12178,7 @@ Prefix arg sets default accept amount temporarily.
 ;;;### (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" (19352 21354))
+;;;;;;  help-at-pt-string) "help-at-pt" "help-at-pt.el" (19279 5148))
 ;;; Generated autoloads from help-at-pt.el
 
 (autoload 'help-at-pt-string "help-at-pt" "\
@@ -12300,7 +12308,7 @@ different regions.  With numeric argument ARG, behaves like
 ;;;### (autoloads (describe-categories describe-syntax describe-variable
 ;;;;;;  variable-at-point describe-function-1 find-lisp-object-file-name
 ;;;;;;  help-C-file-name describe-function) "help-fns" "help-fns.el"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 5148))
 ;;; Generated autoloads from help-fns.el
 
 (autoload 'describe-function "help-fns" "\
@@ -12370,7 +12378,7 @@ BUFFER should be a buffer or a buffer name.
 ;;;***
 \f
 ;;;### (autoloads (three-step-help) "help-macro" "help-macro.el"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 5148))
 ;;; Generated autoloads from help-macro.el
 
 (defvar three-step-help nil "\
@@ -12386,8 +12394,8 @@ gives the window that lists the options.")
 \f
 ;;;### (autoloads (help-xref-on-pp help-insert-xref-button help-xref-button
 ;;;;;;  help-make-xrefs help-buffer help-setup-xref help-mode-finish
-;;;;;;  help-mode-setup help-mode) "help-mode" "help-mode.el" (19352
-;;;;;;  21354))
+;;;;;;  help-mode-setup help-mode) "help-mode" "help-mode.el" (19279
+;;;;;;  5148))
 ;;; Generated autoloads from help-mode.el
 
 (autoload 'help-mode "help-mode" "\
@@ -12479,7 +12487,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" (19352 21354))
+;;;;;;  "emacs-lisp/helper.el" (19279 5149))
 ;;; Generated autoloads from emacs-lisp/helper.el
 
 (autoload 'Helper-describe-bindings "helper" "\
@@ -12495,7 +12503,7 @@ Provide help for current mode.
 ;;;***
 \f
 ;;;### (autoloads (hexlify-buffer hexl-find-file hexl-mode) "hexl"
-;;;;;;  "hexl.el" (19352 21354))
+;;;;;;  "hexl.el" (19279 38446))
 ;;; Generated autoloads from hexl.el
 
 (autoload 'hexl-mode "hexl" "\
@@ -12592,7 +12600,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"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 5148))
 ;;; Generated autoloads from hi-lock.el
 
 (autoload 'hi-lock-mode "hi-lock" "\
@@ -12726,7 +12734,7 @@ be found in variable `hi-lock-interactive-patterns'.
 ;;;***
 \f
 ;;;### (autoloads (hide-ifdef-mode) "hideif" "progmodes/hideif.el"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from progmodes/hideif.el
 
 (autoload 'hide-ifdef-mode "hideif" "\
@@ -12766,7 +12774,7 @@ how the hiding is done:
 ;;;***
 \f
 ;;;### (autoloads (turn-off-hideshow hs-minor-mode) "hideshow" "progmodes/hideshow.el"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from progmodes/hideshow.el
 
 (defvar hs-special-modes-alist (mapcar 'purecopy '((c-mode "{" "}" "/[*/]" nil nil) (c++-mode "{" "}" "/[*/]" nil nil) (bibtex-mode ("@\\S(*\\(\\s(\\)" 1)) (java-mode "{" "}" "/[*/]" nil nil) (js-mode "{" "}" "/[*/]" nil))) "\
@@ -12828,8 +12836,8 @@ Unconditionally turn off `hs-minor-mode'.
 ;;;;;;  highlight-compare-buffers highlight-changes-rotate-faces
 ;;;;;;  highlight-changes-previous-change highlight-changes-next-change
 ;;;;;;  highlight-changes-remove-highlight highlight-changes-visible-mode
-;;;;;;  highlight-changes-mode) "hilit-chg" "hilit-chg.el" (19352
-;;;;;;  21354))
+;;;;;;  highlight-changes-mode) "hilit-chg" "hilit-chg.el" (19279
+;;;;;;  5148))
 ;;; Generated autoloads from hilit-chg.el
 
 (autoload 'highlight-changes-mode "hilit-chg" "\
@@ -12958,7 +12966,7 @@ See `highlight-changes-mode' for more information on Highlight-Changes mode.
 ;;;;;;  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" (19352 21354))
+;;;;;;  "hippie-exp.el" (19279 5148))
 ;;; Generated autoloads from hippie-exp.el
 
 (defvar hippie-expand-try-functions-list '(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) "\
@@ -13031,7 +13039,7 @@ argument VERBOSE non-nil makes the function verbose.
 ;;;***
 \f
 ;;;### (autoloads (global-hl-line-mode hl-line-mode) "hl-line" "hl-line.el"
-;;;;;;  (19352 21354))
+;;;;;;  (19356 10801))
 ;;; Generated autoloads from hl-line.el
 
 (autoload 'hl-line-mode "hl-line" "\
@@ -13075,7 +13083,7 @@ Global-Hl-Line mode uses the functions `global-hl-line-unhighlight' and
 ;;;;;;  holiday-bahai-holidays holiday-islamic-holidays holiday-christian-holidays
 ;;;;;;  holiday-hebrew-holidays holiday-other-holidays holiday-local-holidays
 ;;;;;;  holiday-oriental-holidays holiday-general-holidays) "holidays"
-;;;;;;  "calendar/holidays.el" (19352 21354))
+;;;;;;  "calendar/holidays.el" (19279 5149))
 ;;; Generated autoloads from calendar/holidays.el
 
 (defvar holiday-general-holidays (mapcar 'purecopy '((holiday-fixed 1 1 "New Year's Day") (holiday-float 1 1 3 "Martin Luther King Day") (holiday-fixed 2 2 "Groundhog Day") (holiday-fixed 2 14 "Valentine's Day") (holiday-float 2 1 3 "President's Day") (holiday-fixed 3 17 "St. Patrick's Day") (holiday-fixed 4 1 "April Fools' Day") (holiday-float 5 0 2 "Mother's Day") (holiday-float 5 1 -1 "Memorial Day") (holiday-fixed 6 14 "Flag Day") (holiday-float 6 0 3 "Father's Day") (holiday-fixed 7 4 "Independence Day") (holiday-float 9 1 1 "Labor Day") (holiday-float 10 1 2 "Columbus Day") (holiday-fixed 10 31 "Halloween") (holiday-fixed 11 11 "Veteran's Day") (holiday-float 11 4 4 "Thanksgiving"))) "\
@@ -13223,8 +13231,8 @@ The optional LABEL is used to label the buffer created.
 
 ;;;***
 \f
-;;;### (autoloads (html2text) "html2text" "gnus/html2text.el" (19352
-;;;;;;  21354))
+;;;### (autoloads (html2text) "html2text" "gnus/html2text.el" (19279
+;;;;;;  5150))
 ;;; Generated autoloads from gnus/html2text.el
 
 (autoload 'html2text "html2text" "\
@@ -13235,8 +13243,8 @@ Convert HTML to plain text in the current buffer.
 ;;;***
 \f
 ;;;### (autoloads (define-ibuffer-filter define-ibuffer-op define-ibuffer-sorter
-;;;;;;  define-ibuffer-column) "ibuf-macs" "ibuf-macs.el" (19352
-;;;;;;  21354))
+;;;;;;  define-ibuffer-column) "ibuf-macs" "ibuf-macs.el" (19279
+;;;;;;  5148))
 ;;; Generated autoloads from ibuf-macs.el
 
 (autoload 'define-ibuffer-column "ibuf-macs" "\
@@ -13325,7 +13333,7 @@ bound to the current value of the filter.
 ;;;***
 \f
 ;;;### (autoloads (ibuffer ibuffer-other-window ibuffer-list-buffers)
-;;;;;;  "ibuffer" "ibuffer.el" (19352 21354))
+;;;;;;  "ibuffer" "ibuffer.el" (19279 5148))
 ;;; Generated autoloads from ibuffer.el
 
 (autoload 'ibuffer-list-buffers "ibuffer" "\
@@ -13366,7 +13374,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" (19352 21361))
+;;;;;;  "calendar/icalendar.el" (19338 9840))
 ;;; Generated autoloads from calendar/icalendar.el
 
 (autoload 'icalendar-export-file "icalendar" "\
@@ -13418,8 +13426,8 @@ buffer `*icalendar-errors*'.
 
 ;;;***
 \f
-;;;### (autoloads (icomplete-mode) "icomplete" "icomplete.el" (19352
-;;;;;;  21354))
+;;;### (autoloads (icomplete-mode) "icomplete" "icomplete.el" (19279
+;;;;;;  5148))
 ;;; Generated autoloads from icomplete.el
 
 (defvar icomplete-mode nil "\
@@ -13440,7 +13448,7 @@ otherwise turn it off.
 
 ;;;***
 \f
-;;;### (autoloads (icon-mode) "icon" "progmodes/icon.el" (19352 21354))
+;;;### (autoloads (icon-mode) "icon" "progmodes/icon.el" (19279 5151))
 ;;; Generated autoloads from progmodes/icon.el
 
 (autoload 'icon-mode "icon" "\
@@ -13481,7 +13489,7 @@ with no args, if that value is non-nil.
 ;;;***
 \f
 ;;;### (autoloads (idlwave-shell) "idlw-shell" "progmodes/idlw-shell.el"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from progmodes/idlw-shell.el
 
 (autoload 'idlwave-shell "idlw-shell" "\
@@ -13507,7 +13515,7 @@ See also the variable `idlwave-shell-prompt-pattern'.
 ;;;***
 \f
 ;;;### (autoloads (idlwave-mode) "idlwave" "progmodes/idlwave.el"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 38446))
 ;;; Generated autoloads from progmodes/idlwave.el
 
 (autoload 'idlwave-mode "idlwave" "\
@@ -13641,8 +13649,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" (19352
-;;;;;;  21354))
+;;;;;;  ido-switch-buffer ido-mode ido-mode) "ido" "ido.el" (19292
+;;;;;;  15231))
 ;;; Generated autoloads from ido.el
 
 (defvar ido-mode nil "\
@@ -13903,7 +13911,7 @@ DEF, if non-nil, is the default value.
 
 ;;;***
 \f
-;;;### (autoloads (ielm) "ielm" "ielm.el" (19352 21354))
+;;;### (autoloads (ielm) "ielm" "ielm.el" (19279 5148))
 ;;; Generated autoloads from ielm.el
  (add-hook 'same-window-buffer-names (purecopy "*ielm*"))
 
@@ -13916,7 +13924,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"
-;;;;;;  (19352 21354))
+;;;;;;  (19279 5148))
 ;;; Generated autoloads from iimage.el
 
 (autoload 'turn-on-iimage-mode "iimage" "\
@@ -13931,11 +13939,11 @@ Toggle inline image minor mode.
 
 ;;;***
 \f
-;;;### (autoloads (defimage find-image remove-images insert-sliced-image
-;;;;;;  insert-image put-image create-image image-type-auto-detected-p
+;;;### (autoloads (create-animated-image defimage find-image remove-images
+;;;;;;  insert-sliced-image 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" (19352 21354))
+;;;;;;  "image" "image.el" (19356 10801))
 ;;; Generated autoloads from image.el
 
 (autoload 'image-type-from-data "image" "\
@@ -14109,6 +14117,22 @@ Example:
 
 \(fn SYMBOL SPECS &optional DOC)" nil (quote macro))
 
+(autoload 'create-animated-image "image" "\
+Create an animated image.
+FILE-OR-DATA 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,
+use its file extension as image type.
+Optional DATA-P non-nil means FILE-OR-DATA is a string containing image data.
+Optional PROPS are additional image attributes to assign to the image,
+like, e.g. `:mask MASK'.
+Value is the image created, or nil if images of type TYPE are not supported.
+
+Images should not be larger than specified by `max-image-size'.
+
+\(fn FILE-OR-DATA &optional TYPE DATA-P &rest PROPS)" nil nil)
+
 ;;;***
 \f
 ;;;### (autoloads (image-dired-dired-edit-comment-and-tags image-dired-mark-tagged-files
@@ -14118,7 +14142,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" (19352 21354))
+;;;;;;  "image-dired" "image-dired.el" (19370 36540))
 ;;; Generated autoloads from image-dired.el
 
 (autoload 'image-dired-dired-insert-marked-thumbs "image-dired" "\
@@ -14160,7 +14184,7 @@ you have the dired buffer in the left window and the
 With optional argument APPEND, append thumbnail to thumbnail buffer
 instead of erasing it first.
 
-Option argument DO-NOT-POP controls if `pop-to-buffer' should be
+Optional argument DO-NOT-POP controls if `pop-to-buffer' should be
 used or not.  If non-nil, use `display-buffer' instead of
 `pop-to-buffer'.  This is used from functions like
 `image-dired-next-line-and-display' and
@@ -14252,7 +14276,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" (19352 21354))
+;;;;;;  "image-file.el" (19279 5148))
 ;;; Generated autoloads from image-file.el
 
 (defvar image-file-name-extensions (purecopy '("png" "jpeg" "jpg" "gif" "tiff" "tif" "xbm" "xpm" "pbm" "pgm" "ppm" "pnm" "svg")) "\
@@ -14314,7 +14338,7 @@ Image files are those whose name has an extension in
 ;;;***
 \f
 ;;;### (autoloads (image-bookmark-jump image-mode-as-text image-minor-mode
-;;;;;;  image-mode) "image-mode" "image-mode.el" (19352 21360))
+;;;;;;  image-mode) "image-mode" "image-mode.el" (19356 10801))
 ;;; Generated autoloads from image-mode.el
  (push (cons (purecopy "\\.jpe?g\\'")    'image-mode) auto-mode-alist)
  (push (cons (purecopy "\\.png\\'")      'image-mode) auto-mode-alist)
@@ -14364,7 +14388,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (imenu imenu-add-menubar-index imenu-add-to-menubar
-;;;;;;  imenu-sort-function) "imenu" "imenu.el" (19352 21354))
+;;;;;;  imenu-sort-function) "imenu" "imenu.el" (19279 5148))
 ;;; Generated autoloads from imenu.el
 
 (defvar imenu-sort-function nil "\
@@ -14481,7 +14505,7 @@ for more information.
 \f
 ;;;### (autoloads (indian-2-column-to-ucs-region in-is13194-pre-write-conversion
 ;;;;;;  in-is13194-post-read-conversion indian-compose-string indian-compose-region)
-;;;;;;  "ind-util" "language/ind-util.el" (19352 21355))
+;;;;;;  "ind-util" "language/ind-util.el" (19279 5150))
 ;;; Generated autoloads from language/ind-util.el
 
 (autoload 'indian-compose-region "ind-util" "\
@@ -14513,7 +14537,7 @@ Convert old Emacs Devanagari characters to UCS.
 \f
 ;;;### (autoloads (inferior-lisp inferior-lisp-prompt inferior-lisp-load-command
 ;;;;;;  inferior-lisp-program inferior-lisp-filter-regexp) "inf-lisp"
-;;;;;;  "progmodes/inf-lisp.el" (19352 21355))
+;;;;;;  "progmodes/inf-lisp.el" (19279 5151))
 ;;; Generated autoloads from progmodes/inf-lisp.el
 
 (defvar inferior-lisp-filter-regexp (purecopy "\\`\\s *\\(:\\(\\w\\|\\s_\\)\\)?\\s *\\'") "\
@@ -14581,7 +14605,7 @@ of `inferior-lisp-program').  Runs the hooks from
 ;;;;;;  Info-goto-emacs-command-node Info-mode info-finder info-apropos
 ;;;;;;  Info-index Info-directory Info-on-current-buffer info-standalone
 ;;;;;;  info-emacs-manual info info-other-window) "info" "info.el"
-;;;;;;  (19352 21359))
+;;;;;;  (19368 35187))
 ;;; Generated autoloads from info.el
 
 (autoload 'info-other-window "info" "\
@@ -14656,8 +14680,11 @@ Build a menu of the possible matches.
 
 (autoload 'info-finder "info" "\
 Display descriptions of the keywords in the Finder virtual manual.
+In interactive use, a prefix argument directs this command to read
+a list of keywords separated by comma.  After that, it displays a node
+with a list packages that contain all specified keywords.
 
-\(fn)" t nil)
+\(fn &optional KEYWORDS)" t nil)
 
 (autoload 'Info-mode "info" "\
 Info mode provides commands for browsing through the Info documentation tree.
@@ -14760,7 +14787,7 @@ type returned by `Info-bookmark-make-record', which see.
 \f
 ;;;### (autoloads (info-complete-file info-complete-symbol info-lookup-file
 ;;;;;;  info-lookup-symbol info-lookup-reset) "info-look" "info-look.el"
-;;;;;;  (19352 21355))
+;;;;;;  (19279 5148))
 ;;; Generated autoloads from info-look.el
 
 (autoload 'info-lookup-reset "info-look" "\
@@ -14808,7 +14835,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" (19352 21355))
+;;;;;;  info-xref-check) "info-xref" "info-xref.el" (19279 5148))
 ;;; Generated autoloads from info-xref.el
 
 (autoload 'info-xref-check "info-xref" "\
@@ -14835,7 +14862,7 @@ quite a while.
 ;;;***
 \f
 ;;;### (autoloads (batch-info-validate Info-validate Info-split Info-split-threshold
-;;;;;;  Info-tagify) "informat" "informat.el" (19352 21355))
+;;;;;;  Info-tagify) "informat" "informat.el" (19279 5148))
 ;;; Generated autoloads from informat.el
 
 (autoload 'Info-tagify "informat" "\
@@ -14882,7 +14909,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"
-;;;;;;  (19352 21355))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from international/isearch-x.el
 
 (autoload 'isearch-toggle-specified-input-method "isearch-x" "\
@@ -14902,8 +14929,8 @@ Not documented
 
 ;;;***
 \f
-;;;### (autoloads (isearchb-activate) "isearchb" "isearchb.el" (19352
-;;;;;;  21355))
+;;;### (autoloads (isearchb-activate) "isearchb" "isearchb.el" (19279
+;;;;;;  5148))
 ;;; Generated autoloads from isearchb.el
 
 (autoload 'isearchb-activate "isearchb" "\
@@ -14919,7 +14946,7 @@ accessed via isearchb.
 ;;;### (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" (19352 21355))
+;;;;;;  "international/iso-cvt.el" (19279 5150))
 ;;; Generated autoloads from international/iso-cvt.el
 
 (autoload 'iso-spanish "iso-cvt" "\
@@ -15010,7 +15037,7 @@ Add submenus to the File menu, to convert to and from various formats.
 ;;;***
 \f
 ;;;### (autoloads nil "iso-transl" "international/iso-transl.el"
-;;;;;;  (19352 21355))
+;;;;;;  (19279 5150))
 ;;; 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)
@@ -15022,7 +15049,7 @@ Add submenus to the File menu, to convert to and from various formats.
 ;;;;;;  ispell-complete-word ispell-continue ispell-buffer ispell-comments-and-strings
 ;;;;;;  ispell-region ispell-change-dictionary ispell-kill-ispell
 ;;;;;;  ispell-help ispell-pdict-save ispell-word ispell-personal-dictionary)
-;;;;;;  "ispell" "textmodes/ispell.el" (19352 21360))
+;;;;;;  "ispell" "textmodes/ispell.el" (19313 15415))
 ;;; Generated autoloads from textmodes/ispell.el
 (put 'ispell-check-comments 'safe-local-variable (lambda (a) (memq a '(nil t exclusive))))
 
@@ -15240,8 +15267,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" (19352
-;;;;;;  21362))
+;;;### (autoloads (iswitchb-mode) "iswitchb" "iswitchb.el" (19321
+;;;;;;  4517))
 ;;; Generated autoloads from iswitchb.el
 
 (defvar iswitchb-mode nil "\
@@ -15266,7 +15293,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" (19352 21355))
+;;;;;;  "japan-util" "language/japan-util.el" (19279 5150))
 ;;; Generated autoloads from language/japan-util.el
 
 (autoload 'setup-japanese-environment-internal "japan-util" "\
@@ -15344,7 +15371,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" (19352 21355))
+;;;;;;  "jka-compr.el" (19292 15231))
 ;;; Generated autoloads from jka-compr.el
 
 (defvar jka-compr-inhibit nil "\
@@ -15367,7 +15394,7 @@ by `jka-compr-installed'.
 
 ;;;***
 \f
-;;;### (autoloads (js-mode) "js" "progmodes/js.el" (19352 21355))
+;;;### (autoloads (js-mode) "js" "progmodes/js.el" (19279 5151))
 ;;; Generated autoloads from progmodes/js.el
 
 (autoload 'js-mode "js" "\
@@ -15385,7 +15412,7 @@ Key bindings:
 \f
 ;;;### (autoloads (keypad-setup keypad-numlock-shifted-setup keypad-shifted-setup
 ;;;;;;  keypad-numlock-setup keypad-setup) "keypad" "emulation/keypad.el"
-;;;;;;  (19352 21355))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from emulation/keypad.el
 
 (defvar keypad-setup nil "\
@@ -15441,7 +15468,7 @@ the decimal key on the keypad is mapped to DECIMAL instead of `.'
 ;;;***
 \f
 ;;;### (autoloads (kinsoku) "kinsoku" "international/kinsoku.el"
-;;;;;;  (19352 21355))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from international/kinsoku.el
 
 (autoload 'kinsoku "kinsoku" "\
@@ -15462,8 +15489,8 @@ the context of text formatting.
 
 ;;;***
 \f
-;;;### (autoloads (kkc-region) "kkc" "international/kkc.el" (19352
-;;;;;;  21355))
+;;;### (autoloads (kkc-region) "kkc" "international/kkc.el" (19279
+;;;;;;  5150))
 ;;; Generated autoloads from international/kkc.el
 
 (defvar kkc-after-update-conversion-functions nil "\
@@ -15488,7 +15515,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-exec-ring-item)
-;;;;;;  "kmacro" "kmacro.el" (19352 21355))
+;;;;;;  "kmacro" "kmacro.el" (19279 5148))
 ;;; Generated autoloads from kmacro.el
  (global-set-key "\C-x(" 'kmacro-start-macro)
  (global-set-key "\C-x)" 'kmacro-end-macro)
@@ -15599,7 +15626,7 @@ If kbd macro currently being defined end it before activating it.
 ;;;***
 \f
 ;;;### (autoloads (setup-korean-environment-internal) "korea-util"
-;;;;;;  "language/korea-util.el" (19352 21355))
+;;;;;;  "language/korea-util.el" (19279 5150))
 ;;; Generated autoloads from language/korea-util.el
 
 (defvar default-korean-keyboard (purecopy (if (string-match "3" (or (getenv "HANGUL_KEYBOARD_TYPE") "")) "3" "")) "\
@@ -15614,7 +15641,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (lm lm-test-run) "landmark" "play/landmark.el"
-;;;;;;  (19352 21355))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from play/landmark.el
 
 (defalias 'landmark-repeat 'lm-test-run)
@@ -15648,7 +15675,7 @@ Use \\[describe-mode] for more info.
 \f
 ;;;### (autoloads (lao-compose-region lao-composition-function lao-transcribe-roman-to-lao-string
 ;;;;;;  lao-transcribe-single-roman-syllable-to-lao lao-compose-string)
-;;;;;;  "lao-util" "language/lao-util.el" (19352 21355))
+;;;;;;  "lao-util" "language/lao-util.el" (19279 5150))
 ;;; Generated autoloads from language/lao-util.el
 
 (autoload 'lao-compose-string "lao-util" "\
@@ -15687,7 +15714,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" (19352 21355))
+;;;;;;  "latexenc" "international/latexenc.el" (19279 5150))
 ;;; Generated autoloads from international/latexenc.el
 
 (defvar latex-inputenc-coding-alist (purecopy '(("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))) "\
@@ -15719,7 +15746,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" (19352 21355))
+;;;;;;  "latin1-disp" "international/latin1-disp.el" (19279 5150))
 ;;; Generated autoloads from international/latin1-disp.el
 
 (defvar latin1-display nil "\
@@ -15761,7 +15788,7 @@ use either \\[customize] or the function `latin1-display'.")
 ;;;***
 \f
 ;;;### (autoloads (ld-script-mode) "ld-script" "progmodes/ld-script.el"
-;;;;;;  (19352 21355))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from progmodes/ld-script.el
 
 (add-to-list 'auto-mode-alist (purecopy '("\\.ld[si]?\\>" . ld-script-mode)))
@@ -15778,7 +15805,7 @@ A major mode to edit GNU ld script files
 ;;;***
 \f
 ;;;### (autoloads (ledit-from-lisp-mode ledit-mode) "ledit" "ledit.el"
-;;;;;;  (19352 21355))
+;;;;;;  (19279 5148))
 ;;; Generated autoloads from ledit.el
 
 (defconst ledit-save-files t "\
@@ -15813,7 +15840,7 @@ Not documented
 
 ;;;***
 \f
-;;;### (autoloads (life) "life" "play/life.el" (19352 21355))
+;;;### (autoloads (life) "life" "play/life.el" (19279 5151))
 ;;; Generated autoloads from play/life.el
 
 (autoload 'life "life" "\
@@ -15827,7 +15854,7 @@ generations (this defaults to 1).
 ;;;***
 \f
 ;;;### (autoloads (global-linum-mode linum-mode linum-format) "linum"
-;;;;;;  "linum.el" (19352 21355))
+;;;;;;  "linum.el" (19279 5148))
 ;;; Generated autoloads from linum.el
 
 (defvar linum-format 'dynamic "\
@@ -15865,8 +15892,8 @@ See `linum-mode' for more information on Linum mode.
 
 ;;;***
 \f
-;;;### (autoloads (unload-feature) "loadhist" "loadhist.el" (19352
-;;;;;;  21355))
+;;;### (autoloads (unload-feature) "loadhist" "loadhist.el" (19279
+;;;;;;  5148))
 ;;; Generated autoloads from loadhist.el
 
 (autoload 'unload-feature "loadhist" "\
@@ -15898,7 +15925,7 @@ something strange, such as redefining an Emacs function.
 ;;;***
 \f
 ;;;### (autoloads (locate-with-filter locate locate-ls-subdir-switches)
-;;;;;;  "locate" "locate.el" (19352 21355))
+;;;;;;  "locate" "locate.el" (19279 5148))
 ;;; Generated autoloads from locate.el
 
 (defvar locate-ls-subdir-switches (purecopy "-al") "\
@@ -15949,12 +15976,13 @@ except that FILTER is not optional.
 
 ;;;***
 \f
-;;;### (autoloads (log-edit) "log-edit" "log-edit.el" (19352 21360))
+;;;### (autoloads (log-edit) "log-edit" "log-edit.el" (19370 36540))
 ;;; Generated autoloads from log-edit.el
 
 (autoload 'log-edit "log-edit" "\
 Setup a buffer to enter a log message.
-\\<log-edit-mode-map>The buffer will be put in `log-edit-mode'.
+\\<log-edit-mode-map>The buffer will be put in mode MODE or `log-edit-mode'
+if MODE is nil.
 If SETUP is non-nil, the buffer is then erased and `log-edit-hook' is run.
 Mark and point will be set around the entire contents of the buffer so
 that it is easy to kill the contents of the buffer with \\[kill-region].
@@ -15971,12 +15999,12 @@ If BUFFER is non-nil `log-edit' will jump to that buffer, use it to edit the
 log message and go back to the current buffer when done.  Otherwise, it
 uses the current buffer.
 
-\(fn CALLBACK &optional SETUP PARAMS BUFFER &rest IGNORE)" nil nil)
+\(fn CALLBACK &optional SETUP PARAMS BUFFER MODE &rest IGNORE)" nil nil)
 
 ;;;***
 \f
-;;;### (autoloads (log-view-mode) "log-view" "log-view.el" (19352
-;;;;;;  21355))
+;;;### (autoloads (log-view-mode) "log-view" "log-view.el" (19358
+;;;;;;  54001))
 ;;; Generated autoloads from log-view.el
 
 (autoload 'log-view-mode "log-view" "\
@@ -15986,8 +16014,8 @@ Major mode for browsing CVS log output.
 
 ;;;***
 \f
-;;;### (autoloads (longlines-mode) "longlines" "longlines.el" (19352
-;;;;;;  21355))
+;;;### (autoloads (longlines-mode) "longlines" "longlines.el" (19279
+;;;;;;  5148))
 ;;; Generated autoloads from longlines.el
 
 (autoload 'longlines-mode "longlines" "\
@@ -16008,8 +16036,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" (19352
-;;;;;;  21355))
+;;;;;;  lpr-command lpr-switches printer-name) "lpr" "lpr.el" (19279
+;;;;;;  5148))
 ;;; Generated autoloads from lpr.el
 
 (defvar lpr-windows-system (memq system-type '(ms-dos windows-nt)))
@@ -16103,7 +16131,7 @@ for further customization of the printer command.
 ;;;***
 \f
 ;;;### (autoloads (ls-lisp-support-shell-wildcards) "ls-lisp" "ls-lisp.el"
-;;;;;;  (19352 21362))
+;;;;;;  (19321 4517))
 ;;; Generated autoloads from ls-lisp.el
 
 (defvar ls-lisp-support-shell-wildcards t "\
@@ -16114,8 +16142,8 @@ Otherwise they are treated as Emacs regexps (for backward compatibility).")
 
 ;;;***
 \f
-;;;### (autoloads (lunar-phases) "lunar" "calendar/lunar.el" (19352
-;;;;;;  21355))
+;;;### (autoloads (lunar-phases) "lunar" "calendar/lunar.el" (19279
+;;;;;;  5149))
 ;;; Generated autoloads from calendar/lunar.el
 
 (autoload 'lunar-phases "lunar" "\
@@ -16129,8 +16157,8 @@ This function is suitable for execution in a .emacs file.
 
 ;;;***
 \f
-;;;### (autoloads (m4-mode) "m4-mode" "progmodes/m4-mode.el" (19352
-;;;;;;  21355))
+;;;### (autoloads (m4-mode) "m4-mode" "progmodes/m4-mode.el" (19279
+;;;;;;  5151))
 ;;; Generated autoloads from progmodes/m4-mode.el
 
 (autoload 'm4-mode "m4-mode" "\
@@ -16142,7 +16170,7 @@ A major mode to edit m4 macro files.
 ;;;***
 \f
 ;;;### (autoloads (macroexpand-all) "macroexp" "emacs-lisp/macroexp.el"
-;;;;;;  (19352 21355))
+;;;;;;  (19279 5149))
 ;;; Generated autoloads from emacs-lisp/macroexp.el
 
 (autoload 'macroexpand-all "macroexp" "\
@@ -16156,7 +16184,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" (19352 21359))
+;;;;;;  name-last-kbd-macro) "macros" "macros.el" (19345 41626))
 ;;; Generated autoloads from macros.el
 
 (autoload 'name-last-kbd-macro "macros" "\
@@ -16245,7 +16273,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" (19352 21355))
+;;;;;;  "mail/mail-extr.el" (19279 5150))
 ;;; Generated autoloads from mail/mail-extr.el
 
 (autoload 'mail-extract-address-components "mail-extr" "\
@@ -16277,7 +16305,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"
-;;;;;;  (19352 21355))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from mail/mail-hist.el
 
 (autoload 'mail-hist-define-keys "mail-hist" "\
@@ -16309,7 +16337,7 @@ This function normally would be called when the message is sent.
 ;;;### (autoloads (mail-fetch-field mail-unquote-printable-region
 ;;;;;;  mail-unquote-printable mail-quote-printable-region mail-quote-printable
 ;;;;;;  mail-file-babyl-p mail-use-rfc822) "mail-utils" "mail/mail-utils.el"
-;;;;;;  (19352 21360))
+;;;;;;  (19313 15414))
 ;;; Generated autoloads from mail/mail-utils.el
 
 (defvar mail-use-rfc822 nil "\
@@ -16371,8 +16399,8 @@ matches may be returned from the message body.
 ;;;***
 \f
 ;;;### (autoloads (define-mail-abbrev build-mail-abbrevs mail-abbrevs-setup
-;;;;;;  mail-abbrevs-mode) "mailabbrev" "mail/mailabbrev.el" (19352
-;;;;;;  21355))
+;;;;;;  mail-abbrevs-mode) "mailabbrev" "mail/mailabbrev.el" (19279
+;;;;;;  5150))
 ;;; Generated autoloads from mail/mailabbrev.el
 
 (defvar mail-abbrevs-mode nil "\
@@ -16414,8 +16442,8 @@ double-quotes.
 ;;;***
 \f
 ;;;### (autoloads (mail-complete define-mail-alias expand-mail-aliases
-;;;;;;  mail-complete-style) "mailalias" "mail/mailalias.el" (19352
-;;;;;;  21355))
+;;;;;;  mail-complete-style) "mailalias" "mail/mailalias.el" (19279
+;;;;;;  5150))
 ;;; Generated autoloads from mail/mailalias.el
 
 (defvar mail-complete-style 'angles "\
@@ -16461,7 +16489,7 @@ current header, calls `mail-complete-function' and passes prefix arg if any.
 ;;;***
 \f
 ;;;### (autoloads (mailclient-send-it) "mailclient" "mail/mailclient.el"
-;;;;;;  (19352 21355))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from mail/mailclient.el
 
 (autoload 'mailclient-send-it "mailclient" "\
@@ -16475,7 +16503,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" (19352 21355))
+;;;;;;  "make-mode" "progmodes/make-mode.el" (19372 27330))
 ;;; Generated autoloads from progmodes/make-mode.el
 
 (autoload 'makefile-mode "make-mode" "\
@@ -16592,8 +16620,8 @@ An adapted `makefile-mode' that knows about imake.
 
 ;;;***
 \f
-;;;### (autoloads (make-command-summary) "makesum" "makesum.el" (19352
-;;;;;;  21355))
+;;;### (autoloads (make-command-summary) "makesum" "makesum.el" (19279
+;;;;;;  5148))
 ;;; Generated autoloads from makesum.el
 
 (autoload 'make-command-summary "makesum" "\
@@ -16604,7 +16632,7 @@ Previous contents of that buffer are killed first.
 
 ;;;***
 \f
-;;;### (autoloads (man-follow man) "man" "man.el" (19352 21359))
+;;;### (autoloads (man-follow man) "man" "man.el" (19345 41626))
 ;;; Generated autoloads from man.el
 
 (defalias 'manual-entry 'man)
@@ -16653,7 +16681,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" (19352 21355))
+;;;### (autoloads (master-mode) "master" "master.el" (19279 5148))
 ;;; Generated autoloads from master.el
 
 (autoload 'master-mode "master" "\
@@ -16676,7 +16704,7 @@ yourself the value of `master-of' by calling `master-show-slave'.
 ;;;***
 \f
 ;;;### (autoloads (minibuffer-depth-indicate-mode) "mb-depth" "mb-depth.el"
-;;;;;;  (19352 21355))
+;;;;;;  (19279 5148))
 ;;; Generated autoloads from mb-depth.el
 
 (defvar minibuffer-depth-indicate-mode nil "\
@@ -16707,7 +16735,7 @@ Returns non-nil if the new state is enabled.
 ;;;;;;  message-forward-make-body message-forward message-recover
 ;;;;;;  message-supersede message-cancel-news message-followup message-wide-reply
 ;;;;;;  message-reply message-news message-mail message-mode) "message"
-;;;;;;  "gnus/message.el" (19352 21361))
+;;;;;;  "gnus/message.el" (19370 36541))
 ;;; Generated autoloads from gnus/message.el
 
 (define-mail-user-agent 'message-user-agent 'message-mail 'message-send-and-exit 'message-kill-buffer 'message-send-hook)
@@ -16873,7 +16901,7 @@ which specify the range to operate on.
 ;;;***
 \f
 ;;;### (autoloads (metapost-mode metafont-mode) "meta-mode" "progmodes/meta-mode.el"
-;;;;;;  (19352 21355))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from progmodes/meta-mode.el
 
 (autoload 'metafont-mode "meta-mode" "\
@@ -16900,7 +16928,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"
-;;;;;;  (19352 21355))
+;;;;;;  (19356 10801))
 ;;; Generated autoloads from mail/metamail.el
 
 (autoload 'metamail-interpret-header "metamail" "\
@@ -16945,7 +16973,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" (19352 21355))
+;;;;;;  "mh-e/mh-comp.el" (19279 5150))
 ;;; Generated autoloads from mh-e/mh-comp.el
 
 (autoload 'mh-smail "mh-comp" "\
@@ -17035,7 +17063,7 @@ delete the draft message.
 
 ;;;***
 \f
-;;;### (autoloads (mh-version) "mh-e" "mh-e/mh-e.el" (19352 21355))
+;;;### (autoloads (mh-version) "mh-e" "mh-e/mh-e.el" (19279 5150))
 ;;; Generated autoloads from mh-e/mh-e.el
 
 (put 'mh-progs 'risky-local-variable t)
@@ -17052,7 +17080,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" (19352 21355))
+;;;;;;  "mh-e/mh-folder.el" (19279 5150))
 ;;; Generated autoloads from mh-e/mh-folder.el
 
 (autoload 'mh-rmail "mh-folder" "\
@@ -17134,7 +17162,7 @@ perform the operation on all messages in that region.
 ;;;***
 \f
 ;;;### (autoloads (midnight-delay-set clean-buffer-list) "midnight"
-;;;;;;  "midnight.el" (19352 21355))
+;;;;;;  "midnight.el" (19369 15960))
 ;;; Generated autoloads from midnight.el
 
 (autoload 'clean-buffer-list "midnight" "\
@@ -17161,7 +17189,7 @@ to its second argument TM.
 ;;;***
 \f
 ;;;### (autoloads (minibuffer-electric-default-mode) "minibuf-eldef"
-;;;;;;  "minibuf-eldef.el" (19352 21355))
+;;;;;;  "minibuf-eldef.el" (19279 5148))
 ;;; Generated autoloads from minibuf-eldef.el
 
 (defvar minibuffer-electric-default-mode nil "\
@@ -17188,7 +17216,7 @@ Returns non-nil if the new state is enabled.
 
 ;;;***
 \f
-;;;### (autoloads (butterfly) "misc" "misc.el" (19352 21355))
+;;;### (autoloads (butterfly) "misc" "misc.el" (19279 5148))
 ;;; Generated autoloads from misc.el
 
 (autoload 'butterfly "misc" "\
@@ -17207,7 +17235,7 @@ variation of `C-x M-c M-butterfly' from url `http://xkcd.com/378/'.
 \f
 ;;;### (autoloads (multi-isearch-files-regexp multi-isearch-files
 ;;;;;;  multi-isearch-buffers-regexp multi-isearch-buffers multi-isearch-setup)
-;;;;;;  "misearch" "misearch.el" (19352 21355))
+;;;;;;  "misearch" "misearch.el" (19279 5148))
 ;;; Generated autoloads from misearch.el
  (add-hook 'isearch-mode-hook 'multi-isearch-setup)
 
@@ -17289,7 +17317,7 @@ whose file names match the specified wildcard.
 ;;;***
 \f
 ;;;### (autoloads (mixal-mode) "mixal-mode" "progmodes/mixal-mode.el"
-;;;;;;  (19352 21355))
+;;;;;;  (19358 54001))
 ;;; Generated autoloads from progmodes/mixal-mode.el
 
 (autoload 'mixal-mode "mixal-mode" "\
@@ -17303,7 +17331,7 @@ Major mode for the mixal asm language.
 ;;;***
 \f
 ;;;### (autoloads (mm-inline-external-body mm-extern-cache-contents)
-;;;;;;  "mm-extern" "gnus/mm-extern.el" (19352 21355))
+;;;;;;  "mm-extern" "gnus/mm-extern.el" (19279 5150))
 ;;; Generated autoloads from gnus/mm-extern.el
 
 (autoload 'mm-extern-cache-contents "mm-extern" "\
@@ -17322,7 +17350,7 @@ If NO-DISPLAY is nil, display it. Otherwise, do nothing after replacing.
 ;;;***
 \f
 ;;;### (autoloads (mm-inline-partial) "mm-partial" "gnus/mm-partial.el"
-;;;;;;  (19352 21355))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from gnus/mm-partial.el
 
 (autoload 'mm-inline-partial "mm-partial" "\
@@ -17336,7 +17364,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" (19352 21355))
+;;;;;;  "mm-url" "gnus/mm-url.el" (19279 5150))
 ;;; Generated autoloads from gnus/mm-url.el
 
 (autoload 'mm-url-insert-file-contents "mm-url" "\
@@ -17353,7 +17381,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" (19352 21355))
+;;;;;;  "gnus/mm-uu.el" (19279 5150))
 ;;; Generated autoloads from gnus/mm-uu.el
 
 (autoload 'mm-uu-dissect "mm-uu" "\
@@ -17373,7 +17401,7 @@ Assume text has been decoded if DECODED is non-nil.
 ;;;***
 \f
 ;;;### (autoloads (mml1991-sign mml1991-encrypt) "mml1991" "gnus/mml1991.el"
-;;;;;;  (19352 21355))
+;;;;;;  (19365 25156))
 ;;; Generated autoloads from gnus/mml1991.el
 
 (autoload 'mml1991-encrypt "mml1991" "\
@@ -17390,7 +17418,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" (19352 21355))
+;;;;;;  "mml2015" "gnus/mml2015.el" (19365 25156))
 ;;; Generated autoloads from gnus/mml2015.el
 
 (autoload 'mml2015-decrypt "mml2015" "\
@@ -17431,7 +17459,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (modula-2-mode) "modula2" "progmodes/modula2.el"
-;;;;;;  (19352 21355))
+;;;;;;  (19256 49603))
 ;;; Generated autoloads from progmodes/modula2.el
 
 (autoload 'modula-2-mode "modula2" "\
@@ -17463,7 +17491,7 @@ followed by the first character of the construct.
 ;;;***
 \f
 ;;;### (autoloads (unmorse-region morse-region) "morse" "play/morse.el"
-;;;;;;  (19352 21355))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from play/morse.el
 
 (autoload 'morse-region "morse" "\
@@ -17479,7 +17507,7 @@ Convert morse coded text in region to ordinary ASCII text.
 ;;;***
 \f
 ;;;### (autoloads (mouse-drag-drag mouse-drag-throw) "mouse-drag"
-;;;;;;  "mouse-drag.el" (19352 21355))
+;;;;;;  "mouse-drag.el" (19279 5148))
 ;;; Generated autoloads from mouse-drag.el
 
 (autoload 'mouse-drag-throw "mouse-drag" "\
@@ -17526,8 +17554,8 @@ To test this function, evaluate:
 
 ;;;***
 \f
-;;;### (autoloads (mouse-sel-mode) "mouse-sel" "mouse-sel.el" (19352
-;;;;;;  21355))
+;;;### (autoloads (mouse-sel-mode) "mouse-sel" "mouse-sel.el" (19279
+;;;;;;  5148))
 ;;; Generated autoloads from mouse-sel.el
 
 (defvar mouse-sel-mode nil "\
@@ -17579,7 +17607,7 @@ primary selection and region.
 
 ;;;***
 \f
-;;;### (autoloads (mpc) "mpc" "mpc.el" (19352 21355))
+;;;### (autoloads (mpc) "mpc" "mpc.el" (19372 27330))
 ;;; Generated autoloads from mpc.el
 
 (autoload 'mpc "mpc" "\
@@ -17589,7 +17617,7 @@ Main entry point for MPC.
 
 ;;;***
 \f
-;;;### (autoloads (mpuz) "mpuz" "play/mpuz.el" (19352 21355))
+;;;### (autoloads (mpuz) "mpuz" "play/mpuz.el" (19279 5151))
 ;;; Generated autoloads from play/mpuz.el
 
 (autoload 'mpuz "mpuz" "\
@@ -17599,7 +17627,7 @@ Multiplication puzzle with GNU Emacs.
 
 ;;;***
 \f
-;;;### (autoloads (msb-mode) "msb" "msb.el" (19352 21355))
+;;;### (autoloads (msb-mode) "msb" "msb.el" (19279 5148))
 ;;; Generated autoloads from msb.el
 
 (defvar msb-mode nil "\
@@ -17626,7 +17654,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"
-;;;;;;  (19352 21355))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from international/mule-diag.el
 
 (autoload 'list-character-sets "mule-diag" "\
@@ -17763,7 +17791,7 @@ The default is 20.  If LIMIT is negative, do not limit the listing.
 ;;;;;;  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" (19352 21362))
+;;;;;;  "mule-util" "international/mule-util.el" (19313 15414))
 ;;; Generated autoloads from international/mule-util.el
 
 (autoload 'string-to-sequence "mule-util" "\
@@ -17903,8 +17931,8 @@ per-character basis, this may not be accurate.
 ;;;### (autoloads (network-connection network-connection-to-service
 ;;;;;;  whois-reverse-lookup whois finger ftp run-dig dns-lookup-host
 ;;;;;;  nslookup nslookup-host ping traceroute route arp netstat
-;;;;;;  iwconfig ifconfig) "net-utils" "net/net-utils.el" (19352
-;;;;;;  21355))
+;;;;;;  iwconfig ifconfig) "net-utils" "net/net-utils.el" (19279
+;;;;;;  5151))
 ;;; Generated autoloads from net/net-utils.el
 
 (autoload 'ifconfig "net-utils" "\
@@ -18003,7 +18031,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" (19352 21355))
+;;;;;;  "newcomment.el" (19279 5148))
 ;;; Generated autoloads from newcomment.el
 
 (defalias 'indent-for-comment 'comment-indent)
@@ -18203,7 +18231,7 @@ unless optional argument SOFT is non-nil.
 ;;;***
 \f
 ;;;### (autoloads (newsticker-start newsticker-running-p) "newst-backend"
-;;;;;;  "net/newst-backend.el" (19352 21355))
+;;;;;;  "net/newst-backend.el" (19279 5151))
 ;;; Generated autoloads from net/newst-backend.el
 
 (autoload 'newsticker-running-p "newst-backend" "\
@@ -18225,7 +18253,7 @@ Run `newsticker-start-hook' if newsticker was not running already.
 ;;;***
 \f
 ;;;### (autoloads (newsticker-plainview) "newst-plainview" "net/newst-plainview.el"
-;;;;;;  (19352 21355))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from net/newst-plainview.el
 
 (autoload 'newsticker-plainview "newst-plainview" "\
@@ -18236,7 +18264,7 @@ Start newsticker plainview.
 ;;;***
 \f
 ;;;### (autoloads (newsticker-show-news) "newst-reader" "net/newst-reader.el"
-;;;;;;  (19352 21355))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from net/newst-reader.el
 
 (autoload 'newsticker-show-news "newst-reader" "\
@@ -18247,7 +18275,7 @@ Start reading news.  You may want to bind this to a key.
 ;;;***
 \f
 ;;;### (autoloads (newsticker-start-ticker newsticker-ticker-running-p)
-;;;;;;  "newst-ticker" "net/newst-ticker.el" (19352 21355))
+;;;;;;  "newst-ticker" "net/newst-ticker.el" (19279 5151))
 ;;; Generated autoloads from net/newst-ticker.el
 
 (autoload 'newsticker-ticker-running-p "newst-ticker" "\
@@ -18268,7 +18296,7 @@ running already.
 ;;;***
 \f
 ;;;### (autoloads (newsticker-treeview) "newst-treeview" "net/newst-treeview.el"
-;;;;;;  (19352 21355))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from net/newst-treeview.el
 
 (autoload 'newsticker-treeview "newst-treeview" "\
@@ -18279,7 +18307,7 @@ Start newsticker treeview.
 ;;;***
 \f
 ;;;### (autoloads (nndiary-generate-nov-databases) "nndiary" "gnus/nndiary.el"
-;;;;;;  (19352 21355))
+;;;;;;  (19279 38446))
 ;;; Generated autoloads from gnus/nndiary.el
 
 (autoload 'nndiary-generate-nov-databases "nndiary" "\
@@ -18289,8 +18317,8 @@ Generate NOV databases in all nndiary directories.
 
 ;;;***
 \f
-;;;### (autoloads (nndoc-add-type) "nndoc" "gnus/nndoc.el" (19352
-;;;;;;  21355))
+;;;### (autoloads (nndoc-add-type) "nndoc" "gnus/nndoc.el" (19279
+;;;;;;  5150))
 ;;; Generated autoloads from gnus/nndoc.el
 
 (autoload 'nndoc-add-type "nndoc" "\
@@ -18305,7 +18333,7 @@ symbol in the alist.
 ;;;***
 \f
 ;;;### (autoloads (nnfolder-generate-active-file) "nnfolder" "gnus/nnfolder.el"
-;;;;;;  (19352 21355))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from gnus/nnfolder.el
 
 (autoload 'nnfolder-generate-active-file "nnfolder" "\
@@ -18317,7 +18345,7 @@ This command does not work if you use short group names.
 ;;;***
 \f
 ;;;### (autoloads (nnkiboze-generate-groups) "nnkiboze" "gnus/nnkiboze.el"
-;;;;;;  (19352 21355))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from gnus/nnkiboze.el
 
 (autoload 'nnkiboze-generate-groups "nnkiboze" "\
@@ -18329,7 +18357,7 @@ Finds out what articles are to be part of the nnkiboze groups.
 ;;;***
 \f
 ;;;### (autoloads (nnml-generate-nov-databases) "nnml" "gnus/nnml.el"
-;;;;;;  (19352 21357))
+;;;;;;  (19279 38446))
 ;;; Generated autoloads from gnus/nnml.el
 
 (autoload 'nnml-generate-nov-databases "nnml" "\
@@ -18340,7 +18368,7 @@ Generate NOV databases in all nnml directories.
 ;;;***
 \f
 ;;;### (autoloads (nnsoup-revert-variables nnsoup-set-variables nnsoup-pack-replies)
-;;;;;;  "nnsoup" "gnus/nnsoup.el" (19352 21357))
+;;;;;;  "nnsoup" "gnus/nnsoup.el" (19279 5150))
 ;;; Generated autoloads from gnus/nnsoup.el
 
 (autoload 'nnsoup-pack-replies "nnsoup" "\
@@ -18361,7 +18389,7 @@ Revert posting and mailing methods to the standard Emacs methods.
 ;;;***
 \f
 ;;;### (autoloads (disable-command enable-command disabled-command-function)
-;;;;;;  "novice" "novice.el" (19352 21357))
+;;;;;;  "novice" "novice.el" (19279 5148))
 ;;; Generated autoloads from novice.el
 
 (defvar disabled-command-function 'disabled-command-function "\
@@ -18394,7 +18422,7 @@ to future sessions.
 ;;;***
 \f
 ;;;### (autoloads (nroff-mode) "nroff-mode" "textmodes/nroff-mode.el"
-;;;;;;  (19352 21357))
+;;;;;;  (19279 5152))
 ;;; Generated autoloads from textmodes/nroff-mode.el
 
 (autoload 'nroff-mode "nroff-mode" "\
@@ -18409,7 +18437,7 @@ closing requests for requests that are used in matched pairs.
 ;;;***
 \f
 ;;;### (autoloads (nxml-glyph-display-string) "nxml-glyph" "nxml/nxml-glyph.el"
-;;;;;;  (19352 21357))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from nxml/nxml-glyph.el
 
 (autoload 'nxml-glyph-display-string "nxml-glyph" "\
@@ -18421,8 +18449,8 @@ Return nil if the face cannot display a glyph for N.
 
 ;;;***
 \f
-;;;### (autoloads (nxml-mode) "nxml-mode" "nxml/nxml-mode.el" (19352
-;;;;;;  21362))
+;;;### (autoloads (nxml-mode) "nxml-mode" "nxml/nxml-mode.el" (19356
+;;;;;;  10801))
 ;;; Generated autoloads from nxml/nxml-mode.el
 
 (autoload 'nxml-mode "nxml-mode" "\
@@ -18484,7 +18512,7 @@ Many aspects this mode can be customized using
 ;;;***
 \f
 ;;;### (autoloads (nxml-enable-unicode-char-name-sets) "nxml-uchnm"
-;;;;;;  "nxml/nxml-uchnm.el" (19352 21357))
+;;;;;;  "nxml/nxml-uchnm.el" (19279 5151))
 ;;; Generated autoloads from nxml/nxml-uchnm.el
 
 (autoload 'nxml-enable-unicode-char-name-sets "nxml-uchnm" "\
@@ -18497,7 +18525,7 @@ the variable `nxml-enabled-unicode-blocks'.
 ;;;***
 \f
 ;;;### (autoloads (inferior-octave) "octave-inf" "progmodes/octave-inf.el"
-;;;;;;  (19352 21357))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from progmodes/octave-inf.el
 
 (autoload 'inferior-octave "octave-inf" "\
@@ -18520,7 +18548,7 @@ startup file, `~/.emacs-octave'.
 ;;;***
 \f
 ;;;### (autoloads (octave-mode) "octave-mod" "progmodes/octave-mod.el"
-;;;;;;  (19352 21357))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from progmodes/octave-mod.el
 
 (autoload 'octave-mode "octave-mod" "\
@@ -18615,7 +18643,7 @@ including a reproducible test case and send the message.
 ;;;;;;  org-map-entries org-open-link-from-string org-open-at-point-global
 ;;;;;;  org-insert-link-global org-store-link org-run-like-in-org-mode
 ;;;;;;  turn-on-orgstruct++ turn-on-orgstruct orgstruct-mode org-global-cycle
-;;;;;;  org-mode) "org" "org/org.el" (19352 21357))
+;;;;;;  org-mode) "org" "org/org.el" (19356 10801))
 ;;; Generated autoloads from org/org.el
 
 (autoload 'org-mode "org" "\
@@ -18828,7 +18856,7 @@ Call the customize function with org as argument.
 ;;;;;;  org-diary org-agenda-list-stuck-projects org-tags-view org-todo-list
 ;;;;;;  org-search-view org-agenda-list org-batch-store-agenda-views
 ;;;;;;  org-store-agenda-views org-batch-agenda-csv org-batch-agenda
-;;;;;;  org-agenda) "org-agenda" "org/org-agenda.el" (19352 21357))
+;;;;;;  org-agenda) "org-agenda" "org/org-agenda.el" (19279 5151))
 ;;; Generated autoloads from org/org-agenda.el
 
 (autoload 'org-agenda "org-agenda" "\
@@ -19091,7 +19119,7 @@ belonging to the \"Work\" category.
 \f
 ;;;### (autoloads (org-archive-subtree-default-with-confirmation
 ;;;;;;  org-archive-subtree-default) "org-archive" "org/org-archive.el"
-;;;;;;  (19352 21357))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from org/org-archive.el
 
 (autoload 'org-archive-subtree-default "org-archive" "\
@@ -19110,7 +19138,7 @@ This command is set with the variable `org-archive-default-command'.
 \f
 ;;;### (autoloads (org-export-as-ascii org-export-region-as-ascii
 ;;;;;;  org-replace-region-by-ascii org-export-as-ascii-to-buffer)
-;;;;;;  "org-ascii" "org/org-ascii.el" (19352 21357))
+;;;;;;  "org-ascii" "org/org-ascii.el" (19279 5151))
 ;;; Generated autoloads from org/org-ascii.el
 
 (autoload 'org-export-as-ascii-to-buffer "org-ascii" "\
@@ -19163,8 +19191,8 @@ publishing directory.
 
 ;;;***
 \f
-;;;### (autoloads (org-attach) "org-attach" "org/org-attach.el" (19352
-;;;;;;  21357))
+;;;### (autoloads (org-attach) "org-attach" "org/org-attach.el" (19279
+;;;;;;  5151))
 ;;; Generated autoloads from org/org-attach.el
 
 (autoload 'org-attach "org-attach" "\
@@ -19176,7 +19204,7 @@ Shows a list of commands and prompts for another key to execute a command.
 ;;;***
 \f
 ;;;### (autoloads (org-bbdb-anniversaries) "org-bbdb" "org/org-bbdb.el"
-;;;;;;  (19352 21357))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from org/org-bbdb.el
 
 (autoload 'org-bbdb-anniversaries "org-bbdb" "\
@@ -19187,7 +19215,7 @@ Extract anniversaries from BBDB for display in the agenda.
 ;;;***
 \f
 ;;;### (autoloads (org-clock-persistence-insinuate org-get-clocktable)
-;;;;;;  "org-clock" "org/org-clock.el" (19352 21357))
+;;;;;;  "org-clock" "org/org-clock.el" (19279 5151))
 ;;; Generated autoloads from org/org-clock.el
 
 (autoload 'org-get-clocktable "org-clock" "\
@@ -19207,7 +19235,7 @@ Set up hooks for clock persistence
 ;;;### (autoloads (org-export-as-docbook org-export-as-docbook-pdf-and-open
 ;;;;;;  org-export-as-docbook-pdf org-export-region-as-docbook org-replace-region-by-docbook
 ;;;;;;  org-export-as-docbook-to-buffer org-export-as-docbook-batch)
-;;;;;;  "org-docbook" "org/org-docbook.el" (19352 21357))
+;;;;;;  "org-docbook" "org/org-docbook.el" (19279 5151))
 ;;; Generated autoloads from org/org-docbook.el
 
 (autoload 'org-export-as-docbook-batch "org-docbook" "\
@@ -19284,7 +19312,7 @@ publishing directory.
 \f
 ;;;### (autoloads (org-insert-export-options-template org-export-as-org
 ;;;;;;  org-export-visible org-export) "org-exp" "org/org-exp.el"
-;;;;;;  (19352 21357))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from org/org-exp.el
 
 (autoload 'org-export "org-exp" "\
@@ -19341,8 +19369,8 @@ Insert into the buffer a template with information for exporting.
 ;;;***
 \f
 ;;;### (autoloads (org-feed-show-raw-feed org-feed-goto-inbox org-feed-update
-;;;;;;  org-feed-update-all) "org-feed" "org/org-feed.el" (19352
-;;;;;;  21357))
+;;;;;;  org-feed-update-all) "org-feed" "org/org-feed.el" (19279
+;;;;;;  5151))
 ;;; Generated autoloads from org/org-feed.el
 
 (autoload 'org-feed-update-all "org-feed" "\
@@ -19370,7 +19398,7 @@ Show the raw feed buffer of a feed.
 ;;;***
 \f
 ;;;### (autoloads (org-footnote-normalize org-footnote-action) "org-footnote"
-;;;;;;  "org/org-footnote.el" (19352 21357))
+;;;;;;  "org/org-footnote.el" (19279 5151))
 ;;; Generated autoloads from org/org-footnote.el
 
 (autoload 'org-footnote-action "org-footnote" "\
@@ -19397,7 +19425,7 @@ referenced sequence.
 ;;;### (autoloads (org-freemind-to-org-mode org-freemind-from-org-sparse-tree
 ;;;;;;  org-freemind-from-org-mode org-freemind-from-org-mode-node
 ;;;;;;  org-freemind-show org-export-as-freemind) "org-freemind"
-;;;;;;  "org/org-freemind.el" (19352 21362))
+;;;;;;  "org/org-freemind.el" (19323 49698))
 ;;; Generated autoloads from org/org-freemind.el
 
 (autoload 'org-export-as-freemind "org-freemind" "\
@@ -19435,7 +19463,7 @@ Convert FreeMind file MM-FILE to `org-mode' file ORG-FILE.
 ;;;### (autoloads (org-export-htmlize-generate-css org-export-as-html
 ;;;;;;  org-export-region-as-html org-replace-region-by-html org-export-as-html-to-buffer
 ;;;;;;  org-export-as-html-batch org-export-as-html-and-open) "org-html"
-;;;;;;  "org/org-html.el" (19352 21357))
+;;;;;;  "org/org-html.el" (19279 5151))
 ;;; Generated autoloads from org/org-html.el
 
 (put 'org-export-html-style-include-default 'safe-local-variable 'booleanp)
@@ -19528,7 +19556,7 @@ that uses these same face definitions.
 \f
 ;;;### (autoloads (org-export-icalendar-combine-agenda-files org-export-icalendar-all-agenda-files
 ;;;;;;  org-export-icalendar-this-file) "org-icalendar" "org/org-icalendar.el"
-;;;;;;  (19352 21357))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from org/org-icalendar.el
 
 (autoload 'org-export-icalendar-this-file "org-icalendar" "\
@@ -19555,7 +19583,7 @@ The file is stored under the name `org-combined-agenda-icalendar-file'.
 \f
 ;;;### (autoloads (org-id-find-id-file org-id-find org-id-goto org-id-get-with-outline-drilling
 ;;;;;;  org-id-get-with-outline-path-completion org-id-get org-id-copy
-;;;;;;  org-id-get-create) "org-id" "org/org-id.el" (19352 21357))
+;;;;;;  org-id-get-create) "org-id" "org/org-id.el" (19279 5151))
 ;;; Generated autoloads from org/org-id.el
 
 (autoload 'org-id-get-create "org-id" "\
@@ -19619,7 +19647,7 @@ Query the id database for the file in which this ID is located.
 ;;;***
 \f
 ;;;### (autoloads (org-indent-mode) "org-indent" "org/org-indent.el"
-;;;;;;  (19352 21357))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from org/org-indent.el
 
 (autoload 'org-indent-mode "org-indent" "\
@@ -19634,7 +19662,7 @@ FIXME:  How to update when broken?
 ;;;***
 \f
 ;;;### (autoloads (org-irc-store-link) "org-irc" "org/org-irc.el"
-;;;;;;  (19352 21357))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from org/org-irc.el
 
 (autoload 'org-irc-store-link "org-irc" "\
@@ -19647,7 +19675,7 @@ Dispatch to the appropriate function to store a link to an IRC session.
 ;;;### (autoloads (org-export-as-pdf-and-open org-export-as-pdf org-export-as-latex
 ;;;;;;  org-export-region-as-latex org-replace-region-by-latex org-export-as-latex-to-buffer
 ;;;;;;  org-export-as-latex-batch) "org-latex" "org/org-latex.el"
-;;;;;;  (19352 21357))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from org/org-latex.el
 
 (autoload 'org-export-as-latex-batch "org-latex" "\
@@ -19727,8 +19755,8 @@ Export as LaTeX, then process through to PDF, and open.
 ;;;***
 \f
 ;;;### (autoloads (org-mobile-create-sumo-agenda org-mobile-pull
-;;;;;;  org-mobile-push) "org-mobile" "org/org-mobile.el" (19352
-;;;;;;  21357))
+;;;;;;  org-mobile-push) "org-mobile" "org/org-mobile.el" (19279
+;;;;;;  5151))
 ;;; Generated autoloads from org/org-mobile.el
 
 (autoload 'org-mobile-push "org-mobile" "\
@@ -19753,7 +19781,7 @@ Create a file that contains all custom agenda views.
 ;;;***
 \f
 ;;;### (autoloads (org-plot/gnuplot) "org-plot" "org/org-plot.el"
-;;;;;;  (19352 21357))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from org/org-plot.el
 
 (autoload 'org-plot/gnuplot "org-plot" "\
@@ -19767,7 +19795,7 @@ line directly before or after the table.
 \f
 ;;;### (autoloads (org-publish-current-project org-publish-current-file
 ;;;;;;  org-publish-all org-publish) "org-publish" "org/org-publish.el"
-;;;;;;  (19352 21357))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from org/org-publish.el
 
 (defalias 'org-publish-project 'org-publish)
@@ -19801,7 +19829,7 @@ the project.
 \f
 ;;;### (autoloads (org-remember-handler org-remember org-remember-apply-template
 ;;;;;;  org-remember-annotation org-remember-insinuate) "org-remember"
-;;;;;;  "org/org-remember.el" (19352 21357))
+;;;;;;  "org/org-remember.el" (19279 5151))
 ;;; Generated autoloads from org/org-remember.el
 
 (autoload 'org-remember-insinuate "org-remember" "\
@@ -19876,7 +19904,7 @@ See also the variable `org-reverse-note-order'.
 ;;;***
 \f
 ;;;### (autoloads (org-table-to-lisp orgtbl-mode turn-on-orgtbl)
-;;;;;;  "org-table" "org/org-table.el" (19352 21357))
+;;;;;;  "org-table" "org/org-table.el" (19279 5151))
 ;;; Generated autoloads from org/org-table.el
 
 (autoload 'turn-on-orgtbl "org-table" "\
@@ -19901,7 +19929,7 @@ The table is taken from the parameter TXT, or from the buffer at point.
 \f
 ;;;### (autoloads (org-timer-set-timer org-timer-item org-timer-change-times-in-region
 ;;;;;;  org-timer org-timer-start) "org-timer" "org/org-timer.el"
-;;;;;;  (19352 21357))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from org/org-timer.el
 
 (autoload 'org-timer-start "org-timer" "\
@@ -19945,7 +19973,7 @@ Set a timer.
 ;;;***
 \f
 ;;;### (autoloads (org-export-as-xoxo) "org-xoxo" "org/org-xoxo.el"
-;;;;;;  (19352 21357))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from org/org-xoxo.el
 
 (autoload 'org-export-as-xoxo "org-xoxo" "\
@@ -19957,7 +19985,7 @@ The XOXO buffer is named *xoxo-<source buffer name>*
 ;;;***
 \f
 ;;;### (autoloads (outline-minor-mode outline-mode) "outline" "outline.el"
-;;;;;;  (19352 21362))
+;;;;;;  (19365 25156))
 ;;; Generated autoloads from outline.el
 (put 'outline-regexp 'safe-local-variable 'string-or-null-p)
 
@@ -20014,7 +20042,7 @@ See the command `outline-mode' for more information on this mode.
 
 ;;;***
 \f
-;;;### (autoloads (show-paren-mode) "paren" "paren.el" (19352 21357))
+;;;### (autoloads (show-paren-mode) "paren" "paren.el" (19279 5148))
 ;;; Generated autoloads from paren.el
 
 (defvar show-paren-mode nil "\
@@ -20039,7 +20067,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"
-;;;;;;  (19352 21357))
+;;;;;;  (19279 5149))
 ;;; Generated autoloads from calendar/parse-time.el
 (put 'parse-time-rules 'risky-local-variable t)
 
@@ -20052,8 +20080,8 @@ unknown are returned as nil.
 
 ;;;***
 \f
-;;;### (autoloads (pascal-mode) "pascal" "progmodes/pascal.el" (19352
-;;;;;;  21357))
+;;;### (autoloads (pascal-mode) "pascal" "progmodes/pascal.el" (19279
+;;;;;;  5151))
 ;;; Generated autoloads from progmodes/pascal.el
 
 (autoload 'pascal-mode "pascal" "\
@@ -20103,10 +20131,27 @@ no args, if that value is non-nil.
 
 \(fn)" t nil)
 
+;;;***
+\f
+;;;### (autoloads (password-cache-expiry password-cache) "password-cache"
+;;;;;;  "password-cache.el" (19365 25156))
+;;; Generated autoloads from password-cache.el
+
+(defvar password-cache t "\
+Whether to cache passwords.")
+
+(custom-autoload 'password-cache "password-cache" t)
+
+(defvar password-cache-expiry 16 "\
+How many seconds passwords are cached, or nil to disable expiring.
+Whether passwords are cached at all is controlled by `password-cache'.")
+
+(custom-autoload 'password-cache-expiry "password-cache" t)
+
 ;;;***
 \f
 ;;;### (autoloads (pc-bindings-mode) "pc-mode" "emulation/pc-mode.el"
-;;;;;;  (19352 21357))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from emulation/pc-mode.el
 
 (autoload 'pc-bindings-mode "pc-mode" "\
@@ -20124,7 +20169,7 @@ C-Escape does list-buffers.
 ;;;***
 \f
 ;;;### (autoloads (pc-selection-mode) "pc-select" "emulation/pc-select.el"
-;;;;;;  (19352 21357))
+;;;;;;  (19356 10801))
 ;;; Generated autoloads from emulation/pc-select.el
 
 (defvar pc-selection-mode nil "\
@@ -20190,8 +20235,8 @@ but before calling PC Selection mode):
 
 ;;;***
 \f
-;;;### (autoloads (pcomplete/cvs) "pcmpl-cvs" "pcmpl-cvs.el" (19352
-;;;;;;  21357))
+;;;### (autoloads (pcomplete/cvs) "pcmpl-cvs" "pcmpl-cvs.el" (19279
+;;;;;;  5148))
 ;;; Generated autoloads from pcmpl-cvs.el
 
 (autoload 'pcomplete/cvs "pcmpl-cvs" "\
@@ -20202,7 +20247,7 @@ Completion rules for the `cvs' command.
 ;;;***
 \f
 ;;;### (autoloads (pcomplete/tar pcomplete/make pcomplete/bzip2 pcomplete/gzip)
-;;;;;;  "pcmpl-gnu" "pcmpl-gnu.el" (19352 21357))
+;;;;;;  "pcmpl-gnu" "pcmpl-gnu.el" (19279 5148))
 ;;; Generated autoloads from pcmpl-gnu.el
 
 (autoload 'pcomplete/gzip "pcmpl-gnu" "\
@@ -20230,7 +20275,7 @@ Completion for the GNU tar utility.
 ;;;***
 \f
 ;;;### (autoloads (pcomplete/mount pcomplete/umount pcomplete/kill)
-;;;;;;  "pcmpl-linux" "pcmpl-linux.el" (19352 21357))
+;;;;;;  "pcmpl-linux" "pcmpl-linux.el" (19279 5148))
 ;;; Generated autoloads from pcmpl-linux.el
 
 (autoload 'pcomplete/kill "pcmpl-linux" "\
@@ -20250,8 +20295,8 @@ Completion for GNU/Linux `mount'.
 
 ;;;***
 \f
-;;;### (autoloads (pcomplete/rpm) "pcmpl-rpm" "pcmpl-rpm.el" (19352
-;;;;;;  21357))
+;;;### (autoloads (pcomplete/rpm) "pcmpl-rpm" "pcmpl-rpm.el" (19279
+;;;;;;  5148))
 ;;; Generated autoloads from pcmpl-rpm.el
 
 (autoload 'pcomplete/rpm "pcmpl-rpm" "\
@@ -20263,7 +20308,7 @@ Completion for the `rpm' command.
 \f
 ;;;### (autoloads (pcomplete/scp pcomplete/ssh pcomplete/chgrp pcomplete/chown
 ;;;;;;  pcomplete/which pcomplete/xargs pcomplete/rm pcomplete/rmdir
-;;;;;;  pcomplete/cd) "pcmpl-unix" "pcmpl-unix.el" (19352 21357))
+;;;;;;  pcomplete/cd) "pcmpl-unix" "pcmpl-unix.el" (19282 55646))
 ;;; Generated autoloads from pcmpl-unix.el
 
 (autoload 'pcomplete/cd "pcmpl-unix" "\
@@ -20320,8 +20365,8 @@ Includes files as well as host names followed by a colon.
 \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" (19352
-;;;;;;  21357))
+;;;;;;  pcomplete-reverse pcomplete) "pcomplete" "pcomplete.el" (19279
+;;;;;;  5148))
 ;;; Generated autoloads from pcomplete.el
 
 (autoload 'pcomplete "pcomplete" "\
@@ -20380,7 +20425,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" (19352 21357))
+;;;;;;  "pcvs.el" (19279 5148))
 ;;; Generated autoloads from pcvs.el
 
 (autoload 'cvs-checkout "pcvs" "\
@@ -20455,7 +20500,7 @@ The exact behavior is determined also by `cvs-dired-use-hook'." (when (stringp d
 
 ;;;***
 \f
-;;;### (autoloads nil "pcvs-defs" "pcvs-defs.el" (19352 21357))
+;;;### (autoloads nil "pcvs-defs" "pcvs-defs.el" (19279 5148))
 ;;; Generated autoloads from pcvs-defs.el
 
 (defvar cvs-global-menu (let ((m (make-sparse-keymap "PCL-CVS"))) (define-key m [status] `(menu-item ,(purecopy "Directory Status") cvs-status :help ,(purecopy "A more verbose status of a workarea"))) (define-key m [checkout] `(menu-item ,(purecopy "Checkout Module") cvs-checkout :help ,(purecopy "Check out a module from the repository"))) (define-key m [update] `(menu-item ,(purecopy "Update Directory") cvs-update :help ,(purecopy "Fetch updates from the repository"))) (define-key m [examine] `(menu-item ,(purecopy "Examine Directory") cvs-examine :help ,(purecopy "Examine the current state of a workarea"))) (fset 'cvs-global-menu m)))
@@ -20463,7 +20508,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"
-;;;;;;  (19352 21358))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from progmodes/perl-mode.el
 (put 'perl-indent-level 'safe-local-variable 'integerp)
 (put 'perl-continued-statement-offset 'safe-local-variable 'integerp)
@@ -20527,7 +20572,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" (19352 21358))
+;;;;;;  pgg-encrypt-region) "pgg" "pgg.el" (19279 5148))
 ;;; Generated autoloads from pgg.el
 
 (autoload 'pgg-encrypt-region "pgg" "\
@@ -20661,7 +20706,7 @@ Import public keys in the current buffer.
 ;;;***
 \f
 ;;;### (autoloads (pgg-gpg-symmetric-key-p) "pgg-gpg" "pgg-gpg.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19279 5148))
 ;;; Generated autoloads from pgg-gpg.el
 
 (autoload 'pgg-gpg-symmetric-key-p "pgg-gpg" "\
@@ -20672,7 +20717,7 @@ True if decoded armor MESSAGE-KEYS has symmetric encryption indicator.
 ;;;***
 \f
 ;;;### (autoloads (picture-mode) "picture" "textmodes/picture.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19356 10801))
 ;;; Generated autoloads from textmodes/picture.el
 
 (autoload 'picture-mode "picture" "\
@@ -20753,7 +20798,7 @@ they are not defaultly assigned to keys.
 ;;;***
 \f
 ;;;### (autoloads (po-find-file-coding-system) "po" "textmodes/po.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19279 5152))
 ;;; Generated autoloads from textmodes/po.el
 
 (autoload 'po-find-file-coding-system "po" "\
@@ -20764,7 +20809,7 @@ Called through `file-coding-system-alist', before the file is visited for real.
 
 ;;;***
 \f
-;;;### (autoloads (pong) "pong" "play/pong.el" (19352 21358))
+;;;### (autoloads (pong) "pong" "play/pong.el" (19279 5151))
 ;;; Generated autoloads from play/pong.el
 
 (autoload 'pong "pong" "\
@@ -20782,7 +20827,7 @@ pong-mode keybindings:\\<pong-mode-map>
 \f
 ;;;### (autoloads (pp-macroexpand-last-sexp pp-eval-last-sexp pp-macroexpand-expression
 ;;;;;;  pp-eval-expression pp pp-buffer pp-to-string) "pp" "emacs-lisp/pp.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19279 5149))
 ;;; Generated autoloads from emacs-lisp/pp.el
 
 (autoload 'pp-to-string "pp" "\
@@ -20850,7 +20895,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"
-;;;;;;  (19352 21358))
+;;;;;;  (19279 5148))
 ;;; Generated autoloads from printing.el
 
 (autoload 'pr-interface "printing" "\
@@ -21437,7 +21482,7 @@ are both set to t.
 
 ;;;***
 \f
-;;;### (autoloads (proced) "proced" "proced.el" (19352 21358))
+;;;### (autoloads (proced) "proced" "proced.el" (19279 5148))
 ;;; Generated autoloads from proced.el
 
 (autoload 'proced "proced" "\
@@ -21453,7 +21498,7 @@ See `proced-mode' for a description of features available in Proced buffers.
 ;;;***
 \f
 ;;;### (autoloads (switch-to-prolog prolog-mode) "prolog" "progmodes/prolog.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from progmodes/prolog.el
 
 (autoload 'prolog-mode "prolog" "\
@@ -21476,8 +21521,8 @@ With prefix argument \\[universal-prefix], prompt for the program to use.
 
 ;;;***
 \f
-;;;### (autoloads (bdf-directory-list) "ps-bdf" "ps-bdf.el" (19352
-;;;;;;  21358))
+;;;### (autoloads (bdf-directory-list) "ps-bdf" "ps-bdf.el" (19279
+;;;;;;  5148))
 ;;; Generated autoloads from ps-bdf.el
 
 (defvar bdf-directory-list (if (memq system-type '(ms-dos windows-nt)) (list (expand-file-name "fonts/bdf" installation-directory)) '("/usr/local/share/emacs/fonts/bdf")) "\
@@ -21488,8 +21533,8 @@ The default value is '(\"/usr/local/share/emacs/fonts/bdf\").")
 
 ;;;***
 \f
-;;;### (autoloads (ps-mode) "ps-mode" "progmodes/ps-mode.el" (19352
-;;;;;;  21358))
+;;;### (autoloads (ps-mode) "ps-mode" "progmodes/ps-mode.el" (19279
+;;;;;;  5151))
 ;;; Generated autoloads from progmodes/ps-mode.el
 
 (autoload 'ps-mode "ps-mode" "\
@@ -21540,8 +21585,8 @@ Typing \\<ps-run-mode-map>\\[ps-run-goto-error] when the cursor is at the number
 ;;;;;;  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" (19352
-;;;;;;  21358))
+;;;;;;  ps-page-dimensions-database) "ps-print" "ps-print.el" (19356
+;;;;;;  10801))
 ;;; Generated autoloads from ps-print.el
 
 (defvar ps-page-dimensions-database (purecopy (list (list 'a4 (/ (* 72 21.0) 2.54) (/ (* 72 29.7) 2.54) "A4") (list 'a3 (/ (* 72 29.7) 2.54) (/ (* 72 42.0) 2.54) "A3") (list 'letter (* 72 8.5) (* 72 11.0) "Letter") (list 'legal (* 72 8.5) (* 72 14.0) "Legal") (list 'letter-small (* 72 7.68) (* 72 10.16) "LetterSmall") (list 'tabloid (* 72 11.0) (* 72 17.0) "Tabloid") (list 'ledger (* 72 17.0) (* 72 11.0) "Ledger") (list 'statement (* 72 5.5) (* 72 8.5) "Statement") (list 'executive (* 72 7.5) (* 72 10.0) "Executive") (list 'a4small (* 72 7.47) (* 72 10.85) "A4Small") (list 'b4 (* 72 10.125) (* 72 14.33) "B4") (list 'b5 (* 72 7.16) (* 72 10.125) "B5") '(addresslarge 236.0 99.0 "AddressLarge") '(addresssmall 236.0 68.0 "AddressSmall") '(cuthanging13 90.0 222.0 "CutHanging13") '(cuthanging15 90.0 114.0 "CutHanging15") '(diskette 181.0 136.0 "Diskette") '(eurofilefolder 139.0 112.0 "EuropeanFilefolder") '(eurofoldernarrow 526.0 107.0 "EuroFolderNarrow") '(eurofolderwide 526.0 136.0 "EuroFolderWide") '(euronamebadge 189.0 108.0 "EuroNameBadge") '(euronamebadgelarge 223.0 136.0 "EuroNameBadgeLarge") '(filefolder 230.0 37.0 "FileFolder") '(jewelry 76.0 136.0 "Jewelry") '(mediabadge 180.0 136.0 "MediaBadge") '(multipurpose 126.0 68.0 "MultiPurpose") '(retaillabel 90.0 104.0 "RetailLabel") '(shipping 271.0 136.0 "Shipping") '(slide35mm 26.0 104.0 "Slide35mm") '(spine8mm 187.0 26.0 "Spine8mm") '(topcoated 425.19685 136.0 "TopCoatedPaper") '(topcoatedpaper 396.0 136.0 "TopcoatedPaper150") '(vhsface 205.0 127.0 "VHSFace") '(vhsspine 400.0 50.0 "VHSSpine") '(zipdisk 156.0 136.0 "ZipDisk"))) "\
@@ -21738,7 +21783,7 @@ If EXTENSION is any other symbol, it is ignored.
 ;;;***
 \f
 ;;;### (autoloads (python-shell jython-mode python-mode run-python)
-;;;;;;  "python" "progmodes/python.el" (19352 21361))
+;;;;;;  "python" "progmodes/python.el" (19338 9841))
 ;;; Generated autoloads from progmodes/python.el
 
 (add-to-list 'interpreter-mode-alist (cons (purecopy "jython") 'jython-mode))
@@ -21854,7 +21899,7 @@ filter.
 ;;;***
 \f
 ;;;### (autoloads (quoted-printable-decode-region) "qp" "gnus/qp.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from gnus/qp.el
 
 (autoload 'quoted-printable-decode-region "qp" "\
@@ -21877,7 +21922,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" (19352 21358))
+;;;;;;  "international/quail.el" (19279 5150))
 ;;; Generated autoloads from international/quail.el
 
 (autoload 'quail-title "quail" "\
@@ -22108,8 +22153,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" (19352
-;;;;;;  21358))
+;;;;;;  quickurl-ask quickurl) "quickurl" "net/quickurl.el" (19279
+;;;;;;  5151))
 ;;; 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" "\
@@ -22181,7 +22226,7 @@ Display `quickurl-list' as a formatted list using `quickurl-list-mode'.
 ;;;***
 \f
 ;;;### (autoloads (rcirc-track-minor-mode rcirc-connect rcirc) "rcirc"
-;;;;;;  "net/rcirc.el" (19352 21358))
+;;;;;;  "net/rcirc.el" (19279 5151))
 ;;; Generated autoloads from net/rcirc.el
 
 (autoload 'rcirc "rcirc" "\
@@ -22216,8 +22261,8 @@ Global minor mode for tracking activity in rcirc buffers.
 
 ;;;***
 \f
-;;;### (autoloads (remote-compile) "rcompile" "net/rcompile.el" (19352
-;;;;;;  21358))
+;;;### (autoloads (remote-compile) "rcompile" "net/rcompile.el" (19279
+;;;;;;  5151))
 ;;; Generated autoloads from net/rcompile.el
 
 (autoload 'remote-compile "rcompile" "\
@@ -22229,7 +22274,7 @@ See \\[compile].
 ;;;***
 \f
 ;;;### (autoloads (re-builder) "re-builder" "emacs-lisp/re-builder.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19279 5149))
 ;;; Generated autoloads from emacs-lisp/re-builder.el
 
 (defalias 'regexp-builder 're-builder)
@@ -22241,7 +22286,7 @@ Construct a regexp interactively.
 
 ;;;***
 \f
-;;;### (autoloads (recentf-mode) "recentf" "recentf.el" (19352 21358))
+;;;### (autoloads (recentf-mode) "recentf" "recentf.el" (19279 5148))
 ;;; Generated autoloads from recentf.el
 
 (defvar recentf-mode nil "\
@@ -22268,8 +22313,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" (19352
-;;;;;;  21358))
+;;;;;;  delete-rectangle move-to-column-force) "rect" "rect.el" (19279
+;;;;;;  5148))
 ;;; Generated autoloads from rect.el
  (define-key ctl-x-r-map "c" 'clear-rectangle)
  (define-key ctl-x-r-map "k" 'kill-rectangle)
@@ -22403,8 +22448,8 @@ rectangle which were empty.
 
 ;;;***
 \f
-;;;### (autoloads (refill-mode) "refill" "textmodes/refill.el" (19352
-;;;;;;  21358))
+;;;### (autoloads (refill-mode) "refill" "textmodes/refill.el" (19279
+;;;;;;  5152))
 ;;; Generated autoloads from textmodes/refill.el
 
 (autoload 'refill-mode "refill" "\
@@ -22420,7 +22465,7 @@ refilling if they would cause auto-filling.
 ;;;***
 \f
 ;;;### (autoloads (reftex-reset-scanning-information reftex-mode
-;;;;;;  turn-on-reftex) "reftex" "textmodes/reftex.el" (19352 21358))
+;;;;;;  turn-on-reftex) "reftex" "textmodes/reftex.el" (19279 5152))
 ;;; Generated autoloads from textmodes/reftex.el
 
 (autoload 'turn-on-reftex "reftex" "\
@@ -22470,7 +22515,7 @@ This enforces rescanning the buffer on next use.
 ;;;***
 \f
 ;;;### (autoloads (reftex-citation) "reftex-cite" "textmodes/reftex-cite.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19279 5152))
 ;;; Generated autoloads from textmodes/reftex-cite.el
 
 (autoload 'reftex-citation "reftex-cite" "\
@@ -22500,7 +22545,7 @@ While entering the regexp, completion on knows citation keys is possible.
 ;;;***
 \f
 ;;;### (autoloads (reftex-isearch-minor-mode) "reftex-global" "textmodes/reftex-global.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19279 5152))
 ;;; Generated autoloads from textmodes/reftex-global.el
 
 (autoload 'reftex-isearch-minor-mode "reftex-global" "\
@@ -22517,7 +22562,7 @@ With no argument, this command toggles
 ;;;***
 \f
 ;;;### (autoloads (reftex-index-phrases-mode) "reftex-index" "textmodes/reftex-index.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19279 5152))
 ;;; Generated autoloads from textmodes/reftex-index.el
 
 (autoload 'reftex-index-phrases-mode "reftex-index" "\
@@ -22550,7 +22595,7 @@ Here are all local bindings.
 ;;;***
 \f
 ;;;### (autoloads (reftex-all-document-files) "reftex-parse" "textmodes/reftex-parse.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19279 5152))
 ;;; Generated autoloads from textmodes/reftex-parse.el
 
 (autoload 'reftex-all-document-files "reftex-parse" "\
@@ -22562,8 +22607,8 @@ of master file.
 
 ;;;***
 \f
-;;;### (autoloads nil "reftex-vars" "textmodes/reftex-vars.el" (19352
-;;;;;;  21358))
+;;;### (autoloads nil "reftex-vars" "textmodes/reftex-vars.el" (19370
+;;;;;;  36541))
 ;;; 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))))
@@ -22573,7 +22618,7 @@ of master file.
 ;;;***
 \f
 ;;;### (autoloads (regexp-opt-depth regexp-opt) "regexp-opt" "emacs-lisp/regexp-opt.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19279 5149))
 ;;; Generated autoloads from emacs-lisp/regexp-opt.el
 
 (autoload 'regexp-opt "regexp-opt" "\
@@ -22602,7 +22647,7 @@ This means the number of non-shy regexp grouping constructs
 \f
 ;;;### (autoloads (remember-diary-extract-entries remember-clipboard
 ;;;;;;  remember-other-frame remember) "remember" "textmodes/remember.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19279 5152))
 ;;; Generated autoloads from textmodes/remember.el
 
 (autoload 'remember "remember" "\
@@ -22633,7 +22678,7 @@ Extract diary entries from the region.
 
 ;;;***
 \f
-;;;### (autoloads (repeat) "repeat" "repeat.el" (19352 21358))
+;;;### (autoloads (repeat) "repeat" "repeat.el" (19279 5148))
 ;;; Generated autoloads from repeat.el
 
 (autoload 'repeat "repeat" "\
@@ -22656,7 +22701,7 @@ recently executed command not bound to an input event\".
 ;;;***
 \f
 ;;;### (autoloads (reporter-submit-bug-report) "reporter" "mail/reporter.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from mail/reporter.el
 
 (autoload 'reporter-submit-bug-report "reporter" "\
@@ -22688,7 +22733,7 @@ mail-sending package is used for editing and sending the message.
 ;;;***
 \f
 ;;;### (autoloads (reposition-window) "reposition" "reposition.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19279 5148))
 ;;; Generated autoloads from reposition.el
 
 (autoload 'reposition-window "reposition" "\
@@ -22715,7 +22760,7 @@ first comment line visible (if point is in a comment).
 ;;;***
 \f
 ;;;### (autoloads (global-reveal-mode reveal-mode) "reveal" "reveal.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19356 10801))
 ;;; Generated autoloads from reveal.el
 
 (autoload 'reveal-mode "reveal" "\
@@ -22750,7 +22795,7 @@ With zero or negative ARG turn mode off.
 ;;;***
 \f
 ;;;### (autoloads (make-ring ring-p) "ring" "emacs-lisp/ring.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19279 5149))
 ;;; Generated autoloads from emacs-lisp/ring.el
 
 (autoload 'ring-p "ring" "\
@@ -22765,7 +22810,7 @@ Make a ring that can contain SIZE elements.
 
 ;;;***
 \f
-;;;### (autoloads (rlogin) "rlogin" "net/rlogin.el" (19352 21358))
+;;;### (autoloads (rlogin) "rlogin" "net/rlogin.el" (19279 5151))
 ;;; Generated autoloads from net/rlogin.el
  (add-hook 'same-window-regexps (purecopy "^\\*rlogin-.*\\*\\(\\|<[0-9]+>\\)"))
 
@@ -22815,8 +22860,8 @@ variable.
 ;;;;;;  rmail-secondary-file-directory rmail-primary-inbox-list rmail-highlighted-headers
 ;;;;;;  rmail-retry-ignored-headers rmail-displayed-headers rmail-ignored-headers
 ;;;;;;  rmail-dont-reply-to-names rmail-user-mail-address-regexp
-;;;;;;  rmail-movemail-variant-p) "rmail" "mail/rmail.el" (19352
-;;;;;;  21360))
+;;;;;;  rmail-movemail-variant-p) "rmail" "mail/rmail.el" (19370
+;;;;;;  36541))
 ;;; Generated autoloads from mail/rmail.el
 
 (autoload 'rmail-movemail-variant-p "rmail" "\
@@ -23010,7 +23055,7 @@ Set PASSWORD to be used for retrieving mail from a POP or IMAP server.
 ;;;***
 \f
 ;;;### (autoloads (rmail-output-body-to-file rmail-output-as-seen
-;;;;;;  rmail-output) "rmailout" "mail/rmailout.el" (19352 21358))
+;;;;;;  rmail-output) "rmailout" "mail/rmailout.el" (19279 5150))
 ;;; Generated autoloads from mail/rmailout.el
 (put 'rmail-output-file-alist 'risky-local-variable t)
 
@@ -23075,7 +23120,7 @@ than appending to it.  Deletes the message after writing if
 ;;;***
 \f
 ;;;### (autoloads (rng-c-load-schema) "rng-cmpct" "nxml/rng-cmpct.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from nxml/rng-cmpct.el
 
 (autoload 'rng-c-load-schema "rng-cmpct" "\
@@ -23087,7 +23132,7 @@ Return a pattern.
 ;;;***
 \f
 ;;;### (autoloads (rng-nxml-mode-init) "rng-nxml" "nxml/rng-nxml.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from nxml/rng-nxml.el
 
 (autoload 'rng-nxml-mode-init "rng-nxml" "\
@@ -23100,7 +23145,7 @@ Validation will be enabled if `rng-nxml-auto-validate-flag' is non-nil.
 ;;;***
 \f
 ;;;### (autoloads (rng-validate-mode) "rng-valid" "nxml/rng-valid.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from nxml/rng-valid.el
 
 (autoload 'rng-validate-mode "rng-valid" "\
@@ -23130,8 +23175,8 @@ to use for finding the schema.
 
 ;;;***
 \f
-;;;### (autoloads (rng-xsd-compile) "rng-xsd" "nxml/rng-xsd.el" (19352
-;;;;;;  21358))
+;;;### (autoloads (rng-xsd-compile) "rng-xsd" "nxml/rng-xsd.el" (19279
+;;;;;;  5151))
 ;;; Generated autoloads from nxml/rng-xsd.el
 
 (put 'http://www\.w3\.org/2001/XMLSchema-datatypes 'rng-dt-compile 'rng-xsd-compile)
@@ -23159,7 +23204,7 @@ must be equal.
 ;;;***
 \f
 ;;;### (autoloads (robin-use-package robin-modify-package robin-define-package)
-;;;;;;  "robin" "international/robin.el" (19352 21358))
+;;;;;;  "robin" "international/robin.el" (19279 5150))
 ;;; Generated autoloads from international/robin.el
 
 (autoload 'robin-define-package "robin" "\
@@ -23192,7 +23237,7 @@ Start using robin package NAME, which is a string.
 ;;;***
 \f
 ;;;### (autoloads (toggle-rot13-mode rot13-other-window rot13-region
-;;;;;;  rot13-string rot13) "rot13" "rot13.el" (19352 21358))
+;;;;;;  rot13-string rot13) "rot13" "rot13.el" (19279 5148))
 ;;; Generated autoloads from rot13.el
 
 (autoload 'rot13 "rot13" "\
@@ -23230,7 +23275,7 @@ Toggle the use of ROT13 encoding for the current window.
 ;;;***
 \f
 ;;;### (autoloads (rst-minor-mode rst-mode) "rst" "textmodes/rst.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19365 25156))
 ;;; Generated autoloads from textmodes/rst.el
  (add-to-list 'auto-mode-alist (purecopy '("\\.re?st\\'" . rst-mode)))
 
@@ -23268,7 +23313,7 @@ for modes derived from Text mode, like Mail mode.
 ;;;***
 \f
 ;;;### (autoloads (ruby-mode) "ruby-mode" "progmodes/ruby-mode.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from progmodes/ruby-mode.el
 
 (autoload 'ruby-mode "ruby-mode" "\
@@ -23289,8 +23334,8 @@ The variable `ruby-indent-level' controls the amount of indentation.
 
 ;;;***
 \f
-;;;### (autoloads (ruler-mode) "ruler-mode" "ruler-mode.el" (19352
-;;;;;;  21358))
+;;;### (autoloads (ruler-mode) "ruler-mode" "ruler-mode.el" (19279
+;;;;;;  5148))
 ;;; Generated autoloads from ruler-mode.el
 
 (autoload 'ruler-mode "ruler-mode" "\
@@ -23300,8 +23345,8 @@ Display a ruler in the header line if ARG > 0.
 
 ;;;***
 \f
-;;;### (autoloads (rx rx-to-string) "rx" "emacs-lisp/rx.el" (19352
-;;;;;;  21358))
+;;;### (autoloads (rx rx-to-string) "rx" "emacs-lisp/rx.el" (19279
+;;;;;;  5149))
 ;;; Generated autoloads from emacs-lisp/rx.el
 
 (autoload 'rx-to-string "rx" "\
@@ -23611,7 +23656,7 @@ enclosed in `(and ...)'.
 ;;;***
 \f
 ;;;### (autoloads (savehist-mode savehist-mode) "savehist" "savehist.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19279 5148))
 ;;; Generated autoloads from savehist.el
 
 (defvar savehist-mode nil "\
@@ -23637,7 +23682,7 @@ which is probably undesirable.
 ;;;***
 \f
 ;;;### (autoloads (dsssl-mode scheme-mode) "scheme" "progmodes/scheme.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from progmodes/scheme.el
 
 (autoload 'scheme-mode "scheme" "\
@@ -23679,7 +23724,7 @@ that variable's value is a string.
 ;;;***
 \f
 ;;;### (autoloads (gnus-score-mode) "score-mode" "gnus/score-mode.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from gnus/score-mode.el
 
 (autoload 'gnus-score-mode "score-mode" "\
@@ -23693,7 +23738,7 @@ This mode is an extended emacs-lisp mode.
 ;;;***
 \f
 ;;;### (autoloads (scroll-all-mode) "scroll-all" "scroll-all.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19279 5148))
 ;;; Generated autoloads from scroll-all.el
 
 (defvar scroll-all-mode nil "\
@@ -23716,7 +23761,7 @@ apply to all visible windows in the same frame.
 ;;;***
 \f
 ;;;### (autoloads (scroll-lock-mode) "scroll-lock" "scroll-lock.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19279 5148))
 ;;; Generated autoloads from scroll-lock.el
 
 (autoload 'scroll-lock-mode "scroll-lock" "\
@@ -23731,7 +23776,7 @@ during scrolling.
 ;;;***
 \f
 ;;;### (autoloads (semantic-mode semantic-default-submodes) "semantic"
-;;;;;;  "cedet/semantic.el" (19352 21362))
+;;;;;;  "cedet/semantic.el" (19323 49698))
 ;;; Generated autoloads from cedet/semantic.el
 
 (defvar semantic-default-submodes '(global-semantic-idle-scheduler-mode global-semanticdb-minor-mode) "\
@@ -23783,7 +23828,7 @@ Semantic mode.
 ;;;;;;  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" (19352 21361))
+;;;;;;  "sendmail" "mail/sendmail.el" (19338 9841))
 ;;; Generated autoloads from mail/sendmail.el
 
 (defvar mail-from-style 'default "\
@@ -24080,8 +24125,8 @@ Like `mail' command, but display mail buffer in another frame.
 ;;;***
 \f
 ;;;### (autoloads (server-save-buffers-kill-terminal server-mode
-;;;;;;  server-force-delete server-start) "server" "server.el" (19352
-;;;;;;  21358))
+;;;;;;  server-force-delete server-start) "server" "server.el" (19279
+;;;;;;  5148))
 ;;; Generated autoloads from server.el
 
 (autoload 'server-start "server" "\
@@ -24135,7 +24180,7 @@ only these files will be asked to be saved.
 
 ;;;***
 \f
-;;;### (autoloads (ses-mode) "ses" "ses.el" (19352 21358))
+;;;### (autoloads (ses-mode) "ses" "ses.el" (19279 5148))
 ;;; Generated autoloads from ses.el
 
 (autoload 'ses-mode "ses" "\
@@ -24154,7 +24199,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"
-;;;;;;  (19352 21358))
+;;;;;;  (19292 15232))
 ;;; Generated autoloads from textmodes/sgml-mode.el
 
 (autoload 'sgml-mode "sgml-mode" "\
@@ -24220,7 +24265,7 @@ To work around that, do:
 ;;;***
 \f
 ;;;### (autoloads (sh-mode) "sh-script" "progmodes/sh-script.el"
-;;;;;;  (19352 21361))
+;;;;;;  (19345 41626))
 ;;; Generated autoloads from progmodes/sh-script.el
 (put 'sh-shell 'safe-local-variable 'symbolp)
 
@@ -24284,7 +24329,7 @@ with your script for an edit-interpret-debug cycle.
 
 ;;;***
 \f
-;;;### (autoloads (sha1) "sha1" "sha1.el" (19352 21358))
+;;;### (autoloads (sha1) "sha1" "sha1.el" (19279 5148))
 ;;; Generated autoloads from sha1.el
 
 (autoload 'sha1 "sha1" "\
@@ -24299,7 +24344,7 @@ If BINARY is non-nil, return a string in binary form.
 ;;;***
 \f
 ;;;### (autoloads (list-load-path-shadows) "shadow" "emacs-lisp/shadow.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19279 5149))
 ;;; Generated autoloads from emacs-lisp/shadow.el
 
 (autoload 'list-load-path-shadows "shadow" "\
@@ -24349,8 +24394,8 @@ function, `find-emacs-lisp-shadows'.
 ;;;***
 \f
 ;;;### (autoloads (shadow-initialize shadow-define-regexp-group shadow-define-literal-group
-;;;;;;  shadow-define-cluster) "shadowfile" "shadowfile.el" (19352
-;;;;;;  21358))
+;;;;;;  shadow-define-cluster) "shadowfile" "shadowfile.el" (19279
+;;;;;;  5148))
 ;;; Generated autoloads from shadowfile.el
 
 (autoload 'shadow-define-cluster "shadowfile" "\
@@ -24389,7 +24434,7 @@ Set up file shadowing.
 ;;;***
 \f
 ;;;### (autoloads (shell shell-dumb-shell-regexp) "shell" "shell.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19279 5148))
 ;;; Generated autoloads from shell.el
 
 (defvar shell-dumb-shell-regexp (purecopy "cmd\\(proxy\\)?\\.exe") "\
@@ -24439,7 +24484,7 @@ Otherwise, one argument `-i' is passed to the shell.
 ;;;***
 \f
 ;;;### (autoloads (sieve-upload-and-bury sieve-upload sieve-manage)
-;;;;;;  "sieve" "gnus/sieve.el" (19352 21358))
+;;;;;;  "sieve" "gnus/sieve.el" (19279 5150))
 ;;; Generated autoloads from gnus/sieve.el
 
 (autoload 'sieve-manage "sieve" "\
@@ -24460,7 +24505,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (sieve-mode) "sieve-mode" "gnus/sieve-mode.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19365 25156))
 ;;; Generated autoloads from gnus/sieve-mode.el
 
 (autoload 'sieve-mode "sieve-mode" "\
@@ -24475,8 +24520,8 @@ Turning on Sieve mode runs `sieve-mode-hook'.
 
 ;;;***
 \f
-;;;### (autoloads (simula-mode) "simula" "progmodes/simula.el" (19352
-;;;;;;  21358))
+;;;### (autoloads (simula-mode) "simula" "progmodes/simula.el" (19279
+;;;;;;  5151))
 ;;; Generated autoloads from progmodes/simula.el
 
 (autoload 'simula-mode "simula" "\
@@ -24525,7 +24570,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" (19352 21358))
+;;;;;;  define-skeleton) "skeleton" "skeleton.el" (19279 5148))
 ;;; Generated autoloads from skeleton.el
 
 (defvar skeleton-filter-function 'identity "\
@@ -24635,7 +24680,7 @@ symmetrical ones, and the same character twice for the others.
 ;;;***
 \f
 ;;;### (autoloads (smerge-start-session smerge-mode smerge-ediff)
-;;;;;;  "smerge-mode" "smerge-mode.el" (19352 21358))
+;;;;;;  "smerge-mode" "smerge-mode.el" (19279 5148))
 ;;; Generated autoloads from smerge-mode.el
 
 (autoload 'smerge-ediff "smerge-mode" "\
@@ -24660,7 +24705,7 @@ If no conflict maker is found, turn off `smerge-mode'.
 ;;;***
 \f
 ;;;### (autoloads (smiley-buffer smiley-region) "smiley" "gnus/smiley.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19370 36541))
 ;;; Generated autoloads from gnus/smiley.el
 
 (autoload 'smiley-region "smiley" "\
@@ -24670,15 +24715,15 @@ A list of images is returned.
 \(fn START END)" t nil)
 
 (autoload 'smiley-buffer "smiley" "\
-Run `smiley-region' at the buffer, specified in the argument or
-interactively. If there's no argument, do it at the current buffer
+Run `smiley-region' at the BUFFER, specified in the argument or
+interactively.  If there's no argument, do it at the current buffer.
 
 \(fn &optional BUFFER)" t nil)
 
 ;;;***
 \f
 ;;;### (autoloads (smtpmail-send-queued-mail smtpmail-send-it) "smtpmail"
-;;;;;;  "mail/smtpmail.el" (19352 21358))
+;;;;;;  "mail/smtpmail.el" (19279 5150))
 ;;; Generated autoloads from mail/smtpmail.el
 
 (autoload 'smtpmail-send-it "smtpmail" "\
@@ -24693,7 +24738,7 @@ Send mail that was queued as a result of setting `smtpmail-queue-mail'.
 
 ;;;***
 \f
-;;;### (autoloads (snake) "snake" "play/snake.el" (19352 21358))
+;;;### (autoloads (snake) "snake" "play/snake.el" (19279 5151))
 ;;; Generated autoloads from play/snake.el
 
 (autoload 'snake "snake" "\
@@ -24717,7 +24762,7 @@ Snake mode keybindings:
 ;;;***
 \f
 ;;;### (autoloads (snmpv2-mode snmp-mode) "snmp-mode" "net/snmp-mode.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from net/snmp-mode.el
 
 (autoload 'snmp-mode "snmp-mode" "\
@@ -24746,8 +24791,8 @@ then `snmpv2-mode-hook'.
 
 ;;;***
 \f
-;;;### (autoloads (sunrise-sunset) "solar" "calendar/solar.el" (19352
-;;;;;;  21358))
+;;;### (autoloads (sunrise-sunset) "solar" "calendar/solar.el" (19279
+;;;;;;  5149))
 ;;; Generated autoloads from calendar/solar.el
 
 (autoload 'sunrise-sunset "solar" "\
@@ -24762,8 +24807,8 @@ This function is suitable for execution in a .emacs file.
 
 ;;;***
 \f
-;;;### (autoloads (solitaire) "solitaire" "play/solitaire.el" (19352
-;;;;;;  21358))
+;;;### (autoloads (solitaire) "solitaire" "play/solitaire.el" (19279
+;;;;;;  5151))
 ;;; Generated autoloads from play/solitaire.el
 
 (autoload 'solitaire "solitaire" "\
@@ -24840,7 +24885,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" (19352 21358))
+;;;;;;  sort-lines sort-subr) "sort" "sort.el" (19279 5148))
 ;;; Generated autoloads from sort.el
 (put 'sort-fold-case 'safe-local-variable 'booleanp)
 
@@ -24984,8 +25029,8 @@ From a program takes two point or marker arguments, BEG and END.
 
 ;;;***
 \f
-;;;### (autoloads (spam-initialize) "spam" "gnus/spam.el" (19352
-;;;;;;  21358))
+;;;### (autoloads (spam-initialize) "spam" "gnus/spam.el" (19279
+;;;;;;  5150))
 ;;; Generated autoloads from gnus/spam.el
 
 (autoload 'spam-initialize "spam" "\
@@ -25001,7 +25046,7 @@ installed through `spam-necessary-extra-headers'.
 \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" (19352 21358))
+;;;;;;  "gnus/spam-report.el" (19279 5150))
 ;;; Generated autoloads from gnus/spam-report.el
 
 (autoload 'spam-report-process-queue "spam-report" "\
@@ -25044,7 +25089,7 @@ Spam reports will be queued with the method used when
 ;;;***
 \f
 ;;;### (autoloads (speedbar-get-focus speedbar-frame-mode) "speedbar"
-;;;;;;  "speedbar.el" (19352 21358))
+;;;;;;  "speedbar.el" (19279 5148))
 ;;; Generated autoloads from speedbar.el
 
 (defalias 'speedbar 'speedbar-frame-mode)
@@ -25069,7 +25114,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" (19352 21358))
+;;;;;;  "spell" "textmodes/spell.el" (19279 5152))
 ;;; Generated autoloads from textmodes/spell.el
 
 (put 'spell-filter 'risky-local-variable t)
@@ -25113,8 +25158,8 @@ Check spelling of string supplied as argument.
 
 ;;;***
 \f
-;;;### (autoloads (snarf-spooks spook) "spook" "play/spook.el" (19352
-;;;;;;  21358))
+;;;### (autoloads (snarf-spooks spook) "spook" "play/spook.el" (19279
+;;;;;;  5151))
 ;;; Generated autoloads from play/spook.el
 
 (autoload 'spook "spook" "\
@@ -25132,8 +25177,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" (19352
-;;;;;;  21358))
+;;;;;;  sql-add-product-keywords) "sql" "progmodes/sql.el" (19279
+;;;;;;  5151))
 ;;; Generated autoloads from progmodes/sql.el
 
 (autoload 'sql-add-product-keywords "sql" "\
@@ -25560,7 +25605,7 @@ input.  See `sql-interactive-mode'.
 ;;;***
 \f
 ;;;### (autoloads (srecode-template-mode) "srecode/srt-mode" "cedet/srecode/srt-mode.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19279 5149))
 ;;; Generated autoloads from cedet/srecode/srt-mode.el
 
 (autoload 'srecode-template-mode "srecode/srt-mode" "\
@@ -25576,8 +25621,8 @@ Major-mode for writing SRecode macros.
 ;;;;;;  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" (19352
-;;;;;;  21358))
+;;;;;;  strokes-global-set-stroke) "strokes" "strokes.el" (19279
+;;;;;;  5148))
 ;;; Generated autoloads from strokes.el
 
 (autoload 'strokes-global-set-stroke "strokes" "\
@@ -25687,7 +25732,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" (19352 21358))
+;;;;;;  "studly" "play/studly.el" (19256 49605))
 ;;; Generated autoloads from play/studly.el
 
 (autoload 'studlify-region "studly" "\
@@ -25708,7 +25753,7 @@ Studlify-case the current buffer.
 ;;;***
 \f
 ;;;### (autoloads (global-subword-mode subword-mode) "subword" "progmodes/subword.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from progmodes/subword.el
 
 (autoload 'subword-mode "subword" "\
@@ -25756,7 +25801,7 @@ See `subword-mode' for more information on Subword mode.
 ;;;***
 \f
 ;;;### (autoloads (sc-cite-original) "supercite" "mail/supercite.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19365 25156))
 ;;; Generated autoloads from mail/supercite.el
 
 (autoload 'sc-cite-original "supercite" "\
@@ -25788,8 +25833,8 @@ and `sc-post-hook' is run after the guts of this function.
 
 ;;;***
 \f
-;;;### (autoloads (gpm-mouse-mode) "t-mouse" "t-mouse.el" (19352
-;;;;;;  21359))
+;;;### (autoloads (gpm-mouse-mode) "t-mouse" "t-mouse.el" (19279
+;;;;;;  5148))
 ;;; Generated autoloads from t-mouse.el
 
 (define-obsolete-function-alias 't-mouse-mode 'gpm-mouse-mode "23.1")
@@ -25816,7 +25861,7 @@ It relies on the `gpm' daemon being activated.
 
 ;;;***
 \f
-;;;### (autoloads (tabify untabify) "tabify" "tabify.el" (19352 21358))
+;;;### (autoloads (tabify untabify) "tabify" "tabify.el" (19279 5148))
 ;;; Generated autoloads from tabify.el
 
 (autoload 'untabify "tabify" "\
@@ -25851,7 +25896,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" (19352 21358))
+;;;;;;  "table" "textmodes/table.el" (19356 10801))
 ;;; Generated autoloads from textmodes/table.el
 
 (defvar table-cell-map-hook nil "\
@@ -26439,7 +26484,7 @@ converts a table into plain text without frames.  It is a companion to
 
 ;;;***
 \f
-;;;### (autoloads (talk talk-connect) "talk" "talk.el" (19352 21358))
+;;;### (autoloads (talk talk-connect) "talk" "talk.el" (19279 5148))
 ;;; Generated autoloads from talk.el
 
 (autoload 'talk-connect "talk" "\
@@ -26454,7 +26499,7 @@ Connect to the Emacs talk group from the current X display or tty frame.
 
 ;;;***
 \f
-;;;### (autoloads (tar-mode) "tar-mode" "tar-mode.el" (19352 21358))
+;;;### (autoloads (tar-mode) "tar-mode" "tar-mode.el" (19279 5148))
 ;;; Generated autoloads from tar-mode.el
 
 (autoload 'tar-mode "tar-mode" "\
@@ -26478,7 +26523,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" (19352 21358))
+;;;;;;  "progmodes/tcl.el" (19279 5151))
 ;;; Generated autoloads from progmodes/tcl.el
 
 (autoload 'tcl-mode "tcl" "\
@@ -26529,7 +26574,7 @@ Prefix argument means invert sense of `tcl-use-smart-word-finder'.
 
 ;;;***
 \f
-;;;### (autoloads (rsh telnet) "telnet" "net/telnet.el" (19352 21358))
+;;;### (autoloads (rsh telnet) "telnet" "net/telnet.el" (19279 5151))
 ;;; Generated autoloads from net/telnet.el
  (add-hook 'same-window-regexps (purecopy "\\*telnet-.*\\*\\(\\|<[0-9]+>\\)"))
 
@@ -26557,7 +26602,7 @@ Normally input is edited in Emacs and sent a line at a time.
 ;;;***
 \f
 ;;;### (autoloads (serial-term ansi-term term make-term) "term" "term.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19292 15231))
 ;;; Generated autoloads from term.el
 
 (autoload 'make-term "term" "\
@@ -26599,8 +26644,8 @@ use in that buffer.
 
 ;;;***
 \f
-;;;### (autoloads (terminal-emulator) "terminal" "terminal.el" (19352
-;;;;;;  21358))
+;;;### (autoloads (terminal-emulator) "terminal" "terminal.el" (19279
+;;;;;;  5148))
 ;;; Generated autoloads from terminal.el
 
 (autoload 'terminal-emulator "terminal" "\
@@ -26637,7 +26682,7 @@ subprocess started.
 ;;;***
 \f
 ;;;### (autoloads (testcover-this-defun) "testcover" "emacs-lisp/testcover.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19279 5149))
 ;;; Generated autoloads from emacs-lisp/testcover.el
 
 (autoload 'testcover-this-defun "testcover" "\
@@ -26647,7 +26692,7 @@ Start coverage on function under point.
 
 ;;;***
 \f
-;;;### (autoloads (tetris) "tetris" "play/tetris.el" (19352 21358))
+;;;### (autoloads (tetris) "tetris" "play/tetris.el" (19279 5151))
 ;;; Generated autoloads from play/tetris.el
 
 (autoload 'tetris "tetris" "\
@@ -26678,7 +26723,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"
-;;;;;;  (19352 21363))
+;;;;;;  (19323 49698))
 ;;; Generated autoloads from textmodes/tex-mode.el
 
 (defvar tex-shell-file-name nil "\
@@ -26980,7 +27025,7 @@ Major mode to edit DocTeX files.
 ;;;***
 \f
 ;;;### (autoloads (texi2info texinfo-format-region texinfo-format-buffer)
-;;;;;;  "texinfmt" "textmodes/texinfmt.el" (19352 21358))
+;;;;;;  "texinfmt" "textmodes/texinfmt.el" (19279 5152))
 ;;; Generated autoloads from textmodes/texinfmt.el
 
 (autoload 'texinfo-format-buffer "texinfmt" "\
@@ -27020,7 +27065,7 @@ if large.  You can use `Info-split' to do this manually.
 ;;;***
 \f
 ;;;### (autoloads (texinfo-mode texinfo-close-quote texinfo-open-quote)
-;;;;;;  "texinfo" "textmodes/texinfo.el" (19352 21358))
+;;;;;;  "texinfo" "textmodes/texinfo.el" (19279 5152))
 ;;; Generated autoloads from textmodes/texinfo.el
 
 (defvar texinfo-open-quote (purecopy "``") "\
@@ -27106,7 +27151,7 @@ value of `texinfo-mode-hook'.
 \f
 ;;;### (autoloads (thai-composition-function thai-compose-buffer
 ;;;;;;  thai-compose-string thai-compose-region) "thai-util" "language/thai-util.el"
-;;;;;;  (19352 21358))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from language/thai-util.el
 
 (autoload 'thai-compose-region "thai-util" "\
@@ -27135,7 +27180,7 @@ Not documented
 \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" (19352 21358))
+;;;;;;  "thingatpt" "thingatpt.el" (19279 5148))
 ;;; Generated autoloads from thingatpt.el
 
 (autoload 'forward-thing "thingatpt" "\
@@ -27192,7 +27237,7 @@ Return the Lisp list at point, or nil if none is found.
 \f
 ;;;### (autoloads (thumbs-dired-setroot thumbs-dired-show thumbs-dired-show-marked
 ;;;;;;  thumbs-show-from-dir thumbs-find-thumb) "thumbs" "thumbs.el"
-;;;;;;  (19352 21359))
+;;;;;;  (19279 5148))
 ;;; Generated autoloads from thumbs.el
 
 (autoload 'thumbs-find-thumb "thumbs" "\
@@ -27230,8 +27275,8 @@ In dired, call the setroot program on the image at point.
 ;;;;;;  tibetan-post-read-conversion tibetan-compose-buffer tibetan-decompose-buffer
 ;;;;;;  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" (19352
-;;;;;;  21359))
+;;;;;;  tibetan-char-p) "tibet-util" "language/tibet-util.el" (19279
+;;;;;;  5150))
 ;;; Generated autoloads from language/tibet-util.el
 
 (autoload 'tibetan-char-p "tibet-util" "\
@@ -27305,7 +27350,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (tildify-buffer tildify-region) "tildify" "textmodes/tildify.el"
-;;;;;;  (19352 21359))
+;;;;;;  (19279 5152))
 ;;; Generated autoloads from textmodes/tildify.el
 
 (autoload 'tildify-region "tildify" "\
@@ -27330,7 +27375,7 @@ This function performs no refilling of the changed text.
 \f
 ;;;### (autoloads (emacs-init-time emacs-uptime display-time-world
 ;;;;;;  display-time-mode display-time display-time-day-and-date)
-;;;;;;  "time" "time.el" (19352 21359))
+;;;;;;  "time" "time.el" (19279 5148))
 ;;; Generated autoloads from time.el
 
 (defvar display-time-day-and-date nil "\
@@ -27393,7 +27438,7 @@ Return a string giving the duration of the Emacs initialization.
 ;;;;;;  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 date-to-time) "time-date" "calendar/time-date.el"
-;;;;;;  (19352 21359))
+;;;;;;  (19292 15231))
 ;;; Generated autoloads from calendar/time-date.el
 
 (autoload 'date-to-time "time-date" "\
@@ -27506,7 +27551,7 @@ This function does not work for SECONDS greater than `most-positive-fixnum'.
 ;;;***
 \f
 ;;;### (autoloads (time-stamp-toggle-active time-stamp) "time-stamp"
-;;;;;;  "time-stamp.el" (19352 21359))
+;;;;;;  "time-stamp.el" (19279 5148))
 ;;; Generated autoloads from time-stamp.el
 (put 'time-stamp-format 'safe-local-variable 'stringp)
 (put 'time-stamp-time-zone 'safe-local-variable 'string-or-null-p)
@@ -27550,7 +27595,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"
-;;;;;;  (19352 21359))
+;;;;;;  (19279 5149))
 ;;; Generated autoloads from calendar/timeclock.el
 
 (autoload 'timeclock-modeline-display "timeclock" "\
@@ -27650,7 +27695,7 @@ relative only to the time worked today, and not to past time.
 ;;;***
 \f
 ;;;### (autoloads (batch-titdic-convert titdic-convert) "titdic-cnv"
-;;;;;;  "international/titdic-cnv.el" (19352 21359))
+;;;;;;  "international/titdic-cnv.el" (19279 5150))
 ;;; Generated autoloads from international/titdic-cnv.el
 
 (autoload 'titdic-convert "titdic-cnv" "\
@@ -27673,7 +27718,7 @@ To get complete usage, invoke \"emacs -batch -f batch-titdic-convert -h\".
 ;;;***
 \f
 ;;;### (autoloads (tmm-prompt tmm-menubar-mouse tmm-menubar) "tmm"
-;;;;;;  "tmm.el" (19352 21359))
+;;;;;;  "tmm.el" (19279 5148))
 ;;; Generated autoloads from tmm.el
  (define-key global-map "\M-`" 'tmm-menubar)
  (define-key global-map [menu-bar mouse-1] 'tmm-menubar-mouse)
@@ -27713,7 +27758,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" (19352 21359))
+;;;;;;  "todo-mode" "calendar/todo-mode.el" (19279 5149))
 ;;; Generated autoloads from calendar/todo-mode.el
 
 (autoload 'todo-add-category "todo-mode" "\
@@ -27775,7 +27820,7 @@ 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 toggle-tool-bar-mode-from-frame)
-;;;;;;  "tool-bar" "tool-bar.el" (19352 21359))
+;;;;;;  "tool-bar" "tool-bar.el" (19279 5148))
 ;;; Generated autoloads from tool-bar.el
 
 (autoload 'toggle-tool-bar-mode-from-frame "tool-bar" "\
@@ -27848,7 +27893,7 @@ holds a keymap.
 ;;;***
 \f
 ;;;### (autoloads (tpu-edt-on tpu-edt-mode) "tpu-edt" "emulation/tpu-edt.el"
-;;;;;;  (19352 21359))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from emulation/tpu-edt.el
 
 (defvar tpu-edt-mode nil "\
@@ -27875,7 +27920,7 @@ Turn on TPU/edt emulation.
 ;;;***
 \f
 ;;;### (autoloads (tpu-mapper) "tpu-mapper" "emulation/tpu-mapper.el"
-;;;;;;  (19352 21359))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from emulation/tpu-mapper.el
 
 (autoload 'tpu-mapper "tpu-mapper" "\
@@ -27909,7 +27954,7 @@ your local X guru can try to figure out why the key is being ignored.
 
 ;;;***
 \f
-;;;### (autoloads (tq-create) "tq" "emacs-lisp/tq.el" (19352 21359))
+;;;### (autoloads (tq-create) "tq" "emacs-lisp/tq.el" (19279 5149))
 ;;; Generated autoloads from emacs-lisp/tq.el
 
 (autoload 'tq-create "tq" "\
@@ -27923,7 +27968,7 @@ to a tcp server on another machine.
 ;;;***
 \f
 ;;;### (autoloads (trace-function-background trace-function trace-buffer)
-;;;;;;  "trace" "emacs-lisp/trace.el" (19352 21359))
+;;;;;;  "trace" "emacs-lisp/trace.el" (19370 36541))
 ;;; Generated autoloads from emacs-lisp/trace.el
 
 (defvar trace-buffer (purecopy "*trace-output*") "\
@@ -27936,7 +27981,7 @@ Traces FUNCTION with trace output going to BUFFER.
 For every call of FUNCTION Lisp-style trace messages that display argument
 and return values will be inserted into BUFFER.  This function generates the
 trace advice for FUNCTION and activates it together with any other advice
-there might be!! The trace BUFFER will popup whenever FUNCTION is called.
+there might be!!  The trace BUFFER will popup whenever FUNCTION is called.
 Do not use this to trace functions that switch buffers or do any other
 display oriented stuff, use `trace-function-background' instead.
 
@@ -27960,7 +28005,7 @@ BUFFER defaults to `trace-buffer'.
 ;;;### (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-syntax tramp-mode) "tramp"
-;;;;;;  "net/tramp.el" (19352 21361))
+;;;;;;  "net/tramp.el" (19370 36541))
 ;;; Generated autoloads from net/tramp.el
 
 (defvar tramp-mode t "\
@@ -28093,7 +28138,7 @@ Discard Tramp from loading remote files.
 ;;;***
 \f
 ;;;### (autoloads (tramp-ftp-enable-ange-ftp) "tramp-ftp" "net/tramp-ftp.el"
-;;;;;;  (19352 21359))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from net/tramp-ftp.el
 
 (autoload 'tramp-ftp-enable-ange-ftp "tramp-ftp" "\
@@ -28103,8 +28148,8 @@ Not documented
 
 ;;;***
 \f
-;;;### (autoloads (help-with-tutorial) "tutorial" "tutorial.el" (19352
-;;;;;;  21359))
+;;;### (autoloads (help-with-tutorial) "tutorial" "tutorial.el" (19279
+;;;;;;  5148))
 ;;; Generated autoloads from tutorial.el
 
 (autoload 'help-with-tutorial "tutorial" "\
@@ -28129,7 +28174,7 @@ resumed later.
 ;;;***
 \f
 ;;;### (autoloads (tai-viet-composition-function) "tv-util" "language/tv-util.el"
-;;;;;;  (19352 21359))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from language/tv-util.el
 
 (autoload 'tai-viet-composition-function "tv-util" "\
@@ -28140,7 +28185,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (2C-split 2C-associate-buffer 2C-two-columns) "two-column"
-;;;;;;  "textmodes/two-column.el" (19352 21359))
+;;;;;;  "textmodes/two-column.el" (19279 5152))
 ;;; Generated autoloads from textmodes/two-column.el
  (autoload '2C-command "two-column" () t 'keymap)
  (global-set-key "\C-x6" '2C-command)
@@ -28191,7 +28236,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"
-;;;;;;  (19352 21359))
+;;;;;;  (19279 5148))
 ;;; Generated autoloads from type-break.el
 
 (defvar type-break-mode nil "\
@@ -28373,7 +28418,7 @@ FRAC should be the inverse of the fractional value; for example, a value of
 
 ;;;***
 \f
-;;;### (autoloads (uce-reply-to-uce) "uce" "mail/uce.el" (19352 21359))
+;;;### (autoloads (uce-reply-to-uce) "uce" "mail/uce.el" (19279 5150))
 ;;; Generated autoloads from mail/uce.el
 
 (autoload 'uce-reply-to-uce "uce" "\
@@ -28391,7 +28436,7 @@ You might need to set `uce-mail-reader' before using this.
 ;;;;;;  ucs-normalize-NFKC-string ucs-normalize-NFKC-region ucs-normalize-NFKD-string
 ;;;;;;  ucs-normalize-NFKD-region ucs-normalize-NFC-string ucs-normalize-NFC-region
 ;;;;;;  ucs-normalize-NFD-string ucs-normalize-NFD-region) "ucs-normalize"
-;;;;;;  "international/ucs-normalize.el" (19352 21359))
+;;;;;;  "international/ucs-normalize.el" (19279 5150))
 ;;; Generated autoloads from international/ucs-normalize.el
 
 (autoload 'ucs-normalize-NFD-region "ucs-normalize" "\
@@ -28457,7 +28502,7 @@ Normalize the string STR by the Unicode NFC and Mac OS's HFS Plus.
 ;;;***
 \f
 ;;;### (autoloads (ununderline-region underline-region) "underline"
-;;;;;;  "textmodes/underline.el" (19352 21359))
+;;;;;;  "textmodes/underline.el" (19279 5152))
 ;;; Generated autoloads from textmodes/underline.el
 
 (autoload 'underline-region "underline" "\
@@ -28478,7 +28523,7 @@ which specify the range to operate on.
 ;;;***
 \f
 ;;;### (autoloads (unrmail batch-unrmail) "unrmail" "mail/unrmail.el"
-;;;;;;  (19352 21359))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from mail/unrmail.el
 
 (autoload 'batch-unrmail "unrmail" "\
@@ -28497,8 +28542,8 @@ Convert old-style Rmail Babyl file FILE to system inbox format file TO-FILE.
 
 ;;;***
 \f
-;;;### (autoloads (unsafep) "unsafep" "emacs-lisp/unsafep.el" (19352
-;;;;;;  21359))
+;;;### (autoloads (unsafep) "unsafep" "emacs-lisp/unsafep.el" (19279
+;;;;;;  5150))
 ;;; Generated autoloads from emacs-lisp/unsafep.el
 
 (autoload 'unsafep "unsafep" "\
@@ -28511,7 +28556,7 @@ UNSAFEP-VARS is a list of symbols with local bindings.
 ;;;***
 \f
 ;;;### (autoloads (url-retrieve-synchronously url-retrieve) "url"
-;;;;;;  "url/url.el" (19352 21359))
+;;;;;;  "url/url.el" (19365 25156))
 ;;; Generated autoloads from url/url.el
 
 (autoload 'url-retrieve "url" "\
@@ -28551,7 +28596,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" (19352 21359))
+;;;;;;  "url-auth" "url/url-auth.el" (19279 5152))
 ;;; Generated autoloads from url/url-auth.el
 
 (autoload 'url-get-authentication "url-auth" "\
@@ -28593,8 +28638,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" (19352
-;;;;;;  21359))
+;;;;;;  url-store-in-cache) "url-cache" "url/url-cache.el" (19279
+;;;;;;  5152))
 ;;; Generated autoloads from url/url-cache.el
 
 (autoload 'url-store-in-cache "url-cache" "\
@@ -28619,7 +28664,7 @@ Return t if a cached file has expired.
 
 ;;;***
 \f
-;;;### (autoloads (url-cid) "url-cid" "url/url-cid.el" (19352 21359))
+;;;### (autoloads (url-cid) "url-cid" "url/url-cid.el" (19279 5152))
 ;;; Generated autoloads from url/url-cid.el
 
 (autoload 'url-cid "url-cid" "\
@@ -28630,7 +28675,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (url-dav-vc-registered url-dav-supported-p) "url-dav"
-;;;;;;  "url/url-dav.el" (19352 21359))
+;;;;;;  "url/url-dav.el" (19279 5152))
 ;;; Generated autoloads from url/url-dav.el
 
 (autoload 'url-dav-supported-p "url-dav" "\
@@ -28645,8 +28690,8 @@ Not documented
 
 ;;;***
 \f
-;;;### (autoloads (url-file) "url-file" "url/url-file.el" (19352
-;;;;;;  21359))
+;;;### (autoloads (url-file) "url-file" "url/url-file.el" (19279
+;;;;;;  5152))
 ;;; Generated autoloads from url/url-file.el
 
 (autoload 'url-file "url-file" "\
@@ -28657,7 +28702,7 @@ Handle file: and ftp: URLs.
 ;;;***
 \f
 ;;;### (autoloads (url-open-stream url-gateway-nslookup-host) "url-gw"
-;;;;;;  "url/url-gw.el" (19352 21359))
+;;;;;;  "url/url-gw.el" (19279 5152))
 ;;; Generated autoloads from url/url-gw.el
 
 (autoload 'url-gateway-nslookup-host "url-gw" "\
@@ -28677,7 +28722,7 @@ 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-file-handler url-handler-mode) "url-handlers" "url/url-handlers.el"
-;;;;;;  (19352 21359))
+;;;;;;  (19279 5152))
 ;;; Generated autoloads from url/url-handlers.el
 
 (defvar url-handler-mode nil "\
@@ -28729,7 +28774,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" (19352 21359))
+;;;;;;  url-http) "url-http" "url/url-http.el" (19372 27330))
 ;;; Generated autoloads from url/url-http.el
 
 (autoload 'url-http "url-http" "\
@@ -28795,7 +28840,7 @@ HTTPS retrievals are asynchronous.")
 
 ;;;***
 \f
-;;;### (autoloads (url-irc) "url-irc" "url/url-irc.el" (19352 21359))
+;;;### (autoloads (url-irc) "url-irc" "url/url-irc.el" (19279 5152))
 ;;; Generated autoloads from url/url-irc.el
 
 (autoload 'url-irc "url-irc" "\
@@ -28805,8 +28850,8 @@ Not documented
 
 ;;;***
 \f
-;;;### (autoloads (url-ldap) "url-ldap" "url/url-ldap.el" (19352
-;;;;;;  21359))
+;;;### (autoloads (url-ldap) "url-ldap" "url/url-ldap.el" (19279
+;;;;;;  5152))
 ;;; Generated autoloads from url/url-ldap.el
 
 (autoload 'url-ldap "url-ldap" "\
@@ -28820,7 +28865,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"
-;;;;;;  (19352 21359))
+;;;;;;  (19279 5152))
 ;;; Generated autoloads from url/url-mailto.el
 
 (autoload 'url-mail "url-mailto" "\
@@ -28836,7 +28881,7 @@ Handle the mailto: URL syntax.
 ;;;***
 \f
 ;;;### (autoloads (url-data url-generic-emulator-loader url-info
-;;;;;;  url-man) "url-misc" "url/url-misc.el" (19352 21359))
+;;;;;;  url-man) "url-misc" "url/url-misc.el" (19279 5152))
 ;;; Generated autoloads from url/url-misc.el
 
 (autoload 'url-man "url-misc" "\
@@ -28868,7 +28913,7 @@ Fetch a data URL (RFC 2397).
 ;;;***
 \f
 ;;;### (autoloads (url-snews url-news) "url-news" "url/url-news.el"
-;;;;;;  (19352 21359))
+;;;;;;  (19279 5152))
 ;;; Generated autoloads from url/url-news.el
 
 (autoload 'url-news "url-news" "\
@@ -28885,7 +28930,7 @@ Not documented
 \f
 ;;;### (autoloads (url-ns-user-pref url-ns-prefs isInNet isResolvable
 ;;;;;;  dnsResolve dnsDomainIs isPlainHostName) "url-ns" "url/url-ns.el"
-;;;;;;  (19352 21359))
+;;;;;;  (19279 5152))
 ;;; Generated autoloads from url/url-ns.el
 
 (autoload 'isPlainHostName "url-ns" "\
@@ -28926,7 +28971,7 @@ Not documented
 ;;;***
 \f
 ;;;### (autoloads (url-generic-parse-url url-recreate-url) "url-parse"
-;;;;;;  "url/url-parse.el" (19352 21359))
+;;;;;;  "url/url-parse.el" (19279 5152))
 ;;; Generated autoloads from url/url-parse.el
 
 (autoload 'url-recreate-url "url-parse" "\
@@ -28944,7 +28989,7 @@ TYPE USER PASSWORD HOST PORTSPEC FILENAME TARGET ATTRIBUTES FULLNESS.
 ;;;***
 \f
 ;;;### (autoloads (url-setup-privacy-info) "url-privacy" "url/url-privacy.el"
-;;;;;;  (19352 21359))
+;;;;;;  (19279 5152))
 ;;; Generated autoloads from url/url-privacy.el
 
 (autoload 'url-setup-privacy-info "url-privacy" "\
@@ -28960,7 +29005,7 @@ Setup variables that expose info about you and your system.
 ;;;;;;  url-pretty-length 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" (19352 21359))
+;;;;;;  "url-util" "url/url-util.el" (19292 15232))
 ;;; Generated autoloads from url/url-util.el
 
 (defvar url-debug nil "\
@@ -29096,7 +29141,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" (19352 21359))
+;;;;;;  "userlock" "userlock.el" (19279 5148))
 ;;; Generated autoloads from userlock.el
 
 (autoload 'ask-user-about-lock "userlock" "\
@@ -29126,7 +29171,7 @@ The buffer in question is current when this function is called.
 \f
 ;;;### (autoloads (utf-7-imap-pre-write-conversion utf-7-pre-write-conversion
 ;;;;;;  utf-7-imap-post-read-conversion utf-7-post-read-conversion)
-;;;;;;  "utf-7" "international/utf-7.el" (19352 21359))
+;;;;;;  "utf-7" "international/utf-7.el" (19279 5150))
 ;;; Generated autoloads from international/utf-7.el
 
 (autoload 'utf-7-post-read-conversion "utf-7" "\
@@ -29153,7 +29198,7 @@ Not documented
 \f
 ;;;### (autoloads (uudecode-decode-region uudecode-decode-region-internal
 ;;;;;;  uudecode-decode-region-external) "uudecode" "mail/uudecode.el"
-;;;;;;  (19352 21359))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from mail/uudecode.el
 
 (autoload 'uudecode-decode-region-external "uudecode" "\
@@ -29183,7 +29228,7 @@ If FILE-NAME is non-nil, save the result to FILE-NAME.
 ;;;;;;  vc-create-tag vc-merge vc-insert-headers vc-revision-other-window
 ;;;;;;  vc-root-diff vc-diff vc-version-diff vc-register vc-next-action
 ;;;;;;  vc-before-checkin-hook vc-checkin-hook vc-checkout-hook)
-;;;;;;  "vc" "vc.el" (19352 21359))
+;;;;;;  "vc" "vc.el" (19370 36540))
 ;;; Generated autoloads from vc.el
 
 (defvar vc-checkout-hook nil "\
@@ -29416,8 +29461,8 @@ Return the branch part of a revision number REV.
 
 ;;;***
 \f
-;;;### (autoloads (vc-annotate) "vc-annotate" "vc-annotate.el" (19352
-;;;;;;  21359))
+;;;### (autoloads (vc-annotate) "vc-annotate" "vc-annotate.el" (19356
+;;;;;;  10801))
 ;;; Generated autoloads from vc-annotate.el
 
 (autoload 'vc-annotate "vc-annotate" "\
@@ -29452,7 +29497,7 @@ mode-specific menu.  `vc-annotate-color-map' and
 
 ;;;***
 \f
-;;;### (autoloads nil "vc-arch" "vc-arch.el" (19352 21359))
+;;;### (autoloads nil "vc-arch" "vc-arch.el" (19365 25156))
 ;;; Generated autoloads from vc-arch.el
  (defun vc-arch-registered (file)
   (if (vc-find-root file "{arch}/=tagging-method")
@@ -29462,7 +29507,7 @@ mode-specific menu.  `vc-annotate-color-map' and
 
 ;;;***
 \f
-;;;### (autoloads nil "vc-bzr" "vc-bzr.el" (19352 21363))
+;;;### (autoloads nil "vc-bzr" "vc-bzr.el" (19370 36540))
 ;;; Generated autoloads from vc-bzr.el
 
 (defconst vc-bzr-admin-dirname ".bzr" "\
@@ -29477,7 +29522,7 @@ Name of the directory containing Bzr repository status files.")
 
 ;;;***
 \f
-;;;### (autoloads nil "vc-cvs" "vc-cvs.el" (19352 21363))
+;;;### (autoloads nil "vc-cvs" "vc-cvs.el" (19365 25156))
 ;;; Generated autoloads from vc-cvs.el
  (defun vc-cvs-registered (f)
   (when (file-readable-p (expand-file-name
@@ -29487,7 +29532,7 @@ Name of the directory containing Bzr repository status files.")
 
 ;;;***
 \f
-;;;### (autoloads (vc-dir) "vc-dir" "vc-dir.el" (19352 21359))
+;;;### (autoloads (vc-dir) "vc-dir" "vc-dir.el" (19370 36540))
 ;;; Generated autoloads from vc-dir.el
 
 (autoload 'vc-dir "vc-dir" "\
@@ -29512,7 +29557,7 @@ These are the commands available for use in the file status buffer:
 ;;;***
 \f
 ;;;### (autoloads (vc-do-command) "vc-dispatcher" "vc-dispatcher.el"
-;;;;;;  (19352 21359))
+;;;;;;  (19374 2442))
 ;;; Generated autoloads from vc-dispatcher.el
 
 (autoload 'vc-do-command "vc-dispatcher" "\
@@ -29535,7 +29580,7 @@ case, and the process object in the asynchronous case.
 
 ;;;***
 \f
-;;;### (autoloads nil "vc-git" "vc-git.el" (19352 21362))
+;;;### (autoloads nil "vc-git" "vc-git.el" (19365 25156))
 ;;; Generated autoloads from vc-git.el
  (defun vc-git-registered (file)
   "Return non-nil if FILE is registered with git."
@@ -29546,7 +29591,7 @@ case, and the process object in the asynchronous case.
 
 ;;;***
 \f
-;;;### (autoloads nil "vc-hg" "vc-hg.el" (19352 21359))
+;;;### (autoloads nil "vc-hg" "vc-hg.el" (19370 36540))
 ;;; Generated autoloads from vc-hg.el
  (defun vc-hg-registered (file)
   "Return non-nil if FILE is registered with hg."
@@ -29557,7 +29602,7 @@ case, and the process object in the asynchronous case.
 
 ;;;***
 \f
-;;;### (autoloads nil "vc-mtn" "vc-mtn.el" (19352 21359))
+;;;### (autoloads nil "vc-mtn" "vc-mtn.el" (19365 25156))
 ;;; Generated autoloads from vc-mtn.el
 
 (defconst vc-mtn-admin-dir "_MTN")
@@ -29572,7 +29617,7 @@ case, and the process object in the asynchronous case.
 ;;;***
 \f
 ;;;### (autoloads (vc-rcs-master-templates) "vc-rcs" "vc-rcs.el"
-;;;;;;  (19352 21359))
+;;;;;;  (19365 25156))
 ;;; Generated autoloads from vc-rcs.el
 
 (defvar vc-rcs-master-templates (purecopy '("%sRCS/%s,v" "%s%s,v" "%sRCS/%s")) "\
@@ -29586,7 +29631,7 @@ For a description of possible values, see `vc-check-master-templates'.")
 ;;;***
 \f
 ;;;### (autoloads (vc-sccs-master-templates) "vc-sccs" "vc-sccs.el"
-;;;;;;  (19352 21359))
+;;;;;;  (19365 25156))
 ;;; Generated autoloads from vc-sccs.el
 
 (defvar vc-sccs-master-templates (purecopy '("%sSCCS/s.%s" "%ss.%s" vc-sccs-search-project-dir)) "\
@@ -29603,7 +29648,7 @@ find any project directory." (let ((project-dir (getenv "PROJECTDIR")) dirs dir)
 
 ;;;***
 \f
-;;;### (autoloads nil "vc-svn" "vc-svn.el" (19352 21360))
+;;;### (autoloads nil "vc-svn" "vc-svn.el" (19365 25156))
 ;;; Generated autoloads from vc-svn.el
  (defun vc-svn-registered (f)
   (let ((admin-dir (cond ((and (eq system-type 'windows-nt)
@@ -29619,7 +29664,7 @@ find any project directory." (let ((project-dir (getenv "PROJECTDIR")) dirs dir)
 ;;;***
 \f
 ;;;### (autoloads (vera-mode) "vera-mode" "progmodes/vera-mode.el"
-;;;;;;  (19352 21359))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from progmodes/vera-mode.el
  (add-to-list 'auto-mode-alist (cons (purecopy "\\.vr[hi]?\\'")  'vera-mode))
 
@@ -29677,7 +29722,7 @@ Key bindings:
 ;;;***
 \f
 ;;;### (autoloads (verilog-mode) "verilog-mode" "progmodes/verilog-mode.el"
-;;;;;;  (19352 21359))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from progmodes/verilog-mode.el
 
 (autoload 'verilog-mode "verilog-mode" "\
@@ -29814,7 +29859,7 @@ Key bindings specific to `verilog-mode-map' are:
 ;;;***
 \f
 ;;;### (autoloads (vhdl-mode) "vhdl-mode" "progmodes/vhdl-mode.el"
-;;;;;;  (19352 21359))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from progmodes/vhdl-mode.el
 
 (autoload 'vhdl-mode "vhdl-mode" "\
@@ -30355,7 +30400,7 @@ Key bindings:
 
 ;;;***
 \f
-;;;### (autoloads (vi-mode) "vi" "emulation/vi.el" (19352 21359))
+;;;### (autoloads (vi-mode) "vi" "emulation/vi.el" (19256 49605))
 ;;; Generated autoloads from emulation/vi.el
 
 (autoload 'vi-mode "vi" "\
@@ -30410,7 +30455,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" (19352 21359))
+;;;;;;  "language/viet-util.el" (19279 5150))
 ;;; Generated autoloads from language/viet-util.el
 
 (autoload 'viet-encode-viscii-char "viet-util" "\
@@ -30458,7 +30503,7 @@ Not documented
 ;;;;;;  view-mode view-buffer-other-frame view-buffer-other-window
 ;;;;;;  view-buffer view-file-other-frame view-file-other-window
 ;;;;;;  view-file kill-buffer-if-not-modified view-remove-frame-by-deleting)
-;;;;;;  "view" "view.el" (19352 21359))
+;;;;;;  "view" "view.el" (19356 10801))
 ;;; Generated autoloads from view.el
 
 (defvar view-remove-frame-by-deleting t "\
@@ -30704,8 +30749,8 @@ Exit View mode and make the current buffer editable.
 
 ;;;***
 \f
-;;;### (autoloads (vip-mode vip-setup) "vip" "emulation/vip.el" (19352
-;;;;;;  21359))
+;;;### (autoloads (vip-mode vip-setup) "vip" "emulation/vip.el" (19279
+;;;;;;  5150))
 ;;; Generated autoloads from emulation/vip.el
 
 (autoload 'vip-setup "vip" "\
@@ -30721,7 +30766,7 @@ Turn on VIP emulation of VI.
 ;;;***
 \f
 ;;;### (autoloads (viper-mode toggle-viper-mode) "viper" "emulation/viper.el"
-;;;;;;  (19352 21359))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from emulation/viper.el
 
 (autoload 'toggle-viper-mode "viper" "\
@@ -30738,7 +30783,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"
-;;;;;;  (19352 21359))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from emacs-lisp/warnings.el
 
 (defvar warning-prefix-function nil "\
@@ -30828,7 +30873,7 @@ this is equivalent to `display-warning', using
 ;;;***
 \f
 ;;;### (autoloads (wdired-change-to-wdired-mode) "wdired" "wdired.el"
-;;;;;;  (19352 21359))
+;;;;;;  (19279 5149))
 ;;; Generated autoloads from wdired.el
 
 (autoload 'wdired-change-to-wdired-mode "wdired" "\
@@ -30844,7 +30889,7 @@ See `wdired-mode'.
 
 ;;;***
 \f
-;;;### (autoloads (webjump) "webjump" "net/webjump.el" (19352 21359))
+;;;### (autoloads (webjump) "webjump" "net/webjump.el" (19279 5151))
 ;;; Generated autoloads from net/webjump.el
 
 (autoload 'webjump "webjump" "\
@@ -30861,7 +30906,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"
-;;;;;;  (19352 21359))
+;;;;;;  (19279 5151))
 ;;; Generated autoloads from progmodes/which-func.el
  (put 'which-func-format 'risky-local-variable t)
  (put 'which-func-current 'risky-local-variable t)
@@ -30892,7 +30937,7 @@ and off otherwise.
 ;;;### (autoloads (whitespace-report-region whitespace-report whitespace-cleanup-region
 ;;;;;;  whitespace-cleanup global-whitespace-toggle-options whitespace-toggle-options
 ;;;;;;  global-whitespace-newline-mode global-whitespace-mode whitespace-newline-mode
-;;;;;;  whitespace-mode) "whitespace" "whitespace.el" (19352 21359))
+;;;;;;  whitespace-mode) "whitespace" "whitespace.el" (19356 10801))
 ;;; Generated autoloads from whitespace.el
 
 (autoload 'whitespace-mode "whitespace" "\
@@ -31291,7 +31336,7 @@ cleaning up these problems.
 ;;;***
 \f
 ;;;### (autoloads (widget-minor-mode widget-browse-other-window widget-browse
-;;;;;;  widget-browse-at) "wid-browse" "wid-browse.el" (19352 21359))
+;;;;;;  widget-browse-at) "wid-browse" "wid-browse.el" (19279 5149))
 ;;; Generated autoloads from wid-browse.el
 
 (autoload 'widget-browse-at "wid-browse" "\
@@ -31318,8 +31363,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" (19352
-;;;;;;  21359))
+;;;;;;  widget-prompt-value widgetp) "wid-edit" "wid-edit.el" (19356
+;;;;;;  10801))
 ;;; Generated autoloads from wid-edit.el
 
 (autoload 'widgetp "wid-edit" "\
@@ -31362,8 +31407,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" (19352
-;;;;;;  21359))
+;;;;;;  windmove-up windmove-left) "windmove" "windmove.el" (19279
+;;;;;;  5149))
 ;;; Generated autoloads from windmove.el
 
 (autoload 'windmove-left "windmove" "\
@@ -31416,7 +31461,7 @@ Default MODIFIER is 'shift.
 ;;;***
 \f
 ;;;### (autoloads (winner-mode winner-mode) "winner" "winner.el"
-;;;;;;  (19352 21359))
+;;;;;;  (19279 5149))
 ;;; Generated autoloads from winner.el
 
 (defvar winner-mode nil "\
@@ -31435,7 +31480,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-locale)
-;;;;;;  "woman" "woman.el" (19352 21359))
+;;;;;;  "woman" "woman.el" (19370 36540))
 ;;; Generated autoloads from woman.el
 
 (defvar woman-locale nil "\
@@ -31479,7 +31524,7 @@ decompress the file if appropriate.  See the documentation for the
 ;;;***
 \f
 ;;;### (autoloads (wordstar-mode) "ws-mode" "emulation/ws-mode.el"
-;;;;;;  (19352 21359))
+;;;;;;  (19279 5150))
 ;;; Generated autoloads from emulation/ws-mode.el
 
 (autoload 'wordstar-mode "ws-mode" "\
@@ -31591,7 +31636,7 @@ The key bindings are:
 
 ;;;***
 \f
-;;;### (autoloads (xesam-search) "xesam" "net/xesam.el" (19352 21359))
+;;;### (autoloads (xesam-search) "xesam" "net/xesam.el" (19356 10801))
 ;;; Generated autoloads from net/xesam.el
 
 (autoload 'xesam-search "xesam" "\
@@ -31611,7 +31656,7 @@ Example:
 ;;;***
 \f
 ;;;### (autoloads (xml-parse-region xml-parse-file) "xml" "xml.el"
-;;;;;;  (19352 21359))
+;;;;;;  (19279 5149))
 ;;; Generated autoloads from xml.el
 
 (autoload 'xml-parse-file "xml" "\
@@ -31637,7 +31682,7 @@ If PARSE-NS is non-nil, then QNAMES are expanded.
 ;;;***
 \f
 ;;;### (autoloads (xmltok-get-declared-encoding-position) "xmltok"
-;;;;;;  "nxml/xmltok.el" (19352 21359))
+;;;;;;  "nxml/xmltok.el" (19279 5151))
 ;;; Generated autoloads from nxml/xmltok.el
 
 (autoload 'xmltok-get-declared-encoding-position "xmltok" "\
@@ -31655,8 +31700,8 @@ If LIMIT is non-nil, then do not consider characters beyond LIMIT.
 
 ;;;***
 \f
-;;;### (autoloads (xterm-mouse-mode) "xt-mouse" "xt-mouse.el" (19352
-;;;;;;  21359))
+;;;### (autoloads (xterm-mouse-mode) "xt-mouse" "xt-mouse.el" (19279
+;;;;;;  5149))
 ;;; Generated autoloads from xt-mouse.el
 
 (defvar xterm-mouse-mode nil "\
@@ -31685,7 +31730,7 @@ down the SHIFT key while pressing the mouse button.
 ;;;***
 \f
 ;;;### (autoloads (yenc-extract-filename yenc-decode-region) "yenc"
-;;;;;;  "gnus/yenc.el" (19352 21359))
+;;;;;;  "gnus/yenc.el" (19279 5150))
 ;;; Generated autoloads from gnus/yenc.el
 
 (autoload 'yenc-decode-region "yenc" "\
@@ -31701,7 +31746,7 @@ Extract file name from an yenc header.
 ;;;***
 \f
 ;;;### (autoloads (psychoanalyze-pinhead apropos-zippy insert-zippyism
-;;;;;;  yow) "yow" "play/yow.el" (19352 21359))
+;;;;;;  yow) "yow" "play/yow.el" (19279 5151))
 ;;; Generated autoloads from play/yow.el
 
 (autoload 'yow "yow" "\
@@ -31727,7 +31772,7 @@ Zippy goes to the analyst.
 
 ;;;***
 \f
-;;;### (autoloads (zone) "zone" "play/zone.el" (19352 21359))
+;;;### (autoloads (zone) "zone" "play/zone.el" (19279 5151))
 ;;; Generated autoloads from play/zone.el
 
 (autoload 'zone "zone" "\
@@ -31743,59 +31788,60 @@ Zone out, completely.
 ;;;;;;  "calc/calc-fin.el" "calc/calc-forms.el" "calc/calc-frac.el"
 ;;;;;;  "calc/calc-funcs.el" "calc/calc-graph.el" "calc/calc-help.el"
 ;;;;;;  "calc/calc-incom.el" "calc/calc-keypd.el" "calc/calc-lang.el"
-;;;;;;  "calc/calc-macs.el" "calc/calc-map.el" "calc/calc-math.el"
-;;;;;;  "calc/calc-menu.el" "calc/calc-misc.el" "calc/calc-mode.el"
-;;;;;;  "calc/calc-mtx.el" "calc/calc-nlfit.el" "calc/calc-poly.el"
-;;;;;;  "calc/calc-prog.el" "calc/calc-rewr.el" "calc/calc-rules.el"
-;;;;;;  "calc/calc-sel.el" "calc/calc-stat.el" "calc/calc-store.el"
-;;;;;;  "calc/calc-stuff.el" "calc/calc-trail.el" "calc/calc-undo.el"
-;;;;;;  "calc/calc-units.el" "calc/calc-vec.el" "calc/calc-yank.el"
-;;;;;;  "calc/calcalg2.el" "calc/calcalg3.el" "calc/calccomp.el"
-;;;;;;  "calc/calcsel2.el" "calendar/cal-bahai.el" "calendar/cal-coptic.el"
-;;;;;;  "calendar/cal-french.el" "calendar/cal-html.el" "calendar/cal-islam.el"
-;;;;;;  "calendar/cal-iso.el" "calendar/cal-julian.el" "calendar/cal-loaddefs.el"
-;;;;;;  "calendar/cal-mayan.el" "calendar/cal-menu.el" "calendar/cal-move.el"
-;;;;;;  "calendar/cal-persia.el" "calendar/cal-tex.el" "calendar/cal-x.el"
-;;;;;;  "calendar/diary-loaddefs.el" "calendar/hol-loaddefs.el" "cdl.el"
-;;;;;;  "cedet/cedet-cscope.el" "cedet/cedet-files.el" "cedet/cedet-global.el"
+;;;;;;  "calc/calc-loaddefs.el" "calc/calc-macs.el" "calc/calc-map.el"
+;;;;;;  "calc/calc-math.el" "calc/calc-menu.el" "calc/calc-misc.el"
+;;;;;;  "calc/calc-mode.el" "calc/calc-mtx.el" "calc/calc-nlfit.el"
+;;;;;;  "calc/calc-poly.el" "calc/calc-prog.el" "calc/calc-rewr.el"
+;;;;;;  "calc/calc-rules.el" "calc/calc-sel.el" "calc/calc-stat.el"
+;;;;;;  "calc/calc-store.el" "calc/calc-stuff.el" "calc/calc-trail.el"
+;;;;;;  "calc/calc-undo.el" "calc/calc-units.el" "calc/calc-vec.el"
+;;;;;;  "calc/calc-yank.el" "calc/calcalg2.el" "calc/calcalg3.el"
+;;;;;;  "calc/calccomp.el" "calc/calcsel2.el" "calendar/cal-bahai.el"
+;;;;;;  "calendar/cal-coptic.el" "calendar/cal-french.el" "calendar/cal-html.el"
+;;;;;;  "calendar/cal-islam.el" "calendar/cal-iso.el" "calendar/cal-julian.el"
+;;;;;;  "calendar/cal-loaddefs.el" "calendar/cal-mayan.el" "calendar/cal-menu.el"
+;;;;;;  "calendar/cal-move.el" "calendar/cal-persia.el" "calendar/cal-tex.el"
+;;;;;;  "calendar/cal-x.el" "calendar/diary-loaddefs.el" "calendar/hol-loaddefs.el"
+;;;;;;  "cdl.el" "cedet/cedet-cscope.el" "cedet/cedet-files.el" "cedet/cedet-global.el"
 ;;;;;;  "cedet/cedet-idutils.el" "cedet/cedet.el" "cedet/ede/autoconf-edit.el"
 ;;;;;;  "cedet/ede/cpp-root.el" "cedet/ede/dired.el" "cedet/ede/emacs.el"
-;;;;;;  "cedet/ede/files.el" "cedet/ede/linux.el" "cedet/ede/locate.el"
-;;;;;;  "cedet/ede/make.el" "cedet/ede/makefile-edit.el" "cedet/ede/pconf.el"
-;;;;;;  "cedet/ede/pmake.el" "cedet/ede/proj-archive.el" "cedet/ede/proj-aux.el"
-;;;;;;  "cedet/ede/proj-comp.el" "cedet/ede/proj-elisp.el" "cedet/ede/proj-info.el"
-;;;;;;  "cedet/ede/proj-misc.el" "cedet/ede/proj-obj.el" "cedet/ede/proj-prog.el"
-;;;;;;  "cedet/ede/proj-scheme.el" "cedet/ede/proj-shared.el" "cedet/ede/proj.el"
-;;;;;;  "cedet/ede/project-am.el" "cedet/ede/shell.el" "cedet/ede/simple.el"
-;;;;;;  "cedet/ede/source.el" "cedet/ede/speedbar.el" "cedet/ede/srecode.el"
-;;;;;;  "cedet/ede/system.el" "cedet/ede/util.el" "cedet/inversion.el"
-;;;;;;  "cedet/mode-local.el" "cedet/pulse.el" "cedet/semantic/analyze.el"
-;;;;;;  "cedet/semantic/analyze/complete.el" "cedet/semantic/analyze/debug.el"
-;;;;;;  "cedet/semantic/analyze/fcn.el" "cedet/semantic/analyze/refs.el"
-;;;;;;  "cedet/semantic/bovine.el" "cedet/semantic/bovine/c-by.el"
-;;;;;;  "cedet/semantic/bovine/c.el" "cedet/semantic/bovine/debug.el"
-;;;;;;  "cedet/semantic/bovine/el.el" "cedet/semantic/bovine/gcc.el"
-;;;;;;  "cedet/semantic/bovine/make-by.el" "cedet/semantic/bovine/make.el"
-;;;;;;  "cedet/semantic/bovine/scm-by.el" "cedet/semantic/bovine/scm.el"
-;;;;;;  "cedet/semantic/chart.el" "cedet/semantic/complete.el" "cedet/semantic/ctxt.el"
-;;;;;;  "cedet/semantic/db-debug.el" "cedet/semantic/db-ebrowse.el"
-;;;;;;  "cedet/semantic/db-el.el" "cedet/semantic/db-file.el" "cedet/semantic/db-find.el"
-;;;;;;  "cedet/semantic/db-global.el" "cedet/semantic/db-javascript.el"
-;;;;;;  "cedet/semantic/db-mode.el" "cedet/semantic/db-ref.el" "cedet/semantic/db-typecache.el"
+;;;;;;  "cedet/ede/files.el" "cedet/ede/linux.el" "cedet/ede/loaddefs.el"
+;;;;;;  "cedet/ede/locate.el" "cedet/ede/make.el" "cedet/ede/makefile-edit.el"
+;;;;;;  "cedet/ede/pconf.el" "cedet/ede/pmake.el" "cedet/ede/proj-archive.el"
+;;;;;;  "cedet/ede/proj-aux.el" "cedet/ede/proj-comp.el" "cedet/ede/proj-elisp.el"
+;;;;;;  "cedet/ede/proj-info.el" "cedet/ede/proj-misc.el" "cedet/ede/proj-obj.el"
+;;;;;;  "cedet/ede/proj-prog.el" "cedet/ede/proj-scheme.el" "cedet/ede/proj-shared.el"
+;;;;;;  "cedet/ede/proj.el" "cedet/ede/project-am.el" "cedet/ede/shell.el"
+;;;;;;  "cedet/ede/simple.el" "cedet/ede/source.el" "cedet/ede/speedbar.el"
+;;;;;;  "cedet/ede/srecode.el" "cedet/ede/system.el" "cedet/ede/util.el"
+;;;;;;  "cedet/inversion.el" "cedet/mode-local.el" "cedet/pulse.el"
+;;;;;;  "cedet/semantic/analyze.el" "cedet/semantic/analyze/complete.el"
+;;;;;;  "cedet/semantic/analyze/debug.el" "cedet/semantic/analyze/fcn.el"
+;;;;;;  "cedet/semantic/analyze/refs.el" "cedet/semantic/bovine.el"
+;;;;;;  "cedet/semantic/bovine/c-by.el" "cedet/semantic/bovine/c.el"
+;;;;;;  "cedet/semantic/bovine/debug.el" "cedet/semantic/bovine/el.el"
+;;;;;;  "cedet/semantic/bovine/gcc.el" "cedet/semantic/bovine/make-by.el"
+;;;;;;  "cedet/semantic/bovine/make.el" "cedet/semantic/bovine/scm-by.el"
+;;;;;;  "cedet/semantic/bovine/scm.el" "cedet/semantic/chart.el"
+;;;;;;  "cedet/semantic/complete.el" "cedet/semantic/ctxt.el" "cedet/semantic/db-debug.el"
+;;;;;;  "cedet/semantic/db-ebrowse.el" "cedet/semantic/db-el.el"
+;;;;;;  "cedet/semantic/db-file.el" "cedet/semantic/db-find.el" "cedet/semantic/db-global.el"
+;;;;;;  "cedet/semantic/db-javascript.el" "cedet/semantic/db-mode.el"
+;;;;;;  "cedet/semantic/db-ref.el" "cedet/semantic/db-typecache.el"
 ;;;;;;  "cedet/semantic/db.el" "cedet/semantic/debug.el" "cedet/semantic/decorate.el"
 ;;;;;;  "cedet/semantic/decorate/include.el" "cedet/semantic/decorate/mode.el"
 ;;;;;;  "cedet/semantic/dep.el" "cedet/semantic/doc.el" "cedet/semantic/ede-grammar.el"
 ;;;;;;  "cedet/semantic/edit.el" "cedet/semantic/find.el" "cedet/semantic/format.el"
 ;;;;;;  "cedet/semantic/fw.el" "cedet/semantic/grammar-wy.el" "cedet/semantic/grammar.el"
 ;;;;;;  "cedet/semantic/html.el" "cedet/semantic/ia-sb.el" "cedet/semantic/ia.el"
-;;;;;;  "cedet/semantic/idle.el" "cedet/semantic/java.el" "cedet/semantic/lex-spp.el"
-;;;;;;  "cedet/semantic/lex.el" "cedet/semantic/mru-bookmark.el"
-;;;;;;  "cedet/semantic/sb.el" "cedet/semantic/scope.el" "cedet/semantic/senator.el"
-;;;;;;  "cedet/semantic/sort.el" "cedet/semantic/symref.el" "cedet/semantic/symref/cscope.el"
-;;;;;;  "cedet/semantic/symref/filter.el" "cedet/semantic/symref/global.el"
-;;;;;;  "cedet/semantic/symref/grep.el" "cedet/semantic/symref/idutils.el"
-;;;;;;  "cedet/semantic/symref/list.el" "cedet/semantic/tag-file.el"
-;;;;;;  "cedet/semantic/tag-ls.el" "cedet/semantic/tag-write.el"
+;;;;;;  "cedet/semantic/idle.el" "cedet/semantic/imenu.el" "cedet/semantic/java.el"
+;;;;;;  "cedet/semantic/lex-spp.el" "cedet/semantic/lex.el" "cedet/semantic/loaddefs.el"
+;;;;;;  "cedet/semantic/mru-bookmark.el" "cedet/semantic/sb.el" "cedet/semantic/scope.el"
+;;;;;;  "cedet/semantic/senator.el" "cedet/semantic/sort.el" "cedet/semantic/symref.el"
+;;;;;;  "cedet/semantic/symref/cscope.el" "cedet/semantic/symref/filter.el"
+;;;;;;  "cedet/semantic/symref/global.el" "cedet/semantic/symref/grep.el"
+;;;;;;  "cedet/semantic/symref/idutils.el" "cedet/semantic/symref/list.el"
+;;;;;;  "cedet/semantic/tag-file.el" "cedet/semantic/tag-ls.el" "cedet/semantic/tag-write.el"
 ;;;;;;  "cedet/semantic/tag.el" "cedet/semantic/texi.el" "cedet/semantic/util-modes.el"
 ;;;;;;  "cedet/semantic/util.el" "cedet/semantic/wisent.el" "cedet/semantic/wisent/comp.el"
 ;;;;;;  "cedet/semantic/wisent/java-tags.el" "cedet/semantic/wisent/javascript.el"
@@ -31807,18 +31853,18 @@ Zone out, completely.
 ;;;;;;  "cedet/srecode/el.el" "cedet/srecode/expandproto.el" "cedet/srecode/extract.el"
 ;;;;;;  "cedet/srecode/fields.el" "cedet/srecode/filters.el" "cedet/srecode/find.el"
 ;;;;;;  "cedet/srecode/getset.el" "cedet/srecode/insert.el" "cedet/srecode/java.el"
-;;;;;;  "cedet/srecode/map.el" "cedet/srecode/mode.el" "cedet/srecode/semantic.el"
-;;;;;;  "cedet/srecode/srt-wy.el" "cedet/srecode/srt.el" "cedet/srecode/table.el"
-;;;;;;  "cedet/srecode/template.el" "cedet/srecode/texi.el" "cus-dep.el"
-;;;;;;  "dframe.el" "dired-aux.el" "dired-x.el" "dos-fns.el" "dos-vars.el"
-;;;;;;  "dos-w32.el" "ediff-diff.el" "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/avl-tree.el"
-;;;;;;  "emacs-lisp/bindat.el" "emacs-lisp/byte-opt.el" "emacs-lisp/chart.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/eieio-base.el" "emacs-lisp/eieio-comp.el"
-;;;;;;  "emacs-lisp/eieio-custom.el" "emacs-lisp/eieio-datadebug.el"
+;;;;;;  "cedet/srecode/loaddefs.el" "cedet/srecode/map.el" "cedet/srecode/mode.el"
+;;;;;;  "cedet/srecode/semantic.el" "cedet/srecode/srt-wy.el" "cedet/srecode/srt.el"
+;;;;;;  "cedet/srecode/table.el" "cedet/srecode/template.el" "cedet/srecode/texi.el"
+;;;;;;  "cus-dep.el" "cus-load.el" "dframe.el" "dired-aux.el" "dired-x.el"
+;;;;;;  "dos-fns.el" "dos-vars.el" "dos-w32.el" "ediff-diff.el" "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/avl-tree.el" "emacs-lisp/bindat.el" "emacs-lisp/byte-opt.el"
+;;;;;;  "emacs-lisp/chart.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/eieio-base.el"
+;;;;;;  "emacs-lisp/eieio-comp.el" "emacs-lisp/eieio-custom.el" "emacs-lisp/eieio-datadebug.el"
 ;;;;;;  "emacs-lisp/eieio-opt.el" "emacs-lisp/eieio-speedbar.el"
 ;;;;;;  "emacs-lisp/eieio.el" "emacs-lisp/find-gc.el" "emacs-lisp/gulp.el"
 ;;;;;;  "emacs-lisp/lisp-mnt.el" "emacs-lisp/lmenu.el" "emacs-lisp/regi.el"
@@ -31835,18 +31881,19 @@ Zone out, completely.
 ;;;;;;  "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-io.el"
-;;;;;;  "eshell/esh-module.el" "eshell/esh-opt.el" "eshell/esh-proc.el"
-;;;;;;  "eshell/esh-util.el" "eshell/esh-var.el" "ezimage.el" "foldout.el"
-;;;;;;  "font-setting.el" "format-spec.el" "forms-d2.el" "forms-pass.el"
-;;;;;;  "fringe.el" "generic-x.el" "gnus/auth-source.el" "gnus/compface.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" "gnus/gnus-ems.el" "gnus/gnus-int.el"
-;;;;;;  "gnus/gnus-logic.el" "gnus/gnus-mh.el" "gnus/gnus-salt.el"
-;;;;;;  "gnus/gnus-score.el" "gnus/gnus-setup.el" "gnus/gnus-srvr.el"
-;;;;;;  "gnus/gnus-sum.el" "gnus/gnus-topic.el" "gnus/gnus-undo.el"
-;;;;;;  "gnus/gnus-util.el" "gnus/gnus-uu.el" "gnus/gnus-vm.el" "gnus/ietf-drums.el"
+;;;;;;  "eshell/esh-cmd.el" "eshell/esh-ext.el" "eshell/esh-groups.el"
+;;;;;;  "eshell/esh-io.el" "eshell/esh-module.el" "eshell/esh-opt.el"
+;;;;;;  "eshell/esh-proc.el" "eshell/esh-util.el" "eshell/esh-var.el"
+;;;;;;  "ezimage.el" "finder-inf.el" "foldout.el" "font-setting.el"
+;;;;;;  "format-spec.el" "forms-d2.el" "forms-pass.el" "fringe.el"
+;;;;;;  "generic-x.el" "gnus/auth-source.el" "gnus/compface.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"
+;;;;;;  "gnus/gnus-ems.el" "gnus/gnus-int.el" "gnus/gnus-logic.el"
+;;;;;;  "gnus/gnus-mh.el" "gnus/gnus-salt.el" "gnus/gnus-score.el"
+;;;;;;  "gnus/gnus-setup.el" "gnus/gnus-srvr.el" "gnus/gnus-sum.el"
+;;;;;;  "gnus/gnus-topic.el" "gnus/gnus-undo.el" "gnus/gnus-util.el"
+;;;;;;  "gnus/gnus-uu.el" "gnus/gnus-vm.el" "gnus/ietf-drums.el"
 ;;;;;;  "gnus/legacy-gnus-agent.el" "gnus/mail-parse.el" "gnus/mail-prsvr.el"
 ;;;;;;  "gnus/mail-source.el" "gnus/mailcap.el" "gnus/messcompat.el"
 ;;;;;;  "gnus/mm-bodies.el" "gnus/mm-decode.el" "gnus/mm-encode.el"
@@ -31891,45 +31938,45 @@ Zone out, completely.
 ;;;;;;  "net/hmac-def.el" "net/hmac-md5.el" "net/imap-hash.el" "net/imap.el"
 ;;;;;;  "net/ldap.el" "net/mairix.el" "net/netrc.el" "net/newsticker.el"
 ;;;;;;  "net/ntlm.el" "net/sasl-cram.el" "net/sasl-digest.el" "net/sasl-ntlm.el"
-;;;;;;  "net/sasl.el" "net/socks.el" "net/tls.el" "net/tramp-cache.el"
-;;;;;;  "net/tramp-cmds.el" "net/tramp-compat.el" "net/tramp-fish.el"
-;;;;;;  "net/tramp-gvfs.el" "net/tramp-gw.el" "net/tramp-imap.el"
-;;;;;;  "net/tramp-smb.el" "net/tramp-uu.el" "net/trampver.el" "net/zeroconf.el"
-;;;;;;  "nxml/nxml-enc.el" "nxml/nxml-maint.el" "nxml/nxml-ns.el"
-;;;;;;  "nxml/nxml-outln.el" "nxml/nxml-parse.el" "nxml/nxml-rap.el"
-;;;;;;  "nxml/nxml-util.el" "nxml/rng-dt.el" "nxml/rng-loc.el" "nxml/rng-maint.el"
-;;;;;;  "nxml/rng-match.el" "nxml/rng-parse.el" "nxml/rng-pttrn.el"
-;;;;;;  "nxml/rng-uri.el" "nxml/rng-util.el" "nxml/xsd-regexp.el"
-;;;;;;  "org/org-bibtex.el" "org/org-colview.el" "org/org-compat.el"
-;;;;;;  "org/org-crypt.el" "org/org-datetree.el" "org/org-exp-blocks.el"
-;;;;;;  "org/org-faces.el" "org/org-gnus.el" "org/org-habit.el" "org/org-info.el"
-;;;;;;  "org/org-inlinetask.el" "org/org-install.el" "org/org-jsinfo.el"
-;;;;;;  "org/org-list.el" "org/org-mac-message.el" "org/org-macs.el"
-;;;;;;  "org/org-mew.el" "org/org-mhe.el" "org/org-mouse.el" "org/org-protocol.el"
+;;;;;;  "net/sasl.el" "net/secrets.el" "net/socks.el" "net/tls.el"
+;;;;;;  "net/tramp-cache.el" "net/tramp-cmds.el" "net/tramp-compat.el"
+;;;;;;  "net/tramp-fish.el" "net/tramp-gvfs.el" "net/tramp-gw.el"
+;;;;;;  "net/tramp-imap.el" "net/tramp-smb.el" "net/tramp-uu.el"
+;;;;;;  "net/trampver.el" "net/zeroconf.el" "nxml/nxml-enc.el" "nxml/nxml-maint.el"
+;;;;;;  "nxml/nxml-ns.el" "nxml/nxml-outln.el" "nxml/nxml-parse.el"
+;;;;;;  "nxml/nxml-rap.el" "nxml/nxml-util.el" "nxml/rng-dt.el" "nxml/rng-loc.el"
+;;;;;;  "nxml/rng-maint.el" "nxml/rng-match.el" "nxml/rng-parse.el"
+;;;;;;  "nxml/rng-pttrn.el" "nxml/rng-uri.el" "nxml/rng-util.el"
+;;;;;;  "nxml/xsd-regexp.el" "org/org-bibtex.el" "org/org-colview.el"
+;;;;;;  "org/org-compat.el" "org/org-crypt.el" "org/org-datetree.el"
+;;;;;;  "org/org-exp-blocks.el" "org/org-faces.el" "org/org-gnus.el"
+;;;;;;  "org/org-habit.el" "org/org-info.el" "org/org-inlinetask.el"
+;;;;;;  "org/org-install.el" "org/org-jsinfo.el" "org/org-list.el"
+;;;;;;  "org/org-mac-message.el" "org/org-macs.el" "org/org-mew.el"
+;;;;;;  "org/org-mhe.el" "org/org-mouse.el" "org/org-protocol.el"
 ;;;;;;  "org/org-rmail.el" "org/org-src.el" "org/org-vm.el" "org/org-w3m.el"
-;;;;;;  "org/org-wl.el" "password-cache.el" "patcomp.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" "progmodes/cc-langs.el"
-;;;;;;  "progmodes/cc-menus.el" "progmodes/ebnf-abn.el" "progmodes/ebnf-bnf.el"
-;;;;;;  "progmodes/ebnf-dtd.el" "progmodes/ebnf-ebx.el" "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" "ps-def.el" "ps-mule.el" "ps-samp.el"
-;;;;;;  "s-region.el" "saveplace.el" "sb-image.el" "scroll-bar.el"
-;;;;;;  "select.el" "soundex.el" "subdirs.el" "tempo.el" "textmodes/bib-mode.el"
-;;;;;;  "textmodes/makeinfo.el" "textmodes/page-ext.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" "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" "vc-dav.el" "vcursor.el" "vt-control.el"
-;;;;;;  "vt100-led.el" "w32-fns.el" "w32-vars.el" "x-dnd.el") (19352
-;;;;;;  23109 108328))
+;;;;;;  "org/org-wl.el" "patcomp.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"
+;;;;;;  "progmodes/cc-langs.el" "progmodes/cc-menus.el" "progmodes/ebnf-abn.el"
+;;;;;;  "progmodes/ebnf-bnf.el" "progmodes/ebnf-dtd.el" "progmodes/ebnf-ebx.el"
+;;;;;;  "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"
+;;;;;;  "ps-def.el" "ps-mule.el" "ps-samp.el" "saveplace.el" "sb-image.el"
+;;;;;;  "scroll-bar.el" "select.el" "soundex.el" "subdirs.el" "tempo.el"
+;;;;;;  "textmodes/bib-mode.el" "textmodes/makeinfo.el" "textmodes/page-ext.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" "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" "vc-dav.el"
+;;;;;;  "vcursor.el" "vt-control.el" "vt100-led.el" "w32-fns.el"
+;;;;;;  "w32-vars.el" "x-dnd.el") (19375 51700 955763))
 
 ;;;***
 \f
index 10c6d480d238be04d4385e76fc76844344ca84cc..09dce0eb8591719d2d5d53525ffec0e9e3f2b9db 100644 (file)
@@ -188,6 +188,23 @@ when this variable is set to nil.")
 (defvar log-edit-callback nil)
 (defvar log-edit-diff-function nil)
 (defvar log-edit-listfun nil)
+(defvar log-edit-extra-flags nil
+  "List of extra flags to pass to the check in command.")
+(defvar log-edit-before-checkin-process nil
+  "Alist with instructions for processing the commit message before check in.
+The format is: (REGEXP . INSTRUCTIONS).
+All lines matching REGEXP are removed.  For example:
+
+\(\"^#.*\" . nil)
+
+means: just remove all lines starting with #.  This can be used
+to insert lines in the commit buffer that contain, for example, the
+list of files to be committed.
+
+\(\"Author: \\\\(.*\\\\)\" . (list \"--author\" (match-string 1)))
+
+means: append (list \"--author\" (match-string 1)) to `log-edit-extra-flags'.")
+
 (defvar log-edit-parent-buffer nil)
 
 ;;; Originally taken from VC-Log mode
@@ -318,9 +335,10 @@ automatically."
      (2 font-lock-function-name-face))))
 
 ;;;###autoload
-(defun log-edit (callback &optional setup params buffer &rest ignore)
+(defun log-edit (callback &optional setup params buffer mode &rest ignore)
   "Setup a buffer to enter a log message.
-\\<log-edit-mode-map>The buffer will be put in `log-edit-mode'.
+\\<log-edit-mode-map>The buffer will be put in mode MODE or `log-edit-mode'
+if MODE is nil.
 If SETUP is non-nil, the buffer is then erased and `log-edit-hook' is run.
 Mark and point will be set around the entire contents of the buffer so
 that it is easy to kill the contents of the buffer with \\[kill-region].
@@ -341,7 +359,9 @@ uses the current buffer."
     (when (and log-edit-setup-invert (not (eq setup 'force)))
       (setq setup (not setup)))
     (when setup (erase-buffer))
-    (log-edit-mode)
+    (if mode
+       (funcall mode)
+      (log-edit-mode))
     (set (make-local-variable 'log-edit-callback) callback)
     (if (listp params)
        (dolist (crt params)
@@ -368,7 +388,8 @@ commands (under C-x v for VC, for example).
 \\{log-edit-mode-map}"
   (set (make-local-variable 'font-lock-defaults)
        '(log-edit-font-lock-keywords t))
-  (make-local-variable 'log-edit-comment-ring-index))
+  (make-local-variable 'log-edit-comment-ring-index)
+  (hack-dir-local-variables-non-file-buffer))
 
 (defun log-edit-hide-buf (&optional buf where)
   (when (setq buf (get-buffer (or buf log-edit-files-buf)))
@@ -710,6 +731,17 @@ Sort REGIONS front-to-back first."
       (log-edit-changelog-insert-entries (car buffer-entry) (cdr buffer-entry))
       (when (cdr buffer-entry) (newline)))))
 
+(defun log-view-process-buffer ()
+  (when log-edit-before-checkin-process
+    (dolist (crt log-edit-before-checkin-process)
+      ;; Remove all lines matching (car crt)
+      ;; Append to `log-edit-extra-flags' the results of (cdr crt).
+      (goto-char (point-min))
+      (while (re-search-forward (car crt) nil t)
+       (when (cdr crt)
+         (setq log-edit-extra-flags (append log-edit-extra-flags (eval (cdr crt)))))
+       (replace-match "" nil t)))))
+
 (provide 'log-edit)
 
 ;; arch-tag: 8089b39c-983b-4e83-93cd-ed0a64c7fdcc
index 6fbe84296719e14a5233338422f5d985f704811f..233fc3fccc289249a945f6752d2e0f6cf891141f 100644 (file)
@@ -4,7 +4,7 @@
 ;;   2008, 2009, 2010  Free Software Foundation, Inc.
 
 ;; Author: Stefan Monnier <monnier@iro.umontreal.ca>
-;; Keywords: rcs sccs cvs log version-control tools
+;; Keywords: rcs, sccs, cvs, log, version control, tools
 
 ;; This file is part of GNU Emacs.
 
@@ -255,7 +255,8 @@ The match group number 1 should match the revision number itself.")
        '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))
+  (set (make-local-variable 'cvs-minor-wrap-function) 'log-view-minor-wrap)
+  (hack-dir-local-variables-non-file-buffer))
 
 ;;;;
 ;;;; Navigation
index 5dddf00fd71ac81a1a5b16569a75d990f54be6c0..478d7aa075fd9e1e538cdbd25f07d0ece7b3ba89 100644 (file)
   :group 'maint
   :group 'mail)
 
+(define-obsolete-variable-alias 'report-emacs-bug-pretest-address
+  'report-emacs-bug-address "24.1")
+
 (defcustom report-emacs-bug-address "bug-gnu-emacs@gnu.org"
   "Address of mailing list for GNU Emacs bugs."
   :group 'emacsbug
   :type 'string)
 
-(defcustom report-emacs-bug-pretest-address "bug-gnu-emacs@gnu.org"
-  "Address of mailing list for GNU Emacs pretest bugs."
-  :group 'emacsbug
-  :type 'string
-  :version "23.2")                ; emacs-pretest-bug -> bug-gnu-emacs
-
 (defcustom report-emacs-bug-no-confirmation nil
   "If non-nil, suppress the confirmations asked for the sake of novice users."
   :group 'emacsbug
@@ -75,6 +72,7 @@
 (declare-function x-server-vendor "xfns.c" (&optional terminal))
 (declare-function x-server-version "xfns.c" (&optional terminal))
 (declare-function message-sort-headers "message" ())
+(defvar message-strip-special-text-properties)
 
 ;;;###autoload
 (defun report-emacs-bug (topic &optional recent-keys)
@@ -89,32 +87,25 @@ Prompts for bug subject.  Leaves you in a mail buffer."
       (setq topic (concat emacs-version "; " topic))
     (when (string-match "^\\(\\([.0-9]+\\)*\\)\\.[0-9]+$" emacs-version)
       (setq topic (concat (match-string 1 emacs-version) "; " topic))))
-  ;; If there are four numbers in emacs-version (three for MS-DOS),
-  ;; this is a pretest version.
-  (let* ((pretest-p (string-match (if (eq system-type 'ms-dos)
-                                     "\\..*\\."
-                                   "\\..*\\..*\\.")
-                                 emacs-version))
-        (from-buffer (current-buffer))
-        (reporting-address (if pretest-p
-                               report-emacs-bug-pretest-address
-                             report-emacs-bug-address))
-        ;; Put these properties on semantically-void text.
-        ;; report-emacs-bug-hook deletes these regions before sending.
-        (prompt-properties '(field emacsbug-prompt
-                                   intangible but-helpful
-                                   rear-nonsticky t))
-        user-point message-end-point)
+  (let ((from-buffer (current-buffer))
+        ;; Put these properties on semantically-void text.
+        ;; report-emacs-bug-hook deletes these regions before sending.
+        (prompt-properties '(field emacsbug-prompt
+                                   intangible but-helpful
+                                   rear-nonsticky t))
+        user-point message-end-point)
     (setq message-end-point
          (with-current-buffer (get-buffer-create "*Messages*")
            (point-max-marker)))
-    (compose-mail reporting-address topic)
+    (compose-mail report-emacs-bug-address topic)
     ;; The rest of this does not execute if the user was asked to
     ;; confirm and said no.
-    ;; Message-mode sorts the headers before sending.  We sort now so
-    ;; that report-emacs-bug-orig-text remains valid.  (Bug#5178)
-    (if (eq major-mode 'message-mode)
-        (message-sort-headers))
+    (when (eq major-mode 'message-mode)
+      ;; Message-mode sorts the headers before sending.  We sort now so
+      ;; that report-emacs-bug-orig-text remains valid.  (Bug#5178)
+      (message-sort-headers)
+      ;; Stop message-mode stealing the properties we will add.
+      (set (make-local-variable 'message-strip-special-text-properties) nil))
     (rfc822-goto-eoh)
     (forward-line 1)
     (let ((signature (buffer-substring (point) (point-max))))
@@ -123,7 +114,7 @@ Prompts for bug subject.  Leaves you in a mail buffer."
       (backward-char (length signature)))
     (unless report-emacs-bug-no-explanations
       ;; Insert warnings for novice users.
-      (when (string-match "@gnu\\.org$" reporting-address)
+      (when (string-match "@gnu\\.org$" report-emacs-bug-address)
        (insert "This bug report will be sent to the Free Software Foundation,\n")
        (let ((pos (point)))
          (insert "not to your local site managers!")
@@ -135,17 +126,12 @@ Prompts for bug subject.  Leaves you in a mail buffer."
       (insert " if possible, because the Emacs maintainers
 usually do not have translators to read other languages for them.\n\n")
       (insert (format "Your bug report will be posted to the %s mailing list"
-                     reporting-address))
-      ;; Nowadays all bug reports end up there.
-;;;      (if pretest-p (insert ".\n\n")
+                     report-emacs-bug-address))
        (insert ",\nand to the gnu.emacs.bug news group.\n\n"))
 
     (insert "Please describe exactly what actions triggered the bug\n"
            "and the precise symptoms of the bug.  If you can, give\n"
            "a recipe starting from `emacs -Q':\n\n")
-    ;; Stop message-mode stealing the properties we are about to add.
-    (if (boundp 'message-strip-special-text-properties)
-        (set (make-local-variable 'message-strip-special-text-properties) nil))
     (add-text-properties (save-excursion
                            (rfc822-goto-eoh)
                            (line-beginning-position 2))
index 86364ab7835ce03c19fcf6978ce1a5325c43378a..c7b48cf78edd7d1cd3fcfe1d6f29d407aa383373 100644 (file)
@@ -1,6 +1,7 @@
 ;;; hashcash.el --- Add hashcash payments to email
 
-;; Copyright (C) 2003, 2004, 2005, 2007, 2008, 2009, 2010  Free Software Foundation
+;; Copyright (C) 2003, 2004, 2005, 2007, 2008, 2009, 2010
+;;   Free Software Foundation
 
 ;; Written by: Paul Foley <mycroft@actrix.gen.nz> (1997-2002)
 ;; Maintainer: Paul Foley <mycroft@actrix.gen.nz>
@@ -115,8 +116,6 @@ For example, you may want to set this to '(\"-Z2\") to reduce header length."
 (require 'mail-utils)
 
 (eval-and-compile
-  (unless (fboundp 'declare-function) (defmacro declare-function (&rest r)))
-
   (if (fboundp 'point-at-bol)
       (defalias 'hashcash-point-at-bol 'point-at-bol)
     (defalias 'hashcash-point-at-bol 'line-beginning-position))
@@ -131,10 +130,10 @@ For example, you may want to set this to '(\"-Z2\") to reduce header length."
       (concat (match-string 1 addr) (match-string 2 addr))
     addr))
 
-(declare-function  message-narrow-to-headers-or-head "message" ())
-(declare-function  message-fetch-field "message" (header &optional not-all))
-(declare-function  message-goto-eoh "message" ())
-(declare-function  message-narrow-to-headers "message" ())
+(declare-function message-narrow-to-headers-or-head "message" ())
+(declare-function message-fetch-field "message" (header &optional not-all))
+(declare-function message-goto-eoh "message" ())
+(declare-function message-narrow-to-headers "message" ())
 
 (defun hashcash-token-substring ()
   (save-excursion
@@ -287,7 +286,7 @@ BUFFER defaults to the current buffer."
   "Ask user whether to wait for hashcash processes to finish."
   (interactive)
   (when (hashcash-processes-running-p (current-buffer))
-    (if (y-or-n-p 
+    (if (y-or-n-p
          "Hashcash process(es) still running; wait for them to finish? ")
        (hashcash-wait-async)
       (hashcash-cancel-async))))
index 64c7c57f8db6c416727b8ec5f78ad77759d49f35..47326b636a12490caee89390cf12b56e75992c73 100644 (file)
@@ -40,7 +40,6 @@
 (defgroup metamail nil
   "Metamail interface for Emacs."
   :group 'mail
-  :group 'hypermedia
   :group 'processes)
 
 (defcustom metamail-program-name "metamail"
index f3636c6504faf92f87d99a7b6de7162f56cf2f98..9144be89e96949afed9581a344d789bc16e9ff74 100644 (file)
@@ -34,7 +34,6 @@
 
 \f
 (require 'regi)
-(require 'sendmail)    ;; For mail-header-end.
 
 ;; start user configuration variables
 ;; vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
@@ -1484,18 +1483,22 @@ non-nil."
   "Does nothing.  Use this instead of nil to get a blank header."
   ())
 
-(defun sc-no-blank-line-or-header()
+(declare-function mh-in-header-p "mh-utils" ())
+
+(defun sc-no-blank-line-or-header ()
   "Similar to `sc-no-header' except it removes the preceding blank line."
-  (if (not (bobp))
-      (if (and (eolp)
-              (progn (forward-line -1)
-                     (or (= (point) (mail-header-end))
-                         (and (eq major-mode 'mh-letter-mode)
-                              (with-no-warnings
-                                (mh-in-header-p))))))
-         (progn (forward-line)
-                (let ((kill-lines-magic t))
-                  (kill-line))))))
+  (and (not (bobp))
+       (eolp)
+       (progn (forward-line -1)
+             (or (= (point)
+                    (save-excursion
+                      (rfc822-goto-eoh)
+                      (line-beginning-position 2)))
+                 (and (eq major-mode 'mh-letter-mode)
+                      (mh-in-header-p))))
+       (progn
+        (forward-line)
+        (kill-line))))
 
 (defun sc-header-on-said ()
   "\"On <date>, <from> said:\" unless:
index 70f96e0dbc7bde0e32e514c9bb9a0f7a2a0e7af4..4584aa0bbd75a5a3e4b17a57a4e446c9999c7378 100644 (file)
@@ -1,4 +1,4 @@
-2010-03-22  Juanma Barranquero  <lekktu@gmail.com>
+2010-03-24  Juanma Barranquero  <lekktu@gmail.com>
 
        * mh-scan.el (mh-scan-cmd-note-width): Doc fix.
        (mh-scan-format-mh, mh-scan-body-regexp, mh-scan-cur-msg-number-regexp)
        (mh-scan-subject-regexp, mh-update-scan-format)
        (mh-msg-num-width-to-column): Fix typos in docstrings.
 
+2010-03-10  Chong Yidong  <cyd@stupidchicken.com>
+
+       * Branch for 23.2.
+
 2009-12-01  Bill Wohler  <wohler@newt.com>
 
        * mh-search.el (mh-mairix-execute-search): Use mh vfolder_format.
index 5887a3445bc14cfffdf7afa0dd737947344d8717..5ff1ecc9b070e4e171c9d0c3df6df369cc82b39d 100644 (file)
@@ -3,8 +3,8 @@
 ;; Copyright (C) 1998, 2001, 2002, 2003, 2004, 2005,
 ;;   2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
 
-;; Author: Sam Steingold <sds@usa.net>
-;; Maintainer: Sam Steingold <sds@usa.net>
+;; Author: Sam Steingold <sds@gnu.org>
+;; Maintainer: Sam Steingold <sds@gnu.org>
 ;; Created: 1998-05-18
 ;; Keywords: utilities
 
@@ -205,7 +205,7 @@ The default value is `clean-buffer-list'."
 
 (defun midnight-next ()
   "Return the number of seconds till the next midnight."
-  (multiple-value-bind (sec min hrs) 
+  (multiple-value-bind (sec min hrs)
       (values-list (decode-time))
     (- (* 24 60 60) (* 60 60 hrs) (* 60 min) sec)))
 
index 43838a32cebf99050e3c8014ae14975fc2f7db83..154cc37e9a1965995f9f69f61d49cf32fa2d95e3 100644 (file)
@@ -393,6 +393,9 @@ the second failed attempt to complete."
      "Completion of multiple words, each one taken as a prefix.
 E.g. M-x l-c-h can complete to list-command-history
 and C-x C-f /u/m/s to /usr/monnier/src.")
+    (substring
+     completion-substring-try-completion completion-substring-all-completions
+     "Completion of the string taken as a substring.")
     (initials
      completion-initials-try-completion completion-initials-all-completions
      "Completion of acronyms and initialisms.
@@ -1658,6 +1661,12 @@ Return the new suffix."
     ;; Nothing to merge.
     suffix))
 
+(defun completion-basic--pattern (beforepoint afterpoint bounds)
+  (delete
+   "" (list (substring beforepoint (car bounds))
+            'point
+            (substring afterpoint 0 (cdr bounds)))))
+
 (defun completion-basic-try-completion (string table pred point)
   (let* ((beforepoint (substring string 0 point))
          (afterpoint (substring string point))
@@ -1674,10 +1683,8 @@ Return the new suffix."
              (length completion))))
       (let* ((suffix (substring afterpoint (cdr bounds)))
              (prefix (substring beforepoint 0 (car bounds)))
-             (pattern (delete
-                       "" (list (substring beforepoint (car bounds))
-                                'point
-                                (substring afterpoint 0 (cdr bounds)))))
+             (pattern (completion-basic--pattern
+                       beforepoint afterpoint bounds))
              (all (completion-pcm--all-completions prefix pattern table pred)))
         (if minibuffer-completing-file-name
             (setq all (completion-pcm--filename-try-filter all)))
@@ -1687,12 +1694,8 @@ Return the new suffix."
   (let* ((beforepoint (substring string 0 point))
          (afterpoint (substring string point))
          (bounds (completion-boundaries beforepoint table pred afterpoint))
-         (suffix (substring afterpoint (cdr bounds)))
          (prefix (substring beforepoint 0 (car bounds)))
-         (pattern (delete
-                   "" (list (substring beforepoint (car bounds))
-                            'point
-                            (substring afterpoint 0 (cdr bounds)))))
+         (pattern (completion-basic--pattern beforepoint afterpoint bounds))
          (all (completion-pcm--all-completions prefix pattern table pred)))
     (completion-hilit-commonality all point (car bounds))))
 
@@ -2069,7 +2072,38 @@ filter out additional entries (because TABLE migth not obey PRED)."
            'completion-pcm--filename-try-filter))
     (completion-pcm--merge-try pattern all prefix suffix)))
 
-;;; Initials completion
+;;; Substring completion
+;; Mostly derived from the code of `basic' completion.
+
+(defun completion-substring--all-completions (string table pred point)
+  (let* ((beforepoint (substring string 0 point))
+         (afterpoint (substring string point))
+         (bounds (completion-boundaries beforepoint table pred afterpoint))
+         (suffix (substring afterpoint (cdr bounds)))
+         (prefix (substring beforepoint 0 (car bounds)))
+         (basic-pattern (completion-basic--pattern
+                         beforepoint afterpoint bounds))
+         (pattern (if (not (stringp (car basic-pattern)))
+                      basic-pattern
+                    (cons 'any basic-pattern)))
+         (all (completion-pcm--all-completions prefix pattern table pred)))
+    (list all pattern prefix suffix (car bounds))))
+
+(defun completion-substring-try-completion (string table pred point)
+  (destructuring-bind (all pattern prefix suffix carbounds)
+      (completion-substring--all-completions string table pred point)
+    (if minibuffer-completing-file-name
+        (setq all (completion-pcm--filename-try-filter all)))
+    (completion-pcm--merge-try pattern all prefix suffix)))
+
+(defun completion-substring-all-completions (string table pred point)
+  (destructuring-bind (all pattern prefix suffix carbounds)
+      (completion-substring--all-completions string table pred point)
+    (when all
+      (nconc (completion-pcm--hilit-commonality pattern all)
+             (length prefix)))))
+
+;; Initials completion
 ;; Complete /ums to /usr/monnier/src or lch to list-command-history.
 
 (defun completion-initials-expand (str table pred)
index 23157635d981fe29485553137a33e009de0cb822..97c5573face3dde374f0a762c455483e6da17329 100644 (file)
 
 (eval-when-compile (require 'cl))
 
-;;; Backward compatibility.
-;; This code is meant for Emacs-CVS, so to get it to run on anything else,
-;; we need to define some more things.
-
-(unless (fboundp 'tool-bar-local-item)
-  (defun tool-bar-local-item (icon def key map &rest props)
-    (define-key-after map (vector key)
-      `(menu-item ,(symbol-name key) ,def
-                  :image ,(find-image
-                           `((:type xpm :file ,(concat icon ".xpm"))))
-                  ,@props))))
-
-(unless (fboundp 'process-put)
-  (defconst mpc-process-hash (make-hash-table :weakness 'key))
-  (defun process-put (proc prop val)
-    (let ((sym (gethash proc mpc-process-hash)))
-      (unless sym
-        (setq sym (puthash proc (make-symbol "mpc-proc-sym") mpc-process-hash)))
-      (put sym prop val)))
-  (defun process-get (proc prop)
-    (let ((sym (gethash proc mpc-process-hash)))
-      (when sym (get sym prop))))
-  (defun process-plist (proc)
-    (let ((sym (gethash proc mpc-process-hash)))
-      (when sym (symbol-plist sym)))))
-(unless (fboundp 'with-local-quit)
-  (defmacro with-local-quit (&rest body)
-    `(condition-case nil (let ((inhibit-quit nil)) ,@body)
-       (quit (setq quit-flag t) nil))))
-(unless (fboundp 'balance-windows-area)
-  (defalias 'balance-windows-area 'balance-windows))
-(unless (fboundp 'posn-object) (defalias 'posn-object 'ignore))
-(unless (fboundp 'buffer-local-value)
-  (defun buffer-local-value (var buf)
-    (with-current-buffer buf (symbol-value var))))
-
-
-;;; Main code starts here.
-
 (defgroup mpc ()
   "A Client for the Music Player Daemon."
   :prefix "mpc-"
   :group 'multimedia
   :group 'applications)
 
-(defcustom mpc-browser-tags '(Genre Artist Album Playlist)
+(defcustom mpc-browser-tags '(Genre Artist|Composer|Performer
+                              Album|Playlist)
   "Tags for which a browser buffer should be created by default."
-  :type '(repeat string))
+  ;; FIXME: provide a list of tags, for completion.
+  :type '(repeat symbol))
 
 ;;; Misc utils ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
@@ -620,6 +583,19 @@ Any call to `mpc-status-refresh' may cause it to be restarted."
 ;;                       (mpc--queue-head)))
 ;;           (message "MPC's queue is out of sync"))))))
 
+(defvar mpc--find-memoize-union-tags nil)
+
+(defun mpc-cmd-flush (tag value)
+  (puthash (cons tag value) nil mpc--find-memoize)
+  (dolist (uniontag mpc--find-memoize-union-tags)
+    (if (member (symbol-name tag) (split-string (symbol-name uniontag) "|"))
+        (puthash (cons uniontag value) nil mpc--find-memoize))))
+
+
+(defun mpc-cmd-special-tag-p (tag)
+  (or (memq tag '(Playlist Search Directory))
+      (string-match "|" (symbol-name tag))))
+
 (defun mpc-cmd-find (tag value)
   "Return a list of all songs whose tag TAG has value VALUE.
 The songs are returned as alists."
@@ -628,8 +604,12 @@ The songs are returned as alists."
                (cond
                 ((eq tag 'Playlist)
                  ;; Special case for pseudo-tag playlist.
-                 (let ((l (mpc-proc-buf-to-alists
-                           (mpc-proc-cmd (list "listplaylistinfo" value))))
+                 (let ((l (condition-case err
+                              (mpc-proc-buf-to-alists
+                               (mpc-proc-cmd (list "listplaylistinfo" value)))
+                            (mpc-proc-error
+                             ;; "[50@0] {listplaylistinfo} No such playlist"
+                             nil)))
                        (i 0))
                    (mapcar (lambda (s)
                              (prog1 (cons (cons 'Pos (number-to-string i)) s)
@@ -648,6 +628,14 @@ The songs are returned as alists."
                                         (if (eq (car pair) 'directory)
                                             nil pair))
                                       pairs)))))
+                ((string-match "|" (symbol-name tag))
+                 (add-to-list 'mpc--find-memoize-union-tags tag)
+                 (let ((tag1 (intern (substring (symbol-name tag)
+                                                0 (match-beginning 0))))
+                       (tag2 (intern (substring (symbol-name tag)
+                                                (match-end 0)))))
+                   (mpc-union (mpc-cmd-find tag1 value)
+                              (mpc-cmd-find tag2 value))))
                 (t
                  (condition-case err
                      (mpc-proc-buf-to-alists
@@ -675,7 +663,7 @@ The songs are returned as alists."
       (when other-tag
         (dolist (pl (prog1 pls (setq pls nil)))
           (let ((plsongs (mpc-cmd-find 'Playlist pl)))
-            (if (not (member other-tag '(Playlist Search Directory)))
+            (if (not (mpc-cmd-special-tag-p other-tag))
                 (when (member (cons other-tag value)
                               (apply 'append plsongs))
                   (push pl pls))
@@ -743,6 +731,14 @@ The songs are returned as alists."
    ;; useful that would be tho.
    ((eq tag 'Search) (error "Not supported"))
 
+   ((string-match "|" (symbol-name tag))
+    (let ((tag1 (intern (substring (symbol-name tag)
+                                   0 (match-beginning 0))))
+          (tag2 (intern (substring (symbol-name tag)
+                                   (match-end 0)))))
+      (mpc-union (mpc-cmd-list tag1 other-tag value)
+                 (mpc-cmd-list tag2 other-tag value))))
+
    ((null other-tag)
     (condition-case nil
         (mapcar 'cdr (mpc-proc-cmd-to-alist (list "list" (symbol-name tag))))
@@ -754,7 +750,7 @@ The songs are returned as alists."
        (mpc-assq-all tag (mpc-proc-cmd-to-alist "listallinfo")))))
    (t
     (condition-case nil
-        (if (member other-tag '(Search Playlist Directory))
+        (if (mpc-cmd-special-tag-p other-tag)
             (signal 'mpc-proc-error "Not implemented")
           (mapcar 'cdr
                   (mpc-proc-cmd-to-alist
@@ -801,7 +797,7 @@ If PLAYLIST is t or nil or missing, use the main playlist."
                              (list "add" file)))
                          files)))
     (if (stringp playlist)
-        (puthash (cons 'Playlist playlist) nil mpc--find-memoize)))
+        (mpc-cmd-flush 'Playlist playlist)))
 
 (defun mpc-cmd-delete (song-poss &optional playlist)
   "Delete the songs at positions SONG-POSS from PLAYLIST.
@@ -928,6 +924,10 @@ If PLAYLIST is t or nil or missing, use the main playlist."
 ;;; Formatter ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 (defun mpc-secs-to-time (secs)
+  ;; We could use `format-seconds', but it doesn't seem worth the trouble
+  ;; because we'd still need to check (>= secs (* 60 100)) since the special
+  ;; %z only allows us to drop the large units for small values but
+  ;; not to drop the small units for large values.
   (if (stringp secs) (setq secs (string-to-number secs)))
   (if (>= secs (* 60 100))              ;More than 100 minutes.
       (format "%dh%02d" ;"%d:%02d:%02d"
@@ -1432,6 +1432,20 @@ when constructing the set of constraints."
         (with-current-buffer buf (with-local-quit (mpc-tagbrowser-refresh)))))
     (with-local-quit (mpc-songs-refresh))))
 
+(defun mpc-tagbrowser-tag-name (tag)
+  (cond
+   ((string-match "|" (symbol-name tag))
+    (let ((tag1 (intern (substring (symbol-name tag)
+                                   0 (match-beginning 0))))
+          (tag2 (intern (substring (symbol-name tag)
+                                   (match-end 0)))))
+      (concat (mpc-tagbrowser-tag-name tag1)
+              " | "
+              (mpc-tagbrowser-tag-name tag2))))
+   ((string-match "y\\'" (symbol-name tag))
+    (concat (substring (symbol-name tag) 0 -1) "ies"))
+   (t (concat (symbol-name tag) "s"))))
+
 (defun mpc-tagbrowser-buf (tag)
   (let ((buf (mpc-proc-buffer (mpc-proc) tag)))
     (if (buffer-live-p buf) buf
@@ -1446,10 +1460,7 @@ when constructing the set of constraints."
           (insert mpc-tagbrowser-all-name "\n"))
         (forward-line -1)
         (setq mpc-tag tag)
-        (setq mpc-tag-name
-              (if (string-match "y\\'" (symbol-name tag))
-                  (concat (substring (symbol-name tag) 0 -1) "ies")
-                (concat (symbol-name tag) "s")))
+        (setq mpc-tag-name (mpc-tagbrowser-tag-name tag))
         (mpc-tagbrowser-all-select)
         (mpc-tagbrowser-refresh)
         buf))))
@@ -1858,20 +1869,22 @@ This is used so that they can be compared with `eq', which is needed for
                                  (mapcar (lambda (val)
                                            (mpc-cmd-find (car cst) val))
                                          (cdr cst)))))
-                (setq active (if (null active)
-                                 (progn
+                (setq active (cond
+                              ((null active)
                                    (if (eq (car cst) 'Playlist)
                                        (setq dontsort t))
                                    vals)
-                               (if (or dontsort
+                              ((or dontsort
                                        ;; Try to preserve ordering and
                                        ;; repetitions from playlists.
                                        (not (eq (car cst) 'Playlist)))
                                    (mpc-intersection active vals
-                                                     (lambda (x) (assq 'file x)))
+                                                 (lambda (x) (assq 'file x))))
+                              (t
                                  (setq dontsort t)
                                  (mpc-intersection vals active
-                                                   (lambda (x) (assq 'file x)))))))))
+                                                 (lambda (x)
+                                                   (assq 'file x)))))))))
           (mpc-select-save
             (erase-buffer)
             ;; Sorting songs is surprisingly difficult: when comparing two
@@ -1902,9 +1915,10 @@ This is used so that they can be compared with `eq', which is needed for
               ))
           (goto-char (point-min))
           (forward-line (car curline))
-          (when (or (search-forward (cdr curline) nil t)
+          (if (or (search-forward (cdr curline) nil t)
                     (search-backward (cdr curline) nil t))
-            (beginning-of-line))
+              (beginning-of-line)
+            (goto-char (point-min)))
           (set (make-local-variable 'mpc-songs-totaltime)
                (unless (zerop totaltime)
                  (list " " (mpc-secs-to-time totaltime))))
index 6e46838674905c5432d0b7fd2eda55f853a840cd..336ffdadd09e28ee80463fe5ca6986b2f0025efd 100644 (file)
   "Accessing remote files and directories using FTP
    made as simple and transparent as possible."
   :group 'files
+  :group 'comm
   :prefix "ange-ftp-")
 
 (defcustom ange-ftp-name-format
index 3a5fa8c30a682a2b1c1c601577c543d8fc39eaf7..261b765eaeb4ed48d1516d2669036682d832079b 100644 (file)
   "Use a web browser to look at a URL."
   :prefix "browse-url-"
   :link '(emacs-commentary-link "browse-url")
-  :group 'hypermedia)
+  :group 'external
+  :group 'comm)
 
 ;;;###autoload
 (defcustom browse-url-browser-function
index fd8c1061bcb60bf27576d571ef79928cb56bbc14..182758aaffb2cf10457b019e15a404b3a66e3d40 100644 (file)
@@ -76,7 +76,7 @@
 (defgroup goto-address nil
   "Click to browse URL or to send to e-mail address."
   :group 'mouse
-  :group 'hypermedia)
+  :group 'comm)
 
 
 ;; I don't expect users to want fontify'ing without highlighting.
index 9cbb919abcc14b9a0bd3c285f2c9b73d9842d401..5f57ea617ba8f75c477dba4fe834c36469bdb8ad 100644 (file)
@@ -3,7 +3,7 @@
 ;; Copyright (C) 1999, 2001, 2007, 2008, 2009, 2010  Free Software Foundation, Inc.
 
 ;; Author: Shuhei KOBAYASHI <shuhei@aqua.ocn.ne.jp>
-;; Keywords: HMAC, RFC-2104
+;; Keywords: HMAC, RFC2104
 
 ;; This file is part of GNU Emacs.
 
@@ -22,7 +22,7 @@
 
 ;;; Commentary:
 
-;; This program is implemented from RFC 2104,
+;; This program is implemented from RFC2104,
 ;; "HMAC: Keyed-Hashing for Message Authentication".
 
 ;;; Code:
index 9bda79d36f0d86498c349db91589d3eb73b2cd80..045a12520a16ad03e4df88fc84cee3e6818e2ea6 100644 (file)
@@ -3,7 +3,7 @@
 ;; Copyright (C) 1999, 2001, 2007, 2008, 2009, 2010  Free Software Foundation, Inc.
 
 ;; Author: Shuhei KOBAYASHI <shuhei@aqua.ocn.ne.jp>
-;; Keywords: HMAC, RFC-2104, HMAC-MD5, MD5, KEYED-MD5, CRAM-MD5
+;; Keywords: HMAC, RFC2104, HMAC-MD5, MD5, KEYED-MD5, CRAM-MD5
 
 ;; This file is part of GNU Emacs.
 
index 3445b840df832a1ebc5cb5cb52b32fe58d8021b6..99278d9ee21e53b4f6e72f647591f228cd015dec 100644 (file)
@@ -4,6 +4,7 @@
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 ;; Keywords: news
+;;
 ;;  Modularized by Ted Zlatanov <tzz@lifelogs.com>
 ;;  when it was part of Gnus.
 
diff --git a/lisp/net/secrets.el b/lisp/net/secrets.el
new file mode 100644 (file)
index 0000000..c45f6fb
--- /dev/null
@@ -0,0 +1,707 @@
+;;; secrets.el --- Client interface to gnome-keyring and kwallet.
+
+;; Copyright (C) 2010 Free Software Foundation, Inc.
+
+;; Author: Michael Albinus <michael.albinus@gmx.de>
+;; Keywords: comm password passphrase
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This package provides an implementation of the Secret Service API
+;; <http://www.freedesktop.org/wiki/Specifications/secret-storage-spec>.
+;; This API is meant to make GNOME-Keyring- and KWallet-like daemons
+;; available under a common D-BUS interface and thus increase
+;; interoperability between GNOME, KDE and other applications having
+;; the need to securely store passwords and other confidential
+;; information.
+
+;; In order to activate this package, you must add the following code
+;; into your .emacs:
+;;
+;;   (require 'secrets)
+;;
+;; Afterwards, the variable `secrets-enabled' is non-nil when there is
+;; a daemon providing this interface.
+
+;; The atomic objects to be managed by the Secret Service API are
+;; secret items, which are something an application wishes to store
+;; securely.  A good example is a password that an application needs
+;; to save and use at a later date.
+
+;; Secret items are grouped in collections.  A collection is similar
+;; in concept to the terms 'keyring' or 'wallet'.  A common collection
+;; is called "login".  A collection is stored permanently under the
+;; user's permissions, and can be accessed in a user session context.
+
+;; A collection can have an alias name.  The use case for this is to
+;; set the alias "default" for a given collection, making it
+;; transparent for clients, which collection is used.  Other aliases
+;; are not supported (yet).  Since an alias is visible to all
+;; applications, this setting shall be performed with care.
+
+;; A list of all available collections is available by
+;;
+;;   (secrets-list-collections)
+;;    => ("session" "login" "ssh keys")
+
+;; The "default" alias could be set to the "login" collection by
+;;
+;;   (secrets-set-alias "login" "default")
+
+;; An alias can also be dereferenced
+;;
+;;   (secrets-get-alias "default")
+;;    => "login"
+
+;; Collections can be created and deleted.  As already said,
+;; collections are used by different applications.  Therefore, those
+;; operations shall also be performed with care.  Common collections,
+;; like "login", shall not be changed except adding or deleting secret
+;; items.
+;;
+;;   (secrets-delete-collection "my collection")
+;;   (secrets-create-collection "my collection")
+
+;; There exists a special collection called "session", which has the
+;; lifetime of the corrresponding client session (aka Emacs'
+;; lifetime).  It is created automatically when Emacs uses the Secret
+;; Service interface, and it is deleted when Emacs is killed.
+;; Therefore, it can be used to store and retrieve secret items
+;; temporarily.  This shall be preferred over creation of a persistent
+;; collection, when the information shall not live longer than Emacs.
+;; The session collection can be addressed either by the string
+;; "session", or by `nil', whenever a collection parameter is needed.
+
+;; As already said, a collection is a group of secret items.  A secret
+;; item has a label, the "secret" (which is a string), and a set of
+;; lookup attributes.  The attributes can be used to search and
+;; retrieve a secret item at a later date.
+
+;; A list of all available secret items of a collection is available by
+;;
+;;   (secrets-list-items "my collection")
+;;    => ("this item" "another item")
+
+;; Secret items can be added or deleted to a collection.  In the
+;; following examples, we use the special collection "session", which
+;; is bound to Emacs' lifetime.
+;;
+;;   (secrets-delete-item "session" "my item")
+;;   (secrets-create-item "session" "my item" "geheim"
+;;                        :user "joe" :host "remote-host")
+
+;; The string "geheim" is the secret of the secret item "my item".
+;; The secret string can be retrieved from items:
+;;
+;;   (secrets-get-secret "session" "my item")
+;;    => "geheim"
+
+;; The lookup attributes, which are specified during creation of a
+;; secret item, must be a key-value pair.  Keys are keyword symbols,
+;; starting with a colon; values are strings.  They can be retrieved
+;; from a given secret item:
+;;
+;;   (secrets-get-attribute "session" "my item" :host)
+;;    => "remote-host"
+;;
+;;   (secrets-get-attributes "session" "my item")
+;;    => ((:user . "joe") (:host ."remote-host"))
+
+;; The lookup attributes can be used for searching of items.  If you,
+;; for example, are looking for all secret items for the user "joe",
+;; you would perform
+;;
+;;   (secrets-search-items "session" :user "joe")
+;;    => ("my item" "another item")
+
+;;; Code:
+
+;; It has been tested with GNOME Keyring 2.29.92.  An implementation
+;; for KWallet will be available at
+;; svn://anonsvn.kde.org/home/kde/trunk/playground/base/ksecretservice;
+;; not tested yet.
+
+;; Pacify byte-compiler.  D-Bus support in the Emacs core can be
+;; disabled with configuration option "--without-dbus".  Declare used
+;; subroutines and variables of `dbus' therefore.
+(eval-when-compile
+  (require 'cl))
+
+(declare-function dbus-call-method "dbusbind.c")
+(declare-function dbus-register-signal "dbusbind.c")
+(defvar dbus-debug)
+
+(require 'dbus)
+
+(defvar secrets-enabled nil
+  "Whether there is a daemon offering the Secret Service API.")
+
+(defvar secrets-debug t
+  "Write debug messages")
+
+(defconst secrets-service "org.freedesktop.secrets"
+  "The D-Bus name used to talk to Secret Service.")
+
+(defconst secrets-path "/org/freedesktop/secrets"
+  "The D-Bus root object path used to talk to Secret Service.")
+
+(defconst secrets-empty-path "/"
+  "The D-Bus object path representing an empty object.")
+
+(defsubst secrets-empty-path (path)
+  "Check, whether PATH is a valid object path.
+It returns t if not."
+  (or (not (stringp path))
+      (string-equal path secrets-empty-path)))
+
+(defconst secrets-interface-service "org.freedesktop.Secret.Service"
+  "The D-Bus interface managing sessions and collections.")
+
+;; <interface name="org.freedesktop.Secret.Service">
+;;   <property name="Collections" type="ao" access="read"/>
+;;   <method name="OpenSession">
+;;     <arg name="algorithm" type="s" direction="in"/>
+;;     <arg name="input"     type="v" direction="in"/>
+;;     <arg name="output"    type="v" direction="out"/>
+;;     <arg name="result"    type="o" direction="out"/>
+;;   </method>
+;;   <method name="CreateCollection">
+;;     <arg name="props"      type="a{sv}" direction="in"/>
+;;     <arg name="collection" type="o"     direction="out"/>
+;;     <arg name="prompt"     type="o"     direction="out"/>
+;;   </method>
+;;   <method name="SearchItems">
+;;     <arg name="attributes" type="a{ss}" direction="in"/>
+;;     <arg name="unlocked"   type="ao"    direction="out"/>
+;;     <arg name="locked"     type="ao"    direction="out"/>
+;;   </method>
+;;   <method name="Unlock">
+;;     <arg name="objects"  type="ao" direction="in"/>
+;;     <arg name="unlocked" type="ao" direction="out"/>
+;;     <arg name="prompt"   type="o"  direction="out"/>
+;;   </method>
+;;   <method name="Lock">
+;;     <arg name="objects" type="ao" direction="in"/>
+;;     <arg name="locked"  type="ao" direction="out"/>
+;;     <arg name="Prompt"  type="o"  direction="out"/>
+;;   </method>
+;;   <method name="GetSecrets">
+;;     <arg name="items"   type="ao"          direction="in"/>
+;;     <arg name="session" type="o"           direction="in"/>
+;;     <arg name="secrets" type="a{o(oayay)}" direction="out"/>
+;;   </method>
+;;   <method name="ReadAlias">
+;;     <arg name="name"       type="s" direction="in"/>
+;;     <arg name="collection" type="o" direction="out"/>
+;;   </method>
+;;   <method name="SetAlias">
+;;     <arg name="name"       type="s" direction="in"/>
+;;     <arg name="collection" type="o" direction="in"/>
+;;   </method>
+;;   <signal name="CollectionCreated">
+;;     <arg name="collection" type="o"/>
+;;   </signal>
+;;   <signal name="CollectionDeleted">
+;;     <arg name="collection" type="o"/>
+;;   </signal>
+;; </interface>
+
+(defconst secrets-interface-collection "org.freedesktop.Secret.Collection"
+  "A collection of items containing secrets.")
+
+;; <interface name="org.freedesktop.Secret.Collection">
+;;   <property name="Items"    type="ao" access="read"/>
+;;   <property name="Label"    type="s"  access="readwrite"/>
+;;   <property name="Locked"   type="s"  access="read"/>
+;;   <property name="Created"  type="t"  access="read"/>
+;;   <property name="Modified" type="t"  access="read"/>
+;;   <method name="Delete">
+;;     <arg name="prompt" type="o" direction="out"/>
+;;   </method>
+;;   <method name="SearchItems">
+;;     <arg name="attributes" type="a{ss}" direction="in"/>
+;;     <arg name="results"    type="ao"    direction="out"/>
+;;   </method>
+;;   <method name="CreateItem">
+;;     <arg name="props"   type="a{sv}"   direction="in"/>
+;;     <arg name="secret"  type="(oayay)" direction="in"/>
+;;     <arg name="replace" type="b"       direction="in"/>
+;;     <arg name="item"    type="o"       direction="out"/>
+;;     <arg name="prompt"  type="o"       direction="out"/>
+;;   </method>
+;;   <signal name="ItemCreated">
+;;     <arg name="item" type="o"/>
+;;   </signal>
+;;   <signal name="ItemDeleted">
+;;     <arg name="item" type="o"/>
+;;   </signal>
+;;   <signal name="ItemChanged">
+;;     <arg name="item" type="o"/>
+;;   </signal>
+;; </interface>
+
+(defconst secrets-session-collection-path
+  "/org/freedesktop/secrets/collection/session"
+  "The D-Bus temporary session collection object path.")
+
+(defconst secrets-interface-prompt "org.freedesktop.Secret.Prompt"
+  "A session tracks state between the service and a client application.")
+
+;; <interface name="org.freedesktop.Secret.Prompt">
+;;   <method name="Prompt">
+;;     <arg name="window-id" type="s" direction="in"/>
+;;   </method>
+;;   <method name="Dismiss"></method>
+;;   <signal name="Completed">
+;;     <arg name="dismissed" type="b"/>
+;;     <arg name="result"    type="v"/>
+;;   </signal>
+;; </interface>
+
+(defconst secrets-interface-item "org.freedesktop.Secret.Item"
+  "A collection of items containing secrets.")
+
+;; <interface name="org.freedesktop.Secret.Item">
+;;   <property name="Locked"     type="b"     access="read"/>
+;;   <property name="Attributes" type="a{ss}" access="readwrite"/>
+;;   <property name="Label"      type="s"     access="readwrite"/>
+;;   <property name="Created"    type="t"     access="read"/>
+;;   <property name="Modified"   type="t"     access="read"/>
+;;   <method name="Delete">
+;;     <arg name="prompt" type="o" direction="out"/>
+;;   </method>
+;;   <method name="GetSecret">
+;;     <arg name="session" type="o"       direction="in"/>
+;;     <arg name="secret"  type="(oayay)" direction="out"/>
+;;   </method>
+;;   <method name="SetSecret">
+;;     <arg name="secret" type="(oayay)" direction="in"/>
+;;   </method>
+;; </interface>
+;;
+;; STRUCT      secret
+;;   OBJECT PATH  session
+;;   ARRAY BYTE          parameters
+;;   ARRAY BYTE          value
+
+(defconst secrets-interface-item-type-generic "org.freedesktop.Secret.Generic"
+  "The default item type we are using.")
+
+(defconst secrets-interface-session "org.freedesktop.Secret.Session"
+  "A session tracks state between the service and a client application.")
+
+;; <interface name="org.freedesktop.Secret.Session">
+;;   <method name="Close"></method>
+;; </interface>
+
+;;; Sessions.
+
+(defvar secrets-session-path secrets-empty-path
+  "The D-Bus session path of the active session.
+A session path `secrets-empty-path' indicates there is no open session.")
+
+(defun secrets-close-session ()
+  "Close the secret service session, if any."
+  (dbus-ignore-errors
+    (dbus-call-method
+     :session secrets-service secrets-session-path
+     secrets-interface-session "Close"))
+  (setq secrets-session-path secrets-empty-path))
+
+(defun secrets-open-session (&optional reopen)
+  "Open a new session with \"plain\" algorithm.
+If there exists another active session, and REOPEN is nil, that
+session will be used.  The object path of the session will be
+returned, and it will be stored in `secrets-session-path'."
+  (when reopen (secrets-close-session))
+  (when (secrets-empty-path secrets-session-path)
+    (setq secrets-session-path
+         (cadr
+          (dbus-call-method
+           :session secrets-service secrets-path
+           secrets-interface-service "OpenSession" "plain" '(:variant "")))))
+  (when secrets-debug
+    (message "Secret Service session: %s" secrets-session-path))
+  secrets-session-path)
+
+;;; Prompts.
+
+(defvar secrets-prompt-signal nil
+  "Internal variable to catch signals from `secrets-interface-prompt'.")
+
+(defun secrets-prompt (prompt)
+  "Handle the prompt identified by object path PROMPT."
+  (unless (secrets-empty-path prompt)
+    (let ((object
+          (dbus-register-signal
+           :session secrets-service prompt
+           secrets-interface-prompt "Completed" 'secrets-prompt-handler)))
+      (dbus-call-method
+       :session secrets-service prompt
+       secrets-interface-prompt "Prompt" (frame-parameter nil 'window-id))
+      (unwind-protect
+         (progn
+           ;; Wait until the returned prompt signal has put the
+           ;; result into `secrets-prompt-signal'.
+           (while (null secrets-prompt-signal)
+             (read-event nil nil 0.1))
+           ;; Return the object(s).  It is a variant, so we must use a car.
+           (car secrets-prompt-signal))
+       ;; Cleanup.
+       (setq secrets-prompt-signal nil)
+       (dbus-unregister-object object)))))
+
+(defun secrets-prompt-handler (&rest args)
+  "Handler for signals emitted by `secrets-interface-prompt'."
+  ;; An empty object path is always identified as `secrets-empty-path'
+  ;; or `nil'.  Either we set it explicitely, or it is returned by the
+  ;; "Completed" signal.
+  (if (car args) ;; dismissed
+      (setq secrets-prompt-signal (list secrets-empty-path))
+    (setq secrets-prompt-signal (cadr args))))
+
+;;; Collections.
+
+(defvar secrets-collection-paths nil
+  "Cached D-Bus object paths of available collections.")
+
+(defun secrets-collection-handler (&rest args)
+  "Handler for signals emitted by `secrets-interface-service'."
+  (cond
+   ((string-equal (dbus-event-member-name last-input-event) "CollectionCreated")
+    (add-to-list 'secrets-collection-paths (car args)))
+   ((string-equal (dbus-event-member-name last-input-event) "CollectionDeleted")
+    (setq secrets-collection-paths
+         (delete (car args) secrets-collection-paths)))))
+
+(defun secrets-get-collections ()
+  "Return the object paths of all available collections."
+  (setq secrets-collection-paths
+       (or secrets-collection-paths
+           (dbus-get-property
+            :session secrets-service secrets-path
+            secrets-interface-service "Collections"))))
+
+(defun secrets-get-collection-properties (collection-path)
+  "Return all properties of collection identified by COLLECTION-PATH."
+  (unless (secrets-empty-path collection-path)
+    (dbus-get-all-properties
+     :session secrets-service collection-path
+     secrets-interface-collection)))
+
+(defun secrets-get-collection-property (collection-path property)
+  "Return property PROPERTY of collection identified by COLLECTION-PATH."
+  (unless (or (secrets-empty-path collection-path) (not (stringp property)))
+    (dbus-get-property
+     :session secrets-service collection-path
+     secrets-interface-collection property)))
+
+(defun secrets-list-collections ()
+  "Return a list of collection names."
+  (mapcar
+   (lambda (collection-path)
+     (if (string-equal collection-path secrets-session-collection-path)
+        "session"
+       (secrets-get-collection-property collection-path "Label")))
+   (secrets-get-collections)))
+
+(defun secrets-collection-path (collection)
+  "Return the object path of collection labelled COLLECTION.
+If COLLECTION is nil, return the session collection path.
+If there is no such COLLECTION, return nil."
+  (or
+   ;; The "session" collection.
+   (if (or (null collection) (string-equal "session" collection))
+       secrets-session-collection-path)
+   ;; Check for an alias.
+   (let ((collection-path
+         (dbus-call-method
+          :session secrets-service secrets-path
+          secrets-interface-service "ReadAlias" collection)))
+     (unless (secrets-empty-path collection-path)
+       collection-path))
+   ;; Check the collections.
+   (catch 'collection-found
+     (dolist (collection-path (secrets-get-collections) nil)
+       (when
+          (string-equal
+           collection
+           (secrets-get-collection-property collection-path "Label"))
+        (throw 'collection-found collection-path))))))
+
+(defun secrets-create-collection (collection)
+  "Create collection labelled COLLECTION if it doesn't exist.
+Return the D-Bus object path for collection."
+  (let ((collection-path (secrets-collection-path collection)))
+    ;; Create the collection.
+    (when (secrets-empty-path collection-path)
+      (setq collection-path
+           (secrets-prompt
+            (cadr
+             ;; "CreateCollection" returns the prompt path as second arg.
+             (dbus-call-method
+              :session secrets-service secrets-path
+              secrets-interface-service "CreateCollection"
+              `(:array (:dict-entry "Label" (:variant ,collection))))))))
+    ;; Return object path of the collection.
+    collection-path))
+
+(defun secrets-get-alias (alias)
+  "Return the collection name ALIAS is referencing to.
+For the time being, only the alias \"default\" is supported."
+  (secrets-get-collection-property
+   (dbus-call-method
+    :session secrets-service secrets-path
+    secrets-interface-service "ReadAlias" alias)
+   "Label"))
+
+(defun secrets-set-alias (collection alias)
+  "Set ALIAS as alias of collection labelled COLLECTION.
+For the time being, only the alias \"default\" is supported."
+  (let ((collection-path (secrets-collection-path collection)))
+    (unless (secrets-empty-path collection-path)
+      (dbus-call-method
+       :session secrets-service secrets-path
+       secrets-interface-service "SetAlias"
+       alias :object-path collection-path))))
+
+(defun secrets-unlock-collection (collection)
+  "Unlock collection labelled COLLECTION.
+If successful, return the object path of the collection."
+  (let ((collection-path (secrets-collection-path collection)))
+    (unless (secrets-empty-path collection-path)
+      (secrets-prompt
+       (cadr
+       (dbus-call-method
+        :session secrets-service secrets-path secrets-interface-service
+        "Unlock" `(:array :object-path ,collection-path)))))
+    collection-path))
+
+(defun secrets-delete-collection (collection)
+  "Delete collection labelled COLLECTION."
+  (let ((collection-path (secrets-collection-path collection)))
+    (unless (secrets-empty-path collection-path)
+      (secrets-prompt
+       (dbus-call-method
+       :session secrets-service collection-path
+       secrets-interface-collection "Delete")))))
+
+;;; Items.
+
+(defun secrets-get-items (collection-path)
+  "Return the object paths of all available items in COLLECTION-PATH."
+  (unless (secrets-empty-path collection-path)
+    (secrets-open-session)
+    (dbus-get-property
+     :session secrets-service collection-path
+     secrets-interface-collection "Items")))
+
+(defun secrets-get-item-properties (item-path)
+  "Return all properties of item identified by ITEM-PATH."
+  (unless (secrets-empty-path item-path)
+    (dbus-get-all-properties
+     :session secrets-service item-path
+     secrets-interface-item)))
+
+(defun secrets-get-item-property (item-path property)
+  "Return property PROPERTY of item identified by ITEM-PATH."
+  (unless (or (secrets-empty-path item-path) (not (stringp property)))
+    (dbus-get-property
+     :session secrets-service item-path
+     secrets-interface-item property)))
+
+(defun secrets-list-items (collection)
+  "Return a list of all item labels of COLLECTION."
+  (let ((collection-path (secrets-unlock-collection collection)))
+    (unless (secrets-empty-path collection-path)
+      (mapcar
+       (lambda (item-path)
+        (secrets-get-item-property item-path "Label"))
+       (secrets-get-items collection-path)))))
+
+(defun secrets-search-items (collection &rest attributes)
+  "Search items in COLLECTION with ATTRIBUTES.
+ATTRIBUTES are key-value pairs.  The keys are keyword symbols,
+starting with a colon.  Example:
+
+  \(secrets-create-item \"Tramp collection\" \"item\" \"geheim\"
+   :method \"sudo\" :user \"joe\" :host \"remote-host\"\)
+
+The object paths of the found items are returned as list."
+  (let ((collection-path (secrets-unlock-collection collection))
+       result props)
+    (unless (secrets-empty-path collection-path)
+      ;; Create attributes list.
+      (while (consp (cdr attributes))
+       (unless (keywordp (car attributes))
+         (error 'wrong-type-argument (car attributes)))
+       (setq props (add-to-list
+                    'props
+                    (list :dict-entry
+                          (symbol-name (car attributes))
+                          (cadr attributes))
+                    'append)
+             attributes (cddr attributes)))
+      ;; Search.  The result is a list of two lists, the object paths
+      ;; of the unlocked and the locked items.
+      (setq result
+           (dbus-call-method
+            :session secrets-service collection-path
+            secrets-interface-collection "SearchItems"
+            (if props
+                (cons :array props)
+              '(:array :signature "{ss}"))))
+      ;; Return the found items.
+      (mapcar
+       (lambda (item-path) (secrets-get-item-property item-path "Label"))
+       (append (car result) (cadr result))))))
+
+(defun secrets-create-item (collection item password &rest attributes)
+  "Create a new item in COLLECTION with label ITEM and password PASSWORD.
+ATTRIBUTES are key-value pairs set for the created item.  The
+keys are keyword symbols, starting with a colon.  Example:
+
+  \(secrets-create-item \"Tramp collection\" \"item\" \"geheim\"
+   :method \"sudo\" :user \"joe\" :host \"remote-host\"\)
+
+The object path of the created item is returned."
+  (unless (member item (secrets-list-items collection))
+    (let ((collection-path (secrets-unlock-collection collection))
+         result props)
+      (unless (secrets-empty-path collection-path)
+       ;; Create attributes list.
+       (while (consp (cdr attributes))
+         (unless (keywordp (car attributes))
+           (error 'wrong-type-argument (car attributes)))
+         (setq props (add-to-list
+                      'props
+                      (list :dict-entry
+                            (symbol-name (car attributes))
+                            (cadr attributes))
+                      'append)
+               attributes (cddr attributes)))
+       ;; Create the item.
+       (setq result
+             (dbus-call-method
+              :session secrets-service collection-path
+              secrets-interface-collection "CreateItem"
+              ;; Properties.
+              (append
+               `(:array
+                 (:dict-entry "Label" (:variant ,item))
+                 (:dict-entry
+                  "Type" (:variant ,secrets-interface-item-type-generic)))
+               (when props
+                 `((:dict-entry
+                    "Attributes" (:variant ,(append '(:array) props))))))
+              ;; Secret.
+              `(:struct :object-path ,secrets-session-path
+                        (:array :signature "y") ;; no parameters.
+                        ,(dbus-string-to-byte-array password))
+              ;; Do not replace. Replace does not seem to work.
+              nil))
+       (secrets-prompt (cadr result))
+       ;; Return the object path.
+       (car result)))))
+
+(defun secrets-item-path (collection item)
+  "Return the object path of item labelled ITEM in COLLECTION.
+If there is no such item, return nil."
+  (let ((collection-path (secrets-unlock-collection collection)))
+    (catch 'item-found
+      (dolist (item-path (secrets-get-items collection-path))
+       (when (string-equal item (secrets-get-item-property item-path "Label"))
+         (throw 'item-found item-path))))))
+
+(defun secrets-get-secret (collection item)
+  "Return the secret of item labelled ITEM in COLLECTION.
+If there is no such item, return nil."
+  (let ((item-path (secrets-item-path collection item)))
+    (unless (secrets-empty-path item-path)
+      (dbus-byte-array-to-string
+       (caddr
+       (dbus-call-method
+        :session secrets-service item-path secrets-interface-item
+        "GetSecret" :object-path secrets-session-path))))))
+
+(defun secrets-get-attributes (collection item)
+  "Return the lookup attributes of item labelled ITEM in COLLECTION.
+If there is no such item, or the item has no attributes, return nil."
+  (unless (stringp collection) (setq collection "default"))
+  (let ((item-path (secrets-item-path collection item)))
+    (unless (secrets-empty-path item-path)
+      (mapcar
+       (lambda (attribute) (cons (intern (car attribute)) (cadr attribute)))
+       (dbus-get-property
+       :session secrets-service item-path
+       secrets-interface-item "Attributes")))))
+
+(defun secrets-get-attribute (collection item attribute)
+  "Return the value of ATTRIBUTE of item labelled ITEM in COLLECTION.
+If there is no such item, or the item doesn't own this attribute, return nil."
+  (cdr (assoc attribute (secrets-get-attributes collection item))))
+
+(defun secrets-delete-item (collection item)
+  "Delete ITEM in COLLECTION."
+  (let ((item-path (secrets-item-path collection item)))
+    (unless (secrets-empty-path item-path)
+      (secrets-prompt
+       (dbus-call-method
+       :session secrets-service item-path
+       secrets-interface-item "Delete")))))
+
+(when (dbus-ping :session secrets-service 100)
+
+  ;; We must reset all variables, when there is a new instance of the
+  ;; "org.freedesktop.secrets" service.
+  (dbus-register-signal
+   :session dbus-service-dbus dbus-path-dbus
+   dbus-interface-dbus "NameOwnerChanged"
+   (lambda (&rest args)
+     (when secrets-debug (message "Secret Service has changed: %S" args))
+     (setq secrets-session-path secrets-empty-path
+          secrets-prompt-signal nil
+          secrets-collection-paths nil))
+   secrets-service)
+
+  ;; We want to refresh our cache, when there is a change in
+  ;; collections.
+  (dbus-register-signal
+   :session secrets-service secrets-path
+   secrets-interface-service "CollectionCreated"
+   'secrets-collection-handler)
+
+  (dbus-register-signal
+   :session secrets-service secrets-path
+   secrets-interface-service "CollectionDeleted"
+   'secrets-collection-handler)
+
+  ;; We shall inform, whether the secret service is enabled on this
+  ;; machine.
+  (setq secrets-enabled t))
+
+(provide 'secrets)
+
+;;; TODO:
+
+;; * secrets-debug should be structured like auth-source-debug to
+;;   prevent leaking sensitive information.  Right now I don't see
+;;   anything sensitive though.
+;; * Check, whether the dh-ietf1024-aes128-cbc-pkcs7 algorithm can be
+;;   used for the transfer of the secrets.  Currently, we use the
+;;   plain algorithm.
index d36569b5c23400bbccd6d14ea182f099d0fd9ab7..92dbb4fef3a625317e7fc2d070ab18401f1ee64f 100644 (file)
@@ -168,7 +168,7 @@ Operations not mentioned here will be handled by the default Emacs primitives.")
 (defgroup tramp-imap nil
   "Tramp over IMAP configuration."
   :version "23.2"
-  :group 'applications)
+  :group 'tramp)
 
 (defcustom tramp-imap-subject-marker "tramp-imap-subject-marker"
   "The subject marker that Tramp-IMAP will use."
index a0fe20c2a99cd513c82385c79cd46bf8408c57bf..b025493b1a4d5bd850c5e5a50d2fa46bfbfc8195 100644 (file)
 (defgroup tramp nil
   "Edit remote files with a combination of rsh and rcp or similar programs."
   :group 'files
+  :group 'comm
   :version "22.1")
 
 ;; Maybe we need once a real Tramp mode, with key bindings etc.
index 35df085bc570d8f19999fb0b60b61bef4d7af9a9..03c188006d07127eb97b17e4ce60d6119ec7c7ad 100644 (file)
 (defgroup xesam nil
   "Xesam compatible interface to search engines."
   :group 'extensions
-  :group 'hypermedia
+  :group 'comm
   :version "23.1")
 
 (defcustom xesam-query-type 'user-query
index 8919d920c9da729937ce48c3d1a2a143c21d0f65..5eb9840a4ca2b6a480457e617c7738b1d1d1bb0a 100644 (file)
@@ -45,8 +45,7 @@
 
 (defgroup nxml nil
   "New XML editing mode."
-  :group 'languages
-  :group 'wp)
+  :group 'languages)
 
 (defgroup nxml-faces nil
   "Faces for XML syntax highlighting."
similarity index 99%
rename from lisp/s-region.el
rename to lisp/obsolete/s-region.el
index 3bef30c2fe598eb8a0bf54d10be71088cda2ac5b..a88d1f37ee7e92b57d53fda1a6ed7f07f499ea53 100644 (file)
@@ -6,6 +6,7 @@
 ;; Author: Morten Welinder <terra@diku.dk>
 ;; Keywords: terminals
 ;; Favourite-brand-of-beer: None, I hate beer.
+;; Obsolete-since: 24.1
 
 ;; This file is part of GNU Emacs.
 
index 7ce303b5add00f2f686ef6cd7e4ba250806c758b..b70fb150735f11498468e3b9e61fb1ad64dd46d9 100644 (file)
@@ -1,3 +1,11 @@
+2010-03-12  Chong Yidong  <cyd@stupidchicken.com>
+
+       * org.el (org): Remove from hypermedia group.
+
+2010-03-10  Chong Yidong  <cyd@stupidchicken.com>
+
+       * Branch for 23.2.
+
 2010-02-15  Chong Yidong  <cyd@stupidchicken.com>
 
        * org-freemind.el (org-freemind-from-org-mode-node)
index a404551f3cb8e0c276ffc5988691bc82b64992ad..54025f4d83ca416328c6debff4efabb590e4c661 100644 (file)
@@ -134,7 +134,6 @@ With prefix arg HERE, insert it at point."
   "Outline-based notes management and organizer."
   :tag "Org"
   :group 'outlines
-  :group 'hypermedia
   :group 'calendar)
 
 (defcustom org-mode-hook nil
index b5d3d7987144475350581d8f58a67f7e80a0e6be..ed7d5f33a35c8311217bbd7b5c6f95e86dbc4374 100644 (file)
@@ -41,7 +41,7 @@
 (defgroup outlines nil
   "Support for hierarchical outlining."
   :prefix "outline-"
-  :group 'editing)
+  :group 'wp)
 
 (defcustom outline-regexp "[*\^L]+"
   "Regular expression to match the beginning of a heading.
@@ -915,7 +915,11 @@ Show the heading too, if it is currently invisible."
        (lambda ()
         (if (<= (funcall outline-level) levels)
             (outline-show-heading)))
-       beg end)))
+       beg end)
+      ;; Finally unhide any trailing newline.
+      (goto-char (point-max))
+      (if (and (bolp) (not (bobp)) (outline-invisible-p (1- (point))))
+          (outline-flag-region (1- (point)) (point) nil))))
   (run-hooks 'outline-view-change-hook))
 
 (defun hide-other ()
index 301201ea0ebe8a5450831016b99f2072f82f6b8c..126205a532fe0c84343b60686ccfd0b6bef93480 100644 (file)
@@ -1,7 +1,7 @@
 ;;; password-cache.el --- Read passwords, possibly using a password cache.
 
-;; Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
-;;   Free Software Foundation, Inc.
+;; Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
+;;   2010  Free Software Foundation, Inc.
 
 ;; Author: Simon Josefsson <simon@josefsson.org>
 ;; Created: 2003-12-21
 
 ;;; Code:
 
+;; Options are autoloaded since they are used by eg mml-sec.el.
+
+;;;###autoload
 (defcustom password-cache t
   "Whether to cache passwords."
   :group 'password
   :type 'boolean)
 
+;;;###autoload
 (defcustom password-cache-expiry 16
   "How many seconds passwords are cached, or nil to disable expiring.
 Whether passwords are cached at all is controlled by `password-cache'."
index 7e013b87c197f1e4429c785be2a648fb590c5071..51e42809153ea7f0564d23491be4c08a32f64bd5 100644 (file)
@@ -733,6 +733,9 @@ Faces `compilation-error-face', `compilation-warning-face',
   "If non-nil, automatically jump to the next error encountered.")
 (make-variable-buffer-local 'compilation-auto-jump-to-next)
 
+(defvar buffer-modtime nil
+  "The buffer modification time, for buffers not associated with files.")
+(make-variable-buffer-local 'buffer-modtime)
 
 (defvar compilation-skip-to-next-location t
   "*If non-nil, skip multiple error messages for the same source location.")
@@ -1217,7 +1220,8 @@ Returns the compilation buffer created."
        ;; Then evaluate a cd command if any, but don't perform it yet, else
        ;; start-command would do it again through the shell: (cd "..") AND
        ;; sh -c "cd ..; make"
-       (cd (if (string-match "^\\s *cd\\(?:\\s +\\(\\S +?\\)\\)?\\s *[;&\n]" command)
+       (cd (if (string-match "\\`\\s *cd\\(?:\\s +\\(\\S +?\\)\\)?\\s *[;&\n]"
+                             command)
                (if (match-end 1)
                    (substitute-env-vars (match-string 1 command))
                  "~")
@@ -1566,6 +1570,7 @@ Runs `compilation-mode-hook' with `run-mode-hooks' (which see).
        mode-name (or name-of-mode "Compilation"))
   (set (make-local-variable 'page-delimiter)
        compilation-page-delimiter)
+  (set (make-local-variable 'buffer-modtime) nil)
   (compilation-setup)
   (setq buffer-read-only t)
   (run-mode-hooks 'compilation-mode-hook))
@@ -1781,6 +1786,7 @@ and runs `compilation-filter-hook'."
               (unless comint-inhibit-carriage-motion
                 (comint-carriage-motion (process-mark proc) (point)))
               (set-marker (process-mark proc) (point))
+              (set (make-local-variable 'buffer-modtime) (current-time))
               (run-hooks 'compilation-filter-hook))
          (goto-char pos)
           (narrow-to-region min max)
@@ -1954,9 +1960,7 @@ This is the value of `next-error-function' in Compilation buffers."
                  ;; There may be no timestamp info if the loc is a `fake-loc',
                  ;; but we just checked that the file has been visited before!
                  (equal (nth 4 loc)
-                        (setq timestamp
-                              (with-current-buffer (marker-buffer (nth 3 loc))
-                                (visited-file-modtime)))))
+                        (setq timestamp buffer-modtime)))
       (with-current-buffer (compilation-find-file marker (caar (nth 2 loc))
                                                  (cadr (car (nth 2 loc))))
        (save-restriction
diff --git a/lisp/progmodes/gdb-mi.el b/lisp/progmodes/gdb-mi.el
new file mode 100644 (file)
index 0000000..e4cc32b
--- /dev/null
@@ -0,0 +1,4192 @@
+;;; gdb-mi.el --- User Interface for running GDB
+
+;; Copyright (C) 2007, 2008, 2009, 2010  Free Software Foundation, Inc.
+
+;; Author: Nick Roberts <nickrob@gnu.org>
+;; Maintainer: FSF
+;; Keywords: unix, tools
+
+;; This file is part of GNU Emacs.
+
+;; Homepage: http://www.emacswiki.org/emacs/GDB-MI
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Credits:
+
+;; This file was written by by Nick Roberts following the general design
+;; used in gdb-ui.el for Emacs 22.1 - 23.1.  It is currently being developed
+;; by Dmitry Dzhus <dima@sphinx.net.ru> as part of the Google Summer
+;; of Code 2009 Project "Emacs GDB/MI migration".
+
+;;; Commentary:
+
+;; This mode acts as a graphical user interface to GDB.  You can interact with
+;; GDB through the GUD buffer in the usual way, but there are also further
+;; buffers which control the execution and describe the state of your program.
+;; It separates the input/output of your program from that of GDB and displays
+;; expressions and their current values in their own buffers.  It also uses
+;; features of Emacs 21 such as the fringe/display margin for breakpoints, and
+;; the toolbar (see the GDB Graphical Interface section in the Emacs info
+;; manual).
+
+;; M-x gdb will start the debugger.
+
+;; This file uses GDB/MI as the primary interface to GDB.  It is still under
+;; development and is part of a process to migrate Emacs from annotations (as
+;; used in gdb-ui.el) to GDB/MI.  It runs gdb with GDB/MI (-interp=mi) and
+;; access CLI using "-interpreter-exec console cli-command".  This code works
+;; without gdb-ui.el and uses MI tokens instead of queues. Eventually MI
+;; should be asynchronous.
+
+;; This mode will PARTLY WORK WITH RECENT GDB RELEASES (status in modeline
+;; doesn't update properly when execution commands are issued from GUD buffer)
+;; and WORKS BEST when GDB runs asynchronously: maint set linux-async on.
+;;
+;; You need development version of GDB 7.0 for the thread buffer to work.
+
+;; This file replaces gdb-ui.el and is for development with GDB.  Use the
+;; release branch of Emacs 22 for the latest version of gdb-ui.el.
+
+;; Windows Platforms:
+
+;; If you are using Emacs and GDB on Windows you will need to flush the buffer
+;; explicitly in your program if you want timely display of I/O in Emacs.
+;; Alternatively you can make the output stream unbuffered, for example, by
+;; using a macro:
+
+;;           #ifdef UNBUFFERED
+;;          setvbuf (stdout, (char *) NULL, _IONBF, 0);
+;;          #endif
+
+;; and compiling with -DUNBUFFERED while debugging.
+
+;; If you are using Cygwin GDB and find that the source is not being displayed
+;; in Emacs when you step through it, possible solutions are to:
+
+;;   1) Use Cygwin X Windows and Cygwin Emacs.
+;;        (Since 22.1 Emacs builds under Cygwin.)
+;;   2) Use MinGW GDB instead.
+;;   3) Use cygwin-mount.el
+
+;;; Mac OSX:
+
+;; GDB in Emacs on Mac OSX works best with FSF GDB as Apple have made
+;; some changes to the version that they include as part of Mac OSX.
+;; This requires GDB version 7.0 or later (estimated release date Aug 2009)
+;; as earlier versions don not compile on Mac OSX.
+
+;;; Known Bugs:
+
+;; 1) Stack buffer doesn't parse MI output if you stop in a routine without
+;;    line information, e.g., a routine in libc (just a TODO item).
+
+;; TODO:
+;; 2) Watch windows to work with threads.
+;; 3) Use treebuffer.el instead of the speedbar for watch-expressions?
+;; 4) Mark breakpoint locations on scroll-bar of source buffer?
+
+;;; Code:
+
+(require 'gud)
+(require 'json)
+(require 'bindat)
+(eval-when-compile (require 'cl))
+
+(defvar tool-bar-map)
+(defvar speedbar-initial-expansion-list-name)
+(defvar speedbar-frame)
+
+(defvar        gdb-memory-address "main")
+(defvar        gdb-memory-last-address nil
+  "Last successfully accessed memory address.")
+(defvar        gdb-memory-next-page nil
+  "Address of next memory page for program memory buffer.")
+(defvar        gdb-memory-prev-page nil
+  "Address of previous memory page for program memory buffer.")
+
+(defvar gdb-thread-number nil
+  "Main current thread.
+
+Invalidation triggers use this variable to query GDB for
+information on the specified thread by wrapping GDB/MI commands
+in `gdb-current-context-command'.
+
+This variable may be updated implicitly by GDB via `gdb-stopped'
+or explicitly by `gdb-select-thread'.
+
+Only `gdb-setq-thread-number' should be used to change this
+value.")
+
+(defvar gdb-frame-number nil
+  "Selected frame level for main current thread.
+
+Updated according to the following rules:
+
+When a thread is selected or current thread stops, set to \"0\".
+
+When current thread goes running (and possibly exits eventually),
+set to nil.
+
+May be manually changed by user with `gdb-select-frame'.")
+
+(defvar gdb-frame-address nil "Identity of frame for watch expression.")
+
+;; Used to show overlay arrow in source buffer. All set in
+;; gdb-get-main-selected-frame. Disassembly buffer should not use
+;; these but rely on buffer-local thread information instead.
+(defvar gdb-selected-frame nil
+  "Name of selected function for main current thread.")
+(defvar gdb-selected-file nil
+  "Name of selected file for main current thread.")
+(defvar gdb-selected-line nil
+  "Number of selected line for main current thread.")
+
+(defvar gdb-threads-list nil
+  "Associative list of threads provided by \"-thread-info\" MI command.
+
+Keys are thread numbers (in strings) and values are structures as
+returned from -thread-info by `gdb-json-partial-output'. Updated in
+`gdb-thread-list-handler-custom'.")
+
+(defvar gdb-running-threads-count nil
+  "Number of currently running threads.
+
+Nil means that no information is available.
+
+Updated in `gdb-thread-list-handler-custom'.")
+
+(defvar gdb-stopped-threads-count nil
+  "Number of currently stopped threads.
+
+See also `gdb-running-threads-count'.")
+
+(defvar gdb-breakpoints-list nil
+  "Associative list of breakpoints provided by \"-break-list\" MI command.
+
+Keys are breakpoint numbers (in string) and values are structures
+as returned from \"-break-list\" by `gdb-json-partial-output'
+\(\"body\" field is used). Updated in
+`gdb-breakpoints-list-handler-custom'.")
+
+(defvar gdb-current-language nil)
+(defvar gdb-var-list nil
+  "List of variables in watch window.
+Each element has the form (VARNUM EXPRESSION NUMCHILD TYPE VALUE STATUS HAS_MORE FP)
+where STATUS is nil (`unchanged'), `changed' or `out-of-scope', FP the frame
+address for root variables.")
+(defvar gdb-main-file nil "Source file from which program execution begins.")
+
+;; Overlay arrow markers
+(defvar gdb-stack-position nil)
+(defvar gdb-thread-position nil)
+(defvar gdb-disassembly-position nil)
+
+(defvar gdb-location-alist nil
+  "Alist of breakpoint numbers and full filenames.  Only used for files that
+Emacs can't find.")
+(defvar gdb-active-process nil
+  "GUD tooltips display variable values when t, and macro definitions otherwise.")
+(defvar gdb-error "Non-nil when GDB is reporting an error.")
+(defvar gdb-macro-info nil
+  "Non-nil if GDB knows that the inferior includes preprocessor macro info.")
+(defvar gdb-register-names nil "List of register names.")
+(defvar gdb-changed-registers nil
+  "List of changed register numbers (strings).")
+(defvar gdb-buffer-fringe-width nil)
+(defvar gdb-last-command nil)
+(defvar gdb-prompt-name nil)
+(defvar gdb-token-number 0)
+(defvar gdb-handler-alist '())
+(defvar gdb-handler-number nil)
+(defvar gdb-source-file-list nil
+  "List of source files for the current executable.")
+(defvar gdb-first-done-or-error t)
+(defvar gdb-source-window nil)
+(defvar gdb-inferior-status nil)
+(defvar gdb-continuation nil)
+(defvar gdb-version nil)
+(defvar gdb-filter-output nil
+  "Message to be shown in GUD console.
+
+This variable is updated in `gdb-done-or-error' and returned by
+`gud-gdbmi-marker-filter'.")
+
+(defvar gdb-non-stop nil
+  "Indicates whether current GDB session is using non-stop mode.
+
+It is initialized to `gdb-non-stop-setting' at the beginning of
+every GDB session.")
+
+(defvar gdb-buffer-type nil
+  "One of the symbols bound in `gdb-buffer-rules'.")
+(make-variable-buffer-local 'gdb-buffer-type)
+
+(defvar gdb-output-sink 'nil
+  "The disposition of the output of the current gdb command.
+Possible values are these symbols:
+
+    `user' -- gdb output should be copied to the GUD buffer
+              for the user to see.
+
+    `emacs' -- output should be collected in the partial-output-buffer
+              for subsequent processing by a command.  This is the
+              disposition of output generated by commands that
+              gdb mode sends to gdb on its own behalf.")
+
+;; Pending triggers prevent congestion: Emacs won't send two similar
+;; consecutive requests.
+
+(defvar gdb-pending-triggers '()
+  "A list of trigger functions which have not yet been handled.
+
+Elements are either function names or pairs (buffer . function)")
+
+(defmacro gdb-add-pending (item)
+  `(push ,item gdb-pending-triggers))
+(defmacro gdb-pending-p (item)
+  `(member ,item gdb-pending-triggers))
+(defmacro gdb-delete-pending (item)
+  `(setq gdb-pending-triggers
+         (delete ,item gdb-pending-triggers)))
+
+(defmacro gdb-wait-for-pending (&rest body)
+  "Wait until `gdb-pending-triggers' is empty and evaluate FORM.
+
+This function checks `gdb-pending-triggers' value every
+`gdb-wait-for-pending' seconds."
+  (run-with-timer
+   0.5 nil
+   `(lambda ()
+      (if (not gdb-pending-triggers)
+          (progn ,@body)
+        (gdb-wait-for-pending ,@body)))))
+
+;; Publish-subscribe
+
+(defmacro gdb-add-subscriber (publisher subscriber)
+  "Register new PUBLISHER's SUBSCRIBER.
+
+SUBSCRIBER must be a pair, where cdr is a function of one
+argument (see `gdb-emit-signal')."
+  `(add-to-list ',publisher ,subscriber t))
+
+(defmacro gdb-delete-subscriber (publisher subscriber)
+  "Unregister SUBSCRIBER from PUBLISHER."
+  `(setq ,publisher (delete ,subscriber
+                            ,publisher)))
+
+(defun gdb-get-subscribers (publisher)
+  publisher)
+
+(defun gdb-emit-signal (publisher &optional signal)
+  "Call cdr for each subscriber of PUBLISHER with SIGNAL as argument."
+  (dolist (subscriber (gdb-get-subscribers publisher))
+    (funcall (cdr subscriber) signal)))
+
+(defvar gdb-buf-publisher '()
+  "Used to invalidate GDB buffers by emitting a signal in
+`gdb-update'.
+
+Must be a list of pairs with cars being buffers and cdr's being
+valid signal handlers.")
+
+(defgroup gdb nil
+  "GDB graphical interface"
+  :group 'tools
+  :link '(info-link "(emacs)GDB Graphical Interface")
+  :version "23.2")
+
+(defgroup gdb-non-stop nil
+  "GDB non-stop debugging settings"
+  :group 'gdb
+  :version "23.2")
+
+(defgroup gdb-buffers nil
+  "GDB buffers"
+  :group 'gdb
+  :version "23.2")
+
+(defcustom gdb-debug-log-max 128
+  "Maximum size of `gdb-debug-log'.  If nil, size is unlimited."
+  :group 'gdb
+  :type '(choice (integer :tag "Number of elements")
+                (const   :tag "Unlimited" nil))
+  :version "22.1")
+
+(defcustom gdb-non-stop-setting t
+  "When in non-stop mode, stopped threads can be examined while
+other threads continue to execute.
+
+GDB session needs to be restarted for this setting to take
+effect."
+  :type 'boolean
+  :group 'gdb-non-stop
+  :version "23.2")
+
+;; TODO Some commands can't be called with --all (give a notice about
+;; it in setting doc)
+(defcustom gdb-gud-control-all-threads t
+  "When enabled, GUD execution commands affect all threads when
+in non-stop mode. Otherwise, only current thread is affected."
+  :type 'boolean
+  :group 'gdb-non-stop
+  :version "23.2")
+
+(defcustom gdb-switch-reasons t
+  "List of stop reasons which cause Emacs to switch to the thread
+which caused the stop. When t, switch to stopped thread no matter
+what the reason was. When nil, never switch to stopped thread
+automatically.
+
+This setting is used in non-stop mode only. In all-stop mode,
+Emacs always switches to the thread which caused the stop."
+  ;; exited, exited-normally and exited-signalled are not
+  ;; thread-specific stop reasons and therefore are not included in
+  ;; this list
+  :type '(choice
+          (const :tag "All reasons" t)
+          (set :tag "Selection of reasons..."
+               (const :tag "A breakpoint was reached." "breakpoint-hit")
+               (const :tag "A watchpoint was triggered." "watchpoint-trigger")
+               (const :tag "A read watchpoint was triggered." "read-watchpoint-trigger")
+               (const :tag "An access watchpoint was triggered." "access-watchpoint-trigger")
+               (const :tag "Function finished execution." "function-finished")
+               (const :tag "Location reached." "location-reached")
+               (const :tag "Watchpoint has gone out of scope" "watchpoint-scope")
+               (const :tag "End of stepping range reached." "end-stepping-range")
+               (const :tag "Signal received (like interruption)." "signal-received"))
+          (const :tag "None" nil))
+  :group 'gdb-non-stop
+  :version "23.2"
+  :link '(info-link "(gdb)GDB/MI Async Records"))
+
+(defcustom gdb-stopped-hooks nil
+  "This variable holds a list of functions to be called whenever
+GDB stops.
+
+Each function takes one argument, a parsed MI response, which
+contains fields of corresponding MI *stopped async record:
+
+    ((stopped-threads . \"all\")
+     (thread-id . \"1\")
+     (frame (line . \"38\")
+            (fullname . \"/home/sphinx/projects/gsoc/server.c\")
+            (file . \"server.c\")
+            (args ((value . \"0x804b038\")
+                   (name . \"arg\")))
+            (func . \"hello\")
+            (addr . \"0x0804869e\"))
+     (reason . \"end-stepping-range\"))
+
+Note that \"reason\" is only present in non-stop debugging mode.
+
+`bindat-get-field' may be used to access the fields of response.
+
+Each function is called after the new current thread was selected
+and GDB buffers were updated in `gdb-stopped'."
+  :type '(repeat function)
+  :group 'gdb
+  :version "23.2"
+  :link '(info-link "(gdb)GDB/MI Async Records"))
+
+(defcustom gdb-switch-when-another-stopped t
+  "When nil, Emacs won't switch to stopped thread if some other
+stopped thread is already selected."
+  :type 'boolean
+  :group 'gdb-non-stop
+  :version "23.2")
+
+(defcustom gdb-stack-buffer-locations t
+  "Show file information or library names in stack buffers."
+  :type 'boolean
+  :group 'gdb-buffers
+  :version "23.2")
+
+(defcustom gdb-stack-buffer-addresses nil
+  "Show frame addresses in stack buffers."
+  :type 'boolean
+  :group 'gdb-buffers
+  :version "23.2")
+
+(defcustom gdb-thread-buffer-verbose-names t
+  "Show long thread names in threads buffer."
+  :type 'boolean
+  :group 'gdb-buffers
+  :version "23.2")
+
+(defcustom gdb-thread-buffer-arguments t
+  "Show function arguments in threads buffer."
+  :type 'boolean
+  :group 'gdb-buffers
+  :version "23.2")
+
+(defcustom gdb-thread-buffer-locations t
+  "Show file information or library names in threads buffer."
+  :type 'boolean
+  :group 'gdb-buffers
+  :version "23.2")
+
+(defcustom gdb-thread-buffer-addresses nil
+  "Show addresses for thread frames in threads buffer."
+  :type 'boolean
+  :group 'gdb-buffers
+  :version "23.2")
+
+(defcustom gdb-show-threads-by-default nil
+  "Show threads list buffer instead of breakpoints list by
+default."
+  :type 'boolean
+  :group 'gdb-buffers
+  :version "23.2")
+
+(defvar gdb-debug-log nil
+  "List of commands sent to and replies received from GDB.
+Most recent commands are listed first.  This list stores only the last
+`gdb-debug-log-max' values.  This variable is used to debug GDB-MI.")
+
+;;;###autoload
+(defcustom gdb-enable-debug nil
+  "Non-nil means record the process input and output in `gdb-debug-log'."
+  :type 'boolean
+  :group 'gdb
+  :version "22.1")
+
+(defcustom gdb-cpp-define-alist-program "gcc -E -dM -"
+  "Shell command for generating a list of defined macros in a source file.
+This list is used to display the #define directive associated
+with an identifier as a tooltip.  It works in a debug session with
+GDB, when `gud-tooltip-mode' is t.
+
+Set `gdb-cpp-define-alist-flags' for any include paths or
+predefined macros."
+  :type 'string
+  :group 'gdb
+  :version "22.1")
+
+(defcustom gdb-cpp-define-alist-flags ""
+  "Preprocessor flags for `gdb-cpp-define-alist-program'."
+  :type 'string
+  :group 'gdb
+  :version "22.1")
+
+ (defcustom gdb-create-source-file-list t
+   "Non-nil means create a list of files from which the executable was built.
+ Set this to nil if the GUD buffer displays \"initializing...\" in the mode
+ line for a long time when starting, possibly because your executable was
+ built from a large number of files.  This allows quicker initialization
+ but means that these files are not automatically enabled for debugging,
+ e.g., you won't be able to click in the fringe to set a breakpoint until
+ execution has already stopped there."
+   :type 'boolean
+   :group 'gdb
+   :version "23.1")
+
+(defcustom gdb-show-main nil
+  "Non-nil means display source file containing the main routine at startup.
+Also display the main routine in the disassembly buffer if present."
+  :type 'boolean
+  :group 'gdb
+  :version "22.1")
+
+(defun gdb-force-mode-line-update (status)
+  (let ((buffer gud-comint-buffer))
+    (if (and buffer (buffer-name buffer))
+       (with-current-buffer buffer
+         (setq mode-line-process
+               (format ":%s [%s]"
+                       (process-status (get-buffer-process buffer)) status))
+         ;; Force mode line redisplay soon.
+         (force-mode-line-update)))))
+
+(defun gdb-enable-debug (arg)
+  "Toggle logging of transaction between Emacs and Gdb.
+The log is stored in `gdb-debug-log' as an alist with elements
+whose cons is send, send-item or recv and whose cdr is the string
+being transferred.  This list may grow up to a size of
+`gdb-debug-log-max' after which the oldest element (at the end of
+the list) is deleted every time a new one is added (at the front)."
+  (interactive "P")
+  (setq gdb-enable-debug
+       (if (null arg)
+           (not gdb-enable-debug)
+         (> (prefix-numeric-value arg) 0)))
+  (message (format "Logging of transaction %sabled"
+                  (if gdb-enable-debug "en" "dis"))))
+
+;; These two are used for menu and toolbar
+(defun gdb-control-all-threads ()
+  "Switch to non-stop/A mode."
+  (interactive)
+  (setq gdb-gud-control-all-threads t)
+  ;; Actually forcing the tool-bar to update.
+  (force-mode-line-update)
+  (message "Now in non-stop/A mode."))
+
+(defun gdb-control-current-thread ()
+  "Switch to non-stop/T mode."
+  (interactive)
+  (setq gdb-gud-control-all-threads nil)
+  ;; Actually forcing the tool-bar to update.
+  (force-mode-line-update)
+  (message "Now in non-stop/T mode."))
+
+(defun gdb-find-watch-expression ()
+  (let* ((var (nth (- (line-number-at-pos (point)) 2) gdb-var-list))
+        (varnum (car var)) expr array)
+    (string-match "\\(var[0-9]+\\)\\.\\(.*\\)" varnum)
+    (let ((var1 (assoc (match-string 1 varnum) gdb-var-list)) var2 varnumlet
+         (component-list (split-string (match-string 2 varnum) "\\." t)))
+      (setq expr (nth 1 var1))
+      (setq varnumlet (car var1))
+      (dolist (component component-list)
+       (setq var2 (assoc varnumlet gdb-var-list))
+       (setq expr (concat expr
+                          (if (string-match ".*\\[[0-9]+\\]$" (nth 3 var2))
+                              (concat "[" component "]")
+                            (concat "." component))))
+       (setq varnumlet (concat varnumlet "." component)))
+      expr)))
+
+;; noall is used for commands which don't take --all, but only
+;; --thread.
+(defun gdb-gud-context-command (command &optional noall)
+  "When `gdb-non-stop' is t, add --thread option to COMMAND if
+`gdb-gud-control-all-threads' is nil and --all option otherwise.
+If NOALL is t, always add --thread option no matter what
+`gdb-gud-control-all-threads' value is.
+
+When `gdb-non-stop' is nil, return COMMAND unchanged."
+  (if gdb-non-stop
+      (if (and gdb-gud-control-all-threads
+               (not noall)
+              (string-equal gdb-version "7.0+"))
+          (concat command " --all ")
+        (gdb-current-context-command command))
+    command))
+
+(defmacro gdb-gud-context-call (cmd1 &optional cmd2 noall noarg)
+  "`gud-call' wrapper which adds --thread/--all options between
+CMD1 and CMD2. NOALL is the same as in `gdb-gud-context-command'.
+
+NOARG must be t when this macro is used outside `gud-def'"
+  `(gud-call
+    (concat (gdb-gud-context-command ,cmd1 ,noall) " " ,cmd2)
+    ,(when (not noarg) 'arg)))
+
+;;;###autoload
+(defun gdb (command-line)
+  "Run gdb on program FILE in buffer *gud-FILE*.
+The directory containing FILE becomes the initial working directory
+and source-file directory for your debugger.
+
+If `gdb-many-windows' is nil (the default value) then gdb just
+pops up the GUD buffer unless `gdb-show-main' is t.  In this case
+it starts with two windows: one displaying the GUD buffer and the
+other with the source file with the main routine of the inferior.
+
+If `gdb-many-windows' is t, regardless of the value of
+`gdb-show-main', the layout below will appear.  Keybindings are
+shown in some of the buffers.
+
+Watch expressions appear in the speedbar/slowbar.
+
+The following commands help control operation :
+
+`gdb-many-windows'    - Toggle the number of windows gdb uses.
+`gdb-restore-windows' - To restore the window layout.
+
+See Info node `(emacs)GDB Graphical Interface' for a more
+detailed description of this mode.
+
+
++----------------------------------------------------------------------+
+|                               GDB Toolbar                            |
++-----------------------------------+----------------------------------+
+| GUD buffer (I/O of GDB)           | Locals buffer                    |
+|                                   |                                  |
+|                                   |                                  |
+|                                   |                                  |
++-----------------------------------+----------------------------------+
+| Source buffer                     | I/O buffer (of debugged program) |
+|                                   | (comint-mode)                    |
+|                                   |                                  |
+|                                   |                                  |
+|                                   |                                  |
+|                                   |                                  |
+|                                   |                                  |
+|                                   |                                  |
++-----------------------------------+----------------------------------+
+| Stack buffer                      | Breakpoints buffer               |
+| RET      gdb-select-frame         | SPC    gdb-toggle-breakpoint     |
+|                                   | RET    gdb-goto-breakpoint       |
+|                                   | D      gdb-delete-breakpoint     |
++-----------------------------------+----------------------------------+"
+  ;;
+  (interactive (list (gud-query-cmdline 'gdb)))
+
+  (when (and gud-comint-buffer
+          (buffer-name gud-comint-buffer)
+          (get-buffer-process gud-comint-buffer)
+          (with-current-buffer gud-comint-buffer (eq gud-minor-mode 'gdba)))
+       (gdb-restore-windows)
+       (error
+        "Multiple debugging requires restarting in text command mode"))
+  ;;
+  (gud-common-init command-line nil 'gud-gdbmi-marker-filter)
+  (set (make-local-variable 'gud-minor-mode) 'gdbmi)
+  (setq comint-input-sender 'gdb-send)
+
+  (gud-def gud-tbreak "tbreak %f:%l" "\C-t"
+          "Set temporary breakpoint at current line.")
+  (gud-def gud-jump
+          (progn (gud-call "tbreak %f:%l") (gud-call "jump %f:%l"))
+          "\C-j" "Set execution address to current line.")
+
+  (gud-def gud-up     "up %p"     "<" "Up N stack frames (numeric arg).")
+  (gud-def gud-down   "down %p"   ">" "Down N stack frames (numeric arg).")
+  (gud-def gud-print  "print %e"  "\C-p" "Evaluate C expression at point.")
+  (gud-def gud-pstar  "print* %e" nil
+          "Evaluate C dereferenced pointer expression at point.")
+
+  (gud-def gud-step   (gdb-gud-context-call "-exec-step" "%p" t)
+           "\C-s"
+          "Step one source line with display.")
+  (gud-def gud-stepi  (gdb-gud-context-call "-exec-step-instruction" "%p" t)
+           "\C-i"
+          "Step one instruction with display.")
+  (gud-def gud-next   (gdb-gud-context-call "-exec-next" "%p" t)
+           "\C-n"
+          "Step one line (skip functions).")
+  (gud-def gud-nexti  (gdb-gud-context-call "-exec-next-instruction" "%p" t)
+           nil
+          "Step one instruction (skip functions).")
+  (gud-def gud-cont   (gdb-gud-context-call "-exec-continue")
+           "\C-r"
+          "Continue with display.")
+  (gud-def gud-finish (gdb-gud-context-call "-exec-finish" nil t)
+           "\C-f"
+          "Finish executing current function.")
+  (gud-def gud-run    "-exec-run"
+           nil
+           "Run the program.")
+
+  (gud-def gud-break (if (not (string-match "Disassembly" mode-name))
+                        (gud-call "break %f:%l" arg)
+                      (save-excursion
+                        (beginning-of-line)
+                        (forward-char 2)
+                        (gud-call "break *%a" arg)))
+          "\C-b" "Set breakpoint at current line or address.")
+
+  (gud-def gud-remove (if (not (string-match "Disassembly" mode-name))
+                         (gud-call "clear %f:%l" arg)
+                       (save-excursion
+                         (beginning-of-line)
+                         (forward-char 2)
+                         (gud-call "clear *%a" arg)))
+          "\C-d" "Remove breakpoint at current line or address.")
+
+  ;; -exec-until doesn't support --all yet
+  (gud-def gud-until  (if (not (string-match "Disassembly" mode-name))
+                         (gud-call "-exec-until %f:%l" arg)
+                       (save-excursion
+                         (beginning-of-line)
+                         (forward-char 2)
+                         (gud-call "-exec-until *%a" arg)))
+          "\C-u" "Continue to current line or address.")
+  ;; TODO Why arg here?
+  (gud-def
+   gud-go (gud-call (if gdb-active-process
+                        (gdb-gud-context-command "-exec-continue")
+                      "-exec-run") arg)
+   nil "Start or continue execution.")
+
+  ;; For debugging Emacs only.
+  (gud-def gud-pp
+          (gud-call
+           (concat
+            "pp1 " (if (eq (buffer-local-value
+                            'major-mode (window-buffer)) 'speedbar-mode)
+                       (gdb-find-watch-expression) "%e")) arg)
+          nil   "Print the Emacs s-expression.")
+
+  (define-key gud-minor-mode-map [left-margin mouse-1]
+    'gdb-mouse-set-clear-breakpoint)
+  (define-key gud-minor-mode-map [left-fringe mouse-1]
+    'gdb-mouse-set-clear-breakpoint)
+   (define-key gud-minor-mode-map [left-margin C-mouse-1]
+    'gdb-mouse-toggle-breakpoint-margin)
+  (define-key gud-minor-mode-map [left-fringe C-mouse-1]
+    'gdb-mouse-toggle-breakpoint-fringe)
+
+  (define-key gud-minor-mode-map [left-margin drag-mouse-1]
+    'gdb-mouse-until)
+  (define-key gud-minor-mode-map [left-fringe drag-mouse-1]
+    'gdb-mouse-until)
+  (define-key gud-minor-mode-map [left-margin mouse-3]
+    'gdb-mouse-until)
+  (define-key gud-minor-mode-map [left-fringe mouse-3]
+    'gdb-mouse-until)
+
+  (define-key gud-minor-mode-map [left-margin C-drag-mouse-1]
+    'gdb-mouse-jump)
+  (define-key gud-minor-mode-map [left-fringe C-drag-mouse-1]
+    'gdb-mouse-jump)
+  (define-key gud-minor-mode-map [left-fringe C-mouse-3]
+    'gdb-mouse-jump)
+  (define-key gud-minor-mode-map [left-margin C-mouse-3]
+    'gdb-mouse-jump)
+
+  (local-set-key "\C-i" 'gud-gdb-complete-command)
+  (setq gdb-first-prompt t)
+  (setq gud-running nil)
+
+  (gdb-update)
+
+  (run-hooks 'gdb-mode-hook))
+
+(defun gdb-init-1 ()
+  ;; (re-)initialise
+  (setq gdb-selected-frame nil
+       gdb-frame-number nil
+        gdb-thread-number nil
+       gdb-var-list nil
+       gdb-pending-triggers nil
+       gdb-output-sink 'user
+       gdb-location-alist nil
+       gdb-source-file-list nil
+       gdb-last-command nil
+       gdb-token-number 0
+       gdb-handler-alist '()
+       gdb-handler-number nil
+       gdb-prompt-name nil
+       gdb-first-done-or-error t
+       gdb-buffer-fringe-width (car (window-fringes))
+       gdb-debug-log nil
+       gdb-source-window nil
+       gdb-inferior-status nil
+       gdb-continuation nil
+        gdb-buf-publisher '()
+        gdb-threads-list '()
+        gdb-breakpoints-list '()
+        gdb-register-names '()
+        gdb-non-stop gdb-non-stop-setting)
+  ;;
+  (setq gdb-buffer-type 'gdbmi)
+  ;;
+  (gdb-force-mode-line-update
+   (propertize "initializing..." 'face font-lock-variable-name-face))
+
+  (gdb-get-buffer-create 'gdb-inferior-io)
+  (gdb-clear-inferior-io)
+  (set-process-filter (get-process "gdb-inferior") 'gdb-inferior-filter)
+  (gdb-input
+   ;; Needs GDB 6.4 onwards
+   (list (concat "-inferior-tty-set "
+                (process-tty-name (get-process "gdb-inferior")))
+        'ignore))
+  (if (eq window-system 'w32)
+      (gdb-input (list "-gdb-set new-console off" 'ignore)))
+  (gdb-input (list "-gdb-set height 0" 'ignore))
+
+  (when gdb-non-stop
+    (gdb-input (list "-gdb-set non-stop 1" 'gdb-non-stop-handler)))
+
+  ;; find source file and compilation directory here
+  (gdb-input
+   ; Needs GDB 6.2 onwards.
+   (list "-file-list-exec-source-files" 'gdb-get-source-file-list))
+  (if gdb-create-source-file-list
+      (gdb-input
+        ; Needs GDB 6.0 onwards.
+       (list "-file-list-exec-source-file" 'gdb-get-source-file)))
+  (gdb-input
+   (list "-gdb-show prompt" 'gdb-get-prompt)))
+
+(defun gdb-non-stop-handler ()
+  (goto-char (point-min))
+  (if (re-search-forward "No symbol" nil t)
+      (progn
+       (message "This version of GDB doesn't support non-stop mode.  Turning it off.")
+       (setq gdb-non-stop nil)
+       (setq gdb-version "pre-7.0"))
+    (setq gdb-version "7.0+")
+    (gdb-input (list "-gdb-set target-async 1" 'ignore))
+    (gdb-input (list "-enable-pretty-printing" 'ignore))))
+
+(defvar gdb-define-alist nil "Alist of #define directives for GUD tooltips.")
+
+(defun gdb-create-define-alist ()
+  "Create an alist of #define directives for GUD tooltips."
+  (let* ((file (buffer-file-name))
+        (output
+         (with-output-to-string
+           (with-current-buffer standard-output
+             (and file
+                  (file-exists-p file)
+                  ;; call-process doesn't work with remote file names.
+                  (not (file-remote-p default-directory))
+                  (call-process shell-file-name file
+                                (list t nil) nil "-c"
+                                (concat gdb-cpp-define-alist-program " "
+                                        gdb-cpp-define-alist-flags))))))
+       (define-list (split-string output "\n" t))
+       (name))
+    (setq gdb-define-alist nil)
+    (dolist (define define-list)
+      (setq name (nth 1 (split-string define "[( ]")))
+      (push (cons name define) gdb-define-alist))))
+
+(declare-function tooltip-show "tooltip" (text &optional use-echo-area))
+(defvar tooltip-use-echo-area)
+
+(defun gdb-tooltip-print (expr)
+   (with-current-buffer (gdb-get-buffer 'gdb-partial-output-buffer)
+     (goto-char (point-min))
+     (if (re-search-forward ".*value=\\(\".*\"\\)" nil t)
+        (tooltip-show
+         (concat expr " = " (read (match-string 1)))
+         (or gud-tooltip-echo-area tooltip-use-echo-area
+             (not (display-graphic-p)))))))
+
+;; If expr is a macro for a function don't print because of possible dangerous
+;; side-effects. Also printing a function within a tooltip generates an
+;; unexpected starting annotation (phase error).
+(defun gdb-tooltip-print-1 (expr)
+  (with-current-buffer (gdb-get-buffer 'gdb-partial-output-buffer)
+    (goto-char (point-min))
+    (if (search-forward "expands to: " nil t)
+       (unless (looking-at "\\S-+.*(.*).*")
+         (gdb-input
+          (list  (concat "-data-evaluate-expression " expr)
+                 `(lambda () (gdb-tooltip-print ,expr))))))))
+
+(defun gdb-init-buffer ()
+  (set (make-local-variable 'gud-minor-mode) 'gdbmi)
+  (set (make-local-variable 'tool-bar-map) gud-tool-bar-map)
+  (when gud-tooltip-mode
+    (make-local-variable 'gdb-define-alist)
+    (gdb-create-define-alist)
+    (add-hook 'after-save-hook 'gdb-create-define-alist nil t)))
+
+(defmacro gdb-if-arrow (arrow-position &rest body)
+  `(if ,arrow-position
+      (let ((buffer (marker-buffer ,arrow-position)) (line))
+       (if (equal buffer (window-buffer (posn-window end)))
+           (with-current-buffer buffer
+             (when (or (equal start end)
+                       (equal (posn-point start)
+                              (marker-position ,arrow-position)))
+               ,@body))))))
+
+(defun gdb-mouse-until (event)
+  "Continue running until a source line past the current line.
+The destination source line can be selected either by clicking
+with mouse-3 on the fringe/margin or dragging the arrow
+with mouse-1 (default bindings)."
+  (interactive "e")
+  (let ((start (event-start event))
+       (end (event-end event)))
+    (gdb-if-arrow gud-overlay-arrow-position
+                 (setq line (line-number-at-pos (posn-point end)))
+                 (gud-call (concat "until " (number-to-string line))))
+    (gdb-if-arrow gdb-disassembly-position
+                 (save-excursion
+                   (goto-char (point-min))
+                   (forward-line (1- (line-number-at-pos (posn-point end))))
+                   (forward-char 2)
+                   (gud-call (concat "until *%a"))))))
+
+(defun gdb-mouse-jump (event)
+  "Set execution address/line.
+The destination source line can be selected either by clicking with C-mouse-3
+on the fringe/margin or dragging the arrow with C-mouse-1 (default bindings).
+Unlike `gdb-mouse-until' the destination address can be before the current
+line, and no execution takes place."
+  (interactive "e")
+  (let ((start (event-start event))
+       (end (event-end event)))
+    (gdb-if-arrow gud-overlay-arrow-position
+                 (setq line (line-number-at-pos (posn-point end)))
+                 (progn
+                   (gud-call (concat "tbreak " (number-to-string line)))
+                   (gud-call (concat "jump " (number-to-string line)))))
+    (gdb-if-arrow gdb-disassembly-position
+                 (save-excursion
+                   (goto-char (point-min))
+                   (forward-line (1- (line-number-at-pos (posn-point end))))
+                   (forward-char 2)
+                   (progn
+                     (gud-call (concat "tbreak *%a"))
+                     (gud-call (concat "jump *%a")))))))
+
+(defcustom gdb-show-changed-values t
+  "If non-nil change the face of out of scope variables and changed values.
+Out of scope variables are suppressed with `shadow' face.
+Changed values are highlighted with the face `font-lock-warning-face'."
+  :type 'boolean
+  :group 'gdb
+  :version "22.1")
+
+(defcustom gdb-max-children 40
+  "Maximum number of children before expansion requires confirmation."
+  :type 'integer
+  :group 'gdb
+  :version "22.1")
+
+(defcustom gdb-delete-out-of-scope t
+  "If non-nil delete watch expressions automatically when they go out of scope."
+  :type 'boolean
+  :group 'gdb
+  :version "22.2")
+
+(defcustom gdb-speedbar-auto-raise nil
+  "If non-nil raise speedbar every time display of watch expressions is\
+ updated."
+  :type 'boolean
+  :group 'gdb
+  :version "22.1")
+
+(defcustom gdb-use-colon-colon-notation nil
+  "If non-nil use FUN::VAR format to display variables in the speedbar."
+  :type 'boolean
+  :group 'gdb
+  :version "22.1")
+
+(defun gdb-speedbar-auto-raise (arg)
+  "Toggle automatic raising of the speedbar for watch expressions.
+With prefix argument ARG, automatically raise speedbar if ARG is
+positive, otherwise don't automatically raise it."
+  (interactive "P")
+  (setq gdb-speedbar-auto-raise
+       (if (null arg)
+           (not gdb-speedbar-auto-raise)
+         (> (prefix-numeric-value arg) 0)))
+  (message (format "Auto raising %sabled"
+                  (if gdb-speedbar-auto-raise "en" "dis"))))
+
+(define-key gud-minor-mode-map "\C-c\C-w" 'gud-watch)
+(define-key global-map (concat gud-key-prefix "\C-w") 'gud-watch)
+
+(declare-function tooltip-identifier-from-point "tooltip" (point))
+
+(defun gud-watch (&optional arg event)
+  "Watch expression at point.
+With arg, enter name of variable to be watched in the minibuffer."
+  (interactive (list current-prefix-arg last-input-event))
+  (let ((minor-mode (buffer-local-value 'gud-minor-mode gud-comint-buffer)))
+    (if (eq minor-mode 'gdbmi)
+       (progn
+         (if event (posn-set-point (event-end event)))
+         (require 'tooltip)
+         (save-selected-window
+           (let ((expr
+                  (if arg
+                      (completing-read "Name of variable: "
+                                       'gud-gdb-complete-command)
+                    (if (and transient-mark-mode mark-active)
+                        (buffer-substring (region-beginning) (region-end))
+                      (concat (if (eq major-mode 'gdb-registers-mode) "$")
+                              (tooltip-identifier-from-point (point)))))))
+             (set-text-properties 0 (length expr) nil expr)
+             (gdb-input
+              (list (concat"-var-create - * "  expr "")
+                    `(lambda () (gdb-var-create-handler ,expr)))))))
+      (message "gud-watch is a no-op in this mode."))))
+
+(defun gdb-var-create-handler (expr)
+  (let* ((result (gdb-json-partial-output)))
+    (if (not (bindat-get-field result 'msg))
+        (let ((var
+              (list (bindat-get-field result 'name)
+                    (if (and (string-equal gdb-current-language "c")
+                             gdb-use-colon-colon-notation gdb-selected-frame)
+                        (setq expr (concat gdb-selected-frame "::" expr))
+                      expr)
+                    (bindat-get-field result 'numchild)
+                    (bindat-get-field result 'type)
+                    (bindat-get-field result 'value)
+                    nil
+                    (bindat-get-field result 'has_more)
+                     gdb-frame-address)))
+         (push var gdb-var-list)
+         (speedbar 1)
+         (unless (string-equal
+                  speedbar-initial-expansion-list-name "GUD")
+           (speedbar-change-initial-expansion-list "GUD")))
+      (message-box "No symbol \"%s\" in current context." expr))))
+
+(defun gdb-speedbar-update ()
+  (when (and (boundp 'speedbar-frame) (frame-live-p speedbar-frame)
+            (not (gdb-pending-p 'gdb-speedbar-timer)))
+    ;; Dummy command to update speedbar even when idle.
+    (gdb-input (list "-environment-pwd" 'gdb-speedbar-timer-fn))
+    ;; Keep gdb-pending-triggers non-nil till end.
+    (gdb-add-pending 'gdb-speedbar-timer)))
+
+(defun gdb-speedbar-timer-fn ()
+  (if gdb-speedbar-auto-raise
+      (raise-frame speedbar-frame))
+  (gdb-delete-pending 'gdb-speedbar-timer)
+  (speedbar-timer-fn))
+
+(defun gdb-var-evaluate-expression-handler (varnum changed)
+  (goto-char (point-min))
+  (re-search-forward ".*value=\\(\".*\"\\)" nil t)
+  (let ((var (assoc varnum gdb-var-list)))
+    (when var
+      (if changed (setcar (nthcdr 5 var) 'changed))
+      (setcar (nthcdr 4 var) (read (match-string 1)))))
+  (gdb-speedbar-update))
+
+; Uses "-var-list-children --all-values".  Needs GDB 6.1 onwards.
+(defun gdb-var-list-children (varnum)
+  (gdb-input
+   (list (concat "-var-update " varnum) 'ignore))
+  (gdb-input
+   (list (concat "-var-list-children --all-values "
+               varnum)
+            `(lambda () (gdb-var-list-children-handler ,varnum)))))
+
+(defun gdb-var-list-children-handler (varnum)
+  (let* ((var-list nil)
+        (output (bindat-get-field (gdb-json-partial-output "child")))
+        (children (bindat-get-field output 'children)))
+   (catch 'child-already-watched
+      (dolist (var gdb-var-list)
+       (if (string-equal varnum (car var))
+           (progn
+             ;; With dynamic varobjs numchild may have increased.
+             (setcar (nthcdr 2 var) (bindat-get-field output 'numchild))
+             (push var var-list)
+             (dolist (child children)
+               (let ((varchild (list (bindat-get-field child 'name)
+                                     (bindat-get-field child 'exp)
+                                     (bindat-get-field child 'numchild)
+                                     (bindat-get-field child 'type)
+                                     (bindat-get-field child 'value)
+                                     nil
+                                     (bindat-get-field child 'has_more))))
+                 (if (assoc (car varchild) gdb-var-list)
+                     (throw 'child-already-watched nil))
+                 (push varchild var-list))))
+         (push var var-list)))
+      (setq gdb-var-list (nreverse var-list))))
+  (gdb-speedbar-update))
+
+(defun gdb-var-set-format (format)
+  "Set the output format for a variable displayed in the speedbar."
+  (let* ((var (nth (- (count-lines (point-min) (point)) 2) gdb-var-list))
+        (varnum (car var)))
+    (gdb-input
+     (list (concat "-var-set-format " varnum " " format) 'ignore))
+    (gdb-var-update)))
+
+(defun gdb-var-delete-1 (var varnum)
+  (gdb-input
+   (list (concat "-var-delete " varnum) 'ignore))
+  (setq gdb-var-list (delq var gdb-var-list))
+  (dolist (varchild gdb-var-list)
+    (if (string-match (concat (car var) "\\.") (car varchild))
+       (setq gdb-var-list (delq varchild gdb-var-list)))))
+
+(defun gdb-var-delete ()
+  "Delete watch expression at point from the speedbar."
+  (interactive)
+  (let ((text (speedbar-line-text)))
+    (string-match "\\(\\S-+\\)" text)
+       (let* ((var (nth (- (count-lines (point-min) (point)) 2) gdb-var-list))
+             (varnum (car var)))
+        (if (string-match "\\." (car var))
+            (message-box "Can only delete a root expression")
+          (gdb-var-delete-1 var varnum)))))
+
+(defun gdb-var-delete-children (varnum)
+  "Delete children of variable object at point from the speedbar."
+  (gdb-input
+   (list (concat "-var-delete -c " varnum) 'ignore)))
+
+(defun gdb-edit-value (text token indent)
+  "Assign a value to a variable displayed in the speedbar."
+  (let* ((var (nth (- (count-lines (point-min) (point)) 2) gdb-var-list))
+        (varnum (car var)) (value))
+    (setq value (read-string "New value: "))
+    (gdb-input
+     (list (concat "-var-assign " varnum " " value)
+          `(lambda () (gdb-edit-value-handler ,value))))))
+
+(defconst gdb-error-regexp "\\^error,msg=\\(\".+\"\\)")
+
+(defun gdb-edit-value-handler (value)
+  (goto-char (point-min))
+  (if (re-search-forward gdb-error-regexp nil t)
+      (message-box "Invalid number or expression (%s)" value)))
+
+; Uses "-var-update --all-values".  Needs GDB 6.4 onwards.
+(defun gdb-var-update ()
+  (if (not (gdb-pending-p 'gdb-var-update))
+      (gdb-input
+       (list "-var-update --all-values *" 'gdb-var-update-handler)))
+  (gdb-add-pending 'gdb-var-update))
+
+(defun gdb-var-update-handler ()
+  (let ((changelist (bindat-get-field (gdb-json-partial-output) 'changelist)))
+    (dolist (var gdb-var-list)
+      (setcar (nthcdr 5 var) nil))
+    (let ((temp-var-list gdb-var-list))
+      (dolist (change changelist)
+       (let* ((varnum (bindat-get-field change 'name))
+              (var (assoc varnum gdb-var-list))
+              (new-num (bindat-get-field change 'new_num_children)))
+         (when var
+           (let ((scope (bindat-get-field change 'in_scope))
+                 (has-more (bindat-get-field change 'has_more)))
+             (cond ((string-equal scope "false")
+                    (if gdb-delete-out-of-scope
+                        (gdb-var-delete-1 var varnum)
+                      (setcar (nthcdr 5 var) 'out-of-scope)))
+                   ((string-equal scope "true")
+                    (setcar (nthcdr 6 var) has-more)
+                    (when (and (or (not has-more)
+                                   (string-equal has-more "0"))
+                               (not new-num)
+                               (string-equal (nth 2 var) "0"))
+                      (setcar (nthcdr 4 var)
+                              (bindat-get-field change 'value))
+                      (setcar (nthcdr 5 var) 'changed)))
+                   ((string-equal scope "invalid")
+                    (gdb-var-delete-1 var varnum)))))
+         (let ((var-list nil) var1
+               (children (bindat-get-field change 'new_children)))
+           (if new-num
+               (progn
+                 (setq var1 (pop temp-var-list))
+                 (while var1
+                   (if (string-equal varnum (car var1))
+                       (let ((new (string-to-number new-num))
+                             (previous (string-to-number (nth 2 var1))))
+                         (setcar (nthcdr 2 var1) new-num)
+                         (push var1 var-list)
+                         (cond ((> new previous)
+                                ;; Add new children to list.
+                                (dotimes (dummy previous)
+                                  (push (pop temp-var-list) var-list))
+                                (dolist (child children)
+                                  (let ((varchild
+                                         (list (bindat-get-field child 'name)
+                                               (bindat-get-field child 'exp)
+                                               (bindat-get-field child 'numchild)
+                                               (bindat-get-field child 'type)
+                                               (bindat-get-field child 'value)
+                                               'changed
+                                               (bindat-get-field child 'has_more))))
+                                    (push varchild var-list))))
+                               ;; Remove deleted children from list.
+                               ((< new previous)
+                                (dotimes (dummy new)
+                                    (push (pop temp-var-list) var-list))
+                                (dotimes (dummy (- previous new))
+                                    (pop temp-var-list)))))
+                     (push var1 var-list))
+                   (setq var1 (pop temp-var-list)))
+                 (setq gdb-var-list (nreverse var-list)))))))))
+  (setq gdb-pending-triggers
+       (delq 'gdb-var-update gdb-pending-triggers))
+  (gdb-speedbar-update))
+
+(defun gdb-speedbar-expand-node (text token indent)
+  "Expand the node the user clicked on.
+TEXT is the text of the button we clicked on, a + or - item.
+TOKEN is data related to this node.
+INDENT is the current indentation depth."
+  (cond ((string-match "+" text)        ;expand this node
+        (let* ((var (assoc token gdb-var-list))
+               (expr (nth 1 var)) (children (nth 2 var)))
+          (if (or (<= (string-to-number children) gdb-max-children)
+                  (y-or-n-p
+                   (format "%s has %s children. Continue? " expr children)))
+              (gdb-var-list-children token))))
+       ((string-match "-" text)        ;contract this node
+        (dolist (var gdb-var-list)
+          (if (string-match (concat token "\\.") (car var))
+              (setq gdb-var-list (delq var gdb-var-list))))
+        (gdb-var-delete-children token)
+        (speedbar-change-expand-button-char ?+)
+        (speedbar-delete-subblock indent))
+       (t (error "Ooops...  not sure what to do")))
+  (speedbar-center-buffer-smartly))
+
+(defun gdb-get-target-string ()
+  (with-current-buffer gud-comint-buffer
+    gud-target-name))
+\f
+
+;;
+;; gdb buffers.
+;;
+;; Each buffer has a TYPE -- a symbol that identifies the function
+;; of that particular buffer.
+;;
+;; The usual gdb interaction buffer is given the type `gdbmi' and
+;; is constructed specially.
+;;
+;; Others are constructed by gdb-get-buffer-create and
+;; named according to the rules set forth in the gdb-buffer-rules
+
+(defvar gdb-buffer-rules '())
+
+(defun gdb-rules-name-maker (rules-entry)
+  (cadr rules-entry))
+(defun gdb-rules-buffer-mode (rules-entry)
+  (nth 2 rules-entry))
+(defun gdb-rules-update-trigger (rules-entry)
+  (nth 3 rules-entry))
+
+(defun gdb-update-buffer-name ()
+  "Rename current buffer according to name-maker associated with
+it in `gdb-buffer-rules'."
+  (let ((f (gdb-rules-name-maker (assoc gdb-buffer-type
+                                        gdb-buffer-rules))))
+    (when f (rename-buffer (funcall f)))))
+
+(defun gdb-current-buffer-rules ()
+  "Get `gdb-buffer-rules' entry for current buffer type."
+  (assoc gdb-buffer-type gdb-buffer-rules))
+
+(defun gdb-current-buffer-thread ()
+  "Get thread object of current buffer from `gdb-threads-list'.
+
+When current buffer is not bound to any thread, return main
+thread."
+  (cdr (assoc gdb-thread-number gdb-threads-list)))
+
+(defun gdb-current-buffer-frame ()
+  "Get current stack frame object for thread of current buffer."
+  (bindat-get-field (gdb-current-buffer-thread) 'frame))
+
+(defun gdb-buffer-type (buffer)
+  "Get value of `gdb-buffer-type' for BUFFER."
+  (with-current-buffer buffer
+    gdb-buffer-type))
+
+(defun gdb-buffer-shows-main-thread-p ()
+  "Return t if current GDB buffer shows main selected thread and
+is not bound to it."
+  (current-buffer)
+  (not (local-variable-p 'gdb-thread-number)))
+
+(defun gdb-get-buffer (buffer-type &optional thread)
+  "Get a specific GDB buffer.
+
+In that buffer, `gdb-buffer-type' must be equal to BUFFER-TYPE
+and `gdb-thread-number' (if provided) must be equal to THREAD."
+  (catch 'found
+    (dolist (buffer (buffer-list) nil)
+      (with-current-buffer buffer
+        (when (and (eq gdb-buffer-type buffer-type)
+                   (or (not thread)
+                       (equal gdb-thread-number thread)))
+          (throw 'found buffer))))))
+
+(defun gdb-get-buffer-create (buffer-type &optional thread)
+  "Create a new GDB buffer of the type specified by BUFFER-TYPE.
+The buffer-type should be one of the cars in `gdb-buffer-rules'.
+
+If THREAD is non-nil, it is assigned to `gdb-thread-number'
+buffer-local variable of the new buffer.
+
+Buffer mode and name are selected according to buffer type.
+
+If buffer has trigger associated with it in `gdb-buffer-rules',
+this trigger is subscribed to `gdb-buf-publisher' and called with
+'update argument."
+  (or (gdb-get-buffer buffer-type thread)
+      (let ((rules (assoc buffer-type gdb-buffer-rules))
+            (new (generate-new-buffer "limbo")))
+       (with-current-buffer new
+         (let ((mode (gdb-rules-buffer-mode rules))
+                (trigger (gdb-rules-update-trigger rules)))
+           (when mode (funcall mode))
+           (setq gdb-buffer-type buffer-type)
+            (when thread
+              (set (make-local-variable 'gdb-thread-number) thread))
+           (set (make-local-variable 'gud-minor-mode)
+                (buffer-local-value 'gud-minor-mode gud-comint-buffer))
+           (set (make-local-variable 'tool-bar-map) gud-tool-bar-map)
+            (rename-buffer (funcall (gdb-rules-name-maker rules)))
+           (when trigger
+              (gdb-add-subscriber gdb-buf-publisher
+                                  (cons (current-buffer)
+                                        (gdb-bind-function-to-buffer trigger (current-buffer))))
+              (funcall trigger 'start))
+            (current-buffer))))))
+
+(defun gdb-bind-function-to-buffer (expr buffer)
+  "Return a function which will evaluate EXPR in BUFFER."
+  `(lambda (&rest args)
+     (with-current-buffer ,buffer
+       (apply ',expr args))))
+
+;; Used to define all gdb-frame-*-buffer functions except
+;; `gdb-frame-io-buffer'
+(defmacro def-gdb-frame-for-buffer (name buffer &optional doc)
+  "Define a function NAME which shows gdb BUFFER in a separate frame.
+
+DOC is an optional documentation string."
+  `(defun ,name (&optional thread)
+     ,(when doc doc)
+     (interactive)
+     (let ((special-display-regexps (append special-display-regexps '(".*")))
+           (special-display-frame-alist gdb-frame-parameters))
+       (display-buffer (gdb-get-buffer-create ,buffer thread)))))
+
+(defmacro def-gdb-display-buffer (name buffer &optional doc)
+  "Define a function NAME which shows gdb BUFFER.
+
+DOC is an optional documentation string."
+  `(defun ,name (&optional thread)
+     ,(when doc doc)
+     (interactive)
+     (gdb-display-buffer
+      (gdb-get-buffer-create ,buffer thread) t)))
+
+;; Used to display windows with thread-bound buffers
+(defmacro def-gdb-preempt-display-buffer (name buffer &optional doc
+                                              split-horizontal)
+  `(defun ,name (&optional thread)
+     ,(when doc doc)
+     (message thread)
+     (gdb-preempt-existing-or-display-buffer
+      (gdb-get-buffer-create ,buffer thread)
+      ,split-horizontal)))
+
+;; This assoc maps buffer type symbols to rules.  Each rule is a list of
+;; at least one and possible more functions.  The functions have these
+;; roles in defining a buffer type:
+;;
+;;     NAME - Return a name for this  buffer type.
+;;
+;; The remaining function(s) are optional:
+;;
+;;     MODE - called in a new buffer with no arguments, should establish
+;;           the proper mode for the buffer.
+;;
+
+(defun gdb-set-buffer-rules (buffer-type &rest rules)
+  (let ((binding (assoc buffer-type gdb-buffer-rules)))
+    (if binding
+       (setcdr binding rules)
+      (push (cons buffer-type rules)
+           gdb-buffer-rules))))
+
+(defun gdb-parent-mode ()
+  "Generic mode to derive all other GDB buffer modes from."
+  (kill-all-local-variables)
+  (setq buffer-read-only t)
+  (buffer-disable-undo)
+  ;; Delete buffer from gdb-buf-publisher when it's killed
+  ;; (if it has an associated update trigger)
+  (add-hook
+   'kill-buffer-hook
+   (function
+    (lambda ()
+      (let ((trigger (gdb-rules-update-trigger
+                      (gdb-current-buffer-rules))))
+        (when trigger
+          (gdb-delete-subscriber
+           gdb-buf-publisher
+           ;; This should match gdb-add-subscriber done in
+           ;; gdb-get-buffer-create
+           (cons (current-buffer)
+                 (gdb-bind-function-to-buffer trigger (current-buffer))))))))
+   nil t))
+
+;; Partial-output buffer : This accumulates output from a command executed on
+;; behalf of emacs (rather than the user).
+;;
+(gdb-set-buffer-rules 'gdb-partial-output-buffer
+                     'gdb-partial-output-name)
+
+(defun gdb-partial-output-name ()
+  (concat " *partial-output-"
+         (gdb-get-target-string)
+         "*"))
+
+\f
+(gdb-set-buffer-rules 'gdb-inferior-io
+                     'gdb-inferior-io-name
+                     'gdb-inferior-io-mode)
+
+(defun gdb-inferior-io-name ()
+  (concat "*input/output of "
+         (gdb-get-target-string)
+         "*"))
+
+(defun gdb-display-io-buffer ()
+  "Display IO of debugged program in a separate window."
+  (interactive)
+  (gdb-display-buffer
+   (gdb-get-buffer-create 'gdb-inferior-io) t))
+
+(defconst gdb-frame-parameters
+  '((height . 14) (width . 80)
+    (unsplittable . t)
+    (tool-bar-lines . nil)
+    (menu-bar-lines . nil)
+    (minibuffer . nil)))
+
+(defun gdb-frame-io-buffer ()
+  "Display IO of debugged program in a new frame."
+  (interactive)
+  (let ((special-display-regexps (append special-display-regexps '(".*")))
+       (special-display-frame-alist gdb-frame-parameters))
+    (display-buffer (gdb-get-buffer-create 'gdb-inferior-io))))
+
+(defvar gdb-inferior-io-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map "\C-c\C-c" 'gdb-io-interrupt)
+    (define-key map "\C-c\C-z" 'gdb-io-stop)
+    (define-key map "\C-c\C-\\" 'gdb-io-quit)
+    (define-key map "\C-c\C-d" 'gdb-io-eof)
+    (define-key map "\C-d" 'gdb-io-eof)
+    map))
+
+;; We want to use comint because it has various nifty and familiar features.
+(define-derived-mode gdb-inferior-io-mode comint-mode "Inferior I/O"
+  "Major mode for gdb inferior-io.
+
+The following commands are available:
+\\{gdb-inferior-io-mode-map}"
+
+  :syntax-table nil :abbrev-table nil
+
+(make-comint-in-buffer "gdb-inferior" (current-buffer)  nil))
+
+(defun gdb-inferior-filter (proc string)
+  (unless (string-equal string "")
+    (gdb-display-buffer (gdb-get-buffer-create 'gdb-inferior-io) t))
+  (with-current-buffer (gdb-get-buffer-create 'gdb-inferior-io)
+    (comint-output-filter proc string)))
+
+(defun gdb-io-interrupt ()
+  "Interrupt the program being debugged."
+  (interactive)
+  (interrupt-process
+   (get-buffer-process gud-comint-buffer) comint-ptyp))
+
+(defun gdb-io-quit ()
+  "Send quit signal to the program being debugged."
+  (interactive)
+  (quit-process
+   (get-buffer-process gud-comint-buffer) comint-ptyp))
+
+(defun gdb-io-stop ()
+  "Stop the program being debugged."
+  (interactive)
+  (stop-process
+   (get-buffer-process gud-comint-buffer) comint-ptyp))
+
+(defun gdb-io-eof ()
+  "Send end-of-file to the program being debugged."
+  (interactive)
+  (process-send-eof
+   (get-buffer-process gud-comint-buffer)))
+
+(defun gdb-clear-inferior-io ()
+  (with-current-buffer (gdb-get-buffer-create 'gdb-inferior-io)
+    (erase-buffer)))
+\f
+
+(defconst breakpoint-xpm-data
+  "/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+\"10 10 2 1\",
+\"  c red\",
+\"+ c None\",
+/* pixels */
+\"+++    +++\",
+\"++      ++\",
+\"+        +\",
+\"          \",
+\"          \",
+\"          \",
+\"          \",
+\"+        +\",
+\"++      ++\",
+\"+++    +++\",
+};"
+  "XPM data used for breakpoint icon.")
+
+(defconst breakpoint-enabled-pbm-data
+  "P1
+10 10\",
+0 0 0 0 1 1 1 1 0 0 0 0
+0 0 0 1 1 1 1 1 1 0 0 0
+0 0 1 1 1 1 1 1 1 1 0 0
+0 1 1 1 1 1 1 1 1 1 1 0
+0 1 1 1 1 1 1 1 1 1 1 0
+0 1 1 1 1 1 1 1 1 1 1 0
+0 1 1 1 1 1 1 1 1 1 1 0
+0 0 1 1 1 1 1 1 1 1 0 0
+0 0 0 1 1 1 1 1 1 0 0 0
+0 0 0 0 1 1 1 1 0 0 0 0"
+  "PBM data used for enabled breakpoint icon.")
+
+(defconst breakpoint-disabled-pbm-data
+  "P1
+10 10\",
+0 0 1 0 1 0 1 0 0 0
+0 1 0 1 0 1 0 1 0 0
+1 0 1 0 1 0 1 0 1 0
+0 1 0 1 0 1 0 1 0 1
+1 0 1 0 1 0 1 0 1 0
+0 1 0 1 0 1 0 1 0 1
+1 0 1 0 1 0 1 0 1 0
+0 1 0 1 0 1 0 1 0 1
+0 0 1 0 1 0 1 0 1 0
+0 0 0 1 0 1 0 1 0 0"
+  "PBM data used for disabled breakpoint icon.")
+
+(defvar breakpoint-enabled-icon nil
+  "Icon for enabled breakpoint in display margin.")
+
+(defvar breakpoint-disabled-icon nil
+  "Icon for disabled breakpoint in display margin.")
+
+(declare-function define-fringe-bitmap "fringe.c"
+                 (bitmap bits &optional height width align))
+
+(and (display-images-p)
+     ;; Bitmap for breakpoint in fringe
+     (define-fringe-bitmap 'breakpoint
+       "\x3c\x7e\xff\xff\xff\xff\x7e\x3c")
+     ;; Bitmap for gud-overlay-arrow in fringe
+     (define-fringe-bitmap 'hollow-right-triangle
+       "\xe0\x90\x88\x84\x84\x88\x90\xe0"))
+
+(defface breakpoint-enabled
+  '((t
+     :foreground "red1"
+     :weight bold))
+  "Face for enabled breakpoint icon in fringe."
+  :group 'gdb)
+
+(defface breakpoint-disabled
+  '((((class color) (min-colors 88)) :foreground "grey70")
+    ;; Ensure that on low-color displays that we end up something visible.
+    (((class color) (min-colors 8) (background light))
+     :foreground "black")
+    (((class color) (min-colors 8) (background dark))
+     :foreground "white")
+    (((type tty) (class mono))
+     :inverse-video t)
+    (t :background "gray"))
+  "Face for disabled breakpoint icon in fringe."
+  :group 'gdb)
+
+\f
+(defun gdb-send (proc string)
+  "A comint send filter for gdb."
+  (with-current-buffer gud-comint-buffer
+    (let ((inhibit-read-only t))
+      (remove-text-properties (point-min) (point-max) '(face))))
+  ;; mimic <RET> key to repeat previous command in GDB
+  (if (not (string= "" string))
+      (setq gdb-last-command string)
+    (if gdb-last-command (setq string gdb-last-command)))
+  (if gdb-enable-debug
+      (push (cons 'mi-send (concat string "\n")) gdb-debug-log))
+  (if (string-match "^-" string)
+      ;; MI command
+      (progn
+       (setq gdb-first-done-or-error t)
+       (process-send-string proc (concat string "\n")))
+    ;; CLI command
+    (if (string-match "\\\\$" string)
+       (setq gdb-continuation (concat gdb-continuation string "\n"))
+      (setq gdb-first-done-or-error t)
+      (process-send-string proc (concat "-interpreter-exec console \""
+                                       gdb-continuation string "\"\n"))
+      (setq gdb-continuation nil))))
+
+(defun gdb-input (item)
+  (if gdb-enable-debug (push (cons 'send-item item) gdb-debug-log))
+  (setq gdb-token-number (1+ gdb-token-number))
+  (setcar item (concat (number-to-string gdb-token-number) (car item)))
+  (push (cons gdb-token-number (car (cdr item))) gdb-handler-alist)
+  (process-send-string (get-buffer-process gud-comint-buffer)
+                      (concat (car item) "\n")))
+
+;; NOFRAME is used for gud execution control commands
+(defun gdb-current-context-command (command)
+  "Add --thread to gdb COMMAND when needed."
+  (if (and gdb-thread-number
+          (string-equal gdb-version "7.0+"))
+      (concat command " --thread " gdb-thread-number)
+    command))
+
+(defun gdb-current-context-buffer-name (name)
+  "Add thread information and asterisks to string NAME.
+
+If `gdb-thread-number' is nil, just wrap NAME in asterisks."
+  (concat "*" name
+          (if (local-variable-p 'gdb-thread-number)
+              (format " (bound to thread %s)" gdb-thread-number)
+            "")
+          "*"))
+
+(defun gdb-current-context-mode-name (mode)
+  "Add thread information to MODE which is to be used as
+`mode-name'."
+  (concat mode
+          (if gdb-thread-number
+              (format " [thread %s]" gdb-thread-number)
+            "")))
+\f
+
+(defcustom gud-gdb-command-name "gdb -i=mi"
+  "Default command to execute an executable under the GDB debugger."
+  :type 'string
+  :group 'gdb)
+
+(defun gdb-resync()
+  (setq gud-running nil)
+  (setq gdb-output-sink 'user)
+  (setq gdb-pending-triggers nil))
+
+(defun gdb-update ()
+  "Update buffers showing status of debug session."
+  (when gdb-first-prompt
+    (gdb-force-mode-line-update
+     (propertize "initializing..." 'face font-lock-variable-name-face))
+    (gdb-init-1)
+    (setq gdb-first-prompt nil))
+
+  (gdb-get-main-selected-frame)
+  ;; We may need to update gdb-threads-list so we can use
+  (gdb-get-buffer-create 'gdb-threads-buffer)
+  ;; gdb-break-list is maintained in breakpoints handler
+  (gdb-get-buffer-create 'gdb-breakpoints-buffer)
+
+  (gdb-emit-signal gdb-buf-publisher 'update)
+
+  (gdb-get-changed-registers)
+
+  (when (and (boundp 'speedbar-frame) (frame-live-p speedbar-frame))
+    (dolist (var gdb-var-list)
+      (setcar (nthcdr 5 var) nil))
+    (gdb-var-update)))
+
+;; gdb-setq-thread-number and gdb-update-gud-running are decoupled
+;; because we may need to update current gud-running value without
+;; changing current thread (see gdb-running)
+(defun gdb-setq-thread-number (number)
+  "Only this function must be used to change `gdb-thread-number'
+value to NUMBER, because `gud-running' and `gdb-frame-number'
+need to be updated appropriately when current thread changes."
+  ;; GDB 6.8 and earlier always output thread-id="0" when stopping.
+  (unless (string-equal number "0") (setq gdb-thread-number number))
+  (setq gdb-frame-number "0")
+  (gdb-update-gud-running))
+
+(defun gdb-update-gud-running ()
+  "Set `gud-running' according to the state of current thread.
+
+`gdb-frame-number' is set to 0 if current thread is now stopped.
+
+Note that when `gdb-gud-control-all-threads' is t, `gud-running'
+cannot be reliably used to determine whether or not execution
+control buttons should be shown in menu or toolbar. Use
+`gdb-running-threads-count' and `gdb-stopped-threads-count'
+instead.
+
+For all-stop mode, thread information is unavailable while target
+is running."
+  (let ((old-value gud-running))
+    (setq gud-running
+          (string= (bindat-get-field (gdb-current-buffer-thread) 'state)
+                   "running"))
+    ;; Set frame number to "0" when _current_ threads stops
+    (when (and (gdb-current-buffer-thread)
+               (not (eq gud-running old-value)))
+      (setq gdb-frame-number "0"))))
+
+(defun gdb-show-run-p ()
+  "Return t if \"Run/continue\" should be shown on the toolbar."
+  (or (not gdb-active-process)
+      (and (or
+            (not gdb-gud-control-all-threads)
+            (not gdb-non-stop))
+           (not gud-running))
+      (and gdb-gud-control-all-threads
+           (> gdb-stopped-threads-count 0))))
+
+(defun gdb-show-stop-p ()
+  "Return t if \"Stop\" should be shown on the toolbar."
+  (or (and (or
+            (not gdb-gud-control-all-threads)
+            (not gdb-non-stop))
+           gud-running)
+      (and gdb-gud-control-all-threads
+           (> gdb-running-threads-count 0))))
+
+;; GUD displays the selected GDB frame.  This might might not be the current
+;; GDB frame (after up, down etc).  If no GDB frame is visible but the last
+;; visited breakpoint is, use that window.
+(defun gdb-display-source-buffer (buffer)
+  (let* ((last-window (if gud-last-last-frame
+                        (get-buffer-window
+                         (gud-find-file (car gud-last-last-frame)))))
+        (source-window (or last-window
+                           (if (and gdb-source-window
+                                    (window-live-p gdb-source-window))
+                               gdb-source-window))))
+    (when source-window
+      (setq gdb-source-window source-window)
+      (set-window-buffer source-window buffer))
+    source-window))
+
+(defun gdb-car< (a b)
+  (< (car a) (car b)))
+
+(defvar gdbmi-record-list
+  '((gdb-gdb . "(gdb) \n")
+    (gdb-done . "\\([0-9]*\\)\\^done,?\\(.*?\\)\n")
+    (gdb-starting . "\\([0-9]*\\)\\^running\n")
+    (gdb-error . "\\([0-9]*\\)\\^error,\\(.*?\\)\n")
+    (gdb-console . "~\\(\".*?\"\\)\n")
+    (gdb-internals . "&\\(\".*?\"\\)\n")
+    (gdb-stopped . "\\*stopped,?\\(.*?\\)\n")
+    (gdb-running . "\\*running,\\(.*?\n\\)")
+    (gdb-thread-created . "=thread-created,\\(.*?\n\\)")
+    (gdb-thread-selected . "=thread-selected,\\(.*?\\)\n")
+    (gdb-thread-exited . "=thread-exited,\\(.*?\n\\)")
+    (gdb-ignored-notification . "=[-[:alpha:]]+,?\\(.*?\\)\n")
+    (gdb-shell . "\\(\\(?:^.+\n\\)+\\)")))
+
+(defun gud-gdbmi-marker-filter (string)
+  "Filter GDB/MI output."
+
+  ;; Record transactions if logging is enabled.
+  (when gdb-enable-debug
+    (push (cons 'recv string) gdb-debug-log)
+    (if (and gdb-debug-log-max
+            (> (length gdb-debug-log) gdb-debug-log-max))
+       (setcdr (nthcdr (1- gdb-debug-log-max) gdb-debug-log) nil)))
+
+  ;; Recall the left over gud-marker-acc from last time
+  (setq gud-marker-acc (concat gud-marker-acc string))
+
+  ;; Start accumulating output for the GUD buffer
+  (setq gdb-filter-output "")
+  (let ((output-record) (output-record-list))
+
+    ;; Process all the complete markers in this chunk.
+    (dolist (gdbmi-record gdbmi-record-list)
+      (while (string-match (cdr gdbmi-record) gud-marker-acc)
+       (push (list (match-beginning 0)
+                   (car gdbmi-record)
+                   (match-string 1 gud-marker-acc)
+                   (match-string 2 gud-marker-acc)
+                   (match-end 0))
+             output-record-list)
+       (setq gud-marker-acc
+             (concat (substring gud-marker-acc 0 (match-beginning 0))
+                     ;; Pad with spaces to preserve position.
+                     (make-string (length (match-string 0 gud-marker-acc)) 32)
+                     (substring gud-marker-acc (match-end 0))))))
+
+    (setq output-record-list (sort output-record-list 'gdb-car<))
+
+    (dolist (output-record output-record-list)
+      (let ((record-type (cadr output-record))
+           (arg1 (nth 2 output-record))
+           (arg2 (nth 3 output-record)))
+       (if (eq record-type 'gdb-error)
+           (gdb-done-or-error arg2 arg1 'error)
+         (if (eq record-type 'gdb-done)
+             (gdb-done-or-error arg2 arg1 'done)
+           ;; Suppress "No registers." since GDB 6.8 and earlier duplicates MI
+           ;; error message on internal stream.  Don't print to GUD buffer.
+           (unless (and (eq record-type 'gdb-internals)
+                    (string-equal (read arg1) "No registers.\n"))
+             (funcall record-type arg1))))))
+
+    (setq gdb-output-sink 'user)
+    ;; Remove padding.
+    (string-match "^ *" gud-marker-acc)
+    (setq gud-marker-acc (substring gud-marker-acc (match-end 0)))
+
+    gdb-filter-output))
+
+(defun gdb-gdb (output-field))
+
+(defun gdb-shell (output-field)
+  (let ((gdb-output-sink gdb-output-sink))
+    (setq gdb-filter-output
+          (concat output-field gdb-filter-output))))
+
+(defun gdb-ignored-notification (output-field))
+
+;; gdb-invalidate-threads is defined to accept 'update-threads signal
+(defun gdb-thread-created (output-field))
+(defun gdb-thread-exited (output-field)
+  "Handle =thread-exited async record: unset `gdb-thread-number'
+ if current thread exited and update threads list."
+   (let* ((thread-id (bindat-get-field (gdb-json-string output-field) 'id)))
+     (if (string= gdb-thread-number thread-id)
+         (gdb-setq-thread-number nil))
+     ;; When we continue current thread and it quickly exits,
+     ;; gdb-pending-triggers left after gdb-running disallow us to
+     ;; properly call -thread-info without --thread option. Thus we
+     ;; need to use gdb-wait-for-pending.
+     (gdb-wait-for-pending
+      (gdb-emit-signal gdb-buf-publisher 'update-threads))))
+
+(defun gdb-thread-selected (output-field)
+  "Handler for =thread-selected MI output record.
+
+Sets `gdb-thread-number' to new id."
+  (let* ((result (gdb-json-string output-field))
+         (thread-id (bindat-get-field result 'id)))
+    (gdb-setq-thread-number thread-id)
+    ;; Typing `thread N` in GUD buffer makes GDB emit `^done` followed
+    ;; by `=thread-selected` notification. `^done` causes `gdb-update`
+    ;; as usually. Things happen to fast and second call (from
+    ;; gdb-thread-selected handler) gets cut off by our beloved
+    ;; gdb-pending-triggers.
+    ;; Solution is `gdb-wait-for-pending` macro: it guarantees that its
+    ;; body will get executed when `gdb-pending-triggers` is empty.
+    (gdb-wait-for-pending
+     (gdb-update))))
+
+(defun gdb-running (output-field)
+  (let* ((thread-id (bindat-get-field (gdb-json-string output-field) 'thread-id)))
+    ;; We reset gdb-frame-number to nil if current thread has gone
+    ;; running. This can't be done in gdb-thread-list-handler-custom
+    ;; because we need correct gdb-frame-number by the time
+    ;; -thread-info command is sent.
+    (when (or (string-equal thread-id "all")
+              (string-equal thread-id gdb-thread-number))
+      (setq gdb-frame-number nil)))
+  (setq gdb-inferior-status "running")
+  (gdb-force-mode-line-update
+   (propertize gdb-inferior-status 'face font-lock-type-face))
+  (when (not gdb-non-stop)
+    (setq gud-running t))
+  (setq gdb-active-process t)
+  (gdb-emit-signal gdb-buf-publisher 'update-threads))
+
+(defun gdb-starting (output-field)
+  ;; CLI commands don't emit ^running at the moment so use gdb-running too.
+  (setq gdb-inferior-status "running")
+  (gdb-force-mode-line-update
+   (propertize gdb-inferior-status 'face font-lock-type-face))
+  (setq gdb-active-process t)
+  (setq gud-running t)
+  ;; GDB doesn't seem to respond to -thread-info before first stop or
+  ;; thread exit (even in non-stop mode), so this is useless.
+  ;; Behaviour may change in the future.
+  (gdb-emit-signal gdb-buf-publisher 'update-threads))
+
+;; -break-insert -t didn't give a reason before gdb 6.9
+
+(defun gdb-stopped (output-field)
+  "Given the contents of *stopped MI async record, select new
+current thread and update GDB buffers."
+  ;; Reason is available with target-async only
+  (let* ((result (gdb-json-string output-field))
+         (reason (bindat-get-field result 'reason))
+         (thread-id (bindat-get-field result 'thread-id)))
+
+    ;; -data-list-register-names needs to be issued for any stopped
+    ;; thread
+    (when (not gdb-register-names)
+      (gdb-input
+       (list (concat "-data-list-register-names"
+                    (if (string-equal gdb-version "7.0+")
+                        (concat" --thread " thread-id)))
+             'gdb-register-names-handler)))
+
+;;; Don't set gud-last-frame here as it's currently done in gdb-frame-handler
+;;; because synchronous GDB doesn't give these fields with CLI.
+;;;     (when file
+;;;       (setq
+;;;        ;; Extract the frame position from the marker.
+;;;        gud-last-frame (cons file
+;;;                        (string-to-number
+;;;                         (match-string 6 gud-marker-acc)))))
+
+    (setq gdb-inferior-status (or reason "unknown"))
+    (gdb-force-mode-line-update
+     (propertize gdb-inferior-status 'face font-lock-warning-face))
+    (if (string-equal reason "exited-normally")
+       (setq gdb-active-process nil))
+
+    ;; Select new current thread.
+
+    ;; Don't switch if we have no reasons selected
+    (when gdb-switch-reasons
+      ;; Switch from another stopped thread only if we have
+      ;; gdb-switch-when-another-stopped:
+      (when (or gdb-switch-when-another-stopped
+                (not (string= "stopped"
+                              (bindat-get-field (gdb-current-buffer-thread) 'state))))
+        ;; Switch if current reason has been selected or we have no
+        ;; reasons
+        (if (or (eq gdb-switch-reasons t)
+                (member reason gdb-switch-reasons))
+             (when (not (string-equal gdb-thread-number thread-id))
+               (message (concat "Switched to thread " thread-id))
+               (gdb-setq-thread-number thread-id))
+          (message (format "Thread %s stopped" thread-id)))))
+
+  ;; Print "(gdb)" to GUD console
+  (when gdb-first-done-or-error
+    (setq gdb-filter-output (concat gdb-filter-output gdb-prompt-name)))
+
+  ;; In non-stop, we update information as soon as another thread gets
+  ;; stopped
+  (when (or gdb-first-done-or-error
+            gdb-non-stop)
+    ;; In all-stop this updates gud-running properly as well.
+    (gdb-update)
+    (setq gdb-first-done-or-error nil))
+  (run-hook-with-args 'gdb-stopped-hooks result)))
+
+;; Remove the trimmings from log stream containing debugging messages
+;; being produced by GDB's internals, use warning face and send to GUD
+;; buffer.
+(defun gdb-internals (output-field)
+  (setq gdb-filter-output
+       (gdb-concat-output
+        gdb-filter-output
+        (let ((error-message
+               (read output-field)))
+          (put-text-property
+           0 (length error-message)
+           'face font-lock-warning-face
+           error-message)
+          error-message))))
+
+;; Remove the trimmings from the console stream and send to GUD buffer
+;; (frontend MI commands should not print to this stream)
+(defun gdb-console (output-field)
+   (setq gdb-filter-output
+       (gdb-concat-output
+        gdb-filter-output
+        (read output-field))))
+
+(defun gdb-done-or-error (output-field token-number type)
+  (if (string-equal token-number "")
+      ;; Output from command entered by user
+      (progn
+       (setq gdb-output-sink 'user)
+       (setq token-number nil)
+       ;; MI error - send to minibuffer
+       (when (eq type 'error)
+            ;; Skip "msg=" from `output-field'
+           (message (read (substring output-field 4)))
+           ;; Don't send to the console twice.  (If it is a console error
+           ;; it is also in the console stream.)
+           (setq output-field nil)))
+    ;; Output from command from frontend.
+    (setq gdb-output-sink 'emacs))
+
+  (gdb-clear-partial-output)
+  (when gdb-first-done-or-error
+    (unless (or token-number gud-running)
+      (setq gdb-filter-output (concat gdb-filter-output gdb-prompt-name)))
+    (gdb-update)
+    (setq gdb-first-done-or-error nil))
+
+  (setq gdb-filter-output
+       (gdb-concat-output gdb-filter-output output-field))
+
+  (if token-number
+      (progn
+       (with-current-buffer
+           (gdb-get-buffer-create 'gdb-partial-output-buffer)
+         (funcall
+          (cdr (assoc (string-to-number token-number) gdb-handler-alist))))
+       (setq gdb-handler-alist
+             (assq-delete-all token-number gdb-handler-alist)))))
+
+(defun gdb-concat-output (so-far new)
+  (let ((sink gdb-output-sink))
+    (cond
+     ((eq sink 'user) (concat so-far new))
+     ((eq sink 'emacs)
+      (gdb-append-to-partial-output new)
+      so-far))))
+
+(defun gdb-append-to-partial-output (string)
+  (with-current-buffer (gdb-get-buffer-create 'gdb-partial-output-buffer)
+    (goto-char (point-max))
+    (insert string)))
+
+(defun gdb-clear-partial-output ()
+  (with-current-buffer (gdb-get-buffer-create 'gdb-partial-output-buffer)
+    (erase-buffer)))
+
+(defun gdb-jsonify-buffer (&optional fix-key fix-list)
+  "Prepare GDB/MI output in current buffer for parsing with `json-read'.
+
+Field names are wrapped in double quotes and equal signs are
+replaced with semicolons.
+
+If FIX-KEY is non-nil, strip all \"FIX-KEY=\" occurences from
+partial output. This is used to get rid of useless keys in lists
+in MI messages, e.g.: [key=.., key=..]. -stack-list-frames and
+-break-info are examples of MI commands which issue such
+responses.
+
+If FIX-LIST is non-nil, \"FIX-LIST={..}\" is replaced with
+\"FIX-LIST=[..]\" prior to parsing. This is used to fix broken
+-break-info output when it contains breakpoint script field
+incompatible with GDB/MI output syntax."
+  (save-excursion
+    (goto-char (point-min))
+    (when fix-key
+      (save-excursion
+        (while (re-search-forward (concat "[\\[,]\\(" fix-key "=\\)") nil t)
+          (replace-match "" nil nil nil 1))))
+    (when fix-list
+      (save-excursion
+        ;; Find positions of braces which enclose broken list
+        (while (re-search-forward (concat fix-list "={\"") nil t)
+          (let ((p1 (goto-char (- (point) 2)))
+                (p2 (progn (forward-sexp)
+                           (1- (point)))))
+            ;; Replace braces with brackets
+            (save-excursion
+              (goto-char p1)
+              (delete-char 1)
+              (insert "[")
+              (goto-char p2)
+              (delete-char 1)
+              (insert "]"))))))
+    (goto-char (point-min))
+    (insert "{")
+    (while (re-search-forward
+           "\\([[:alnum:]-_]+\\)=\\({\\|\\[\\|\"\"\\|\".*?[^\\]\"\\)" nil t)
+      (replace-match "\"\\1\":\\2" nil nil))
+    (goto-char (point-max))
+    (insert "}")))
+
+(defun gdb-json-read-buffer (&optional fix-key fix-list)
+  "Prepare and parse GDB/MI output in current buffer with `json-read'.
+
+FIX-KEY and FIX-LIST work as in `gdb-jsonify-buffer'."
+  (gdb-jsonify-buffer fix-key fix-list)
+  (save-excursion
+    (goto-char (point-min))
+    (let ((json-array-type 'list))
+      (json-read))))
+
+(defun gdb-json-string (string &optional fix-key fix-list)
+  "Prepare and parse STRING containing GDB/MI output with `json-read'.
+
+FIX-KEY and FIX-LIST work as in `gdb-jsonify-buffer'."
+  (with-temp-buffer
+    (insert string)
+    (gdb-json-read-buffer fix-key fix-list)))
+
+(defun gdb-json-partial-output (&optional fix-key fix-list)
+  "Prepare and parse gdb-partial-output-buffer with `json-read'.
+
+FIX-KEY and FIX-KEY work as in `gdb-jsonify-buffer'."
+  (with-current-buffer (gdb-get-buffer-create 'gdb-partial-output-buffer)
+    (gdb-json-read-buffer fix-key fix-list)))
+
+(defun gdb-line-posns (line)
+  "Return a pair of LINE beginning and end positions."
+  (let ((offset (1+ (- line (line-number-at-pos)))))
+    (cons
+     (line-beginning-position offset)
+     (line-end-position offset))))
+
+(defmacro gdb-mark-line (line variable)
+  "Set VARIABLE marker to point at beginning of LINE.
+
+If current window has no fringes, inverse colors on LINE.
+
+Return position where LINE begins."
+  `(save-excursion
+     (let* ((posns (gdb-line-posns ,line))
+            (start-posn (car posns))
+            (end-posn (cdr posns)))
+       (set-marker ,variable (copy-marker start-posn))
+       (when (not (> (car (window-fringes)) 0))
+         (put-text-property start-posn end-posn
+                            'font-lock-face '(:inverse-video t)))
+       start-posn)))
+
+(defun gdb-pad-string (string padding)
+  (format (concat "%" (number-to-string padding) "s") string))
+
+;; gdb-table struct is a way to programmatically construct simple
+;; tables. It help to reliably align columns of data in GDB buffers
+;; and provides
+(defstruct
+  gdb-table
+  (column-sizes nil)
+  (rows nil)
+  (row-properties nil)
+  (right-align nil))
+
+(defun gdb-mapcar* (function &rest seqs)
+  "Apply FUNCTION to each element of SEQS, and make a list of the results.
+If there are several SEQS, FUNCTION is called with that many
+arugments, and mapping stops as sson as the shortest list runs
+out."
+  (let ((shortest (apply #'min (mapcar #'length seqs))))
+    (mapcar (lambda (i)
+              (apply function
+                     (mapcar
+                      (lambda (seq)
+                        (nth i seq))
+                      seqs)))
+            (number-sequence 0 (1- shortest)))))
+
+(defun gdb-table-add-row (table row &optional properties)
+  "Add ROW of string to TABLE and recalculate column sizes.
+
+When non-nil, PROPERTIES will be added to the whole row when
+calling `gdb-table-string'."
+  (let ((rows (gdb-table-rows table))
+        (row-properties (gdb-table-row-properties table))
+        (column-sizes (gdb-table-column-sizes table))
+        (right-align (gdb-table-right-align table)))
+    (when (not column-sizes)
+      (setf (gdb-table-column-sizes table)
+            (make-list (length row) 0)))
+    (setf (gdb-table-rows table)
+          (append rows (list row)))
+    (setf (gdb-table-row-properties table)
+          (append row-properties (list properties)))
+    (setf (gdb-table-column-sizes table)
+          (gdb-mapcar* (lambda (x s)
+                     (let ((new-x
+                            (max (abs x) (string-width (or s "")))))
+                       (if right-align new-x (- new-x))))
+                   (gdb-table-column-sizes table)
+                   row))
+    ;; Avoid trailing whitespace at eol
+    (if (not (gdb-table-right-align table))
+        (setcar (last (gdb-table-column-sizes table)) 0))))
+
+(defun gdb-table-string (table &optional sep)
+  "Return TABLE as a string with columns separated with SEP."
+  (let ((column-sizes (gdb-table-column-sizes table))
+        (res ""))
+    (mapconcat
+     'identity
+     (gdb-mapcar*
+      (lambda (row properties)
+        (apply 'propertize
+               (mapconcat 'identity
+                          (gdb-mapcar* (lambda (s x) (gdb-pad-string s x))
+                                       row column-sizes)
+                          sep)
+               properties))
+      (gdb-table-rows table)
+      (gdb-table-row-properties table))
+     "\n")))
+
+;; bindat-get-field goes deep, gdb-get-many-fields goes wide
+(defun gdb-get-many-fields (struct &rest fields)
+  "Return a list of FIELDS values from STRUCT."
+  (let ((values))
+    (dolist (field fields values)
+      (setq values (append values (list (bindat-get-field struct field)))))))
+
+(defmacro def-gdb-auto-update-trigger (trigger-name gdb-command
+                                                    handler-name
+                                                    &optional signal-list)
+  "Define a trigger TRIGGER-NAME which sends GDB-COMMAND and sets
+HANDLER-NAME as its handler. HANDLER-NAME is bound to current
+buffer with `gdb-bind-function-to-buffer'.
+
+If SIGNAL-LIST is non-nil, GDB-COMMAND is sent only when the
+defined trigger is called with an argument from SIGNAL-LIST. It's
+not recommended to define triggers with empty SIGNAL-LIST.
+Normally triggers should respond at least to 'update signal.
+
+Normally the trigger defined by this command must be called from
+the buffer where HANDLER-NAME must work. This should be done so
+that buffer-local thread number may be used in GDB-COMMAND (by
+calling `gdb-current-context-command').
+`gdb-bind-function-to-buffer' is used to achieve this, see
+`gdb-get-buffer-create'.
+
+Triggers defined by this command are meant to be used as a
+trigger argument when describing buffer types with
+`gdb-set-buffer-rules'."
+  `(defun ,trigger-name (&optional signal)
+     (when
+         (or (not ,signal-list)
+             (memq signal ,signal-list))
+       (when (not (gdb-pending-p
+                   (cons (current-buffer) ',trigger-name)))
+         (gdb-input
+          (list ,gdb-command
+                (gdb-bind-function-to-buffer ',handler-name (current-buffer))))
+         (gdb-add-pending (cons (current-buffer) ',trigger-name))))))
+
+;; Used by disassembly buffer only, the rest use
+;; def-gdb-trigger-and-handler
+(defmacro def-gdb-auto-update-handler (handler-name trigger-name custom-defun
+                                                    &optional nopreserve)
+  "Define a handler HANDLER-NAME for TRIGGER-NAME with CUSTOM-DEFUN.
+
+Handlers are normally called from the buffers they put output in.
+
+Delete ((current-buffer) . TRIGGER-NAME) from
+`gdb-pending-triggers', erase current buffer and evaluate
+CUSTOM-DEFUN. Then `gdb-update-buffer-name' is called.
+
+If NOPRESERVE is non-nil, window point is not restored after CUSTOM-DEFUN."
+  `(defun ,handler-name ()
+     (gdb-delete-pending (cons (current-buffer) ',trigger-name))
+     (let* ((buffer-read-only nil)
+            (window (get-buffer-window (current-buffer) 0))
+            (start (window-start window))
+            (p (window-point window)))
+       (erase-buffer)
+       (,custom-defun)
+       (gdb-update-buffer-name)
+       ,(when (not nopreserve)
+          '(set-window-start window start)
+          '(set-window-point window p)))))
+
+(defmacro def-gdb-trigger-and-handler (trigger-name gdb-command
+                                      handler-name custom-defun
+                                       &optional signal-list)
+  "Define trigger and handler.
+
+TRIGGER-NAME trigger is defined to send GDB-COMMAND. See
+`def-gdb-auto-update-trigger'.
+
+HANDLER-NAME handler uses customization of CUSTOM-DEFUN. See
+`def-gdb-auto-update-handler'."
+  `(progn
+     (def-gdb-auto-update-trigger ,trigger-name
+       ,gdb-command
+       ,handler-name ,signal-list)
+     (def-gdb-auto-update-handler ,handler-name
+       ,trigger-name ,custom-defun)))
+
+\f
+
+;; Breakpoint buffer : This displays the output of `-break-list'.
+(def-gdb-trigger-and-handler
+  gdb-invalidate-breakpoints "-break-list"
+  gdb-breakpoints-list-handler gdb-breakpoints-list-handler-custom
+  '(start update))
+
+(gdb-set-buffer-rules
+ 'gdb-breakpoints-buffer
+ 'gdb-breakpoints-buffer-name
+ 'gdb-breakpoints-mode
+ 'gdb-invalidate-breakpoints)
+
+(defun gdb-breakpoints-list-handler-custom ()
+  (let ((breakpoints-list (bindat-get-field
+                           (gdb-json-partial-output "bkpt" "script")
+                           'BreakpointTable 'body))
+        (table (make-gdb-table)))
+    (setq gdb-breakpoints-list nil)
+    (gdb-table-add-row table '("Num" "Type" "Disp" "Enb" "Addr" "Hits" "What"))
+    (dolist (breakpoint breakpoints-list)
+      (add-to-list 'gdb-breakpoints-list
+                   (cons (bindat-get-field breakpoint 'number)
+                         breakpoint))
+      (let ((at (bindat-get-field breakpoint 'at))
+            (pending (bindat-get-field breakpoint 'pending))
+            (func (bindat-get-field breakpoint 'func))
+           (type (bindat-get-field breakpoint 'type)))
+      (gdb-table-add-row table
+       (list
+        (bindat-get-field breakpoint 'number)
+        type
+        (bindat-get-field breakpoint 'disp)
+        (let ((flag (bindat-get-field breakpoint 'enabled)))
+          (if (string-equal flag "y")
+              (propertize "y" 'font-lock-face  font-lock-warning-face)
+            (propertize "n" 'font-lock-face  font-lock-comment-face)))
+        (bindat-get-field breakpoint 'addr)
+        (bindat-get-field breakpoint 'times)
+       (if (string-match ".*watchpoint" type)
+           (bindat-get-field breakpoint 'what)
+         (or pending at
+             (concat "in "
+                     (propertize func 'font-lock-face font-lock-function-name-face)
+                     (gdb-frame-location breakpoint)))))
+       ;; Add clickable properties only for breakpoints with file:line
+       ;; information
+       (append (list 'gdb-breakpoint breakpoint)
+               (when func '(help-echo "mouse-2, RET: visit breakpoint"
+                            mouse-face highlight))))))
+    (insert (gdb-table-string table " "))
+    (gdb-place-breakpoints)))
+
+;; Put breakpoint icons in relevant margins (even those set in the GUD buffer).
+(defun gdb-place-breakpoints ()
+  (let ((flag) (bptno))
+    ;; Remove all breakpoint-icons in source buffers but not assembler buffer.
+    (dolist (buffer (buffer-list))
+      (with-current-buffer buffer
+       (if (and (eq gud-minor-mode 'gdbmi)
+                (not (string-match "\\` ?\\*.+\\*\\'" (buffer-name))))
+           (gdb-remove-breakpoint-icons (point-min) (point-max)))))
+    (dolist (breakpoint gdb-breakpoints-list)
+      (let* ((breakpoint (cdr breakpoint)) ; gdb-breakpoints-list is
+                                           ; an associative list
+             (line (bindat-get-field breakpoint 'line)))
+        (when line
+          (let ((file (bindat-get-field breakpoint 'fullname))
+                (flag (bindat-get-field breakpoint 'enabled))
+                (bptno (bindat-get-field breakpoint 'number)))
+            (unless (file-exists-p file)
+              (setq file (cdr (assoc bptno gdb-location-alist))))
+            (if (and file
+                     (not (string-equal file "File not found")))
+                (with-current-buffer
+                    (find-file-noselect file 'nowarn)
+                  (gdb-init-buffer)
+                  ;; Only want one breakpoint icon at each location.
+                  (gdb-put-breakpoint-icon (string-equal flag "y") bptno
+                                           (string-to-number line)))
+              (gdb-input
+               (list (concat "list " file ":1")
+                     'ignore))
+              (gdb-input
+               (list "-file-list-exec-source-file"
+                     `(lambda () (gdb-get-location
+                                  ,bptno ,line ,flag)))))))))))
+
+(defvar gdb-source-file-regexp "fullname=\"\\(.*?\\)\"")
+
+(defun gdb-get-location (bptno line flag)
+  "Find the directory containing the relevant source file.
+Put in buffer and place breakpoint icon."
+  (goto-char (point-min))
+  (catch 'file-not-found
+    (if (re-search-forward gdb-source-file-regexp nil t)
+       (delete (cons bptno "File not found") gdb-location-alist)
+       (push (cons bptno (match-string 1)) gdb-location-alist)
+      (gdb-resync)
+      (unless (assoc bptno gdb-location-alist)
+       (push (cons bptno "File not found") gdb-location-alist)
+       (message-box "Cannot find source file for breakpoint location.
+Add directory to search path for source files using the GDB command, dir."))
+      (throw 'file-not-found nil))
+    (with-current-buffer (find-file-noselect (match-string 1))
+      (gdb-init-buffer)
+      ;; only want one breakpoint icon at each location
+      (gdb-put-breakpoint-icon (eq flag ?y) bptno (string-to-number line)))))
+
+(add-hook 'find-file-hook 'gdb-find-file-hook)
+
+(defun gdb-find-file-hook ()
+  "Set up buffer for debugging if file is part of the source code
+of the current session."
+  (if (and (buffer-name gud-comint-buffer)
+          ;; in case gud or gdb-ui is just loaded
+          gud-comint-buffer
+          (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer)
+              'gdbmi))
+      (if (member buffer-file-name gdb-source-file-list)
+         (with-current-buffer (find-buffer-visiting buffer-file-name)
+           (gdb-init-buffer)))))
+
+(declare-function gud-remove "gdb-mi" t t) ; gud-def
+(declare-function gud-break  "gdb-mi" t t) ; gud-def
+(declare-function fringe-bitmaps-at-pos "fringe.c" (&optional pos window))
+
+(defun gdb-mouse-set-clear-breakpoint (event)
+  "Set/clear breakpoint in left fringe/margin at mouse click.
+If not in a source or disassembly buffer just set point."
+  (interactive "e")
+  (mouse-minibuffer-check event)
+  (let ((posn (event-end event)))
+    (with-selected-window (posn-window posn)
+      (if (or (buffer-file-name) (eq major-mode 'gdb-disassembly-mode))
+         (if (numberp (posn-point posn))
+             (save-excursion
+               (goto-char (posn-point posn))
+               (if (or (posn-object posn)
+                       (eq (car (fringe-bitmaps-at-pos (posn-point posn)))
+                           'breakpoint))
+                   (gud-remove nil)
+                 (gud-break nil)))))
+      (posn-set-point posn))))
+
+(defun gdb-mouse-toggle-breakpoint-margin (event)
+  "Enable/disable breakpoint in left margin with mouse click."
+  (interactive "e")
+  (mouse-minibuffer-check event)
+  (let ((posn (event-end event)))
+    (if (numberp (posn-point posn))
+       (with-selected-window (posn-window posn)
+         (save-excursion
+           (goto-char (posn-point posn))
+           (if (posn-object posn)
+               (gud-basic-call
+                (let ((bptno (get-text-property
+                              0 'gdb-bptno (car (posn-string posn)))))
+                  (concat
+                   (if (get-text-property
+                        0 'gdb-enabled (car (posn-string posn)))
+                       "-break-disable "
+                     "-break-enable ")
+                   bptno)))))))))
+
+(defun gdb-mouse-toggle-breakpoint-fringe (event)
+  "Enable/disable breakpoint in left fringe with mouse click."
+  (interactive "e")
+  (mouse-minibuffer-check event)
+  (let* ((posn (event-end event))
+        (pos (posn-point posn))
+        obj)
+    (when (numberp pos)
+      (with-selected-window (posn-window posn)
+       (with-current-buffer (window-buffer (selected-window))
+         (goto-char pos)
+         (dolist (overlay (overlays-in pos pos))
+           (when (overlay-get overlay 'put-break)
+             (setq obj (overlay-get overlay 'before-string))))
+         (when (stringp obj)
+           (gud-basic-call
+            (concat
+             (if (get-text-property 0 'gdb-enabled obj)
+                 "-break-disable "
+               "-break-enable ")
+              (get-text-property 0 'gdb-bptno obj)))))))))
+
+(defun gdb-breakpoints-buffer-name ()
+  (concat "*breakpoints of " (gdb-get-target-string) "*"))
+
+(def-gdb-display-buffer
+ gdb-display-breakpoints-buffer
+ 'gdb-breakpoints-buffer
+ "Display status of user-settable breakpoints.")
+
+(def-gdb-frame-for-buffer
+ gdb-frame-breakpoints-buffer
+ 'gdb-breakpoints-buffer
+ "Display status of user-settable breakpoints in a new frame.")
+
+(defvar gdb-breakpoints-mode-map
+  (let ((map (make-sparse-keymap))
+       (menu (make-sparse-keymap "Breakpoints")))
+    (define-key menu [quit] '("Quit"   . gdb-delete-frame-or-window))
+    (define-key menu [goto] '("Goto"   . gdb-goto-breakpoint))
+    (define-key menu [delete] '("Delete" . gdb-delete-breakpoint))
+    (define-key menu [toggle] '("Toggle" . gdb-toggle-breakpoint))
+    (suppress-keymap map)
+    (define-key map [menu-bar breakpoints] (cons "Breakpoints" menu))
+    (define-key map " " 'gdb-toggle-breakpoint)
+    (define-key map "D" 'gdb-delete-breakpoint)
+    ;; Don't bind "q" to kill-this-buffer as we need it for breakpoint icons.
+    (define-key map "q" 'gdb-delete-frame-or-window)
+    (define-key map "\r" 'gdb-goto-breakpoint)
+    (define-key map "\t" '(lambda ()
+                            (interactive)
+                            (gdb-set-window-buffer
+                             (gdb-get-buffer-create 'gdb-threads-buffer) t)))
+    (define-key map [mouse-2] 'gdb-goto-breakpoint)
+    (define-key map [follow-link] 'mouse-face)
+    map))
+
+(defun gdb-delete-frame-or-window ()
+  "Delete frame if there is only one window.  Otherwise delete the window."
+  (interactive)
+  (if (one-window-p) (delete-frame)
+    (delete-window)))
+
+;;from make-mode-line-mouse-map
+(defun gdb-make-header-line-mouse-map (mouse function) "\
+Return a keymap with single entry for mouse key MOUSE on the header line.
+MOUSE is defined to run function FUNCTION with no args in the buffer
+corresponding to the mode line clicked."
+  (let ((map (make-sparse-keymap)))
+    (define-key map (vector 'header-line mouse) function)
+    (define-key map (vector 'header-line 'down-mouse-1) 'ignore)
+    map))
+
+(defmacro gdb-propertize-header (name buffer help-echo mouse-face face)
+  `(propertize ,name
+              'help-echo ,help-echo
+              'mouse-face ',mouse-face
+              'face ',face
+              'local-map
+              (gdb-make-header-line-mouse-map
+               'mouse-1
+               (lambda (event) (interactive "e")
+                 (save-selected-window
+                   (select-window (posn-window (event-start event)))
+                    (gdb-set-window-buffer
+                     (gdb-get-buffer-create ',buffer) t) )))))
+
+\f
+;; uses "-thread-info". Needs GDB 7.0 onwards.
+;;; Threads view
+
+(defun gdb-threads-buffer-name ()
+  (concat "*threads of " (gdb-get-target-string) "*"))
+
+(def-gdb-display-buffer
+ gdb-display-threads-buffer
+ 'gdb-threads-buffer
+ "Display GDB threads.")
+
+(def-gdb-frame-for-buffer
+ gdb-frame-threads-buffer
+ 'gdb-threads-buffer
+ "Display GDB threads in a new frame.")
+
+(def-gdb-trigger-and-handler
+  gdb-invalidate-threads (gdb-current-context-command "-thread-info")
+  gdb-thread-list-handler gdb-thread-list-handler-custom
+  '(start update update-threads))
+
+(gdb-set-buffer-rules
+ 'gdb-threads-buffer
+ 'gdb-threads-buffer-name
+ 'gdb-threads-mode
+ 'gdb-invalidate-threads)
+
+(defvar gdb-threads-font-lock-keywords
+  '(("in \\([^ ]+\\)"  (1 font-lock-function-name-face))
+    (" \\(stopped\\)"  (1 font-lock-warning-face))
+    (" \\(running\\)"  (1 font-lock-string-face))
+    ("\\(\\(\\sw\\|[_.]\\)+\\)="  (1 font-lock-variable-name-face)))
+  "Font lock keywords used in `gdb-threads-mode'.")
+
+(defvar gdb-threads-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map "\r" 'gdb-select-thread)
+    (define-key map "f" 'gdb-display-stack-for-thread)
+    (define-key map "F" 'gdb-frame-stack-for-thread)
+    (define-key map "l" 'gdb-display-locals-for-thread)
+    (define-key map "L" 'gdb-frame-locals-for-thread)
+    (define-key map "r" 'gdb-display-registers-for-thread)
+    (define-key map "R" 'gdb-frame-registers-for-thread)
+    (define-key map "d" 'gdb-display-disassembly-for-thread)
+    (define-key map "D" 'gdb-frame-disassembly-for-thread)
+    (define-key map "i" 'gdb-interrupt-thread)
+    (define-key map "c" 'gdb-continue-thread)
+    (define-key map "s" 'gdb-step-thread)
+    (define-key map "\t" '(lambda ()
+                            (interactive)
+                            (gdb-set-window-buffer
+                             (gdb-get-buffer-create 'gdb-breakpoints-buffer) t)))
+    (define-key map [mouse-2] 'gdb-select-thread)
+    (define-key map [follow-link] 'mouse-face)
+    map))
+
+(defvar gdb-threads-header
+  (list
+   (gdb-propertize-header "Breakpoints" gdb-breakpoints-buffer
+                         "mouse-1: select" mode-line-highlight mode-line-inactive)
+   " "
+   (gdb-propertize-header "Threads" gdb-threads-buffer
+                         nil nil mode-line)))
+
+(define-derived-mode gdb-threads-mode gdb-parent-mode "Threads"
+  "Major mode for GDB threads.
+
+\\{gdb-threads-mode-map}"
+  (setq gdb-thread-position (make-marker))
+  (add-to-list 'overlay-arrow-variable-list 'gdb-thread-position)
+  (setq header-line-format gdb-threads-header)
+  (set (make-local-variable 'font-lock-defaults)
+       '(gdb-threads-font-lock-keywords))
+  (run-mode-hooks 'gdb-threads-mode-hook)
+  'gdb-invalidate-threads)
+
+(defun gdb-thread-list-handler-custom ()
+  (let ((threads-list (bindat-get-field (gdb-json-partial-output) 'threads))
+        (table (make-gdb-table))
+        (marked-line nil))
+    (setq gdb-threads-list nil)
+    (setq gdb-running-threads-count 0)
+    (setq gdb-stopped-threads-count 0)
+    (set-marker gdb-thread-position nil)
+
+    (dolist (thread (reverse threads-list))
+      (let ((running (string-equal (bindat-get-field thread 'state) "running")))
+      (add-to-list 'gdb-threads-list
+                   (cons (bindat-get-field thread 'id)
+                         thread))
+      (if running
+          (incf gdb-running-threads-count)
+        (incf gdb-stopped-threads-count))
+
+      (gdb-table-add-row table
+       (list
+        (bindat-get-field thread 'id)
+        (concat
+         (if gdb-thread-buffer-verbose-names
+             (concat (bindat-get-field thread 'target-id) " ") "")
+         (bindat-get-field thread 'state)
+         ;; Include frame information for stopped threads
+         (if (not running)
+             (concat
+              " in " (bindat-get-field thread 'frame 'func)
+              (if gdb-thread-buffer-arguments
+                  (concat
+                   " ("
+                   (let ((args (bindat-get-field thread 'frame 'args)))
+                     (mapconcat
+                      (lambda (arg)
+                        (apply 'format `("%s=%s" ,@(gdb-get-many-fields arg 'name 'value))))
+                      args ","))
+                   ")")
+                "")
+              (if gdb-thread-buffer-locations
+                  (gdb-frame-location (bindat-get-field thread 'frame)) "")
+              (if gdb-thread-buffer-addresses
+                  (concat " at " (bindat-get-field thread 'frame 'addr)) ""))
+           "")))
+       (list
+        'gdb-thread thread
+        'mouse-face 'highlight
+        'help-echo "mouse-2, RET: select thread")))
+      (when (string-equal gdb-thread-number
+                          (bindat-get-field thread 'id))
+        (setq marked-line (length gdb-threads-list))))
+    (insert (gdb-table-string table " "))
+    (when marked-line
+      (gdb-mark-line marked-line gdb-thread-position)))
+  ;; We update gud-running here because we need to make sure that
+  ;; gdb-threads-list is up-to-date
+  (gdb-update-gud-running)
+  (gdb-emit-signal gdb-buf-publisher 'update-disassembly))
+
+(defmacro def-gdb-thread-buffer-command (name custom-defun &optional doc)
+  "Define a NAME command which will act upon thread on the current line.
+
+CUSTOM-DEFUN may use locally bound `thread' variable, which will
+be the value of 'gdb-thread property of the current line. If
+'gdb-thread is nil, error is signaled."
+  `(defun ,name (&optional event)
+     ,(when doc doc)
+     (interactive (list last-input-event))
+     (if event (posn-set-point (event-end event)))
+     (save-excursion
+       (beginning-of-line)
+       (let ((thread (get-text-property (point) 'gdb-thread)))
+         (if thread
+             ,custom-defun
+           (error "Not recognized as thread line"))))))
+
+(defmacro def-gdb-thread-buffer-simple-command (name buffer-command &optional doc)
+  "Define a NAME which will call BUFFER-COMMAND with id of thread
+on the current line."
+  `(def-gdb-thread-buffer-command ,name
+     (,buffer-command (bindat-get-field thread 'id))
+     ,doc))
+
+(def-gdb-thread-buffer-command gdb-select-thread
+  (let ((new-id (bindat-get-field thread 'id)))
+    (gdb-setq-thread-number new-id)
+    (gdb-input (list (concat "-thread-select " new-id) 'ignore))
+    (gdb-update))
+  "Select the thread at current line of threads buffer.")
+
+(def-gdb-thread-buffer-simple-command
+  gdb-display-stack-for-thread
+  gdb-preemptively-display-stack-buffer
+  "Display stack buffer for the thread at current line.")
+
+(def-gdb-thread-buffer-simple-command
+  gdb-display-locals-for-thread
+  gdb-preemptively-display-locals-buffer
+  "Display locals buffer for the thread at current line.")
+
+(def-gdb-thread-buffer-simple-command
+  gdb-display-registers-for-thread
+  gdb-preemptively-display-registers-buffer
+  "Display registers buffer for the thread at current line.")
+
+(def-gdb-thread-buffer-simple-command
+  gdb-display-disassembly-for-thread
+  gdb-preemptively-display-disassembly-buffer
+  "Display disassembly buffer for the thread at current line.")
+
+(def-gdb-thread-buffer-simple-command
+  gdb-frame-stack-for-thread
+  gdb-frame-stack-buffer
+  "Display a new frame with stack buffer for the thread at
+current line.")
+
+(def-gdb-thread-buffer-simple-command
+  gdb-frame-locals-for-thread
+  gdb-frame-locals-buffer
+  "Display a new frame with locals buffer for the thread at
+current line.")
+
+(def-gdb-thread-buffer-simple-command
+  gdb-frame-registers-for-thread
+  gdb-frame-registers-buffer
+  "Display a new frame with registers buffer for the thread at
+current line.")
+
+(def-gdb-thread-buffer-simple-command
+  gdb-frame-disassembly-for-thread
+  gdb-frame-disassembly-buffer
+  "Display a new frame with disassembly buffer for the thread at
+current line.")
+
+(defmacro def-gdb-thread-buffer-gud-command (name gud-command &optional doc)
+  "Define a NAME which will execute GUD-COMMAND with
+`gdb-thread-number' locally bound to id of thread on the current
+line."
+  `(def-gdb-thread-buffer-command ,name
+     (if gdb-non-stop
+         (let ((gdb-thread-number (bindat-get-field thread 'id))
+               (gdb-gud-control-all-threads nil))
+           (call-interactively #',gud-command))
+       (error "Available in non-stop mode only, customize `gdb-non-stop-setting'"))
+     ,doc))
+
+(def-gdb-thread-buffer-gud-command
+  gdb-interrupt-thread
+  gud-stop-subjob
+  "Interrupt thread at current line.")
+
+(def-gdb-thread-buffer-gud-command
+  gdb-continue-thread
+  gud-cont
+  "Continue thread at current line.")
+
+(def-gdb-thread-buffer-gud-command
+  gdb-step-thread
+  gud-step
+  "Step thread at current line.")
+
+\f
+;;; Memory view
+
+(defcustom gdb-memory-rows 8
+  "Number of data rows in memory window."
+  :type 'integer
+  :group 'gud
+  :version "23.2")
+
+(defcustom gdb-memory-columns 4
+  "Number of data columns in memory window."
+  :type 'integer
+  :group 'gud
+  :version "23.2")
+
+(defcustom gdb-memory-format "x"
+  "Display format of data items in memory window."
+  :type '(choice (const :tag "Hexadecimal" "x")
+                (const :tag "Signed decimal" "d")
+                (const :tag "Unsigned decimal" "u")
+                (const :tag "Octal" "o")
+                (const :tag "Binary" "t"))
+  :group 'gud
+  :version "22.1")
+
+(defcustom gdb-memory-unit 4
+  "Unit size of data items in memory window."
+  :type '(choice (const :tag "Byte" 1)
+                (const :tag "Halfword" 2)
+                (const :tag "Word" 4)
+                (const :tag "Giant word" 8))
+  :group 'gud
+  :version "23.2")
+
+(def-gdb-trigger-and-handler
+  gdb-invalidate-memory
+  (format "-data-read-memory %s %s %d %d %d"
+          gdb-memory-address
+          gdb-memory-format
+          gdb-memory-unit
+          gdb-memory-rows
+          gdb-memory-columns)
+  gdb-read-memory-handler
+  gdb-read-memory-custom
+  '(start update))
+
+(gdb-set-buffer-rules
+ 'gdb-memory-buffer
+ 'gdb-memory-buffer-name
+ 'gdb-memory-mode
+ 'gdb-invalidate-memory)
+
+(defun gdb-memory-column-width (size format)
+  "Return length of string with memory unit of SIZE in FORMAT.
+
+SIZE is in bytes, as in `gdb-memory-unit'. FORMAT is a string as
+in `gdb-memory-format'."
+  (let ((format-base (cdr (assoc format
+                                 '(("x" . 16)
+                                   ("d" . 10) ("u" . 10)
+                                   ("o" . 8)
+                                   ("t" . 2))))))
+    (if format-base
+        (let ((res (ceiling (log (expt 2.0 (* size 8)) format-base))))
+          (cond ((string-equal format "x")
+                 (+ 2 res)) ; hexadecimal numbers have 0x in front
+                ((or (string-equal format "d")
+                     (string-equal format "o"))
+                 (1+ res))
+                (t res)))
+      (error "Unknown format"))))
+
+(defun gdb-read-memory-custom ()
+  (let* ((res (gdb-json-partial-output))
+         (err-msg (bindat-get-field res 'msg)))
+    (if (not err-msg)
+        (let ((memory (bindat-get-field res 'memory)))
+          (setq gdb-memory-address (bindat-get-field res 'addr))
+          (setq gdb-memory-next-page (bindat-get-field res 'next-page))
+          (setq gdb-memory-prev-page (bindat-get-field res 'prev-page))
+          (setq gdb-memory-last-address gdb-memory-address)
+        (dolist (row memory)
+          (insert (concat (bindat-get-field row 'addr) ":"))
+          (dolist (column (bindat-get-field row 'data))
+            (insert (gdb-pad-string column
+                                    (+ 2 (gdb-memory-column-width
+                                          gdb-memory-unit
+                                          gdb-memory-format)))))
+          (newline)))
+      ;; Show last page instead of empty buffer when out of bounds
+      (progn
+        (let ((gdb-memory-address gdb-memory-last-address))
+          (gdb-invalidate-memory 'update)
+          (error err-msg))))))
+
+(defvar gdb-memory-mode-map
+  (let ((map (make-sparse-keymap)))
+    (suppress-keymap map t)
+    (define-key map "q" 'kill-this-buffer)
+    (define-key map "n" 'gdb-memory-show-next-page)
+    (define-key map "p" 'gdb-memory-show-previous-page)
+    (define-key map "a" 'gdb-memory-set-address)
+    (define-key map "t" 'gdb-memory-format-binary)
+    (define-key map "o" 'gdb-memory-format-octal)
+    (define-key map "u" 'gdb-memory-format-unsigned)
+    (define-key map "d" 'gdb-memory-format-signed)
+    (define-key map "x" 'gdb-memory-format-hexadecimal)
+    (define-key map "b" 'gdb-memory-unit-byte)
+    (define-key map "h" 'gdb-memory-unit-halfword)
+    (define-key map "w" 'gdb-memory-unit-word)
+    (define-key map "g" 'gdb-memory-unit-giant)
+    (define-key map "R" 'gdb-memory-set-rows)
+    (define-key map "C" 'gdb-memory-set-columns)
+     map))
+
+(defun gdb-memory-set-address-event (event)
+  "Handle a click on address field in memory buffer header."
+  (interactive "e")
+  (save-selected-window
+    (select-window (posn-window (event-start event)))
+    (gdb-memory-set-address)))
+
+;; Non-event version for use within keymap
+(defun gdb-memory-set-address ()
+  "Set the start memory address."
+  (interactive)
+  (let ((arg (read-from-minibuffer "Memory address: ")))
+    (setq gdb-memory-address arg))
+  (gdb-invalidate-memory 'update))
+
+(defmacro def-gdb-set-positive-number (name variable echo-string &optional doc)
+  "Define a function NAME which reads new VAR value from minibuffer."
+  `(defun ,name (event)
+     ,(when doc doc)
+     (interactive "e")
+     (save-selected-window
+       (select-window (posn-window (event-start event)))
+       (let* ((arg (read-from-minibuffer ,echo-string))
+              (count (string-to-number arg)))
+         (if (<= count 0)
+             (error "Positive number only")
+           (customize-set-variable ',variable count)
+           (gdb-invalidate-memory 'update))))))
+
+(def-gdb-set-positive-number
+  gdb-memory-set-rows
+  gdb-memory-rows
+  "Rows: "
+  "Set the number of data rows in memory window.")
+
+(def-gdb-set-positive-number
+  gdb-memory-set-columns
+  gdb-memory-columns
+  "Columns: "
+  "Set the number of data columns in memory window.")
+
+(defmacro def-gdb-memory-format (name format doc)
+  "Define a function NAME to switch memory buffer to use FORMAT.
+
+DOC is an optional documentation string."
+  `(defun ,name () ,(when doc doc)
+     (interactive)
+     (customize-set-variable 'gdb-memory-format ,format)
+     (gdb-invalidate-memory 'update)))
+
+(def-gdb-memory-format
+  gdb-memory-format-binary "t"
+  "Set the display format to binary.")
+
+(def-gdb-memory-format
+  gdb-memory-format-octal "o"
+  "Set the display format to octal.")
+
+(def-gdb-memory-format
+  gdb-memory-format-unsigned "u"
+  "Set the display format to unsigned decimal.")
+
+(def-gdb-memory-format
+  gdb-memory-format-signed "d"
+  "Set the display format to decimal.")
+
+(def-gdb-memory-format
+  gdb-memory-format-hexadecimal "x"
+  "Set the display format to hexadecimal.")
+
+(defvar gdb-memory-format-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map [header-line down-mouse-3] 'gdb-memory-format-menu-1)
+    map)
+  "Keymap to select format in the header line.")
+
+(defvar gdb-memory-format-menu (make-sparse-keymap "Format")
+  "Menu of display formats in the header line.")
+
+(define-key gdb-memory-format-menu [binary]
+  '(menu-item "Binary" gdb-memory-format-binary
+             :button (:radio . (equal gdb-memory-format "t"))))
+(define-key gdb-memory-format-menu [octal]
+  '(menu-item "Octal" gdb-memory-format-octal
+             :button (:radio . (equal gdb-memory-format "o"))))
+(define-key gdb-memory-format-menu [unsigned]
+  '(menu-item "Unsigned Decimal" gdb-memory-format-unsigned
+             :button (:radio . (equal gdb-memory-format "u"))))
+(define-key gdb-memory-format-menu [signed]
+  '(menu-item "Signed Decimal" gdb-memory-format-signed
+             :button (:radio . (equal gdb-memory-format "d"))))
+(define-key gdb-memory-format-menu [hexadecimal]
+  '(menu-item "Hexadecimal" gdb-memory-format-hexadecimal
+             :button (:radio . (equal gdb-memory-format "x"))))
+
+(defun gdb-memory-format-menu (event)
+  (interactive "@e")
+  (x-popup-menu event gdb-memory-format-menu))
+
+(defun gdb-memory-format-menu-1 (event)
+  (interactive "e")
+  (save-selected-window
+    (select-window (posn-window (event-start event)))
+    (let* ((selection (gdb-memory-format-menu event))
+          (binding (and selection (lookup-key gdb-memory-format-menu
+                                              (vector (car selection))))))
+      (if binding (call-interactively binding)))))
+
+(defmacro def-gdb-memory-unit (name unit-size doc)
+  "Define a function NAME to switch memory unit size to UNIT-SIZE.
+
+DOC is an optional documentation string."
+  `(defun ,name () ,(when doc doc)
+     (interactive)
+     (customize-set-variable 'gdb-memory-unit ,unit-size)
+     (gdb-invalidate-memory 'update)))
+
+(def-gdb-memory-unit gdb-memory-unit-giant 8
+  "Set the unit size to giant words (eight bytes).")
+
+(def-gdb-memory-unit gdb-memory-unit-word 4
+  "Set the unit size to words (four bytes).")
+
+(def-gdb-memory-unit gdb-memory-unit-halfword 2
+  "Set the unit size to halfwords (two bytes).")
+
+(def-gdb-memory-unit gdb-memory-unit-byte 1
+  "Set the unit size to bytes.")
+
+(defmacro def-gdb-memory-show-page (name address-var &optional doc)
+  "Define a function NAME which show new address in memory buffer.
+
+The defined function switches Memory buffer to show address
+stored in ADDRESS-VAR variable.
+
+DOC is an optional documentation string."
+  `(defun ,name
+     ,(when doc doc)
+     (interactive)
+     (let ((gdb-memory-address ,address-var))
+       (gdb-invalidate-memory))))
+
+(def-gdb-memory-show-page gdb-memory-show-previous-page
+  gdb-memory-prev-page)
+
+(def-gdb-memory-show-page gdb-memory-show-next-page
+  gdb-memory-next-page)
+
+(defvar gdb-memory-unit-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map [header-line down-mouse-3] 'gdb-memory-unit-menu-1)
+    map)
+  "Keymap to select units in the header line.")
+
+(defvar gdb-memory-unit-menu (make-sparse-keymap "Unit")
+  "Menu of units in the header line.")
+
+(define-key gdb-memory-unit-menu [giantwords]
+  '(menu-item "Giant words" gdb-memory-unit-giant
+             :button (:radio . (equal gdb-memory-unit 8))))
+(define-key gdb-memory-unit-menu [words]
+  '(menu-item "Words" gdb-memory-unit-word
+             :button (:radio . (equal gdb-memory-unit 4))))
+(define-key gdb-memory-unit-menu [halfwords]
+  '(menu-item "Halfwords" gdb-memory-unit-halfword
+             :button (:radio . (equal gdb-memory-unit 2))))
+(define-key gdb-memory-unit-menu [bytes]
+  '(menu-item "Bytes" gdb-memory-unit-byte
+             :button (:radio . (equal gdb-memory-unit 1))))
+
+(defun gdb-memory-unit-menu (event)
+  (interactive "@e")
+  (x-popup-menu event gdb-memory-unit-menu))
+
+(defun gdb-memory-unit-menu-1 (event)
+  (interactive "e")
+  (save-selected-window
+    (select-window (posn-window (event-start event)))
+    (let* ((selection (gdb-memory-unit-menu event))
+          (binding (and selection (lookup-key gdb-memory-unit-menu
+                                              (vector (car selection))))))
+      (if binding (call-interactively binding)))))
+
+(defvar gdb-memory-font-lock-keywords
+  '(;; <__function.name+n>
+    ("<\\(\\(\\sw\\|[_.]\\)+\\)\\(\\+[0-9]+\\)?>" (1 font-lock-function-name-face))
+    )
+  "Font lock keywords used in `gdb-memory-mode'.")
+
+(defvar gdb-memory-header
+  '(:eval
+    (concat
+     "Start address["
+     (propertize "-"
+                  'face font-lock-warning-face
+                  'help-echo "mouse-1: decrement address"
+                  'mouse-face 'mode-line-highlight
+                  'local-map (gdb-make-header-line-mouse-map
+                              'mouse-1
+                              #'gdb-memory-show-previous-page))
+     "|"
+     (propertize "+"
+                  'face font-lock-warning-face
+                  'help-echo "mouse-1: increment address"
+                 'mouse-face 'mode-line-highlight
+                 'local-map (gdb-make-header-line-mouse-map
+                             'mouse-1
+                             #'gdb-memory-show-next-page))
+    "]: "
+    (propertize gdb-memory-address
+                 'face font-lock-warning-face
+                 'help-echo "mouse-1: set start address"
+                 'mouse-face 'mode-line-highlight
+                 'local-map (gdb-make-header-line-mouse-map
+                             'mouse-1
+                             #'gdb-memory-set-address-event))
+    "  Rows: "
+    (propertize (number-to-string gdb-memory-rows)
+                 'face font-lock-warning-face
+                 'help-echo "mouse-1: set number of columns"
+                 'mouse-face 'mode-line-highlight
+                 'local-map (gdb-make-header-line-mouse-map
+                             'mouse-1
+                             #'gdb-memory-set-rows))
+    "  Columns: "
+    (propertize (number-to-string gdb-memory-columns)
+                 'face font-lock-warning-face
+                 'help-echo "mouse-1: set number of columns"
+                 'mouse-face 'mode-line-highlight
+                 'local-map (gdb-make-header-line-mouse-map
+                             'mouse-1
+                             #'gdb-memory-set-columns))
+    "  Display Format: "
+    (propertize gdb-memory-format
+                 'face font-lock-warning-face
+                 'help-echo "mouse-3: select display format"
+                 'mouse-face 'mode-line-highlight
+                 'local-map gdb-memory-format-map)
+    "  Unit Size: "
+    (propertize (number-to-string gdb-memory-unit)
+                 'face font-lock-warning-face
+                 'help-echo "mouse-3: select unit size"
+                 'mouse-face 'mode-line-highlight
+                 'local-map gdb-memory-unit-map)))
+  "Header line used in `gdb-memory-mode'.")
+
+(define-derived-mode gdb-memory-mode gdb-parent-mode "Memory"
+  "Major mode for examining memory.
+
+\\{gdb-memory-mode-map}"
+  (setq header-line-format gdb-memory-header)
+  (set (make-local-variable 'font-lock-defaults)
+       '(gdb-memory-font-lock-keywords))
+  (run-mode-hooks 'gdb-memory-mode-hook)
+  'gdb-invalidate-memory)
+
+(defun gdb-memory-buffer-name ()
+  (concat "*memory of " (gdb-get-target-string) "*"))
+
+(def-gdb-display-buffer
+  gdb-display-memory-buffer
+  'gdb-memory-buffer
+  "Display memory contents.")
+
+(defun gdb-frame-memory-buffer ()
+  "Display memory contents in a new frame."
+  (interactive)
+  (let* ((special-display-regexps (append special-display-regexps '(".*")))
+        (special-display-frame-alist
+         `((left-fringe . 0)
+            (right-fringe . 0)
+            (width . 83)
+            ,@gdb-frame-parameters)))
+    (display-buffer (gdb-get-buffer-create 'gdb-memory-buffer))))
+
+\f
+;;; Disassembly view
+
+(defun gdb-disassembly-buffer-name ()
+  (gdb-current-context-buffer-name
+   (concat "disassembly of " (gdb-get-target-string))))
+
+(def-gdb-display-buffer
+ gdb-display-disassembly-buffer
+ 'gdb-disassembly-buffer
+ "Display disassembly for current stack frame.")
+
+(def-gdb-preempt-display-buffer
+  gdb-preemptively-display-disassembly-buffer
+  'gdb-disassembly-buffer)
+
+(def-gdb-frame-for-buffer
+ gdb-frame-disassembly-buffer
+ 'gdb-disassembly-buffer
+ "Display disassembly in a new frame.")
+
+(def-gdb-auto-update-trigger gdb-invalidate-disassembly
+  (let* ((frame (gdb-current-buffer-frame))
+         (file (bindat-get-field frame 'fullname))
+         (line (bindat-get-field frame 'line)))
+    (when file
+      (format "-data-disassemble -f %s -l %s -n -1 -- 0" file line)))
+  gdb-disassembly-handler
+  ;; We update disassembly only after we have actual frame information
+  ;; about all threads, so no there's `update' signal in this list
+  '(start update-disassembly))
+
+(def-gdb-auto-update-handler
+  gdb-disassembly-handler
+  gdb-invalidate-disassembly
+  gdb-disassembly-handler-custom
+  t)
+
+(gdb-set-buffer-rules
+ 'gdb-disassembly-buffer
+ 'gdb-disassembly-buffer-name
+ 'gdb-disassembly-mode
+ 'gdb-invalidate-disassembly)
+
+(defvar gdb-disassembly-font-lock-keywords
+  '(;; <__function.name+n>
+    ("<\\(\\(\\sw\\|[_.]\\)+\\)\\(\\+[0-9]+\\)?>"
+     (1 font-lock-function-name-face))
+    ;; 0xNNNNNNNN <__function.name+n>: opcode
+    ("^0x[0-9a-f]+ \\(<\\(\\(\\sw\\|[_.]\\)+\\)\\+[0-9]+>\\)?:[ \t]+\\(\\sw+\\)"
+     (4 font-lock-keyword-face))
+    ;; %register(at least i386)
+    ("%\\sw+" . font-lock-variable-name-face)
+    ("^\\(Dump of assembler code for function\\) \\(.+\\):"
+     (1 font-lock-comment-face)
+     (2 font-lock-function-name-face))
+    ("^\\(End of assembler dump\\.\\)" . font-lock-comment-face))
+  "Font lock keywords used in `gdb-disassembly-mode'.")
+
+(defvar gdb-disassembly-mode-map
+  ;; TODO
+  (let ((map (make-sparse-keymap)))
+    (suppress-keymap map)
+    (define-key map "q" 'kill-this-buffer)
+     map))
+
+(define-derived-mode gdb-disassembly-mode gdb-parent-mode "Disassembly"
+  "Major mode for GDB disassembly information.
+
+\\{gdb-disassembly-mode-map}"
+  ;; TODO Rename overlay variable for disassembly mode
+  (add-to-list 'overlay-arrow-variable-list 'gdb-disassembly-position)
+  (setq fringes-outside-margins t)
+  (set (make-local-variable 'gdb-disassembly-position) (make-marker))
+  (set (make-local-variable 'font-lock-defaults)
+       '(gdb-disassembly-font-lock-keywords))
+  (run-mode-hooks 'gdb-disassembly-mode-hook)
+  'gdb-invalidate-disassembly)
+
+(defun gdb-disassembly-handler-custom ()
+  (let* ((instructions (bindat-get-field (gdb-json-partial-output) 'asm_insns))
+         (address (bindat-get-field (gdb-current-buffer-frame) 'addr))
+         (pos 1)
+         (table (make-gdb-table))
+         (marked-line nil))
+      (dolist (instr instructions)
+      (gdb-table-add-row table
+       (list
+        (bindat-get-field instr 'address)
+        (apply 'format `("<%s+%s>:" ,@(gdb-get-many-fields instr 'func-name 'offset)))
+        (bindat-get-field instr 'inst)))
+      (when (string-equal (bindat-get-field instr 'address)
+                          address)
+        (progn
+          (setq marked-line (length (gdb-table-rows table)))
+          (setq fringe-indicator-alist
+                (if (string-equal gdb-frame-number "0")
+                    nil
+                  '((overlay-arrow . hollow-right-triangle)))))))
+      (insert (gdb-table-string table " "))
+      (gdb-disassembly-place-breakpoints)
+      ;; Mark current position with overlay arrow and scroll window to
+      ;; that point
+      (when marked-line
+        (let ((window (get-buffer-window (current-buffer) 0)))
+          (set-window-point window (gdb-mark-line marked-line gdb-disassembly-position))))
+      (setq mode-name
+            (gdb-current-context-mode-name
+            (concat "Disassembly: "
+                    (bindat-get-field (gdb-current-buffer-frame) 'func))))))
+
+(defun gdb-disassembly-place-breakpoints ()
+  (gdb-remove-breakpoint-icons (point-min) (point-max))
+  (dolist (breakpoint gdb-breakpoints-list)
+    (let* ((breakpoint (cdr breakpoint))
+           (bptno (bindat-get-field breakpoint 'number))
+           (flag (bindat-get-field breakpoint 'enabled))
+           (address (bindat-get-field breakpoint 'addr)))
+      (save-excursion
+        (goto-char (point-min))
+        (if (re-search-forward (concat "^" address) nil t)
+            (gdb-put-breakpoint-icon (string-equal flag "y") bptno))))))
+
+\f
+(defvar gdb-breakpoints-header
+  (list
+   (gdb-propertize-header "Breakpoints" gdb-breakpoints-buffer
+                         nil nil mode-line)
+   " "
+   (gdb-propertize-header "Threads" gdb-threads-buffer
+                         "mouse-1: select" mode-line-highlight mode-line-inactive)))
+
+;;; Breakpoints view
+(define-derived-mode gdb-breakpoints-mode gdb-parent-mode "Breakpoints"
+  "Major mode for gdb breakpoints.
+
+\\{gdb-breakpoints-mode-map}"
+  (setq header-line-format gdb-breakpoints-header)
+  (run-mode-hooks 'gdb-breakpoints-mode-hook)
+  'gdb-invalidate-breakpoints)
+
+(defun gdb-toggle-breakpoint ()
+  "Enable/disable breakpoint at current line of breakpoints buffer."
+  (interactive)
+  (save-excursion
+    (beginning-of-line)
+    (let ((breakpoint (get-text-property (point) 'gdb-breakpoint)))
+      (if breakpoint
+          (gud-basic-call
+           (concat (if (string-equal "y" (bindat-get-field breakpoint 'enabled))
+                       "-break-disable "
+                     "-break-enable ")
+                   (bindat-get-field breakpoint 'number)))
+        (error "Not recognized as break/watchpoint line")))))
+
+(defun gdb-delete-breakpoint ()
+  "Delete the breakpoint at current line of breakpoints buffer."
+  (interactive)
+  (save-excursion
+  (beginning-of-line)
+  (let ((breakpoint (get-text-property (point) 'gdb-breakpoint)))
+    (if breakpoint
+        (gud-basic-call (concat "-break-delete " (bindat-get-field breakpoint 'number)))
+      (error "Not recognized as break/watchpoint line")))))
+
+(defun gdb-goto-breakpoint (&optional event)
+  "Go to the location of breakpoint at current line of
+breakpoints buffer."
+  (interactive (list last-input-event))
+  (if event (posn-set-point (event-end event)))
+  ;; Hack to stop gdb-goto-breakpoint displaying in GUD buffer.
+  (let ((window (get-buffer-window gud-comint-buffer)))
+    (if window (save-selected-window  (select-window window))))
+  (save-excursion
+  (beginning-of-line)
+  (let ((breakpoint (get-text-property (point) 'gdb-breakpoint)))
+    (if breakpoint
+       (let ((bptno (bindat-get-field breakpoint 'number))
+             (file  (bindat-get-field breakpoint 'fullname))
+             (line  (bindat-get-field breakpoint 'line)))
+         (save-selected-window
+           (let* ((buffer (find-file-noselect
+                        (if (file-exists-p file) file
+                          (cdr (assoc bptno gdb-location-alist)))))
+                  (window (or (gdb-display-source-buffer buffer)
+                              (display-buffer buffer))))
+             (setq gdb-source-window window)
+             (with-current-buffer buffer
+               (goto-char (point-min))
+               (forward-line (1- (string-to-number line)))
+               (set-window-point window (point))))))
+      (error "Not recognized as break/watchpoint line")))))
+
+\f
+;; Frames buffer.  This displays a perpetually correct bactrack trace.
+;;
+(def-gdb-trigger-and-handler
+  gdb-invalidate-frames (gdb-current-context-command "-stack-list-frames")
+  gdb-stack-list-frames-handler gdb-stack-list-frames-custom
+  '(start update))
+
+(gdb-set-buffer-rules
+ 'gdb-stack-buffer
+ 'gdb-stack-buffer-name
+ 'gdb-frames-mode
+ 'gdb-invalidate-frames)
+
+(defun gdb-frame-location (frame)
+  "Return \" of file:line\" or \" of library\" for structure FRAME.
+
+FRAME must have either \"file\" and \"line\" members or \"from\"
+member."
+  (let ((file (bindat-get-field frame 'file))
+        (line (bindat-get-field frame 'line))
+        (from (bindat-get-field frame 'from)))
+    (let ((res (or (and file line (concat file ":" line))
+                   from)))
+      (if res (concat " of " res) ""))))
+
+(defun gdb-stack-list-frames-custom ()
+  (let ((stack (bindat-get-field (gdb-json-partial-output "frame") 'stack))
+        (table (make-gdb-table)))
+    (set-marker gdb-stack-position nil)
+         (dolist (frame stack)
+           (gdb-table-add-row table
+            (list
+             (bindat-get-field frame 'level)
+             "in"
+             (concat
+              (bindat-get-field frame 'func)
+              (if gdb-stack-buffer-locations
+                  (gdb-frame-location frame) "")
+              (if gdb-stack-buffer-addresses
+                  (concat " at " (bindat-get-field frame 'addr)) "")))
+            `(mouse-face highlight
+              help-echo "mouse-2, RET: Select frame"
+              gdb-frame ,frame)))
+         (insert (gdb-table-string table " ")))
+  (when (and gdb-frame-number
+             (gdb-buffer-shows-main-thread-p))
+    (gdb-mark-line (1+ (string-to-number gdb-frame-number))
+                   gdb-stack-position))
+  (setq mode-name
+        (gdb-current-context-mode-name "Frames")))
+
+(defun gdb-stack-buffer-name ()
+  (gdb-current-context-buffer-name
+   (concat "stack frames of " (gdb-get-target-string))))
+
+(def-gdb-display-buffer
+ gdb-display-stack-buffer
+ 'gdb-stack-buffer
+ "Display backtrace of current stack.")
+
+(def-gdb-preempt-display-buffer
+  gdb-preemptively-display-stack-buffer
+  'gdb-stack-buffer nil t)
+
+(def-gdb-frame-for-buffer
+ gdb-frame-stack-buffer
+ 'gdb-stack-buffer
+ "Display backtrace of current stack in a new frame.")
+
+(defvar gdb-frames-mode-map
+  (let ((map (make-sparse-keymap)))
+    (suppress-keymap map)
+    (define-key map "q" 'kill-this-buffer)
+    (define-key map "\r" 'gdb-select-frame)
+    (define-key map [mouse-2] 'gdb-select-frame)
+    (define-key map [follow-link] 'mouse-face)
+    map))
+
+(defvar gdb-frames-font-lock-keywords
+  '(("in \\([^ ]+\\)"  (1 font-lock-function-name-face)))
+  "Font lock keywords used in `gdb-frames-mode'.")
+
+(define-derived-mode gdb-frames-mode gdb-parent-mode "Frames"
+  "Major mode for gdb call stack.
+
+\\{gdb-frames-mode-map}"
+  (setq gdb-stack-position (make-marker))
+  (add-to-list 'overlay-arrow-variable-list 'gdb-stack-position)
+  (setq truncate-lines t)  ;; Make it easier to see overlay arrow.
+  (set (make-local-variable 'font-lock-defaults)
+       '(gdb-frames-font-lock-keywords))
+  (run-mode-hooks 'gdb-frames-mode-hook)
+  'gdb-invalidate-frames)
+
+(defun gdb-select-frame (&optional event)
+  "Select the frame and display the relevant source."
+  (interactive (list last-input-event))
+  (if event (posn-set-point (event-end event)))
+  (let ((frame (get-text-property (point) 'gdb-frame)))
+    (if frame
+        (if (gdb-buffer-shows-main-thread-p)
+            (let ((new-level (bindat-get-field frame 'level)))
+              (setq gdb-frame-number new-level)
+              (gdb-input (list (concat "-stack-select-frame " new-level) 'ignore))
+              (gdb-update))
+          (error "Could not select frame for non-current thread"))
+      (error "Not recognized as frame line"))))
+
+\f
+;; Locals buffer.
+;; uses "-stack-list-locals --simple-values". Needs GDB 6.1 onwards.
+(def-gdb-trigger-and-handler
+  gdb-invalidate-locals
+  (concat (gdb-current-context-command "-stack-list-locals") " --simple-values")
+  gdb-locals-handler gdb-locals-handler-custom
+  '(start update))
+
+(gdb-set-buffer-rules
+ 'gdb-locals-buffer
+ 'gdb-locals-buffer-name
+ 'gdb-locals-mode
+ 'gdb-invalidate-locals)
+
+(defvar gdb-locals-watch-map
+  (let ((map (make-sparse-keymap)))
+    (suppress-keymap map)
+    (define-key map "\r" 'gud-watch)
+    (define-key map [mouse-2] 'gud-watch)
+    map)
+ "Keymap to create watch expression of a complex data type local variable.")
+
+(defvar gdb-edit-locals-map-1
+  (let ((map (make-sparse-keymap)))
+    (suppress-keymap map)
+    (define-key map "\r" 'gdb-edit-locals-value)
+    (define-key map [mouse-2] 'gdb-edit-locals-value)
+    map)
+ "Keymap to edit value of a simple data type local variable.")
+
+(defun gdb-edit-locals-value (&optional event)
+  "Assign a value to a variable displayed in the locals buffer."
+  (interactive (list last-input-event))
+  (save-excursion
+    (if event (posn-set-point (event-end event)))
+    (beginning-of-line)
+    (let* ((var (bindat-get-field
+                 (get-text-property (point) 'gdb-local-variable) 'name))
+          (value (read-string (format "New value (%s): " var))))
+      (gud-basic-call
+       (concat  "-gdb-set variable " var " = " value)))))
+
+;; Dont display values of arrays or structures.
+;; These can be expanded using gud-watch.
+(defun gdb-locals-handler-custom ()
+  (let ((locals-list (bindat-get-field (gdb-json-partial-output) 'locals))
+        (table (make-gdb-table)))
+    (dolist (local locals-list)
+      (let ((name (bindat-get-field local 'name))
+            (value (bindat-get-field local 'value))
+            (type (bindat-get-field local 'type)))
+        (if (or (not value)
+                (string-match "\\0x" value))
+            (add-text-properties 0 (length name)
+                           `(mouse-face highlight
+                             help-echo "mouse-2: create watch expression"
+                             local-map ,gdb-locals-watch-map)
+                           name)
+          (add-text-properties 0 (length value)
+                               `(mouse-face highlight
+                               help-echo "mouse-2: edit value"
+                               local-map ,gdb-edit-locals-map-1)
+                               value))
+        (gdb-table-add-row
+         table
+         (list
+          (propertize type 'font-lock-face font-lock-type-face)
+          (propertize name 'font-lock-face font-lock-variable-name-face)
+          value)
+         `(gdb-local-variable ,local))))
+    (insert (gdb-table-string table " "))
+    (setq mode-name
+          (gdb-current-context-mode-name
+          (concat "Locals: " (bindat-get-field (gdb-current-buffer-frame) 'func))))))
+
+(defvar gdb-locals-header
+  (list
+   (gdb-propertize-header "Locals" gdb-locals-buffer
+                         nil nil mode-line)
+   " "
+   (gdb-propertize-header "Registers" gdb-registers-buffer
+                         "mouse-1: select" mode-line-highlight mode-line-inactive)))
+
+(defvar gdb-locals-mode-map
+  (let ((map (make-sparse-keymap)))
+    (suppress-keymap map)
+    (define-key map "q" 'kill-this-buffer)
+    (define-key map "\t" '(lambda ()
+                            (interactive)
+                            (gdb-set-window-buffer
+                             (gdb-get-buffer-create
+                              'gdb-registers-buffer
+                              gdb-thread-number) t)))
+     map))
+
+(define-derived-mode gdb-locals-mode gdb-parent-mode "Locals"
+  "Major mode for gdb locals.
+
+\\{gdb-locals-mode-map}"
+  (setq header-line-format gdb-locals-header)
+  (run-mode-hooks 'gdb-locals-mode-hook)
+  'gdb-invalidate-locals)
+
+(defun gdb-locals-buffer-name ()
+  (gdb-current-context-buffer-name
+   (concat "locals of " (gdb-get-target-string))))
+
+(def-gdb-display-buffer
+ gdb-display-locals-buffer
+ 'gdb-locals-buffer
+ "Display local variables of current stack and their values.")
+
+(def-gdb-preempt-display-buffer
+ gdb-preemptively-display-locals-buffer
+ 'gdb-locals-buffer nil t)
+
+(def-gdb-frame-for-buffer
+ gdb-frame-locals-buffer
+ 'gdb-locals-buffer
+ "Display local variables of current stack and their values in a new frame.")
+
+\f
+;; Registers buffer.
+
+(def-gdb-trigger-and-handler
+  gdb-invalidate-registers
+  (concat (gdb-current-context-command "-data-list-register-values") " x")
+  gdb-registers-handler
+  gdb-registers-handler-custom
+  '(start update))
+
+(gdb-set-buffer-rules
+ 'gdb-registers-buffer
+ 'gdb-registers-buffer-name
+ 'gdb-registers-mode
+ 'gdb-invalidate-registers)
+
+(defun gdb-registers-handler-custom ()
+  (when gdb-register-names
+    (let ((register-values (bindat-get-field (gdb-json-partial-output) 'register-values))
+          (table (make-gdb-table)))
+      (dolist (register register-values)
+        (let* ((register-number (bindat-get-field register 'number))
+               (value (bindat-get-field register 'value))
+               (register-name (nth (string-to-number register-number)
+                                   gdb-register-names)))
+          (gdb-table-add-row
+           table
+           (list
+            (propertize register-name 'font-lock-face font-lock-variable-name-face)
+            (if (member register-number gdb-changed-registers)
+                (propertize value 'font-lock-face font-lock-warning-face)
+              value))
+           `(mouse-face highlight
+                        help-echo "mouse-2: edit value"
+                        gdb-register-name ,register-name))))
+      (insert (gdb-table-string table " ")))
+    (setq mode-name
+          (gdb-current-context-mode-name "Registers"))))
+
+(defun gdb-edit-register-value (&optional event)
+  "Assign a value to a register displayed in the registers buffer."
+  (interactive (list last-input-event))
+  (save-excursion
+    (if event (posn-set-point (event-end event)))
+    (beginning-of-line)
+    (let* ((var (bindat-get-field
+                 (get-text-property (point) 'gdb-register-name)))
+          (value (read-string (format "New value (%s): " var))))
+      (gud-basic-call
+       (concat  "-gdb-set variable $" var " = " value)))))
+
+(defvar gdb-registers-mode-map
+  (let ((map (make-sparse-keymap)))
+    (suppress-keymap map)
+    (define-key map "\r" 'gdb-edit-register-value)
+    (define-key map [mouse-2] 'gdb-edit-register-value)
+    (define-key map "q" 'kill-this-buffer)
+    (define-key map "\t" '(lambda ()
+                            (interactive)
+                            (gdb-set-window-buffer
+                             (gdb-get-buffer-create
+                              'gdb-locals-buffer
+                              gdb-thread-number) t)))
+    map))
+
+(defvar gdb-registers-header
+  (list
+   (gdb-propertize-header "Locals" gdb-locals-buffer
+                         "mouse-1: select" mode-line-highlight mode-line-inactive)
+   " "
+   (gdb-propertize-header "Registers" gdb-registers-buffer
+                         nil nil mode-line)))
+
+(define-derived-mode gdb-registers-mode gdb-parent-mode "Registers"
+  "Major mode for gdb registers.
+
+\\{gdb-registers-mode-map}"
+  (setq header-line-format gdb-registers-header)
+  (run-mode-hooks 'gdb-registers-mode-hook)
+  'gdb-invalidate-registers)
+
+(defun gdb-registers-buffer-name ()
+  (gdb-current-context-buffer-name
+   (concat "registers of " (gdb-get-target-string))))
+
+(def-gdb-display-buffer
+ gdb-display-registers-buffer
+ 'gdb-registers-buffer
+ "Display integer register contents.")
+
+(def-gdb-preempt-display-buffer
+  gdb-preemptively-display-registers-buffer
+ 'gdb-registers-buffer nil t)
+
+(def-gdb-frame-for-buffer
+ gdb-frame-registers-buffer
+ 'gdb-registers-buffer
+  "Display integer register contents in a new frame.")
+
+;; Needs GDB 6.4 onwards (used to fail with no stack).
+(defun gdb-get-changed-registers ()
+  (if (and (gdb-get-buffer 'gdb-registers-buffer)
+          (not (gdb-pending-p 'gdb-get-changed-registers)))
+      (progn
+       (gdb-input
+        (list
+         "-data-list-changed-registers"
+         'gdb-changed-registers-handler))
+       (gdb-add-pending 'gdb-get-changed-registers))))
+
+(defun gdb-changed-registers-handler ()
+  (gdb-delete-pending 'gdb-get-changed-registers)
+  (setq gdb-changed-registers nil)
+  (dolist (register-number (bindat-get-field (gdb-json-partial-output) 'changed-registers))
+    (push register-number gdb-changed-registers)))
+
+(defun gdb-register-names-handler ()
+  ;; Don't use gdb-pending-triggers because this handler is called
+  ;; only once (in gdb-init-1)
+  (setq gdb-register-names nil)
+  (dolist (register-name (bindat-get-field (gdb-json-partial-output) 'register-names))
+    (push register-name gdb-register-names))
+  (setq gdb-register-names (reverse gdb-register-names)))
+\f
+
+(defun gdb-get-source-file-list ()
+  "Create list of source files for current GDB session.
+If buffers already exist for any of these files, gud-minor-mode
+is set in them."
+  (goto-char (point-min))
+  (while (re-search-forward gdb-source-file-regexp nil t)
+    (push (match-string 1) gdb-source-file-list))
+  (dolist (buffer (buffer-list))
+    (with-current-buffer buffer
+      (when (member buffer-file-name gdb-source-file-list)
+       (gdb-init-buffer))))
+  (gdb-force-mode-line-update
+   (propertize "ready" 'face font-lock-variable-name-face)))
+
+(defun gdb-get-main-selected-frame ()
+  "Trigger for `gdb-frame-handler' which uses main current
+thread. Called from `gdb-update'."
+  (if (not (gdb-pending-p 'gdb-get-main-selected-frame))
+      (progn
+       (gdb-input
+        (list (gdb-current-context-command "-stack-info-frame") 'gdb-frame-handler))
+       (gdb-add-pending 'gdb-get-main-selected-frame))))
+
+(defun gdb-frame-handler ()
+  "Sets `gdb-selected-frame' and `gdb-selected-file' to show
+overlay arrow in source buffer."
+  (gdb-delete-pending 'gdb-get-main-selected-frame)
+  (let ((frame (bindat-get-field (gdb-json-partial-output) 'frame)))
+    (when frame
+      (setq gdb-selected-frame (bindat-get-field frame 'func))
+      (setq gdb-selected-file (bindat-get-field frame 'fullname))
+      (setq gdb-frame-number (bindat-get-field frame 'level))
+      (setq gdb-frame-address (bindat-get-field frame 'addr))
+      (let ((line (bindat-get-field frame 'line)))
+        (setq gdb-selected-line (and line (string-to-number line)))
+        (when (and gdb-selected-file gdb-selected-line)
+          (setq gud-last-frame (cons gdb-selected-file gdb-selected-line))
+          (gud-display-frame)))
+      (if gud-overlay-arrow-position
+          (let ((buffer (marker-buffer gud-overlay-arrow-position))
+                (position (marker-position gud-overlay-arrow-position)))
+            (when buffer
+              (with-current-buffer buffer
+                (setq fringe-indicator-alist
+                      (if (string-equal gdb-frame-number "0")
+                          nil
+                        '((overlay-arrow . hollow-right-triangle))))
+                (setq gud-overlay-arrow-position (make-marker))
+                (set-marker gud-overlay-arrow-position position))))))))
+
+(defvar gdb-prompt-name-regexp "value=\"\\(.*?\\)\"")
+
+(defun gdb-get-prompt ()
+  "Find prompt for GDB session."
+  (goto-char (point-min))
+  (setq gdb-prompt-name nil)
+  (re-search-forward gdb-prompt-name-regexp nil t)
+  (setq gdb-prompt-name (match-string 1))
+  ;; Insert first prompt.
+  (setq gdb-filter-output (concat gdb-filter-output gdb-prompt-name)))
+
+;;;; Window management
+(defun gdb-display-buffer (buf dedicated &optional frame)
+  "Show buffer BUF.
+
+If BUF is already displayed in some window, show it, deiconifying
+the frame if necessary. Otherwise, find least recently used
+window and show BUF there, if the window is not used for GDB
+already, in which case that window is splitted first."
+  (let ((answer (get-buffer-window buf (or frame 0))))
+    (if answer
+       (display-buffer buf nil (or frame 0)) ;Deiconify the frame if necessary.
+      (let ((window (get-lru-window)))
+       (if (eq (buffer-local-value 'gud-minor-mode (window-buffer window))
+                 'gdbmi)
+           (let* ((largest (get-largest-window))
+                  (cur-size (window-height largest)))
+             (setq answer (split-window largest))
+             (set-window-buffer answer buf)
+             (set-window-dedicated-p answer dedicated)
+             answer)
+         (set-window-buffer window buf)
+         window)))))
+
+(defun gdb-preempt-existing-or-display-buffer (buf &optional split-horizontal)
+  "Find window displaying a buffer with the same
+`gdb-buffer-type' as BUF and show BUF there. If no such window
+exists, just call `gdb-display-buffer' for BUF. If the window
+found is already dedicated, split window according to
+SPLIT-HORIZONTAL and show BUF in the new window."
+  (if buf
+      (when (not (get-buffer-window buf))
+        (let* ((buf-type (gdb-buffer-type buf))
+               (existing-window
+                (get-window-with-predicate
+                 #'(lambda (w)
+                     (and (eq buf-type
+                              (gdb-buffer-type (window-buffer w)))
+                          (not (window-dedicated-p w)))))))
+          (if existing-window
+              (set-window-buffer existing-window buf)
+            (let ((dedicated-window
+                   (get-window-with-predicate
+                    #'(lambda (w)
+                        (eq buf-type
+                            (gdb-buffer-type (window-buffer w)))))))
+              (if dedicated-window
+                  (set-window-buffer
+                   (split-window dedicated-window nil split-horizontal) buf)
+                (gdb-display-buffer buf t))))))
+    (error "Null buffer")))
+\f
+;;; Shared keymap initialization:
+
+(let ((menu (make-sparse-keymap "GDB-Windows")))
+  (define-key gud-menu-map [displays]
+    `(menu-item "GDB-Windows" ,menu
+               :visible (eq gud-minor-mode 'gdbmi)))
+  (define-key menu [gdb] '("Gdb" . gdb-display-gdb-buffer))
+  (define-key menu [threads] '("Threads" . gdb-display-threads-buffer))
+  (define-key menu [memory] '("Memory" . gdb-display-memory-buffer))
+  (define-key menu [disassembly]
+    '("Disassembly" . gdb-display-disassembly-buffer))
+  (define-key menu [registers] '("Registers" . gdb-display-registers-buffer))
+  (define-key menu [inferior]
+    '("IO" . gdb-display-io-buffer))
+  (define-key menu [locals] '("Locals" . gdb-display-locals-buffer))
+  (define-key menu [frames] '("Stack" . gdb-display-stack-buffer))
+  (define-key menu [breakpoints]
+    '("Breakpoints" . gdb-display-breakpoints-buffer)))
+
+(let ((menu (make-sparse-keymap "GDB-Frames")))
+  (define-key gud-menu-map [frames]
+    `(menu-item "GDB-Frames" ,menu
+               :visible (eq gud-minor-mode 'gdbmi)))
+  (define-key menu [gdb] '("Gdb" . gdb-frame-gdb-buffer))
+  (define-key menu [threads] '("Threads" . gdb-frame-threads-buffer))
+  (define-key menu [memory] '("Memory" . gdb-frame-memory-buffer))
+  (define-key menu [disassembly] '("Disassembly" . gdb-frame-disassembly-buffer))
+  (define-key menu [registers] '("Registers" . gdb-frame-registers-buffer))
+  (define-key menu [inferior]
+    '("IO" . gdb-frame-io-buffer))
+  (define-key menu [locals] '("Locals" . gdb-frame-locals-buffer))
+  (define-key menu [frames] '("Stack" . gdb-frame-stack-buffer))
+  (define-key menu [breakpoints]
+    '("Breakpoints" . gdb-frame-breakpoints-buffer)))
+
+(let ((menu (make-sparse-keymap "GDB-MI")))
+  (define-key menu [gdb-customize]
+  '(menu-item "Customize" (lambda () (interactive) (customize-group 'gdb))
+             :help "Customize Gdb Graphical Mode options."))
+  (define-key menu [gdb-many-windows]
+  '(menu-item "Display Other Windows" gdb-many-windows
+             :help "Toggle display of locals, stack and breakpoint information"
+             :button (:toggle . gdb-many-windows)))
+  (define-key menu [gdb-restore-windows]
+  '(menu-item "Restore Window Layout" gdb-restore-windows
+             :help "Restore standard layout for debug session."))
+  (define-key menu [sep1]
+    '(menu-item "--"))
+  (define-key menu [all-threads]
+    '(menu-item "GUD controls all threads"
+                (lambda ()
+                  (interactive)
+                  (setq gdb-gud-control-all-threads t))
+                :help "GUD start/stop commands apply to all threads"
+                :button (:radio . gdb-gud-control-all-threads)))
+  (define-key menu [current-thread]
+    '(menu-item "GUD controls current thread"
+                (lambda ()
+                  (interactive)
+                  (setq gdb-gud-control-all-threads nil))
+                :help "GUD start/stop commands apply to current thread only"
+                :button (:radio . (not gdb-gud-control-all-threads))))
+  (define-key menu [sep2]
+    '(menu-item "--"))
+  (define-key menu [gdb-customize-reasons]
+    '(menu-item "Customize switching..."
+                (lambda ()
+                  (interactive)
+                  (customize-option 'gdb-switch-reasons))))
+  (define-key menu [gdb-switch-when-another-stopped]
+    (menu-bar-make-toggle gdb-toggle-switch-when-another-stopped gdb-switch-when-another-stopped
+                          "Automatically switch to stopped thread"
+                          "GDB thread switching %s"
+                          "Switch to stopped thread"))
+  (define-key gud-menu-map [mi]
+    `(menu-item "GDB-MI" ,menu :visible (eq gud-minor-mode 'gdbmi))))
+
+;; TODO Fit these into tool-bar-local-item-from-menu call in gud.el.
+;; GDB-MI menu will need to be moved to gud.el. We can't use
+;; tool-bar-local-item-from-menu here because it appends new buttons
+;; to toolbar from right to left while we want our A/T throttle to
+;; show up right before Run button.
+(define-key-after gud-tool-bar-map [all-threads]
+  '(menu-item "Switch to non-stop/A mode" gdb-control-all-threads
+              :image (find-image '((:type xpm :file "gud/thread.xpm")))
+              :visible (and (eq gud-minor-mode 'gdbmi)
+                            gdb-non-stop
+                            (not gdb-gud-control-all-threads)))
+  'run)
+
+(define-key-after gud-tool-bar-map [current-thread]
+  '(menu-item "Switch to non-stop/T mode" gdb-control-current-thread
+              :image (find-image '((:type xpm :file "gud/all.xpm")))
+              :visible (and (eq gud-minor-mode 'gdbmi)
+                            gdb-non-stop
+                            gdb-gud-control-all-threads))
+  'all-threads)
+
+(defun gdb-frame-gdb-buffer ()
+  "Display GUD buffer in a new frame."
+  (interactive)
+  (let ((special-display-regexps (append special-display-regexps '(".*")))
+       (special-display-frame-alist
+        (remove '(menu-bar-lines) (remove '(tool-bar-lines)
+                                          gdb-frame-parameters)))
+       (same-window-regexps nil))
+    (display-buffer gud-comint-buffer)))
+
+(defun gdb-display-gdb-buffer ()
+  "Display GUD buffer."
+  (interactive)
+  (let ((same-window-regexps nil))
+    (select-window (display-buffer gud-comint-buffer nil 0))))
+
+(defun gdb-set-window-buffer (name &optional ignore-dedicated)
+  "Set buffer of selected window to NAME and dedicate window.
+
+When IGNORE-DEDICATED is non-nil, buffer is set even if selected
+window is dedicated."
+  (when ignore-dedicated
+    (set-window-dedicated-p (selected-window) nil))
+  (set-window-buffer (selected-window) (get-buffer name))
+  (set-window-dedicated-p (selected-window) t))
+
+(defun gdb-setup-windows ()
+  "Layout the window pattern for `gdb-many-windows'."
+  (gdb-display-locals-buffer)
+  (gdb-display-stack-buffer)
+  (delete-other-windows)
+  (gdb-display-breakpoints-buffer)
+  (delete-other-windows)
+  ; Don't dedicate.
+  (pop-to-buffer gud-comint-buffer)
+  (split-window nil ( / ( * (window-height) 3) 4))
+  (split-window nil ( / (window-height) 3))
+  (split-window-horizontally)
+  (other-window 1)
+  (gdb-set-window-buffer (gdb-locals-buffer-name))
+  (other-window 1)
+  (switch-to-buffer
+       (if gud-last-last-frame
+          (gud-find-file (car gud-last-last-frame))
+        (if gdb-main-file
+            (gud-find-file gdb-main-file)
+          ;; Put buffer list in window if we
+          ;; can't find a source file.
+          (list-buffers-noselect))))
+  (setq gdb-source-window (selected-window))
+  (split-window-horizontally)
+  (other-window 1)
+  (gdb-set-window-buffer
+   (gdb-get-buffer-create 'gdb-inferior-io))
+  (other-window 1)
+  (gdb-set-window-buffer (gdb-stack-buffer-name))
+  (split-window-horizontally)
+  (other-window 1)
+  (gdb-set-window-buffer (if gdb-show-threads-by-default
+                             (gdb-threads-buffer-name)
+                           (gdb-breakpoints-buffer-name)))
+  (other-window 1))
+
+(defcustom gdb-many-windows nil
+  "If nil just pop up the GUD buffer unless `gdb-show-main' is t.
+In this case it starts with two windows: one displaying the GUD
+buffer and the other with the source file with the main routine
+of the debugged program.  Non-nil means display the layout shown for
+`gdb'."
+  :type 'boolean
+  :group 'gdb
+  :version "22.1")
+
+(defun gdb-many-windows (arg)
+  "Toggle the number of windows in the basic arrangement.
+With arg, display additional buffers iff arg is positive."
+  (interactive "P")
+  (setq gdb-many-windows
+       (if (null arg)
+           (not gdb-many-windows)
+         (> (prefix-numeric-value arg) 0)))
+  (message (format "Display of other windows %sabled"
+                  (if gdb-many-windows "en" "dis")))
+  (if (and gud-comint-buffer
+          (buffer-name gud-comint-buffer))
+      (condition-case nil
+         (gdb-restore-windows)
+       (error nil))))
+
+(defun gdb-restore-windows ()
+  "Restore the basic arrangement of windows used by gdb.
+This arrangement depends on the value of `gdb-many-windows'."
+  (interactive)
+  (pop-to-buffer gud-comint-buffer)    ;Select the right window and frame.
+    (delete-other-windows)
+  (if gdb-many-windows
+      (gdb-setup-windows)
+    (when (or gud-last-last-frame gdb-show-main)
+      (split-window)
+      (other-window 1)
+      (switch-to-buffer
+       (if gud-last-last-frame
+          (gud-find-file (car gud-last-last-frame))
+        (gud-find-file gdb-main-file)))
+      (setq gdb-source-window (selected-window))
+      (other-window 1))))
+
+(defun gdb-reset ()
+  "Exit a debugging session cleanly.
+Kills the gdb buffers, and resets variables and the source buffers."
+  (dolist (buffer (buffer-list))
+    (unless (eq buffer gud-comint-buffer)
+      (with-current-buffer buffer
+       (if (eq gud-minor-mode 'gdbmi)
+           (if (string-match "\\` ?\\*.+\\*\\'" (buffer-name))
+               (kill-buffer nil)
+             (gdb-remove-breakpoint-icons (point-min) (point-max) t)
+             (setq gud-minor-mode nil)
+             (kill-local-variable 'tool-bar-map)
+             (kill-local-variable 'gdb-define-alist))))))
+  (setq gdb-disassembly-position nil)
+  (setq overlay-arrow-variable-list
+       (delq 'gdb-disassembly-position overlay-arrow-variable-list))
+  (setq fringe-indicator-alist '((overlay-arrow . right-triangle)))
+  (setq gdb-stack-position nil)
+  (setq overlay-arrow-variable-list
+       (delq 'gdb-stack-position overlay-arrow-variable-list))
+  (setq gdb-thread-position nil)
+  (setq overlay-arrow-variable-list
+       (delq 'gdb-thread-position overlay-arrow-variable-list))
+  (if (boundp 'speedbar-frame) (speedbar-timer-fn))
+  (setq gud-running nil)
+  (setq gdb-active-process nil)
+  (remove-hook 'after-save-hook 'gdb-create-define-alist t))
+
+(defun gdb-get-source-file ()
+  "Find the source file where the program starts and display it with related
+buffers, if required."
+  (goto-char (point-min))
+  (if (re-search-forward gdb-source-file-regexp nil t)
+      (setq gdb-main-file (match-string 1)))
+ (if gdb-many-windows
+      (gdb-setup-windows)
+   (gdb-get-buffer-create 'gdb-breakpoints-buffer)
+   (if gdb-show-main
+       (let ((pop-up-windows t))
+        (display-buffer (gud-find-file gdb-main-file))))))
+
+;;from put-image
+(defun gdb-put-string (putstring pos &optional dprop &rest sprops)
+  "Put string PUTSTRING in front of POS in the current buffer.
+PUTSTRING is displayed by putting an overlay into the current buffer with a
+`before-string' string that has a `display' property whose value is
+PUTSTRING."
+  (let ((string (make-string 1 ?x))
+       (buffer (current-buffer)))
+    (setq putstring (copy-sequence putstring))
+    (let ((overlay (make-overlay pos pos buffer))
+         (prop (or dprop
+                   (list (list 'margin 'left-margin) putstring))))
+      (put-text-property 0 1 'display prop string)
+      (if sprops
+         (add-text-properties 0 1 sprops string))
+      (overlay-put overlay 'put-break t)
+      (overlay-put overlay 'before-string string))))
+
+;;from remove-images
+(defun gdb-remove-strings (start end &optional buffer)
+  "Remove strings between START and END in BUFFER.
+Remove only strings that were put in BUFFER with calls to `gdb-put-string'.
+BUFFER nil or omitted means use the current buffer."
+  (unless buffer
+    (setq buffer (current-buffer)))
+  (dolist (overlay (overlays-in start end))
+    (when (overlay-get overlay 'put-break)
+         (delete-overlay overlay))))
+
+(defun gdb-put-breakpoint-icon (enabled bptno &optional line)
+  (let* ((posns (gdb-line-posns (or line (line-number-at-pos))))
+         (start (- (car posns) 1))
+         (end (+ (cdr posns) 1))
+         (putstring (if enabled "B" "b"))
+         (source-window (get-buffer-window (current-buffer) 0)))
+    (add-text-properties
+     0 1 '(help-echo "mouse-1: clear bkpt, mouse-3: enable/disable bkpt")
+     putstring)
+    (if enabled
+       (add-text-properties
+        0 1 `(gdb-bptno ,bptno gdb-enabled t) putstring)
+      (add-text-properties
+       0 1 `(gdb-bptno ,bptno gdb-enabled nil) putstring))
+    (gdb-remove-breakpoint-icons start end)
+    (if (display-images-p)
+       (if (>= (or left-fringe-width
+                   (if source-window (car (window-fringes source-window)))
+                   gdb-buffer-fringe-width) 8)
+           (gdb-put-string
+            nil (1+ start)
+            `(left-fringe breakpoint
+                          ,(if enabled
+                               'breakpoint-enabled
+                             'breakpoint-disabled))
+            'gdb-bptno bptno
+            'gdb-enabled enabled)
+         (when (< left-margin-width 2)
+           (save-current-buffer
+             (setq left-margin-width 2)
+             (if source-window
+                 (set-window-margins
+                  source-window
+                  left-margin-width right-margin-width))))
+         (put-image
+          (if enabled
+              (or breakpoint-enabled-icon
+                  (setq breakpoint-enabled-icon
+                        (find-image `((:type xpm :data
+                                             ,breakpoint-xpm-data
+                                             :ascent 100 :pointer hand)
+                                      (:type pbm :data
+                                             ,breakpoint-enabled-pbm-data
+                                             :ascent 100 :pointer hand)))))
+            (or breakpoint-disabled-icon
+                (setq breakpoint-disabled-icon
+                      (find-image `((:type xpm :data
+                                           ,breakpoint-xpm-data
+                                           :conversion disabled
+                                           :ascent 100 :pointer hand)
+                                    (:type pbm :data
+                                           ,breakpoint-disabled-pbm-data
+                                           :ascent 100 :pointer hand))))))
+          (+ start 1)
+          putstring
+          'left-margin))
+      (when (< left-margin-width 2)
+       (save-current-buffer
+         (setq left-margin-width 2)
+         (let ((window (get-buffer-window (current-buffer) 0)))
+           (if window
+             (set-window-margins
+              window left-margin-width right-margin-width)))))
+      (gdb-put-string
+       (propertize putstring
+                  'face (if enabled 'breakpoint-enabled 'breakpoint-disabled))
+       (1+ start)))))
+
+(defun gdb-remove-breakpoint-icons (start end &optional remove-margin)
+  (gdb-remove-strings start end)
+  (if (display-images-p)
+      (remove-images start end))
+  (when remove-margin
+    (setq left-margin-width 0)
+    (let ((window (get-buffer-window (current-buffer) 0)))
+      (if window
+         (set-window-margins
+          window left-margin-width right-margin-width)))))
+
+(provide 'gdb-mi)
+
+;; arch-tag: 1b41ea2b-f364-4cec-8f35-e02e4fe01912
+;;; gdb-mi.el ends here
diff --git a/lisp/progmodes/gdb-ui.el b/lisp/progmodes/gdb-ui.el
deleted file mode 100644 (file)
index aa4cfab..0000000
+++ /dev/null
@@ -1,4158 +0,0 @@
-;;; gdb-ui.el --- User Interface for running GDB
-
-;; Author: Nick Roberts <nickrob@gnu.org>
-;; Maintainer: FSF
-;; Keywords: unix, tools
-
-;; Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
-;; Free Software Foundation, Inc.
-
-;; This file is part of GNU Emacs.
-
-;; GNU Emacs is free software: you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Emacs is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This mode acts as a graphical user interface to GDB.  You can interact with
-;; GDB through the GUD buffer in the usual way, but there are also further
-;; buffers which control the execution and describe the state of your program.
-;; It separates the input/output of your program from that of GDB, if
-;; required, and watches expressions in the speedbar.  It also uses features of
-;; Emacs 21 such as the fringe/display margin for breakpoints, and the toolbar
-;; (see the GDB Graphical Interface section in the Emacs info manual).
-
-;; By default, M-x gdb will start the debugger.
-
-;; This file has evolved from gdba.el that was included with GDB 5.0 and
-;; written by Tom Lord and Jim Kingdon.  It uses GDB's annotation interface.
-;; You don't need to know about annotations to use this mode as a debugger,
-;; but if you are interested developing the mode itself, see the Annotations
-;; section in the GDB info manual.
-
-;; GDB developers plan to make the annotation interface obsolete.  A new
-;; interface called GDB/MI (machine interface) has been designed to replace it.
-;; Some GDB/MI commands are used in this file through the CLI command
-;; 'interpreter mi <mi-command>'.  To help with the process of fully migrating
-;; Emacs from annotations to GDB/MI, there is an experimental package called
-;; gdb-mi in the Emacs Lisp Package Archive ("http://tromey.com/elpa/").  It
-;; comprises of modified gud.el and a file called gdb-mi.el which replaces
-;; gdb-ui.el.  When installed, this overrides the current files and invoking
-;; M-x gdb will use GDB/MI directly (starts with "gdb -i=mi").  When deleted
-;; ('d' followed by 'x' in Package Menu mode), the files are deleted and old
-;; functionality restored.  This provides a convenient way to review the
-;; current status/contribute to its improvement.  For someone who just wants to
-;; use GDB, however, the current mode in Emacs 22 is a much better option.
-;; There is also a file, also called gdb-mi.el, a version of which is included
-;; the GDB distribution.  This will probably only work with versions
-;; distributed with GDB 6.5 or later.  Unlike the version in ELPA it works on
-;; top of gdb-ui.el and you can only start it with M-x gdbmi.
-
-;; This mode SHOULD WORK WITH GDB 5.0 or later but you will NEED AT LEAST
-;; GDB 6.0 to use watch expressions.  It works best with GDB 6.4 or later
-;; where watch expressions will update more quickly.
-
-;;; Windows Platforms:
-
-;; If you are using Emacs and GDB on Windows you will need to flush the buffer
-;; explicitly in your program if you want timely display of I/O in Emacs.
-;; Alternatively you can make the output stream unbuffered, for example, by
-;; using a macro:
-
-;;           #ifdef UNBUFFERED
-;;          setvbuf (stdout, (char *) NULL, _IONBF, 0);
-;;          #endif
-
-;; and compiling with -DUNBUFFERED while debugging.
-
-;; If you are using Cygwin GDB and find that the source is not being displayed
-;; in Emacs when you step through it, possible solutions are to:
-
-;;   1) Use Cygwin X Windows and Cygwin Emacs.
-;;        (Since 22.1 Emacs builds under Cygwin.)
-;;   2) Use MinGW GDB instead.
-;;   3) Use cygwin-mount.el
-
-;;; Mac OSX:
-
-;; GDB in Emacs on Mac OSX works best with FSF GDB as Apple have made
-;; some changes to the version that they include as part of Mac OSX.
-;; This requires GDB version 7.0 or later (estimated release date June 2009)
-;; as earlier versions don not compile on Mac OSX.
-
-;;; Known Bugs:
-
-;; 1) Cannot handle multiple debug sessions.
-;; 2) If you wish to call procedures from your program in GDB
-;;    e.g "call myproc ()", "p mysquare (5)" then use level 2 annotations
-;;    "gdb --annotate=2 myprog" to keep source buffer/selected frame fixed.
-;; 3) After detaching from a process, clicking on the "GO" icon on toolbar
-;;    (gud-go) sends "continue" to GDB (should be "run").
-
-;;; TODO:
-
-;; 1) Use MI command -data-read-memory for memory window.
-;; 2) Use tree-buffer.el (from ECB) instead of the speedbar for
-;;    watch-expressions?  Handling of watch-expressions needs to be
-;;    overhauled to work for large arrays/structures by creating variable
-;;    objects for visible watch-expressions only.
-;; 3) Mark breakpoint locations on scroll-bar of source buffer?
-
-;;; Code:
-
-(require 'gud)
-(require 'json)
-(require 'bindat)
-
-(defvar tool-bar-map)
-(defvar speedbar-initial-expansion-list-name)
-(defvar speedbar-frame)
-
-(defvar gdb-pc-address nil "Initialization for Assembler buffer.
-Set to \"main\" at start if `gdb-show-main' is t.")
-(defvar gdb-frame-address nil "Identity of frame for watch expression.")
-(defvar gdb-previous-frame-pc-address nil)
-(defvar gdb-memory-address "main")
-(defvar gdb-previous-frame nil)
-(defvar gdb-selected-frame nil)
-(defvar gdb-frame-number nil)
-(defvar gdb-current-language nil)
-(defvar gdb-var-list nil
-  "List of variables in watch window.
-Each element has the form (VARNUM EXPRESSION NUMCHILD TYPE VALUE STATUS HAS_MORE FP)
-where STATUS is nil (`unchanged'), `changed' or `out-of-scope', FP the frame
-address for root variables.")
-(defvar gdb-main-file nil "Source file from which program execution begins.")
-(defvar gud-old-arrow nil)
-(defvar gdb-thread-indicator nil)
-(defvar gdb-overlay-arrow-position nil)
-(defvar gdb-stack-position nil)
-(defvar gdb-server-prefix nil)
-(defvar gdb-flush-pending-output nil)
-(defvar gdb-location-alist nil
-  "Alist of breakpoint numbers and full filenames.
-Only used for files that Emacs can't find.")
-(defvar gdb-active-process nil
-  "GUD tooltips display variable values when t, and macro definitions otherwise.")
-(defvar gdb-recording nil
-  "If t, then record session for playback and reverse execution")
-(defvar gdb-error "Non-nil when GDB is reporting an error.")
-(defvar gdb-macro-info nil
-  "Non-nil if GDB knows that the inferior includes preprocessor macro info.")
-(defvar gdb-buffer-fringe-width nil)
-(defvar gdb-signalled nil)
-(defvar gdb-source-window nil)
-(defvar gdb-inferior-status nil)
-(defvar gdb-continuation nil)
-(defvar gdb-look-up-stack nil)
-(defvar gdb-frame-begin nil
-  "Non-nil when GDB generates frame-begin annotation.")
-(defvar gdb-printing t)
-(defvar gdb-parent-bptno-enabled nil)
-(defvar gdb-ready nil)
-(defvar gdb-stack-update nil)
-(defvar gdb-early-user-input nil)
-
-(defvar gdb-buffer-type nil
-  "One of the symbols bound in `gdb-buffer-rules'.")
-(make-variable-buffer-local 'gdb-buffer-type)
-
-(defvar gdb-input-queue ()
-  "A list of gdb command objects.")
-
-(defvar gdb-prompting nil
-  "True when gdb is idle with no pending input.")
-
-(defvar gdb-output-sink nil
-  "The disposition of the output of the current gdb command.
-Possible values are these symbols:
-
-    `user' -- gdb output should be copied to the GUD buffer
-              for the user to see.
-
-    `inferior' -- gdb output should be copied to the inferior-io buffer.
-
-    `pre-emacs' -- output should be ignored util the post-prompt
-                   annotation is received.  Then the output-sink
-                  becomes:...
-    `emacs' -- output should be collected in the partial-output-buffer
-              for subsequent processing by a command.  This is the
-              disposition of output generated by commands that
-              gdb mode sends to gdb on its own behalf.
-    `post-emacs' -- ignore output until the prompt annotation is
-                   received, then go to USER disposition.
-
-gdba (gdb-ui.el) uses all five values, gdbmi (gdb-mi.el) only two
-\(`user' and `emacs').")
-
-(defvar gdb-current-item nil
-  "The most recent command item sent to gdb.")
-
-(defvar gdb-pending-triggers '()
-  "A list of trigger functions that have run later than their output handlers.")
-
-(defvar gdb-first-post-prompt nil)
-(defvar gdb-version nil)
-(defvar gdb-locals-font-lock-keywords nil)
-(defvar gdb-source-file-list nil
-  "List of source files for the current executable.")
-(defconst gdb-error-regexp "\\^error,msg=\"\\(.+\\)\"")
-
-(defvar gdb-locals-font-lock-keywords-1
-  '(;; var = (struct struct_tag) value
-    ( "\\(^\\(\\sw\\|[_.]\\)+\\) += +(\\(struct\\) \\(\\(\\sw\\|[_.]\\)+\\)"
-      (1 font-lock-variable-name-face)
-      (3 font-lock-keyword-face)
-      (4 font-lock-type-face))
-    ;; var = (type) value
-    ( "\\(^\\(\\sw\\|[_.]\\)+\\) += +(\\(\\(\\sw\\|[_.]\\)+\\)"
-      (1 font-lock-variable-name-face)
-      (3 font-lock-type-face))
-    ;; var = val
-    ( "\\(^\\(\\sw\\|[_.]\\)+\\) += +[^(]"
-      (1 font-lock-variable-name-face)))
-  "Font lock keywords used in `gdb-local-mode'.")
-
-(defvar gdb-locals-font-lock-keywords-2
-  '(;; var = type value
-    ( "\\(^\\(\\sw\\|[_.]\\)+\\)\t+\\(\\(\\sw\\|[_.]\\)+\\)"
-      (1 font-lock-variable-name-face)
-      (3 font-lock-type-face)))
-  "Font lock keywords used in `gdb-local-mode'.")
-
-;; Variables for GDB 6.4+
-(defvar gdb-register-names nil "List of register names.")
-(defvar gdb-changed-registers nil
-  "List of changed register numbers (strings).")
-
-;;;###autoload
-(defun gdb (command-line)
-  "Run gdb on program FILE in buffer *gud-FILE*.
-The directory containing FILE becomes the initial working
-directory and source-file directory for your debugger.
-
-If `gdb-many-windows' is nil (the default value) then gdb just
-pops up the GUD buffer unless `gdb-show-main' is t.  In this case
-it starts with two windows: one displaying the GUD buffer and the
-other with the source file with the main routine of the inferior.
-
-If `gdb-many-windows' is t, regardless of the value of
-`gdb-show-main', the layout below will appear unless
-`gdb-use-separate-io-buffer' is nil when the source buffer
-occupies the full width of the frame.  Keybindings are shown in
-some of the buffers.
-
-Watch expressions appear in the speedbar/slowbar.
-
-The following commands help control operation :
-
-`gdb-many-windows'    - Toggle the number of windows gdb uses.
-`gdb-restore-windows' - To restore the window layout.
-
-See Info node `(emacs)GDB Graphical Interface' for a more
-detailed description of this mode.
-
-+----------------------------------------------------------------------+
-|                               GDB Toolbar                            |
-+-----------------------------------+----------------------------------+
-|  GUD buffer (I/O of GDB)          |  Locals buffer                   |
-|-----------------------------------+----------------------------------+
-|                                   |                                  |
-|  Source buffer                    |  I/O buffer for debugged program |
-|                                   |                                  |
-|-----------------------------------+----------------------------------+
-|  Stack buffer                     |  Breakpoints/threads buffer      |
-+-----------------------------------+----------------------------------+
-
-The option \"--annotate=3\" must be included in this value.  To
-run GDB in text command mode, use `gud-gdb'.  You need to use
-text command mode to debug multiple programs within one Emacs
-session."
-  (interactive (list (gud-query-cmdline 'gdb)))
-
-  (when (and gud-comint-buffer
-          (buffer-name gud-comint-buffer)
-          (get-buffer-process gud-comint-buffer)
-          (with-current-buffer gud-comint-buffer (eq gud-minor-mode 'gdba)))
-       (gdb-restore-windows)
-       (error
-        "Multiple debugging requires restarting in text command mode"))
-
-  (gud-common-init command-line nil 'gud-gdba-marker-filter)
-  (set (make-local-variable 'gud-minor-mode) 'gdba)
-  (setq comint-input-sender 'gdb-send)
-
-  (gud-def gud-break  "break %f:%l"  "\C-b" "Set breakpoint at current line.")
-  (gud-def gud-tbreak "tbreak %f:%l" "\C-t"
-          "Set temporary breakpoint at current line.")
-  (gud-def gud-remove "clear %f:%l" "\C-d" "Remove breakpoint at current line.")
-  (gud-def gud-step   "step %p"     "\C-s" "Step one source line with display.")
-  (gud-def gud-stepi  "stepi %p"    "\C-i" "Step one instruction with display.")
-  (gud-def gud-next   "next %p"     "\C-n" "Step one line (skip functions).")
-  (gud-def gud-nexti  "nexti %p" nil   "Step one instruction (skip functions).")
-  (gud-def gud-cont   "continue"     "\C-r" "Continue with display.")
-  (gud-def gud-finish "finish"   "\C-f" "Finish executing current function.")
-  (gud-def gud-jump
-          (progn (gud-call "tbreak %f:%l") (gud-call "jump %f:%l"))
-          "\C-j" "Set execution address to current line.")
-
-  (gud-def gud-rstep   "reverse-step %p"  nil "Reverse step one source line with display.")
-  (gud-def gud-rstepi  "reverse-stepi %p" nil "Reverse step one instruction with display.")
-  (gud-def gud-rnext   "reverse-next %p"  nil "Reverse step one line (skip functions).")
-  (gud-def gud-rnexti  "reverse-nexti %p" nil "Reverse step one instruction (skip functions).")
-  (gud-def gud-rcont   "reverse-continue" nil "Reverse continue with display.")
-  (gud-def gud-rfinish "reverse-finish"   nil "Reverse finish executing current function.")
-
-  (gud-def gud-up     "up %p"     "<" "Up N stack frames (numeric arg).")
-  (gud-def gud-down   "down %p"   ">" "Down N stack frames (numeric arg).")
-  (gud-def gud-print  "print %e"  "\C-p" "Evaluate C expression at point.")
-  (gud-def gud-pstar  "print* %e" nil
-          "Evaluate C dereferenced pointer expression at point.")
-
-  ;; For debugging Emacs only.
-  (gud-def gud-pv "pv1 %e"      "\C-v" "Print the value of the lisp variable.")
-
-  (gud-def gud-until  "until %l" "\C-u" "Continue to current line.")
-  (gud-def gud-run    "run"     nil    "Run the program.")
-
-  (local-set-key "\C-i" 'gud-gdb-complete-command)
-  (setq comint-prompt-regexp "^(.*gdb[+]?) *")
-  (setq paragraph-start comint-prompt-regexp)
-  (setq gdb-output-sink 'user)
-  (setq gdb-first-prompt t)
-  (setq gud-running nil)
-  (setq gdb-ready nil)
-  (setq gdb-stack-update nil)
-  (setq gdb-flush-pending-output nil)
-  (setq gdb-early-user-input nil)
-  (setq gud-filter-pending-text nil)
-  (gdb-thread-identification)
-  (run-hooks 'gdb-mode-hook))
-
-;; Keep as an alias for compatibility with Emacs 22.1.
-;;;###autoload
-(defalias 'gdba 'gdb)
-
-(defgroup gdb nil
-  "Gdb Graphical Mode options specifically for running Gdb in Emacs."
-  :group 'processes
-  :group 'tools)
-
-(defcustom gdb-debug-log-max 128
-  "Maximum size of `gdb-debug-log'.  If nil, size is unlimited."
-  :group 'gdb
-  :type '(choice (integer :tag "Number of elements")
-                (const   :tag "Unlimited" nil))
-  :version "22.1")
-
-(defvar gdb-debug-log nil
-  "List of commands sent to and replies received from GDB.
-Most recent commands are listed first.  This list stores only the last
-`gdb-debug-log-max' values.  This variable is used to debug GDB-UI.")
-
-;;;###autoload
-(defcustom gdb-enable-debug nil
-  "Non-nil means record the process input and output in `gdb-debug-log'."
-  :type 'boolean
-  :group 'gdb
-  :version "22.1")
-
-(defcustom gdb-cpp-define-alist-program "gcc -E -dM -"
-  "Shell command for generating a list of defined macros in a source file.
-This list is used to display the #define directive associated
-with an identifier as a tooltip.  It works in a debug session with
-GDB, when `gud-tooltip-mode' is t.
-
-Set `gdb-cpp-define-alist-flags' for any include paths or
-predefined macros."
-  :type 'string
-  :group 'gdb
-  :version "22.1")
-
-(defcustom gdb-cpp-define-alist-flags ""
-  "Preprocessor flags for `gdb-cpp-define-alist-program'."
-  :type 'string
-  :group 'gdb
-  :version "22.1")
-
-(defcustom gdb-create-source-file-list t
-  "Non-nil means create a list of files from which the executable was built.
-Set this to nil if the GUD buffer displays \"initializing...\" in the mode
-line for a long time when starting, possibly because your executable was
-built from a large number of files.  This allows quicker initialization
-but means that these files are not automatically enabled for debugging,
-e.g., you won't be able to click in the fringe to set a breakpoint until
-execution has already stopped there."
-  :type 'boolean
-  :group 'gdb
-  :version "23.1")
-
-(defcustom gdb-show-main nil
-  "Non-nil means display source file containing the main routine at startup.
-Also display the main routine in the disassembly buffer if present."
-  :type 'boolean
-  :group 'gdb
-  :version "22.1")
-
-(defcustom gdb-many-windows nil
-  "If nil, just pop up the GUD buffer unless `gdb-show-main' is t.
-In this case start with two windows: one displaying the GUD
-buffer and the other with the source file with the main routine
-of the debugged program.  Non-nil means display the layout shown
-for `gdba'."
-  :type 'boolean
-  :group 'gdb
-  :version "22.1")
-
-(defcustom gdb-use-separate-io-buffer nil
-  "Non-nil means display output from the debugged program in a separate buffer."
-  :type 'boolean
-  :group 'gdb
-  :version "22.1")
-
-(defun gdb-force-mode-line-update (status)
-  (let ((buffer gud-comint-buffer))
-    (if (and buffer (buffer-name buffer))
-       (with-current-buffer buffer
-         (setq mode-line-process
-               (format ":%s [%s]"
-                       (process-status (get-buffer-process buffer)) status))
-         ;; Force mode line redisplay soon.
-         (force-mode-line-update)))))
-
-(defun gdb-enable-debug (arg)
-  "Toggle logging of transaction between Emacs and Gdb.
-The log is stored in `gdb-debug-log' as an alist with elements
-whose cons is send, send-item or recv and whose cdr is the string
-being transferred.  This list may grow up to a size of
-`gdb-debug-log-max' after which the oldest element (at the end of
-the list) is deleted every time a new one is added (at the front)."
-  (interactive "P")
-  (setq gdb-enable-debug
-       (if (null arg)
-           (not gdb-enable-debug)
-         (> (prefix-numeric-value arg) 0)))
-  (message (format "Logging of transaction %sabled"
-                  (if gdb-enable-debug "en" "dis"))))
-
-(defun gdb-many-windows (arg)
-  "Toggle the number of windows in the basic arrangement.
-With prefix argument ARG, display additional buffers if ARG is positive,
-otherwise use a single window."
-  (interactive "P")
-  (setq gdb-many-windows
-       (if (null arg)
-           (not gdb-many-windows)
-         (> (prefix-numeric-value arg) 0)))
-  (message (format "Display of other windows %sabled"
-                  (if gdb-many-windows "en" "dis")))
-  (if (and gud-comint-buffer
-          (buffer-name gud-comint-buffer))
-      (condition-case nil
-         (gdb-restore-windows)
-       (error nil))))
-
-(defun gdb-use-separate-io-buffer (arg)
-  "Toggle separate IO for debugged program.
-With prefix argument ARG, use separate IO if ARG is positive,
-otherwise do not."
-  (interactive "P")
-  (setq gdb-use-separate-io-buffer
-       (if (null arg)
-           (not gdb-use-separate-io-buffer)
-         (> (prefix-numeric-value arg) 0)))
-  (message (format "Separate IO %sabled"
-                  (if gdb-use-separate-io-buffer "en" "dis")))
-  (if (and gud-comint-buffer
-          (buffer-name gud-comint-buffer))
-      (condition-case nil
-         (if gdb-use-separate-io-buffer
-             (if gdb-many-windows (gdb-restore-windows))
-           (kill-buffer (gdb-inferior-io-name)))
-       (error nil))))
-
-(defvar gdb-define-alist nil "Alist of #define directives for GUD tooltips.")
-
-(defun gdb-create-define-alist ()
-  "Create an alist of #define directives for GUD tooltips."
-  (let* ((file (buffer-file-name))
-        (output
-         (with-output-to-string
-           (with-current-buffer standard-output
-             (and file
-                  (file-exists-p file)
-                  ;; call-process doesn't work with remote file names.
-                  (not (file-remote-p default-directory))
-                  (call-process shell-file-name file
-                                (list t nil) nil "-c"
-                                (concat gdb-cpp-define-alist-program " "
-                                        gdb-cpp-define-alist-flags))))))
-       (define-list (split-string output "\n" t)) (name))
-    (setq gdb-define-alist nil)
-    (dolist (define define-list)
-      (setq name (nth 1 (split-string define "[( ]")))
-      (push (cons name define) gdb-define-alist))))
-
-(declare-function tooltip-show "tooltip" (text &optional use-echo-area))
-(defvar tooltip-use-echo-area)
-
-(defun gdb-tooltip-print (expr)
-  (tooltip-show
-   (with-current-buffer (gdb-get-buffer 'gdb-partial-output-buffer)
-     (goto-char (point-min))
-     (let ((string
-           (if (search-forward "=" nil t)
-               (concat expr (buffer-substring (- (point) 2) (point-max)))
-             (buffer-string))))
-       ;; remove newline for gud-tooltip-echo-area
-       (substring string 0 (- (length string) 1))))
-   (or gud-tooltip-echo-area tooltip-use-echo-area
-   (not (display-graphic-p)))))
-
-;; If expr is a macro for a function don't print because of possible dangerous
-;; side-effects.  Also printing a function within a tooltip generates an
-;; unexpected starting annotation (phase error).
-(defun gdb-tooltip-print-1 (expr)
-  (with-current-buffer (gdb-get-buffer 'gdb-partial-output-buffer)
-    (goto-char (point-min))
-    (if (search-forward "expands to: " nil t)
-       (unless (looking-at "\\S-+.*(.*).*")
-         (gdb-enqueue-input
-          (list  (concat gdb-server-prefix "print " expr "\n")
-                 `(lambda () (gdb-tooltip-print ,expr))))))))
-
-(defconst gdb-source-file-regexp "\\(.+?\\), \\|\\([^, \n].*$\\)")
-
-(defun gdb-init-buffer ()
-  (set (make-local-variable 'gud-minor-mode)
-       (buffer-local-value 'gud-minor-mode gud-comint-buffer))
-  (set (make-local-variable 'tool-bar-map) gud-tool-bar-map)
-  (when gud-tooltip-mode
-    (make-local-variable 'gdb-define-alist)
-    (gdb-create-define-alist)
-    (add-hook 'after-save-hook 'gdb-create-define-alist nil t)))
-
-(defun gdb-set-gud-minor-mode-existing-buffers ()
-  "Create list of source files for current GDB session."
-  (goto-char (point-min))
-  (when (search-forward "read in on demand:" nil t)
-    (while (re-search-forward gdb-source-file-regexp nil t)
-      (push (file-name-nondirectory (or (match-string 1) (match-string 2)))
-           gdb-source-file-list))
-    (dolist (buffer (buffer-list))
-      (with-current-buffer buffer
-       (when (and buffer-file-name
-                  (member (file-name-nondirectory buffer-file-name)
-                          gdb-source-file-list))
-         (gdb-init-buffer)))))
-  (gdb-force-mode-line-update
-   (propertize "ready" 'face font-lock-variable-name-face)))
-
-(defun gdb-find-watch-expression ()
-  (let* ((var (nth (- (line-number-at-pos (point)) 2) gdb-var-list))
-        (varnum (car var)) expr array)
-    (string-match "\\(var[0-9]+\\)\\.\\(.*\\)" varnum)
-    (let ((var1 (assoc (match-string 1 varnum) gdb-var-list)) var2 varnumlet
-         (component-list (split-string (match-string 2 varnum) "\\." t)))
-      (setq expr (nth 1 var1))
-      (setq varnumlet (car var1))
-      (dolist (component component-list)
-       (setq var2 (assoc varnumlet gdb-var-list))
-       (setq expr (concat expr
-                          (if (string-match ".*\\[[0-9]+\\]$" (nth 3 var2))
-                              (concat "[" component "]")
-                            (concat "." component))))
-       (setq varnumlet (concat varnumlet "." component)))
-      expr)))
-
-(defun gdb-toggle-recording ()
-"Start/stop recording of debug session."
-  (interactive)
-  (if gud-running
-      (message-box "Recording cannot be started or stopped while your program is still running")
-      (gdb-enqueue-input
-       (list (concat gdb-server-prefix
-                    (if gdb-recording "record stop\n" "target record\n"))
-            'gdb-recording-handler))))
-
-;; Convenience function for tool bar.
-(defalias 'gdb-toggle-recording-1 'gdb-toggle-recording)
-
-(defun gdb-recording-handler ()
-  (goto-char (point-min))
-  (if (re-search-forward "current architecture doesn't support record function" nil t)
-      (message-box "Not enabled.  The current architecture doesn't support the process record function.")
-    (goto-char (point-min))
-    (if (re-search-forward "Undefined target command" nil t)
-       (message-box "Not enabled.  Process record requires GDB 7.0 onwards.")
-      (goto-char (point-min))
-      (if (re-search-forward "the program is not being run" nil t)
-         (message-box "Not enabled.  Starting process recording requires an active target (running process).")
-       (setq gdb-recording (not gdb-recording))
-       ;; Actually forcing the tool-bar to update.
-       (force-mode-line-update)))))
-
-(defun gdb-init-1 ()
-  (gud-def gud-break (if (not (string-match "Machine" mode-name))
-                        (gud-call "break %f:%l" arg)
-                      (save-excursion
-                        (beginning-of-line)
-                        (forward-char 2)
-                        (gud-call "break *%a" arg)))
-          "\C-b" "Set breakpoint at current line or address.")
-  ;;
-  (gud-def gud-remove (if (not (string-match "Machine" mode-name))
-                         (gud-call "clear %f:%l" arg)
-                       (save-excursion
-                         (beginning-of-line)
-                         (forward-char 2)
-                         (gud-call "clear *%a" arg)))
-          "\C-d" "Remove breakpoint at current line or address.")
-  ;;
-  (gud-def gud-until (if (not (string-match "Machine" mode-name))
-                        (gud-call "until %f:%l" arg)
-                      (save-excursion
-                        (beginning-of-line)
-                        (forward-char 2)
-                        (gud-call "until *%a" arg)))
-          "\C-u" "Continue to current line or address.")
-  ;;
-  (gud-def gud-go (gud-call (if gdb-active-process "continue" "run") arg)
-          nil "Start or continue execution.")
-
-  ;; For debugging Emacs only.
-  (gud-def gud-pp
-          (gud-call
-           (concat
-            "pp1 " (if (eq (buffer-local-value
-                            'major-mode (window-buffer)) 'speedbar-mode)
-                       (gdb-find-watch-expression) "%e")) arg)
-          nil   "Print the Emacs s-expression.")
-
-  (define-key gud-minor-mode-map [left-margin mouse-1]
-    'gdb-mouse-set-clear-breakpoint)
-  (define-key gud-minor-mode-map [left-fringe mouse-1]
-    'gdb-mouse-set-clear-breakpoint)
-   (define-key gud-minor-mode-map [left-margin C-mouse-1]
-    'gdb-mouse-toggle-breakpoint-margin)
-  (define-key gud-minor-mode-map [left-fringe C-mouse-1]
-    'gdb-mouse-toggle-breakpoint-fringe)
-
-  (define-key gud-minor-mode-map [left-margin drag-mouse-1]
-    'gdb-mouse-until)
-  (define-key gud-minor-mode-map [left-fringe drag-mouse-1]
-    'gdb-mouse-until)
-  (define-key gud-minor-mode-map [left-margin mouse-3]
-    'gdb-mouse-until)
-  (define-key gud-minor-mode-map [left-fringe mouse-3]
-    'gdb-mouse-until)
-
-  (define-key gud-minor-mode-map [left-margin C-drag-mouse-1]
-    'gdb-mouse-jump)
-  (define-key gud-minor-mode-map [left-fringe C-drag-mouse-1]
-    'gdb-mouse-jump)
-  (define-key gud-minor-mode-map [left-fringe C-mouse-3]
-    'gdb-mouse-jump)
-  (define-key gud-minor-mode-map [left-margin C-mouse-3]
-    'gdb-mouse-jump)
-
-  ;; (re-)initialize
-  (setq gdb-pc-address (if gdb-show-main "main" nil))
-  (setq gdb-previous-frame-pc-address nil
-       gdb-memory-address "main"
-       gdb-previous-frame nil
-       gdb-selected-frame nil
-       gdb-current-language nil
-       gdb-frame-number nil
-       gdb-var-list nil
-       gdb-main-file nil
-       gdb-first-post-prompt t
-       gdb-prompting nil
-       gdb-input-queue nil
-       gdb-current-item nil
-       gdb-pending-triggers nil
-       gdb-output-sink 'user
-       gdb-server-prefix "server "
-       gdb-location-alist nil
-       gdb-source-file-list nil
-       gdb-error nil
-       gdb-macro-info nil
-       gdb-buffer-fringe-width (car (window-fringes))
-       gdb-debug-log nil
-       gdb-signalled nil
-       gdb-source-window nil
-       gdb-inferior-status nil
-       gdb-continuation nil
-       gdb-look-up-stack nil
-        gdb-frame-begin nil
-       gdb-printing t
-       gud-old-arrow nil
-       gdb-thread-indicator nil
-       gdb-register-names nil
-       gdb-recording nil)
-
-  (setq gdb-buffer-type 'gdba)
-
-  (if gdb-use-separate-io-buffer (gdb-clear-inferior-io))
-
-  (if (eq system-type 'darwin)
-      (gdb-enqueue-input (list "server show version\n" 'gdb-apple-test)))
-
-  ;; Hack to see test for GDB 6.4+ (-stack-info-frame was implemented in 6.4)
-  (gdb-enqueue-input (list "server interpreter mi -stack-info-frame\n"
-                          'gdb-get-version)))
-
-(defun gdb-init-2 ()
-  (if (eq window-system 'w32)
-      (gdb-enqueue-input (list "set new-console off\n" 'ignore)))
-  (gdb-enqueue-input (list "set height 0\n" 'ignore))
-  (gdb-enqueue-input (list "set width 0\n" 'ignore))
-
-  (if (string-equal gdb-version "pre-6.4")
-      (if gdb-create-source-file-list
-       (gdb-enqueue-input (list (concat gdb-server-prefix "info sources\n")
-                                'gdb-set-gud-minor-mode-existing-buffers))
-       (setq gdb-locals-font-lock-keywords gdb-locals-font-lock-keywords-1))
-    ; Needs GDB 6.2 onwards.
-    (if gdb-create-source-file-list
-       (gdb-enqueue-input
-        (list "server interpreter mi \"-file-list-exec-source-files\"\n"
-              'gdb-set-gud-minor-mode-existing-buffers-1)))
-    (setq gdb-locals-font-lock-keywords gdb-locals-font-lock-keywords-2)
-    ; Needs GDB 7.0 onwards.
-    (gdb-enqueue-input
-     (list "server interpreter mi -enable-pretty-printing\n" 'ignore)))
-
-  ;; Find source file and compilation directory here.
-  ;; Works for C, C++, Fortran and Ada but not Java (GDB 6.4)
-  (gdb-enqueue-input (list "server list\n" 'ignore))
-  (gdb-enqueue-input (list "server list MAIN__\n" 'ignore))
-  (gdb-enqueue-input (list "server info source\n" 'gdb-source-info)))
-
-;; Workaround for some Apple versions of GDB that add ^M at EOL
-;; after the command "server interpreter mi -stack-info-frame".
-(defun gdb-apple-test ()
-  (goto-char (point-min))
-  (if (re-search-forward "(Apple version " nil t)
-      (let* ((process (get-buffer-process gud-comint-buffer))
-            (coding-systems (process-coding-system process)))
-       (set-process-coding-system process
-                                  (coding-system-change-eol-conversion
-                                   (car coding-systems) 'dos)
-                                  (cdr coding-systems)))))
-
-(defun gdb-get-version ()
-  (goto-char (point-min))
-  (if (re-search-forward "Undefined\\( mi\\)* command:" nil t)
-      (setq gdb-version "pre-6.4")
-    (setq gdb-version "6.4+"))
-  (gdb-init-2))
-
-(defmacro gdb-if-arrow (arrow-position &rest body)
-  `(if ,arrow-position
-      (let ((buffer (marker-buffer ,arrow-position)) (line))
-       (if (equal buffer (window-buffer (posn-window end)))
-           (with-current-buffer buffer
-             (when (or (equal start end)
-                       (equal (posn-point start)
-                              (marker-position ,arrow-position)))
-               ,@body))))))
-
-(defun gdb-mouse-until (event)
-  "Continue running until a source line past the current line.
-The destination source line can be selected either by clicking
-with mouse-3 on the fringe/margin or dragging the arrow
-with mouse-1 (default bindings)."
-  (interactive "e")
-  (let ((start (event-start event))
-       (end (event-end event)))
-    (gdb-if-arrow gud-overlay-arrow-position
-                 (setq line (line-number-at-pos (posn-point end)))
-                 (gud-call (concat "until " (number-to-string line))))
-    (gdb-if-arrow gdb-overlay-arrow-position
-                 (save-excursion
-                   (goto-char (point-min))
-                   (forward-line (1- (line-number-at-pos (posn-point end))))
-                   (forward-char 2)
-                   (gud-call (concat "until *%a"))))))
-
-(defun gdb-mouse-jump (event)
-  "Set execution address/line.
-The destination source line can be selected either by clicking with C-mouse-3
-on the fringe/margin or dragging the arrow with C-mouse-1 (default bindings).
-Unlike `gdb-mouse-until' the destination address can be before the current
-line, and no execution takes place."
-  (interactive "e")
-  (let ((start (event-start event))
-       (end (event-end event)))
-    (gdb-if-arrow gud-overlay-arrow-position
-                 (setq line (line-number-at-pos (posn-point end)))
-                 (progn
-                   (gud-call (concat "tbreak " (number-to-string line)))
-                   (gud-call (concat "jump " (number-to-string line)))))
-    (gdb-if-arrow gdb-overlay-arrow-position
-                 (save-excursion
-                   (goto-char (point-min))
-                   (forward-line (1- (line-number-at-pos (posn-point end))))
-                   (forward-char 2)
-                   (progn
-                     (gud-call (concat "tbreak *%a"))
-                     (gud-call (concat "jump *%a")))))))
-
-(defcustom gdb-speedbar-auto-raise nil
-  "If non-nil raise speedbar every time display of watch expressions is\
- updated."
-  :type 'boolean
-  :group 'gdb
-  :version "22.1")
-
-(defun gdb-speedbar-auto-raise (arg)
-  "Toggle automatic raising of the speedbar for watch expressions.
-With prefix argument ARG, automatically raise speedbar if ARG is
-positive, otherwise don't automatically raise it."
-  (interactive "P")
-  (setq gdb-speedbar-auto-raise
-       (if (null arg)
-           (not gdb-speedbar-auto-raise)
-         (> (prefix-numeric-value arg) 0)))
-  (message (format "Auto raising %sabled"
-                  (if gdb-speedbar-auto-raise "en" "dis"))))
-
-(defcustom gdb-use-colon-colon-notation nil
-  "If non-nil use FUN::VAR format to display variables in the speedbar."
-  :type 'boolean
-  :group 'gdb
-  :version "22.1")
-
-(define-key gud-minor-mode-map "\C-c\C-w" 'gud-watch)
-(define-key global-map (concat gud-key-prefix "\C-w") 'gud-watch)
-
-(declare-function tooltip-identifier-from-point "tooltip" (point))
-
-(defun gud-watch (&optional arg event)
-  "Watch expression at point.
-With arg, enter name of variable to be watched in the minibuffer."
-  (interactive (list current-prefix-arg last-input-event))
-  (let ((minor-mode (buffer-local-value 'gud-minor-mode gud-comint-buffer)))
-    (if (memq minor-mode '(gdbmi gdba))
-       (progn
-         (if event (posn-set-point (event-end event)))
-         (require 'tooltip)
-         (save-selected-window
-           (let ((expr
-                  (if arg
-                      (completing-read "Name of variable: "
-                                       'gud-gdb-complete-command)
-                    (if (and transient-mark-mode mark-active)
-                        (buffer-substring (region-beginning) (region-end))
-                      (concat (if (eq major-mode 'gdb-registers-mode) "$")
-                              (tooltip-identifier-from-point (point)))))))
-             (set-text-properties 0 (length expr) nil expr)
-             (gdb-enqueue-input
-              (list
-               (if (eq minor-mode 'gdba)
-                   (concat
-                    "server interpreter mi \"-var-create - * "  expr "\"\n")
-                 (concat"-var-create - * "  expr "\n"))
-               `(lambda () (gdb-var-create-handler ,expr)))))))
-      (message "gud-watch is a no-op in this mode."))))
-
-(declare-function speedbar-change-initial-expansion-list "speedbar" (new-default))
-
-(defun gdb-var-create-handler (expr)
-  (let* ((result (gdb-json-partial-output)))
-    (if (not (bindat-get-field result 'msg))
-        (let ((var
-              (list (bindat-get-field result 'name)
-                    (if (and (string-equal gdb-current-language "c")
-                             gdb-use-colon-colon-notation gdb-selected-frame)
-                        (setq expr (concat gdb-selected-frame "::" expr))
-                      expr)
-                    (bindat-get-field result 'numchild)
-                    (bindat-get-field result 'type)
-                    (bindat-get-field result 'value)
-                    nil
-                    (bindat-get-field result 'has_more)
-                     gdb-frame-address)))
-         (push var gdb-var-list)
-         (speedbar 1)
-         (unless (string-equal
-                  speedbar-initial-expansion-list-name "GUD")
-           (speedbar-change-initial-expansion-list "GUD")))
-      (message-box "No symbol \"%s\" in current context." expr))))
-
-(declare-function speedbar-timer-fn "speedbar" ())
-
-(defun gdb-speedbar-update ()
-  (when (and (boundp 'speedbar-frame) (frame-live-p speedbar-frame)
-            (not (member 'gdb-speedbar-timer gdb-pending-triggers)))
-    ;; Dummy command to update speedbar even when idle.
-    (gdb-enqueue-input (list "server pwd\n" 'gdb-speedbar-timer-fn))
-    ;; Keep gdb-pending-triggers non-nil till end.
-    (push 'gdb-speedbar-timer gdb-pending-triggers)))
-
-(defun gdb-speedbar-timer-fn ()
-  (if gdb-speedbar-auto-raise
-      (raise-frame speedbar-frame))
-  (setq gdb-pending-triggers
-       (delq 'gdb-speedbar-timer gdb-pending-triggers))
-  (speedbar-timer-fn))
-
-(defun gdb-var-evaluate-expression-handler (varnum changed)
-  (goto-char (point-min))
-  (re-search-forward "\\(.+\\)\\^done,value=\\(\".*\"\\)" nil t)
-  (setq gdb-pending-triggers
-       (delq (string-to-number (match-string 1)) gdb-pending-triggers))
-  (let ((var (assoc varnum gdb-var-list)))
-    (when var
-      (if changed (setcar (nthcdr 5 var) 'changed))
-      (setcar (nthcdr 4 var) (read (match-string 2)))))
-  (gdb-speedbar-update))
-
-(defun gdb-var-list-children (varnum)
-  (gdb-enqueue-input
-   (list (concat "server interpreter mi \"-var-list-children " varnum "\"\n")
-        `(lambda () (gdb-var-list-children-handler ,varnum)))))
-
-(defconst gdb-var-list-children-regexp
-  "child={.*?name=\"\\(.*?\\)\".*?,exp=\"\\(.*?\\)\".*?,\
-numchild=\"\\(.*?\\)\"\\(}\\|.*?,\\(type=\"\\(.*?\\)\"\\)?.*?}\\)")
-
-(defun gdb-var-list-children-handler (varnum)
-  (goto-char (point-min))
-  (let ((var-list nil))
-    (catch 'child-already-watched
-      (dolist (var gdb-var-list)
-       (if (string-equal varnum (car var))
-           (progn
-             (push var var-list)
-             (while (re-search-forward gdb-var-list-children-regexp nil t)
-               (let ((varchild (list (match-string 1)
-                                     (match-string 2)
-                                     (match-string 3)
-                                     (match-string 6)
-                                     nil nil)))
-                 (if (assoc (car varchild) gdb-var-list)
-                     (throw 'child-already-watched nil))
-                 (push varchild var-list)
-                 (gdb-enqueue-input
-                  (list
-                   (concat
-                    "server interpreter mi \"0-var-evaluate-expression "
-                    (car varchild) "\"\n")
-                   `(lambda () (gdb-var-evaluate-expression-handler
-                                ,(car varchild) nil)))))))
-         (push var var-list)))
-      (setq gdb-var-list (nreverse var-list)))))
-
-(defun gdb-var-update ()
-  (when (not (member 'gdb-var-update gdb-pending-triggers))
-    (gdb-enqueue-input
-     (list "server interpreter mi \"-var-update *\"\n"
-          'gdb-var-update-handler))
-    (push 'gdb-var-update gdb-pending-triggers)))
-
-(defconst gdb-var-update-regexp
-  "{.*?name=\"\\(.*?\\)\".*?,in_scope=\"\\(.*?\\)\".*?,\
-type_changed=\".*?\".*?}")
-
-(defun gdb-var-update-handler ()
-  (dolist (var gdb-var-list)
-    (setcar (nthcdr 5 var) nil))
-  (goto-char (point-min))
-  (let ((n 0))
-    (while (re-search-forward gdb-var-update-regexp nil t)
-      (let ((varnum (match-string 1)))
-       (if  (string-equal (match-string 2) "false")
-           (let ((var (assoc varnum gdb-var-list)))
-             (if var (setcar (nthcdr 5 var) 'out-of-scope)))
-         (setq n (1+ n))
-         (push n gdb-pending-triggers)
-         (gdb-enqueue-input
-          (list
-           (concat "server interpreter mi \"" (number-to-string n)
-                   "-var-evaluate-expression " varnum "\"\n")
-         `(lambda () (gdb-var-evaluate-expression-handler ,varnum t))))))))
-  (setq gdb-pending-triggers
-       (delq 'gdb-var-update gdb-pending-triggers)))
-
-(defun gdb-var-set-format (format)
-  "Set the output format for a variable displayed in the speedbar."
-  (let* ((var (nth (- (count-lines (point-min) (point)) 2) gdb-var-list))
-        (varnum (car var)))
-    (gdb-enqueue-input
-     (list
-      (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba)
-         (concat "server interpreter mi \"-var-set-format "
-                 varnum " " format "\"\n")
-       (concat "-var-set-format " varnum " " format "\n"))
-          `(lambda () (gdb-var-set-format-handler ,varnum))))))
-
-(defconst gdb-var-set-format-regexp
-  "format=\"\\(.*?\\)\",.*value=\"\\(.*?\\)\"")
-
-(defun gdb-var-set-format-handler (varnum)
-  (goto-char (point-min))
-  (if (re-search-forward gdb-var-set-format-regexp nil t)
-      (let ((var (assoc varnum gdb-var-list)))
-       (setcar (nthcdr 4 var) (match-string 2))
-       (gdb-var-update-1))))
-
-(defun gdb-var-delete-1 (var varnum)
-  (gdb-enqueue-input
-   (list
-    (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba)
-       (concat "server interpreter mi \"-var-delete " varnum "\"\n")
-      (concat "-var-delete " varnum "\n"))
-    'ignore))
-  (setq gdb-var-list (delq var gdb-var-list))
-  (dolist (varchild gdb-var-list)
-    (if (string-match (concat (car var) "\\.") (car varchild))
-       (setq gdb-var-list (delq varchild gdb-var-list)))))
-
-(defun gdb-var-delete ()
-  "Delete watch expression at point from the speedbar."
-  (interactive)
-  (if (memq (buffer-local-value 'gud-minor-mode gud-comint-buffer)
-           '(gdbmi gdba))
-      (let* ((var (nth (- (count-lines (point-min) (point)) 2) gdb-var-list))
-            (varnum (car var)))
-       (if (string-match "\\." (car var))
-           (message-box "Can only delete a root expression")
-         (gdb-var-delete-1 var varnum)))))
-
-(defun gdb-var-delete-children (varnum)
-  "Delete children of variable object at point from the speedbar."
-  (gdb-enqueue-input
-   (list
-    (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba)
-       (concat "server interpreter mi \"-var-delete -c " varnum "\"\n")
-      (concat "-var-delete -c " varnum "\n")) 'ignore)))
-
-(defun gdb-edit-value (text token indent)
-  "Assign a value to a variable displayed in the speedbar."
-  (let* ((var (nth (- (count-lines (point-min) (point)) 2) gdb-var-list))
-        (varnum (car var)) (value))
-    (setq value (read-string "New value: "))
-    (gdb-enqueue-input
-     (list
-      (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba)
-         (concat "server interpreter mi \"-var-assign "
-                 varnum " " value "\"\n")
-       (concat "-var-assign " varnum " " value "\n"))
-          `(lambda () (gdb-edit-value-handler ,value))))))
-
-(defun gdb-edit-value-handler (value)
-  (goto-char (point-min))
-  (if (re-search-forward gdb-error-regexp nil t)
-      (message-box "Invalid number or expression (%s)" value)))
-
-(defcustom gdb-show-changed-values t
-  "If non-nil change the face of out of scope variables and changed values.
-Out of scope variables are suppressed with `shadow' face.
-Changed values are highlighted with the face `font-lock-warning-face'."
-  :type 'boolean
-  :group 'gdb
-  :version "22.1")
-
-(defcustom gdb-max-children 40
-  "Maximum number of children before expansion requires confirmation."
-  :type 'integer
-  :group 'gdb
-  :version "22.1")
-
-(defcustom gdb-delete-out-of-scope t
-  "If non-nil delete watch expressions automatically when they go out of scope."
-  :type 'boolean
-  :group 'gdb
-  :version "22.2")
-
-(declare-function speedbar-change-expand-button-char "speedbar" (char))
-(declare-function speedbar-delete-subblock "speedbar" (indent))
-(declare-function speedbar-center-buffer-smartly "speedbar" ())
-
-(defun gdb-speedbar-expand-node (text token indent)
-  "Expand the node the user clicked on.
-TEXT is the text of the button we clicked on, a + or - item.
-TOKEN is data related to this node.
-INDENT is the current indentation depth."
-  (if (and gud-comint-buffer (buffer-name gud-comint-buffer))
-      (progn
-       (cond ((string-match "+" text)  ;expand this node
-              (let* ((var (assoc token gdb-var-list))
-                     (expr (nth 1 var)) (children (nth 2 var)))
-                (if (or (<= (string-to-number children) gdb-max-children)
-                         (y-or-n-p
-                          (format
-                           "%s has %s children.  Continue? " expr children)))
-                    (if (and (eq (buffer-local-value
-                                  'gud-minor-mode gud-comint-buffer) 'gdba)
-                             (string-equal gdb-version "pre-6.4"))
-                        (gdb-var-list-children token)
-                      (gdb-var-list-children-1 token)))))
-             ((string-match "-" text)  ;contract this node
-              (dolist (var gdb-var-list)
-                (if (string-match (concat token "\\.") (car var))
-                    (setq gdb-var-list (delq var gdb-var-list))))
-              (gdb-var-delete-children token)
-              (speedbar-change-expand-button-char ?+)
-              (speedbar-delete-subblock indent))
-             (t (error "Ooops...  not sure what to do")))
-       (speedbar-center-buffer-smartly))
-    (message-box "GUD session has been killed")))
-
-(defun gdb-get-target-string ()
-  (with-current-buffer gud-comint-buffer
-    gud-target-name))
-\f
-
-;;
-;; gdb buffers.
-;;
-;; Each buffer has a TYPE -- a symbol that identifies the function
-;; of that particular buffer.
-;;
-;; The usual gdb interaction buffer is given the type `gdba' and
-;; is constructed specially.
-;;
-;; Others are constructed by gdb-get-buffer-create and
-;; named according to the rules set forth in the gdb-buffer-rules-assoc
-
-(defvar gdb-buffer-rules-assoc '())
-
-(defun gdb-get-buffer (key)
-  "Return the gdb buffer tagged with type KEY.
-The key should be one of the cars in `gdb-buffer-rules-assoc'."
-  (save-excursion
-    (gdb-look-for-tagged-buffer key (buffer-list))))
-
-(defun gdb-get-buffer-create (key)
-  "Create a new gdb buffer of the type specified by KEY.
-The key should be one of the cars in `gdb-buffer-rules-assoc'."
-  (or (gdb-get-buffer key)
-      (let* ((rules (assoc key gdb-buffer-rules-assoc))
-            (name (funcall (gdb-rules-name-maker rules)))
-            (new (get-buffer-create name)))
-       (with-current-buffer new
-         (let ((trigger))
-           (if (cdr (cdr rules))
-               (setq trigger (funcall (car (cdr (cdr rules))))))
-           (setq gdb-buffer-type key)
-           (set (make-local-variable 'gud-minor-mode)
-                (buffer-local-value 'gud-minor-mode gud-comint-buffer))
-           (set (make-local-variable 'tool-bar-map) gud-tool-bar-map)
-           (if trigger (funcall trigger)))
-         new))))
-
-(defun gdb-rules-name-maker (rules) (car (cdr rules)))
-
-(defun gdb-look-for-tagged-buffer (key bufs)
-  (let ((retval nil))
-    (while (and (not retval) bufs)
-      (set-buffer (car bufs))
-      (if (eq gdb-buffer-type key)
-         (setq retval (car bufs)))
-      (setq bufs (cdr bufs)))
-    retval))
-
-;;
-;; This assoc maps buffer type symbols to rules.  Each rule is a list of
-;; at least one and possible more functions.  The functions have these
-;; roles in defining a buffer type:
-;;
-;;     NAME - Return a name for this  buffer type.
-;;
-;; The remaining function(s) are optional:
-;;
-;;     MODE - called in a new buffer with no arguments, should establish
-;;           the proper mode for the buffer.
-;;
-
-(defun gdb-set-buffer-rules (buffer-type &rest rules)
-  (let ((binding (assoc buffer-type gdb-buffer-rules-assoc)))
-    (if binding
-       (setcdr binding rules)
-      (push (cons buffer-type rules)
-           gdb-buffer-rules-assoc))))
-
-;; GUD buffers are an exception to the rules
-(gdb-set-buffer-rules 'gdba 'error)
-
-;; Partial-output buffer : This accumulates output from a command executed on
-;; behalf of emacs (rather than the user).
-;;
-(gdb-set-buffer-rules 'gdb-partial-output-buffer
-                     'gdb-partial-output-name)
-
-(defun gdb-partial-output-name ()
-  (concat " *partial-output-"
-         (gdb-get-target-string)
-         "*"))
-
-\f
-(gdb-set-buffer-rules 'gdb-inferior-io
-                     'gdb-inferior-io-name
-                     'gdb-inferior-io-mode)
-
-(defun gdb-inferior-io-name ()
-  (concat "*input/output of "
-         (gdb-get-target-string)
-         "*"))
-
-(defun gdb-display-separate-io-buffer ()
-  "Display IO of debugged program in a separate window."
-  (interactive)
-  (if gdb-use-separate-io-buffer
-      (gdb-display-buffer
-       (gdb-get-buffer-create 'gdb-inferior-io) t)))
-
-(defconst gdb-frame-parameters
-  '((height . 14) (width . 80)
-    (unsplittable . t)
-    (tool-bar-lines . nil)
-    (menu-bar-lines . nil)
-    (minibuffer . nil)))
-
-(defun gdb-frame-separate-io-buffer ()
-  "Display IO of debugged program in a new frame."
-  (interactive)
-  (if gdb-use-separate-io-buffer
-      (let ((special-display-regexps (append special-display-regexps '(".*")))
-           (special-display-frame-alist gdb-frame-parameters))
-       (display-buffer (gdb-get-buffer-create 'gdb-inferior-io)))))
-
-(defvar gdb-inferior-io-mode-map
-  (let ((map (make-sparse-keymap)))
-    (define-key map "\C-c\C-c" 'gdb-separate-io-interrupt)
-    (define-key map "\C-c\C-z" 'gdb-separate-io-stop)
-    (define-key map "\C-c\C-\\" 'gdb-separate-io-quit)
-    (define-key map "\C-c\C-d" 'gdb-separate-io-eof)
-    (define-key map "\C-d" 'gdb-separate-io-eof)
-    map))
-
-(define-derived-mode gdb-inferior-io-mode comint-mode "Inferior I/O"
-  "Major mode for gdb inferior-io."
-  :syntax-table nil :abbrev-table nil
-  ;; We want to use comint because it has various nifty and familiar
-  ;; features.  We don't need a process, but comint wants one, so create
-  ;; a dummy one.
-  (make-comint-in-buffer
-   (substring (buffer-name) 1 (- (length (buffer-name)) 1))
-   (current-buffer) "hexl")
-  (setq comint-input-sender 'gdb-inferior-io-sender))
-
-(defun gdb-inferior-io-sender (proc string)
-  ;; PROC is the pseudo-process created to satisfy comint.
-  (with-current-buffer (process-buffer proc)
-    (setq proc (get-buffer-process gud-comint-buffer))
-    (process-send-string proc string)
-    (process-send-string proc "\n")))
-
-(defun gdb-separate-io-interrupt ()
-  "Interrupt the program being debugged."
-  (interactive)
-  (interrupt-process
-   (get-buffer-process gud-comint-buffer) comint-ptyp))
-
-(defun gdb-separate-io-quit ()
-  "Send quit signal to the program being debugged."
-  (interactive)
-  (quit-process
-   (get-buffer-process gud-comint-buffer) comint-ptyp))
-
-(defun gdb-separate-io-stop ()
-  "Stop the program being debugged."
-  (interactive)
-  (stop-process
-   (get-buffer-process gud-comint-buffer) comint-ptyp))
-
-(defun gdb-separate-io-eof ()
-  "Send end-of-file to the program being debugged."
-  (interactive)
-  (process-send-eof
-   (get-buffer-process gud-comint-buffer)))
-\f
-
-;; gdb communications
-;;
-
-;; INPUT: things sent to gdb
-;;
-;; The queues are lists.  Each element is either a string (indicating user or
-;; user-like input) or a list of the form:
-;;
-;;    (INPUT-STRING  HANDLER-FN)
-;;
-;; The handler function will be called from the partial-output buffer when the
-;; command completes.  This is the way to write commands which invoke gdb
-;; commands autonomously.
-;;
-;; These lists are consumed tail first.
-;;
-
-(defun gdb-send (proc string)
-  "A comint send filter for gdb.
-This filter may simply queue input for a later time."
-  (if gdb-ready
-      (progn
-       (with-current-buffer gud-comint-buffer
-         (let ((inhibit-read-only t))
-           (remove-text-properties (point-min) (point-max) '(face))))
-       (if gud-running
-           (progn
-             (let ((item (concat string "\n")))
-               (if gdb-enable-debug (push (cons 'send item) gdb-debug-log))
-               (process-send-string proc item)))
-         (if (string-match "\\\\\\'" string)
-             (setq gdb-continuation (concat gdb-continuation string "\n"))
-           (let ((item (concat
-                        gdb-continuation string
-                        (if (not comint-input-sender-no-newline) "\n"))))
-             (gdb-enqueue-input item)
-             (setq gdb-continuation nil)))))
-    (push (concat string "\n")  gdb-early-user-input)))
-
-;; Note: Stuff enqueued here will be sent to the next prompt, even if it
-;; is a query, or other non-top-level prompt.
-
-(defun gdb-enqueue-input (item)
-  (if (not gud-running)
-      (if gdb-prompting
-         (progn
-           (gdb-send-item item)
-           (setq gdb-prompting nil))
-       (push item gdb-input-queue))))
-
-(defun gdb-dequeue-input ()
-  (let ((queue gdb-input-queue))
-    (if queue
-       (let ((last (car (last queue))))
-         (unless (nbutlast queue) (setq gdb-input-queue '()))
-         last)
-      ;; This should be nil here anyway but set it just to make sure.
-      (setq gdb-pending-triggers nil))))
-
-(defun gdb-send-item (item)
-  (setq gdb-flush-pending-output nil)
-  (if gdb-enable-debug (push (cons 'send-item item) gdb-debug-log))
-  (setq gdb-current-item item)
-  (let ((process (get-buffer-process gud-comint-buffer)))
-    (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba)
-       (if (stringp item)
-           (progn
-             (setq gdb-output-sink 'user)
-             (process-send-string process item))
-         (progn
-           (gdb-clear-partial-output)
-           (setq gdb-output-sink 'pre-emacs)
-           (process-send-string process
-                                (car item))))
-      ;; case: eq gud-minor-mode 'gdbmi
-      (gdb-clear-partial-output)
-      (setq gdb-output-sink 'emacs)
-      (process-send-string process (car item)))))
-\f
-;;
-;; output -- things gdb prints to emacs
-;;
-;; GDB output is a stream interrupted by annotations.
-;; Annotations can be recognized by their beginning
-;; with \C-j\C-z\C-z<tag><opt>\C-j
-;;
-;; The tag is a string obeying symbol syntax.
-;;
-;; The optional part `<opt>' can be either the empty string
-;; or a space followed by more data relating to the annotation.
-;; For example, the SOURCE annotation is followed by a filename,
-;; line number and various useless goo.  This data must not include
-;; any newlines.
-;;
-
-(defcustom gud-gdb-command-name "gdb --annotate=3"
-  "Default command to execute an executable under the GDB debugger.
-The option \"--annotate=3\" must be included in this value if you
-want the GDB Graphical Interface."
-  :type 'string
-  :group 'gud
-  :version "22.1")
-
-(defvar gdb-annotation-rules
-  '(("pre-prompt" gdb-pre-prompt)
-    ("prompt" gdb-prompt)
-    ("commands" gdb-subprompt)
-    ("overload-choice" gdb-subprompt)
-    ("query" gdb-subprompt)
-    ;; Need this prompt for GDB 6.1
-    ("nquery" gdb-subprompt)
-    ("prompt-for-continue" gdb-subprompt)
-    ("post-prompt" gdb-post-prompt)
-    ("source" gdb-source)
-    ("starting" gdb-starting)
-    ("exited" gdb-exited)
-    ("signalled" gdb-signalled)
-    ("signal" gdb-signal)
-    ("breakpoint" gdb-stopping)
-    ("watchpoint" gdb-stopping)
-    ("frame-begin" gdb-frame-begin)
-    ("stopped" gdb-stopped)
-    ("error-begin" gdb-error)
-    ("error" gdb-error)
-    ("new-thread" (lambda (ignored)
-                   (gdb-get-buffer-create 'gdb-threads-buffer)))
-    ("thread-changed" gdb-thread-changed))
-  "An assoc mapping annotation tags to functions which process them.")
-
-(defun gdb-resync()
-  (setq gdb-flush-pending-output t)
-  (setq gud-running nil)
-  (gdb-force-mode-line-update
-   (propertize "stopped" 'face font-lock-warning-face))
-  (setq gdb-output-sink 'user)
-  (setq gdb-input-queue nil)
-  (setq gdb-pending-triggers nil)
-  (setq gdb-prompting t))
-
-(defconst gdb-source-spec-regexp
-  "\\(.*\\):\\([0-9]*\\):[0-9]*:[a-z]*:0x0*\\([a-f0-9]*\\)")
-
-;; Do not use this except as an annotation handler.
-(defun gdb-source (args)
-  (string-match gdb-source-spec-regexp args)
-  ;; Extract the frame position from the marker.
-  (setq gud-last-frame
-       (cons
-        (match-string 1 args)
-        (string-to-number (match-string 2 args))))
-  (setq gdb-pc-address (match-string 3 args))
-  ;; cover for auto-display output which comes *before*
-  ;; stopped annotation
-  (if (eq gdb-output-sink 'inferior) (setq gdb-output-sink 'user)))
-
-(defun gdb-pre-prompt (ignored)
-  "An annotation handler for `pre-prompt'.
-This terminates the collection of output from a previous command if that
-happens to be in effect."
-  (setq gdb-error nil)
-  (let ((sink gdb-output-sink))
-    (cond
-     ((eq sink 'user) t)
-     ((eq sink 'emacs)
-      (setq gdb-output-sink 'post-emacs))
-     (t
-      (gdb-resync)
-      (error "Phase error in gdb-pre-prompt (got %s)" sink)))))
-
-(defun gdb-prompt (ignored)
-  "An annotation handler for `prompt'.
-This sends the next command (if any) to gdb."
-  (when gdb-first-prompt
-    (gdb-force-mode-line-update
-     (propertize "initializing..." 'face font-lock-variable-name-face))
-    (gdb-init-1)
-    (setq gdb-first-prompt nil))
-  (let ((sink gdb-output-sink))
-    (cond
-     ((eq sink 'user) t)
-     ((eq sink 'post-emacs)
-      (setq gdb-output-sink 'user)
-      (let ((handler
-            (car (cdr gdb-current-item))))
-       (with-current-buffer (gdb-get-buffer-create 'gdb-partial-output-buffer)
-         (funcall handler))))
-     (t
-      (gdb-resync)
-      (error "Phase error in gdb-prompt (got %s)" sink))))
-  (let ((input (gdb-dequeue-input)))
-    (if input
-       (gdb-send-item input)
-      (progn
-       (setq gdb-prompting t)
-       (gud-display-frame)
-       (setq gdb-early-user-input (nreverse gdb-early-user-input))
-       (while gdb-early-user-input
-           (gdb-enqueue-input (car gdb-early-user-input))
-           (setq gdb-early-user-input (cdr gdb-early-user-input)))))))
-
-(defun gdb-subprompt (ignored)
-  "An annotation handler for non-top-level prompts."
-  (setq gdb-prompting t))
-
-(defun gdb-starting (ignored)
-  "An annotation handler for `starting'.
-This says that I/O for the subprocess is now the program being debugged,
-not GDB."
-  (setq gdb-active-process t)
-  (setq gdb-printing t)
-  (let ((sink gdb-output-sink))
-    (cond
-     ((eq sink 'user)
-      (progn
-       (setq gud-running t)
-       (setq gdb-stack-update t)
-       ;; Temporarily set gud-running to nil to force "info stack" onto queue.
-       (let ((gud-running nil))
-         (gdb-invalidate-frames)
-         (unless (or gdb-register-names
-                     (string-equal gdb-version "pre-6.4"))
-           (gdb-enqueue-input
-            (list "server interpreter mi -data-list-register-names\n"
-                  'gdb-get-register-names))))
-       (setq gdb-inferior-status "running")
-       (setq gdb-signalled nil)
-       (gdb-force-mode-line-update
-        (propertize gdb-inferior-status 'face font-lock-type-face))
-       (gdb-remove-text-properties)
-       (setq gud-old-arrow gud-overlay-arrow-position)
-       (setq gud-overlay-arrow-position nil)
-       (setq gdb-overlay-arrow-position nil)
-       (setq gdb-stack-position nil)
-       (if gdb-use-separate-io-buffer
-           (setq gdb-output-sink 'inferior))))
-     (t
-      (gdb-resync)
-      (error "Unexpected `starting' annotation")))))
-
-(defun gdb-signal (ignored)
-  (setq gdb-inferior-status "signal")
-  (gdb-force-mode-line-update
-   (propertize gdb-inferior-status 'face font-lock-warning-face))
-  (gdb-stopping ignored))
-
-(defun gdb-stopping (ignored)
-  "An annotation handler for `breakpoint' and other annotations.
-They say that I/O for the subprocess is now GDB, not the program
-being debugged."
-  (if gdb-use-separate-io-buffer
-      (let ((sink gdb-output-sink))
-       (cond
-        ((eq sink 'inferior)
-         (setq gdb-output-sink 'user))
-        (t
-         (gdb-resync)
-         (error "Unexpected stopping annotation"))))))
-
-(defun gdb-exited (ignored)
-  "An annotation handler for `exited' and `signalled'.
-They say that I/O for the subprocess is now GDB, not the program
-being debugged and that the program is no longer running.  This
-function is used to change the focus of GUD tooltips to #define
-directives."
-  (setq gdb-active-process nil)
-  (setq gud-overlay-arrow-position nil)
-  (setq gdb-overlay-arrow-position nil)
-  (setq gdb-stack-position nil)
-  (setq gud-old-arrow nil)
-  (setq gdb-inferior-status "exited")
-  (gdb-force-mode-line-update
-   (propertize gdb-inferior-status 'face font-lock-warning-face))
-  (gdb-stopping ignored))
-
-(defun gdb-signalled (ignored)
-  (setq gdb-signalled t))
-
-(defun gdb-frame-begin (ignored)
-  (setq gdb-frame-begin t)
-  (setq gdb-printing nil)
-  (let ((sink gdb-output-sink))
-    (cond
-     ((eq sink 'inferior)
-      (setq gdb-output-sink 'user))
-     ((eq sink 'user) t)
-     ((eq sink 'emacs) t)
-     (t
-      (gdb-resync)
-      (error "Unexpected frame-begin annotation (%S)" sink)))))
-
-(defcustom gdb-same-frame (not focus-follows-mouse)
-  "Non-nil means pop up GUD buffer in same frame."
-  :group 'gdb
-  :type 'boolean
-  :version "22.1")
-
-(defcustom gdb-find-source-frame nil
-  "Non-nil means try to find a source frame further up stack e.g after signal."
-  :group 'gdb
-  :type 'boolean
-  :version "22.1")
-
-(defun gdb-find-source-frame (arg)
-  "Toggle looking for a source frame further up call stack.
-The code associated with current (innermost) frame may not have
-been compiled with debug information, e.g., C library routine.
-With prefix argument ARG, look for a source frame further up
-stack to display in the source buffer if ARG is positive,
-otherwise don't look further up."
-  (interactive "P")
-  (setq gdb-find-source-frame
-       (if (null arg)
-           (not gdb-find-source-frame)
-         (> (prefix-numeric-value arg) 0)))
-  (message (format "Looking for source frame %sabled"
-                  (if gdb-find-source-frame "en" "dis"))))
-
-(defun gdb-stopped (ignored)
-  "An annotation handler for `stopped'.
-It is just like `gdb-stopping', except that if we already set the output
-sink to `user' in `gdb-stopping', that is fine."
-  (setq gud-running nil)
-  (unless (or gud-overlay-arrow-position gud-last-frame)
-    (if (and gdb-frame-begin gdb-printing)
-       (setq gud-overlay-arrow-position gud-old-arrow)
-    ;;Pop up GUD buffer to display current frame when it doesn't have source
-    ;;information i.e if not compiled with -g as with libc routines generally.
-    (if gdb-same-frame
-       (gdb-display-gdb-buffer)
-      (gdb-frame-gdb-buffer))
-    (if gdb-find-source-frame
-    ;;Try to find source further up stack e.g after signal.
-       (setq gdb-look-up-stack
-             (if (gdb-get-buffer 'gdb-stack-buffer)
-                 'keep
-               (progn
-                 (gdb-get-buffer-create 'gdb-stack-buffer)
-                 (gdb-invalidate-frames)
-                 'delete))))))
-  (unless (member gdb-inferior-status '("exited" "signal"))
-    (setq gdb-active-process t) ;Just for attaching case.
-    (setq gdb-inferior-status "stopped")
-    (gdb-force-mode-line-update
-     (propertize gdb-inferior-status 'face font-lock-warning-face)))
-  (let ((sink gdb-output-sink))
-    (cond
-     ((eq sink 'inferior)
-      (setq gdb-output-sink 'user))
-     ((eq sink 'user) t)
-     (t
-      (gdb-resync)
-      (error "Unexpected stopped annotation"))))
-  (if gdb-signalled (gdb-exited ignored)))
-
-(defun gdb-error (ignored)
-  (setq gdb-error (not gdb-error)))
-
-(defun gdb-thread-changed (ignored)
-  (gdb-frames-force-update))
-
-(defun gdb-post-prompt (ignored)
-  "An annotation handler for `post-prompt'.
-This begins the collection of output from the current command if that
-happens to be appropriate."
-  ;; Don't add to queue if there outstanding items or gdb-version is not known
-  ;; yet.
-  (unless (or gdb-pending-triggers gdb-first-post-prompt)
-    (gdb-get-selected-frame)
-    (gdb-invalidate-frames)
-    ;; Regenerate breakpoints buffer in case it has been inadvertantly deleted.
-    (gdb-get-buffer-create 'gdb-breakpoints-buffer)
-    (gdb-invalidate-breakpoints)
-    ;; Do this through gdb-get-selected-frame -> gdb-frame-handler
-    ;; so gdb-pc-address is updated.
-    ;; (gdb-invalidate-assembler)
-
-    (if (string-equal gdb-version "pre-6.4")
-       (gdb-invalidate-registers)
-      (gdb-get-changed-registers)
-      (gdb-invalidate-registers-1))
-
-    (gdb-invalidate-memory)
-    (if (string-equal gdb-version "pre-6.4")
-       (gdb-invalidate-locals)
-      (gdb-invalidate-locals-1))
-
-    (gdb-invalidate-threads)
-    (unless (or (null gdb-var-list)
-            (eq system-type 'darwin)) ;Breaks on Darwin's GDB-5.3.
-      ;; FIXME: with GDB-6 on Darwin, this might very well work.
-      ;; Only needed/used with speedbar/watch expressions.
-      (when (and (boundp 'speedbar-frame) (frame-live-p speedbar-frame))
-       (if (string-equal gdb-version "pre-6.4")
-           (gdb-var-update)
-         (gdb-var-update-1)))))
-  (setq gdb-first-post-prompt nil)
-  (let ((sink gdb-output-sink))
-    (cond
-     ((eq sink 'user) t)
-     ((eq sink 'pre-emacs)
-      (setq gdb-output-sink 'emacs))
-     (t
-      (gdb-resync)
-      (error "Phase error in gdb-post-prompt (got %s)" sink)))))
-
-(defconst gdb-buffer-list
-'(gdb-stack-buffer gdb-locals-buffer gdb-registers-buffer gdb-threads-buffer))
-
-(defun gdb-remove-text-properties ()
-  (dolist (buffertype gdb-buffer-list)
-    (let ((buffer (gdb-get-buffer buffertype)))
-      (if buffer
-         (with-current-buffer buffer
-           (let ((inhibit-read-only t))
-             (remove-text-properties
-              (point-min) (point-max) '(mouse-face nil help-echo nil))))))))
-
-;; GUD displays the selected GDB frame.  This might might not be the current
-;; GDB frame (after up, down etc).  If no GDB frame is visible but the last
-;; visited breakpoint is, use that window.
-(defun gdb-display-source-buffer (buffer)
-  (let* ((last-window (if gud-last-last-frame
-                        (get-buffer-window
-                         (gud-find-file (car gud-last-last-frame)))))
-        (source-window (or last-window
-                           (if (and gdb-source-window
-                                    (window-live-p gdb-source-window))
-                               gdb-source-window))))
-    (when source-window
-      (setq gdb-source-window source-window)
-      (set-window-buffer source-window buffer))
-    source-window))
-
-;; Derived from gud-gdb-marker-regexp
-(defvar gdb-fullname-regexp
-  (concat "\\(.:?[^" ":" "\n]*\\)" ":" "\\([0-9]*\\)" ":" ".*"))
-
-(defun gud-gdba-marker-filter (string)
-  "A gud marker filter for gdb.  Handle a burst of output from GDB."
-  (if gdb-flush-pending-output
-      nil
-    (when gdb-enable-debug
-       (push (cons 'recv string) gdb-debug-log)
-       (if (and gdb-debug-log-max
-                (> (length gdb-debug-log) gdb-debug-log-max))
-           (setcdr (nthcdr (1- gdb-debug-log-max) gdb-debug-log) nil)))
-    ;; Recall the left over gud-marker-acc from last time.
-    (setq gud-marker-acc (concat gud-marker-acc string))
-    ;; Start accumulating output for the GUD buffer.
-    (let ((output ""))
-      ;;
-      ;; Process all the complete markers in this chunk.
-      (while (string-match "\n\032\032\\(.*\\)\n" gud-marker-acc)
-       (let ((annotation (match-string 1 gud-marker-acc))
-             (before (substring gud-marker-acc 0 (match-beginning 0)))
-             (after (substring gud-marker-acc (match-end 0))))
-         ;;
-         ;; Parse the tag from the annotation, and maybe its arguments.
-         (string-match "\\(\\S-*\\) ?\\(.*\\)" annotation)
-         (let* ((annotation-type (match-string 1 annotation))
-                (annotation-arguments (match-string 2 annotation))
-                (annotation-rule (assoc annotation-type
-                                        gdb-annotation-rules)))
-
-           ;; Stuff prior to the match is just ordinary output.
-           ;; It is either concatenated to OUTPUT or directed
-           ;; elsewhere.
-           (setq output (gdb-concat-output output before))
-
-           ;; Take that stuff off the gud-marker-acc.
-           (setq gud-marker-acc after)
-
-           ;; Call the handler for this annotation.
-           (if annotation-rule
-               (funcall (car (cdr annotation-rule))
-                        annotation-arguments))
-
-           ;; Else the annotation is not recognized.  Ignore it silently,
-           ;; so that GDB can add new annotations without causing
-           ;; us to blow up.
-           )))
-
-      ;; Does the remaining text end in a partial line?
-      ;; If it does, then keep part of the gud-marker-acc until we get more.
-      (if (string-match "\n\\'\\|\n\032\\'\\|\n\032\032.*\\'"
-                       gud-marker-acc)
-         (progn
-           ;; Everything before the potential marker start can be output.
-           (setq output
-                 (gdb-concat-output output
-                                    (substring gud-marker-acc 0
-                                               (match-beginning 0))))
-           ;;
-           ;; Everything after, we save, to combine with later input.
-           (setq gud-marker-acc (substring gud-marker-acc
-                                           (match-beginning 0))))
-       ;;
-       ;; In case we know the gud-marker-acc contains no partial annotations:
-       (progn
-         (setq output (gdb-concat-output output gud-marker-acc))
-         (setq gud-marker-acc "")))
-      output)))
-
-(defun gdb-concat-output (so-far new)
-  (if gdb-error
-      (put-text-property 0 (length new) 'face font-lock-warning-face new))
-  (let ((sink gdb-output-sink))
-    (cond
-     ((eq sink 'user) (concat so-far new))
-     ((or (eq sink 'pre-emacs) (eq sink 'post-emacs)) so-far)
-     ((eq sink 'emacs)
-      (gdb-append-to-partial-output new)
-      so-far)
-     ((eq sink 'inferior)
-      (gdb-append-to-inferior-io new)
-      so-far)
-     (t
-      (gdb-resync)
-      (error "Bogon output sink %S" sink)))))
-
-(defun gdb-append-to-partial-output (string)
-  (with-current-buffer (gdb-get-buffer-create 'gdb-partial-output-buffer)
-    (goto-char (point-max))
-    (insert string)))
-
-(defun gdb-clear-partial-output ()
-  (with-current-buffer (gdb-get-buffer-create 'gdb-partial-output-buffer)
-    (erase-buffer)))
-
-(defun gdb-append-to-inferior-io (string)
-  (with-current-buffer (gdb-get-buffer-create 'gdb-inferior-io)
-    (goto-char (point-max))
-    (insert-before-markers string))
-  (if (not (string-equal string ""))
-      (gdb-display-buffer (gdb-get-buffer-create 'gdb-inferior-io) t)))
-
-(defun gdb-clear-inferior-io ()
-  (with-current-buffer (gdb-get-buffer-create 'gdb-inferior-io)
-    (erase-buffer)))
-
-(defun gdb-jsonify-buffer (&optional fix-key fix-list)
-  "Prepare GDB/MI output in current buffer for parsing with `json-read'.
-
-Field names are wrapped in double quotes and equal signs are
-replaced with semicolons.
-
-If FIX-KEY is non-nil, strip all \"FIX-KEY=\" occurrences from
-partial output.  This is used to get rid of useless keys in lists
-in MI messages, e.g.: [key=.., key=..].  -stack-list-frames and
--break-info are examples of MI commands which issue such
-responses.
-
-If FIX-LIST is non-nil, \"FIX-LIST={..}\" is replaced with
-\"FIX-LIST=[..]\" prior to parsing.  This is used to fix broken
--break-info output when it contains breakpoint script field
-incompatible with GDB/MI output syntax."
-  (save-excursion
-    (goto-char (point-min))
-    ;; Sometimes missing symbol information precedes "^done" record.
-    (re-search-forward "[[:ascii:]]*?\\^done," nil t)
-    (replace-match "")
-    (re-search-forward "(gdb) \n" nil t)
-    (replace-match "")
-    (goto-char (point-min))
-    (when fix-key
-      (save-excursion
-        (while (re-search-forward (concat "[\\[,]\\(" fix-key "=\\)") nil t)
-          (replace-match "" nil nil nil 1))))
-    (when fix-list
-      (save-excursion
-        ;; Find positions of braces which enclose broken list
-        (while (re-search-forward (concat fix-list "={\"") nil t)
-          (let ((p1 (goto-char (- (point) 2)))
-                (p2 (progn (forward-sexp)
-                           (1- (point)))))
-            ;; Replace braces with brackets
-            (save-excursion
-              (goto-char p1)
-              (delete-char 1)
-              (insert "[")
-              (goto-char p2)
-              (delete-char 1)
-              (insert "]"))))))
-    (goto-char (point-min))
-    (insert "{")
-    (while (re-search-forward
-           "\\([[:alnum:]-_]+\\)=\\({\\|\\[\\|\"\"\\|\".*?[^\\]\"\\)" nil t)
-      (replace-match "\"\\1\":\\2" nil nil))
-    (goto-char (point-max))
-    (insert "}")))
-
-(defun gdb-json-read-buffer (&optional fix-key fix-list)
-  "Prepare and parse GDB/MI output in current buffer with `json-read'.
-
-FIX-KEY and FIX-LIST work as in `gdb-jsonify-buffer'."
-  (gdb-jsonify-buffer fix-key fix-list)
-  (save-excursion
-    (goto-char (point-min))
-    (let ((json-array-type 'list))
-      (json-read))))
-
-(defun gdb-json-partial-output (&optional fix-key fix-list)
-  "Prepare and parse gdb-partial-output-buffer with `json-read'.
-
-FIX-KEY and FIX-KEY work as in `gdb-jsonify-buffer'."
-  (with-current-buffer (gdb-get-buffer-create 'gdb-partial-output-buffer)
-    (gdb-json-read-buffer fix-key fix-list)))
-\f
-
-;; One trick is to have a command who's output is always available in a buffer
-;; of it's own, and is always up to date.  We build several buffers of this
-;; type.
-;;
-;; There are two aspects to this: gdb has to tell us when the output for that
-;; command might have changed, and we have to be able to run the command
-;; behind the user's back.
-;;
-;; The output phasing associated with the variable gdb-output-sink
-;; help us to run commands behind the user's back.
-;;
-;; Below is the code for specificly managing buffers of output from one
-;; command.
-;;
-
-;; The trigger function is suitable for use in the assoc GDB-ANNOTATION-RULES
-;; It adds an input for the command we are tracking.  It should be the
-;; annotation rule binding of whatever gdb sends to tell us this command
-;; might have changed it's output.
-;;
-;; NAME is the function name.  DEMAND-PREDICATE tests if output is really needed.
-;; GDB-COMMAND is a string of such.  OUTPUT-HANDLER is the function bound to the
-;; input in the input queue (see comment about ``gdb communications'' above).
-
-(defmacro def-gdb-auto-update-trigger (name demand-predicate gdb-command
-                                           output-handler)
-  `(defun ,name (&optional ignored)
-     (if (and ,demand-predicate
-             (not (member ',name
-                          gdb-pending-triggers)))
-        (progn
-          (gdb-enqueue-input
-           (list ,gdb-command ',output-handler))
-          (push ',name gdb-pending-triggers)))))
-
-(defmacro def-gdb-auto-update-handler (name trigger buf-key custom-defun)
-  `(defun ,name ()
-     (setq gdb-pending-triggers
-      (delq ',trigger
-           gdb-pending-triggers))
-     (let ((buf (gdb-get-buffer ',buf-key)))
-       (and buf
-           (with-current-buffer buf
-             (let* ((window (get-buffer-window buf 0))
-                    (start (window-start window))
-                    (p (if window (window-point window) (point)))
-                   (buffer-read-only nil))
-               (erase-buffer)
-               (insert-buffer-substring (gdb-get-buffer-create
-                                         'gdb-partial-output-buffer))
-               (if window
-                   (progn
-                     (set-window-start window start)
-                     (set-window-point window p))
-                 (goto-char p))))))
-     ;; put customisation here
-     (,custom-defun)))
-
-(defmacro def-gdb-auto-updated-buffer (buffer-key
-                                      trigger-name gdb-command
-                                      output-handler-name custom-defun)
-  `(progn
-     (def-gdb-auto-update-trigger ,trigger-name
-       ;; The demand predicate:
-       (gdb-get-buffer ',buffer-key)
-       ,gdb-command
-       ,output-handler-name)
-     (def-gdb-auto-update-handler ,output-handler-name
-       ,trigger-name ,buffer-key ,custom-defun)))
-
-\f
-;;
-;; Breakpoint buffer : This displays the output of `info breakpoints'.
-;;
-(gdb-set-buffer-rules 'gdb-breakpoints-buffer
-                     'gdb-breakpoints-buffer-name
-                     'gdb-breakpoints-mode)
-
-(def-gdb-auto-updated-buffer gdb-breakpoints-buffer
-  ;; This defines the auto update rule for buffers of type
-  ;; `gdb-breakpoints-buffer'.
-  ;;
-  ;; It defines a function to serve as the annotation handler that
-  ;; handles the `foo-invalidated' message.  That function is called:
-  gdb-invalidate-breakpoints
-  ;;
-  ;; To update the buffer, this command is sent to gdb.
-  "server info breakpoints\n"
-  ;;
-  ;; This also defines a function to be the handler for the output
-  ;; from the command above.  That function will copy the output into
-  ;; the appropriately typed buffer.  That function will be called:
-  gdb-info-breakpoints-handler
-  ;; buffer specific functions
-  gdb-info-breakpoints-custom)
-
-(defconst breakpoint-xpm-data
-  "/* XPM */
-static char *magick[] = {
-/* columns rows colors chars-per-pixel */
-\"10 10 2 1\",
-\"  c red\",
-\"+ c None\",
-/* pixels */
-\"+++    +++\",
-\"++      ++\",
-\"+        +\",
-\"          \",
-\"          \",
-\"          \",
-\"          \",
-\"+        +\",
-\"++      ++\",
-\"+++    +++\",
-};"
-  "XPM data used for breakpoint icon.")
-
-(defconst breakpoint-enabled-pbm-data
-  "P1
-10 10\",
-0 0 0 0 1 1 1 1 0 0 0 0
-0 0 0 1 1 1 1 1 1 0 0 0
-0 0 1 1 1 1 1 1 1 1 0 0
-0 1 1 1 1 1 1 1 1 1 1 0
-0 1 1 1 1 1 1 1 1 1 1 0
-0 1 1 1 1 1 1 1 1 1 1 0
-0 1 1 1 1 1 1 1 1 1 1 0
-0 0 1 1 1 1 1 1 1 1 0 0
-0 0 0 1 1 1 1 1 1 0 0 0
-0 0 0 0 1 1 1 1 0 0 0 0"
-  "PBM data used for enabled breakpoint icon.")
-
-(defconst breakpoint-disabled-pbm-data
-  "P1
-10 10\",
-0 0 1 0 1 0 1 0 0 0
-0 1 0 1 0 1 0 1 0 0
-1 0 1 0 1 0 1 0 1 0
-0 1 0 1 0 1 0 1 0 1
-1 0 1 0 1 0 1 0 1 0
-0 1 0 1 0 1 0 1 0 1
-1 0 1 0 1 0 1 0 1 0
-0 1 0 1 0 1 0 1 0 1
-0 0 1 0 1 0 1 0 1 0
-0 0 0 1 0 1 0 1 0 0"
-  "PBM data used for disabled breakpoint icon.")
-
-(defvar breakpoint-enabled-icon nil
-  "Icon for enabled breakpoint in display margin.")
-
-(defvar breakpoint-disabled-icon nil
-  "Icon for disabled breakpoint in display margin.")
-
-(declare-function define-fringe-bitmap "fringe.c"
-                 (bitmap bits &optional height width align))
-
-(and (display-images-p)
-     ;; Bitmap for breakpoint in fringe
-     (define-fringe-bitmap 'breakpoint
-       "\x3c\x7e\xff\xff\xff\xff\x7e\x3c")
-     ;; Bitmap for gud-overlay-arrow in fringe
-     (define-fringe-bitmap 'hollow-right-triangle
-       "\xe0\x90\x88\x84\x84\x88\x90\xe0"))
-
-(defface breakpoint-enabled
-  '((t
-     :foreground "red1"
-     :weight bold))
-  "Face for enabled breakpoint icon in fringe."
-  :group 'gdb)
-
-(defface breakpoint-disabled
-  '((((class color) (min-colors 88)) :foreground "grey70")
-    ;; Ensure that on low-color displays that we end up something visible.
-    (((class color) (min-colors 8) (background light))
-     :foreground "black")
-    (((class color) (min-colors 8) (background dark))
-     :foreground "white")
-    (((type tty) (class mono))
-     :inverse-video t)
-    (t :background "gray"))
-  "Face for disabled breakpoint icon in fringe."
-  :group 'gdb)
-
-(defconst gdb-breakpoint-regexp
-  "\\(?:\\([0-9]+\\).*?\\(?:point\\|catch\\s-+\\S-+\\)\\s-+\\S-+\\|\\([0-9]+\\.[0-9]+\\)\\)\\s-+\\(.\\)\\s-+")
-
-;; Put breakpoint icons in relevant margins (even those set in the GUD buffer).
-(defun gdb-info-breakpoints-custom ()
-  (let ((flag) (bptno))
-    ;; Remove all breakpoint-icons in source buffers but not assembler buffer.
-    (dolist (buffer (buffer-list))
-      (with-current-buffer buffer
-       (if (and (memq gud-minor-mode '(gdba gdbmi))
-                (not (string-match "\\` ?\\*.+\\*\\'" (buffer-name))))
-           (gdb-remove-breakpoint-icons (point-min) (point-max)))))
-    (with-current-buffer (gdb-get-buffer 'gdb-breakpoints-buffer)
-      (save-excursion
-       (let ((buffer-read-only nil))
-         (goto-char (point-min))
-         (while (< (point) (- (point-max) 1))
-           (forward-line 1)
-           (if (looking-at gdb-breakpoint-regexp)
-               (progn
-                 (setq bptno (or (match-string 1) (match-string 2)))
-                 (setq flag (char-after (match-beginning 3)))
-                 (if (match-string 1)
-                     (setq gdb-parent-bptno-enabled (eq flag ?y)))
-                 (add-text-properties
-                  (match-beginning 3) (match-end 3)
-                  (if (eq flag ?y)
-                      '(face font-lock-warning-face)
-                    '(face font-lock-type-face)))
-                 (let ((bl (point))
-                       (el (line-end-position)))
-                   (when (re-search-forward " in \\(.*\\) at" el t)
-                     (add-text-properties
-                      (match-beginning 1) (match-end 1)
-                      '(face font-lock-function-name-face)))
-                   (if (re-search-forward
-                        ".*\\s-+\\(\\S-+\\):\\([0-9]+\\)$" el t)
-                       (let ((line (match-string 2))
-                             (file (match-string 1)))
-                         (add-text-properties bl el
-                              '(mouse-face highlight
-                                help-echo "mouse-2, RET: visit breakpoint"))
-                         (unless (file-exists-p file)
-                           (setq file (cdr (assoc bptno gdb-location-alist))))
-                         (if (and file
-                                  (not (string-equal file "File not found")))
-                             (with-current-buffer
-                                 (find-file-noselect file 'nowarn)
-                               (gdb-init-buffer)
-                               ;; Only want one breakpoint icon at each
-                               ;; location.
-                               (save-excursion
-                                 (goto-char (point-min))
-                                 (forward-line (1- (string-to-number line)))
-                                 (gdb-put-breakpoint-icon (eq flag ?y) bptno)))
-                           (gdb-enqueue-input
-                            (list
-                             (concat gdb-server-prefix "list "
-                                     (match-string-no-properties 1) ":1\n")
-                             'ignore))
-                           (gdb-enqueue-input
-                            (list (concat gdb-server-prefix "info source\n")
-                                  `(lambda () (gdb-get-location
-                                               ,bptno ,line ,flag))))))
-                     (if (re-search-forward
-                          "<\\(\\(\\sw\\|[_.]\\)+\\)\\(\\+[0-9]+\\)?>"
-                          el t)
-                         (add-text-properties
-                          (match-beginning 1) (match-end 1)
-                          '(face font-lock-function-name-face))
-                       (end-of-line)
-                       (re-search-backward "\\s-\\(\\S-*\\)"
-                                           bl t)
-                       (add-text-properties
-                        (match-beginning 1) (match-end 1)
-                        '(face font-lock-variable-name-face)))))))
-           (end-of-line))))))
-  (if (gdb-get-buffer 'gdb-assembler-buffer) (gdb-assembler-custom))
-
-  ;; Breakpoints buffer is always present.  Hack to just update
-  ;; current frame if there's been no execution.
-  (if gdb-stack-update
-      (setq gdb-stack-update nil)
-    (if (gdb-get-buffer 'gdb-stack-buffer) (gdb-info-stack-custom))))
-
-(declare-function gud-remove "gdb-ui" t t) ; gud-def
-(declare-function gud-break  "gdb-ui" t t) ; gud-def
-(declare-function fringe-bitmaps-at-pos "fringe.c" (&optional pos window))
-
-(defun gdb-mouse-set-clear-breakpoint (event)
-  "Set/clear breakpoint in left fringe/margin at mouse click.
-If not in a source or disassembly buffer just set point."
-  (interactive "e")
-  (mouse-minibuffer-check event)
-  (let ((posn (event-end event)))
-    (with-selected-window (posn-window posn)
-      (if (or (buffer-file-name) (eq major-mode 'gdb-assembler-mode))
-         (if (numberp (posn-point posn))
-             (save-excursion
-               (goto-char (posn-point posn))
-               (if (or (posn-object posn)
-                       (eq (car (fringe-bitmaps-at-pos (posn-point posn)))
-                           'breakpoint))
-                   (gud-remove nil)
-                 (gud-break nil)))))
-      (posn-set-point posn))))
-
-(defun gdb-mouse-toggle-breakpoint-margin (event)
-  "Enable/disable breakpoint in left margin with mouse click."
-  (interactive "e")
-  (mouse-minibuffer-check event)
-  (let ((posn (event-end event)))
-    (if (numberp (posn-point posn))
-       (with-selected-window (posn-window posn)
-         (save-excursion
-           (goto-char (posn-point posn))
-           (if (posn-object posn)
-               (let* ((bptno (get-text-property
-                              0 'gdb-bptno (car (posn-string posn)))))
-                 (string-match "\\([0-9+]\\)*" bptno)
-                 (gdb-enqueue-input
-                  (list
-                   (concat gdb-server-prefix
-                           (if (get-text-property
-                                0 'gdb-enabled (car (posn-string posn)))
-                               "disable "
-                             "enable ")
-                           (match-string 1 bptno) "\n")
-                  'ignore)))))))))
-
-(defun gdb-mouse-toggle-breakpoint-fringe (event)
-  "Enable/disable breakpoint in left fringe with mouse click."
-  (interactive "e")
-  (mouse-minibuffer-check event)
-  (let* ((posn (event-end event))
-        (pos (posn-point posn))
-        obj)
-    (when (numberp pos)
-      (with-selected-window (posn-window posn)
-       (with-current-buffer (window-buffer (selected-window))
-         (goto-char pos)
-         (dolist (overlay (overlays-in pos pos))
-           (when (overlay-get overlay 'put-break)
-             (setq obj (overlay-get overlay 'before-string))))
-         (when (stringp obj)
-           (let* ((bptno (get-text-property 0 'gdb-bptno obj)))
-             (string-match "\\([0-9+]\\)*" bptno)
-             (gdb-enqueue-input
-              (list
-               (concat gdb-server-prefix
-                       (if (get-text-property 0 'gdb-enabled obj)
-                           "disable "
-                         "enable ")
-                       (match-string 1 bptno) "\n")
-               'ignore)))))))))
-
-(defun gdb-breakpoints-buffer-name ()
-  (with-current-buffer gud-comint-buffer
-    (concat "*breakpoints of " (gdb-get-target-string) "*")))
-
-(defun gdb-display-breakpoints-buffer ()
-  "Display status of user-settable breakpoints."
-  (interactive)
-  (gdb-display-buffer
-   (gdb-get-buffer-create 'gdb-breakpoints-buffer) t))
-
-(defun gdb-frame-breakpoints-buffer ()
-  "Display status of user-settable breakpoints in a new frame."
-  (interactive)
-  (let ((special-display-regexps (append special-display-regexps '(".*")))
-       (special-display-frame-alist gdb-frame-parameters))
-    (display-buffer (gdb-get-buffer-create 'gdb-breakpoints-buffer))))
-
-(defvar gdb-breakpoints-mode-map
-  (let ((map (make-sparse-keymap))
-       (menu (make-sparse-keymap "Breakpoints")))
-    (define-key menu [quit] '("Quit"   . gdb-delete-frame-or-window))
-    (define-key menu [goto] '("Goto"   . gdb-goto-breakpoint))
-    (define-key menu [delete] '("Delete" . gdb-delete-breakpoint))
-    (define-key menu [toggle] '("Toggle" . gdb-toggle-breakpoint))
-    (suppress-keymap map)
-    (define-key map [menu-bar breakpoints] (cons "Breakpoints" menu))
-    (define-key map " " 'gdb-toggle-breakpoint)
-    (define-key map "D" 'gdb-delete-breakpoint)
-    ;; Don't bind "q" to kill-this-buffer as we need it for breakpoint icons.
-    (define-key map "q" 'gdb-delete-frame-or-window)
-    (define-key map "\r" 'gdb-goto-breakpoint)
-    (define-key map [mouse-2] 'gdb-goto-breakpoint)
-    (define-key map [follow-link] 'mouse-face)
-    map))
-
-(defun gdb-delete-frame-or-window ()
-  "Delete frame if there is only one window.  Otherwise delete the window."
-  (interactive)
-  (if (one-window-p) (delete-frame)
-    (delete-window)))
-
-;;from make-mode-line-mouse-map
-(defun gdb-make-header-line-mouse-map (mouse function) "\
-Return a keymap with single entry for mouse key MOUSE on the header line.
-MOUSE is defined to run function FUNCTION with no args in the buffer
-corresponding to the mode line clicked."
-  (let ((map (make-sparse-keymap)))
-    (define-key map (vector 'header-line mouse) function)
-    (define-key map (vector 'header-line 'down-mouse-1) 'ignore)
-    map))
-
-(defmacro gdb-propertize-header (name buffer help-echo mouse-face face)
-  `(propertize ,name
-              'help-echo ,help-echo
-              'mouse-face ',mouse-face
-              'face ',face
-              'local-map
-              (gdb-make-header-line-mouse-map
-               'mouse-1
-               (lambda (event) (interactive "e")
-                 (save-selected-window
-                   (select-window (posn-window (event-start event)))
-                   (set-window-dedicated-p (selected-window) nil)
-                   (switch-to-buffer
-                    (gdb-get-buffer-create ',buffer))
-                   (setq header-line-format(gdb-set-header ',buffer))
-                   (set-window-dedicated-p (selected-window) t))))))
-
-(defun gdb-set-header (buffer)
-  (cond ((eq buffer 'gdb-locals-buffer)
-        (list
-         (gdb-propertize-header "Locals" gdb-locals-buffer
-                                nil nil mode-line)
-         " "
-         (gdb-propertize-header "Registers" gdb-registers-buffer
-                                "mouse-1: select" mode-line-highlight mode-line-inactive)))
-       ((eq buffer 'gdb-registers-buffer)
-        (list
-         (gdb-propertize-header "Locals" gdb-locals-buffer
-                                "mouse-1: select" mode-line-highlight mode-line-inactive)
-         " "
-         (gdb-propertize-header "Registers" gdb-registers-buffer
-                                nil nil mode-line)))
-       ((eq buffer 'gdb-breakpoints-buffer)
-        (list
-         (gdb-propertize-header "Breakpoints" gdb-breakpoints-buffer
-                                nil nil mode-line)
-         " "
-         (gdb-propertize-header "Threads" gdb-threads-buffer
-                                "mouse-1: select" mode-line-highlight mode-line-inactive)))
-       ((eq buffer 'gdb-threads-buffer)
-        (list
-         (gdb-propertize-header "Breakpoints" gdb-breakpoints-buffer
-                                "mouse-1: select" mode-line-highlight mode-line-inactive)
-         " "
-         (gdb-propertize-header "Threads" gdb-threads-buffer
-                                nil nil mode-line)))))
-
-(defvar gdb-breakpoints-header
-  (list
-   (gdb-propertize-header "Breakpoints" gdb-breakpoints-buffer
-                         nil nil mode-line)
-   " "
-   (gdb-propertize-header "Threads" gdb-threads-buffer
-                         "mouse-1: select" mode-line-highlight mode-line-inactive)))
-
-(defun gdb-breakpoints-mode ()
-  "Major mode for gdb breakpoints.
-
-\\{gdb-breakpoints-mode-map}"
-  (kill-all-local-variables)
-  (setq major-mode 'gdb-breakpoints-mode)
-  (setq mode-name "Breakpoints")
-  (use-local-map gdb-breakpoints-mode-map)
-  (setq buffer-read-only t)
-  (buffer-disable-undo)
-  (setq header-line-format gdb-breakpoints-header)
-  (run-mode-hooks 'gdb-breakpoints-mode-hook)
-  (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba)
-      'gdb-invalidate-breakpoints
-    'gdbmi-invalidate-breakpoints))
-
-(defun gdb-toggle-breakpoint ()
-  "Enable/disable breakpoint at current line."
-  (interactive)
-  (save-excursion
-    (beginning-of-line 1)
-    (if (looking-at gdb-breakpoint-regexp)
-       (gdb-enqueue-input
-        (list
-         (concat gdb-server-prefix
-                 (if (eq ?y (char-after (match-beginning 3)))
-                     "disable "
-                   "enable ")
-                 (or (match-string 1) (match-string 2)) "\n") 'ignore))
-      (error "Not recognized as break/watchpoint line"))))
-
-(defun gdb-delete-breakpoint ()
-  "Delete the breakpoint at current line."
-  (interactive)
-  (save-excursion
-    (beginning-of-line 1)
-    (if (looking-at gdb-breakpoint-regexp)
-       (if (match-string 1)
-           (gdb-enqueue-input
-            (list
-             (concat gdb-server-prefix "delete " (match-string 1) "\n")
-             'ignore))
-         (message-box "This breakpoint cannot be deleted on its own."))
-      (error "Not recognized as break/watchpoint line"))))
-
-(defun gdb-goto-breakpoint (&optional event)
-  "Display the breakpoint location specified at current line."
-  (interactive (list last-input-event))
-  (if event (posn-set-point (event-end event)))
-  (save-excursion
-    (beginning-of-line 1)
-    (if (looking-at "\\([0-9]+\\.?[0-9]*\\) .*\\s-+\\(\\S-+\\):\\([0-9]+\\)$")
-       (let ((bptno (match-string 1))
-             (file  (match-string 2))
-             (line  (match-string 3)))
-         (save-selected-window
-           (let* ((buffer (find-file-noselect
-                        (if (file-exists-p file) file
-                          (cdr (assoc bptno gdb-location-alist)))))
-                  (window (or (gdb-display-source-buffer buffer)
-                              (display-buffer buffer))))
-             (setq gdb-source-window window)
-             (with-current-buffer buffer
-               (goto-char (point-min))
-               (forward-line (1- (string-to-number line)))
-               (set-window-point window (point))))))
-      (error "No location specified"))))
-\f
-
-;; Frames buffer.  This displays a perpetually correct backtrace
-;; (from the command `where').
-;;
-;; Alas, if your stack is deep, it is costly.
-;;
-(defcustom gdb-max-frames 40
-  "Maximum number of frames displayed in call stack."
-  :type 'integer
-  :group 'gdb
-  :version "22.1")
-
-(gdb-set-buffer-rules 'gdb-stack-buffer
-                     'gdb-stack-buffer-name
-                     'gdb-frames-mode)
-
-(def-gdb-auto-updated-buffer gdb-stack-buffer
-  gdb-invalidate-frames
-  (concat "server info stack " (number-to-string gdb-max-frames) "\n")
-  gdb-info-stack-handler
-  gdb-info-stack-custom)
-
-;; This may be more important for embedded targets where unwinding the
-;; stack may take a long time.
-(defadvice gdb-invalidate-frames (around gdb-invalidate-frames-advice
-                                        (&optional ignored) activate compile)
-  "Only queue \"info stack\" if execution has occurred."
-  (if gdb-stack-update ad-do-it))
-
-(defun gdb-info-stack-custom ()
-  (with-current-buffer (gdb-get-buffer 'gdb-stack-buffer)
-    (let (move-to)
-      (save-excursion
-       (unless (eq gdb-look-up-stack 'delete)
-         (let ((buffer-read-only nil)
-               bl el)
-           (goto-char (point-min))
-           (while (< (point) (point-max))
-             (setq bl (line-beginning-position)
-                   el (line-end-position))
-             (when (looking-at "#")
-               (add-text-properties bl el
-                   '(mouse-face highlight
-                                help-echo "mouse-2, RET: Select frame")))
-             (goto-char bl)
-             (when (looking-at "^#\\([0-9]+\\)")
-               (when (string-equal (match-string 1) gdb-frame-number)
-                 (if (gud-tool-bar-item-visible-no-fringe)
-                     (progn
-                       (put-text-property bl (+ bl 4)
-                                          'face '(:inverse-video t))
-                       (setq move-to bl))
-                   (or gdb-stack-position
-                       (setq gdb-stack-position (make-marker)))
-                   (set-marker gdb-stack-position (point))
-                   (setq move-to gdb-stack-position)))
-               (when (re-search-forward "\\([^ ]+\\) (" el t)
-                 (put-text-property (match-beginning 1) (match-end 1)
-                                    'face font-lock-function-name-face)
-                 (setq bl (match-end 0))
-                 (while (re-search-forward "<\\([^>]+\\)>" el t)
-                   (put-text-property (match-beginning 1) (match-end 1)
-                                      'face font-lock-function-name-face))
-                 (goto-char bl)
-                 (while (re-search-forward "\\(\\(\\sw\\|[_.]\\)+\\)=" el t)
-                   (put-text-property (match-beginning 1) (match-end 1)
-                                      'face font-lock-variable-name-face))))
-             (forward-line 1))
-           (forward-line -1)
-           (when (looking-at "(More stack frames follow...)")
-             (add-text-properties
-              (match-beginning 0) (match-end 0)
-              '(mouse-face highlight
-                gdb-max-frames t
-                help-echo
-                  "mouse-2, RET: customize gdb-max-frames to see more frames"
-                )))))
-       (when gdb-look-up-stack
-         (goto-char (point-min))
-         (when (re-search-forward "\\(\\S-+?\\):\\([0-9]+\\)" nil t)
-           (let ((start (line-beginning-position))
-                 (file (match-string 1))
-                 (line (match-string 2)))
-             (re-search-backward "^#*\\([0-9]+\\)" start t)
-             (gdb-enqueue-input
-              (list (concat gdb-server-prefix "frame "
-                            (match-string 1) "\n") 'gdb-set-hollow))
-             (gdb-enqueue-input
-              (list (concat gdb-server-prefix "frame 0\n") 'ignore))))))
-      (when move-to
-       (let ((window (get-buffer-window (current-buffer) 0)))
-         (when window
-           (with-selected-window window
-             (goto-char move-to)
-             (unless (pos-visible-in-window-p)
-               (recenter '(center)))))))))
-  (if (eq gdb-look-up-stack 'delete)
-      (kill-buffer (gdb-get-buffer 'gdb-stack-buffer)))
-  (setq gdb-look-up-stack nil))
-
-(defun gdb-set-hollow ()
-  (if gud-last-last-frame
-      (with-current-buffer (gud-find-file (car gud-last-last-frame))
-       (setq fringe-indicator-alist
-             '((overlay-arrow . hollow-right-triangle))))))
-
-(defun gdb-stack-buffer-name ()
-  (with-current-buffer gud-comint-buffer
-    (concat "*stack frames of " (gdb-get-target-string) "*")))
-
-(defun gdb-display-stack-buffer ()
-  "Display backtrace of current stack."
-  (interactive)
-  (gdb-display-buffer
-   (gdb-get-buffer-create 'gdb-stack-buffer) t))
-
-(defun gdb-frame-stack-buffer ()
-  "Display backtrace of current stack in a new frame."
-  (interactive)
-  (let ((special-display-regexps (append special-display-regexps '(".*")))
-       (special-display-frame-alist gdb-frame-parameters))
-    (display-buffer (gdb-get-buffer-create 'gdb-stack-buffer))))
-
-(defvar gdb-frames-mode-map
-  (let ((map (make-sparse-keymap)))
-    (suppress-keymap map)
-    (define-key map "q" 'kill-this-buffer)
-    (define-key map "\r" 'gdb-frames-select)
-    (define-key map "F" 'gdb-frames-force-update)
-    (define-key map [mouse-2] 'gdb-frames-select)
-    (define-key map [follow-link] 'mouse-face)
-    map))
-
-(declare-function gdbmi-invalidate-frames "ext:gdb-mi" nil t)
-
-(defun gdb-frames-force-update ()
-  "Force update of call stack.
-Use when the displayed call stack gets out of sync with the
-actual one, e.g after using the Gdb command \"return\" or setting
-$pc directly from the GUD buffer.  This command isn't normally needed."
-  (interactive)
-  (setq gdb-stack-update t)
-  (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba)
-      (gdb-invalidate-frames)
-    (gdbmi-invalidate-frames)))
-
-(defun gdb-frames-mode ()
-  "Major mode for gdb call stack.
-
-\\{gdb-frames-mode-map}"
-  (kill-all-local-variables)
-  (setq major-mode 'gdb-frames-mode)
-  (setq mode-name "Frames")
-  (setq gdb-stack-position nil)
-  (add-to-list 'overlay-arrow-variable-list 'gdb-stack-position)
-  (setq truncate-lines t)  ;; Make it easier to see overlay arrow.
-  (setq buffer-read-only t)
-  (buffer-disable-undo)
-  (gdb-thread-identification)
-  (use-local-map gdb-frames-mode-map)
-  (run-mode-hooks 'gdb-frames-mode-hook)
-  (setq gdb-stack-update t)
-  (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba)
-      'gdb-invalidate-frames
-    'gdbmi-invalidate-frames))
-
-(defun gdb-get-frame-number ()
-  (save-excursion
-    (end-of-line)
-    (let* ((start (line-beginning-position))
-          (pos (re-search-backward "^#*\\([0-9]+\\)" start t))
-          (n (or (and pos (match-string 1)) "0")))
-      n)))
-
-(defun gdb-frames-select (&optional event)
-  "Select the frame and display the relevant source."
-  (interactive (list last-input-event))
-  (if event (posn-set-point (event-end event)))
-  (if (get-text-property (point) 'gdb-max-frames)
-      (progn
-       (message-box "After setting gdb-max-frames, you need to enter\n\
-another GDB command e.g pwd, to see new frames")
-      (customize-variable-other-window 'gdb-max-frames))
-    (gdb-enqueue-input
-     (list (concat gdb-server-prefix "frame "
-                  (gdb-get-frame-number) "\n") 'ignore))))
-\f
-
-;; Threads buffer.  This displays a selectable thread list.
-;;
-(gdb-set-buffer-rules 'gdb-threads-buffer
-                     'gdb-threads-buffer-name
-                     'gdb-threads-mode)
-
-(def-gdb-auto-updated-buffer gdb-threads-buffer
-  gdb-invalidate-threads
-  (concat gdb-server-prefix "info threads\n")
-  gdb-info-threads-handler
-  gdb-info-threads-custom)
-
-(defun gdb-info-threads-custom ()
-  (with-current-buffer (gdb-get-buffer 'gdb-threads-buffer)
-    (let ((buffer-read-only nil))
-      (save-excursion
-       (goto-char (point-min))
-       (if (re-search-forward "\\* \\([0-9]+\\)" nil t)
-           (setq gdb-thread-indicator
-                 (propertize (concat " [" (match-string 1) "]")
-                             ; FIXME: this help-echo doesn't work
-                             'help-echo "thread id")))
-       (goto-char (point-min))
-       (while (< (point) (point-max))
-         (unless (looking-at "No ")
-           (add-text-properties (line-beginning-position) (line-end-position)
-                                '(mouse-face highlight
-                                help-echo "mouse-2, RET: select thread")))
-         (forward-line 1))))))
-
-(defun gdb-threads-buffer-name ()
-  (with-current-buffer gud-comint-buffer
-    (concat "*threads of " (gdb-get-target-string) "*")))
-
-(defun gdb-display-threads-buffer ()
-  "Display IDs of currently known threads."
-  (interactive)
-  (gdb-display-buffer
-   (gdb-get-buffer-create 'gdb-threads-buffer) t))
-
-(defun gdb-frame-threads-buffer ()
-  "Display IDs of currently known threads in a new frame."
-  (interactive)
-  (let ((special-display-regexps (append special-display-regexps '(".*")))
-       (special-display-frame-alist gdb-frame-parameters))
-    (display-buffer (gdb-get-buffer-create 'gdb-threads-buffer))))
-
-(defvar gdb-threads-mode-map
-  (let ((map (make-sparse-keymap)))
-    (suppress-keymap map)
-    (define-key map "q" 'kill-this-buffer)
-    (define-key map "\r" 'gdb-threads-select)
-    (define-key map [mouse-2] 'gdb-threads-select)
-    (define-key map [follow-link] 'mouse-face)
-    map))
-
-(defvar gdb-threads-font-lock-keywords
-  '((") +\\([^ ]+\\) ("  (1 font-lock-function-name-face))
-    ("in \\([^ ]+\\) ("  (1 font-lock-function-name-face))
-    ("\\(\\(\\sw\\|[_.]\\)+\\)="  (1 font-lock-variable-name-face)))
-  "Font lock keywords used in `gdb-threads-mode'.")
-
-(defun gdb-threads-mode ()
-  "Major mode for gdb threads.
-
-\\{gdb-threads-mode-map}"
-  (kill-all-local-variables)
-  (setq major-mode 'gdb-threads-mode)
-  (setq mode-name "Threads")
-  (setq buffer-read-only t)
-  (buffer-disable-undo)
-  (setq header-line-format gdb-breakpoints-header)
-  (use-local-map gdb-threads-mode-map)
-  (set (make-local-variable 'font-lock-defaults)
-       '(gdb-threads-font-lock-keywords))
-  (run-mode-hooks 'gdb-threads-mode-hook)
-  ;; Force "info threads" onto queue.
-  (lambda () (let ((gud-running nil)) (gdb-invalidate-threads))))
-
-(defun gdb-get-thread-number ()
-  (save-excursion
-    (re-search-backward "^\\s-*\\([0-9]*\\)" nil t)
-    (match-string-no-properties 1)))
-
-(defun gdb-threads-select (&optional event)
-  "Select the thread and display the relevant source."
-  (interactive (list last-input-event))
-  (if event (posn-set-point (event-end event)))
-  (setq gdb-stack-update t)
-  (gdb-enqueue-input
-   (list (concat gdb-server-prefix "thread "
-                (gdb-get-thread-number) "\n") 'ignore))
-  (gud-display-frame))
-
-(defun gdb-thread-identification ()
-  (setq mode-line-buffer-identification
-       (list (car mode-line-buffer-identification)
-             '(gdb-thread-indicator gdb-thread-indicator))))
-\f
-;; Registers buffer.
-;;
-(defcustom gdb-all-registers nil
-  "Non-nil means include floating-point registers."
-  :type 'boolean
-  :group 'gdb
-  :version "22.1")
-
-(gdb-set-buffer-rules 'gdb-registers-buffer
-                     'gdb-registers-buffer-name
-                     'gdb-registers-mode)
-
-(def-gdb-auto-updated-buffer gdb-registers-buffer
-  gdb-invalidate-registers
-  (concat
-   gdb-server-prefix "info " (if gdb-all-registers "all-") "registers\n")
-  gdb-info-registers-handler
-  gdb-info-registers-custom)
-
-(defun gdb-info-registers-custom ()
-  (with-current-buffer (gdb-get-buffer 'gdb-registers-buffer)
-    (save-excursion
-      (let ((buffer-read-only nil)
-           start end)
-       (goto-char (point-min))
-       (while (< (point) (point-max))
-         (setq start (line-beginning-position))
-         (setq end (line-end-position))
-         (when (looking-at "^[^ ]+")
-           (unless (string-equal (match-string 0) "The")
-             (put-text-property start (match-end 0)
-                                'face font-lock-variable-name-face)
-             (add-text-properties start end
-                                  '(help-echo "mouse-2: edit value"
-                                    mouse-face highlight))))
-         (forward-line 1))))))
-
-(defun gdb-edit-register-value (&optional event)
-  (interactive (list last-input-event))
-  (save-excursion
-    (if event (posn-set-point (event-end event)))
-    (beginning-of-line)
-    (let* ((register (current-word))
-         (value (read-string (format "New value (%s): " register))))
-      (gdb-enqueue-input
-       (list (concat gdb-server-prefix "set $" register "=" value "\n")
-            'ignore)))))
-
-(defvar gdb-registers-mode-map
-  (let ((map (make-sparse-keymap)))
-    (suppress-keymap map)
-    (define-key map "\r" 'gdb-edit-register-value)
-    (define-key map [mouse-2] 'gdb-edit-register-value)
-    (define-key map " " 'gdb-all-registers)
-    (define-key map "q" 'kill-this-buffer)
-     map))
-
-(defvar gdb-locals-header
-  (list
-   (gdb-propertize-header "Locals" gdb-locals-buffer
-                         nil nil mode-line)
-   " "
-   (gdb-propertize-header "Registers" gdb-registers-buffer
-                         "mouse-1: select" mode-line-highlight mode-line-inactive)))
-
-
-(defun gdb-registers-mode ()
-  "Major mode for gdb registers.
-
-\\{gdb-registers-mode-map}"
-  (kill-all-local-variables)
-  (setq major-mode 'gdb-registers-mode)
-  (setq mode-name "Registers")
-  (setq header-line-format gdb-locals-header)
-  (setq buffer-read-only t)
-  (buffer-disable-undo)
-  (gdb-thread-identification)
-  (use-local-map gdb-registers-mode-map)
-  (run-mode-hooks 'gdb-registers-mode-hook)
-  (if (string-equal gdb-version "pre-6.4")
-      (progn
-       (if gdb-all-registers (setq mode-name "Registers:All"))
-       'gdb-invalidate-registers)
-    'gdb-invalidate-registers-1))
-
-(defun gdb-registers-buffer-name ()
-  (with-current-buffer gud-comint-buffer
-    (concat "*registers of " (gdb-get-target-string) "*")))
-
-(defun gdb-display-registers-buffer ()
-  "Display integer register contents."
-  (interactive)
-  (gdb-display-buffer
-   (gdb-get-buffer-create 'gdb-registers-buffer) t))
-
-(defun gdb-frame-registers-buffer ()
-  "Display integer register contents in a new frame."
-  (interactive)
-  (let ((special-display-regexps (append special-display-regexps '(".*")))
-       (special-display-frame-alist gdb-frame-parameters))
-    (display-buffer (gdb-get-buffer-create 'gdb-registers-buffer))))
-
-(defun gdb-all-registers ()
-  "Toggle the display of floating-point registers (pre GDB 6.4 only)."
-  (interactive)
-  (when (string-equal gdb-version "pre-6.4")
-    (if gdb-all-registers
-       (progn
-         (setq gdb-all-registers nil)
-         (with-current-buffer (gdb-get-buffer-create 'gdb-registers-buffer)
-           (setq mode-name "Registers")))
-      (setq gdb-all-registers t)
-      (with-current-buffer (gdb-get-buffer-create 'gdb-registers-buffer)
-       (setq mode-name "Registers:All")))
-    (message (format "Display of floating-point registers %sabled"
-                    (if gdb-all-registers "en" "dis")))
-    (gdb-invalidate-registers)))
-\f
-
-;; Memory buffer.
-;;
-(defcustom gdb-memory-repeat-count 32
-  "Number of data items in memory window."
-  :type 'integer
-  :group 'gdb
-  :version "22.1")
-
-(defcustom gdb-memory-format "x"
-  "Display format of data items in memory window."
-  :type '(choice (const :tag "Hexadecimal" "x")
-                (const :tag "Signed decimal" "d")
-                (const :tag "Unsigned decimal" "u")
-                (const :tag "Octal" "o")
-                (const :tag "Binary" "t"))
-  :group 'gdb
-  :version "22.1")
-
-(defcustom gdb-memory-unit "w"
-  "Unit size of data items in memory window."
-  :type '(choice (const :tag "Byte" "b")
-                (const :tag "Halfword" "h")
-                (const :tag "Word" "w")
-                (const :tag "Giant word" "g"))
-  :group 'gdb
-  :version "22.1")
-
-(gdb-set-buffer-rules 'gdb-memory-buffer
-                     'gdb-memory-buffer-name
-                     'gdb-memory-mode)
-
-(def-gdb-auto-updated-buffer gdb-memory-buffer
-  gdb-invalidate-memory
-  (concat gdb-server-prefix "x/" (number-to-string gdb-memory-repeat-count)
-         gdb-memory-format gdb-memory-unit " " gdb-memory-address "\n")
-  gdb-read-memory-handler
-  gdb-read-memory-custom)
-
-(defun gdb-read-memory-custom ()
-  (save-excursion
-    (goto-char (point-min))
-    (if (looking-at "0x[[:xdigit:]]+")
-       (setq gdb-memory-address (match-string 0)))))
-
-(defvar gdb-memory-mode-map
-  (let ((map (make-sparse-keymap)))
-    (suppress-keymap map)
-    (define-key map "S" 'gdb-memory-set-address)
-    (define-key map "N" 'gdb-memory-set-repeat-count)
-    (define-key map "q" 'kill-this-buffer)
-     map))
-
-(defun gdb-memory-set-address (&optional event)
-  "Set the start memory address."
-  (interactive)
-  (let ((arg (read-from-minibuffer "Start address: ")))
-    (setq gdb-memory-address arg))
-    (gdb-invalidate-memory))
-
-(defun gdb-memory-set-repeat-count (&optional event)
-  "Set the number of data items in memory window."
-  (interactive)
-  (let* ((arg (read-from-minibuffer "Repeat count: "))
-        (count (string-to-number arg)))
-    (if (<= count 0)
-       (error "Positive numbers only")
-      (customize-set-variable 'gdb-memory-repeat-count count)
-      (gdb-invalidate-memory))))
-
-(defun gdb-memory-format-binary ()
-  "Set the display format to binary."
-  (interactive)
-  (customize-set-variable 'gdb-memory-format "t")
-  (gdb-invalidate-memory))
-
-(defun gdb-memory-format-octal ()
-  "Set the display format to octal."
-  (interactive)
-  (customize-set-variable 'gdb-memory-format "o")
-  (gdb-invalidate-memory))
-
-(defun gdb-memory-format-unsigned ()
-  "Set the display format to unsigned decimal."
-  (interactive)
-  (customize-set-variable 'gdb-memory-format "u")
-  (gdb-invalidate-memory))
-
-(defun gdb-memory-format-signed ()
-  "Set the display format to decimal."
-  (interactive)
-  (customize-set-variable 'gdb-memory-format "d")
-  (gdb-invalidate-memory))
-
-(defun gdb-memory-format-hexadecimal ()
-  "Set the display format to hexadecimal."
-  (interactive)
-  (customize-set-variable 'gdb-memory-format "x")
-  (gdb-invalidate-memory))
-
-(defvar gdb-memory-format-map
-  (let ((map (make-sparse-keymap)))
-    (define-key map [header-line down-mouse-3] 'gdb-memory-format-menu-1)
-    map)
-  "Keymap to select format in the header line.")
-
-(defvar gdb-memory-format-menu (make-sparse-keymap "Format")
-  "Menu of display formats in the header line.")
-
-(define-key gdb-memory-format-menu [binary]
-  '(menu-item "Binary" gdb-memory-format-binary
-             :button (:radio . (equal gdb-memory-format "t"))))
-(define-key gdb-memory-format-menu [octal]
-  '(menu-item "Octal" gdb-memory-format-octal
-             :button (:radio . (equal gdb-memory-format "o"))))
-(define-key gdb-memory-format-menu [unsigned]
-  '(menu-item "Unsigned Decimal" gdb-memory-format-unsigned
-             :button (:radio . (equal gdb-memory-format "u"))))
-(define-key gdb-memory-format-menu [signed]
-  '(menu-item "Signed Decimal" gdb-memory-format-signed
-             :button (:radio . (equal gdb-memory-format "d"))))
-(define-key gdb-memory-format-menu [hexadecimal]
-  '(menu-item "Hexadecimal" gdb-memory-format-hexadecimal
-             :button (:radio . (equal gdb-memory-format "x"))))
-
-(defun gdb-memory-format-menu (event)
-  (interactive "@e")
-  (x-popup-menu event gdb-memory-format-menu))
-
-(defun gdb-memory-format-menu-1 (event)
-  (interactive "e")
-  (save-selected-window
-    (select-window (posn-window (event-start event)))
-    (let* ((selection (gdb-memory-format-menu event))
-          (binding (and selection (lookup-key gdb-memory-format-menu
-                                              (vector (car selection))))))
-      (if binding (call-interactively binding)))))
-
-(defun gdb-memory-unit-giant ()
-  "Set the unit size to giant words (eight bytes)."
-  (interactive)
-  (customize-set-variable 'gdb-memory-unit "g")
-  (gdb-invalidate-memory))
-
-(defun gdb-memory-unit-word ()
-  "Set the unit size to words (four bytes)."
-  (interactive)
-  (customize-set-variable 'gdb-memory-unit "w")
-  (gdb-invalidate-memory))
-
-(defun gdb-memory-unit-halfword ()
-  "Set the unit size to halfwords (two bytes)."
-  (interactive)
-  (customize-set-variable 'gdb-memory-unit "h")
-  (gdb-invalidate-memory))
-
-(defun gdb-memory-unit-byte ()
-  "Set the unit size to bytes."
-  (interactive)
-  (customize-set-variable 'gdb-memory-unit "b")
-  (gdb-invalidate-memory))
-
-(defvar gdb-memory-unit-map
-  (let ((map (make-sparse-keymap)))
-    (define-key map [header-line down-mouse-3] 'gdb-memory-unit-menu-1)
-    map)
-  "Keymap to select units in the header line.")
-
-(defvar gdb-memory-unit-menu (make-sparse-keymap "Unit")
-  "Menu of units in the header line.")
-
-(define-key gdb-memory-unit-menu [giantwords]
-  '(menu-item "Giant words" gdb-memory-unit-giant
-             :button (:radio . (equal gdb-memory-unit "g"))))
-(define-key gdb-memory-unit-menu [words]
-  '(menu-item "Words" gdb-memory-unit-word
-             :button (:radio . (equal gdb-memory-unit "w"))))
-(define-key gdb-memory-unit-menu [halfwords]
-  '(menu-item "Halfwords" gdb-memory-unit-halfword
-             :button (:radio . (equal gdb-memory-unit "h"))))
-(define-key gdb-memory-unit-menu [bytes]
-  '(menu-item "Bytes" gdb-memory-unit-byte
-             :button (:radio . (equal gdb-memory-unit "b"))))
-
-(defun gdb-memory-unit-menu (event)
-  (interactive "@e")
-  (x-popup-menu event gdb-memory-unit-menu))
-
-(defun gdb-memory-unit-menu-1 (event)
-  (interactive "e")
-  (save-selected-window
-    (select-window (posn-window (event-start event)))
-    (let* ((selection (gdb-memory-unit-menu event))
-          (binding (and selection (lookup-key gdb-memory-unit-menu
-                                              (vector (car selection))))))
-      (if binding (call-interactively binding)))))
-
-(defvar gdb-memory-font-lock-keywords
-  '(;; <__function.name+n>
-    ("<\\(\\(\\sw\\|[_.]\\)+\\)\\(\\+[0-9]+\\)?>" (1 font-lock-function-name-face))
-    )
-  "Font lock keywords used in `gdb-memory-mode'.")
-
-(defun gdb-memory-mode ()
-  "Major mode for examining memory.
-
-\\{gdb-memory-mode-map}"
-  (kill-all-local-variables)
-  (setq major-mode 'gdb-memory-mode)
-  (setq mode-name "Memory")
-  (setq buffer-read-only t)
-  (buffer-disable-undo)
-  (use-local-map gdb-memory-mode-map)
-  (setq header-line-format
-       '(:eval
-         (concat
-          "Start address["
-          (propertize
-           "-"
-           'face font-lock-warning-face
-           'help-echo "mouse-1: decrement address"
-           'mouse-face 'mode-line-highlight
-           'local-map
-           (gdb-make-header-line-mouse-map
-            'mouse-1
-            (lambda () (interactive)
-              (let ((gdb-memory-address
-                     ;; Let GDB do the arithmetic.
-                     (concat
-                      gdb-memory-address " - "
-                      (number-to-string
-                       (* gdb-memory-repeat-count
-                          (cond ((string= gdb-memory-unit "b") 1)
-                                ((string= gdb-memory-unit "h") 2)
-                                ((string= gdb-memory-unit "w") 4)
-                                ((string= gdb-memory-unit "g") 8)))))))
-                (gdb-invalidate-memory)))))
-          "|"
-          (propertize "+"
-                      'face font-lock-warning-face
-                      'help-echo "mouse-1: increment address"
-                      'mouse-face 'mode-line-highlight
-                      'local-map (gdb-make-header-line-mouse-map
-                                  'mouse-1
-                                  (lambda () (interactive)
-                                    (let ((gdb-memory-address nil))
-                                      (gdb-invalidate-memory)))))
-          "]: "
-          (propertize gdb-memory-address
-                      'face font-lock-warning-face
-                      'help-echo "mouse-1: set start address"
-                      'mouse-face 'mode-line-highlight
-                      'local-map (gdb-make-header-line-mouse-map
-                                  'mouse-1
-                                  #'gdb-memory-set-address))
-          "  Repeat Count: "
-          (propertize (number-to-string gdb-memory-repeat-count)
-                      'face font-lock-warning-face
-                      'help-echo "mouse-1: set repeat count"
-                      'mouse-face 'mode-line-highlight
-                      'local-map (gdb-make-header-line-mouse-map
-                                  'mouse-1
-                                  #'gdb-memory-set-repeat-count))
-          "  Display Format: "
-          (propertize gdb-memory-format
-                      'face font-lock-warning-face
-                      'help-echo "mouse-3: select display format"
-                      'mouse-face 'mode-line-highlight
-                      'local-map gdb-memory-format-map)
-          "  Unit Size: "
-          (propertize gdb-memory-unit
-                      'face font-lock-warning-face
-                      'help-echo "mouse-3: select unit size"
-                      'mouse-face 'mode-line-highlight
-                      'local-map gdb-memory-unit-map))))
-  (set (make-local-variable 'font-lock-defaults)
-       '(gdb-memory-font-lock-keywords))
-  (run-mode-hooks 'gdb-memory-mode-hook)
-  'gdb-invalidate-memory)
-
-(defun gdb-memory-buffer-name ()
-  (with-current-buffer gud-comint-buffer
-    (concat "*memory of " (gdb-get-target-string) "*")))
-
-(defun gdb-display-memory-buffer ()
-  "Display memory contents."
-  (interactive)
-  (gdb-display-buffer
-   (gdb-get-buffer-create 'gdb-memory-buffer) t))
-
-(defun gdb-frame-memory-buffer ()
-  "Display memory contents in a new frame."
-  (interactive)
-  (let* ((special-display-regexps (append special-display-regexps '(".*")))
-        (special-display-frame-alist
-         (cons '(left-fringe . 0)
-               (cons '(right-fringe . 0)
-                     (cons '(width . 83) gdb-frame-parameters)))))
-    (display-buffer (gdb-get-buffer-create 'gdb-memory-buffer))))
-\f
-
-;; Locals buffer.
-;;
-(gdb-set-buffer-rules 'gdb-locals-buffer
-                     'gdb-locals-buffer-name
-                     'gdb-locals-mode)
-
-(def-gdb-auto-update-trigger gdb-invalidate-locals
-  (gdb-get-buffer 'gdb-locals-buffer)
-  "server info locals\n"
-  gdb-info-locals-handler)
-
-(defvar gdb-locals-watch-map
-  (let ((map (make-sparse-keymap)))
-    (suppress-keymap map)
-    (define-key map "\r" (lambda () (interactive)
-                          (beginning-of-line)
-                          (gud-watch)))
-    (define-key map [mouse-2] (lambda (event) (interactive "e")
-                               (mouse-set-point event)
-                               (beginning-of-line)
-                               (gud-watch)))
-    map)
-  "Keymap to create watch expression of a complex data type local variable.")
-
-(defconst gdb-struct-string
-  (concat (propertize "[struct/union]"
-                     'mouse-face 'highlight
-                     'help-echo "mouse-2: create watch expression"
-                     'local-map gdb-locals-watch-map) "\n"))
-
-(defconst gdb-array-string
-  (concat " " (propertize "[array]"
-                         'mouse-face 'highlight
-                         'help-echo "mouse-2: create watch expression"
-                         'local-map gdb-locals-watch-map) "\n"))
-
-;; Abbreviate for arrays and structures.
-;; These can be expanded using gud-display.
-(defun gdb-info-locals-handler ()
-  (setq gdb-pending-triggers (delq 'gdb-invalidate-locals
-                                 gdb-pending-triggers))
-  (let ((buf (gdb-get-buffer 'gdb-partial-output-buffer)))
-    (with-current-buffer buf
-      (goto-char (point-min))
-      ;; Need this in case "set print pretty" is on.
-      (while (re-search-forward "^[ }].*\n" nil t)
-       (replace-match "" nil nil))
-      (goto-char (point-min))
-      (while (re-search-forward "{\\(.*=.*\n\\|\n\\)" nil t)
-       (replace-match gdb-struct-string nil nil))
-      (goto-char (point-min))
-      (while (re-search-forward "\\s-*{[^.].*\n" nil t)
-       (replace-match gdb-array-string nil nil))))
-  (let ((buf (gdb-get-buffer 'gdb-locals-buffer)))
-    (and buf
-        (with-current-buffer buf
-             (let* ((window (get-buffer-window buf 0))
-                    (start (window-start window))
-                    (p (window-point window))
-                    (buffer-read-only nil))
-                (erase-buffer)
-                (insert-buffer-substring (gdb-get-buffer-create
-                                          'gdb-partial-output-buffer))
-               (set-window-start window start)
-               (set-window-point window p)))))
-  (run-hooks 'gdb-info-locals-hook))
-
-(defvar gdb-locals-mode-map
-  (let ((map (make-sparse-keymap)))
-    (suppress-keymap map)
-    (define-key map "q" 'kill-this-buffer)
-     map))
-
-(defun gdb-locals-mode ()
-  "Major mode for gdb locals.
-
-\\{gdb-locals-mode-map}"
-  (kill-all-local-variables)
-  (setq major-mode 'gdb-locals-mode)
-  (setq mode-name (concat "Locals:" gdb-selected-frame))
-  (use-local-map gdb-locals-mode-map)
-  (setq buffer-read-only t)
-  (buffer-disable-undo)
-  (setq header-line-format gdb-locals-header)
-  (gdb-thread-identification)
-  (set (make-local-variable 'font-lock-defaults)
-       '(gdb-locals-font-lock-keywords))
-  (run-mode-hooks 'gdb-locals-mode-hook)
-  (if (and (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba)
-          (string-equal gdb-version "pre-6.4"))
-      'gdb-invalidate-locals
-    'gdb-invalidate-locals-1))
-
-(defun gdb-locals-buffer-name ()
-  (with-current-buffer gud-comint-buffer
-    (concat "*locals of " (gdb-get-target-string) "*")))
-
-(defun gdb-display-locals-buffer ()
-  "Display local variables of current stack and their values."
-  (interactive)
-  (gdb-display-buffer
-   (gdb-get-buffer-create 'gdb-locals-buffer) t))
-
-(defun gdb-frame-locals-buffer ()
-  "Display local variables of current stack and their values in a new frame."
-  (interactive)
-  (let ((special-display-regexps (append special-display-regexps '(".*")))
-       (special-display-frame-alist gdb-frame-parameters))
-    (display-buffer (gdb-get-buffer-create 'gdb-locals-buffer))))
-\f
-
-;;;; Window management
-(defun gdb-display-buffer (buf dedicated &optional frame)
-  (let ((answer (get-buffer-window buf (or frame 0))))
-    (if answer
-       (display-buffer buf nil (or frame 0)) ;Deiconify the frame if necessary.
-      (let ((window (get-lru-window)))
-       (if (memq (buffer-local-value 'gud-minor-mode (window-buffer window))
-                 '(gdba gdbmi))
-           (let* ((largest (get-largest-window))
-                  (cur-size (window-height largest)))
-             (setq answer (split-window largest))
-             (set-window-buffer answer buf)
-             (set-window-dedicated-p answer dedicated)
-             answer)
-         (set-window-buffer window buf)
-         window)))))
-
-\f
-;;; Shared keymap initialization:
-
-(let ((menu (make-sparse-keymap "GDB-Windows")))
-  (define-key gud-menu-map [displays]
-    `(menu-item "GDB-Windows" ,menu
-               :help "Open a GDB-UI buffer in a new window."
-               :visible (memq gud-minor-mode '(gdbmi gdba))))
-  (define-key menu [gdb] '("Gdb" . gdb-display-gdb-buffer))
-  (define-key menu [threads] '("Threads" . gdb-display-threads-buffer))
-  (define-key menu [inferior]
-    '(menu-item "Separate IO" gdb-display-separate-io-buffer
-               :enable gdb-use-separate-io-buffer))
-  (define-key menu [memory] '("Memory" . gdb-display-memory-buffer))
-  (define-key menu [registers] '("Registers" . gdb-display-registers-buffer))
-  (define-key menu [disassembly]
-    '("Disassembly" . gdb-display-assembler-buffer))
-  (define-key menu [breakpoints]
-    '("Breakpoints" . gdb-display-breakpoints-buffer))
-  (define-key menu [locals] '("Locals" . gdb-display-locals-buffer))
-  (define-key menu [frames] '("Stack" . gdb-display-stack-buffer)))
-
-(let ((menu (make-sparse-keymap "GDB-Frames")))
-  (define-key gud-menu-map [frames]
-    `(menu-item "GDB-Frames" ,menu
-               :help "Open a GDB-UI buffer in a new frame."
-               :visible (memq gud-minor-mode '(gdbmi gdba))))
-  (define-key menu [gdb] '("Gdb" . gdb-frame-gdb-buffer))
-  (define-key menu [threads] '("Threads" . gdb-frame-threads-buffer))
-  (define-key menu [memory] '("Memory" . gdb-frame-memory-buffer))
-  (define-key menu [inferior]
-    '(menu-item "Separate IO" gdb-frame-separate-io-buffer
-               :enable gdb-use-separate-io-buffer))
-  (define-key menu [registers] '("Registers" . gdb-frame-registers-buffer))
-  (define-key menu [disassembly] '("Disassembly" . gdb-frame-assembler-buffer))
-  (define-key menu [breakpoints]
-    '("Breakpoints" . gdb-frame-breakpoints-buffer))
-  (define-key menu [locals] '("Locals" . gdb-frame-locals-buffer))
-  (define-key menu [frames] '("Stack" . gdb-frame-stack-buffer)))
-
-(let ((menu (make-sparse-keymap "GDB-UI/MI")))
-  (define-key gud-menu-map [ui]
-    `(menu-item (if (eq gud-minor-mode 'gdba) "GDB-UI" "GDB-MI")
-               ,menu :visible (memq gud-minor-mode '(gdbmi gdba))))
-  (define-key menu [gdb-customize]
-  '(menu-item "Customize" (lambda () (interactive) (customize-group 'gdb))
-             :help "Customize Gdb Graphical Mode options."))
-  (define-key menu [gdb-find-source-frame]
-  '(menu-item "Look For Source Frame" gdb-find-source-frame
-             :visible (eq gud-minor-mode 'gdba)
-             :help "Toggle looking for source frame further up call stack."
-             :button (:toggle . gdb-find-source-frame)))
-  (define-key menu [gdb-use-separate-io]
-  '(menu-item "Separate IO" gdb-use-separate-io-buffer
-             :visible (eq gud-minor-mode 'gdba)
-             :help "Toggle separate IO for debugged program."
-             :button (:toggle . gdb-use-separate-io-buffer)))
-  (define-key menu [gdb-many-windows]
-  '(menu-item "Display Other Windows" gdb-many-windows
-             :help "Toggle display of locals, stack and breakpoint information."
-             :button (:toggle . gdb-many-windows)))
-  (define-key menu [gdb-restore-windows]
-  '(menu-item "Restore Window Layout" gdb-restore-windows
-             :help "Restore standard layout for debug session.")))
-
-(defun gdb-frame-gdb-buffer ()
-  "Display GUD buffer in a new frame."
-  (interactive)
-  (let ((special-display-regexps (append special-display-regexps '(".*")))
-       (special-display-frame-alist
-        (remove '(menu-bar-lines) (remove '(tool-bar-lines)
-                                          gdb-frame-parameters)))
-       (same-window-regexps nil))
-    (display-buffer gud-comint-buffer)))
-
-(defun gdb-display-gdb-buffer ()
-  "Display GUD buffer."
-  (interactive)
-  (let ((same-window-regexps nil))
-    (select-window (display-buffer gud-comint-buffer nil 0))))
-
-(defun gdb-set-window-buffer (name)
-  (set-window-buffer (selected-window) (get-buffer name))
-  (set-window-dedicated-p (selected-window) t))
-
-(defun gdb-setup-windows ()
-  "Layout the window pattern for `gdb-many-windows'."
-  (gdb-display-locals-buffer)
-  (gdb-display-stack-buffer)
-  (delete-other-windows)
-  (gdb-display-breakpoints-buffer)
-  (delete-other-windows)
-  ; Don't dedicate.
-  (pop-to-buffer gud-comint-buffer)
-  (split-window nil ( / ( * (window-height) 3) 4))
-  (split-window nil ( / (window-height) 3))
-  (split-window-horizontally)
-  (other-window 1)
-  (gdb-set-window-buffer (gdb-locals-buffer-name))
-  (other-window 1)
-  (switch-to-buffer
-       (if gud-last-last-frame
-          (gud-find-file (car gud-last-last-frame))
-        (if gdb-main-file
-            (gud-find-file gdb-main-file)
-          ;; Put buffer list in window if we
-          ;; can't find a source file.
-          (list-buffers-noselect))))
-  (setq gdb-source-window (selected-window))
-  (when gdb-use-separate-io-buffer
-    (split-window-horizontally)
-    (other-window 1)
-    (gdb-set-window-buffer
-     (gdb-get-buffer-create 'gdb-inferior-io)))
-  (other-window 1)
-  (gdb-set-window-buffer (gdb-stack-buffer-name))
-  (split-window-horizontally)
-  (other-window 1)
-  (gdb-set-window-buffer (gdb-breakpoints-buffer-name))
-  (other-window 1))
-
-(defun gdb-restore-windows ()
-  "Restore the basic arrangement of windows used by gdba.
-This arrangement depends on the value of `gdb-many-windows'."
-  (interactive)
-  (pop-to-buffer gud-comint-buffer)    ;Select the right window and frame.
-    (delete-other-windows)
-  (if gdb-many-windows
-      (gdb-setup-windows)
-    (when (or gud-last-last-frame gdb-show-main)
-      (split-window)
-      (other-window 1)
-      (switch-to-buffer
-       (if gud-last-last-frame
-          (gud-find-file (car gud-last-last-frame))
-        (gud-find-file gdb-main-file)))
-      (setq gdb-source-window (selected-window))
-      (other-window 1))))
-
-(defun gdb-reset ()
-  "Exit a debugging session cleanly.
-Kills the gdb buffers, and resets variables and the source buffers."
-  (dolist (buffer (buffer-list))
-    (unless (eq buffer gud-comint-buffer)
-      (with-current-buffer buffer
-       (if (memq gud-minor-mode '(gdbmi gdba))
-           (if (string-match "\\` ?\\*.+\\*\\'" (buffer-name))
-               (kill-buffer nil)
-             (gdb-remove-breakpoint-icons (point-min) (point-max) t)
-             (setq gud-minor-mode nil)
-             (kill-local-variable 'tool-bar-map)
-             (kill-local-variable 'gdb-define-alist))))))
-  (setq gdb-overlay-arrow-position nil)
-  (setq overlay-arrow-variable-list
-       (delq 'gdb-overlay-arrow-position overlay-arrow-variable-list))
-  (setq fringe-indicator-alist '((overlay-arrow . right-triangle)))
-  (setq gdb-stack-position nil)
-  (setq overlay-arrow-variable-list
-       (delq 'gdb-stack-position overlay-arrow-variable-list))
-  (if (boundp 'speedbar-frame) (speedbar-timer-fn))
-  (setq gud-running nil)
-  (setq gdb-active-process nil)
-  (setq gdb-var-list nil)
-  (remove-hook 'after-save-hook 'gdb-create-define-alist t))
-
-(defun gdb-source-info ()
-  "Find the source file where the program starts and display it with related
-buffers."
-  (goto-char (point-min))
-  (if (and (search-forward "Located in " nil t)
-          (looking-at "\\S-+"))
-      (setq gdb-main-file (match-string 0)))
-  (goto-char (point-min))
-  (if (search-forward "Includes preprocessor macro info." nil t)
-      (setq gdb-macro-info t))
-  (if gdb-many-windows
-      (gdb-setup-windows)
-   (gdb-get-buffer-create 'gdb-breakpoints-buffer)
-   (if (and gdb-show-main gdb-main-file)
-       (let ((pop-up-windows t))
-        (display-buffer (gud-find-file gdb-main-file)))))
- (setq gdb-ready t))
-
-(defun gdb-get-location (bptno line flag)
-  "Find the directory containing the relevant source file.
-Put in buffer and place breakpoint icon."
-  (goto-char (point-min))
-  (catch 'file-not-found
-    (if (search-forward "Located in " nil t)
-       (when (looking-at "\\S-+")
-         (delete (cons bptno "File not found") gdb-location-alist)
-         (push (cons bptno (match-string 0)) gdb-location-alist))
-      (gdb-resync)
-      (unless (assoc bptno gdb-location-alist)
-       (push (cons bptno "File not found") gdb-location-alist)
-       (message-box "Cannot find source file for breakpoint location.\n\
-Add directory to search path for source files using the GDB command, dir."))
-      (throw 'file-not-found nil))
-    (with-current-buffer
-       (find-file-noselect (match-string 0))
-      (gdb-init-buffer)
-      ;; only want one breakpoint icon at each location
-      (save-excursion
-       (goto-char (point-min))
-       (forward-line (1- (string-to-number line)))
-       (gdb-put-breakpoint-icon (eq flag ?y) bptno)))))
-
-(add-hook 'find-file-hook 'gdb-find-file-hook)
-
-(defun gdb-find-file-hook ()
-  "Set up buffer for debugging if file is part of the source code
-of the current session."
-  (if (and (buffer-name gud-comint-buffer)
-          ;; in case gud or gdb-ui is just loaded
-          gud-comint-buffer
-          (memq (buffer-local-value 'gud-minor-mode gud-comint-buffer)
-              '(gdba gdbmi)))
-      ;;Pre GDB 6.3 "info sources" doesn't give absolute file name.
-      (if (member (if (string-equal gdb-version "pre-6.4")
-                     (file-name-nondirectory buffer-file-name)
-                   buffer-file-name)
-                 gdb-source-file-list)
-         (with-current-buffer (find-buffer-visiting buffer-file-name)
-           (gdb-init-buffer)))))
-
-;;from put-image
-(defun gdb-put-string (putstring pos &optional dprop &rest sprops)
-  "Put string PUTSTRING in front of POS in the current buffer.
-PUTSTRING is displayed by putting an overlay into the current buffer with a
-`before-string' string that has a `display' property whose value is
-PUTSTRING."
-  (let ((string (make-string 1 ?x))
-       (buffer (current-buffer)))
-    (setq putstring (copy-sequence putstring))
-    (let ((overlay (make-overlay pos pos buffer))
-         (prop (or dprop
-                   (list (list 'margin 'left-margin) putstring))))
-      (put-text-property 0 1 'display prop string)
-      (if sprops
-         (add-text-properties 0 1 sprops string))
-      (overlay-put overlay 'put-break t)
-      (overlay-put overlay 'before-string string))))
-
-;;from remove-images
-(defun gdb-remove-strings (start end &optional buffer)
-  "Remove strings between START and END in BUFFER.
-Remove only strings that were put in BUFFER with calls to `gdb-put-string'.
-BUFFER nil or omitted means use the current buffer."
-  (unless buffer
-    (setq buffer (current-buffer)))
-  (dolist (overlay (overlays-in start end))
-    (when (overlay-get overlay 'put-break)
-         (delete-overlay overlay))))
-
-(defun gdb-put-breakpoint-icon (enabled bptno)
-  (if (string-match "[0-9+]+\\." bptno)
-      (setq enabled gdb-parent-bptno-enabled))
-  (let ((start (- (line-beginning-position) 1))
-       (end (+ (line-end-position) 1))
-       (putstring (if enabled "B" "b"))
-       (source-window (get-buffer-window (current-buffer) 0)))
-    (add-text-properties
-     0 1 '(help-echo "mouse-1: clear bkpt, mouse-3: enable/disable bkpt")
-     putstring)
-    (if enabled
-       (add-text-properties
-        0 1 `(gdb-bptno ,bptno gdb-enabled t) putstring)
-      (add-text-properties
-       0 1 `(gdb-bptno ,bptno gdb-enabled nil) putstring))
-    (gdb-remove-breakpoint-icons start end)
-    (if (display-images-p)
-       (if (>= (or left-fringe-width
-                   (if source-window (car (window-fringes source-window)))
-                   gdb-buffer-fringe-width) 8)
-           (gdb-put-string
-            nil (1+ start)
-            `(left-fringe breakpoint
-                          ,(if enabled
-                               'breakpoint-enabled
-                             'breakpoint-disabled))
-            'gdb-bptno bptno
-            'gdb-enabled enabled)
-         (when (< left-margin-width 2)
-           (save-current-buffer
-             (setq left-margin-width 2)
-             (if source-window
-                 (set-window-margins
-                  source-window
-                  left-margin-width right-margin-width))))
-         (put-image
-          (if enabled
-              (or breakpoint-enabled-icon
-                  (setq breakpoint-enabled-icon
-                        (find-image `((:type xpm :data
-                                             ,breakpoint-xpm-data
-                                             :ascent 100 :pointer hand)
-                                      (:type pbm :data
-                                             ,breakpoint-enabled-pbm-data
-                                             :ascent 100 :pointer hand)))))
-            (or breakpoint-disabled-icon
-                (setq breakpoint-disabled-icon
-                      (find-image `((:type xpm :data
-                                           ,breakpoint-xpm-data
-                                           :conversion disabled
-                                           :ascent 100 :pointer hand)
-                                    (:type pbm :data
-                                           ,breakpoint-disabled-pbm-data
-                                           :ascent 100 :pointer hand))))))
-          (+ start 1)
-          putstring
-          'left-margin))
-      (when (< left-margin-width 2)
-       (save-current-buffer
-         (setq left-margin-width 2)
-         (let ((window (get-buffer-window (current-buffer) 0)))
-           (if window
-               (set-window-margins
-                window left-margin-width right-margin-width)))))
-      (gdb-put-string
-       (propertize putstring
-                  'face (if enabled 'breakpoint-enabled 'breakpoint-disabled))
-       (1+ start)))))
-
-(defun gdb-remove-breakpoint-icons (start end &optional remove-margin)
-  (gdb-remove-strings start end)
-  (if (display-images-p)
-      (remove-images start end))
-  (when remove-margin
-    (setq left-margin-width 0)
-    (let ((window (get-buffer-window (current-buffer) 0)))
-      (if window
-         (set-window-margins
-          window left-margin-width right-margin-width)))))
-
-\f
-;;
-;; Assembler buffer.
-;;
-(gdb-set-buffer-rules 'gdb-assembler-buffer
-                     'gdb-assembler-buffer-name
-                     'gdb-assembler-mode)
-
-;; We can't use def-gdb-auto-update-handler because we don't want to use
-;; window-start but keep the overlay arrow/current line visible.
-(defun gdb-assembler-handler ()
-  (setq gdb-pending-triggers
-       (delq 'gdb-invalidate-assembler
-             gdb-pending-triggers))
-  (let ((buf (gdb-get-buffer 'gdb-partial-output-buffer)))
-    (with-current-buffer buf
-      (goto-char (point-min))
-      ;; The disassemble command in GDB 7.1 onwards displays an overlay arrow.
-      (while (re-search-forward "\\(^   0x\\|=> 0x\\)" nil t)
-       (replace-match "0x" nil nil))))
-  (let ((buf (gdb-get-buffer 'gdb-assembler-buffer)))
-    (and buf
-        (with-current-buffer buf
-          (let* ((window (get-buffer-window buf 0))
-                 (p (window-point window))
-                 (buffer-read-only nil))
-            (erase-buffer)
-            (insert-buffer-substring (gdb-get-buffer-create
-                                         'gdb-partial-output-buffer))
-            (set-window-point window p)))))
-  ;; put customisation here
-  (gdb-assembler-custom))
-
-(defun gdb-assembler-custom ()
-  (let ((buffer (gdb-get-buffer 'gdb-assembler-buffer))
-       (pos 1) (address) (flag) (bptno))
-    (with-current-buffer buffer
-      (save-excursion
-       (if (not (equal gdb-pc-address "main"))
-           (progn
-             (goto-char (point-min))
-             (if (and gdb-pc-address
-                      (search-forward gdb-pc-address nil t))
-                 (progn
-                   (setq pos (point))
-                   (beginning-of-line)
-                   (setq fringe-indicator-alist
-                         (if (string-equal gdb-frame-number "0")
-                             nil
-                           '((overlay-arrow . hollow-right-triangle))))
-                   (or gdb-overlay-arrow-position
-                       (setq gdb-overlay-arrow-position (make-marker)))
-                   (set-marker gdb-overlay-arrow-position (point))))))
-       ;; remove all breakpoint-icons in assembler buffer before updating.
-       (gdb-remove-breakpoint-icons (point-min) (point-max))))
-    (with-current-buffer (gdb-get-buffer 'gdb-breakpoints-buffer)
-      (goto-char (point-min))
-      (while (< (point) (- (point-max) 1))
-       (forward-line 1)
-       (when (looking-at
-              "\\([0-9]+\\.?[0-9]*\\).*?\\s-+\\(.\\)\\s-+0x0*\\(\\S-+\\)")
-         (setq bptno (match-string 1))
-         (setq flag (char-after (match-beginning 2)))
-         (setq address (match-string 3))
-         (with-current-buffer buffer
-           (save-excursion
-             (goto-char (point-min))
-             (if (re-search-forward (concat "^0x0*" address) nil t)
-                 (gdb-put-breakpoint-icon (eq flag ?y) bptno)))))))
-    (if (not (equal gdb-pc-address "main"))
-       (with-current-buffer buffer
-         (set-window-point (get-buffer-window buffer 0) pos)))))
-
-(defvar gdb-assembler-mode-map
-  (let ((map (make-sparse-keymap)))
-    (suppress-keymap map)
-    (define-key map "q" 'kill-this-buffer)
-     map))
-
-(defvar gdb-assembler-font-lock-keywords
-  '(;; <__function.name+n>
-    ("<\\(\\(\\sw\\|[_.]\\)+\\)\\(\\+[0-9]+\\)?>"
-     (1 font-lock-function-name-face))
-    ;; 0xNNNNNNNN <__function.name+n>: opcode
-    ("^0x[0-9a-f]+ \\(<\\(\\(\\sw\\|[_.]\\)+\\)\\+[0-9]+>\\)?:[ \t]+\\(\\sw+\\)"
-     (4 font-lock-keyword-face))
-    ;; %register(at least i386)
-    ("%\\sw+" . font-lock-variable-name-face)
-    ("^\\(Dump of assembler code for function\\) \\(.+\\):"
-     (1 font-lock-comment-face)
-     (2 font-lock-function-name-face))
-    ("^\\(End of assembler dump\\.\\)" . font-lock-comment-face))
-  "Font lock keywords used in `gdb-assembler-mode'.")
-
-(defun gdb-assembler-mode ()
-  "Major mode for viewing code assembler.
-
-\\{gdb-assembler-mode-map}"
-  (kill-all-local-variables)
-  (setq major-mode 'gdb-assembler-mode)
-  (setq mode-name (concat "Machine:" gdb-selected-frame))
-  (setq gdb-overlay-arrow-position nil)
-  (add-to-list 'overlay-arrow-variable-list 'gdb-overlay-arrow-position)
-  (setq fringes-outside-margins t)
-  (setq buffer-read-only t)
-  (buffer-disable-undo)
-  (gdb-thread-identification)
-  (use-local-map gdb-assembler-mode-map)
-  (gdb-invalidate-assembler)
-  (set (make-local-variable 'font-lock-defaults)
-       '(gdb-assembler-font-lock-keywords))
-  (run-mode-hooks 'gdb-assembler-mode-hook)
-  'gdb-invalidate-assembler)
-
-(defun gdb-assembler-buffer-name ()
-  (with-current-buffer gud-comint-buffer
-    (concat "*disassembly of " (gdb-get-target-string) "*")))
-
-(defun gdb-display-assembler-buffer ()
-  "Display disassembly view."
-  (interactive)
-  (setq gdb-previous-frame nil)
-  (gdb-display-buffer
-   (gdb-get-buffer-create 'gdb-assembler-buffer) t))
-
-(defun gdb-frame-assembler-buffer ()
-  "Display disassembly view in a new frame."
-  (interactive)
-  (setq gdb-previous-frame nil)
-  (let ((special-display-regexps (append special-display-regexps '(".*")))
-       (special-display-frame-alist gdb-frame-parameters))
-    (display-buffer (gdb-get-buffer-create 'gdb-assembler-buffer))))
-
-;; modified because if gdb-pc-address has changed value a new command
-;; must be enqueued to update the buffer with the new output
-(defun gdb-invalidate-assembler (&optional ignored)
-  (if (gdb-get-buffer 'gdb-assembler-buffer)
-      (progn
-       (unless (and gdb-selected-frame
-                    (string-equal gdb-selected-frame gdb-previous-frame))
-         (if (or (not (member 'gdb-invalidate-assembler
-                              gdb-pending-triggers))
-                 (not (equal (string-to-number gdb-pc-address)
-                             (string-to-number
-                              gdb-previous-frame-pc-address))))
-         (progn
-           ;; take previous disassemble command, if any, off the queue
-           (with-current-buffer gud-comint-buffer
-             (let ((queue gdb-input-queue))
-               (dolist (item queue)
-                 (if (equal (cdr item) '(gdb-assembler-handler))
-                     (setq gdb-input-queue
-                           (delete item gdb-input-queue))))))
-           (gdb-enqueue-input
-            (list
-             (concat gdb-server-prefix "disassemble " gdb-pc-address "\n")
-                  'gdb-assembler-handler))
-           (push 'gdb-invalidate-assembler gdb-pending-triggers)
-           (setq gdb-previous-frame-pc-address gdb-pc-address)
-           (setq gdb-previous-frame gdb-selected-frame)))))))
-
-(defun gdb-get-selected-frame ()
-  (if (not (member 'gdb-get-selected-frame gdb-pending-triggers))
-      (progn
-       (if (string-equal gdb-version "pre-6.4")
-           (gdb-enqueue-input
-            (list (concat gdb-server-prefix "info frame\n")
-                  'gdb-frame-handler))
-         (gdb-enqueue-input
-           (list "server interpreter mi -stack-info-frame\n"
-                 'gdb-frame-handler-1)))
-       (push 'gdb-get-selected-frame gdb-pending-triggers))))
-
-(defun gdb-frame-handler ()
-  (setq gdb-pending-triggers
-       (delq 'gdb-get-selected-frame gdb-pending-triggers))
-  (goto-char (point-min))
-  (when (re-search-forward
-       "Stack level \\([0-9]+\\), frame at \\(0x[[:xdigit:]]+\\)" nil t)
-    (setq gdb-frame-number (match-string 1))
-    (setq gdb-frame-address (match-string 2)))
-  (goto-char (point-min))
-  (when (re-search-forward ".*=\\s-+\\(\\S-*\\)\\s-+in\\s-+\\(.*?\\)\
-\\(?: (\\(\\S-+?\\):[0-9]+?)\\)*; "
-     nil t)
-    (setq gdb-selected-frame (match-string 2))
-    (if (gdb-get-buffer 'gdb-locals-buffer)
-       (with-current-buffer (gdb-get-buffer 'gdb-locals-buffer)
-         (setq mode-name (concat "Locals:" gdb-selected-frame))))
-    (if (gdb-get-buffer 'gdb-assembler-buffer)
-       (with-current-buffer (gdb-get-buffer 'gdb-assembler-buffer)
-         (setq mode-name (concat "Machine:" gdb-selected-frame))))
-    (setq gdb-pc-address (match-string 1))
-    (if (and (match-string 3) gud-overlay-arrow-position)
-      (let ((buffer (marker-buffer gud-overlay-arrow-position))
-           (position (marker-position gud-overlay-arrow-position)))
-       (when (and buffer
-                  (string-equal (file-name-nondirectory
-                                 (buffer-file-name buffer))
-                                (file-name-nondirectory (match-string 3))))
-         (with-current-buffer buffer
-           (setq fringe-indicator-alist
-                 (if (string-equal gdb-frame-number "0")
-                     nil
-                   '((overlay-arrow . hollow-right-triangle))))
-           (set-marker gud-overlay-arrow-position position))))))
-  (goto-char (point-min))
-  (if (re-search-forward " source language \\(\\S-+\\)\." nil t)
-      (setq gdb-current-language (match-string 1)))
-  (gdb-invalidate-assembler))
-
-\f
-;; Code specific to GDB 6.4
-(defconst gdb-source-file-regexp-1 "fullname=\"\\(.*?\\)\"")
-
-(defun gdb-set-gud-minor-mode-existing-buffers-1 ()
-  "Create list of source files for current GDB session.
-If buffers already exist for any of these files, `gud-minor-mode'
-is set in them."
-  (goto-char (point-min))
-  (while (re-search-forward gdb-source-file-regexp-1 nil t)
-    (push (match-string 1) gdb-source-file-list))
-  (dolist (buffer (buffer-list))
-    (with-current-buffer buffer
-      (when (member buffer-file-name gdb-source-file-list)
-       (gdb-init-buffer))))
-  (gdb-force-mode-line-update
-   (propertize "ready" 'face font-lock-variable-name-face)))
-
-;; Used for -stack-info-frame but could be used for -stack-list-frames too.
-(defconst gdb-stack-list-frames-regexp
-".*?level=\"\\(.*?\\)\".*?,addr=\"\\(.*?\\)\".*?,func=\"\\(.*?\\)\",\
-\\(?:.*?file=\".*?\".*?,fullname=\"\\(.*?\\)\".*?,line=\"\\(.*?\\)\".*?}\\|\
-from=\"\\(.*?\\)\"\\)")
-
-(defun gdb-frame-handler-1 ()
-  (setq gdb-pending-triggers
-       (delq 'gdb-get-selected-frame gdb-pending-triggers))
-  (goto-char (point-min))
-    (when (re-search-forward gdb-stack-list-frames-regexp nil t)
-      (setq gdb-frame-number (match-string 1))
-      (setq gdb-pc-address (match-string 2))
-      (setq gdb-selected-frame (match-string 3))
-      (if (gdb-get-buffer 'gdb-locals-buffer)
-         (with-current-buffer (gdb-get-buffer 'gdb-locals-buffer)
-           (setq mode-name (concat "Locals:" gdb-selected-frame))))
-      (if (gdb-get-buffer 'gdb-assembler-buffer)
-         (with-current-buffer (gdb-get-buffer 'gdb-assembler-buffer)
-           (setq mode-name (concat "Machine:" gdb-selected-frame)))))
-    (if (and (match-string 4) (match-string 5) gud-overlay-arrow-position)
-       (let ((buffer (marker-buffer gud-overlay-arrow-position))
-             (position (marker-position gud-overlay-arrow-position)))
-         (when (and buffer
-                    (string-equal (file-name-nondirectory
-                                   (buffer-file-name buffer))
-                                  (file-name-nondirectory (match-string 4))))
-           (with-current-buffer buffer
-             (setq fringe-indicator-alist
-                   (if (string-equal gdb-frame-number "0")
-                       nil
-                     '((overlay-arrow . hollow-right-triangle))))
-             (set-marker gud-overlay-arrow-position position)))))
-  (gdb-invalidate-assembler))
-
-; Uses "-var-list-children --all-values".  Needs GDB 6.4 onwards.
-(defun gdb-var-list-children-1 (varnum)
-  (gdb-enqueue-input
-   (list
-    (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba)
-       (concat "server interpreter mi \"-var-list-children --all-values \\\""
-               varnum "\\\"\"\n")
-      (concat "-var-list-children --all-values \"" varnum "\"\n"))
-    `(lambda () (gdb-var-list-children-handler-1 ,varnum)))))
-
-(defun gdb-var-list-children-handler-1 (varnum)
-  (let* ((var-list nil)
-        (output (bindat-get-field (gdb-json-partial-output "child")))
-        (children (bindat-get-field output 'children)))
-   (catch 'child-already-watched
-      (dolist (var gdb-var-list)
-       (if (string-equal varnum (car var))
-           (progn
-             ;; With dynamic varobjs numchild may have increased.
-             (setcar (nthcdr 2 var) (bindat-get-field output 'numchild))
-             (push var var-list)
-             (dolist (child children)
-               (let ((varchild (list (bindat-get-field child 'name)
-                                     (bindat-get-field child 'exp)
-                                     (bindat-get-field child 'numchild)
-                                     (bindat-get-field child 'type)
-                                     (bindat-get-field child 'value)
-                                     nil
-                                     (bindat-get-field child 'has_more))))
-                 (if (assoc (car varchild) gdb-var-list)
-                     (throw 'child-already-watched nil))
-                 (push varchild var-list))))
-         (push var var-list)))
-      (setq gdb-var-list (nreverse var-list))))
-  (gdb-speedbar-update))
-
-; Uses "-var-update --all-values".  Needs GDB 6.4 onwards.
-(defun gdb-var-update-1 ()
-  (if (not (member 'gdb-var-update gdb-pending-triggers))
-      (progn
-       (gdb-enqueue-input
-        (list
-         (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba)
-             "server interpreter mi \"-var-update --all-values *\"\n"
-           "-var-update --all-values *\n")
-         'gdb-var-update-handler-1))
-       (push 'gdb-var-update gdb-pending-triggers))))
-
-(defun gdb-var-update-handler-1 ()
-  (let ((changelist (bindat-get-field (gdb-json-partial-output) 'changelist)))
-    (dolist (var gdb-var-list)
-      (setcar (nthcdr 5 var) nil))
-    (let ((temp-var-list gdb-var-list))
-      (dolist (change changelist)
-       (let* ((varnum (bindat-get-field change 'name))
-              (var (assoc varnum gdb-var-list))
-              (new-num (bindat-get-field change 'new_num_children)))
-         (when var
-           (let ((scope (bindat-get-field change 'in_scope))
-                 (has-more (bindat-get-field change 'has_more)))
-             (cond ((string-equal scope "false")
-                    (if gdb-delete-out-of-scope
-                        (gdb-var-delete-1 var varnum)
-                      (setcar (nthcdr 5 var) 'out-of-scope)))
-                   ((string-equal scope "true")
-                    (setcar (nthcdr 6 var) has-more)
-                    (when (and (or (not has-more)
-                                   (string-equal has-more "0"))
-                               (not new-num)
-                               (string-equal (nth 2 var) "0"))
-                      (setcar (nthcdr 4 var)
-                              (bindat-get-field change 'value))
-                      (setcar (nthcdr 5 var) 'changed)))
-                   ((string-equal scope "invalid")
-                    (gdb-var-delete-1 var varnum)))))
-         (let ((var-list nil) var1
-               (children (bindat-get-field change 'new_children)))
-           (if new-num
-               (progn
-                 (setq var1 (pop temp-var-list))
-                 (while var1
-                   (if (string-equal varnum (car var1))
-                       (let ((new (string-to-number new-num))
-                             (previous (string-to-number (nth 2 var1))))
-                         (setcar (nthcdr 2 var1) new-num)
-                         (push var1 var-list)
-                         (cond ((> new previous)
-                                ;; Add new children to list.
-                                (dotimes (dummy previous)
-                                  (push (pop temp-var-list) var-list))
-                                (dolist (child children)
-                                  (let ((varchild
-                                         (list (bindat-get-field child 'name)
-                                               (bindat-get-field child 'exp)
-                                               (bindat-get-field child 'numchild)
-                                               (bindat-get-field child 'type)
-                                               (bindat-get-field child 'value)
-                                               'changed
-                                               (bindat-get-field child 'has_more))))
-                                    (push varchild var-list))))
-                               ;; Remove deleted children from list.
-                               ((< new previous)
-                                (dotimes (dummy new)
-                                    (push (pop temp-var-list) var-list))
-                                (dotimes (dummy (- previous new))
-                                    (pop temp-var-list)))))
-                     (push var1 var-list))
-                   (setq var1 (pop temp-var-list)))
-                 (setq gdb-var-list (nreverse var-list)))))))))
-  (setq gdb-pending-triggers
-       (delq 'gdb-var-update gdb-pending-triggers))
-  (gdb-speedbar-update))
-
-;; Registers buffer.
-;;
-(gdb-set-buffer-rules 'gdb-registers-buffer
-                     'gdb-registers-buffer-name
-                     'gdb-registers-mode)
-
-(def-gdb-auto-update-trigger gdb-invalidate-registers-1
-  (gdb-get-buffer 'gdb-registers-buffer)
-  (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba)
-      "server interpreter mi \"-data-list-register-values x\"\n"
-    "-data-list-register-values x\n")
-    gdb-data-list-register-values-handler)
-
-(defconst gdb-data-list-register-values-regexp
-  "{.*?number=\"\\(.*?\\)\".*?,value=\"\\(.*?\\)\".*?}")
-
-(defun gdb-data-list-register-values-handler ()
-  (setq gdb-pending-triggers (delq 'gdb-invalidate-registers-1
-                                  gdb-pending-triggers))
-  (goto-char (point-min))
-  (if (re-search-forward gdb-error-regexp nil t)
-      (let ((err (match-string 1)))
-       (with-current-buffer (gdb-get-buffer 'gdb-registers-buffer)
-         (let ((buffer-read-only nil))
-           (erase-buffer)
-           (put-text-property 0 (length err) 'face font-lock-warning-face err)
-           (insert err)
-           (goto-char (point-min)))))
-    (let ((register-list (reverse gdb-register-names))
-         (register nil) (register-string nil) (register-values nil))
-      (goto-char (point-min))
-      (while (re-search-forward gdb-data-list-register-values-regexp nil t)
-       (setq register (pop register-list))
-       (setq register-string (concat register "\t" (match-string 2) "\n"))
-       (if (member (match-string 1) gdb-changed-registers)
-           (put-text-property 0 (length register-string)
-                              'face 'font-lock-warning-face
-                              register-string))
-       (setq register-values
-             (concat register-values register-string)))
-      (let ((buf (gdb-get-buffer 'gdb-registers-buffer)))
-       (with-current-buffer buf
-         (let* ((window (get-buffer-window buf 0))
-                (start (window-start window))
-                (p (if window (window-point window) (point)))
-                (buffer-read-only nil))
-           (erase-buffer)
-           (insert register-values)
-           (if window
-               (progn
-                 (set-window-start window start)
-                 (set-window-point window p))
-             (goto-char p)))))))
-  (gdb-data-list-register-values-custom))
-
-(defun gdb-data-list-register-values-custom ()
-  (with-current-buffer (gdb-get-buffer 'gdb-registers-buffer)
-    (save-excursion
-      (let ((buffer-read-only nil)
-           start end)
-       (goto-char (point-min))
-       (while (< (point) (point-max))
-         (setq start (line-beginning-position))
-         (setq end (line-end-position))
-         (when (looking-at "^[^\t]+")
-           (unless (string-equal (match-string 0) "No registers.")
-             (put-text-property start (match-end 0)
-                                'face font-lock-variable-name-face)
-             (add-text-properties start end
-                                  '(help-echo "mouse-2: edit value"
-                                    mouse-face highlight))))
-         (forward-line 1))))))
-
-;; Needs GDB 6.4 onwards (used to fail with no stack).
-(defun gdb-get-changed-registers ()
-  (if (and (gdb-get-buffer 'gdb-registers-buffer)
-          (not (member 'gdb-get-changed-registers gdb-pending-triggers)))
-      (progn
-       (gdb-enqueue-input
-        (list
-         (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba)
-             "server interpreter mi -data-list-changed-registers\n"
-           "-data-list-changed-registers\n")
-         'gdb-get-changed-registers-handler))
-       (push 'gdb-get-changed-registers gdb-pending-triggers))))
-
-(defconst gdb-data-list-register-names-regexp "\"\\(.*?\\)\"")
-
-(defun gdb-get-changed-registers-handler ()
-  (setq gdb-pending-triggers
-       (delq 'gdb-get-changed-registers gdb-pending-triggers))
-  (setq gdb-changed-registers nil)
-  (goto-char (point-min))
-  (while (re-search-forward gdb-data-list-register-names-regexp nil t)
-    (push (match-string 1) gdb-changed-registers)))
-\f
-
-;; Locals buffer.
-;;
-;; uses "-stack-list-locals --simple-values".  Needs GDB 6.1 onwards.
-(gdb-set-buffer-rules 'gdb-locals-buffer
-                     'gdb-locals-buffer-name
-                     'gdb-locals-mode)
-
-(def-gdb-auto-update-trigger gdb-invalidate-locals-1
-  (gdb-get-buffer 'gdb-locals-buffer)
-  (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer) 'gdba)
-      "server interpreter mi -\"stack-list-locals --simple-values\"\n"
-    "-stack-list-locals --simple-values\n")
-  gdb-stack-list-locals-handler)
-
-(defconst gdb-stack-list-locals-regexp
-  "{.*?name=\"\\(.*?\\)\".*?,type=\"\\(.*?\\)\"")
-
-(defvar gdb-locals-watch-map-1
-  (let ((map (make-sparse-keymap)))
-    (suppress-keymap map)
-    (define-key map "\r" 'gud-watch)
-    (define-key map [mouse-2] 'gud-watch)
-    map)
-  "Keymap to create watch expression of a complex data type local variable.")
-
-(defvar gdb-edit-locals-map-1
-  (let ((map (make-sparse-keymap)))
-    (suppress-keymap map)
-    (define-key map "\r" 'gdb-edit-locals-value)
-    (define-key map [mouse-2] 'gdb-edit-locals-value)
-    map)
-  "Keymap to edit value of a simple data type local variable.")
-
-(defun gdb-edit-locals-value (&optional event)
-  "Assign a value to a variable displayed in the locals buffer."
-  (interactive (list last-input-event))
-  (save-excursion
-    (if event (posn-set-point (event-end event)))
-    (beginning-of-line)
-    (let* ((var (current-word))
-          (value (read-string (format "New value (%s): " var))))
-      (gdb-enqueue-input
-       (list (concat  gdb-server-prefix "set variable " var " = " value "\n")
-            'ignore)))))
-
-;; Dont display values of arrays or structures.
-;; These can be expanded using gud-watch.
-(defun gdb-stack-list-locals-handler ()
-  (setq gdb-pending-triggers (delq 'gdb-invalidate-locals-1
-                                 gdb-pending-triggers))
-  (goto-char (point-min))
-  (if (re-search-forward gdb-error-regexp nil t)
-      (let ((err (match-string 1)))
-       (with-current-buffer (gdb-get-buffer 'gdb-locals-buffer)
-         (let ((buffer-read-only nil))
-           (erase-buffer)
-           (insert err)
-           (goto-char (point-min)))))
-    (let (local locals-list)
-      (goto-char (point-min))
-      (while (re-search-forward gdb-stack-list-locals-regexp nil t)
-       (let ((local (list (match-string 1)
-                          (match-string 2)
-                          nil)))
-         (if (looking-at ",value=\\(\".*\"\\).*?}")
-             (setcar (nthcdr 2 local) (read (match-string 1))))
-         (push local locals-list)))
-      (let ((buf (gdb-get-buffer 'gdb-locals-buffer)))
-       (and buf (with-current-buffer buf
-                  (let* ((window (get-buffer-window buf 0))
-                         (start (window-start window))
-                         (p (if window (window-point window) (point)))
-                         (buffer-read-only nil) (name) (value))
-                    (erase-buffer)
-                    (dolist (local locals-list)
-                      (setq name (car local))
-                      (setq value (nth 2 local))
-                      (if (or (not value)
-                              (string-match "^\\0x" value))
-                          (add-text-properties 0 (length name)
-                               `(mouse-face highlight
-                                 help-echo "mouse-2: create watch expression"
-                                 local-map ,gdb-locals-watch-map-1)
-                               name)
-                        (add-text-properties 0 (length value)
-                             `(mouse-face highlight
-                               help-echo "mouse-2: edit value"
-                               local-map ,gdb-edit-locals-map-1)
-                             value))
-                      (insert
-                       (concat name "\t" (nth 1 local)
-                               "\t" value "\n")))
-                    (if window
-                        (progn
-                          (set-window-start window start)
-                          (set-window-point window p))
-                      (goto-char p)))))))))
-
-(defun gdb-get-register-names ()
-  "Create a list of register names."
-  (goto-char (point-min))
-  (while (re-search-forward gdb-data-list-register-names-regexp nil t)
-    (push (match-string 1) gdb-register-names)))
-
-(provide 'gdb-ui)
-
-;; arch-tag: e9fb00c5-74ef-469f-a088-37384caae352
-;;; gdb-ui.el ends here
index bee7a062f64a6bb17c53af3cbbe0e067586cc296..da38a086782e296ac2e1d59eb03cef5bef27b9a8 100644 (file)
 (require 'comint)
 
 (defvar gdb-active-process)
-(defvar gdb-recording)
 (defvar gdb-define-alist)
 (defvar gdb-macro-info)
-(defvar gdb-server-prefix)
 (defvar gdb-show-changed-values)
 (defvar gdb-source-window)
 (defvar gdb-var-list)
@@ -126,77 +124,52 @@ Used to grey out relevant toolbar icons.")
                (throw 'info-found nil))))
        nil 0)
       (select-frame (make-frame)))
-    (if (memq gud-minor-mode '(gdbmi gdba))
+    (if (eq gud-minor-mode 'gdbmi)
        (info "(emacs)GDB Graphical Interface")
       (info "(emacs)Debuggers"))))
 
 (defun gud-tool-bar-item-visible-no-fringe ()
   (not (or (eq (buffer-local-value 'major-mode (window-buffer)) 'speedbar-mode)
-          (and (memq gud-minor-mode '(gdbmi gdba))
+          (eq (buffer-local-value 'major-mode (window-buffer)) 'gdb-memory-mode)
+          (and (eq gud-minor-mode 'gdbmi)
                (> (car (window-fringes)) 0)))))
 
+(declare-function gdb-gud-context-command "gdb-mi.el")
+
 (defun gud-stop-subjob ()
   (interactive)
   (with-current-buffer gud-comint-buffer
-    (if (string-equal gud-target-name "emacs")
-       (comint-stop-subjob)
-      (if (eq gud-minor-mode 'jdb)
-         (gud-call "suspend")
-       (comint-interrupt-subjob)))))
+    (cond ((string-equal gud-target-name "emacs")
+           (comint-stop-subjob))
+          ((eq gud-minor-mode 'jdb)
+           (gud-call "suspend"))
+          ((eq gud-minor-mode 'gdbmi)
+           (gud-call (gdb-gud-context-command "-exec-interrupt")))
+          (t 
+           (comint-interrupt-subjob)))))
 
 (easy-mmode-defmap gud-menu-map
   '(([help]     "Info (debugger)" . gud-goto-info)
-    ([rfinish] menu-item "Reverse Finish Function" gud-rfinish
-                  :enable (not gud-running)
-                 :visible (and gdb-recording
-                               (eq gud-minor-mode 'gdba)))
-    ([rstepi]  menu-item "Reverse Step Instruction" gud-rstepi
-                  :enable (not gud-running)
-                 :visible (and gdb-recording
-                               (eq gud-minor-mode 'gdba)))
-    ([rnexti]  menu-item "Reverse Next Instruction" gud-rnexti
-                  :enable (not gud-running)
-                 :visible (and gdb-recording
-                               (eq gud-minor-mode 'gdba)))
-    ([rstep]   menu-item "Reverse Step Line" gud-rstep
-                  :enable (not gud-running)
-                 :visible (and gdb-recording
-                               (eq gud-minor-mode 'gdba)))
-    ([rnext]   menu-item "Reverse Next Line" gud-rnext
-                  :enable (not gud-running)
-                 :visible (and gdb-recording
-                               (eq gud-minor-mode 'gdba)))
-    ([rcont]   menu-item "Reverse Continue" gud-rcont
-                  :enable (not gud-running)
-                 :visible (and gdb-recording
-                               (eq gud-minor-mode 'gdba)))
-    ([recstart] menu-item "Start Recording" gdb-toggle-recording-1
-                 :visible (and (not gdb-recording)
-                               (eq gud-minor-mode 'gdba)))
-    ([recstop] menu-item "Stop Recording" gdb-toggle-recording
-                 :visible (and gdb-recording
-                               (eq gud-minor-mode 'gdba)))
     ([tooltips] menu-item "Show GUD tooltips" gud-tooltip-mode
                   :enable (and (not emacs-basic-display)
                               (display-graphic-p)
                               (fboundp 'x-show-tip))
                  :visible (memq gud-minor-mode
-                               '(gdbmi gdba dbx sdb xdb pdb))
+                               '(gdbmi dbx sdb xdb pdb))
                  :button (:toggle . gud-tooltip-mode))
     ([refresh] "Refresh" . gud-refresh)
     ([run]     menu-item "Run" gud-run
                   :enable (not gud-running)
                  :visible (memq gud-minor-mode '(gdbmi gdb dbx jdb)))
     ([go]      menu-item (if gdb-active-process "Continue" "Run") gud-go
-                 :visible (and (not gud-running)
-                               (eq gud-minor-mode 'gdba)))
+                 :visible (and (eq gud-minor-mode 'gdbmi)
+                                (gdb-show-run-p)))
     ([stop]    menu-item "Stop" gud-stop-subjob
-                 :visible (or (not (memq gud-minor-mode '(gdba pdb)))
-                              (and gud-running
-                                   (eq gud-minor-mode 'gdba))))
+                 :visible (or (not (memq gud-minor-mode '(gdbmi pdb)))
+                              (gdb-show-stop-p)))
     ([until]   menu-item "Continue to selection" gud-until
                   :enable (not gud-running)
-                 :visible (and (memq gud-minor-mode '(gdbmi gdba gdb perldb))
+                 :visible (and (memq gud-minor-mode '(gdbmi gdb perldb))
                                (gud-tool-bar-item-visible-no-fringe)))
     ([remove]  menu-item "Remove Breakpoint" gud-remove
                   :enable (not gud-running)
@@ -204,50 +177,52 @@ Used to grey out relevant toolbar icons.")
     ([tbreak]  menu-item "Temporary Breakpoint" gud-tbreak
                   :enable (not gud-running)
                  :visible (memq gud-minor-mode
-                               '(gdbmi gdba gdb sdb xdb)))
+                               '(gdbmi gdb sdb xdb)))
     ([break]   menu-item "Set Breakpoint" gud-break
                   :enable (not gud-running)
                  :visible (gud-tool-bar-item-visible-no-fringe))
     ([up]      menu-item "Up Stack" gud-up
                  :enable (not gud-running)
                  :visible (memq gud-minor-mode
-                                '(gdbmi gdba gdb dbx xdb jdb pdb)))
+                                '(gdbmi gdb dbx xdb jdb pdb)))
     ([down]    menu-item "Down Stack" gud-down
                  :enable (not gud-running)
                  :visible (memq gud-minor-mode
-                                '(gdbmi gdba gdb dbx xdb jdb pdb)))
+                                '(gdbmi gdb dbx xdb jdb pdb)))
     ([pp]      menu-item "Print S-expression" gud-pp
                   :enable (and (not gud-running)
                                  gdb-active-process)
                  :visible (and (string-equal
                                 (buffer-local-value
                                  'gud-target-name gud-comint-buffer) "emacs")
-                               (eq gud-minor-mode 'gdba)))
-    ([print*]  menu-item "Print Dereference" gud-pstar
+                               (eq gud-minor-mode 'gdbmi)))
+    ([print*]  menu-item (if (eq gud-minor-mode 'jdb)
+                             "Dump object"
+                           "Print Dereference") gud-pstar
                   :enable (not gud-running)
-                 :visible (memq gud-minor-mode '(gdbmi gdba gdb)))
+                 :visible (memq gud-minor-mode '(gdbmi gdb jdb)))
     ([print]   menu-item "Print Expression" gud-print
                   :enable (not gud-running))
     ([watch]   menu-item "Watch Expression" gud-watch
                  :enable (not gud-running)
-                 :visible (memq gud-minor-mode '(gdbmi gdba)))
+                 :visible (eq gud-minor-mode 'gdbmi))
     ([finish]  menu-item "Finish Function" gud-finish
                   :enable (not gud-running)
                  :visible (memq gud-minor-mode
-                                '(gdbmi gdba gdb xdb jdb pdb)))
+                                '(gdbmi gdb xdb jdb pdb)))
     ([stepi]   menu-item "Step Instruction" gud-stepi
                   :enable (not gud-running)
-                 :visible (memq gud-minor-mode '(gdbmi gdba gdb dbx)))
+                 :visible (memq gud-minor-mode '(gdbmi gdb dbx)))
     ([nexti]   menu-item "Next Instruction" gud-nexti
                   :enable (not gud-running)
-                 :visible (memq gud-minor-mode '(gdbmi gdba gdb dbx)))
+                 :visible (memq gud-minor-mode '(gdbmi gdb dbx)))
     ([step]    menu-item "Step Line" gud-step
                   :enable (not gud-running))
     ([next]    menu-item "Next Line" gud-next
                   :enable (not gud-running))
     ([cont]    menu-item "Continue" gud-cont
                   :enable (not gud-running)
-                 :visible (not (eq gud-minor-mode 'gdba))))
+                 :visible (not (eq gud-minor-mode 'gdbmi))))
   "Menu for `gud-mode'."
   :name "Gud")
 
@@ -269,21 +244,22 @@ Used to grey out relevant toolbar icons.")
        . (,(propertize "next" 'face 'font-lock-doc-face) . gud-next))
        ([menu-bar until] menu-item
        ,(propertize "until" 'face 'font-lock-doc-face) gud-until
-                 :visible (memq gud-minor-mode '(gdbmi gdba gdb perldb)))
+                 :visible (memq gud-minor-mode '(gdbmi gdb perldb)))
        ([menu-bar cont] menu-item
        ,(propertize "cont" 'face 'font-lock-doc-face) gud-cont
-       :visible (not (eq gud-minor-mode 'gdba)))
+       :visible (not (eq gud-minor-mode 'gdbmi)))
        ([menu-bar run] menu-item
        ,(propertize "run" 'face 'font-lock-doc-face) gud-run
        :visible (memq gud-minor-mode '(gdbmi gdb dbx jdb)))
        ([menu-bar go] menu-item
        ,(propertize " go " 'face 'font-lock-doc-face) gud-go
-       :visible (and (not gud-running)
-                     (eq gud-minor-mode 'gdba)))
+       :visible (and (eq gud-minor-mode 'gdbmi)
+                      (gdb-show-run-p)))
        ([menu-bar stop] menu-item
        ,(propertize "stop" 'face 'font-lock-doc-face) gud-stop-subjob
-       :visible (and gud-running
-                    (eq gud-minor-mode 'gdba)))
+       :visible (or (and (eq gud-minor-mode 'gdbmi)
+                          (gdb-show-stop-p))
+                    (not (eq gud-minor-mode 'gdbmi))))
        ([menu-bar print]
        . (,(propertize "print" 'face 'font-lock-doc-face) . gud-print))
        ([menu-bar tools] . undefined)
@@ -322,14 +298,6 @@ Used to grey out relevant toolbar icons.")
                 (gud-stepi . "gud/stepi")
                 (gud-up . "gud/up")
                 (gud-down . "gud/down")
-                (gdb-toggle-recording-1 . "gud/recstart")
-                (gdb-toggle-recording . "gud/recstop")
-                (gud-rcont . "gud/rcont")
-                (gud-rnext . "gud/rnext")
-                (gud-rstep . "gud/rstep")
-                (gud-rfinish . "gud/rfinish")
-                (gud-rnexti . "gud/rnexti")
-                (gud-rstepi . "gud/rstepi")
                 (gud-goto-info . "info"))
               map)
       (tool-bar-local-item-from-menu
@@ -354,7 +322,7 @@ Uses `gud-<MINOR-MODE>-directories' to find the source files."
        (setq directories (cdr directories)))
       result)))
 
-(declare-function gdb-create-define-alist "gdb-ui" ())
+(declare-function gdb-create-define-alist "gdb-mi" ())
 
 (defun gud-find-file (file)
   ;; Don't get confused by double slashes in the name that comes from GDB.
@@ -370,7 +338,7 @@ Uses `gud-<MINOR-MODE>-directories' to find the source files."
        (set (make-local-variable 'gud-minor-mode) minor-mode)
        (set (make-local-variable 'tool-bar-map) gud-tool-bar-map)
        (when (and gud-tooltip-mode
-                  (memq gud-minor-mode '(gdbmi gdba)))
+                  (eq gud-minor-mode 'gdbmi))
          (make-local-variable 'gdb-define-alist)
          (unless  gdb-define-alist (gdb-create-define-alist))
          (add-hook 'after-save-hook 'gdb-create-define-alist nil t))
@@ -499,21 +467,21 @@ The value t means that there is no stack, and we are in display-file mode.")
 
 (defvar gud-speedbar-menu-items
   '(["Jump to stack frame" speedbar-edit-line
-     :visible (not (memq (buffer-local-value 'gud-minor-mode gud-comint-buffer)
-                   '(gdbmi gdba)))]
+     :visible (not (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer)
+                   'gdbmi))]
     ["Edit value" speedbar-edit-line
-     :visible (memq (buffer-local-value 'gud-minor-mode gud-comint-buffer)
-                   '(gdbmi gdba))]
+     :visible (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer)
+                   'gdbmi)]
     ["Delete expression" gdb-var-delete
-     :visible (memq (buffer-local-value 'gud-minor-mode gud-comint-buffer)
-                   '(gdbmi gdba))]
+     :visible (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer)
+                   'gdbmi)]
     ["Auto raise frame" gdb-speedbar-auto-raise
      :style toggle :selected gdb-speedbar-auto-raise
-     :visible (memq (buffer-local-value 'gud-minor-mode gud-comint-buffer)
-                   '(gdbmi gdba))]
+     :visible (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer)
+                   'gdbmi)]
     ("Output Format"
-     :visible (memq (buffer-local-value 'gud-minor-mode gud-comint-buffer)
-                   '(gdbmi gdba))
+     :visible (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer)
+                   'gdbmi)
      ["Binary" (gdb-var-set-format "binary") t]
      ["Natural" (gdb-var-set-format  "natural") t]
      ["Hexadecimal" (gdb-var-set-format "hexadecimal") t]))
@@ -542,7 +510,7 @@ required by the caller."
          (start (window-start window))
          (p (window-point window)))
       (cond
-       ((memq minor-mode '(gdbmi gdba))
+       ((eq minor-mode 'gdbmi)
        (erase-buffer)
        (insert "Watch Expressions:\n")
        (let ((var-list gdb-var-list) parent)
@@ -632,7 +600,7 @@ required by the caller."
                 (car frame)
                 'speedbar-file-face
                 'speedbar-highlight-face
-                (cond ((memq minor-mode '(gdbmi gdba gdb))
+                (cond ((memq minor-mode '(gdbmi gdb))
                        'gud-gdb-goto-stackframe)
                       (t (error "Should never be here")))
                 frame t))))
@@ -689,8 +657,6 @@ The option \"--fullname\" must be included in this value."
        ;; Set the accumulator to the remaining text.
        gud-marker-acc (substring gud-marker-acc (match-end 0))))
 
-    ;; Check for annotations and change gud-minor-mode to 'gdba if
-    ;; they are found.
     (while (string-match "\n\032\032\\(.*\\)\n" gud-marker-acc)
       (let ((match (match-string 1 gud-marker-acc)))
 
@@ -754,10 +720,10 @@ The option \"--fullname\" must be included in this value."
 (defvar gud-filter-pending-text nil
   "Non-nil means this is text that has been saved for later in `gud-filter'.")
 
-;; If in gdba mode, gdb-ui is loaded.
-(declare-function gdb-restore-windows "gdb-ui" ())
+;; If in gdb mode, gdb-mi is loaded.
+(declare-function gdb-restore-windows "gdb-mi" ())
 
-;; The old gdb command (text command mode).  The new one is in gdb-ui.el.
+;; The old gdb command (text command mode).  The new one is in gdb-mi.el.
 ;;;###autoload
 (defun gud-gdb (command-line)
   "Run gdb on program FILE in buffer *gud-FILE*.
@@ -768,10 +734,10 @@ directory and source-file directory for your debugger."
   (when (and gud-comint-buffer
           (buffer-name gud-comint-buffer)
           (get-buffer-process gud-comint-buffer)
-          (with-current-buffer gud-comint-buffer (eq gud-minor-mode 'gdba)))
-       (gdb-restore-windows)
-       (error
-        "Multiple debugging requires restarting in text command mode"))
+          (with-current-buffer gud-comint-buffer (eq gud-minor-mode 'gdbmi)))
+    (gdb-restore-windows)
+    (error
+     "Multiple debugging requires restarting in text command mode"))
 
   (gud-common-init command-line nil 'gud-gdb-marker-filter)
   (set (make-local-variable 'gud-minor-mode) 'gdb)
@@ -2642,7 +2608,7 @@ It is saved for when this flag is not set.")
 (defvar gud-overlay-arrow-position nil)
 (add-to-list 'overlay-arrow-variable-list 'gud-overlay-arrow-position)
 
-(declare-function gdb-reset "gdb-ui" ())
+(declare-function gdb-reset "gdb-mi" ())
 
 (defun gud-sentinel (proc msg)
   (cond ((null (buffer-name (process-buffer proc)))
@@ -2654,14 +2620,14 @@ It is saved for when this flag is not set.")
                  (string-equal speedbar-initial-expansion-list-name "GUD"))
             (speedbar-change-initial-expansion-list
              speedbar-previously-used-expansion-list-name))
-        (if (memq gud-minor-mode-type '(gdbmi gdba))
+        (if (eq gud-minor-mode-type 'gdbmi)
             (gdb-reset)
           (gud-reset)))
        ((memq (process-status proc) '(signal exit))
         ;; Stop displaying an arrow in a source file.
         (setq gud-overlay-arrow-position nil)
-        (if (memq (buffer-local-value 'gud-minor-mode gud-comint-buffer)
-                  '(gdba gdbmi))
+        (if (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer)
+                  'gdbmi)
             (gdb-reset)
           (gud-reset))
         (let* ((obuf (current-buffer)))
@@ -2692,7 +2658,9 @@ It is saved for when this flag is not set.")
 (defun gud-kill-buffer-hook ()
   (setq gud-minor-mode-type gud-minor-mode)
   (condition-case nil
-      (kill-process (get-buffer-process (current-buffer)))
+      (progn
+       (kill-process (get-buffer-process (current-buffer)))
+       (delete-process (get-process "gdb-inferior")))
     (error nil)))
 
 (defun gud-reset ()
@@ -2715,8 +2683,8 @@ Obeying it means displaying in another window the specified file and line."
 
 (declare-function global-hl-line-highlight  "hl-line" ())
 (declare-function hl-line-highlight         "hl-line" ())
-(declare-function gdb-display-source-buffer "gdb-ui"  (buffer))
-(declare-function gdb-display-buffer "gdb-ui" (buf dedicated &optional size))
+(declare-function gdb-display-source-buffer "gdb-mi"  (buffer))
+(declare-function gdb-display-buffer "gdb-mi" (buf dedicated &optional size))
 
 ;; Make sure the file named TRUE-FILE is in a buffer that appears on the screen
 ;; and that its line LINE is visible.
@@ -2732,7 +2700,7 @@ Obeying it means displaying in another window the specified file and line."
            (gud-find-file true-file)))
         (window (and buffer
                      (or (get-buffer-window buffer)
-                         (if (memq gud-minor-mode '(gdbmi gdba))
+                         (if (eq gud-minor-mode 'gdbmi)
                              (or (if (get-buffer-window buffer 'visible)
                                      (display-buffer buffer nil 'visible))
                                  (unless (gdb-display-source-buffer buffer)
@@ -2769,7 +2737,7 @@ Obeying it means displaying in another window the specified file and line."
                   (goto-char pos))))
          (when window
            (set-window-point window gud-overlay-arrow-position)
-           (if (memq gud-minor-mode '(gdbmi gdba))
+           (if (eq gud-minor-mode 'gdbmi)
                (setq gdb-source-window window)))))))
 
 ;; The gud-call function must do the right thing whether its invoking
@@ -2875,7 +2843,7 @@ Obeying it means displaying in another window the specified file and line."
             (forward-line 0))
           (if (looking-at comint-prompt-regexp)
               (set-marker gud-delete-prompt-marker (point)))
-          (if (memq gud-minor-mode '(gdbmi gdba))
+          (if (eq gud-minor-mode 'gdbmi)
               (apply comint-input-sender (list proc command))
             (process-send-string proc (concat command "\n"))))))))
 
@@ -3301,14 +3269,14 @@ Treats actions as defuns."
   (gud-tooltip-activate-mouse-motions-if-enabled)
   (if (and gud-comint-buffer
           (buffer-name gud-comint-buffer); gud-comint-buffer might be killed
-          (memq (buffer-local-value 'gud-minor-mode gud-comint-buffer)
-                '(gdbmi gdba)))
+          (eq (buffer-local-value 'gud-minor-mode gud-comint-buffer)
+                'gdbmi))
       (if gud-tooltip-mode
          (progn
            (dolist (buffer (buffer-list))
              (unless (eq buffer gud-comint-buffer)
                (with-current-buffer buffer
-                 (when (and (memq gud-minor-mode '(gdbmi gdba))
+                 (when (and (eq gud-minor-mode 'gdbmi)
                             (not (string-match "\\`\\*.+\\*\\'"
                                                (buffer-name))))
                    (make-local-variable 'gdb-define-alist)
@@ -3433,8 +3401,8 @@ With arg, dereference expr if ARG is positive, otherwise do not derereference."
 ; Larger arrays (say 400 elements) are displayed in
 ; the tooltip incompletely and spill over into the gud buffer.
 ; Switching the process-filter creates timing problems and
-; it may be difficult to do better. Using annotations as in
-; gdb-ui.el gets round this problem.
+; it may be difficult to do better. Using GDB/MI as in
+; gdb-mi.el gets round this problem.
 (defun gud-tooltip-process-output (process output)
   "Process debugger output and show it in a tooltip window."
   (set-process-filter process gud-tooltip-original-filter)
@@ -3444,12 +3412,12 @@ With arg, dereference expr if ARG is positive, otherwise do not derereference."
 (defun gud-tooltip-print-command (expr)
   "Return a suitable command to print the expression EXPR."
   (case gud-minor-mode
-       (gdba (concat "server print " expr))
-       ((dbx gdbmi) (concat "print " expr))
+       (gdbmi (concat "-data-evaluate-expression " expr))
+       (dbx (concat "print " expr))
        ((xdb pdb) (concat "p " expr))
        (sdb (concat expr "/"))))
 
-(declare-function gdb-enqueue-input "gdb-ui" (item))
+(declare-function gdb-input "gdb-mi" (item))
 (declare-function tooltip-expr-to-print "tooltip" (event))
 (declare-function tooltip-event-buffer "tooltip" (event))
 
@@ -3469,12 +3437,12 @@ This function must return nil if it doesn't handle EVENT."
               (buffer-name gud-comint-buffer); might be killed
               (setq process (get-buffer-process gud-comint-buffer))
               (posn-point (event-end event))
-              (or (and (eq gud-minor-mode 'gdba) (not gdb-active-process))
+              (or (and (eq gud-minor-mode 'gdbmi) (not gdb-active-process))
                   (progn (setq gud-tooltip-event event)
                          (eval (cons 'and gud-tooltip-display)))))
       (let ((expr (tooltip-expr-to-print event)))
        (when expr
-         (if (and (eq gud-minor-mode 'gdba)
+         (if (and (eq gud-minor-mode 'gdbmi)
                   (not gdb-active-process))
              (progn
                (with-current-buffer (tooltip-event-buffer event)
@@ -3492,13 +3460,13 @@ This function must return nil if it doesn't handle EVENT."
                (message-box "Using GUD tooltips in this mode is unsafe\n\
 so they have been disabled."))
              (unless (null cmd) ; CMD can be nil if unknown debugger
-               (if (memq gud-minor-mode '(gdba gdbmi))
+               (if (eq gud-minor-mode 'gdbmi)
                      (if gdb-macro-info
-                         (gdb-enqueue-input
+                         (gdb-input
                           (list (concat
-                                 gdb-server-prefix "macro expand " expr "\n")
+                                 "server macro expand " expr "\n")
                                 `(lambda () (gdb-tooltip-print-1 ,expr))))
-                       (gdb-enqueue-input
+                       (gdb-input
                         (list  (concat cmd "\n")
                                 `(lambda () (gdb-tooltip-print ,expr)))))
                  (setq gud-tooltip-original-filter (process-filter process))
index 594462d5125571021ab05463e8fcad5fe8d29671..7a1aa3e70f4cf4291f78d2bd5da65b2916615cb1 100644 (file)
@@ -281,8 +281,7 @@ not be enclosed in { } or ( )."
   "Regex used to highlight makepp rule action lines in font lock mode.")
 
 (defconst makefile-bsdmake-rule-action-regex
-  (progn (string-match "-@" makefile-rule-action-regex)
-        (replace-match "-+@" t t makefile-rule-action-regex))
+  (replace-regexp-in-string "-@" "-+@" makefile-rule-action-regex)
   "Regex used to highlight BSD rule action lines in font lock mode.")
 
 ;; Note that the first and second subexpression is used by font lock.  Note
@@ -521,25 +520,25 @@ not be enclosed in { } or ( )."
     ("Macro Assignment" ,makefile-macroassign-regex 1))
   "Imenu generic expression for Makefile mode.  See `imenu-generic-expression'.")
 
-;;; ------------------------------------------------------------
-;;; The following configurable variables are used in the
-;;; up-to-date overview .
-;;; The standard configuration assumes that your `make' program
-;;; can be run in question/query mode using the `-q' option, this
-;;; means that the command
-;;;
-;;;    make -q foo
-;;;
-;;; should return an exit status of zero if the target `foo' is
-;;; up to date and a nonzero exit status otherwise.
-;;; Many makes can do this although the docs/manpages do not mention
-;;; it. Try it with your favourite one.  GNU make, System V make, and
-;;; Dennis Vadura's DMake have no problems.
-;;; Set the variable `makefile-brave-make' to the name of the
-;;; make utility that does this on your system.
-;;; To understand what this is all about see the function definition
-;;; of `makefile-query-by-make-minus-q' .
-;;; ------------------------------------------------------------
+;; ------------------------------------------------------------
+;; The following configurable variables are used in the
+;; up-to-date overview .
+;; The standard configuration assumes that your `make' program
+;; can be run in question/query mode using the `-q' option, this
+;; means that the command
+;;
+;;    make -q foo
+;;
+;; should return an exit status of zero if the target `foo' is
+;; up to date and a nonzero exit status otherwise.
+;; Many makes can do this although the docs/manpages do not mention
+;; it. Try it with your favourite one.  GNU make, System V make, and
+;; Dennis Vadura's DMake have no problems.
+;; Set the variable `makefile-brave-make' to the name of the
+;; make utility that does this on your system.
+;; To understand what this is all about see the function definition
+;; of `makefile-query-by-make-minus-q' .
+;; ------------------------------------------------------------
 
 (defcustom makefile-brave-make "make"
   "*How to invoke make, for `makefile-query-targets'.
@@ -574,11 +573,8 @@ The function must satisfy this calling convention:
 
 ;;; --- end of up-to-date-overview configuration ------------------
 
-(defvar makefile-mode-abbrev-table nil
+(define-abbrev-table 'makefile-mode-abbrev-table ()
   "Abbrev table in use in Makefile buffers.")
-(if makefile-mode-abbrev-table
-    ()
-  (define-abbrev-table 'makefile-mode-abbrev-table ()))
 
 (defvar makefile-mode-map
   (let ((map (make-sparse-keymap))
@@ -706,15 +702,13 @@ The function must satisfy this calling convention:
     (modify-syntax-entry ?\n ">     " st)
     st))
 
-(defvar makefile-imake-mode-syntax-table (copy-syntax-table
-                                         makefile-mode-syntax-table))
-(if makefile-imake-mode-syntax-table
-    ()
-  (modify-syntax-entry ?/  ". 14" makefile-imake-mode-syntax-table)
-  (modify-syntax-entry ?*  ". 23" makefile-imake-mode-syntax-table)
-  (modify-syntax-entry ?#  "'" makefile-imake-mode-syntax-table)
-  (modify-syntax-entry ?\n ". b" makefile-imake-mode-syntax-table))
-
+(defvar makefile-imake-mode-syntax-table
+  (let ((st (make-syntax-table makefile-mode-syntax-table)))
+    (modify-syntax-entry ?/  ". 14" st)
+    (modify-syntax-entry ?*  ". 23" st)
+    (modify-syntax-entry ?#  "'"    st)
+    (modify-syntax-entry ?\n ". b"  st)
+    st))
 
 ;;; ------------------------------------------------------------
 ;;; Internal variables.
@@ -774,7 +768,7 @@ The function must satisfy this calling convention:
 ;;; ------------------------------------------------------------
 
 ;;;###autoload
-(defun makefile-mode ()
+(define-derived-mode makefile-mode nil "Makefile"
   "Major mode for editing standard Makefiles.
 
 If you are editing a file for a different make, try one of the
@@ -858,9 +852,6 @@ Makefile mode can be configured by modifying the following variables:
    List of special targets. You will be offered to complete
    on one of those in the minibuffer whenever you enter a `.'.
    at the beginning of a line in Makefile mode."
-
-  (interactive)
-  (kill-all-local-variables)
   (add-hook 'write-file-functions
            'makefile-warn-suspicious-lines nil t)
   (add-hook 'write-file-functions
@@ -874,59 +865,44 @@ Makefile mode can be configured by modifying the following variables:
   (make-local-variable 'makefile-need-macro-pickup)
 
   ;; Font lock.
-  (make-local-variable 'font-lock-defaults)
-  (setq font-lock-defaults
-       ;; SYNTAX-BEGIN set to backward-paragraph to avoid slow-down
-       ;; near the end of a large buffer, due to parse-partial-sexp's
-       ;; trying to parse all the way till the beginning of buffer.
-       '(makefile-font-lock-keywords
-         nil nil
-         ((?$ . "."))
-         backward-paragraph
-         (font-lock-syntactic-keywords
-          . makefile-font-lock-syntactic-keywords)))
+  (set (make-local-variable 'font-lock-defaults)
+       ;; SYNTAX-BEGIN set to backward-paragraph to avoid slow-down
+       ;; near the end of a large buffer, due to parse-partial-sexp's
+       ;; trying to parse all the way till the beginning of buffer.
+       '(makefile-font-lock-keywords
+         nil nil
+         ((?$ . "."))
+         backward-paragraph
+         (font-lock-syntactic-keywords
+          . makefile-font-lock-syntactic-keywords)))
 
   ;; Add-log.
-  (make-local-variable 'add-log-current-defun-function)
-  (setq add-log-current-defun-function 'makefile-add-log-defun)
+  (set (make-local-variable 'add-log-current-defun-function)
+       'makefile-add-log-defun)
 
   ;; Imenu.
-  (make-local-variable 'imenu-generic-expression)
-  (setq imenu-generic-expression makefile-imenu-generic-expression)
+  (set (make-local-variable 'imenu-generic-expression)
+       makefile-imenu-generic-expression)
 
   ;; Dabbrev.
-  (make-local-variable 'dabbrev-abbrev-skip-leading-regexp)
-  (setq dabbrev-abbrev-skip-leading-regexp "\\$")
+  (set (make-local-variable 'dabbrev-abbrev-skip-leading-regexp) "\\$")
 
   ;; Other abbrevs.
   (setq local-abbrev-table makefile-mode-abbrev-table)
 
   ;; Filling.
-  (make-local-variable 'fill-paragraph-function)
-  (setq fill-paragraph-function 'makefile-fill-paragraph)
+  (set (make-local-variable 'fill-paragraph-function) 'makefile-fill-paragraph)
 
   ;; Comment stuff.
-  (make-local-variable 'comment-start)
-  (setq comment-start "#")
-  (make-local-variable 'comment-end)
-  (setq comment-end "")
-  (make-local-variable 'comment-start-skip)
-  (setq comment-start-skip "#+[ \t]*")
+  (set (make-local-variable 'comment-start) "#")
+  (set (make-local-variable 'comment-end) "")
+  (set (make-local-variable 'comment-start-skip) "#+[ \t]*")
 
   ;; Make sure TAB really inserts \t.
   (set (make-local-variable 'indent-line-function) 'indent-to-left-margin)
 
-  ;; become the current major mode
-  (setq major-mode 'makefile-mode)
-  (setq mode-name "Makefile")
-
-  ;; Activate keymap and syntax table.
-  (use-local-map makefile-mode-map)
-  (set-syntax-table makefile-mode-syntax-table)
-
   ;; Real TABs are important in makefiles
-  (setq indent-tabs-mode t)
-  (run-mode-hooks 'makefile-mode-hook))
+  (setq indent-tabs-mode t))
 
 ;; These should do more than just differentiate font-lock.
 ;;;###autoload
index 5b1fc71247792576e321316bdee6c04725197592..ecb8461a9f28869b97e5452e5c757f9ee75d5498 100644 (file)
@@ -7,7 +7,7 @@
 ;; Maintainer: Pieter E.J. Pareit <pieter.pareit@gmail.com>
 ;; Created: 09 Nov 2002
 ;; Version: 0.1
-;; Keywords: languages Knuth mix mixal asm mixvm "The Art Of Computer Programming"
+;; Keywords: languages, Knuth, mix, mixal, asm, mixvm, The Art Of Computer Programming
 
 ;; This file is part of GNU Emacs.
 
index 0efac03f7d50089a54306b0bd536f8579586456b..7c7397a52bc2df061c0e23d08073e090b75ed3de 100644 (file)
@@ -1497,7 +1497,7 @@ Please send all bug fixes and enhancements to
   "Support for printing and PostScript."
   :tag "PostScript"
   :version "20"
-  :group 'emacs)
+  :group 'external)
 
 (defgroup ps-print nil
   "PostScript generator for Emacs."
index 57b294426051ce857c367fafa93d96f18977493b..487974073aa7768817584e803b0da5b3b976fdef 100644 (file)
   :type 'boolean
   :group 'matching)
 
-(defvar query-replace-history nil)
+(defvar query-replace-history nil
+  "Default history list for query-replace commands.
+See `query-replace-from-history-variable' and
+`query-replace-to-history-variable'.")
 
 (defvar query-replace-defaults nil
   "Default values of FROM-STRING and TO-STRING for `query-replace'.
@@ -394,12 +397,13 @@ Fourth and fifth arg START and END specify the region to operate on."
                    (car regexp-search-ring)
                  (read-from-minibuffer "Map query replace (regexp): "
                                        nil nil nil
-                                       'query-replace-history nil t)))
+                                       query-replace-from-history-variable
+                                       nil t)))
          (to (read-from-minibuffer
               (format "Query replace %s with (space-separated strings): "
                       (query-replace-descr from))
               nil nil nil
-              'query-replace-history from t)))
+              query-replace-to-history-variable from t)))
      (list from to
           (and current-prefix-arg
                (prefix-numeric-value current-prefix-arg))
@@ -1001,32 +1005,6 @@ which means to discard all text properties."
   :group 'matching
   :version "22.1")
 
-(defun occur-accumulate-lines (count &optional keep-props)
-  (save-excursion
-    (let ((forwardp (> count 0))
-         result beg end)
-      (while (not (or (zerop count)
-                     (if forwardp
-                         (eobp)
-                       (bobp))))
-       (setq count (+ count (if forwardp -1 1)))
-       (setq beg (line-beginning-position)
-             end (line-end-position))
-       (if (and keep-props (if (boundp 'jit-lock-mode) jit-lock-mode)
-                (text-property-not-all beg end 'fontified t))
-           (if (fboundp 'jit-lock-fontify-now)
-               (jit-lock-fontify-now beg end)))
-       (push
-        (if (and keep-props (not (eq occur-excluded-properties t)))
-            (let ((str (buffer-substring beg end)))
-              (remove-list-of-text-properties
-               0 (length str) occur-excluded-properties str)
-              str)
-          (buffer-substring-no-properties beg end))
-        result)
-       (forward-line (if forwardp 1 -1)))
-      (nreverse result))))
-
 (defun occur-read-primary-args ()
   (list (read-regexp "List lines matching regexp"
                     (car regexp-history))
@@ -1035,7 +1013,7 @@ which means to discard all text properties."
 
 (defun occur-rename-buffer (&optional unique-p interactive-p)
   "Rename the current *Occur* buffer to *Occur: original-buffer-name*.
-Here `original-buffer-name' is the buffer name were Occur was originally run.
+Here `original-buffer-name' is the buffer name where Occur was originally run.
 When given the prefix argument, or called non-interactively, the renaming
 will not clobber the existing buffer(s) of that name, but use
 `generate-new-buffer-name' instead.  You can add this to `occur-hook'
@@ -1052,7 +1030,7 @@ invoke `occur'."
 
 (defun occur (regexp &optional nlines)
   "Show all lines in the current buffer containing a match for REGEXP.
-This function can not handle matches that span more than one line.
+If a match spreads across multiple lines, all those lines are shown.
 
 Each line is displayed with NLINES lines before and after, or -NLINES
 before if NLINES is negative.
@@ -1162,12 +1140,15 @@ See also `multi-occur'."
                      (not (eq occur-excluded-properties t)))))
          (let* ((bufcount (length active-bufs))
                 (diff (- (length bufs) bufcount)))
-           (message "Searched %d buffer%s%s; %s match%s for `%s'"
+           (message "Searched %d buffer%s%s; %s match%s%s"
                     bufcount (if (= bufcount 1) "" "s")
                     (if (zerop diff) "" (format " (%d killed)" diff))
                     (if (zerop count) "no" (format "%d" count))
                     (if (= count 1) "" "es")
-                    regexp))
+                    ;; Don't display regexp if with remaining text
+                    ;; it is longer than window-width.
+                    (if (> (+ (length regexp) 42) (window-width))
+                        "" (format " for `%s'" (query-replace-descr regexp)))))
          (setq occur-revert-arguments (list regexp nlines bufs))
           (if (= count 0)
               (kill-buffer occur-buf)
@@ -1177,12 +1158,6 @@ See also `multi-occur'."
             (set-buffer-modified-p nil)
             (run-hooks 'occur-hook)))))))
 
-(defun occur-engine-add-prefix (lines)
-  (mapcar
-   #'(lambda (line)
-       (concat "       :" line "\n"))
-   lines))
-
 (defun occur-engine (regexp buffers out-buf nlines case-fold-search
                            title-face prefix-face match-face keep-props)
   (with-current-buffer out-buf
@@ -1193,12 +1168,15 @@ See also `multi-occur'."
        (when (buffer-live-p buf)
          (let ((matches 0)     ;; count of matched lines
                (lines 1)       ;; line count
+               (prev-after-lines nil)  ;; context lines of prev match
+               (prev-lines nil)        ;; line number of prev match endpt
                (matchbeg 0)
                (origpt nil)
                (begpt nil)
                (endpt nil)
                (marker nil)
                (curstring "")
+               (ret nil)
                (inhibit-field-text-motion t)
                (headerpt (with-current-buffer out-buf (point))))
            (with-current-buffer buf
@@ -1214,24 +1192,17 @@ See also `multi-occur'."
                  (when (setq endpt (re-search-forward regexp nil t))
                    (setq matches (1+ matches)) ;; increment match count
                    (setq matchbeg (match-beginning 0))
-                   (setq lines (+ lines (1- (count-lines origpt endpt))))
+                   ;; Get beginning of first match line and end of the last.
                    (save-excursion
                      (goto-char matchbeg)
-                     (setq begpt (line-beginning-position)
-                           endpt (line-end-position)))
+                     (setq begpt (line-beginning-position))
+                     (goto-char endpt)
+                     (setq endpt (line-end-position)))
+                   ;; Sum line numbers up to the first match line.
+                   (setq lines (+ lines (count-lines origpt begpt)))
                    (setq marker (make-marker))
                    (set-marker marker matchbeg)
-                   (if (and keep-props
-                            (if (boundp 'jit-lock-mode) jit-lock-mode)
-                            (text-property-not-all begpt endpt 'fontified t))
-                       (if (fboundp 'jit-lock-fontify-now)
-                           (jit-lock-fontify-now begpt endpt)))
-                   (if (and keep-props (not (eq occur-excluded-properties t)))
-                       (progn
-                         (setq curstring (buffer-substring begpt endpt))
-                         (remove-list-of-text-properties
-                          0 (length curstring) occur-excluded-properties curstring))
-                     (setq curstring (buffer-substring-no-properties begpt endpt)))
+                   (setq curstring (occur-engine-line begpt endpt keep-props))
                    ;; Highlight the matches
                    (let ((len (length curstring))
                          (start 0))
@@ -1248,24 +1219,33 @@ See also `multi-occur'."
                         curstring)
                        (setq start (match-end 0))))
                    ;; Generate the string to insert for this match
-                   (let* ((out-line
+                   (let* ((match-prefix
+                           ;; Using 7 digits aligns tabs properly.
+                           (apply #'propertize (format "%7d:" lines)
+                                  (append
+                                   (when prefix-face
+                                     `(font-lock-face prefix-face))
+                                   `(occur-prefix t mouse-face (highlight)
+                                                  occur-target ,marker follow-link t
+                                                  help-echo "mouse-2: go to this occurrence"))))
+                          (match-str
+                           ;; We don't put `mouse-face' on the newline,
+                           ;; because that loses.  And don't put it
+                           ;; on context lines to reduce flicker.
+                           (propertize curstring 'mouse-face (list 'highlight)
+                                       'occur-target marker
+                                       'follow-link t
+                                       'help-echo
+                                       "mouse-2: go to this occurrence"))
+                          (out-line
                            (concat
-                            ;; Using 7 digits aligns tabs properly.
-                            (apply #'propertize (format "%7d:" lines)
-                                   (append
-                                    (when prefix-face
-                                      `(font-lock-face prefix-face))
-                                    `(occur-prefix t mouse-face (highlight)
-                                      occur-target ,marker follow-link t
-                                      help-echo "mouse-2: go to this occurrence")))
-                            ;; We don't put `mouse-face' on the newline,
-                            ;; because that loses.  And don't put it
-                            ;; on context lines to reduce flicker.
-                            (propertize curstring 'mouse-face (list 'highlight)
-                                        'occur-target marker
-                                        'follow-link t
-                                        'help-echo
-                                        "mouse-2: go to this occurrence")
+                            match-prefix
+                            ;; Add non-numeric prefix to all non-first lines
+                            ;; of multi-line matches.
+                            (replace-regexp-in-string
+                             "\n"
+                             "\n       :"
+                             match-str)
                             ;; Add marker at eol, but no mouse props.
                             (propertize "\n" 'occur-target marker)))
                           (data
@@ -1273,30 +1253,47 @@ See also `multi-occur'."
                                ;; The simple display style
                                out-line
                              ;; The complex multi-line display style.
-                             (occur-context-lines out-line nlines keep-props)
-                             )))
+                             (setq ret (occur-context-lines
+                                        out-line nlines keep-props begpt endpt
+                                        lines prev-lines prev-after-lines))
+                             ;; Set first elem of the returned list to `data',
+                             ;; and the second elem to `prev-after-lines'.
+                             (setq prev-after-lines (nth 1 ret))
+                             (nth 0 ret))))
                      ;; Actually insert the match display data
                      (with-current-buffer out-buf
                        (let ((beg (point))
-                             (end (progn (insert data) (point))))
-                         (unless (= nlines 0)
-                           (insert "-------\n")))))
+                             (end (progn (insert data) (point)))))))
                    (goto-char endpt))
                  (if endpt
                      (progn
-                       (setq lines (1+ lines))
+                       ;; Sum line numbers between first and last match lines.
+                       (setq lines (+ lines (count-lines begpt endpt)
+                                      ;; Add 1 for empty last match line since
+                                      ;; count-lines returns 1 line less.
+                                      (if (and (bolp) (eolp)) 1 0)))
                        ;; On to the next match...
                        (forward-line 1))
-                   (goto-char (point-max))))))
+                   (goto-char (point-max)))
+                 (setq prev-lines (1- lines)))
+               ;; Flush remaining context after-lines.
+               (when prev-after-lines
+                 (with-current-buffer out-buf
+                   (insert (apply #'concat (occur-engine-add-prefix
+                                            prev-after-lines)))))))
            (when (not (zerop matches)) ;; is the count zero?
              (setq globalcount (+ globalcount matches))
              (with-current-buffer out-buf
                (goto-char headerpt)
                (let ((beg (point))
                      end)
-                 (insert (format "%d match%s for \"%s\" in buffer: %s\n"
+                 (insert (format "%d match%s%s in buffer: %s\n"
                                  matches (if (= matches 1) "" "es")
-                                 regexp (buffer-name buf)))
+                                 ;; Don't display regexp for multi-buffer.
+                                 (if (> (length buffers) 1)
+                                     "" (format " for \"%s\""
+                                                (query-replace-descr regexp)))
+                                 (buffer-name buf)))
                  (setq end (point))
                  (add-text-properties beg end
                                       (append
@@ -1304,6 +1301,18 @@ See also `multi-occur'."
                                          `(font-lock-face ,title-face))
                                        `(occur-title ,buf))))
                (goto-char (point-min)))))))
+      ;; Display total match count and regexp for multi-buffer.
+      (when (and (not (zerop globalcount)) (> (length buffers) 1))
+       (goto-char (point-min))
+       (let ((beg (point))
+             end)
+         (insert (format "%d match%s total for \"%s\":\n"
+                         globalcount (if (= globalcount 1) "" "es")
+                         (query-replace-descr regexp)))
+         (setq end (point))
+         (add-text-properties beg end (when title-face
+                                        `(font-lock-face ,title-face))))
+       (goto-char (point-min)))
       (if coding
          ;; CODING is buffer-file-coding-system of the first buffer
          ;; that locally binds it.  Let's use it also for the output
@@ -1312,21 +1321,98 @@ See also `multi-occur'."
       ;; Return the number of matches
       globalcount)))
 
+(defun occur-engine-line (beg end &optional keep-props)
+  (if (and keep-props (if (boundp 'jit-lock-mode) jit-lock-mode)
+          (text-property-not-all beg end 'fontified t))
+      (if (fboundp 'jit-lock-fontify-now)
+         (jit-lock-fontify-now beg end)))
+  (if (and keep-props (not (eq occur-excluded-properties t)))
+      (let ((str (buffer-substring beg end)))
+       (remove-list-of-text-properties
+        0 (length str) occur-excluded-properties str)
+       str)
+    (buffer-substring-no-properties beg end)))
+
+(defun occur-engine-add-prefix (lines)
+  (mapcar
+   #'(lambda (line)
+       (concat "       :" line "\n"))
+   lines))
+
+(defun occur-accumulate-lines (count &optional keep-props pt)
+  (save-excursion
+    (when pt
+      (goto-char pt))
+    (let ((forwardp (> count 0))
+         result beg end moved)
+      (while (not (or (zerop count)
+                     (if forwardp
+                         (eobp)
+                       (and (bobp) (not moved)))))
+       (setq count (+ count (if forwardp -1 1)))
+       (setq beg (line-beginning-position)
+             end (line-end-position))
+       (push (occur-engine-line beg end keep-props) result)
+       (setq moved (= 0 (forward-line (if forwardp 1 -1)))))
+      (nreverse result))))
+
 ;; Generate context display for occur.
 ;; OUT-LINE is the line where the match is.
 ;; NLINES and KEEP-PROPS are args to occur-engine.
+;; LINES is line count of the current match,
+;; PREV-LINES is line count of the previous match,
+;; PREV-AFTER-LINES is a list of after-context lines of the previous match.
 ;; Generate a list of lines, add prefixes to all but OUT-LINE,
 ;; then concatenate them all together.
-(defun occur-context-lines (out-line nlines keep-props)
-  (apply #'concat
-        (nconc
-         (occur-engine-add-prefix
-          (nreverse (cdr (occur-accumulate-lines
-                          (- (1+ (abs nlines))) keep-props))))
-         (list out-line)
-         (if (> nlines 0)
-             (occur-engine-add-prefix
-              (cdr (occur-accumulate-lines (1+ nlines) keep-props)))))))
+(defun occur-context-lines (out-line nlines keep-props begpt endpt
+                                    lines prev-lines prev-after-lines)
+  ;; Find after- and before-context lines of the current match.
+  (let ((before-lines
+        (nreverse (cdr (occur-accumulate-lines
+                        (- (1+ (abs nlines))) keep-props begpt))))
+       (after-lines
+        (cdr (occur-accumulate-lines
+              (1+ nlines) keep-props endpt)))
+       separator)
+
+    ;; Combine after-lines of the previous match
+    ;; with before-lines of the current match.
+
+    (when prev-after-lines
+      ;; Don't overlap prev after-lines with current before-lines.
+      (if (>= (+ prev-lines (length prev-after-lines))
+             (- lines      (length before-lines)))
+         (setq prev-after-lines
+               (butlast prev-after-lines
+                        (- (length prev-after-lines)
+                           (- lines prev-lines (length before-lines) 1))))
+       ;; Separate non-overlapping context lines with a dashed line.
+       (setq separator "-------\n")))
+
+    (when prev-lines
+      ;; Don't overlap current before-lines with previous match line.
+      (if (<= (- lines (length before-lines))
+             prev-lines)
+         (setq before-lines
+               (nthcdr (- (length before-lines)
+                          (- lines prev-lines 1))
+                       before-lines))
+       ;; Separate non-overlapping before-context lines.
+       (unless (> nlines 0)
+         (setq separator "-------\n"))))
+
+    (list
+     ;; Return a list where the first element is the output line.
+     (apply #'concat
+           (append
+            (and prev-after-lines
+                 (occur-engine-add-prefix prev-after-lines))
+            (and separator (list separator))
+            (occur-engine-add-prefix before-lines)
+            (list out-line)))
+     ;; And the second element is the list of context after-lines.
+     (if (> nlines 0) after-lines))))
+
 \f
 ;; It would be nice to use \\[...], but there is no reasonable way
 ;; to make that display both SPC and Y.
index 9838ade89f1c39665e90a66e7f3233b313d94d16..ff5c8807de59e53e7f48006bf224fcb0e401c9db 100644 (file)
@@ -49,7 +49,7 @@
 
 (defgroup reveal nil
   "Reveal hidden text on the fly."
-  :group 'editing)
+  :group 'convenience)
 
 (defcustom reveal-around-mark t
   "Reveal text around the mark, if active."
index 71aa76aadfc90f962d7162e8a9b2716d539dc99c..6118c49530c4119cfddf4f8186d2890834c1f1d7 100644 (file)
@@ -3421,51 +3421,59 @@ The properties used on SYMBOL are `composefunc', `sendfunc',
 ;; digits of precision, it doesn't really matter here.  On the other
 ;; hand, it greatly simplifies the code.
 
-(defsubst progress-reporter-update (reporter value)
+(defsubst progress-reporter-update (reporter &optional value)
   "Report progress of an operation in the echo area.
-However, if the change since last echo area update is too small
-or not enough time has passed, then do nothing (see
-`make-progress-reporter' for details).
-
-First parameter, REPORTER, should be the result of a call to
-`make-progress-reporter'.  Second, VALUE, determines the actual
-progress of operation; it must be between MIN-VALUE and MAX-VALUE
-as passed to `make-progress-reporter'.
-
-This function is very inexpensive, you may not bother how often
-you call it."
-  (when (>= value (car reporter))
-    (progress-reporter-do-update reporter value)))
+REPORTER should be the result of a call to `make-progress-reporter'.
+
+If REPORTER is a numerical progress reporter---i.e. if it was
+ made using non-nil MIN-VALUE and MAX-VALUE arguments to
+ `make-progress-reporter'---then VALUE should be a number between
+ MIN-VALUE and MAX-VALUE.
 
-(defun make-progress-reporter (message min-value max-value
-                                      &optional current-value
-                                      min-change min-time)
-  "Return progress reporter object to be used with `progress-reporter-update'.
-
-MESSAGE is shown in the echo area.  When at least 1% of operation
-is complete, the exact percentage will be appended to the
-MESSAGE.  When you call `progress-reporter-done', word \"done\"
-is printed after the MESSAGE.  You can change MESSAGE of an
-existing progress reporter with `progress-reporter-force-update'.
-
-MIN-VALUE and MAX-VALUE designate starting (0% complete) and
-final (100% complete) states of operation.  The latter should be
-larger; if this is not the case, then simply negate all values.
-Optional CURRENT-VALUE specifies the progress by the moment you
-call this function.  You should omit it or set it to nil in most
-cases since it defaults to MIN-VALUE.
-
-Optional MIN-CHANGE determines the minimal change in percents to
-report (default is 1%.)  Optional MIN-TIME specifies the minimal
-time before echo area updates (default is 0.2 seconds.)  If
-`float-time' function is not present, then time is not tracked
-at all.  If OS is not capable of measuring fractions of seconds,
-then this parameter is effectively rounded up."
+If REPORTER is a non-numerical reporter, VALUE should be nil.
 
+This function is relatively inexpensive.  If the change since
+last update is too small or insufficient time has passed, it does
+nothing."
+  (when (or (not (numberp value))      ; For pulsing reporter
+           (>= value (car reporter))) ; For numerical reporter
+    (progress-reporter-do-update reporter value)))
+
+(defun make-progress-reporter (message &optional min-value max-value
+                                      current-value min-change min-time)
+  "Return progress reporter object for use with `progress-reporter-update'.
+
+MESSAGE is shown in the echo area, with a status indicator
+appended to the end.  When you call `progress-reporter-done', the
+word \"done\" is printed after the MESSAGE.  You can change the
+MESSAGE of an existing progress reporter by calling
+`progress-reporter-force-update'.
+
+MIN-VALUE and MAX-VALUE, if non-nil, are starting (0% complete)
+and final (100% complete) states of operation; the latter should
+be larger.  In this case, the status message shows the percentage
+progress.
+
+If MIN-VALUE and/or MAX-VALUE is omitted or nil, the status
+message shows a \"spinning\", non-numeric indicator.
+
+Optional CURRENT-VALUE is the initial progress; the default is
+MIN-VALUE.
+Optional MIN-CHANGE is the minimal change in percents to report;
+the default is 1%.
+CURRENT-VALUE and MIN-CHANGE do not have any effect if MIN-VALUE
+and/or MAX-VALUE are nil.
+
+Optional MIN-TIME specifies the minimum interval time between
+echo area updates (default is 0.2 seconds.)  If the function
+`float-time' is not present, time is not tracked at all.  If the
+OS is not capable of measuring fractions of seconds, this
+parameter is effectively rounded up."
   (unless min-time
     (setq min-time 0.2))
   (let ((reporter
-        (cons min-value ;; Force a call to `message' now
+        ;; Force a call to `message' now
+        (cons (or min-value 0)
               (vector (if (and (fboundp 'float-time)
                                (>= min-time 0.02))
                           (float-time) nil)
@@ -3477,12 +3485,11 @@ then this parameter is effectively rounded up."
     (progress-reporter-update reporter (or current-value min-value))
     reporter))
 
-(defun progress-reporter-force-update (reporter value &optional new-message)
+(defun progress-reporter-force-update (reporter &optional value new-message)
   "Report progress of an operation in the echo area unconditionally.
 
-First two parameters are the same as for
-`progress-reporter-update'.  Optional NEW-MESSAGE allows you to
-change the displayed message."
+The first two arguments are the same as in `progress-reporter-update'.
+NEW-MESSAGE, if non-nil, sets a new message for the reporter."
   (let ((parameters (cdr reporter)))
     (when new-message
       (aset parameters 3 new-message))
@@ -3490,15 +3497,15 @@ change the displayed message."
       (aset parameters 0 (float-time)))
     (progress-reporter-do-update reporter value)))
 
+(defvar progress-reporter--pulse-characters ["-" "\\" "|" "/"]
+  "Characters to use for pulsing progress reporters.")
+
 (defun progress-reporter-do-update (reporter value)
   (let* ((parameters   (cdr reporter))
+        (update-time  (aref parameters 0))
         (min-value    (aref parameters 1))
         (max-value    (aref parameters 2))
-        (one-percent  (/ (- max-value min-value) 100.0))
-        (percentage   (if (= max-value min-value)
-                          0
-                        (truncate (/ (- value min-value) one-percent))))
-        (update-time  (aref parameters 0))
+        (text         (aref parameters 3))
         (current-time (float-time))
         (enough-time-passed
          ;; See if enough time has passed since the last update.
@@ -3506,26 +3513,41 @@ change the displayed message."
              (when (>= current-time update-time)
                ;; Calculate time for the next update
                (aset parameters 0 (+ update-time (aref parameters 5)))))))
-    ;;
-    ;; Calculate NEXT-UPDATE-VALUE.  If we are not going to print
-    ;; message this time because not enough time has passed, then use
-    ;; 1 instead of MIN-CHANGE.  This makes delays between echo area
-    ;; updates closer to MIN-TIME.
-    (setcar reporter
-           (min (+ min-value (* (+ percentage
-                                   (if enough-time-passed
-                                       (aref parameters 4) ;; MIN-CHANGE
-                                     1))
-                                one-percent))
-                max-value))
-    (when (integerp value)
-      (setcar reporter (ceiling (car reporter))))
-    ;;
-    ;; Only print message if enough time has passed
-    (when enough-time-passed
-      (if (> percentage 0)
-         (message "%s%d%%" (aref parameters 3) percentage)
-       (message "%s" (aref parameters 3))))))
+    (cond ((and min-value max-value)
+          ;; Numerical indicator
+          (let* ((one-percent (/ (- max-value min-value) 100.0))
+                 (percentage  (if (= max-value min-value)
+                                  0
+                                (truncate (/ (- value min-value)
+                                             one-percent)))))
+            ;; Calculate NEXT-UPDATE-VALUE.  If we are not printing
+            ;; message because not enough time has passed, use 1
+            ;; instead of MIN-CHANGE.  This makes delays between echo
+            ;; area updates closer to MIN-TIME.
+            (setcar reporter
+                    (min (+ min-value (* (+ percentage
+                                            (if enough-time-passed
+                                                ;; MIN-CHANGE
+                                                (aref parameters 4)
+                                              1))
+                                         one-percent))
+                         max-value))
+            (when (integerp value)
+              (setcar reporter (ceiling (car reporter))))
+            ;; Only print message if enough time has passed
+            (when enough-time-passed
+              (if (> percentage 0)
+                  (message "%s%d%%" text percentage)
+                (message "%s" text)))))
+         ;; Pulsing indicator
+         (enough-time-passed
+          (let ((index (mod (1+ (car reporter)) 4))
+                (message-log-max nil))
+            (setcar reporter index)
+            (message "%s %s"
+                     text
+                     (aref progress-reporter--pulse-characters
+                           index)))))))
 
 (defun progress-reporter-done (reporter)
   "Print reporter's message followed by word \"done\" in echo area."
index 2673ee15457f833d662436d5e00439b7612083ab..e4ed2c8a05154b0f9672d991cc52a3a063fb5d6f 100644 (file)
@@ -34,7 +34,7 @@
 (defgroup picture nil
   "Picture mode --- editing using quarter-plane screen model."
   :prefix "picture-"
-  :group 'editing)
+  :group 'wp)
 
 (defcustom picture-rectangle-ctl ?+
   "*Character `picture-draw-rectangle' uses for top left corners."
index 3f21fbe7a2c3be2a52702f35673ee14d4bb4bd47..b9a5098b05c4cd63f5a4160fc90ca25b95e5d413 100644 (file)
@@ -2585,62 +2585,132 @@ With prefix argument set the empty lines too."
   :group 'faces
   :version "21.1")
 
-(defcustom rst-block-face 'font-lock-keyword-face
+(defface rst-block '((t :inherit font-lock-keyword-face))
+  "Face used for all syntax marking up a special block."
+  :version "24.1"
+  :group 'rst-faces)
+
+(defcustom rst-block-face 'rst-block
   "All syntax marking up a special block."
+  :version "24.1"
   :group 'rst-faces
   :type '(face))
+(make-obsolete-variable 'rst-block-face
+                        "customize the face `rst-block' instead."
+                        "24.1")
+
+(defface rst-external '((t :inherit font-lock-type-face))
+  "Face used for field names and interpreted text."
+  :version "24.1"
+  :group 'rst-faces)
 
-(defcustom rst-external-face 'font-lock-type-face
+(defcustom rst-external-face 'rst-external
   "Field names and interpreted text."
+  :version "24.1"
   :group 'rst-faces
   :type '(face))
+(make-obsolete-variable 'rst-external-face
+                        "customize the face `rst-external' instead."
+                        "24.1")
 
-(defcustom rst-definition-face 'font-lock-function-name-face
+(defface rst-definition '((t :inherit font-lock-function-name-face))
+  "Face used for all other defining constructs."
+  :version "24.1"
+  :group 'rst-faces)
+
+(defcustom rst-definition-face 'rst-definition
   "All other defining constructs."
+  :version "24.1"
   :group 'rst-faces
   :type '(face))
-
-(defcustom rst-directive-face
-  ;; XEmacs compatibility
-  (if (boundp 'font-lock-builtin-face)
-      'font-lock-builtin-face
-    'font-lock-preprocessor-face)
+(make-obsolete-variable 'rst-definition-face
+                        "customize the face `rst-definition' instead."
+                        "24.1")
+
+;; XEmacs compatibility (?).
+(defface rst-directive (if (boundp 'font-lock-builtin-face)
+                           '((t :inherit font-lock-builtin-face))
+                         '((t :inherit font-lock-preprocessor-face)))
+  "Face used for directives and roles."
+  :version "24.1"
+  :group 'rst-faces)
+
+(defcustom rst-directive-face 'rst-directive
   "Directives and roles."
   :group 'rst-faces
   :type '(face))
+(make-obsolete-variable 'rst-directive-face
+                        "customize the face `rst-directive' instead."
+                        "24.1")
 
-(defcustom rst-comment-face 'font-lock-comment-face
+(defface rst-comment '((t :inherit font-lock-comment-face))
+  "Face used for comments."
+  :version "24.1"
+  :group 'rst-faces)
+
+(defcustom rst-comment-face 'rst-comment
   "Comments."
+  :version "24.1"
   :group 'rst-faces
   :type '(face))
+(make-obsolete-variable 'rst-comment-face
+                        "customize the face `rst-comment' instead."
+                        "24.1")
+
+(defface rst-emphasis1 '((t :inherit italic))
+  "Face used for simple emphasis."
+  :version "24.1"
+  :group 'rst-faces)
 
-(defcustom rst-emphasis1-face
-  ;; XEmacs compatibility
-  (if (facep 'italic)
-      ''italic
-    'italic)
+(defcustom rst-emphasis1-face 'rst-emphasis1
   "Simple emphasis."
+  :version "24.1"
   :group 'rst-faces
   :type '(face))
+(make-obsolete-variable 'rst-emphasis1-face
+                        "customize the face `rst-emphasis1' instead."
+                        "24.1")
 
-(defcustom rst-emphasis2-face
-  ;; XEmacs compatibility
-  (if (facep 'bold)
-      ''bold
-    'bold)
+(defface rst-emphasis2 '((t :inherit bold))
+  "Face used for double emphasis."
+  :version "24.1"
+  :group 'rst-faces)
+
+(defcustom rst-emphasis2-face 'rst-emphasis2
   "Double emphasis."
   :group 'rst-faces
   :type '(face))
+(make-obsolete-variable 'rst-emphasis2-face
+                        "customize the face `rst-emphasis2' instead."
+                        "24.1")
+
+(defface rst-literal '((t :inherit font-lock-string-face))
+  "Face used for literal text."
+  :version "24.1"
+  :group 'rst-faces)
 
-(defcustom rst-literal-face 'font-lock-string-face
+(defcustom rst-literal-face 'rst-literal
   "Literal text."
+  :version "24.1"
   :group 'rst-faces
   :type '(face))
+(make-obsolete-variable 'rst-literal-face
+                        "customize the face `rst-literal' instead."
+                        "24.1")
 
-(defcustom rst-reference-face 'font-lock-variable-name-face
+(defface rst-reference '((t :inherit font-lock-variable-name-face))
+  "Face used for references to a definition."
+  :version "24.1"
+  :group 'rst-faces)
+
+(defcustom rst-reference-face 'rst-reference
   "References to a definition."
+  :version "24.1"
   :group 'rst-faces
   :type '(face))
+(make-obsolete-variable 'rst-reference-face
+                        "customize the face `rst-reference' instead."
+                        "24.1")
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
@@ -2818,94 +2888,76 @@ details check the Rst Faces Defaults group."
 
      ;; Simple `Body Elements`_
      ;; `Bullet Lists`_
-     (list
-      (concat re-bol "\\([-*+]" re-blksep1 "\\)")
-      1 rst-block-face)
+     `(,(concat re-bol "\\([-*+]" re-blksep1 "\\)")
+       1 rst-block-face)
      ;; `Enumerated Lists`_
-     (list
-      (concat re-bol "\\((?\\(#\\|[0-9]+\\|[A-Za-z]\\|[IVXLCMivxlcm]+\\)[.)]"
-             re-blksep1 "\\)")
-      1 rst-block-face)
+     `(,(concat re-bol "\\((?\\(#\\|[0-9]+\\|[A-Za-z]\\|[IVXLCMivxlcm]+\\)[.)]"
+                re-blksep1 "\\)")
+       1 rst-block-face)
      ;; `Definition Lists`_ FIXME: missing
      ;; `Field Lists`_
-     (list
-      (concat re-bol "\\(:[^:\n]+:\\)" re-blksep1)
-      1 rst-external-face)
+     `(,(concat re-bol "\\(:[^:\n]+:\\)" re-blksep1)
+       1 rst-external-face)
      ;; `Option Lists`_
-     (list
-      (concat re-bol "\\(\\(\\(\\([-+/]\\|--\\)\\sw\\(-\\|\\sw\\)*"
-             "\\([ =]\\S +\\)?\\)\\(,[\t ]\\)?\\)+\\)\\($\\|[\t ]\\{2\\}\\)")
-      1 rst-block-face)
+     `(,(concat re-bol "\\(\\(\\(\\([-+/]\\|--\\)\\sw\\(-\\|\\sw\\)*"
+               "\\([ =]\\S +\\)?\\)\\(,[\t ]\\)?\\)+\\)\\($\\|[\t ]\\{2\\}\\)")
+       1 rst-block-face)
 
      ;; `Tables`_ FIXME: missing
 
      ;; All the `Explicit Markup Blocks`_
      ;; `Footnotes`_ / `Citations`_
-     (list
-      (concat re-bol "\\(" re-ems "\\[[^[\n]+\\]\\)" re-blksep1)
+     `(,(concat re-bol "\\(" re-ems "\\[[^[\n]+\\]\\)" re-blksep1)
       1 rst-definition-face)
      ;; `Directives`_ / `Substitution Definitions`_
-     (list
-      (concat re-bol "\\(" re-ems "\\)\\(\\(|[^|\n]+|[\t ]+\\)?\\)\\("
-             re-sym1 "+::\\)" re-blksep1)
-      (list 1 rst-directive-face)
-      (list 2 rst-definition-face)
-      (list 4 rst-directive-face))
+     `(,(concat re-bol "\\(" re-ems "\\)\\(\\(|[^|\n]+|[\t ]+\\)?\\)\\("
+                re-sym1 "+::\\)" re-blksep1)
+       (1 rst-directive-face)
+       (2 rst-definition-face)
+       (4 rst-directive-face))
      ;; `Hyperlink Targets`_
-     (list
-      (concat re-bol "\\(" re-ems "_\\([^:\\`\n]\\|\\\\.\\|`[^`\n]+`\\)+:\\)"
-             re-blksep1)
-      1 rst-definition-face)
-     (list
-      (concat re-bol "\\(__\\)" re-blksep1)
-      1 rst-definition-face)
+     `(,(concat re-bol "\\(" re-ems "_\\([^:\\`\n]\\|\\\\.\\|`[^`\n]+`\\)+:\\)"
+                re-blksep1)
+       1 rst-definition-face)
+     `(,(concat re-bol "\\(__\\)" re-blksep1)
+       1 rst-definition-face)
 
      ;; All `Inline Markup`_
      ;; FIXME: Condition 5 preventing fontification of e.g. "*" not implemented
      ;; `Strong Emphasis`_
-     (list
-      (concat re-imp1 "\\(\\*\\*" re-ima2 "\\*\\*\\)" re-ims1)
-      2 rst-emphasis2-face)
+     `(,(concat re-imp1 "\\(\\*\\*" re-ima2 "\\*\\*\\)" re-ims1)
+       2 rst-emphasis2-face)
      ;; `Emphasis`_
-     (list
-      (concat re-imp1 "\\(\\*" re-ima2 "\\*\\)" re-ims1)
-      2 rst-emphasis1-face)
+     `(,(concat re-imp1 "\\(\\*" re-ima2 "\\*\\)" re-ims1)
+       2 rst-emphasis1-face)
      ;; `Inline Literals`_
-     (list
-      (concat re-imp1 "\\(``" re-imb2 "``\\)" re-ims1)
-      2 rst-literal-face)
+     `(,(concat re-imp1 "\\(``" re-imb2 "``\\)" re-ims1)
+       2 rst-literal-face)
      ;; `Inline Internal Targets`_
-     (list
-      (concat re-imp1 "\\(_`" re-imb2 "`\\)" re-ims1)
-      2 rst-definition-face)
+     `(,(concat re-imp1 "\\(_`" re-imb2 "`\\)" re-ims1)
+       2 rst-definition-face)
      ;; `Hyperlink References`_
      ;; FIXME: `Embedded URIs`_ not considered
-     (list
-      (concat re-imp1 "\\(\\(`" re-imb2 "`\\|\\(\\sw\\(\\sw\\|-\\)+\\sw\\)\\)__?\\)" re-ims1)
+     `(,(concat re-imp1 "\\(\\(`" re-imb2 "`\\|\\(\\sw\\(\\sw\\|-\\)+\\sw\\)\\)__?\\)" re-ims1)
       2 rst-reference-face)
      ;; `Interpreted Text`_
-     (list
-      (concat re-imp1 "\\(\\(:" re-sym1 "+:\\)?\\)\\(`" re-imb2 "`\\)\\(\\(:"
-             re-sym1 "+:\\)?\\)" re-ims1)
-      (list 2 rst-directive-face)
-      (list 5 rst-external-face)
-      (list 8 rst-directive-face))
+     `(,(concat re-imp1 "\\(\\(:" re-sym1 "+:\\)?\\)\\(`" re-imb2 "`\\)\\(\\(:"
+                re-sym1 "+:\\)?\\)" re-ims1)
+       (2 rst-directive-face)
+       (5 rst-external-face)
+       (8 rst-directive-face))
      ;; `Footnote References`_ / `Citation References`_
-     (list
-      (concat re-imp1 "\\(\\[[^]]+\\]_\\)" re-ims1)
-      2 rst-reference-face)
+     `(,(concat re-imp1 "\\(\\[[^]]+\\]_\\)" re-ims1)
+       2 rst-reference-face)
      ;; `Substitution References`_
-     (list
-      (concat re-imp1 "\\(|" re-imv2 "|\\)" re-ims1)
-      2 rst-reference-face)
+     `(,(concat re-imp1 "\\(|" re-imv2 "|\\)" re-ims1)
+       2 rst-reference-face)
      ;; `Standalone Hyperlinks`_
-     (list
-      ;; FIXME: This takes it easy by using a whitespace as delimiter
-      (concat re-imp1 "\\(" re-uris1 ":\\S +\\)" re-ims1)
-      2 rst-definition-face)
-     (list
-      (concat re-imp1 "\\(" re-sym1 "+@" re-sym1 "+\\)" re-ims1)
-      2 rst-definition-face)
+     `(;; FIXME: This takes it easy by using a whitespace as delimiter
+       ,(concat re-imp1 "\\(" re-uris1 ":\\S +\\)" re-ims1)
+       2 rst-definition-face)
+     `(,(concat re-imp1 "\\(" re-sym1 "+@" re-sym1 "+\\)" re-ims1)
+       2 rst-definition-face)
 
      ;; Do all block fontification as late as possible so 'append works
 
@@ -2914,7 +2966,7 @@ details check the Rst Faces Defaults group."
       (list
        re-ado2)
       (if (not rst-mode-lazy)
-         (list 1 rst-block-face)
+         '(1 rst-block-face)
        (list
         (list 'rst-font-lock-handle-adornment
               '(progn
@@ -2934,7 +2986,7 @@ details check the Rst Faces Defaults group."
       (list
        (concat re-bol "\\(" re-ems "\\)\[^[|_]\\([^:\n]\\|:\\([^:\n]\\|$\\)\\)*$")
 
-       (list 1 rst-comment-face))
+       '(1 rst-comment-face))
       (if rst-mode-lazy
          (list
           (list 'rst-font-lock-find-unindented-line
@@ -2942,12 +2994,12 @@ details check the Rst Faces Defaults group."
                    (setq rst-font-lock-indentation-point (match-end 1))
                    (point-max))
                 nil
-                (list 0 rst-comment-face 'append)))))
+                '(0 rst-comment-face append)))))
      (append
       (list
        (concat re-bol "\\(" re-emt "\\)\\(\\s *\\)$")
-       (list 1 rst-comment-face)
-       (list 2 rst-comment-face))
+       '(1 rst-comment-face)
+       '(2 rst-comment-face))
       (if rst-mode-lazy
          (list
           (list 'rst-font-lock-find-unindented-line
@@ -2955,13 +3007,13 @@ details check the Rst Faces Defaults group."
                    (setq rst-font-lock-indentation-point 'next)
                    (point-max))
                 nil
-                (list 0 rst-comment-face 'append)))))
+                '(0 rst-comment-face append)))))
 
      ;; `Literal Blocks`_
      (append
       (list
        (concat re-bol "\\(\\([^.\n]\\|\\.[^.\n]\\).*\\)?\\(::\\)$")
-       (list 3 rst-block-face))
+       '(3 rst-block-face))
       (if rst-mode-lazy
          (list
           (list 'rst-font-lock-find-unindented-line
@@ -2969,14 +3021,14 @@ details check the Rst Faces Defaults group."
                    (setq rst-font-lock-indentation-point t)
                    (point-max))
                 nil
-                (list 0 rst-literal-face 'append)))))
+                '(0 rst-literal-face append)))))
 
     ;; `Doctest Blocks`_
     (append
      (list
       (concat re-bol "\\(>>>\\|\\.\\.\\.\\)\\(.+\\)")
-      (list 1 rst-block-face)
-      (list 2 rst-literal-face)))
+      '(1 rst-block-face)
+      '(2 rst-literal-face)))
     )))
 
 
index 44933bff32794c10f6f36c56280df8f07bd80aa7..3e092374207a9bec1b7009018e24c2857d6badf7 100644 (file)
 ;;;
 
 (defgroup table nil
-  "Text based table manipulation utilities.
-See `table-insert' for examples about how to use."
+  "Text based table manipulation utilities."
   :tag "Table"
   :prefix "table-"
-  :group 'editing
   :group 'wp
-  :group 'paragraphs
-  :group 'fill
   :version "22.1")
 
 (defgroup table-hooks nil
index 75897a2cf079acf21df0778931bae8105590f932..51040824b205540c618d0e93c80e8e4b9753d80c 100644 (file)
@@ -32,7 +32,7 @@
   "Normal hook run when entering Text mode and many related modes."
   :type 'hook
   :options '(turn-on-auto-fill turn-on-flyspell)
-  :group 'data)
+  :group 'wp)
 
 (defvar text-mode-variant nil
   "Non-nil if this buffer's major mode is a variant of Text mode.
index ddf15e243c4eeaf272af95c869443d400fbf74c2..27093042efe6cedf2c1329a840e2c3e6d4d3872d 100644 (file)
@@ -89,7 +89,7 @@
 
 (defgroup uniquify nil
   "Unique buffer names dependent on file name."
-  :group 'applications)
+  :group 'files)
 
 
 (defcustom uniquify-buffer-name-style nil
index 2a8c6ebe25b2db80ec30cd157d375ae4c1d0575d..d3231672dd223d3d46f10f0b978556cb0544b973 100644 (file)
@@ -1,3 +1,26 @@
+2010-03-24  Teodor Zlatanov  <tzz@lifelogs.com>
+
+       * url-http.el (url-http-parse-headers): Fix wrong variable name.
+
+2010-03-24  Teodor Zlatanov  <tzz@lifelogs.com>
+
+       * url-http.el (url-http-codes): New variable to hold a mapping of
+       HTTP status codes' numbers, their symbolic name, and their text.
+       (url-http-parse-headers): Use it, leaving the original numeric
+       code in a comment.
+
+2010-03-19  Glenn Morris  <rgm@gnu.org>
+
+       * url.el: Move mailcap require earlier in the file.
+
+2010-03-12  Chong Yidong  <cyd@stupidchicken.com>
+
+       * url-vars.el (url): Put in comm group.
+
+2010-03-10  Chong Yidong  <cyd@stupidchicken.com>
+
+       * Branch for 23.2.
+
 2010-01-23  Chong Yidong  <cyd@stupidchicken.com>
 
        * url-util.el: Require url-vars (Bug#5459).
index 8c203c0eb8716b22891a54a05de91c4f855e2668..9f988beaf0a343e778c1a3b39443c274f1769d6f 100644 (file)
@@ -64,6 +64,55 @@ This is only useful when debugging the HTTP subsystem.  Setting to
 nil will explicitly close the connection to the server after every
 request.")
 
+(defconst url-http-codes
+  '((100 continue                        "Continue with request")
+    (101 switching-protocols             "Switching protocols")
+    (102 processing                      "Processing (Added by DAV)")
+    (200 OK                              "OK")
+    (201 created                         "Created")
+    (202 accepted                        "Accepted")
+    (203 non-authoritative               "Non-authoritative information")
+    (204 no-content                      "No content")
+    (205 reset-content                   "Reset content")
+    (206 partial-content                 "Partial content")
+    (207 multi-status                    "Multi-status (Added by DAV)")
+    (300 multiple-choices                "Multiple choices")
+    (301 moved-permanently               "Moved permanently")
+    (302 found                           "Found")
+    (303 see-other                       "See other")
+    (304 not-modified                    "Not modified")
+    (305 use-proxy                       "Use proxy")
+    (307 temporary-redirect              "Temporary redirect")
+    (400 bad-request                     "Bad Request")
+    (401 unauthorized                    "Unauthorized")
+    (402 payment-required                "Payment required")
+    (403 forbidden                       "Forbidden")
+    (404 not-found                       "Not found")
+    (405 method-not-allowed              "Method not allowed")
+    (406 not-acceptable                  "Not acceptable")
+    (407 proxy-authentication-required   "Proxy authentication required")
+    (408 request-timeout                 "Request time-out")
+    (409 conflict                        "Conflict")
+    (410 gone                            "Gone")
+    (411 length-required                 "Length required")
+    (412 precondition-failed             "Precondition failed")
+    (413 request-entity-too-large        "Request entity too large")
+    (414 request-uri-too-large           "Request-URI too large")
+    (415 unsupported-media-type          "Unsupported media type")
+    (416 requested-range-not-satisfiable "Requested range not satisfiable")
+    (417 expectation-failed              "Expectation failed")
+    (422 unprocessable-entity            "Unprocessable Entity (Added by DAV)")
+    (423 locked                          "Locked")
+    (424 failed-Dependency               "Failed Dependency")
+    (500 internal-server-error           "Internal server error")
+    (501 not-implemented                 "Not implemented")
+    (502 bad-gateway                     "Bad gateway")
+    (503 service-unavailable             "Service unavailable")
+    (504 gateway-timeout                 "Gateway time-out")
+    (505 http-version-not-supported      "HTTP version not supported")
+    (507 insufficient-storage            "Insufficient storage")
+"The HTTP return codes and their text."))
+
 ;(eval-when-compile
 ;; These are all macros so that they are hidden from external sight
 ;; when the file is byte-compiled.
@@ -435,7 +484,9 @@ should be shown to the user."
        (delete-process url-http-process)))))
   (let ((buffer (current-buffer))
        (class nil)
-       (success nil))
+       (success nil)
+       ;; other status symbols: jewelry and luxury cars
+       (status-symbol (cadr (assq url-http-response-status url-http-codes))))
     (setq class (/ url-http-response-status 100))
     (url-http-debug "Parsed HTTP headers: class=%d status=%d" class url-http-response-status)
     (url-http-handle-cookies)
@@ -463,8 +514,8 @@ should be shown to the user."
        ;; 205 Reset content
        ;; 206 Partial content
        ;; 207 Multi-status (Added by DAV)
-       (case url-http-response-status
-        ((204 205)
+       (case status-symbol
+        ((no-content reset-content)
          ;; No new data, just stay at the same document
          (url-mark-buffer-as-dead buffer)
          (setq success t))
@@ -485,8 +536,8 @@ should be shown to the user."
        ;; 307 Temporary redirect
        (let ((redirect-uri (or (mail-fetch-field "Location")
                               (mail-fetch-field "URI"))))
-        (case url-http-response-status
-          (300
+        (case status-symbol
+          (multiple-choices        ; 300
            ;; Quoth the spec (section 10.3.1)
            ;; -------------------------------
            ;; The requested resource corresponds to any one of a set of
@@ -503,7 +554,7 @@ should be shown to the user."
            ;; We do not support agent-driven negotiation, so we just
            ;; redirect to the preferred URI if one is provided.
            nil)
-          ((301 302 307)
+          ((moved-permanently found temporary-redirect) ; 301 302 307
            ;; If the 301|302 status code is received in response to a
            ;; request other than GET or HEAD, the user agent MUST NOT
            ;; automatically redirect the request unless it can be
@@ -519,20 +570,20 @@ should be shown to the user."
                              url-http-method url-http-response-status)
              (setq url-http-method "GET"
                    url-http-data nil)))
-          (303
+          (see-other                   ; 303
            ;; The response to the request can be found under a different
            ;; URI and SHOULD be retrieved using a GET method on that
            ;; resource.
            (setq url-http-method "GET"
                  url-http-data nil))
-          (304
+          (not-modified                ; 304
            ;; The 304 response MUST NOT contain a message-body.
            (url-http-debug "Extracting document from cache... (%s)"
                            (url-cache-create-filename (url-view-url t)))
            (url-cache-extract (url-cache-create-filename (url-view-url t)))
            (setq redirect-uri nil
                  success t))
-          (305
+          (use-proxy                   ; 305
            ;; The requested resource MUST be accessed through the
            ;; proxy given by the Location field.  The Location field
            ;; gives the URI of the proxy.  The recipient is expected
@@ -620,51 +671,51 @@ should be shown to the user."
        ;; 422 Unprocessable Entity (Added by DAV)
        ;; 423 Locked
        ;; 424 Failed Dependency
-       (case url-http-response-status
-        (401
+       (case status-symbol
+        (unauthorized                  ; 401
          ;; The request requires user authentication.  The response
          ;; MUST include a WWW-Authenticate header field containing a
          ;; challenge applicable to the requested resource.  The
          ;; client MAY repeat the request with a suitable
          ;; Authorization header field.
          (url-http-handle-authentication nil))
-        (402
+        (payment-required              ; 402
          ;; This code is reserved for future use
          (url-mark-buffer-as-dead buffer)
          (error "Somebody wants you to give them money"))
-        (403
+        (forbidden                     ; 403
          ;; The server understood the request, but is refusing to
          ;; fulfill it.  Authorization will not help and the request
          ;; SHOULD NOT be repeated.
          (setq success t))
-        (404
+        (not-found                     ; 404
          ;; Not found
          (setq success t))
-        (405
+        (method-not-allowed            ; 405
          ;; The method specified in the Request-Line is not allowed
          ;; for the resource identified by the Request-URI.  The
          ;; response MUST include an Allow header containing a list of
          ;; valid methods for the requested resource.
          (setq success t))
-        (406
+        (not-acceptable                ; 406
          ;; The resource identified by the request is only capable of
          ;; generating response entities which have content
          ;; characteristics nota cceptable according to the accept
          ;; headers sent in the request.
          (setq success t))
-        (407
+        (proxy-authentication-required ; 407
          ;; This code is similar to 401 (Unauthorized), but indicates
          ;; that the client must first authenticate itself with the
          ;; proxy.  The proxy MUST return a Proxy-Authenticate header
          ;; field containing a challenge applicable to the proxy for
          ;; the requested resource.
          (url-http-handle-authentication t))
-        (408
+        (request-timeout               ; 408
          ;; The client did not produce a request within the time that
          ;; the server was prepared to wait.  The client MAY repeat
          ;; the request without modifications at any later time.
          (setq success t))
-        (409
+        (conflict                      ; 409
          ;; The request could not be completed due to a conflict with
          ;; the current state of the resource.  This code is only
          ;; allowed in situations where it is expected that the user
@@ -673,11 +724,11 @@ should be shown to the user."
          ;; information for the user to recognize the source of the
          ;; conflict.
          (setq success t))
-        (410
+        (gone                          ; 410
          ;; The requested resource is no longer available at the
          ;; server and no forwarding address is known.
          (setq success t))
-        (411
+        (length-required               ; 411
          ;; The server refuses to accept the request without a defined
          ;; Content-Length.  The client MAY repeat the request if it
          ;; adds a valid Content-Length header field containing the
@@ -687,29 +738,29 @@ should be shown to the user."
          ;; `url-http-create-request' automatically calculates the
          ;; content-length.
          (setq success t))
-        (412
+        (precondition-failed           ; 412
          ;; The precondition given in one or more of the
          ;; request-header fields evaluated to false when it was
          ;; tested on the server.
          (setq success t))
-        ((413 414)
+        ((request-entity-too-large request-uri-too-large) ; 413 414
          ;; The server is refusing to process a request because the
          ;; request entity|URI is larger than the server is willing or
          ;; able to process.
          (setq success t))
-        (415
+        (unsupported-media-type        ; 415
          ;; The server is refusing to service the request because the
          ;; entity of the request is in a format not supported by the
          ;; requested resource for the requested method.
          (setq success t))
-        (416
+        (requested-range-not-satisfiable ; 416
          ;; A server SHOULD return a response with this status code if
          ;; a request included a Range request-header field, and none
          ;; of the range-specifier values in this field overlap the
          ;; current extent of the selected resource, and the request
          ;; did not include an If-Range request-header field.
          (setq success t))
-        (417
+        (expectation-failed            ; 417
          ;; The expectation given in an Expect request-header field
          ;; could not be met by this server, or, if the server is a
          ;; proxy, the server has unambiguous evidence that the
@@ -736,16 +787,16 @@ should be shown to the user."
        ;; 507 Insufficient storage
        (setq success t)
        (case url-http-response-status
-        (501
+        (not-implemented               ; 501
          ;; The server does not support the functionality required to
          ;; fulfill the request.
          nil)
-        (502
+        (bad-gateway                   ; 502
          ;; The server, while acting as a gateway or proxy, received
          ;; an invalid response from the upstream server it accessed
          ;; in attempting to fulfill the request.
          nil)
-        (503
+        (service-unavailable           ; 503
          ;; The server is currently unable to handle the request due
          ;; to a temporary overloading or maintenance of the server.
          ;; The implication is that this is a temporary condition
@@ -754,19 +805,19 @@ should be shown to the user."
          ;; header.  If no Retry-After is given, the client SHOULD
          ;; handle the response as it would for a 500 response.
          nil)
-        (504
+        (gateway-timeout               ; 504
          ;; The server, while acting as a gateway or proxy, did not
          ;; receive a timely response from the upstream server
          ;; specified by the URI (e.g. HTTP, FTP, LDAP) or some other
          ;; auxiliary server (e.g. DNS) it needed to access in
          ;; attempting to complete the request.
          nil)
-        (505
+        (http-version-not-supported    ; 505
          ;; The server does not support, or refuses to support, the
          ;; HTTP protocol version that was used in the request
          ;; message.
          nil)
-        (507                           ; DAV
+        (insufficient-storage          ; 507 (DAV)
          ;; The method could not be performed on the resource
          ;; because the server is unable to store the representation
          ;; needed to successfully complete the request.  This
index 2062f482ede7b147d0f9c2d0f28f5ad36f9c0474..1b9fd7b76cc2d0d302ed8edfc2ee2612cb2c8732 100644 (file)
@@ -30,7 +30,7 @@
 (defgroup url nil
   "Uniform Resource Locator tool."
   :version "22.1"
-  :group 'hypermedia)
+  :group 'comm)
 
 (defgroup url-file nil
   "URL storage."
index 9f47e104043b466231b6a8485f1ad60266ca6ae9..6f7b810f0ed9ba5892c55ede7067a418bca5a57a 100644 (file)
@@ -1,7 +1,7 @@
 ;;; url.el --- Uniform Resource Locator retrieval tool
 
-;; Copyright (C) 1996, 1997, 1998, 1999, 2001, 2004,
-;;   2005, 2006, 2007, 2008, 2009, 2010  Free Software Foundation, Inc.
+;; Copyright (C) 1996, 1997, 1998, 1999, 2001, 2004, 2005, 2006, 2007,
+;;   2008, 2009, 2010  Free Software Foundation, Inc.
 
 ;; Author: Bill Perry <wmperry@gnu.org>
 ;; Keywords: comm, data, processes, hypermedia
 
 (eval-when-compile (require 'cl))
 
+(require 'mailcap)
+
 (eval-when-compile
   (require 'mm-decode)
   (require 'mm-view))
 
-(require 'mailcap)
 (require 'url-vars)
 (require 'url-cookie)
 (require 'url-history)
index 71839443553ce1b7a9bff2054847a639ac998f91..1878fe8740f595438bd180374cd5ba2c4db11cec 100644 (file)
@@ -162,7 +162,8 @@ menu items."
   (remove-from-invisibility-spec 'foo)
   (set (make-local-variable 'truncate-lines) t)
   (set (make-local-variable 'font-lock-defaults)
-       '(vc-annotate-font-lock-keywords t)))
+       '(vc-annotate-font-lock-keywords t))
+  (hack-dir-local-variables-non-file-buffer))
 
 (defun vc-annotate-toggle-annotation-visibility ()
   "Toggle whether or not the annotation is visible."
index b99c3de687520c9ca6571122354400b3b85cf7b9..80629ec0b4bf857c668d34bc05769cc0e1917251 100644 (file)
@@ -428,7 +428,7 @@ CALLBACK expects (ENTRIES &optional MORE-TO-COME); see
        (message "There are unresolved conflicts in %s"
                 (file-name-nondirectory rej))))))
 
-(defun vc-arch-checkin (files rev comment)
+(defun vc-arch-checkin (files rev comment  &optional extra-args-ignored)
   (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 files) (vc-arch-root (car files)))))
index b0dbb8ec1929bd7987e0ec7eb9f5043cec5de1ce..35c84f39da9d14045d3cc7917b2cab2ce94e8f84 100644 (file)
@@ -451,11 +451,11 @@ or a superior directory.")
   "Unregister FILE from bzr."
   (vc-bzr-command "remove" nil 0 file "--keep"))
 
-(defun vc-bzr-checkin (files rev comment)
+(defun vc-bzr-checkin (files rev comment &optional extra-args)
   "Check FILE in to bzr with log message COMMENT.
 REV non-nil gets an error."
   (if rev (error "Can't check in a specific revision with bzr"))
-  (vc-bzr-command "commit" nil 0 files "-m" comment))
+  (apply 'vc-bzr-command "commit" nil 0 files (append (list "-m" comment) extra-args)))
 
 (defun vc-bzr-find-revision (file rev buffer)
   "Fetch revision REV of file FILE and put it into BUFFER."
@@ -545,6 +545,23 @@ REV non-nil gets an error."
        (goto-char (point-min)))
       found)))
 
+(declare-function log-edit-mode "log-edit" ())
+(defvar log-edit-extra-flags)
+(defvar log-edit-before-checkin-process)
+
+(define-derived-mode vc-bzr-log-edit-mode log-edit-mode "Bzr-Log-Edit"
+  "Mode for editing Bzr commit logs.
+If a line like:
+Author: NAME
+is present in the log, it is removed, and
+--author NAME
+is passed to the bzr commit command.  Similarly with Fixes: and --fixes."
+  (set (make-local-variable 'log-edit-extra-flags) nil)
+  (set (make-local-variable 'log-edit-before-checkin-process)
+       '(("^\\(Author\\|Fixes\\):[ \t]+\\(.*\\)[ \t]*$" .
+          (list (format "--%s" (downcase (match-string 1)))
+                (match-string 2))))))
+
 (defun vc-bzr-diff (files &optional rev1 rev2 buffer)
   "VC bzr backend for diff."
   ;; `bzr diff' exits with code 1 if diff is non-empty.
@@ -758,9 +775,11 @@ stream.  Standard error output is discarded."
 
     (define-key map [down-mouse-3] 'vc-bzr-shelve-menu)
     (define-key map "\C-k" 'vc-bzr-shelve-delete-at-point)
-    ;; (define-key map "=" 'vc-bzr-shelve-show-at-point)
-    ;; (define-key map "\C-m" 'vc-bzr-shelve-show-at-point)
+    (define-key map "=" 'vc-bzr-shelve-show-at-point)
+    (define-key map "\C-m" 'vc-bzr-shelve-show-at-point)
+    (define-key map "A" 'vc-bzr-shelve-apply-and-keep-at-point)
     (define-key map "P" 'vc-bzr-shelve-apply-at-point)
+    (define-key map "S" 'vc-bzr-shelve-snapshot)
     map))
 
 (defvar vc-bzr-shelve-menu-map
@@ -768,16 +787,22 @@ stream.  Standard error output is discarded."
     (define-key map [de]
       '(menu-item "Delete shelf" vc-bzr-shelve-delete-at-point
                  :help "Delete the current shelf"))
+    (define-key map [ap]
+      '(menu-item "Apply and keep shelf" vc-bzr-shelve-apply-and-keep-at-point
+                 :help "Apply the current shelf and keep it"))
     (define-key map [po]
       '(menu-item "Apply and remove shelf (pop)" vc-bzr-shelve-apply-at-point
                  :help "Apply the current shelf and remove it"))
-    ;; (define-key map [sh]
-    ;;   '(menu-item "Show shelve" vc-bzr-shelve-show-at-point
-    ;;                   :help "Show the contents of the current shelve"))
+    (define-key map [sh]
+      '(menu-item "Show shelve" vc-bzr-shelve-show-at-point
+                 :help "Show the contents of the current shelve"))
     map))
 
 (defvar vc-bzr-extra-menu-map
   (let ((map (make-sparse-keymap)))
+    (define-key map [bzr-sn]
+      '(menu-item "Shelve a snapshot" vc-bzr-shelve-snapshot
+                 :help "Shelve the current state of the tree and keep the current state"))
     (define-key map [bzr-sh]
       '(menu-item "Shelve..." vc-bzr-shelve
                  :help "Shelve changes"))
@@ -864,16 +889,16 @@ stream.  Standard error output is discarded."
       (vc-bzr-command "shelve" nil 0 nil "--all" "-m" name)
       (vc-resynch-buffer root t t))))
 
-;; (defun vc-bzr-shelve-show (name)
-;;   "Show the contents of shelve NAME."
-;;   (interactive "sShelve name: ")
-;;   (vc-setup-buffer "*vc-bzr-shelve*")
-;;   ;; FIXME: how can you show the contents of a shelf?
-;;   (vc-bzr-command "shelve" "*vc-bzr-shelve*" 'async nil name)
-;;   (set-buffer "*vc-bzr-shelve*")
-;;   (diff-mode)
-;;   (setq buffer-read-only t)
-;;   (pop-to-buffer (current-buffer)))
+(defun vc-bzr-shelve-show (name)
+  "Show the contents of shelve NAME."
+  (interactive "sShelve name: ")
+  (vc-setup-buffer "*vc-bzr-shelve*")
+  ;; FIXME: how can you show the contents of a shelf?
+  (vc-bzr-command "unshelve" "*vc-bzr-shelve*" 'async nil "--preview" name)
+  (set-buffer "*vc-bzr-shelve*")
+  (diff-mode)
+  (setq buffer-read-only t)
+  (pop-to-buffer (current-buffer)))
 
 (defun vc-bzr-shelve-apply (name)
   "Apply shelve NAME and remove it afterwards."
@@ -881,6 +906,23 @@ stream.  Standard error output is discarded."
   (vc-bzr-command "unshelve" "*vc-bzr-shelve*" 0 nil "--apply" name)
   (vc-resynch-buffer (vc-bzr-root default-directory) t t))
 
+(defun vc-bzr-shelve-apply-and-keep (name)
+  "Apply shelve NAME and keep it afterwards."
+  (interactive "sApply (and keep) shelf: ")
+  (vc-bzr-command "unshelve" "*vc-bzr-shelve*" 0 nil "--apply" "--keep" name)
+  (vc-resynch-buffer (vc-bzr-root default-directory) t t))
+
+(defun vc-bzr-shelve-snapshot ()
+  "Create a stash with the current tree state."
+  (interactive)
+  (vc-bzr-command "shelve" nil 0 nil "--all" "-m"
+                 (let ((ct (current-time)))
+                   (concat
+                    (format-time-string "Snapshot on %Y-%m-%d" ct)
+                    (format-time-string " at %H:%M" ct))))
+  (vc-bzr-command "unshelve" "*vc-bzr-shelve*" 0 nil "--apply" "--keep")
+  (vc-resynch-buffer (vc-bzr-root default-directory) t t))
+
 (defun vc-bzr-shelve-list ()
   (with-temp-buffer
     (vc-bzr-command "shelve" (current-buffer) 1 nil "--list" "-q")
@@ -905,14 +947,18 @@ stream.  Standard error output is discarded."
       (vc-bzr-command "unshelve" nil 0 nil "--delete-only" shelve)
       (vc-dir-refresh))))
 
-;; (defun vc-bzr-shelve-show-at-point ()
-;;   (interactive)
-;;   (vc-bzr-shelve-show (vc-bzr-shelve-get-at-point (point))))
+(defun vc-bzr-shelve-show-at-point ()
+  (interactive)
+  (vc-bzr-shelve-show (vc-bzr-shelve-get-at-point (point))))
 
 (defun vc-bzr-shelve-apply-at-point ()
   (interactive)
   (vc-bzr-shelve-apply (vc-bzr-shelve-get-at-point (point))))
 
+(defun vc-bzr-shelve-apply-and-keep-at-point ()
+  (interactive)
+  (vc-bzr-shelve-apply-and-keep (vc-bzr-shelve-get-at-point (point))))
+
 (defun vc-bzr-shelve-menu (e)
   (interactive "e")
   (vc-dir-at-event e (popup-menu vc-bzr-shelve-menu-map e)))
index 1abef9f48b8dca7ff8a2e48c2665ee15629ec42c..8f9d07723d842520aa3ea0b03306b999d0dc4cf5 100644 (file)
@@ -313,7 +313,7 @@ its parents."
                   (directory-file-name dir))))
     (eq dir t)))
 
-(defun vc-cvs-checkin (files rev comment)
+(defun vc-cvs-checkin (files rev comment  &optional extra-args-ignored)
   "CVS-specific version of `vc-backend-checkin'."
   (unless (or (not rev) (vc-cvs-valid-revision-number-p rev))
     (if (not (vc-cvs-valid-symbolic-tag-name-p rev))
index 2f661e8becf27b6aa21717fbf3d20f5d7da0f3e5..1eaec28e8beb7aa6ef223f1beb5b4e1f4638e9b2 100644 (file)
@@ -938,6 +938,7 @@ the *vc-dir* buffer.
     ;; Make sure that if the directory buffer is killed, the update
     ;; process running in the background is also killed.
     (add-hook 'kill-buffer-query-functions 'vc-dir-kill-query nil t)
+    (hack-dir-local-variables-non-file-buffer)
     (vc-dir-refresh)))
 
 (defun vc-dir-headers (backend dir)
@@ -949,7 +950,8 @@ specific headers."
    (propertize "VC backend : " 'face 'font-lock-type-face)
    (propertize (format "%s\n" backend) 'face 'font-lock-variable-name-face)
    (propertize "Working dir: " 'face 'font-lock-type-face)
-   (propertize (format "%s\n" dir) 'face 'font-lock-variable-name-face)
+   (propertize (format "%s\n" (abbreviate-file-name dir))
+               'face 'font-lock-variable-name-face)
    ;; Then the backend specific ones.
    (vc-call-backend backend 'dir-extra-headers dir)
    "\n"))
index 40223c9010d01afc5716fc553c0487f79806fcd7..80a0f5dddcd70ce984bfbb7eac1265553af074aa 100644 (file)
@@ -318,16 +318,9 @@ case, and the process object in the asynchronous case."
            (status 0))
        (when files
          (setq squeezed (nconc squeezed files)))
-       (let ((exec-path (append vc-path exec-path))
-             ;; Add vc-path to PATH for the execution of this command.
-             ;; Also, since some functions need to parse the output
+       (let (;; Since some functions need to parse the output
              ;; from external commands, set LC_MESSAGES to C.
-             (process-environment
-              (cons (concat "PATH=" (getenv "PATH")
-                            path-separator
-                            (mapconcat 'identity vc-path path-separator))
-                    (cons "LC_MESSAGES=C"
-                          process-environment)))
+             (process-environment (cons "LC_MESSAGES=C" process-environment))
              (w32-quote-process-args t))
          (if (eq okstatus 'async)
              ;; Run asynchronously.
@@ -522,20 +515,22 @@ NOT-URGENT means it is ok to continue if the user says not to save."
 
 ;; Set up key bindings for use while editing log messages
 
-(defun vc-log-edit (fileset)
+(defun vc-log-edit (fileset mode)
   "Set up `log-edit' for use on FILE."
   (setq default-directory
        (with-current-buffer vc-parent-buffer default-directory))
   (log-edit 'vc-finish-logentry
            nil
            `((log-edit-listfun . (lambda () ',fileset))
-             (log-edit-diff-function . (lambda () (vc-diff nil)))))
+             (log-edit-diff-function . (lambda () (vc-diff nil))))
+           nil
+           mode)
   (set (make-local-variable 'vc-log-fileset) fileset)
   (make-local-variable 'vc-log-extra)
   (set-buffer-modified-p nil)
   (setq buffer-file-name nil))
 
-(defun vc-start-logentry (files extra comment initial-contents msg logbuf action &optional after-hook)
+(defun vc-start-logentry (files extra comment initial-contents msg logbuf mode action &optional after-hook)
   "Accept a comment for an operation on FILES with extra data EXTRA.
 If COMMENT is nil, pop up a LOGBUF buffer, emit MSG, and set the
 action on close to ACTION.  If COMMENT is a string and
@@ -544,8 +539,9 @@ contents of the log entry buffer.  If COMMENT is a string and
 INITIAL-CONTENTS is nil, do action immediately as if the user had
 entered COMMENT.  If COMMENT is t, also do action immediately with an
 empty comment.  Remember the file's buffer in `vc-parent-buffer'
-\(current one if no file).  AFTER-HOOK specifies the local value
-for `vc-log-after-operation-hook'."
+\(current one if no file).  Puts the log-entry buffer in major-mode
+MODE, defaulting to `log-edit-mode' if MODE is nil.
+AFTER-HOOK specifies the local value for `vc-log-after-operation-hook'."
   (let ((parent
          (if (vc-dispatcher-browsing)
              ;; If we are called from a directory browser, the parent buffer is
@@ -560,7 +556,7 @@ for `vc-log-after-operation-hook'."
     (set (make-local-variable 'vc-parent-buffer) parent)
     (set (make-local-variable 'vc-parent-buffer-name)
         (concat " from " (buffer-name vc-parent-buffer)))
-    (vc-log-edit files)
+    (vc-log-edit files mode)
     (make-local-variable 'vc-log-after-operation-hook)
     (when after-hook
       (setq vc-log-after-operation-hook after-hook))
@@ -574,6 +570,9 @@ for `vc-log-after-operation-hook'."
       (vc-finish-logentry (eq comment t)))))
 
 (declare-function vc-dir-move-to-goal-column "vc-dir" ())
+;; vc-finish-logentry is called from a log-edit buffer (see above).
+(declare-function log-view-process-buffer "log-edit" ())
+(defvar log-edit-extra-flags)
 
 (defun vc-finish-logentry (&optional nocomment)
   "Complete the operation implied by the current log entry.
@@ -590,12 +589,16 @@ the buffer contents as a comment."
     (or (vc-dispatcher-browsing) (vc-buffer-sync)))
   (unless vc-log-operation
     (error "No log operation is pending"))
+
+  (log-view-process-buffer)
+
   ;; save the parameters held in buffer-local variables
   (let ((logbuf (current-buffer))
        (log-operation vc-log-operation)
        (log-fileset vc-log-fileset)
        (log-extra vc-log-extra)
        (log-entry (buffer-string))
+       (extra-flags log-edit-extra-flags)
        (after-hook vc-log-after-operation-hook)
        (tmp-vc-parent-buffer vc-parent-buffer))
     (pop-to-buffer vc-parent-buffer)
@@ -604,7 +607,9 @@ the buffer contents as a comment."
       (funcall log-operation
               log-fileset
               log-extra
-              log-entry))
+              log-entry
+              extra-flags
+              ))
     ;; Remove checkin window (after the checkin so that if that fails
     ;; we don't zap the log buffer and the typing therein).
     ;; -- IMO this should be replaced with quit-window
index 8799e15305f07746945e14c6820aae5f8ae65cc1..93f9d8c6797df941acae8b1c4f8531c0d2c57eda 100644 (file)
@@ -541,7 +541,7 @@ or an empty string if none."
   (vc-git-command nil 0 file "rm" "-f" "--cached" "--"))
 
 
-(defun vc-git-checkin (files rev comment)
+(defun vc-git-checkin (files rev comment  &optional extra-args-ignored)
   (let ((coding-system-for-write git-commits-coding-system))
     (vc-git-command nil 0 files "commit"
                    "-m" comment "--only" "--")))
@@ -673,7 +673,8 @@ or BRANCH^ (where \"^\" can be repeated)."
     (with-temp-buffer
       (vc-git-command t nil nil "for-each-ref" "--format=%(refname)")
       (goto-char (point-min))
-      (while (re-search-forward "^refs/\\(heads\\|tags\\)/\\(.*\\)$" nil t)
+      (while (re-search-forward "^refs/\\(heads\\|tags\\|remotes\\)/\\(.*\\)$"
+                                nil t)
         (push (match-string 2) table)))
     table))
 
index b6e1d39c2ff38c0cf6d3a6f976a45132f1f1926d..f28d6e75110fd9b118791132b0877f8e420ec997 100644 (file)
@@ -279,6 +279,21 @@ If nil, use the value of `vc-diff-switches'.  If t, use no switches."
           ("^date: \\(.+\\)" (1 'change-log-date))
             ("^summary:[ \t]+\\(.+\\)" (1 'log-view-message)))))))
 
+(declare-function log-edit-mode "log-edit" ())
+(defvar log-edit-extra-flags)
+(defvar log-edit-before-checkin-process)
+
+(define-derived-mode vc-hg-log-edit-mode log-edit-mode "Hg-log-edit"
+  "Mode for editing Hg commit logs.
+If a line like:
+Author: NAME
+is present in the log, it is removed, and
+--author NAME
+is passed to the hg commit command."
+  (set (make-local-variable 'log-edit-extra-flags) nil)
+  (set (make-local-variable 'log-edit-before-checkin-process)
+       '(("^Author:[ \t]+\\(.*\\)[ \t]*$" . (list "--user" (match-string 1))))))
+
 (defun vc-hg-diff (files &optional oldvers newvers buffer)
   "Get a difference report using hg between two revisions of FILES."
   (let* ((firstfile (car files))
@@ -401,10 +416,10 @@ COMMENT is ignored."
 ;;   "Unregister FILE from hg."
 ;;   (vc-hg-command nil nil file "remove"))
 
-(defun vc-hg-checkin (files rev comment)
+(defun vc-hg-checkin (files rev comment &optional extra-args)
   "Hg-specific version of `vc-backend-checkin'.
 REV is ignored."
-  (vc-hg-command nil 0 files  "commit" "-m" comment))
+  (apply 'vc-hg-command nil 0 files  (append (list "commit" "-m" comment) extra-args)))
 
 (defun vc-hg-find-revision (file rev buffer)
   (let ((coding-system-for-read 'binary)
index 01c1dc822df54068ea102e997e34d420857b44a8..47ab9aa71fc190bb08aad9ff5d6cee4bbe5815f5 100644 (file)
@@ -84,13 +84,6 @@ An empty list disables VC altogether."
   :type '(repeat string)
   :group 'vc)
 
-(defcustom vc-path nil
-  "List of extra directories to search for version control commands."
-  :type '(repeat directory)
-  :group 'vc)
-
-(make-obsolete-variable 'vc-path "should not be necessary anymore." "23.2")
-
 (defcustom vc-make-backup-files nil
   "If non-nil, backups of registered files are made as with other files.
 If nil (the default), files covered by version control don't get backups."
index db9f5eb333382d57d93adad585966d727a903c0d..d62fd1ea8c6dbf956bfee023fb291e38fee4c7a3 100644 (file)
@@ -172,7 +172,7 @@ If nil, use the value of `vc-diff-switches'.  If t, use no switches."
 (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)
+(defun vc-mtn-checkin (files rev comment  &optional extra-args-ignored)
   (vc-mtn-command nil 0 files "commit" "-m" comment))
 
 (defun vc-mtn-find-revision (file rev buffer)
index 91cae8ed970f07634ea31c0c4ea3e75ee8f94ed1..9756ec21967fa319c27163f871d9045fd7eade9d 100644 (file)
@@ -348,7 +348,7 @@ whether to remove it."
         (yes-or-no-p (format "Directory %s is empty; remove it? " dir))
         (delete-directory dir))))
 
-(defun vc-rcs-checkin (files rev comment)
+(defun vc-rcs-checkin (files rev comment &optional extra-args-ignored)
   "RCS-specific version of `vc-backend-checkin'."
   (let ((switches (vc-switches 'RCS 'checkin)))
     ;; Now operate on the files
index 43bbda42d3fcab141087efe57e4175d2825a454a..de476ded36985c164f8bedf21ebe49990bb6a771 100644 (file)
@@ -235,7 +235,7 @@ expanded if `vc-keep-workfiles' is non-nil, otherwise, delete the workfile."
       (stringp (vc-sccs-search-project-dir (or (file-name-directory file) "")
                                           (file-name-nondirectory file)))))
 
-(defun vc-sccs-checkin (files rev comment)
+(defun vc-sccs-checkin (files rev comment &optional extra-args-ignored)
   "SCCS-specific version of `vc-backend-checkin'."
   (dolist (file (vc-expand-dirs files))
     (apply 'vc-sccs-do-command nil 0 "delta" (vc-name file)
index 6883556f249c3b6d83ac2b98f7faaada5899beb8..cd43d425af15b427344cd510f84ed0b3f1a8f65b 100644 (file)
@@ -282,7 +282,7 @@ to the SVN command."
   "Return non-nil if FILE could be registered in SVN.
 This is only possible if SVN is responsible for FILE's directory.")
 
-(defun vc-svn-checkin (files rev comment)
+(defun vc-svn-checkin (files rev comment &optional extra-args-ignored)
   "SVN-specific version of `vc-backend-checkin'."
   (if rev (error "Committing to a specific revision is unsupported in SVN"))
   (let ((status (apply
index e29603fcc1cdef43aa518192a2e23ffcce8defab..142a1508162da9f9737ff9b78fa829f12681dd5c 100644 (file)
 ;;   Unregister FILE from this backend.  This is only needed if this
 ;;   backend may be used as a "more local" backend for temporary editing.
 ;;
-;; * checkin (files rev comment)
+;; * checkin (files rev comment &optional extra-args)
 ;;
 ;;   Commit changes in FILES to this backend.  If REV is non-nil, that
 ;;   should become the new revision number (not all backends do
 ;;   implementation should pass the value of vc-checkin-switches to
 ;;   the backend command.  (Note: in older versions of VC, this
 ;;   command took a single file argument and not a list.)
+;;   EXTRA-ARGS should be passed to the backend command.
 ;;
 ;; * find-revision (file rev buffer)
 ;;
 ;;   Return the revision number that follows REV for FILE, or nil if no such
 ;;   revision exists.
 ;;
+;; - log-edit-mode ()
+;;
+;;   Turn on the mode used for editing the check in log.  This
+;;   defaults to `log-edit-mode'.  If changed, it should use a mode
+;;   derived from`log-edit-mode'.
+;;
 ;; - check-headers ()
 ;;
 ;;   Return non-nil if the current buffer contains any version headers.
@@ -1358,7 +1365,9 @@ Runs the normal hooks `vc-before-checkin-hook' and `vc-checkin-hook'."
     files rev comment initial-contents
     "Enter a change comment."
     "*VC-log*"
-    (lambda (files rev comment)
+    (lambda ()
+      (vc-call-backend backend 'log-edit-mode))
+    (lambda (files rev comment extra-flags)
       (message "Checking in %s..." (vc-delistify files))
       ;; "This log message intentionally left almost blank".
       ;; RCS 5.7 gripes about white-space-only comments too.
@@ -1369,7 +1378,7 @@ Runs the normal hooks `vc-before-checkin-hook' and `vc-checkin-hook'."
        ;; We used to change buffers to get local value of vc-checkin-switches,
        ;; but 'the' local buffer is not a well-defined concept for filesets.
        (progn
-        (vc-call-backend backend 'checkin files rev comment)
+        (vc-call-backend backend 'checkin files rev comment extra-flags)
         (mapc 'vc-delete-automatic-version-backups files))
        `((vc-state . up-to-date)
         (vc-checkout-time . ,(nth 5 (file-attributes file)))
@@ -1736,17 +1745,18 @@ The headers are reset to their non-expanded form."
 
 (defun vc-modify-change-comment (files rev oldcomment)
   "Edit the comment associated with the given files and revision."
-  (vc-start-logentry
-   files rev oldcomment t
-   "Enter a replacement change comment."
-   "*VC-log*"
-   (lambda (files rev comment)
-     (vc-call-backend
-      ;; Less of a kluge than it looks like; log-view mode only passes
-      ;; this function a singleton list.  Arguments left in this form in
-      ;; case the more general operation ever becomes meaningful.
-      (vc-responsible-backend (car files))
-      'modify-change-comment files rev comment))))
+  ;; Less of a kluge than it looks like; log-view mode only passes
+  ;; this function a singleton list.  Arguments left in this form in
+  ;; case the more general operation ever becomes meaningful.
+  (let ((backend (vc-responsible-backend (car files))))
+    (vc-start-logentry
+     files rev oldcomment t
+     "Enter a replacement change comment."
+     "*VC-log*"
+     (lambda () (vc-call-backend backend 'log-edit-mode))
+     (lambda (files rev comment ignored)
+       (vc-call-backend backend
+                        'modify-change-comment files rev comment)))))
 
 ;;;###autoload
 (defun vc-merge ()
@@ -2433,6 +2443,10 @@ to provide the `find-revision' operation instead."
 
 (defalias 'vc-default-check-headers 'ignore)
 
+(declare-function log-edit-mode "log-edit" ())
+
+(defun vc-default-log-edit-mode (backend) (log-edit-mode))
+
 (defun vc-default-log-view-mode (backend) (log-view-mode))
 
 (defun vc-default-show-log-entry (backend rev)
index 3573a86ad49fe3e8af386772037c687cd21d9ca7..9e8fbf431f1cefff25045527048ab5bb30ba5e3c 100644 (file)
 (defgroup vcursor nil
   "Manipulate an alternative (\"virtual\") cursor."
   :prefix "vcursor-"
-  :group 'editing)
+  :group 'convenience)
 
 (defface vcursor
   '((((class color)) (:foreground "blue" :background "cyan" :underline t))
index fbdabd571afc9a9371875a53085248397b944565..5cd0cc8d63495be88705f521dbb73a968776cae9 100644 (file)
@@ -32,7 +32,7 @@
 (defconst emacs-copyright "Copyright (C) 2010 Free Software Foundation, Inc." "\
 Short copyright string for this version of Emacs.")
 
-(defconst emacs-version "23.1.94" "\
+(defconst emacs-version "24.0.50" "\
 Version numbers of this version of Emacs.")
 
 (defconst emacs-major-version (progn (string-match "^[0-9]+" emacs-version) (string-to-number (match-string 0 emacs-version))) "\
index 219af1b6e1ed330ba7a6237f391f9e0f5c05511e..63db3452a87179a82939ee12ad836cab479afb7e 100644 (file)
@@ -48,8 +48,7 @@
   "Peruse file or buffer without editing."
   :link '(function-link view-mode)
   :link '(custom-manual "(emacs)Misc File Ops")
-  :group 'wp
-  :group 'editing)
+  :group 'wp)
 
 (defcustom view-highlight-face 'highlight
    "The face used for highlighting the match found by View mode search."
index 183698a28f3676aad829b7f0eb0468cfcad0d8f4..79ce9a330d415a5a3c950d1d246bedc89d0ff596 100644 (file)
   "Visualize blanks (TAB, (HARD) SPACE and NEWLINE)."
   :link '(emacs-library-link :tag "Source Lisp File" "whitespace.el")
   :version "23.1"
-  :group 'wp
-  :group 'data)
+  :group 'convenience)
 
 
 (defcustom whitespace-style
index a087f17a900960bdf6c122ab51d76ae3c5286159..6296a965df9d097dab9657428d6f1333780d371f 100644 (file)
@@ -78,8 +78,7 @@
   :link '(custom-manual "(widget)Top")
   :link '(emacs-library-link :tag "Lisp File" "widget.el")
   :prefix "widget-"
-  :group 'extensions
-  :group 'hypermedia)
+  :group 'extensions)
 
 (defgroup widget-documentation nil
   "Options controlling the display of documentation strings."
@@ -639,8 +638,7 @@ extension (xpm, xbm, gif, jpg, or png) located in
           (dolist (elt widget-image-conversion)
             (dolist (ext (cdr elt))
               (push (list :type (car elt) :file (concat image ext)) specs)))
-          (setq specs (nreverse specs))
-          (find-image specs)))
+          (find-image (nreverse specs))))
        (t
         ;; Oh well.
         nil)))
@@ -657,7 +655,7 @@ IMAGE should either be an image or an image file name sans extension
 
 Optional arguments DOWN and INACTIVE are used instead of IMAGE when the
 button is pressed or inactive, respectively.  These are currently ignored."
-  (if (and (display-graphic-p)
+  (if (and (featurep 'image)
           (setq image (widget-image-find image)))
       (progn (widget-put widget :suppress-face t)
             (insert-image image tag))
@@ -1874,6 +1872,7 @@ by some other text in the `:format' string (if specified)."
   :valid-regexp ""
   :error "Field's value doesn't match allowed forms"
   :value-create 'widget-field-value-create
+  :value-set 'widget-field-value-set
   :value-delete 'widget-field-value-delete
   :value-get 'widget-field-value-get
   :match 'widget-field-match)
@@ -1912,6 +1911,18 @@ the earlier input."
                        (widget-apply widget :value-get))
     widget))
 
+(defun widget-field-value-set (widget value)
+  "Set an editable text field WIDGET to VALUE"
+  (let ((from (widget-field-start widget))
+       (to (widget-field-text-end widget))
+       (buffer (widget-field-buffer widget))
+       (size (widget-get widget :size)))
+    (when (and from to (buffer-live-p buffer))
+      (with-current-buffer buffer
+       (goto-char from)
+       (delete-char (- to from))
+       (insert value)))))
+
 (defun widget-field-value-create (widget)
   "Create an editable text field."
   (let ((size (widget-get widget :size))
@@ -1949,7 +1960,6 @@ the earlier input."
   (let ((from (widget-field-start widget))
        (to (widget-field-text-end widget))
        (buffer (widget-field-buffer widget))
-       (size (widget-get widget :size))
        (secret (widget-get widget :secret))
        (old (current-buffer)))
     (if (and from to)
@@ -2806,11 +2816,19 @@ Return an alist of (TYPE MATCH)."
 ;;; The `visibility' Widget.
 
 (define-widget 'visibility 'item
-  "An indicator and manipulator for hidden items."
+  "An indicator and manipulator for hidden items.
+
+The following properties have special meanings for this widget:
+:on-image  Image filename or spec to display when the item is visible.
+:on        Text shown if the \"on\" image is nil or cannot be displayed.
+:off-image Image filename or spec to display when the item is hidden.
+:off       Text shown if the \"off\" image is nil cannot be displayed."
   :format "%[%v%]"
   :button-prefix ""
   :button-suffix ""
+  :on-image "down"
   :on "Hide"
+  :off-image "right"
   :off "Show"
   :value-create 'widget-visibility-value-create
   :action 'widget-toggle-action
@@ -2818,21 +2836,17 @@ Return an alist of (TYPE MATCH)."
 
 (defun widget-visibility-value-create (widget)
   ;; Insert text representing the `on' and `off' states.
-  (let ((on (widget-get widget :on))
-       (off (widget-get widget :off)))
-    (if on
-       (setq on (concat widget-push-button-prefix
-                        on
-                        widget-push-button-suffix))
-      (setq on ""))
-    (if off
-       (setq off (concat widget-push-button-prefix
-                         off
-                         widget-push-button-suffix))
-      (setq off ""))
-    (if (widget-value widget)
-       (widget-image-insert widget on "down" "down-pushed")
-      (widget-image-insert widget off "right" "right-pushed"))))
+  (let* ((val (widget-value widget))
+        (text (widget-get widget (if val :on :off)))
+        (img (widget-image-find
+              (widget-get widget (if val :on-image :off-image)))))
+    (widget-image-insert widget
+                        (if text
+                            (concat widget-push-button-prefix text
+                                    widget-push-button-suffix)
+                          "")
+                        (if img
+                            (append img '(:ascent center))))))
 
 ;;; The `documentation-link' Widget.
 ;;
@@ -2935,7 +2949,7 @@ link for that string."
                (widget-create-child-and-convert
                 widget (widget-get widget :visibility-widget)
                 :help-echo "Show or hide rest of the documentation."
-                :on "Hide Rest"
+                :on "Hide"
                 :off "More"
                 :always-active t
                 :action 'widget-parent-action
@@ -3692,6 +3706,7 @@ example:
 (define-widget 'color 'editable-field
   "Choose a color name (with sample)."
   :format "%{%t%}: %v (%{sample%})\n"
+  :value-create 'widget-color-value-create
   :size 10
   :tag "Color"
   :value "black"
@@ -3700,6 +3715,27 @@ example:
   :notify 'widget-color-notify
   :action 'widget-color-action)
 
+(defun widget-color-value-create (widget)
+  (widget-field-value-create widget)
+  (widget-insert " ")
+  (widget-create-child-and-convert
+   widget 'push-button
+   :tag "Choose" :action 'widget-color--choose-action)
+  (widget-insert " "))
+
+(defun widget-color--choose-action (widget &optional event)
+  (list-colors-display
+   nil nil
+   `(lambda (color)
+      (when (buffer-live-p ,(current-buffer))
+       (widget-value-set ',(widget-get widget :parent) color)
+       (let* ((buf (get-buffer "*Colors*"))
+              (win (get-buffer-window buf 0)))
+         (bury-buffer buf)
+         (and win (> (length (window-list)) 1)
+              (delete-window win)))
+       (pop-to-buffer ,(current-buffer))))))
+
 (defun widget-color-complete (widget)
   "Complete the color in WIDGET."
   (require 'facemenu)                  ; for facemenu-color-alist
index 65ef94319398909511c92714eae9a22b80acf14b..9bea2c13dbdf79ebe858291e96bcac334418669c 100644 (file)
@@ -1,3 +1,7 @@
+2010-03-10  Chong Yidong  <cyd@stupidchicken.com>
+
+       * Branch for 23.2.
+
 2009-10-19  Dan Nicolaescu  <dann@ics.uci.edu>
 
        * xlwmenu.c:
index 7dd77153ac1a24a9767e3ce08c1ba07f5181ceb1..e0b31ecbd50e778b3e6663aff85f007abe2afff7 100644 (file)
@@ -1,3 +1,21 @@
+2010-03-27  Eli Zaretskii  <eliz@gnu.org>
+
+       * sedlisp.inp (VPATH): Don't edit, no longer needed.
+       (lisp, srcdir): Adapt to lisp/Makefile.in changes.
+       (abs_top_builddir): New edit.
+
+       * sed3v2.inp (KRB4LIB, DESLIB, KRB5LIB, CRYPTOLIB, COM_ERRLIB)
+       (LIBHESIOD, LIBRESOLV, LIBS_MAIL): Edit to empty values.
+
+       * sed3.inp (KRB4LIB, DESLIB, KRB5LIB, CRYPTOLIB, COM_ERRLIB)
+       (LIBHESIOD, LIBRESOLV, LIBS_MAIL): Edit to empty values.
+
+       * sed1v2.inp (abs_builddir): Edit into "../src".
+
+2010-03-10  Chong Yidong  <cyd@stupidchicken.com>
+
+       * Branch for 23.2.
+
 2010-02-19  Eli Zaretskii  <eliz@gnu.org>
 
        * INSTALL: Remove a CVS-specific note.  Update for latest versions
index b52b088b617a9f555a48710b2f3faae5de35584f..814a633ee2b79875d8a3e9972b7278f1576f574b 100644 (file)
@@ -29,6 +29,7 @@ s/\.h\.in/.h-in/
 /^MAKE *=/s/^/# /
 /^SHELL *=/s/^/# /
 /^srcdir *=/s/@[^@\n]*@/./
+/^abs_builddir *=/s|@abs_builddir@|../src|
 /^VPATH *=/s/@[^@\n]*@/./
 /^CC *=/s/@[^@\n]*@/gcc/
 /^CPP *=/s/@[^@\n]*@/gcc -e/
index 21a8e32ab8b66253137bbb638fee4367ef433b8d..8f97b309d2e6f0db5fc6b5167226e5f29c20d84a 100644 (file)
 /^libdir *=/s!=.*$!=/emacs/bin!
 /^srcdir *=/s!=.*$!=.!
 /^VPATH *=/s!=.*$!=.!
+/^KRB4LIB *=/s/@[^@\n]*@//g
+/^DESLIB *=/s/@[^@\n]*@//g
+/^KRB5LIB *=/s/@[^@\n]*@//g
+/^CRYPTOLIB *=/s/@[^@\n]*@//g
+/^COM_ERRLIB *=/s/@[^@\n]*@//g
+/^LIBHESIOD *=/s/@[^@\n]*@//g
+/^LIBRESOLV *=/s/@[^@\n]*@//g
+/^LIBS_MAIL *=/s/@[^@\n]*@//g
 /^CFLAGS *=/s!=.*$!=-O2 -g!
 /^C_SWITCH_SYSTEM *=/s!=.*$!=-DMSDOS!
 /^LOADLIBES *=/s!=.*$!=!
index faabfc8c30535b9baa4957f598f4dfc4b68310ee..5dcde810c825524438a7747746781f378d9292cc 100644 (file)
 /^libdir *=/s!=.*$!=/emacs/bin!
 /^srcdir=/s!srcdir=@srcdir@!srcdir := $(subst \\,/,$(shell command.com /c cd))!
 /^VPATH *=/s!=.*$!=.!
+/^KRB4LIB *=/s/@[^@\n]*@//g
+/^DESLIB *=/s/@[^@\n]*@//g
+/^KRB5LIB *=/s/@[^@\n]*@//g
+/^CRYPTOLIB *=/s/@[^@\n]*@//g
+/^COM_ERRLIB *=/s/@[^@\n]*@//g
+/^LIBHESIOD *=/s/@[^@\n]*@//g
+/^LIBRESOLV *=/s/@[^@\n]*@//g
+/^LIBS_MAIL *=/s/@[^@\n]*@//g
 /^CFLAGS *=/s!=.*$!=-O2 -g!
 /^C_SWITCH_SYSTEM *=/s!=.*$!=-DMSDOS!
 /^LOADLIBES *=/s!=.*$!=!
index f00ca986601c24d17d1367e14e1021b4613f1d9d..152dafbaa39226e470a3e59eed83680a3ee61d5d 100644 (file)
@@ -20,8 +20,9 @@
 /^SHELL *=/i\
 export FNCASE=y
 
-/^lisp=/s|@srcdir@|$(CURDIR)|
-/^VPATH=/s|@srcdir@|.|
-/^srcdir=/s|@srcdir@|.|
+/^lisp *=/s|\$(srcdir)|$(CURDIR)|
+/^srcdir *=/s|@srcdir@|.|
+/^top_srcdir *=/s|@top_srcdir@|./..|
+/^abs_top_builddir *=/s|@abs_top_builddir@|$(CURDIR)/..|
 
 # arch-tag: da7a3cff-4839-4ad7-bbe3-e2b61c84c38e
index 6e296cfc595c06dcd84a02acfbf215ebef712407..f49fa9aa0d50ac86ace8da6c8a8bffb6c0cfb489 100644 (file)
@@ -1,3 +1,7 @@
+2010-03-10  Chong Yidong  <cyd@stupidchicken.com>
+
+       * Branch for 23.2.
+
 2010-01-11  Glenn Morris  <rgm@gnu.org>
 
        * Cocoa/Emacs.base/Contents/Info.plist:
index 35df94e336abbebc6d43655a3622820156704ac7..f064a1248ea60b5ee8ed61448f2fa84ed1ef5980 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-Copyright (C) 2008, 2009  Free Software Foundation, Inc.
+Copyright (C) 2008, 2009, 2010  Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
@@ -553,7 +553,7 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
        <key>CFBundleExecutable</key>
        <string>Emacs</string>
        <key>CFBundleGetInfoString</key>
-       <string>Emacs 23.1.94 Copyright (C) 2010 Free Software Foundation, Inc.</string>
+       <string>Emacs 24.0.50 Copyright (C) 2010 Free Software Foundation, Inc.</string>
        <key>CFBundleIconFile</key>
        <string>Emacs.icns</string>
        <key>CFBundleIdentifier</key>
@@ -566,7 +566,7 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
        <string>APPL</string>
        <!-- This should be the emacs version number. -->
        <key>CFBundleShortVersionString</key>
-       <string>23.1.94</string>
+       <string>24.0.50</string>
        <key>CFBundleSignature</key>
        <string>EMAx</string>
        <!-- This SHOULD be a build number. -->
index 9f868885612cde29a5491e7afd34f3cfcd1fc084..197e42cb6fb921963869aeb106058a71b74bfc19 100644 (file)
@@ -1,6 +1,6 @@
 /* Localized versions of Info.plist keys */
 
 CFBundleName = "Emacs";
-CFBundleShortVersionString = "Version 23.1.94";
-CFBundleGetInfoString = "Emacs version 23.1.94, NS Windowing";
+CFBundleShortVersionString = "Version 24.0.50";
+CFBundleGetInfoString = "Emacs version 24.0.50, NS Windowing";
 NSHumanReadableCopyright = "Copyright (C) 2010 Free Software Foundation, Inc.";
index 3e7b2171649ca227745084bed14890c8c4a8cf1b..0131becdb6224974494e4224647f3b5206d23c6a 100644 (file)
@@ -1,7 +1,7 @@
 [Desktop Entry]
 Encoding=UTF-8
 Type=Application
-Version=23.1.94
+Version=24.0.50
 Categories=GNUstep
 Name=Emacs
 Comment=GNU Emacs for NeXT/Open/GNUstep and OS X
index e9477bb1b94d1648910af1694ec2b957f71f0a07..ade3f0117e6481fad29feb6378239588997cfeaa 100644 (file)
@@ -2,7 +2,7 @@
     ApplicationDescription = "GNU Emacs for GNUstep / OS X";
     ApplicationIcon = emacs.tiff;
     ApplicationName = Emacs;
-    ApplicationRelease = "23.1.94";
+    ApplicationRelease = "24.0.50";
     Authors = (
        "Adrian Robert (GNUstep)",
        "Christophe de Dinechin (MacOS X)",
@@ -13,7 +13,7 @@
     );
     Copyright = "Copyright (C) 2010 Free Software Foundation, Inc.";
     CopyrightDescription = "Released under the GNU General Public License Version 3 or later";
-    FullVersionID = "Emacs 23.1.94, NS Windowing";
+    FullVersionID = "Emacs 24.0.50, NS Windowing";
     NSExecutable = Emacs;
     NSIcon = emacs.tiff;
     NSPrincipalClass = NSApplication;
index 624cb960b40d5ae426bbdeeeb3594259417bb895..c4fddfee0b779b720a0359fbf92b7899f0f5c037 100644 (file)
@@ -1,3 +1,7 @@
+2010-03-10  Chong Yidong  <cyd@stupidchicken.com>
+
+       * Branch for 23.2.
+
 2010-01-13  Martin Rudalics  <rudalics@gmx.at>
 
        * emacsclient.rc: Fix format of "LegalCopyright" value.
index 1b7efabbceb4d46af81bc5d5dc6e4f9df405eb92..253065b47c47863a77c79c078571a8d5e07ca5d0 100644 (file)
@@ -7,8 +7,8 @@ Emacs ICON   icons\emacs.ico
 #endif
 
 VS_VERSION_INFO VERSIONINFO
- FILEVERSION 23,1,94,0
- PRODUCTVERSION 23,1,94,0
+ FILEVERSION 24,0,50,0
+ PRODUCTVERSION 24,0,50,0
  FILEFLAGSMASK 0x3FL
 #ifdef EMACSDEBUG
  FILEFLAGS 0x1L
@@ -25,12 +25,12 @@ BEGIN
        BEGIN
            VALUE "CompanyName", "Free Software Foundation\0"
            VALUE "FileDescription", "GNU Emacs: The extensible self-documenting text editor\0"
-           VALUE "FileVersion", "23, 1, 94, 0\0"
+           VALUE "FileVersion", "24, 0, 50, 0\0"
            VALUE "InternalName", "Emacs\0"
            VALUE "LegalCopyright", "Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010\0"
            VALUE "OriginalFilename", "emacs.exe"
            VALUE "ProductName", "Emacs\0"
-           VALUE "ProductVersion", "23, 1, 94, 0\0"
+           VALUE "ProductVersion", "24, 0, 50, 0\0"
            VALUE "OLESelfRegister", "\0"
         END
      END
index eaaf6f8049d5517ca637a16de6a5bdbef6087339..98f0bcd4f84fe9ed9e3a6390f7946d52aefcd475 100644 (file)
@@ -5,8 +5,8 @@ Emacs ICON   icons\emacs.ico
 #endif
 
 VS_VERSION_INFO VERSIONINFO
- FILEVERSION 23,1,94,0
- PRODUCTVERSION 23,1,94,0
+ FILEVERSION 24,0,50,0
+ PRODUCTVERSION 24,0,50,0
  FILEFLAGSMASK 0x3FL
 #ifdef EMACSDEBUG
  FILEFLAGS 0x1L
@@ -23,12 +23,12 @@ BEGIN
        BEGIN
            VALUE "CompanyName", "Free Software Foundation\0"
            VALUE "FileDescription", "GNU EmacsClient: Client for the extensible self-documenting text editor\0"
-           VALUE "FileVersion", "23, 1, 94, 0\0"
+           VALUE "FileVersion", "24, 0, 50, 0\0"
            VALUE "InternalName", "EmacsClient\0"
            VALUE "LegalCopyright", "Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010\0"
            VALUE "OriginalFilename", "emacsclientw.exe"
            VALUE "ProductName", "EmacsClient\0"
-           VALUE "ProductVersion", "23, 1, 94, 0\0"
+           VALUE "ProductVersion", "24, 0, 50, 0\0"
            VALUE "OLESelfRegister", "\0"
         END
      END
index bdf0957ef9d8d9ba76471f9c537b202f4807dade..e39f931e6e4aaca116133d26f38af25cdd73483c 100644 (file)
@@ -1,3 +1,7 @@
+2010-03-10  Chong Yidong  <cyd@stupidchicken.com>
+
+       * Branch for 23.2.
+
 2009-06-21  Chong Yidong  <cyd@stupidchicken.com>
 
        * Branch for 23.1.
index e8a64f5dfe419e5be586830448ced2f384b95fe4..b959baae8f3f86681273665c149ed00500371041 100644 (file)
@@ -271,6 +271,9 @@ define pitx
     end
   end
   printf "\n"
+  if ($it->bidi_p)
+    printf "BIDI: base_stop=%d prev_stop=%d level=%d\n", $it->base_level_stop, $it->prev_stop, $it->bidi_it.resolved_level
+  end
   if ($it->region_beg_charpos >= 0)
     printf "reg=%d-%d ", $it->region_beg_charpos, $it->region_end_charpos
   end
@@ -447,6 +450,36 @@ document pwin
 Pretty print window structure w.
 end
 
+define pbiditype
+  if ($arg0 == 0)
+    printf "UNDEF"
+  end
+  if ($arg0 == 1)
+    printf "L"
+  end
+  if ($arg0 == 2)
+    printf "R"
+  end
+  if ($arg0 == 3)
+    printf "EN"
+  end
+  if ($arg0 == 4)
+    printf "AN"
+  end
+  if ($arg0 == 5)
+    printf "BN"
+  end
+  if ($arg0 == 6)
+    printf "B"
+  end
+  if ($arg0 < 0 || $arg0 > 6)
+    printf "%d??", $arg0
+  end
+end
+document pbiditype
+Print textual description of bidi type given as first argument.
+end
+
 define pgx
   set $g = $arg0
   # CHAR_GLYPH
@@ -475,6 +508,11 @@ define pgx
   else
     printf " pos=%d", $g->charpos
   end
+  # For characters, print their resolved level and bidi type
+  if ($g->type == 0)
+    printf " blev=%d,btyp=", $g->resolved_level
+    pbiditype $g->bidi_type
+  end
   printf " w=%d a+d=%d+%d", $g->pixel_width, $g->ascent, $g->descent
   # If not DEFAULT_FACE_ID
   if ($g->face_id != 0)
@@ -575,6 +613,28 @@ document pgrowit
 Pretty print all glyphs in it->glyph_row.
 end
 
+define prowlims
+  printf "start=%d,end=%d,reversed=%d,cont=%d,at_zv=%d\n", $arg0->start.pos.charpos, $arg0->end.pos.charpos, $arg0->reversed_p, $arg0->continued_p, $arg0->ends_at_zv_p
+end
+document prowlims
+Print important attributes of a glyph_row structure.
+Takes one argument, a pointer to a glyph_row structure.
+end
+
+define pmtxrows
+  set $mtx = $arg0
+  set $gl = $mtx->rows
+  set $glend = $mtx->rows + $mtx->nrows
+  while ($gl < $glend)
+    prowlims $gl
+    set $gl = $gl + 1
+  end
+end
+document pmtxrows
+Print data about glyph rows in a glyph matrix.
+Takes one argument, a pointer to a glyph_matrix structure.
+end
+
 define xtype
   xgettype $
   output $type
index cb80f6f498dc212eff25fda316505f8ed55f4ccd..767780d6938f0a205293740fa51b8d542a9ad966 100644 (file)
@@ -1,13 +1,13 @@
-2010-03-30  Bernhard Herzog  <bh@intevation.de>  (tiny change)
+2010-03-31  Bernhard Herzog  <bh@intevation.de>  (tiny change)
 
        * menu.c (Fx_popup_menu): Use last_event_timestamp (Bug#4930).
 
-2010-03-30  Jan Djärv  <jan.h.d@swipnet.se>
+2010-03-31  Jan Djärv  <jan.h.d@swipnet.se>
 
        * xdisp.c (note_mouse_highlight): Don't do highlight if pointer is
        invisible (Bug#5766).
 
-2010-03-29  Adrian Robert  <adrian.b.robert@gmail.com>
+2010-03-31  Adrian Robert  <adrian.b.robert@gmail.com>
 
        * xdisp.c (x_consider_frame_title, update_window_cursor): Remove
        HAVE_NS conditionals.
 
        * nsterm.m: Remove unneeded prototype.
 
-2010-03-28  Glenn Morris  <rgm@gnu.org>
+2010-03-31  Glenn Morris  <rgm@gnu.org>
 
        * Makefile.in (SOME_MACHINE_OBJECTS): Ensure dbus stuff is always
        in the DOC file.  (Bug#5336)
 
-2010-03-24  Chong Yidong  <cyd@stupidchicken.com>
+2010-03-31  Chong Yidong  <cyd@stupidchicken.com>
 
        * xdisp.c (pos_visible_p): Revert 2008-01-25 change (Bug#5730).
 
-2010-03-20  Jan Djärv  <jan.h.d@swipnet.se>
+2010-03-31  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * window.c (keys_of_window): Remove redundant/overridden bindings.
+
+2010-03-30  Eli Zaretskii  <eliz@gnu.org>
+
+       * xdisp.c (BUFFER_POS_REACHED_P, move_it_in_display_line_to):
+       Restore original behavior when the iterator is not bidi_p.
+
+2010-03-30  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * xdisp.c (syms_of_xdisp): Use intern_c_string instead of intern.
+
+2010-03-30  Eli Zaretskii  <eliz@gnu.org>
+
+       * bidi.c (bidi_cache_iterator_state): Invalidate the cache if we
+       are outside the range of cached character positions.
+
+2010-03-30  Juanma Barranquero  <lekktu@gmail.com>
+
+       * makefile.w32-in ($(BLD)/bidi.$(O)): Add dependency on w32gui.h.
+
+2010-03-30  Eli Zaretskii  <eliz@gnu.org>
+
+       Initial support for bidirectional editing.
+
+       * Makefile.in (obj): Include bidi.o.
+       (bidi.o): New target.
+
+       * makefile.w32-in (OBJ1): Add $(BLD)/bidi.$(O).
+       ($(BLD)/bidi.$(O)): New target.
+
+       * bidi.c: New file.
+
+       * buffer.h (struct buffer): New members bidi_display_reordering
+       and bidi_paragraph_direction.
+
+       * buffer.c (init_buffer_once): Initialize bidi_display_reordering
+       and bidi_paragraph_direction.
+       (syms_of_buffer): Declare Lisp variables bidi-display-reordering
+       and bidi-paragraph-direction.
+       (Fbuffer_swap_text): Swap the values of
+       bidi_display_reordering and bidi_paragraph_direction.
+
+       * dispextern.h (BIDI_MAXLEVEL, BIDI_AT_BASE_LEVEL): New macros.
+       (bidi_type_t, bidi_dir_t): New types.
+       (bidi_saved_info, bidi_stack, bidi_it): New structures.
+       (struct it): New members bidi_p, bidi_it, paragraph_embedding,
+       prev_stop, base_level_stop, and eol_pos.
+       (bidi_init_it, bidi_get_next_char_visually): New prototypes.
+       (IT_STACK_SIZE): Enlarge to 5.
+       (struct glyph_row): New member reversed_p.
+       <string_buffer_position>: Update prototype.
+       (PRODUCE_GLYPHS): Set the reversed_p flag in the iterator's
+       glyph_row if bidi_it.paragraph_dir == R2L.
+       (struct glyph): New members resolved_level and bidi_type.
+
+       * dispnew.c (direct_output_forward_char): Give up if we need bidi
+       processing or buffer's direction is right-to-left.
+       (prepare_desired_row): Preserve the reversed_p flag.
+       (row_equal_p): Compare the reversed_p attributes as well.
+
+       * xdisp.c (init_iterator): Initialize it->bidi_p.  Call
+       bidi_init_it and set it->paragraph_embedding from the current
+       buffer's value of bidi_paragraph_direction.
+       (reseat_1): Initialize bidi_it.first_elt.
+       (set_iterator_to_next, next_element_from_buffer): Use the value of
+       paragraph_embedding to determine the paragraph direction.
+       (set_iterator_to_next): Under bidi reordering, call
+       bidi_get_next_char_visually.  Call bidi_paragraph_init if the
+       new_paragraph flag is set in the bidi iterator.
+       (next_element_from_buffer): If bidi_it.first_elt is set,
+       initialize paragraph direction and find the first character to
+       display in the visual order.  If reseated to a middle of a line,
+       prime the bidi iterator starting at the line's beginning.  Handle
+       the situation where we overstepped stop_charpos due to
+       non-linearity of the bidi iteration.  Likewise for when we back up
+       beyond the previous stop_charpos.  When moving across stop_charpos,
+       record it in prev_stop.
+       (display_line): Set row->end and it->start for the next row to the
+       next character in logical order.  Always extend reversed_p rows to
+       the end of line, even if they end at ZV.  Copy the reversed_p flag
+       to the next glyph row.  Keep calling set_cursor_from_row for
+       bidi-reordered rows even if we already have a possible candidate
+       for cursor position.  Set row_end after all the row's glyphs have
+       been produced, by looping over the glyphs.  Record the position
+       after EOL in it->eol_pos, and use it to set end_pos of the last
+       row produced for a continued line.
+       <Qright_to_left, Qleft_to_right>: New variables.
+       (syms_of_xdisp): Initialize and staticpro them.
+       (string_buffer_position_lim): New function.
+       (string_buffer_position): Most of code moved to
+       string_buffer_position_lim.  Last argument and return value are
+       now EMACS_INT; all callers changed.
+       (set_cursor_from_row): Rewritten to support bidirectional text and
+       reversed glyph rows.
+       (text_outside_line_unchanged_p, try_window_id): Disable
+       optimizations if we are reordering bidirectional text and the
+       paragraph direction can be affected by the change.
+       (append_glyph, append_composite_glyph)
+       (produce_image_glyph, append_stretch_glyph): Set the
+       resolved_level and bidi_type members of each glyph.
+       (append_glyph): If the glyph row is reversed, prepend the glyph
+       rather than appending it.
+       (handle_stop_backwards): New function.
+       (reseat_1, pop_it, push_it): Set prev_stop and base_level_stop.
+       (reseat): call handle_stop_backwards to recompute prev_stop and
+       base_level_stop for the new position.
+       (handle_invisible_prop): Under bidi iteration, skip invisible text
+       using bidi_get_next_char_visually.  If we are `reseat'ed, init the
+       paragraph direction.  Update IT->prev_stop after skipping
+       invisible text.
+       (move_it_in_display_line_to): New variables prev_method
+       and prev_pos.  Compare for strict equality in
+       BUFFER_POS_REACHED_P.
+       (try_cursor_movement): Examine all the candidate rows that occlude
+       point, to return the best match.  If rows are bidi-reordered
+       and point moved backwards, back up to the row that is not a
+       continuation line, and start looking for a suitable row from
+       there.
+
+       * term.c (append_glyph): Reverse glyphs by pre-pending them,
+       rather than appending, if the glyph_row's reversed_p flag is set.
+       Set the resolved_level and bidi_type members of each glyph.
+
+       * .gdbinit (pbiditype): New command.
+       (pgx): Use it to display bidi level and type of the glyph.
+       (pitx): Display some bidi information about the iterator.
+       (prowlims, pmtxrows): New commands.
+
+2010-03-30  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       Remove all uses of C_DEBUG_SWITCH and LIBS_DEBUG.
+       * s/usg5-4.h (LIBS_DEBUG):
+       * s/irix6-5.h (C_DEBUG_SWITCH):
+       * s/gnu-linux.h (LIBS_DEBUG):
+       * s/darwin.h (LIBS_DEBUG):
+       * s/bsd-common.h (LIBS_DEBUG):
+       * s/aix4-2.h (LIBS_DEBUG, C_DEBUG_SWITCH):
+       * m/iris4d.h (LIBS_DEBUG):
+       * m/hp800.h (LIBS_DEBUG): Remove definitions.
+
+       * Makefile.in (LIBES): Remove reference to LIBS_DEBUG.
+       (LIBS_DEBUG): Remove definition.
+
+2010-03-27  Chong Yidong  <cyd@stupidchicken.com>
+
+       * process.c (Fmake_network_process): Don't apply Bug#5173 fix for
+       Windows.
+
+2010-03-25  YAMAMOTO Mitsuharu  <mituharu@math.s.chiba-u.ac.jp>
+
+       * process.c (Fmake_network_process): Don't call turn_on_atimers around
+       `connect' (Bug#5723).
+
+2010-03-25  Helmut Eller  <eller.helmut@gmail.com>
+
+       * process.c (Fmake_network_process): Call `select' for interrupted
+       `connect' rather than creating new socket (Bug#5173).
+
+2010-03-24  Jan Djärv  <jan.h.d@swipnet.se>
 
        * frame.c (x_get_arg): Handle RES_TYPE_BOOLEAN_NUMBER (bug #5736).
 
 
        * dispextern.h (resource_types): RES_TYPE_BOOLEAN_NUMBER is new.
 
-2010-03-20  YAMAMOTO Mitsuharu  <mituharu@math.s.chiba-u.ac.jp>
+2010-03-24  YAMAMOTO Mitsuharu  <mituharu@math.s.chiba-u.ac.jp>
 
        * xfns.c (Fx_create_frame) [USE_LUCID]: Add BLOCK_INPUT around
        XLoadQueryFont.
 
-2010-03-16  Kenichi Handa  <handa@m17n.org>
+2010-03-24  Kenichi Handa  <handa@m17n.org>
 
        * coding.c (decode_coding_ccl): Fix previous change for the
        multibyte case.
        case that the output buffer is fullfilled.
        (encode_coding): Setup ccl program here.
 
-2010-03-15  Andreas Politz  <politza@fh-trier.de>  (tiny change)
+2010-03-24  Andreas Politz  <politza@fh-trier.de>  (tiny change)
 
        * editfns.c (Fformat): Account for string precision when computing
        field width (Bug#5710).
 
+2010-03-23  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * s/gnu-linux.h (LIBS_SYSTEM): Remove, same as default.
+
+       Simplify LIBS_MACHINE definitions.
+       * m/hp800.h (LIBS_MACHINE): Remove, same as default.
+       * m/iris4d.h (LIBS_MACHINE): Likewise.
+       * m/ibmrs6000.h (LIBS_MACHINE): Rename to LIBS_SYSTEM and move ...
+       * s/aix4-2.h (LIBS_SYSTEM): ... here.
+       * s/netbsd.h: Remove commented out code.
+
+2010-03-22  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       Remove dead code dealing with POSIX_SIGNALS.
+       * atimer.c (set_alarm): Remove dead code, all USG systems define
+       POSIX_SIGNALS.
+       * data.c (arith_error): Likewise.
+       * keyboard.c (input_available_signal, handle_user_signal)
+       (interrupt_signal): Likewise.
+       * process.c (sigchld_handler): Likewise.
+       (create_process): Remove if 0 code.  Remove HPUX conditional when
+       !defined (POSIX_SIGNALS), it cannot be true.
+       * syssignal.h: Remove USG5_4 and USG conditionals when
+       !POSIX_SIGNALS, they cannot be true.
+
+       * keyboard.c (Fset_input_interrupt_mode): Remove code depending on
+       NO_SOCK_SIGIO, not used anymore.
+
+2010-03-21  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * m/vax.h (BSD_SYSTEM, BSD4_2): Remove conditionals, we only
+       support vax on BSDs.
+
+       * m/ibmrs6000.h (ORDINARY_LINK): Move definition ...
+       * s/aix4-2.h (ORDINARY_LINK): ... here.
+
+2010-03-21  Andreas Schwab  <schwab@linux-m68k.org>
+
+       * Makefile.in (abs_builddir): Define.
+       (bootstrap_exe): Use it.
+       (VPATH): Use $(srcdir) instead of @srcdir@.
+
+2010-03-20  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * Makefile.in (bootstrap_exe): Use an absolute name.
+
+2010-03-20  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       Remove support for old GNU/Linux using libc version 5.
+       * m/alpha.h (LINUX_SBRK_BUG): Remove definition.
+       * emacs.c (main): Remove code depending on LINUX_SBRK_BUG.
+
+       Consolidate redundant definitions in s/bsd-common.h.
+       * s/bsd-common.h (BSD4_2, TABDLY, TAB3, HAVE_TERMIOS, NO_TERMIO)
+       (LIBS_DEBUG, SYSV_SYSTEM_DIR, UNEXEC, NARROWPROTO, BSD_PGRPS)
+       (LDAV_SYMBOL, KERNEL_FILE): Define (or undefine) here instead of
+       doing it in all files that include this one.
+       * s/gnu.h (BSD4_2, TABDLY, TAB3, HAVE_TERMIOS, NO_TERMIO)
+       (LIBS_DEBUG, SYSV_SYSTEM_DIR, UNEXEC, NARROWPROTO, BSD_PGRPS)
+       (LDAV_SYMBOL, KERNEL_FILE): Remove.
+       * s/freebsd.h (BSD4_2, TABDLY, TAB3, HAVE_TERMIOS, NO_TERMIO)
+       (LIBS_DEBUG, SYSV_SYSTEM_DIR, UNEXEC, NARROWPROTO, BSD_PGRPS)
+       (LDAV_SYMBOL, KERNEL_FILE): Remove.
+       * s/netbsd.h (BSD4_2, TABDLY, TAB3, HAVE_TERMIOS, NO_TERMIO)
+       (LIBS_DEBUG, SYSV_SYSTEM_DIR, UNEXEC, NARROWPROTO, BSD_PGRPS)
+       (LDAV_SYMBOL, KERNEL_FILE): Remove.
+
+       Consolidate redundant definitions.
+       * s/usg5-4.h (sigsetmask, PTY_TTY_NAME_SPRINTF): Do not define,
+       it's undefined in all files that include this one.
+       (POSIX_SIGNALS): Define here instead of doing it in all files that
+       include this one.
+       * s/irix6-5.h (sigsetmask, PTY_TTY_NAME_SPRINTF): Do not undef.
+       (POSIX_SIGNALS): Do not define.
+       * s/sol2-6.h (sigsetmask, PTY_TTY_NAME_SPRINTF): Do not undef.
+       (POSIX_SIGNALS): Do not define.
+       * s/unixware.h (sigsetmask, PTY_TTY_NAME_SPRINTF): Do not undef.
+       (POSIX_SIGNALS): Do not define.
+
+       Remove support for old UNIX System V systems.
+       * s/unixware.h: Add the contents of s/usg-5-4-2.h.
+       * s/usg-5-4-2.h: Remove.
+
+       Remove support for Solaris on PPC and for old versions.
+       * s/sol2-6.h: Add the contents of s/sol-2.3.h, s/sol-2.4.h, s/sol-2.5.h.
+       (LD_SWITCH_SYSTEM, USE_MMAP_FOR_BUFFERS): Remove #defines/#undef
+       that cancel each other.
+       * s/sol2-3.h:
+       * s/sol2-4.h:
+       * s/sol2-5.h: Remove.
+       * m/ibmrs6000.h: Remove code for USG5_4, this file is only used on AIX.
+       (NO_REMAP): Remove, unused.
+       (UNEXEC): Move definition ...
+       * s/aix4-2.h (UNEXEC): ... here.
+
+       * s/openbsd.h: Remove support for non-ELF and for systems that do
+       not support shared libraries.
+       * s/netbsd.h:
+       * s/freebsd.h: Likewise.
+
+2010-03-20  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       Remove non-working support for lynxos 3.0.
+       * s/lynxos.h: Remove file.
+
+       * unexec.c (unexec, adjust_lnnoptrs): Do not depend on
+       COFF_BSD_SYMBOLS, nothing defines it anymore.
+
+2010-03-20  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       Remove obsolete uses of HAVE_SHM.
+       * emacs.c (standard_args):
+       (Fdump_emacs):
+       (syms_of_emacs): Remove code depending on HAVE_SHM.
+
+       * alloc.c: Remove HAVE_SHM dependent definition.
+
+       * Makefile.in (RUN_TEMACS): Do not depend on HAVE_SHM.
+
+2010-03-18  Glenn Morris  <rgm@gnu.org>
+
+       * emacs.c (USAGE4): Hard-code bug address.
+       (REPORT_EMACS_BUG_ADDRESS, REPORT_EMACS_BUG_PRETEST_ADDRESS): Remove.
+       (bug_reporting_address): Remove.
+       (main): Don't call bug_reporting_address.
+
+       * Makefile.in (XFT_LIBS, LIBXPM, LIBJPEG, LIBPNG, LIBTIFF, LIBGIF)
+       (LIBGPM, LIBRESOLV): Set using autoconf rather than cpp.
+
+2010-03-15  Chong Yidong  <cyd@stupidchicken.com>
+
+       * xfns.c (Fx_create_frame):
+       * frame.c (Vdefault_frame_scroll_bars): Put non-GTK X scroll-bars
+       on left.
+
+2010-03-13  Andreas Politz  <politza@fh-trier.de>  (tiny change)
+
+       * editfns.c (Fformat): Account for string precision when computing
+       field width (Bug#5710).
+
+2010-03-12  Chong Yidong  <cyd@stupidchicken.com>
+
+       * xfns.c (Fx_create_frame): Set default to Qright.
+
+       * frame.c (Vdefault_frame_scroll_bars): Set default to Qright for
+       all window systems.
+
+2010-03-12  Eli Zaretskii  <eliz@gnu.org>
+
+       These changes remove termcap.c from the build on Posix platforms.
+       * Makefilie.in (termcapobj): Move termcap.o from here...
+       (MSDOS_OBJ): ...to here.
+       (termcapobj) [!LIBS_TERMCAP]: Remove specialized value, as it is
+       now identical to when LIBS_TERMCAP is defined.
+
+       * term.c: Remove (ifdef'ed away) inclusion of termcap.h.
+
+       * cm.c: Remove (ifdef'ed away) inclusion of termcap.h.
+
+       * config.in: Regenerated.  (See top-level ChangeLog.)
+
+2010-03-10  Chong Yidong  <cyd@stupidchicken.com>
+
+       * Branch for 23.2.
+
+2010-03-10  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       Cleanup setup of gl_state in various parts of the code.
+       * syntax.h (SETUP_BUFFER_SYNTAX_TABLE): New macro.
+       (SETUP_SYNTAX_TABLE, SETUP_SYNTAX_TABLE_FOR_OBJECT):
+       * syntax.c (find_defun_start, Fchar_syntax, Fmatching_paren)
+       (skip_chars):
+       * regex.c (regex_compile): Use it.
+       (re_compile_pattern): Don't set gl_state.current_syntax_table since
+       it's now set in regex_compile when/if we need it.
+
 2010-03-05  Stefan Monnier  <monnier@iro.umontreal.ca>
 
        Make it possible to C-g in a tight bytecode loop again (bug#5680).
index 9caa01d9066e872836d861f186de63c72d60ea7a..2305f6f653336696651ec6a1120d4b40e189de98 100644 (file)
 
 # Here are the things that we expect ../configure to edit.
 # We use $(srcdir) explicitly in dependencies so as not to depend on VPATH.
-srcdir=@srcdir@
-VPATH=@srcdir@
-CC=@CC@
-CPP=@CPP@
-CFLAGS=@CFLAGS@
-CPPFLAGS=@CPPFLAGS@
-LDFLAGS=@LDFLAGS@
-LN_S=@LN_S@
-EXEEXT=@EXEEXT@
-version=@version@
+srcdir = @srcdir@
+abs_builddir = @abs_builddir@
+VPATH = $(srcdir)
+CC = @CC@
+CPP = @CPP@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LN_S = @LN_S@
+EXEEXT = @EXEEXT@
+version = @version@
 # Substitute an assignment for the MAKE variable, because
 # BSD doesn't have it as a default.
 @SET_MAKE@
@@ -63,7 +64,7 @@ M_FILE = ${srcdir}/@machfile@
 S_FILE = ${srcdir}/@opsysfile@
 config_h = config.h $(M_FILE) $(S_FILE)
 
-bootstrap_exe = ../src/bootstrap-emacs${EXEEXT}
+bootstrap_exe = ${abs_builddir}/bootstrap-emacs${EXEEXT}
 
 OTHER_FILES = @OTHER_FILES@
 
@@ -126,11 +127,6 @@ DEPFLAGS = -MMD -MF deps/$*.d
 #define LIB_STANDARD
 #endif
 
-/* Unless inhibited or changed, use -lg to link for debugging.  */
-#ifndef LIBS_DEBUG
-#define LIBS_DEBUG -lg
-#endif
-
 /* Some s/SYSTEM.h files define this to request special libraries.  */
 #ifndef LIBS_SYSTEM
 #define LIBS_SYSTEM
@@ -369,76 +365,16 @@ LIBXT=$(LIBW)
 #endif
 #endif /* not USE_X_TOOLKIT */
 
-#if HAVE_XFT
-XFT_LIBS=@XFT_LIBS@
-#endif /* HAVE_XFT */
-
-#if HAVE_XPM
-#ifndef LIBXPM
-#define LIBXPM -lXpm
-#endif /* not defined LIBXPM */
-#else /* not HAVE_XPM */
-#define LIBXPM
-#endif /* not HAVE_XPM */
-
-#if HAVE_JPEG
-#ifndef LIBJPEG
-#define LIBJPEG -ljpeg
-#endif /* not defined LIBJPEG */
-#else /* not HAVE_JPEG */
-#define LIBJPEG
-#endif /* not HAVE_JPEG */
-
-#if HAVE_PNG
-#ifndef LIBPNG
-#define LIBPNG -lpng -lz -lm
-#endif /* not defined LIBPNG */
-#else /* not HAVE_PNG */
-#define LIBPNG
-#endif /* not HAVE_PNG */
-
-#if HAVE_TIFF
-#ifndef LIBTIFF
-#define LIBTIFF -ltiff
-#endif /* not defined LIBTIFF */
-#else /* not HAVE_TIFF */
-#define LIBTIFF
-#endif /* not HAVE_TIFF */
-
-#if HAVE_GIF
-#ifndef LIBGIF
-#define LIBGIF -lgif
-#endif /* not defined LIBGIF */
-#else /* not HAVE_GIF */
-#define LIBGIF
-#endif /* not HAVE_GIF */
-
 #ifdef HAVE_X11
 /* LD_SWITCH_X_DEFAULT comes after everything else that specifies
    options for where to find X libraries, but before those libraries.  */
 X11_LDFLAGS = LD_SWITCH_X_SITE LD_SWITCH_X_DEFAULT
-LIBX= $(LIBXMENU) $(X11_LDFLAGS) $(LIBXT) LIBTIFF LIBJPEG LIBPNG LIBGIF LIBXPM LIB_X11_LIB LIBX11_SYSTEM $(XFT_LIBS)
+LIBX= $(LIBXMENU) $(X11_LDFLAGS) $(LIBXT) @LIBTIFF@ @LIBJPEG@ @LIBPNG@ @LIBGIF@ @LIBXPM@ LIB_X11_LIB LIBX11_SYSTEM @XFT_LIBS@
 #else /* not HAVE_X11 */
 LIBX= $(LIBXMENU) LD_SWITCH_X_SITE
 #endif /* not HAVE_X11 */
 #endif /* not HAVE_X_WINDOWS */
 
-#if HAVE_GPM
-#ifndef LIBGPM
-#define LIBGPM -lgpm
-#endif /* not defined LIBGPM */
-#else /* not HAVE_GPM */
-#define LIBGPM
-#endif /* not HAVE_GPM */
-
-#if HAVE_LIBRESOLV
-#ifndef LIBRESOLV
-#define LIBRESOLV -lresolv
-#endif /* not defined LIBRESOLV */
-#else /* not HAVE_LIBRESOLV */
-#define LIBRESOLV
-#endif /* not HAVE_LIBRESOLV */
-
 LIBSOUND= @LIBSOUND@
 CFLAGS_SOUND= @CFLAGS_SOUND@
 
@@ -527,7 +463,7 @@ GETLOADAVG_LIBS = @GETLOADAVG_LIBS@
 #ifdef HAVE_X_WINDOWS
 MSDOS_OBJ = dosfns.o msdos.o xmenu.o
 #else
-MSDOS_OBJ = dosfns.o msdos.o w16select.o xmenu.o
+MSDOS_OBJ = dosfns.o msdos.o w16select.o xmenu.o termcap.o
 #endif
 #endif
 
@@ -560,7 +496,7 @@ FONT_DRIVERS = xfont.o
 /* lastfile must follow all files
    whose initialized data areas should be dumped as pure by dump-emacs.  */
 obj=    dispnew.o frame.o scroll.o xdisp.o menu.o $(XMENU_OBJ) window.o \
-       charset.o coding.o category.o ccl.o character.o chartab.o \
+       charset.o coding.o category.o ccl.o character.o chartab.o bidi.o \
        cm.o term.o terminal.o xfaces.o $(XOBJ) $(GTK_OBJ) $(DBUS_OBJ) \
        emacs.o keyboard.o macros.o keymap.o sysdep.o \
        buffer.o filelock.o insdel.o marker.o \
@@ -595,10 +531,8 @@ termcapobj = terminfo.o
 #else /* ! defined (TERMINFO) */
 #ifndef LIBS_TERMCAP
 #define LIBS_TERMCAP
-termcapobj = termcap.o tparam.o
-#else /* LIBS_TERMCAP */
-termcapobj = tparam.o
 #endif /* LIBS_TERMCAP */
+termcapobj = tparam.o
 #endif /* ! defined (TERMINFO) */
 
 
@@ -910,16 +844,12 @@ SOME_MACHINE_LISP = ../lisp/mouse.elc \
    with GCC, we might need gnulib again after them.  */
 
 LIBES = $(LOADLIBES) $(LIBS) $(LIBX) $(LIBSOUND) $(RSVG_LIBS) $(DBUS_LIBS) \
-   LIBGPM LIBRESOLV LIBS_SYSTEM LIBS_MACHINE LIBS_TERMCAP \
-   LIBS_DEBUG $(GETLOADAVG_LIBS) ${GCONF_LIBS} \
+   @LIBGPM@ @LIBRESOLV@ LIBS_SYSTEM LIBS_MACHINE LIBS_TERMCAP \
+   $(GETLOADAVG_LIBS) ${GCONF_LIBS} \
    @FREETYPE_LIBS@ @FONTCONFIG_LIBS@ @LIBOTF_LIBS@ @M17N_FLT_LIBS@ \
    $(GNULIB_VAR) LIB_MATH LIB_STANDARD $(GNULIB_VAR)
 
-#ifdef HAVE_SHM
-RUN_TEMACS = `/bin/pwd`/temacs -nl
-#else
 RUN_TEMACS = `/bin/pwd`/temacs
-#endif
 
 all: emacs${EXEEXT} $(OTHER_FILES)
 
@@ -1052,6 +982,7 @@ doc.o: buildobj.h
 
 atimer.o: atimer.c atimer.h syssignal.h systime.h lisp.h blockinput.h \
  $(config_h)
+bidi.o: bidi.c buffer.h character.h dispextern.h lisp.h $(config_h)
 buffer.o: buffer.c buffer.h region-cache.h commands.h window.h \
    $(INTERVALS_H) blockinput.h atimer.h systime.h character.h \
    indent.h keyboard.h coding.h keymap.h frame.h lisp.h $(config_h)
index 9a935cc8952f111873c7371e19001a577020aeff..98d60067f9ee99fdcbe68bd84b8db974c61a2929 100644 (file)
@@ -257,8 +257,6 @@ Lisp_Object Vpurify_flag;
 
 Lisp_Object Vmemory_full;
 
-#ifndef HAVE_SHM
-
 /* Initialize it to a nonzero value to force it into data space
    (rather than bss space).  That way unexec will remap it into text
    space (pure), on some systems.  We have not implemented the
@@ -268,13 +266,6 @@ Lisp_Object Vmemory_full;
 EMACS_INT pure[(PURESIZE + sizeof (EMACS_INT) - 1) / sizeof (EMACS_INT)] = {1,};
 #define PUREBEG (char *) pure
 
-#else /* HAVE_SHM */
-
-#define pure PURE_SEG_BITS   /* Use shared memory segment */
-#define PUREBEG (char *)PURE_SEG_BITS
-
-#endif /* HAVE_SHM */
-
 /* Pointer to the pure area, and its size.  */
 
 static char *purebeg;
index 432e2590dad83d7ccb26acd51c9228b42fb03e85..556272d79181aec92c32f32df45d50bbdd529b6a 100644 (file)
@@ -296,12 +296,6 @@ unwind_stop_other_atimers (dummy)
 static void
 set_alarm ()
 {
-#if defined (USG) && !defined (POSIX_SIGNALS)
-  /* USG systems forget handlers when they are used;
-     must reestablish each time.  */
-  signal (SIGALRM, alarm_signal_handler);
-#endif /* USG */
-
   if (atimers)
     {
       EMACS_TIME now, time;
diff --git a/src/bidi.c b/src/bidi.c
new file mode 100644 (file)
index 0000000..ea47cd3
--- /dev/null
@@ -0,0 +1,2032 @@
+/* Low-level bidirectional buffer-scanning functions for GNU Emacs.
+   Copyright (C) 2000, 2001, 2004, 2005, 2009, 2010
+   Free Software Foundation, Inc.
+
+This file is part of GNU Emacs.
+
+GNU Emacs is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+GNU Emacs is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Written by Eli Zaretskii <eliz@gnu.org>.
+
+   A sequential implementation of the Unicode Bidirectional algorithm,
+   as per UAX#9, a part of the Unicode Standard.
+
+   Unlike the reference and most other implementations, this one is
+   designed to be called once for every character in the buffer.
+
+   The main entry point is bidi_get_next_char_visually.  Each time it
+   is called, it finds the next character in the visual order, and
+   returns its information in a special structure.  The caller is then
+   expected to process this character for display or any other
+   purposes, and call bidi_get_next_char_visually for the next
+   character.  See the comments in bidi_get_next_char_visually for
+   more details about its algorithm that finds the next visual-order
+   character by resolving their levels on the fly.
+
+   If you want to understand the code, you will have to read it
+   together with the relevant portions of UAX#9.  The comments include
+   references to UAX#9 rules, for that very reason.
+
+   A note about references to UAX#9 rules: if the reference says
+   something like "X9/Retaining", it means that you need to refer to
+   rule X9 and to its modifications decribed in the "Implementation
+   Notes" section of UAX#9, under "Retaining Format Codes".  */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#include <setjmp.h>
+
+#include "lisp.h"
+#include "buffer.h"
+#include "character.h"
+#include "dispextern.h"
+
+static int bidi_initialized = 0;
+
+static Lisp_Object bidi_type_table;
+
+/* FIXME: Remove these when bidi_explicit_dir_char uses a lookup table.  */
+#define LRM_CHAR   0x200E
+#define RLM_CHAR   0x200F
+#define LRE_CHAR   0x202A
+#define RLE_CHAR   0x202B
+#define PDF_CHAR   0x202C
+#define LRO_CHAR   0x202D
+#define RLO_CHAR   0x202E
+
+#define BIDI_EOB   -1
+#define BIDI_BOB   -2          /* FIXME: Is this needed? */
+
+/* Local data structures.  (Look in dispextern.h for the rest.)  */
+
+/* What we need to know about the current paragraph.  */
+struct bidi_paragraph_info {
+  int start_bytepos;   /* byte position where it begins */
+  int end_bytepos;     /* byte position where it ends */
+  int embedding_level; /* its basic embedding level */
+  bidi_dir_t base_dir; /* its base direction */
+};
+
+/* Data type for describing the bidirectional character categories.  */
+typedef enum {
+  UNKNOWN_BC,
+  NEUTRAL,
+  WEAK,
+  STRONG
+} bidi_category_t;
+
+int bidi_ignore_explicit_marks_for_paragraph_level = 1;
+
+static Lisp_Object fallback_paragraph_start_re, fallback_paragraph_separate_re;
+static Lisp_Object Qparagraph_start, Qparagraph_separate;
+
+static void
+bidi_initialize ()
+{
+  /* FIXME: This should come from the Unicode Database.  */
+  struct {
+    int from, to;
+    bidi_type_t type;
+  } bidi_type[] =
+      { { 0x0000, 0x0008, WEAK_BN },
+       { 0x0009, 0x0000, NEUTRAL_S },
+       { 0x000A, 0x0000, NEUTRAL_B },
+       { 0x000B, 0x0000, NEUTRAL_S },
+       { 0x000C, 0x0000, NEUTRAL_WS },
+       { 0x000D, 0x0000, NEUTRAL_B },
+       { 0x000E, 0x001B, WEAK_BN },
+       { 0x001C, 0x001E, NEUTRAL_B },
+       { 0x001F, 0x0000, NEUTRAL_S },
+       { 0x0020, 0x0000, NEUTRAL_WS },
+       { 0x0021, 0x0022, NEUTRAL_ON },
+       { 0x0023, 0x0025, WEAK_ET },
+       { 0x0026, 0x002A, NEUTRAL_ON },
+       { 0x002B, 0x0000, WEAK_ES },
+       { 0x002C, 0x0000, WEAK_CS },
+       { 0x002D, 0x0000, WEAK_ES },
+       { 0x002E, 0x002F, WEAK_CS },
+       { 0x0030, 0x0039, WEAK_EN },
+       { 0x003A, 0x0000, WEAK_CS },
+       { 0x003B, 0x0040, NEUTRAL_ON },
+       { 0x005B, 0x0060, NEUTRAL_ON },
+       { 0x007B, 0x007E, NEUTRAL_ON },
+       { 0x007F, 0x0084, WEAK_BN },
+       { 0x0085, 0x0000, NEUTRAL_B },
+       { 0x0086, 0x009F, WEAK_BN },
+       { 0x00A0, 0x0000, WEAK_CS },
+       { 0x00A1, 0x0000, NEUTRAL_ON },
+       { 0x00A2, 0x00A5, WEAK_ET },
+       { 0x00A6, 0x00A9, NEUTRAL_ON },
+       { 0x00AB, 0x00AC, NEUTRAL_ON },
+       { 0x00AD, 0x0000, WEAK_BN },
+       { 0x00AE, 0x00Af, NEUTRAL_ON },
+       { 0x00B0, 0x00B1, WEAK_ET },
+       { 0x00B2, 0x00B3, WEAK_EN },
+       { 0x00B4, 0x0000, NEUTRAL_ON },
+       { 0x00B6, 0x00B8, NEUTRAL_ON },
+       { 0x00B9, 0x0000, WEAK_EN },
+       { 0x00BB, 0x00BF, NEUTRAL_ON },
+       { 0x00D7, 0x0000, NEUTRAL_ON },
+       { 0x00F7, 0x0000, NEUTRAL_ON },
+       { 0x02B9, 0x02BA, NEUTRAL_ON },
+       { 0x02C2, 0x02CF, NEUTRAL_ON },
+       { 0x02D2, 0x02DF, NEUTRAL_ON },
+       { 0x02E5, 0x02ED, NEUTRAL_ON },
+       { 0x0300, 0x036F, WEAK_NSM },
+       { 0x0374, 0x0375, NEUTRAL_ON },
+       { 0x037E, 0x0385, NEUTRAL_ON },
+       { 0x0387, 0x0000, NEUTRAL_ON },
+       { 0x03F6, 0x0000, NEUTRAL_ON },
+       { 0x0483, 0x0489, WEAK_NSM },
+       { 0x058A, 0x0000, NEUTRAL_ON },
+       { 0x0591, 0x05BD, WEAK_NSM },
+       { 0x05BE, 0x0000, STRONG_R },
+       { 0x05BF, 0x0000, WEAK_NSM },
+       { 0x05C0, 0x0000, STRONG_R },
+       { 0x05C1, 0x05C2, WEAK_NSM },
+       { 0x05C3, 0x0000, STRONG_R },
+       { 0x05C4, 0x05C5, WEAK_NSM },
+       { 0x05C6, 0x0000, STRONG_R },
+       { 0x05C7, 0x0000, WEAK_NSM },
+       { 0x05D0, 0x05F4, STRONG_R },
+       { 0x060C, 0x0000, WEAK_CS },
+       { 0x061B, 0x064A, STRONG_AL },
+       { 0x064B, 0x0655, WEAK_NSM },
+       { 0x0660, 0x0669, WEAK_AN },
+       { 0x066A, 0x0000, WEAK_ET },
+       { 0x066B, 0x066C, WEAK_AN },
+       { 0x066D, 0x066F, STRONG_AL },
+       { 0x0670, 0x0000, WEAK_NSM },
+       { 0x0671, 0x06D5, STRONG_AL },
+       { 0x06D6, 0x06DC, WEAK_NSM },
+       { 0x06DD, 0x0000, STRONG_AL },
+       { 0x06DE, 0x06E4, WEAK_NSM },
+       { 0x06E5, 0x06E6, STRONG_AL },
+       { 0x06E7, 0x06E8, WEAK_NSM },
+       { 0x06E9, 0x0000, NEUTRAL_ON },
+       { 0x06EA, 0x06ED, WEAK_NSM },
+       { 0x06F0, 0x06F9, WEAK_EN },
+       { 0x06FA, 0x070D, STRONG_AL },
+       { 0x070F, 0x0000, WEAK_BN },
+       { 0x0710, 0x0000, STRONG_AL },
+       { 0x0711, 0x0000, WEAK_NSM },
+       { 0x0712, 0x072C, STRONG_AL },
+       { 0x0730, 0x074A, WEAK_NSM },
+       { 0x0780, 0x07A5, STRONG_AL },
+       { 0x07A6, 0x07B0, WEAK_NSM },
+       { 0x07B1, 0x0000, STRONG_AL },
+       { 0x0901, 0x0902, WEAK_NSM },
+       { 0x093C, 0x0000, WEAK_NSM },
+       { 0x0941, 0x0948, WEAK_NSM },
+       { 0x094D, 0x0000, WEAK_NSM },
+       { 0x0951, 0x0954, WEAK_NSM },
+       { 0x0962, 0x0963, WEAK_NSM },
+       { 0x0981, 0x0000, WEAK_NSM },
+       { 0x09BC, 0x0000, WEAK_NSM },
+       { 0x09C1, 0x09C4, WEAK_NSM },
+       { 0x09CD, 0x0000, WEAK_NSM },
+       { 0x09E2, 0x09E3, WEAK_NSM },
+       { 0x09F2, 0x09F3, WEAK_ET },
+       { 0x0A02, 0x0000, WEAK_NSM },
+       { 0x0A3C, 0x0000, WEAK_NSM },
+       { 0x0A41, 0x0A4D, WEAK_NSM },
+       { 0x0A70, 0x0A71, WEAK_NSM },
+       { 0x0A81, 0x0A82, WEAK_NSM },
+       { 0x0ABC, 0x0000, WEAK_NSM },
+       { 0x0AC1, 0x0AC8, WEAK_NSM },
+       { 0x0ACD, 0x0000, WEAK_NSM },
+       { 0x0B01, 0x0000, WEAK_NSM },
+       { 0x0B3C, 0x0000, WEAK_NSM },
+       { 0x0B3F, 0x0000, WEAK_NSM },
+       { 0x0B41, 0x0B43, WEAK_NSM },
+       { 0x0B4D, 0x0B56, WEAK_NSM },
+       { 0x0B82, 0x0000, WEAK_NSM },
+       { 0x0BC0, 0x0000, WEAK_NSM },
+       { 0x0BCD, 0x0000, WEAK_NSM },
+       { 0x0C3E, 0x0C40, WEAK_NSM },
+       { 0x0C46, 0x0C56, WEAK_NSM },
+       { 0x0CBF, 0x0000, WEAK_NSM },
+       { 0x0CC6, 0x0000, WEAK_NSM },
+       { 0x0CCC, 0x0CCD, WEAK_NSM },
+       { 0x0D41, 0x0D43, WEAK_NSM },
+       { 0x0D4D, 0x0000, WEAK_NSM },
+       { 0x0DCA, 0x0000, WEAK_NSM },
+       { 0x0DD2, 0x0DD6, WEAK_NSM },
+       { 0x0E31, 0x0000, WEAK_NSM },
+       { 0x0E34, 0x0E3A, WEAK_NSM },
+       { 0x0E3F, 0x0000, WEAK_ET },
+       { 0x0E47, 0x0E4E, WEAK_NSM },
+       { 0x0EB1, 0x0000, WEAK_NSM },
+       { 0x0EB4, 0x0EBC, WEAK_NSM },
+       { 0x0EC8, 0x0ECD, WEAK_NSM },
+       { 0x0F18, 0x0F19, WEAK_NSM },
+       { 0x0F35, 0x0000, WEAK_NSM },
+       { 0x0F37, 0x0000, WEAK_NSM },
+       { 0x0F39, 0x0000, WEAK_NSM },
+       { 0x0F3A, 0x0F3D, NEUTRAL_ON },
+       { 0x0F71, 0x0F7E, WEAK_NSM },
+       { 0x0F80, 0x0F84, WEAK_NSM },
+       { 0x0F86, 0x0F87, WEAK_NSM },
+       { 0x0F90, 0x0FBC, WEAK_NSM },
+       { 0x0FC6, 0x0000, WEAK_NSM },
+       { 0x102D, 0x1030, WEAK_NSM },
+       { 0x1032, 0x1037, WEAK_NSM },
+       { 0x1039, 0x0000, WEAK_NSM },
+       { 0x1058, 0x1059, WEAK_NSM },
+       { 0x1680, 0x0000, NEUTRAL_WS },
+       { 0x169B, 0x169C, NEUTRAL_ON },
+       { 0x1712, 0x1714, WEAK_NSM },
+       { 0x1732, 0x1734, WEAK_NSM },
+       { 0x1752, 0x1753, WEAK_NSM },
+       { 0x1772, 0x1773, WEAK_NSM },
+       { 0x17B7, 0x17BD, WEAK_NSM },
+       { 0x17C6, 0x0000, WEAK_NSM },
+       { 0x17C9, 0x17D3, WEAK_NSM },
+       { 0x17DB, 0x0000, WEAK_ET },
+       { 0x1800, 0x180A, NEUTRAL_ON },
+       { 0x180B, 0x180D, WEAK_NSM },
+       { 0x180E, 0x0000, WEAK_BN },
+       { 0x18A9, 0x0000, WEAK_NSM },
+       { 0x1FBD, 0x0000, NEUTRAL_ON },
+       { 0x1FBF, 0x1FC1, NEUTRAL_ON },
+       { 0x1FCD, 0x1FCF, NEUTRAL_ON },
+       { 0x1FDD, 0x1FDF, NEUTRAL_ON },
+       { 0x1FED, 0x1FEF, NEUTRAL_ON },
+       { 0x1FFD, 0x1FFE, NEUTRAL_ON },
+       { 0x2000, 0x200A, NEUTRAL_WS },
+       { 0x200B, 0x200D, WEAK_BN },
+       { 0x200F, 0x0000, STRONG_R },
+       { 0x2010, 0x2027, NEUTRAL_ON },
+       { 0x2028, 0x0000, NEUTRAL_WS },
+       { 0x2029, 0x0000, NEUTRAL_B },
+       { 0x202A, 0x0000, LRE },
+       { 0x202B, 0x0000, RLE },
+       { 0x202C, 0x0000, PDF },
+       { 0x202D, 0x0000, LRO },
+       { 0x202E, 0x0000, RLO },
+       { 0x202F, 0x0000, NEUTRAL_WS },
+       { 0x2030, 0x2034, WEAK_ET },
+       { 0x2035, 0x2057, NEUTRAL_ON },
+       { 0x205F, 0x0000, NEUTRAL_WS },
+       { 0x2060, 0x206F, WEAK_BN },
+       { 0x2070, 0x0000, WEAK_EN },
+       { 0x2074, 0x2079, WEAK_EN },
+       { 0x207A, 0x207B, WEAK_ET },
+       { 0x207C, 0x207E, NEUTRAL_ON },
+       { 0x2080, 0x2089, WEAK_EN },
+       { 0x208A, 0x208B, WEAK_ET },
+       { 0x208C, 0x208E, NEUTRAL_ON },
+       { 0x20A0, 0x20B1, WEAK_ET },
+       { 0x20D0, 0x20EA, WEAK_NSM },
+       { 0x2100, 0x2101, NEUTRAL_ON },
+       { 0x2103, 0x2106, NEUTRAL_ON },
+       { 0x2108, 0x2109, NEUTRAL_ON },
+       { 0x2114, 0x0000, NEUTRAL_ON },
+       { 0x2116, 0x2118, NEUTRAL_ON },
+       { 0x211E, 0x2123, NEUTRAL_ON },
+       { 0x2125, 0x0000, NEUTRAL_ON },
+       { 0x2127, 0x0000, NEUTRAL_ON },
+       { 0x2129, 0x0000, NEUTRAL_ON },
+       { 0x212E, 0x0000, WEAK_ET },
+       { 0x2132, 0x0000, NEUTRAL_ON },
+       { 0x213A, 0x0000, NEUTRAL_ON },
+       { 0x2140, 0x2144, NEUTRAL_ON },
+       { 0x214A, 0x215F, NEUTRAL_ON },
+       { 0x2190, 0x2211, NEUTRAL_ON },
+       { 0x2212, 0x2213, WEAK_ET },
+       { 0x2214, 0x2335, NEUTRAL_ON },
+       { 0x237B, 0x2394, NEUTRAL_ON },
+       { 0x2396, 0x244A, NEUTRAL_ON },
+       { 0x2460, 0x249B, WEAK_EN },
+       { 0x24EA, 0x0000, WEAK_EN },
+       { 0x24EB, 0x2FFB, NEUTRAL_ON },
+       { 0x3000, 0x0000, NEUTRAL_WS },
+       { 0x3001, 0x3004, NEUTRAL_ON },
+       { 0x3008, 0x3020, NEUTRAL_ON },
+       { 0x302A, 0x302F, WEAK_NSM },
+       { 0x3030, 0x0000, NEUTRAL_ON },
+       { 0x3036, 0x3037, NEUTRAL_ON },
+       { 0x303D, 0x303F, NEUTRAL_ON },
+       { 0x3099, 0x309A, WEAK_NSM },
+       { 0x309B, 0x309C, NEUTRAL_ON },
+       { 0x30A0, 0x0000, NEUTRAL_ON },
+       { 0x30FB, 0x0000, NEUTRAL_ON },
+       { 0x3251, 0x325F, NEUTRAL_ON },
+       { 0x32B1, 0x32BF, NEUTRAL_ON },
+       { 0xA490, 0xA4C6, NEUTRAL_ON },
+       { 0xFB1D, 0x0000, STRONG_R },
+       { 0xFB1E, 0x0000, WEAK_NSM },
+       { 0xFB1F, 0xFB28, STRONG_R },
+       { 0xFB29, 0x0000, WEAK_ET },
+       { 0xFB2A, 0xFB4F, STRONG_R },
+       { 0xFB50, 0xFD3D, STRONG_AL },
+       { 0xFD3E, 0xFD3F, NEUTRAL_ON },
+       { 0xFD50, 0xFDFC, STRONG_AL },
+       { 0xFE00, 0xFE23, WEAK_NSM },
+       { 0xFE30, 0xFE4F, NEUTRAL_ON },
+       { 0xFE50, 0x0000, WEAK_CS },
+       { 0xFE51, 0x0000, NEUTRAL_ON },
+       { 0xFE52, 0x0000, WEAK_CS },
+       { 0xFE54, 0x0000, NEUTRAL_ON },
+       { 0xFE55, 0x0000, WEAK_CS },
+       { 0xFE56, 0xFE5E, NEUTRAL_ON },
+       { 0xFE5F, 0x0000, WEAK_ET },
+       { 0xFE60, 0xFE61, NEUTRAL_ON },
+       { 0xFE62, 0xFE63, WEAK_ET },
+       { 0xFE64, 0xFE68, NEUTRAL_ON },
+       { 0xFE69, 0xFE6A, WEAK_ET },
+       { 0xFE6B, 0x0000, NEUTRAL_ON },
+       { 0xFE70, 0xFEFC, STRONG_AL },
+       { 0xFEFF, 0x0000, WEAK_BN },
+       { 0xFF01, 0xFF02, NEUTRAL_ON },
+       { 0xFF03, 0xFF05, WEAK_ET },
+       { 0xFF06, 0xFF0A, NEUTRAL_ON },
+       { 0xFF0B, 0x0000, WEAK_ET },
+       { 0xFF0C, 0x0000, WEAK_CS },
+       { 0xFF0D, 0x0000, WEAK_ET },
+       { 0xFF0E, 0x0000, WEAK_CS },
+       { 0xFF0F, 0x0000, WEAK_ES },
+       { 0xFF10, 0xFF19, WEAK_EN },
+       { 0xFF1A, 0x0000, WEAK_CS },
+       { 0xFF1B, 0xFF20, NEUTRAL_ON },
+       { 0xFF3B, 0xFF40, NEUTRAL_ON },
+       { 0xFF5B, 0xFF65, NEUTRAL_ON },
+       { 0xFFE0, 0xFFE1, WEAK_ET },
+       { 0xFFE2, 0xFFE4, NEUTRAL_ON },
+       { 0xFFE5, 0xFFE6, WEAK_ET },
+       { 0xFFE8, 0xFFEE, NEUTRAL_ON },
+       { 0xFFF9, 0xFFFB, WEAK_BN },
+       { 0xFFFC, 0xFFFD, NEUTRAL_ON },
+       { 0x1D167, 0x1D169, WEAK_NSM },
+       { 0x1D173, 0x1D17A, WEAK_BN },
+       { 0x1D17B, 0x1D182, WEAK_NSM },
+       { 0x1D185, 0x1D18B, WEAK_NSM },
+       { 0x1D1AA, 0x1D1AD, WEAK_NSM },
+       { 0x1D7CE, 0x1D7FF, WEAK_EN },
+       { 0xE0001, 0xE007F, WEAK_BN } };
+  int i;
+
+  bidi_type_table = Fmake_char_table (Qnil, make_number (STRONG_L));
+  staticpro (&bidi_type_table);
+
+  for (i = 0; i < sizeof bidi_type / sizeof bidi_type[0]; i++)
+    char_table_set_range (bidi_type_table, bidi_type[i].from,
+                         bidi_type[i].to ? bidi_type[i].to : bidi_type[i].from,
+                         make_number (bidi_type[i].type));
+
+  fallback_paragraph_start_re =
+    XSYMBOL (Fintern_soft (build_string ("paragraph-start"), Qnil))->value;
+  if (!STRINGP (fallback_paragraph_start_re))
+    fallback_paragraph_start_re = build_string ("\f\\|[ \t]*$");
+  staticpro (&fallback_paragraph_start_re);
+  Qparagraph_start = intern ("paragraph-start");
+  staticpro (&Qparagraph_start);
+  fallback_paragraph_separate_re =
+    XSYMBOL (Fintern_soft (build_string ("paragraph-separate"), Qnil))->value;
+  if (!STRINGP (fallback_paragraph_separate_re))
+    fallback_paragraph_separate_re = build_string ("[ \t\f]*$");
+  staticpro (&fallback_paragraph_separate_re);
+  Qparagraph_separate = intern ("paragraph-separate");
+  staticpro (&Qparagraph_separate);
+  bidi_initialized = 1;
+}
+
+/* Return the bidi type of a character CH, subject to the current
+   directional OVERRIDE.  */
+bidi_type_t
+bidi_get_type (int ch, bidi_dir_t override)
+{
+  bidi_type_t default_type;
+
+  if (ch == BIDI_EOB)
+    return NEUTRAL_B;
+  if (ch < 0 || ch > MAX_CHAR)
+    abort ();
+
+  default_type = (bidi_type_t) XINT (CHAR_TABLE_REF (bidi_type_table, ch));
+
+  if (override == NEUTRAL_DIR)
+    return default_type;
+
+  switch (default_type)
+    {
+      /* Although UAX#9 does not tell, it doesn't make sense to
+        override NEUTRAL_B and LRM/RLM characters.  */
+      case NEUTRAL_B:
+      case LRE:
+      case LRO:
+      case RLE:
+      case RLO:
+      case PDF:
+       return default_type;
+      default:
+       switch (ch)
+         {
+           case LRM_CHAR:
+           case RLM_CHAR:
+             return default_type;
+           default:
+             if (override == L2R) /* X6 */
+               return STRONG_L;
+             else if (override == R2L)
+               return STRONG_R;
+             else
+               abort ();       /* can't happen: handled above */
+         }
+    }
+}
+
+void
+bidi_check_type (bidi_type_t type)
+{
+  if (type < UNKNOWN_BT || type > NEUTRAL_ON)
+    abort ();
+}
+
+/* Given a bidi TYPE of a character, return its category.  */
+bidi_category_t
+bidi_get_category (bidi_type_t type)
+{
+  switch (type)
+    {
+      case UNKNOWN_BT:
+       return UNKNOWN_BC;
+      case STRONG_L:
+      case STRONG_R:
+      case STRONG_AL:
+      case LRE:
+      case LRO:
+      case RLE:
+      case RLO:
+       return STRONG;
+      case PDF:                /* ??? really?? */
+      case WEAK_EN:
+      case WEAK_ES:
+      case WEAK_ET:
+      case WEAK_AN:
+      case WEAK_CS:
+      case WEAK_NSM:
+      case WEAK_BN:
+       return WEAK;
+      case NEUTRAL_B:
+      case NEUTRAL_S:
+      case NEUTRAL_WS:
+      case NEUTRAL_ON:
+       return NEUTRAL;
+      default:
+       abort ();
+    }
+}
+
+/* Return the mirrored character of C, if any.
+
+   Note: The conditions in UAX#9 clause L4 must be tested by the
+   caller.  */
+/* FIXME: exceedingly temporary!  Should consult the Unicode database
+   of character properties.  */
+int
+bidi_mirror_char (int c)
+{
+  static const char mirrored_pairs[] = "()<>[]{}";
+  const char *p = c > 0 && c < 128 ? strchr (mirrored_pairs, c) : NULL;
+
+  if (p)
+    {
+      size_t i = p - mirrored_pairs;
+
+      return mirrored_pairs [(i ^ 1)];
+    }
+  return c;
+}
+
+/* Copy the bidi iterator from FROM to TO.  To save cycles, this only
+   copies the part of the level stack that is actually in use.  */
+static inline void
+bidi_copy_it (struct bidi_it *to, struct bidi_it *from)
+{
+  int i;
+
+  /* Copy everything except the level stack and beyond.  */
+  memcpy (to, from, ((size_t)&((struct bidi_it *)0)->level_stack[0]));
+
+  /* Copy the active part of the level stack.  */
+  to->level_stack[0] = from->level_stack[0]; /* level zero is always in use */
+  for (i = 1; i <= from->stack_idx; i++)
+    to->level_stack[i] = from->level_stack[i];
+}
+
+/* Caching the bidi iterator states.  */
+
+static struct bidi_it bidi_cache[1000]; /* FIXME: make this dynamically allocated! */
+static int bidi_cache_idx;
+static int bidi_cache_last_idx;
+
+static inline void
+bidi_cache_reset (void)
+{
+  bidi_cache_idx = 0;
+  bidi_cache_last_idx = -1;
+}
+
+static inline void
+bidi_cache_fetch_state (int idx, struct bidi_it *bidi_it)
+{
+  int current_scan_dir = bidi_it->scan_dir;
+
+  if (idx < 0 || idx >= bidi_cache_idx)
+    abort ();
+
+  bidi_copy_it (bidi_it, &bidi_cache[idx]);
+  bidi_it->scan_dir = current_scan_dir;
+  bidi_cache_last_idx = idx;
+}
+
+/* Find a cached state with a given CHARPOS and resolved embedding
+   level less or equal to LEVEL.  if LEVEL is -1, disregard the
+   resolved levels in cached states.  DIR, if non-zero, means search
+   in that direction from the last cache hit.  */
+static inline int
+bidi_cache_search (int charpos, int level, int dir)
+{
+  int i, i_start;
+
+  if (bidi_cache_idx)
+    {
+      if (charpos < bidi_cache[bidi_cache_last_idx].charpos)
+       dir = -1;
+      else if (charpos > bidi_cache[bidi_cache_last_idx].charpos)
+       dir = 1;
+      if (dir)
+       i_start = bidi_cache_last_idx;
+      else
+       {
+         dir = -1;
+         i_start = bidi_cache_idx - 1;
+       }
+
+      if (dir < 0)
+       {
+         /* Linear search for now; FIXME!  */
+         for (i = i_start; i >= 0; i--)
+           if (bidi_cache[i].charpos == charpos
+               && (level == -1 || bidi_cache[i].resolved_level <= level))
+             return i;
+       }
+      else
+       {
+         for (i = i_start; i < bidi_cache_idx; i++)
+           if (bidi_cache[i].charpos == charpos
+               && (level == -1 || bidi_cache[i].resolved_level <= level))
+             return i;
+       }
+    }
+
+  return -1;
+}
+
+/* Find a cached state where the resolved level changes to a value
+   that is lower than LEVEL, and return its cache slot index.  DIR is
+   the direction to search, starting with the last used cache slot.
+   BEFORE, if non-zero, means return the index of the slot that is
+   ``before'' the level change in the search direction.  That is,
+   given the cached levels like this:
+
+        1122333442211
+         AB        C
+
+   and assuming we are at the position cached at the slot marked with
+   C, searching backwards (DIR = -1) for LEVEL = 2 will return the
+   index of slot B or A, depending whether BEFORE is, respectively,
+   non-zero or zero.  */
+static int
+bidi_cache_find_level_change (int level, int dir, int before)
+{
+  if (bidi_cache_idx)
+    {
+      int i = dir ? bidi_cache_last_idx : bidi_cache_idx - 1;
+      int incr = before ? 1 : 0;
+
+      if (!dir)
+       dir = -1;
+      else if (!incr)
+       i += dir;
+
+      if (dir < 0)
+       {
+         while (i >= incr)
+           {
+             if (bidi_cache[i - incr].resolved_level >= 0
+                 && bidi_cache[i - incr].resolved_level < level)
+               return i;
+             i--;
+           }
+       }
+      else
+       {
+         while (i < bidi_cache_idx - incr)
+           {
+             if (bidi_cache[i + incr].resolved_level >= 0
+                 && bidi_cache[i + incr].resolved_level < level)
+               return i;
+             i++;
+           }
+       }
+    }
+
+  return -1;
+}
+
+static inline void
+bidi_cache_iterator_state (struct bidi_it *bidi_it, int resolved)
+{
+  int idx;
+
+  /* We should never cache on backward scans.  */
+  if (bidi_it->scan_dir == -1)
+    abort ();
+  idx = bidi_cache_search (bidi_it->charpos, -1, 1);
+
+  if (idx < 0)
+    {
+      idx = bidi_cache_idx;
+      /* Don't overrun the cache limit.  */
+      if (idx > sizeof (bidi_cache) / sizeof (bidi_cache[0]) - 1)
+       abort ();
+      /* Character positions should correspond to cache positions 1:1.
+        If we are outside the range of cached positions, the cache is
+        useless and must be reset.  */
+      if (idx > 0 &&
+         (bidi_it->charpos > bidi_cache[idx - 1].charpos + 1
+          || bidi_it->charpos < bidi_cache[0].charpos))
+       {
+         bidi_cache_reset ();
+         idx = 0;
+       }
+      bidi_copy_it (&bidi_cache[idx], bidi_it);
+      if (!resolved)
+       bidi_cache[idx].resolved_level = -1;
+      bidi_cache[idx].new_paragraph = 0;
+    }
+  else
+    {
+      /* Copy only the members which could have changed, to avoid
+        costly copying of the entire struct.  */
+      bidi_cache[idx].type = bidi_it->type;
+      bidi_check_type (bidi_it->type);
+      bidi_cache[idx].type_after_w1 = bidi_it->type_after_w1;
+      bidi_check_type (bidi_it->type_after_w1);
+      if (resolved)
+       bidi_cache[idx].resolved_level = bidi_it->resolved_level;
+      else
+       bidi_cache[idx].resolved_level = -1;
+      bidi_cache[idx].invalid_levels = bidi_it->invalid_levels;
+      bidi_cache[idx].invalid_rl_levels = bidi_it->invalid_rl_levels;
+      bidi_cache[idx].next_for_neutral = bidi_it->next_for_neutral;
+      bidi_cache[idx].next_for_ws = bidi_it->next_for_ws;
+      bidi_cache[idx].ignore_bn_limit = bidi_it->ignore_bn_limit;
+    }
+
+  bidi_cache_last_idx = idx;
+  if (idx >= bidi_cache_idx)
+    bidi_cache_idx = idx + 1;
+}
+
+static inline bidi_type_t
+bidi_cache_find (int charpos, int level, struct bidi_it *bidi_it)
+{
+  int i = bidi_cache_search (charpos, level, bidi_it->scan_dir);
+
+  if (i >= 0)
+    {
+      bidi_dir_t current_scan_dir = bidi_it->scan_dir;
+
+      bidi_copy_it (bidi_it, &bidi_cache[i]);
+      bidi_cache_last_idx = i;
+      /* Don't let scan direction from from the cached state override
+        the current scan direction.  */
+      bidi_it->scan_dir = current_scan_dir;
+      return bidi_it->type;
+    }
+
+  return UNKNOWN_BT;
+}
+
+static inline int
+bidi_peek_at_next_level (struct bidi_it *bidi_it)
+{
+  if (bidi_cache_idx == 0 || bidi_cache_last_idx == -1)
+    abort ();
+  return bidi_cache[bidi_cache_last_idx + bidi_it->scan_dir].resolved_level;
+}
+
+/* Check if buffer position CHARPOS/BYTEPOS is the end of a paragraph.
+   Value is the non-negative length of the paragraph separator
+   following the buffer position, -1 if position is at the beginning
+   of a new paragraph, or -2 if position is neither at beginning nor
+   at end of a paragraph.  */
+EMACS_INT
+bidi_at_paragraph_end (EMACS_INT charpos, EMACS_INT bytepos)
+{
+  Lisp_Object sep_re = Fbuffer_local_value (Qparagraph_separate,
+                                           Fcurrent_buffer ());
+  Lisp_Object start_re = Fbuffer_local_value (Qparagraph_start,
+                                             Fcurrent_buffer ());
+  EMACS_INT val;
+
+  if (!STRINGP (sep_re))
+    sep_re = fallback_paragraph_separate_re;
+  if (!STRINGP (start_re))
+    start_re = fallback_paragraph_start_re;
+
+  val = fast_looking_at (sep_re, charpos, bytepos, ZV, ZV_BYTE, Qnil);
+  if (val < 0)
+    {
+      if (fast_looking_at (start_re, charpos, bytepos, ZV, ZV_BYTE, Qnil) >= 0)
+       val = -1;
+      else
+       val = -2;
+    }
+
+  return val;
+}
+
+/* Determine the start-of-run (sor) directional type given the two
+   embedding levels on either side of the run boundary.  Also, update
+   the saved info about previously seen characters, since that info is
+   generally valid for a single level run.  */
+static inline void
+bidi_set_sor_type (struct bidi_it *bidi_it, int level_before, int level_after)
+{
+  int higher_level = level_before > level_after ? level_before : level_after;
+
+  /* The prev_was_pdf gork is required for when we have several PDFs
+     in a row.  In that case, we want to compute the sor type for the
+     next level run only once: when we see the first PDF.  That's
+     because the sor type depends only on the higher of the two levels
+     that we find on the two sides of the level boundary (see UAX#9,
+     clause X10), and so we don't need to know the final embedding
+     level to which we descend after processing all the PDFs.  */
+  if (!bidi_it->prev_was_pdf || level_before < level_after)
+    /* FIXME: should the default sor direction be user selectable?  */
+    bidi_it->sor = (higher_level & 1) != 0 ? R2L : L2R;
+  if (level_before > level_after)
+    bidi_it->prev_was_pdf = 1;
+
+  bidi_it->prev.type = UNKNOWN_BT;
+  bidi_it->last_strong.type = bidi_it->last_strong.type_after_w1 =
+    bidi_it->last_strong.orig_type = UNKNOWN_BT;
+  bidi_it->prev_for_neutral.type = bidi_it->sor == R2L ? STRONG_R : STRONG_L;
+  bidi_it->prev_for_neutral.charpos = bidi_it->charpos;
+  bidi_it->prev_for_neutral.bytepos = bidi_it->bytepos;
+  bidi_it->next_for_neutral.type = bidi_it->next_for_neutral.type_after_w1 =
+    bidi_it->next_for_neutral.orig_type = UNKNOWN_BT;
+  bidi_it->ignore_bn_limit = 0; /* meaning it's unknown */
+}
+
+static void
+bidi_line_init (struct bidi_it *bidi_it)
+{
+  bidi_it->scan_dir = 1; /* FIXME: do we need to have control on this? */
+  bidi_it->resolved_level = bidi_it->level_stack[0].level;
+  bidi_it->level_stack[0].override = NEUTRAL_DIR; /* X1 */
+  bidi_it->invalid_levels = 0;
+  bidi_it->invalid_rl_levels = -1;
+  bidi_it->next_en_pos = -1;
+  bidi_it->next_for_ws.type = UNKNOWN_BT;
+  bidi_set_sor_type (bidi_it,
+                    bidi_it->paragraph_dir == R2L ? 1 : 0,
+                    bidi_it->level_stack[0].level); /* X10 */
+
+  bidi_cache_reset ();
+}
+
+/* Find the beginning of this paragraph by looking back in the buffer.
+   Value is the byte position of the paragraph's beginning.  */
+static EMACS_INT
+bidi_find_paragraph_start (EMACS_INT pos, EMACS_INT pos_byte)
+{
+  Lisp_Object re = Fbuffer_local_value (Qparagraph_start, Fcurrent_buffer ());
+  EMACS_INT limit = ZV, limit_byte = ZV_BYTE;
+
+  if (!STRINGP (re))
+    re = fallback_paragraph_start_re;
+  while (pos_byte > BEGV_BYTE
+        && fast_looking_at (re, pos, pos_byte, limit, limit_byte, Qnil) < 0)
+    {
+      pos = find_next_newline_no_quit (pos - 1, -1);
+      pos_byte = CHAR_TO_BYTE (pos);
+    }
+  return pos_byte;
+}
+
+/* Determine the direction, a.k.a. base embedding level, of the
+   paragraph we are about to iterate through.  If DIR is either L2R or
+   R2L, just use that.  Otherwise, determine the paragraph direction
+   from the first strong character of the paragraph.
+
+   Note that this gives the paragraph separator the same direction as
+   the preceding paragraph, even though Emacs generally views the
+   separartor as not belonging to any paragraph.  */
+void
+bidi_paragraph_init (bidi_dir_t dir, struct bidi_it *bidi_it)
+{
+  EMACS_INT bytepos = bidi_it->bytepos;
+
+  /* Special case for an empty buffer. */
+  if (bytepos == BEGV_BYTE && bytepos == ZV_BYTE)
+    dir = L2R;
+  /* We should never be called at EOB or before BEGV.  */
+  else if (bytepos >= ZV_BYTE || bytepos < BEGV_BYTE)
+    abort ();
+
+  if (dir == L2R)
+    {
+      bidi_it->paragraph_dir = L2R;
+      bidi_it->new_paragraph = 0;
+    }
+  else if (dir == R2L)
+    {
+      bidi_it->paragraph_dir = R2L;
+      bidi_it->new_paragraph = 0;
+    }
+  else if (dir == NEUTRAL_DIR) /* P2 */
+    {
+      int ch, ch_len;
+      EMACS_INT pos;
+      bidi_type_t type;
+      EMACS_INT sep_len;
+
+      /* If we are inside a paragraph separator, we are just waiting
+        for the separator to be exhausted; use the previous paragraph
+        direction.  But don't do that if we have been just reseated,
+        because we need to reinitialize below in that case.  */
+      if (!bidi_it->first_elt
+         && bidi_it->charpos < bidi_it->separator_limit)
+       return;
+
+      /* If we are on a newline, get past it to where the next
+        paragraph might start.  But don't do that at BEGV since then
+        we are potentially in a new paragraph that doesn't yet
+        exist.  */
+      pos = bidi_it->charpos;
+      if (bytepos > BEGV_BYTE && FETCH_CHAR (bytepos) == '\n')
+       {
+         bytepos++;
+         pos++;
+       }
+
+      /* We are either at the beginning of a paragraph or in the
+        middle of it.  Find where this paragraph starts.  */
+      bytepos = bidi_find_paragraph_start (pos, bytepos);
+
+      /* We should always be at the beginning of a new line at this
+        point.  */
+      if (!(bytepos == BEGV_BYTE || FETCH_CHAR (bytepos - 1) == '\n'))
+       abort ();
+
+      bidi_it->separator_limit = -1;
+      bidi_it->new_paragraph = 0;
+      ch = FETCH_CHAR (bytepos);
+      ch_len = CHAR_BYTES (ch);
+      pos = BYTE_TO_CHAR (bytepos);
+      type = bidi_get_type (ch, NEUTRAL_DIR);
+
+      for (pos++, bytepos += ch_len;
+          /* NOTE: UAX#9 says to search only for L, AL, or R types of
+             characters, and ignore RLE, RLO, LRE, and LRO.  However,
+             I'm not sure it makes sense to omit those 4; should try
+             with and without that to see the effect.  */
+          (bidi_get_category (type) != STRONG)
+            || (bidi_ignore_explicit_marks_for_paragraph_level
+                && (type == RLE || type == RLO
+                    || type == LRE || type == LRO));
+          type = bidi_get_type (ch, NEUTRAL_DIR))
+       {
+         if (type == NEUTRAL_B && bidi_at_paragraph_end (pos, bytepos) >= -1)
+           break;
+         if (bytepos >= ZV_BYTE)
+           {
+             /* Pretend there's a paragraph separator at end of buffer.  */
+             type = NEUTRAL_B;
+             break;
+           }
+         FETCH_CHAR_ADVANCE (ch, pos, bytepos);
+       }
+      if (type == STRONG_R || type == STRONG_AL) /* P3 */
+       bidi_it->paragraph_dir = R2L;
+      else if (type == STRONG_L)
+       bidi_it->paragraph_dir = L2R;
+    }
+  else
+    abort ();
+
+  /* Contrary to UAX#9 clause P3, we only default the paragraph
+     direction to L2R if we have no previous usable paragraph
+     direction.  */
+  if (bidi_it->paragraph_dir == NEUTRAL_DIR)
+    bidi_it->paragraph_dir = L2R; /* P3 and ``higher protocols'' */
+  if (bidi_it->paragraph_dir == R2L)
+    bidi_it->level_stack[0].level = 1;
+  else
+    bidi_it->level_stack[0].level = 0;
+
+  bidi_line_init (bidi_it);
+}
+
+/* Do whatever UAX#9 clause X8 says should be done at paragraph's
+   end.  */
+static inline void
+bidi_set_paragraph_end (struct bidi_it *bidi_it)
+{
+  bidi_it->invalid_levels = 0;
+  bidi_it->invalid_rl_levels = -1;
+  bidi_it->stack_idx = 0;
+  bidi_it->resolved_level = bidi_it->level_stack[0].level;
+}
+
+/* Initialize the bidi iterator from buffer position CHARPOS.  */
+void
+bidi_init_it (EMACS_INT charpos, EMACS_INT bytepos, struct bidi_it *bidi_it)
+{
+  if (! bidi_initialized)
+    bidi_initialize ();
+  bidi_it->charpos = charpos;
+  bidi_it->bytepos = bytepos;
+  bidi_it->first_elt = 1;
+  bidi_set_paragraph_end (bidi_it);
+  bidi_it->new_paragraph = 1;
+  bidi_it->separator_limit = -1;
+  bidi_it->type = NEUTRAL_B;
+  bidi_it->type_after_w1 = UNKNOWN_BT;
+  bidi_it->orig_type = UNKNOWN_BT;
+  bidi_it->prev_was_pdf = 0;
+  bidi_it->prev.type = bidi_it->prev.type_after_w1 = UNKNOWN_BT;
+  bidi_it->last_strong.type = bidi_it->last_strong.type_after_w1 =
+    bidi_it->last_strong.orig_type = UNKNOWN_BT;
+  bidi_it->next_for_neutral.charpos = -1;
+  bidi_it->next_for_neutral.type =
+    bidi_it->next_for_neutral.type_after_w1 =
+    bidi_it->next_for_neutral.orig_type = UNKNOWN_BT;
+  bidi_it->prev_for_neutral.charpos = -1;
+  bidi_it->prev_for_neutral.type =
+    bidi_it->prev_for_neutral.type_after_w1 =
+    bidi_it->prev_for_neutral.orig_type = UNKNOWN_BT;
+  bidi_it->sor = L2R;   /* FIXME: should it be user-selectable? */
+}
+
+/* Push the current embedding level and override status; reset the
+   current level to LEVEL and the current override status to OVERRIDE.  */
+static inline void
+bidi_push_embedding_level (struct bidi_it *bidi_it,
+                          int level, bidi_dir_t override)
+{
+  bidi_it->stack_idx++;
+  if (bidi_it->stack_idx >= BIDI_MAXLEVEL)
+    abort ();
+  bidi_it->level_stack[bidi_it->stack_idx].level = level;
+  bidi_it->level_stack[bidi_it->stack_idx].override = override;
+}
+
+/* Pop the embedding level and directional override status from the
+   stack, and return the new level.  */
+static inline int
+bidi_pop_embedding_level (struct bidi_it *bidi_it)
+{
+  /* UAX#9 says to ignore invalid PDFs.  */
+  if (bidi_it->stack_idx > 0)
+    bidi_it->stack_idx--;
+  return bidi_it->level_stack[bidi_it->stack_idx].level;
+}
+
+/* Record in SAVED_INFO the information about the current character.  */
+static inline void
+bidi_remember_char (struct bidi_saved_info *saved_info,
+                   struct bidi_it *bidi_it)
+{
+  saved_info->charpos = bidi_it->charpos;
+  saved_info->bytepos = bidi_it->bytepos;
+  saved_info->type = bidi_it->type;
+  bidi_check_type (bidi_it->type);
+  saved_info->type_after_w1 = bidi_it->type_after_w1;
+  bidi_check_type (bidi_it->type_after_w1);
+  saved_info->orig_type = bidi_it->orig_type;
+  bidi_check_type (bidi_it->orig_type);
+}
+
+/* Resolve the type of a neutral character according to the type of
+   surrounding strong text and the current embedding level.  */
+static inline bidi_type_t
+bidi_resolve_neutral_1 (bidi_type_t prev_type, bidi_type_t next_type, int lev)
+{
+  /* N1: European and Arabic numbers are treated as though they were R.  */
+  if (next_type == WEAK_EN || next_type == WEAK_AN)
+    next_type = STRONG_R;
+  if (prev_type == WEAK_EN || prev_type == WEAK_AN)
+    prev_type = STRONG_R;
+
+  if (next_type == prev_type)  /* N1 */
+    return next_type;
+  else if ((lev & 1) == 0)     /* N2 */
+    return STRONG_L;
+  else
+    return STRONG_R;
+}
+
+static inline int
+bidi_explicit_dir_char (int c)
+{
+  /* FIXME: this should be replaced with a lookup table with suitable
+     bits set, like standard C ctype macros do.  */
+  return (c == LRE_CHAR || c == LRO_CHAR
+         || c == RLE_CHAR || c == RLO_CHAR || c == PDF_CHAR);
+}
+
+/* A helper function for bidi_resolve_explicit.  It advances to the
+   next character in logical order and determines the new embedding
+   level and directional override, but does not take into account
+   empty embeddings.  */
+static int
+bidi_resolve_explicit_1 (struct bidi_it *bidi_it)
+{
+  int curchar;
+  bidi_type_t type;
+  int current_level;
+  int new_level;
+  bidi_dir_t override;
+
+  if (bidi_it->bytepos < BEGV_BYTE     /* after reseat to BEGV? */
+      || bidi_it->first_elt)
+    {
+      bidi_it->first_elt = 0;
+      if (bidi_it->charpos < BEGV)
+       bidi_it->charpos = BEGV;
+      bidi_it->bytepos = CHAR_TO_BYTE (bidi_it->charpos);
+    }
+  else if (bidi_it->bytepos < ZV_BYTE) /* don't move at ZV */
+    {
+      bidi_it->charpos++;
+      if (bidi_it->ch_len == 0)
+       abort ();
+      bidi_it->bytepos += bidi_it->ch_len;
+    }
+
+  current_level = bidi_it->level_stack[bidi_it->stack_idx].level; /* X1 */
+  override = bidi_it->level_stack[bidi_it->stack_idx].override;
+  new_level = current_level;
+
+  /* in case it is a unibyte character (not yet implemented) */
+  /* _fetch_multibyte_char_len = 1; */
+  if (bidi_it->bytepos >= ZV_BYTE)
+    {
+      curchar = BIDI_EOB;
+      bidi_it->ch_len = 1;
+    }
+  else
+    {
+      curchar = FETCH_CHAR (bidi_it->bytepos);
+      bidi_it->ch_len = CHAR_BYTES (curchar);
+    }
+  bidi_it->ch = curchar;
+
+  /* Don't apply directional override here, as all the types we handle
+     below will not be affected by the override anyway, and we need
+     the original type unaltered.  The override will be applied in
+     bidi_resolve_weak.  */
+  type = bidi_get_type (curchar, NEUTRAL_DIR);
+  bidi_it->orig_type = type;
+  bidi_check_type (bidi_it->orig_type);
+
+  if (type != PDF)
+    bidi_it->prev_was_pdf = 0;
+
+  bidi_it->type_after_w1 = UNKNOWN_BT;
+
+  switch (type)
+    {
+      case RLE:        /* X2 */
+      case RLO:        /* X4 */
+       bidi_it->type_after_w1 = type;
+       bidi_check_type (bidi_it->type_after_w1);
+       type = WEAK_BN; /* X9/Retaining */
+       if (bidi_it->ignore_bn_limit <= 0)
+         {
+           if (current_level <= BIDI_MAXLEVEL - 4)
+             {
+               /* Compute the least odd embedding level greater than
+                  the current level.  */
+               new_level = ((current_level + 1) & ~1) + 1;
+               if (bidi_it->type_after_w1 == RLE)
+                 override = NEUTRAL_DIR;
+               else
+                 override = R2L;
+               if (current_level == BIDI_MAXLEVEL - 4)
+                 bidi_it->invalid_rl_levels = 0;
+               bidi_push_embedding_level (bidi_it, new_level, override);
+             }
+           else
+             {
+               bidi_it->invalid_levels++;
+               /* See the commentary about invalid_rl_levels below.  */
+               if (bidi_it->invalid_rl_levels < 0)
+                 bidi_it->invalid_rl_levels = 0;
+               bidi_it->invalid_rl_levels++;
+             }
+         }
+       else if (bidi_it->prev.type_after_w1 == WEAK_EN /* W5/Retaining */
+                || bidi_it->next_en_pos > bidi_it->charpos)
+         type = WEAK_EN;
+       break;
+      case LRE:        /* X3 */
+      case LRO:        /* X5 */
+       bidi_it->type_after_w1 = type;
+       bidi_check_type (bidi_it->type_after_w1);
+       type = WEAK_BN; /* X9/Retaining */
+       if (bidi_it->ignore_bn_limit <= 0)
+         {
+           if (current_level <= BIDI_MAXLEVEL - 5)
+             {
+               /* Compute the least even embedding level greater than
+                  the current level.  */
+               new_level = ((current_level + 2) & ~1);
+               if (bidi_it->type_after_w1 == LRE)
+                 override = NEUTRAL_DIR;
+               else
+                 override = L2R;
+               bidi_push_embedding_level (bidi_it, new_level, override);
+             }
+           else
+             {
+               bidi_it->invalid_levels++;
+               /* invalid_rl_levels counts invalid levels encountered
+                  while the embedding level was already too high for
+                  LRE/LRO, but not for RLE/RLO.  That is because
+                  there may be exactly one PDF which we should not
+                  ignore even though invalid_levels is non-zero.
+                  invalid_rl_levels helps to know what PDF is
+                  that.  */
+               if (bidi_it->invalid_rl_levels >= 0)
+                 bidi_it->invalid_rl_levels++;
+             }
+         }
+       else if (bidi_it->prev.type_after_w1 == WEAK_EN /* W5/Retaining */
+                || bidi_it->next_en_pos > bidi_it->charpos)
+         type = WEAK_EN;
+       break;
+      case PDF:        /* X7 */
+       bidi_it->type_after_w1 = type;
+       bidi_check_type (bidi_it->type_after_w1);
+       type = WEAK_BN; /* X9/Retaining */
+       if (bidi_it->ignore_bn_limit <= 0)
+         {
+           if (!bidi_it->invalid_rl_levels)
+             {
+               new_level = bidi_pop_embedding_level (bidi_it);
+               bidi_it->invalid_rl_levels = -1;
+               if (bidi_it->invalid_levels)
+                 bidi_it->invalid_levels--;
+               /* else nothing: UAX#9 says to ignore invalid PDFs */
+             }
+           if (!bidi_it->invalid_levels)
+             new_level = bidi_pop_embedding_level (bidi_it);
+           else
+             {
+               bidi_it->invalid_levels--;
+               bidi_it->invalid_rl_levels--;
+             }
+         }
+       else if (bidi_it->prev.type_after_w1 == WEAK_EN /* W5/Retaining */
+                || bidi_it->next_en_pos > bidi_it->charpos)
+         type = WEAK_EN;
+       break;
+      default:
+       /* Nothing.  */
+       break;
+    }
+
+  bidi_it->type = type;
+  bidi_check_type (bidi_it->type);
+
+  return new_level;
+}
+
+/* Given an iterator state in BIDI_IT, advance one character position
+   in the buffer to the next character (in the logical order), resolve
+   any explicit embeddings and directional overrides, and return the
+   embedding level of the character after resolving explicit
+   directives and ignoring empty embeddings.  */
+static int
+bidi_resolve_explicit (struct bidi_it *bidi_it)
+{
+  int prev_level = bidi_it->level_stack[bidi_it->stack_idx].level;
+  int new_level  = bidi_resolve_explicit_1 (bidi_it);
+
+  if (prev_level < new_level
+      && bidi_it->type == WEAK_BN
+      && bidi_it->ignore_bn_limit == 0 /* only if not already known */
+      && bidi_it->ch != BIDI_EOB       /* not already at EOB */
+      && bidi_explicit_dir_char (FETCH_CHAR (bidi_it->bytepos
+                                            + bidi_it->ch_len)))
+    {
+      /* Avoid pushing and popping embedding levels if the level run
+        is empty, as this breaks level runs where it shouldn't.
+        UAX#9 removes all the explicit embedding and override codes,
+        so empty embeddings disappear without a trace.  We need to
+        behave as if we did the same.  */
+      struct bidi_it saved_it;
+      int level = prev_level;
+
+      bidi_copy_it (&saved_it, bidi_it);
+
+      while (bidi_explicit_dir_char (FETCH_CHAR (bidi_it->bytepos
+                                                + bidi_it->ch_len)))
+       {
+         level = bidi_resolve_explicit_1 (bidi_it);
+       }
+
+      if (level == prev_level) /* empty embedding */
+       saved_it.ignore_bn_limit = bidi_it->charpos + 1;
+      else                     /* this embedding is non-empty */
+       saved_it.ignore_bn_limit = -1;
+
+      bidi_copy_it (bidi_it, &saved_it);
+      if (bidi_it->ignore_bn_limit > 0)
+       {
+         /* We pushed a level, but we shouldn't have.  Undo that. */
+         if (!bidi_it->invalid_rl_levels)
+           {
+             new_level = bidi_pop_embedding_level (bidi_it);
+             bidi_it->invalid_rl_levels = -1;
+             if (bidi_it->invalid_levels)
+               bidi_it->invalid_levels--;
+           }
+         if (!bidi_it->invalid_levels)
+           new_level = bidi_pop_embedding_level (bidi_it);
+         else
+           {
+             bidi_it->invalid_levels--;
+             bidi_it->invalid_rl_levels--;
+           }
+       }
+    }
+
+  if (bidi_it->type == NEUTRAL_B)      /* X8 */
+    {
+      bidi_set_paragraph_end (bidi_it);
+      /* This is needed by bidi_resolve_weak below, and in L1.  */
+      bidi_it->type_after_w1 = bidi_it->type;
+      bidi_check_type (bidi_it->type_after_w1);
+    }
+
+  return new_level;
+}
+
+/* Advance in the buffer, resolve weak types and return the type of
+   the next character after weak type resolution.  */
+bidi_type_t
+bidi_resolve_weak (struct bidi_it *bidi_it)
+{
+  bidi_type_t type;
+  bidi_dir_t override;
+  int prev_level = bidi_it->level_stack[bidi_it->stack_idx].level;
+  int new_level  = bidi_resolve_explicit (bidi_it);
+  int next_char;
+  bidi_type_t type_of_next;
+  struct bidi_it saved_it;
+
+  type = bidi_it->type;
+  override = bidi_it->level_stack[bidi_it->stack_idx].override;
+
+  if (type == UNKNOWN_BT
+      || type == LRE
+      || type == LRO
+      || type == RLE
+      || type == RLO
+      || type == PDF)
+    abort ();
+
+  if (new_level != prev_level
+      || bidi_it->type == NEUTRAL_B)
+    {
+      /* We've got a new embedding level run, compute the directional
+         type of sor and initialize per-run variables (UAX#9, clause
+         X10).  */
+      bidi_set_sor_type (bidi_it, prev_level, new_level);
+    }
+  else if (type == NEUTRAL_S || type == NEUTRAL_WS
+          || type == WEAK_BN || type == STRONG_AL)
+    bidi_it->type_after_w1 = type;     /* needed in L1 */
+  bidi_check_type (bidi_it->type_after_w1);
+
+  /* Level and directional override status are already recorded in
+     bidi_it, and do not need any change; see X6.  */
+  if (override == R2L)         /* X6 */
+    type = STRONG_R;
+  else if (override == L2R)
+    type = STRONG_L;
+  else
+    {
+      if (type == WEAK_NSM)    /* W1 */
+       {
+         /* Note that we don't need to consider the case where the
+            prev character has its type overridden by an RLO or LRO:
+            such characters are outside the current level run, and
+            thus not relevant to this NSM.  Thus, NSM gets the
+            orig_type of the previous character.  */
+         if (bidi_it->prev.type != UNKNOWN_BT)
+           type = bidi_it->prev.orig_type;
+         else if (bidi_it->sor == R2L)
+           type = STRONG_R;
+         else if (bidi_it->sor == L2R)
+           type = STRONG_L;
+         else /* shouldn't happen! */
+           abort ();
+       }
+      if (type == WEAK_EN      /* W2 */
+         && bidi_it->last_strong.type_after_w1 == STRONG_AL)
+       type = WEAK_AN;
+      else if (type == STRONG_AL) /* W3 */
+       type = STRONG_R;
+      else if ((type == WEAK_ES        /* W4 */
+               && bidi_it->prev.type_after_w1 == WEAK_EN
+               && bidi_it->prev.orig_type == WEAK_EN)
+              || (type == WEAK_CS
+                  && ((bidi_it->prev.type_after_w1 == WEAK_EN
+                       && bidi_it->prev.orig_type == WEAK_EN)
+                      || bidi_it->prev.type_after_w1 == WEAK_AN)))
+       {
+         next_char =
+           bidi_it->bytepos + bidi_it->ch_len >= ZV_BYTE
+           ? BIDI_EOB : FETCH_CHAR (bidi_it->bytepos + bidi_it->ch_len);
+         type_of_next = bidi_get_type (next_char, override);
+
+         if (type_of_next == WEAK_BN
+             || bidi_explicit_dir_char (next_char))
+           {
+             bidi_copy_it (&saved_it, bidi_it);
+             while (bidi_resolve_explicit (bidi_it) == new_level
+                    && bidi_it->type == WEAK_BN)
+               ;
+             type_of_next = bidi_it->type;
+             bidi_copy_it (bidi_it, &saved_it);
+           }
+
+         /* If the next character is EN, but the last strong-type
+            character is AL, that next EN will be changed to AN when
+            we process it in W2 above.  So in that case, this ES
+            should not be changed into EN.  */
+         if (type == WEAK_ES
+             && type_of_next == WEAK_EN
+             && bidi_it->last_strong.type_after_w1 != STRONG_AL)
+           type = WEAK_EN;
+         else if (type == WEAK_CS)
+           {
+             if (bidi_it->prev.type_after_w1 == WEAK_AN
+                 && (type_of_next == WEAK_AN
+                     /* If the next character is EN, but the last
+                        strong-type character is AL, EN will be later
+                        changed to AN when we process it in W2 above.
+                        So in that case, this ES should not be
+                        changed into EN.  */
+                     || (type_of_next == WEAK_EN
+                         && bidi_it->last_strong.type_after_w1 == STRONG_AL)))
+               type = WEAK_AN;
+             else if (bidi_it->prev.type_after_w1 == WEAK_EN
+                      && type_of_next == WEAK_EN
+                      && bidi_it->last_strong.type_after_w1 != STRONG_AL)
+               type = WEAK_EN;
+           }
+       }
+      else if (type == WEAK_ET /* W5: ET with EN before or after it */
+              || type == WEAK_BN)      /* W5/Retaining */
+       {
+         if (bidi_it->prev.type_after_w1 == WEAK_EN /* ET/BN w/EN before it */
+             || bidi_it->next_en_pos > bidi_it->charpos)
+           type = WEAK_EN;
+         else                  /* W5: ET/BN with EN after it.  */
+           {
+             EMACS_INT en_pos = bidi_it->charpos + 1;
+
+             next_char =
+               bidi_it->bytepos + bidi_it->ch_len >= ZV_BYTE
+               ? BIDI_EOB : FETCH_CHAR (bidi_it->bytepos + bidi_it->ch_len);
+             type_of_next = bidi_get_type (next_char, override);
+
+             if (type_of_next == WEAK_ET
+                 || type_of_next == WEAK_BN
+                 || bidi_explicit_dir_char (next_char))
+               {
+                 bidi_copy_it (&saved_it, bidi_it);
+                 while (bidi_resolve_explicit (bidi_it) == new_level
+                        && (bidi_it->type == WEAK_BN
+                            || bidi_it->type == WEAK_ET))
+                   ;
+                 type_of_next = bidi_it->type;
+                 en_pos = bidi_it->charpos;
+                 bidi_copy_it (bidi_it, &saved_it);
+               }
+             if (type_of_next == WEAK_EN)
+               {
+                 /* If the last strong character is AL, the EN we've
+                    found will become AN when we get to it (W2). */
+                 if (bidi_it->last_strong.type_after_w1 != STRONG_AL)
+                   {
+                     type = WEAK_EN;
+                     /* Remember this EN position, to speed up processing
+                        of the next ETs.  */
+                     bidi_it->next_en_pos = en_pos;
+                   }
+                 else if (type == WEAK_BN)
+                   type = NEUTRAL_ON; /* W6/Retaining */
+               }
+           }
+       }
+    }
+
+  if (type == WEAK_ES || type == WEAK_ET || type == WEAK_CS /* W6 */
+      || (type == WEAK_BN
+         && (bidi_it->prev.type_after_w1 == WEAK_CS        /* W6/Retaining */
+             || bidi_it->prev.type_after_w1 == WEAK_ES
+             || bidi_it->prev.type_after_w1 == WEAK_ET)))
+    type = NEUTRAL_ON;
+
+  /* Store the type we've got so far, before we clobber it with strong
+     types in W7 and while resolving neutral types.  But leave alone
+     the original types that were recorded above, because we will need
+     them for the L1 clause.  */
+  if (bidi_it->type_after_w1 == UNKNOWN_BT)
+    bidi_it->type_after_w1 = type;
+  bidi_check_type (bidi_it->type_after_w1);
+
+  if (type == WEAK_EN) /* W7 */
+    {
+      if ((bidi_it->last_strong.type_after_w1 == STRONG_L)
+         || (bidi_it->last_strong.type == UNKNOWN_BT && bidi_it->sor == L2R))
+       type = STRONG_L;
+    }
+
+  bidi_it->type = type;
+  bidi_check_type (bidi_it->type);
+  return type;
+}
+
+bidi_type_t
+bidi_resolve_neutral (struct bidi_it *bidi_it)
+{
+  int prev_level = bidi_it->level_stack[bidi_it->stack_idx].level;
+  bidi_type_t type = bidi_resolve_weak (bidi_it);
+  int current_level = bidi_it->level_stack[bidi_it->stack_idx].level;
+
+  if (!(type == STRONG_R
+       || type == STRONG_L
+       || type == WEAK_BN
+       || type == WEAK_EN
+       || type == WEAK_AN
+       || type == NEUTRAL_B
+       || type == NEUTRAL_S
+       || type == NEUTRAL_WS
+       || type == NEUTRAL_ON))
+    abort ();
+
+  if (bidi_get_category (type) == NEUTRAL
+      || (type == WEAK_BN && prev_level == current_level))
+    {
+      if (bidi_it->next_for_neutral.type != UNKNOWN_BT)
+       type = bidi_resolve_neutral_1 (bidi_it->prev_for_neutral.type,
+                                      bidi_it->next_for_neutral.type,
+                                      current_level);
+      else
+       {
+         /* Arrrgh!!  The UAX#9 algorithm is too deeply entrenched in
+            the assumption of batch-style processing; see clauses W4,
+            W5, and especially N1, which require to look far forward
+            (as well as back) in the buffer.  May the fleas of a
+            thousand camels infest the armpits of those who design
+            supposedly general-purpose algorithms by looking at their
+            own implementations, and fail to consider other possible
+            implementations!  */
+         struct bidi_it saved_it;
+         bidi_type_t next_type;
+
+         if (bidi_it->scan_dir == -1)
+           abort ();
+
+         bidi_copy_it (&saved_it, bidi_it);
+         /* Scan the text forward until we find the first non-neutral
+            character, and then use that to resolve the neutral we
+            are dealing with now.  We also cache the scanned iterator
+            states, to salvage some of the effort later.  */
+         bidi_cache_iterator_state (bidi_it, 0);
+         do {
+           /* Record the info about the previous character, so that
+              it will be cached below with this state.  */
+           if (bidi_it->type_after_w1 != WEAK_BN /* W1/Retaining */
+               && bidi_it->type != WEAK_BN)
+             bidi_remember_char (&bidi_it->prev, bidi_it);
+           type = bidi_resolve_weak (bidi_it);
+           /* Paragraph separators have their levels fully resolved
+              at this point, so cache them as resolved.  */
+           bidi_cache_iterator_state (bidi_it, type == NEUTRAL_B);
+           /* FIXME: implement L1 here, by testing for a newline and
+              resetting the level for any sequence of whitespace
+              characters adjacent to it.  */
+         } while (!(type == NEUTRAL_B
+                    || (type != WEAK_BN
+                        && bidi_get_category (type) != NEUTRAL)
+                    /* This is all per level run, so stop when we
+                       reach the end of this level run.  */
+                    || bidi_it->level_stack[bidi_it->stack_idx].level !=
+                    current_level));
+
+         bidi_remember_char (&saved_it.next_for_neutral, bidi_it);
+
+         switch (type)
+           {
+             case STRONG_L:
+             case STRONG_R:
+             case STRONG_AL:
+               next_type = type;
+               break;
+             case WEAK_EN:
+             case WEAK_AN:
+               /* N1: ``European and Arabic numbers are treated as
+                  though they were R.''  */
+               next_type = STRONG_R;
+               saved_it.next_for_neutral.type = STRONG_R;
+               break;
+             case WEAK_BN:
+               if (!bidi_explicit_dir_char (bidi_it->ch))
+                 abort ();             /* can't happen: BNs are skipped */
+               /* FALLTHROUGH */
+             case NEUTRAL_B:
+               /* Marched all the way to the end of this level run.
+                  We need to use the eor type, whose information is
+                  stored by bidi_set_sor_type in the prev_for_neutral
+                  member.  */
+               if (saved_it.type != WEAK_BN
+                   || bidi_get_category (bidi_it->prev.type_after_w1) == NEUTRAL)
+                 {
+                   next_type = bidi_it->prev_for_neutral.type;
+                   saved_it.next_for_neutral.type = next_type;
+                   bidi_check_type (next_type);
+                 }
+               else
+                 {
+                   /* This is a BN which does not adjoin neutrals.
+                      Leave its type alone.  */
+                   bidi_copy_it (bidi_it, &saved_it);
+                   return bidi_it->type;
+                 }
+               break;
+             default:
+               abort ();
+           }
+         type = bidi_resolve_neutral_1 (saved_it.prev_for_neutral.type,
+                                        next_type, current_level);
+         saved_it.type = type;
+         bidi_check_type (type);
+         bidi_copy_it (bidi_it, &saved_it);
+       }
+    }
+  return type;
+}
+
+/* Given an iterator state in BIDI_IT, advance one character position
+   in the buffer to the next character (in the logical order), resolve
+   the bidi type of that next character, and return that type.  */
+bidi_type_t
+bidi_type_of_next_char (struct bidi_it *bidi_it)
+{
+  bidi_type_t type;
+
+  /* This should always be called during a forward scan.  */
+  if (bidi_it->scan_dir != 1)
+    abort ();
+
+  /* Reset the limit until which to ignore BNs if we step out of the
+     area where we found only empty levels.  */
+  if ((bidi_it->ignore_bn_limit > 0
+       && bidi_it->ignore_bn_limit <= bidi_it->charpos)
+      || (bidi_it->ignore_bn_limit == -1
+         && !bidi_explicit_dir_char (bidi_it->ch)))
+    bidi_it->ignore_bn_limit = 0;
+
+  type = bidi_resolve_neutral (bidi_it);
+
+  return type;
+}
+
+/* Given an iterator state BIDI_IT, advance one character position in
+   the buffer to the next character (in the logical order), resolve
+   the embedding and implicit levels of that next character, and
+   return the resulting level.  */
+int
+bidi_level_of_next_char (struct bidi_it *bidi_it)
+{
+  bidi_type_t type;
+  int level, prev_level = -1;
+  struct bidi_saved_info next_for_neutral;
+
+  if (bidi_it->scan_dir == 1)
+    {
+      /* There's no sense in trying to advance if we hit end of text.  */
+      if (bidi_it->ch == BIDI_EOB)
+       return bidi_it->resolved_level;
+
+      /* Record the info about the previous character.  */
+      if (bidi_it->type_after_w1 != WEAK_BN /* W1/Retaining */
+         && bidi_it->type != WEAK_BN)
+       bidi_remember_char (&bidi_it->prev, bidi_it);
+      if (bidi_it->type_after_w1 == STRONG_R
+         || bidi_it->type_after_w1 == STRONG_L
+         || bidi_it->type_after_w1 == STRONG_AL)
+       bidi_remember_char (&bidi_it->last_strong, bidi_it);
+      /* FIXME: it sounds like we don't need both prev and
+        prev_for_neutral members, but I'm leaving them both for now.  */
+      if (bidi_it->type == STRONG_R || bidi_it->type == STRONG_L
+         || bidi_it->type == WEAK_EN || bidi_it->type == WEAK_AN)
+       bidi_remember_char (&bidi_it->prev_for_neutral, bidi_it);
+
+      /* If we overstepped the characters used for resolving neutrals
+        and whitespace, invalidate their info in the iterator.  */
+      if (bidi_it->charpos >= bidi_it->next_for_neutral.charpos)
+       bidi_it->next_for_neutral.type = UNKNOWN_BT;
+      if (bidi_it->next_en_pos >= 0
+         && bidi_it->charpos >= bidi_it->next_en_pos)
+       bidi_it->next_en_pos = -1;
+      if (bidi_it->next_for_ws.type != UNKNOWN_BT
+         && bidi_it->charpos >= bidi_it->next_for_ws.charpos)
+       bidi_it->next_for_ws.type = UNKNOWN_BT;
+
+      /* This must be taken before we fill the iterator with the info
+        about the next char.  If we scan backwards, the iterator
+        state must be already cached, so there's no need to know the
+        embedding level of the previous character, since we will be
+        returning to our caller shortly.  */
+      prev_level = bidi_it->level_stack[bidi_it->stack_idx].level;
+    }
+  next_for_neutral = bidi_it->next_for_neutral;
+
+  /* Perhaps it is already cached.  */
+  type = bidi_cache_find (bidi_it->charpos + bidi_it->scan_dir, -1, bidi_it);
+  if (type != UNKNOWN_BT)
+    {
+      /* Don't lose the information for resolving neutrals!  The
+        cached states could have been cached before their
+        next_for_neutral member was computed.  If we are on our way
+        forward, we can simply take the info from the previous
+        state.  */
+      if (bidi_it->scan_dir == 1
+         && bidi_it->next_for_neutral.type == UNKNOWN_BT)
+       bidi_it->next_for_neutral = next_for_neutral;
+
+      /* If resolved_level is -1, it means this state was cached
+        before it was completely resolved, so we cannot return
+        it.  */
+      if (bidi_it->resolved_level != -1)
+       return bidi_it->resolved_level;
+    }
+  if (bidi_it->scan_dir == -1)
+    /* If we are going backwards, the iterator state is already cached
+       from previous scans, and should be fully resolved.  */
+    abort ();
+
+  if (type == UNKNOWN_BT)
+    type = bidi_type_of_next_char (bidi_it);
+
+  if (type == NEUTRAL_B)
+    return bidi_it->resolved_level;
+
+  level = bidi_it->level_stack[bidi_it->stack_idx].level;
+  if ((bidi_get_category (type) == NEUTRAL /* && type != NEUTRAL_B */)
+      || (type == WEAK_BN && prev_level == level))
+    {
+      if (bidi_it->next_for_neutral.type == UNKNOWN_BT)
+       abort ();
+
+      /* If the cached state shows a neutral character, it was not
+        resolved by bidi_resolve_neutral, so do it now.  */
+      type = bidi_resolve_neutral_1 (bidi_it->prev_for_neutral.type,
+                                    bidi_it->next_for_neutral.type,
+                                    level);
+    }
+
+  if (!(type == STRONG_R
+       || type == STRONG_L
+       || type == WEAK_BN
+       || type == WEAK_EN
+       || type == WEAK_AN))
+    abort ();
+  bidi_it->type = type;
+  bidi_check_type (bidi_it->type);
+
+  /* For L1 below, we need to know, for each WS character, whether
+     it belongs to a sequence of WS characters preceeding a newline
+     or a TAB or a paragraph separator.  */
+  if (bidi_it->orig_type == NEUTRAL_WS
+      && bidi_it->next_for_ws.type == UNKNOWN_BT)
+    {
+      int ch;
+      int clen = bidi_it->ch_len;
+      EMACS_INT bpos = bidi_it->bytepos;
+      EMACS_INT cpos = bidi_it->charpos;
+      bidi_type_t chtype;
+
+      do {
+       /*_fetch_multibyte_char_len = 1;*/
+       ch = bpos + clen >= ZV_BYTE ? BIDI_EOB : FETCH_CHAR (bpos + clen);
+       bpos += clen;
+       cpos++;
+       clen = (ch == BIDI_EOB ? 1 : CHAR_BYTES (ch));
+       if (ch == '\n' || ch == BIDI_EOB /* || ch == LINESEP_CHAR */)
+         chtype = NEUTRAL_B;
+       else
+         chtype = bidi_get_type (ch, NEUTRAL_DIR);
+      } while (chtype == NEUTRAL_WS || chtype == WEAK_BN
+              || bidi_explicit_dir_char (ch)); /* L1/Retaining */
+      bidi_it->next_for_ws.type = chtype;
+      bidi_check_type (bidi_it->next_for_ws.type);
+      bidi_it->next_for_ws.charpos = cpos;
+      bidi_it->next_for_ws.bytepos = bpos;
+    }
+
+  /* Resolve implicit levels, with a twist: PDFs get the embedding
+     level of the enbedding they terminate.  See below for the
+     reason.  */
+  if (bidi_it->orig_type == PDF
+      /* Don't do this if this formatting code didn't change the
+        embedding level due to invalid or empty embeddings.  */
+      && prev_level != level)
+    {
+      /* Don't look in UAX#9 for the reason for this: it's our own
+        private quirk.  The reason is that we want the formatting
+        codes to be delivered so that they bracket the text of their
+        embedding.  For example, given the text
+
+            {RLO}teST{PDF}
+
+        we want it to be displayed as
+
+            {RLO}STet{PDF}
+
+        not as
+
+            STet{RLO}{PDF}
+
+        which will result because we bump up the embedding level as
+        soon as we see the RLO and pop it as soon as we see the PDF,
+        so RLO itself has the same embedding level as "teST", and
+        thus would be normally delivered last, just before the PDF.
+        The switch below fiddles with the level of PDF so that this
+        ugly side effect does not happen.
+
+        (This is, of course, only important if the formatting codes
+        are actually displayed, but Emacs does need to display them
+        if the user wants to.)  */
+      level = prev_level;
+    }
+  else if (bidi_it->orig_type == NEUTRAL_B /* L1 */
+          || bidi_it->orig_type == NEUTRAL_S
+          || bidi_it->ch == '\n' || bidi_it->ch == BIDI_EOB
+          /* || bidi_it->ch == LINESEP_CHAR */
+          || (bidi_it->orig_type == NEUTRAL_WS
+              && (bidi_it->next_for_ws.type == NEUTRAL_B
+                  || bidi_it->next_for_ws.type == NEUTRAL_S)))
+    level = bidi_it->level_stack[0].level;
+  else if ((level & 1) == 0) /* I1 */
+    {
+      if (type == STRONG_R)
+       level++;
+      else if (type == WEAK_EN || type == WEAK_AN)
+       level += 2;
+    }
+  else                 /* I2 */
+    {
+      if (type == STRONG_L || type == WEAK_EN || type == WEAK_AN)
+       level++;
+    }
+
+  bidi_it->resolved_level = level;
+  return level;
+}
+
+/* Move to the other edge of a level given by LEVEL.  If END_FLAG is
+   non-zero, we are at the end of a level, and we need to prepare to
+   resume the scan of the lower level.
+
+   If this level's other edge is cached, we simply jump to it, filling
+   the iterator structure with the iterator state on the other edge.
+   Otherwise, we walk the buffer until we come back to the same level
+   as LEVEL.
+
+   Note: we are not talking here about a ``level run'' in the UAX#9
+   sense of the term, but rather about a ``level'' which includes
+   all the levels higher than it.  In other words, given the levels
+   like this:
+
+         11111112222222333333334443343222222111111112223322111
+                A      B                    C
+
+   and assuming we are at point A scanning left to right, this
+   function moves to point C, whereas the UAX#9 ``level 2 run'' ends
+   at point B.  */
+static void
+bidi_find_other_level_edge (struct bidi_it *bidi_it, int level, int end_flag)
+{
+  int dir = end_flag ? -bidi_it->scan_dir : bidi_it->scan_dir;
+  int idx;
+
+  /* Try the cache first.  */
+  if ((idx = bidi_cache_find_level_change (level, dir, end_flag)) >= 0)
+    bidi_cache_fetch_state (idx, bidi_it);
+  else
+    {
+      int new_level;
+
+      if (end_flag)
+       abort (); /* if we are at end of level, its edges must be cached */
+
+      bidi_cache_iterator_state (bidi_it, 1);
+      do {
+       new_level = bidi_level_of_next_char (bidi_it);
+       bidi_cache_iterator_state (bidi_it, 1);
+      } while (new_level >= level);
+    }
+}
+
+void
+bidi_get_next_char_visually (struct bidi_it *bidi_it)
+{
+  int old_level, new_level, next_level;
+  struct bidi_it sentinel;
+
+  if (bidi_it->scan_dir == 0)
+    {
+      bidi_it->scan_dir = 1;   /* default to logical order */
+    }
+
+  /* If we just passed a newline, initialize for the next line.  */
+  if (!bidi_it->first_elt && bidi_it->orig_type == NEUTRAL_B)
+    bidi_line_init (bidi_it);
+
+  /* Prepare the sentinel iterator state.  */
+  if (bidi_cache_idx == 0)
+    {
+      bidi_copy_it (&sentinel, bidi_it);
+      if (bidi_it->first_elt)
+       {
+         sentinel.charpos--;   /* cached charpos needs to be monotonic */
+         sentinel.bytepos--;
+         sentinel.ch = '\n';   /* doesn't matter, but why not? */
+         sentinel.ch_len = 1;
+       }
+    }
+
+  old_level = bidi_it->resolved_level;
+  new_level = bidi_level_of_next_char (bidi_it);
+
+  /* Reordering of resolved levels (clause L2) is implemented by
+     jumping to the other edge of the level and flipping direction of
+     scanning the text whenever we find a level change.  */
+  if (new_level != old_level)
+    {
+      int ascending = new_level > old_level;
+      int level_to_search = ascending ? old_level + 1 : old_level;
+      int incr = ascending ? 1 : -1;
+      int expected_next_level = old_level + incr;
+
+      /* If we don't have anything cached yet, we need to cache the
+        sentinel state, since we'll need it to record where to jump
+        when the last non-base level is exhausted.  */
+      if (bidi_cache_idx == 0)
+       bidi_cache_iterator_state (&sentinel, 1);
+      /* Jump (or walk) to the other edge of this level.  */
+      bidi_find_other_level_edge (bidi_it, level_to_search, !ascending);
+      /* Switch scan direction and peek at the next character in the
+        new direction.  */
+      bidi_it->scan_dir = -bidi_it->scan_dir;
+
+      /* The following loop handles the case where the resolved level
+        jumps by more than one.  This is typical for numbers inside a
+        run of text with left-to-right embedding direction, but can
+        also happen in other situations.  In those cases the decision
+        where to continue after a level change, and in what direction,
+        is tricky.  For example, given a text like below:
+
+                 abcdefgh
+                 11336622
+
+        (where the numbers below the text show the resolved levels),
+        the result of reordering according to UAX#9 should be this:
+
+                 efdcghba
+
+        This is implemented by the loop below which flips direction
+        and jumps to the other edge of the level each time it finds
+        the new level not to be the expected one.  The expected level
+        is always one more or one less than the previous one.  */
+      next_level = bidi_peek_at_next_level (bidi_it);
+      while (next_level != expected_next_level)
+       {
+         expected_next_level += incr;
+         level_to_search += incr;
+         bidi_find_other_level_edge (bidi_it, level_to_search, !ascending);
+         bidi_it->scan_dir = -bidi_it->scan_dir;
+         next_level = bidi_peek_at_next_level (bidi_it);
+       }
+
+      /* Finally, deliver the next character in the new direction.  */
+      next_level = bidi_level_of_next_char (bidi_it);
+    }
+
+  /* Take note when we have just processed the newline that precedes
+     the end of the paragraph.  The next time we are about to be
+     called, set_iterator_to_next will automatically reinit the
+     paragraph direction, if needed.  We do this at the newline before
+     the paragraph separator, because the next character might not be
+     the first character of the next paragraph, due to the bidi
+     reordering, whereas we _must_ know the paragraph base direction
+     _before_ we process the paragraph's text, since the base
+     direction affects the reordering.  */
+  if (bidi_it->scan_dir == 1
+      && bidi_it->orig_type == NEUTRAL_B
+      && bidi_it->bytepos < ZV_BYTE)
+    {
+      EMACS_INT sep_len =
+       bidi_at_paragraph_end (bidi_it->charpos + 1,
+                              bidi_it->bytepos + bidi_it->ch_len);
+      if (sep_len >= 0)
+       {
+         bidi_it->new_paragraph = 1;
+         /* Record the buffer position of the last character of the
+            paragraph separator.  */
+         bidi_it->separator_limit = bidi_it->charpos + 1 + sep_len;
+       }
+    }
+
+  if (bidi_it->scan_dir == 1 && bidi_cache_idx)
+    {
+      /* If we are at paragraph's base embedding level and beyond the
+        last cached position, the cache's job is done and we can
+        discard it.  */
+      if (bidi_it->resolved_level == bidi_it->level_stack[0].level
+         && bidi_it->charpos > bidi_cache[bidi_cache_idx - 1].charpos)
+       bidi_cache_reset ();
+       /* But as long as we are caching during forward scan, we must
+          cache each state, or else the cache integrity will be
+          compromised: it assumes cached states correspond to buffer
+          positions 1:1.  */
+      else
+       bidi_cache_iterator_state (bidi_it, 1);
+    }
+}
+
+/* This is meant to be called from within the debugger, whenever you
+   wish to examine the cache contents.  */
+void
+bidi_dump_cached_states (void)
+{
+  int i;
+  int ndigits = 1;
+
+  if (bidi_cache_idx == 0)
+    {
+      fprintf (stderr, "The cache is empty.\n");
+      return;
+    }
+  fprintf (stderr, "Total of %d state%s in cache:\n",
+          bidi_cache_idx, bidi_cache_idx == 1 ? "" : "s");
+
+  for (i = bidi_cache[bidi_cache_idx - 1].charpos; i > 0; i /= 10)
+    ndigits++;
+  fputs ("ch  ", stderr);
+  for (i = 0; i < bidi_cache_idx; i++)
+    fprintf (stderr, "%*c", ndigits, bidi_cache[i].ch);
+  fputs ("\n", stderr);
+  fputs ("lvl ", stderr);
+  for (i = 0; i < bidi_cache_idx; i++)
+    fprintf (stderr, "%*d", ndigits, bidi_cache[i].resolved_level);
+  fputs ("\n", stderr);
+  fputs ("pos ", stderr);
+  for (i = 0; i < bidi_cache_idx; i++)
+    fprintf (stderr, "%*d", ndigits, bidi_cache[i].charpos);
+  fputs ("\n", stderr);
+}
index a0acad309af557c58fd40b49c55ae9d32e0612d4..0c6e57d45be9446ddc85712cbbd295006f8e329f 100644 (file)
@@ -2279,6 +2279,8 @@ DEFUN ("buffer-swap-text", Fbuffer_swap_text, Sbuffer_swap_text,
   swapfield (undo_list, Lisp_Object);
   swapfield (mark, Lisp_Object);
   swapfield (enable_multibyte_characters, Lisp_Object);
+  swapfield (bidi_display_reordering, Lisp_Object);
+  swapfield (bidi_paragraph_direction, Lisp_Object);
   /* FIXME: Not sure what we should do with these *_marker fields.
      Hopefully they're just nil anyway.  */
   swapfield (pt_marker, Lisp_Object);
@@ -5206,7 +5208,9 @@ init_buffer_once ()
   buffer_defaults.truncate_lines = Qnil;
   buffer_defaults.word_wrap = Qnil;
   buffer_defaults.ctl_arrow = Qt;
+  buffer_defaults.bidi_display_reordering = Qnil;
   buffer_defaults.direction_reversed = Qnil;
+  buffer_defaults.bidi_paragraph_direction = Qnil;
   buffer_defaults.cursor_type = Qt;
   buffer_defaults.extra_line_spacing = Qnil;
   buffer_defaults.cursor_in_non_selected_windows = Qt;
@@ -5291,7 +5295,9 @@ init_buffer_once ()
   XSETFASTINT (buffer_local_flags.syntax_table, idx); ++idx;
   XSETFASTINT (buffer_local_flags.cache_long_line_scans, idx); ++idx;
   XSETFASTINT (buffer_local_flags.category_table, idx); ++idx;
+  XSETFASTINT (buffer_local_flags.bidi_display_reordering, idx); ++idx;
   XSETFASTINT (buffer_local_flags.direction_reversed, idx); ++idx;
+  XSETFASTINT (buffer_local_flags.bidi_paragraph_direction, idx); ++idx;
   XSETFASTINT (buffer_local_flags.buffer_file_coding_system, idx);
   /* Make this one a permanent local.  */
   buffer_permanent_local_flags[idx++] = 1;
@@ -5548,11 +5554,6 @@ This is the same as (default-value 'abbrev-mode).  */);
                     doc: /* Default value of `ctl-arrow' for buffers that do not override it.
 This is the same as (default-value 'ctl-arrow).  */);
 
-  DEFVAR_LISP_NOPRO ("default-direction-reversed",
-                     &buffer_defaults.direction_reversed,
-                     doc: /* Default value of `direction-reversed' for buffers that do not override it.
-This is the same as (default-value 'direction-reversed).  */);
-
   DEFVAR_LISP_NOPRO ("default-enable-multibyte-characters",
                      &buffer_defaults.enable_multibyte_characters,
                      doc: /* *Default value of `enable-multibyte-characters' for buffers not overriding it.
@@ -5809,11 +5810,29 @@ The variable `coding-system-for-write', if non-nil, overrides this variable.
 
 This variable is never applied to a way of decoding a file while reading it.  */);
 
-  DEFVAR_PER_BUFFER ("direction-reversed", &current_buffer->direction_reversed,
-                    Qnil,
-                    doc: /* *Non-nil means lines in the buffer are displayed right to left.  */);
-
-  DEFVAR_PER_BUFFER ("truncate-lines", &current_buffer->truncate_lines, Qnil,
+  DEFVAR_PER_BUFFER ("direction-reversed",
+                    &current_buffer->direction_reversed, Qnil,
+                    doc: /* Non-nil means set beginning of lines at the right edge of the window.
+See also the variable `bidi-display-reordering'.  */);
+
+  DEFVAR_PER_BUFFER ("bidi-display-reordering",
+                    &current_buffer->bidi_display_reordering, Qnil,
+                    doc: /* Non-nil means reorder bidirectional text for display in the visual order.
+See also the variable `direction-reversed'.  */);
+
+  DEFVAR_PER_BUFFER ("bidi-paragraph-direction",
+                    &current_buffer->bidi_paragraph_direction, Qnil,
+                    doc: /* *If non-nil, forces directionality of text paragraphs in the buffer.
+                            
+If this is nil (the default), the direction of each paragraph is
+determined by the first strong directional character of its text.
+The values of `right-to-left' and `left-to-right' override that.
+Any other value is treated as nil.
+                            
+This variable has no effect unless the buffer's value of
+\`bidi-display-reordering' is non-nil.  */);
+
+ DEFVAR_PER_BUFFER ("truncate-lines", &current_buffer->truncate_lines, Qnil,
                     doc: /* *Non-nil means do not display continuation lines.
 Instead, give each line of text just one screen line.
 
index 5217c6d7298311b79d2b61e01f97e07a57679102..40f03daca902a09a1afbee0004fcb546b1b709cc 100644 (file)
@@ -662,8 +662,16 @@ struct buffer
   Lisp_Object word_wrap;
   /* Non-nil means display ctl chars with uparrow.  */
   Lisp_Object ctl_arrow;
-  /* Non-nil means display text from right to left.  */
+  /* Non-nil means reorder bidirectional text for display in the
+     visual order.  */
+  Lisp_Object bidi_display_reordering;
+  /* Non-nil means set beginning of lines at the right edge of
+     windows.  */
   Lisp_Object direction_reversed;
+  /* If non-nil, specifies which direction of text to force in all the
+     paragraphs of the buffer.  Nil means determine paragraph
+     direction dynamically for each paragraph.  */
+  Lisp_Object bidi_paragraph_direction;
   /* Non-nil means do selective display;
      see doc string in syms_of_buffer (buffer.c) for details.  */
   Lisp_Object selective_display;
index f6bf37cb7dbe2dd284ee90dfce47935aa76cfe11..73d3791074ed0579ded65f42044ccc9bb1a5101b 100644 (file)
--- a/src/cm.c
+++ b/src/cm.c
@@ -33,13 +33,8 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 /* For now, don't try to include termcap.h.  On some systems,
    configure finds a non-standard termcap.h that the main build
    won't find.  */
-
-#if defined HAVE_TERMCAP_H && 0
-#include <termcap.h>
-#else
 extern void tputs P_ ((const char *, int, int (*)(int)));
 extern char *tgoto P_ ((const char *, int, int));
-#endif
 
 #define        BIG     9999            /* 9999 good on VAXen.  For 16 bit machines
                                   use about 2000.... */
index b321c586a4a54d46686cf34528151e3867489573..e1837e745605ba29889676ded989ed92278d0819 100644 (file)
@@ -264,8 +264,7 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 /* Define to 1 if you have the `get_current_dir_name' function. */
 #undef HAVE_GET_CURRENT_DIR_NAME
 
-/* Define to 1 if you have a gif library (default -lgif; otherwise specify
-   with LIBGIF). */
+/* Define to 1 if you have a gif (or ungif) library. */
 #undef HAVE_GIF
 
 /* Define to 1 if you have the gpm library (-lgpm). */
@@ -319,10 +318,10 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 /* Define to 1 if you have the <kerberos/krb.h> header file. */
 #undef HAVE_KERBEROS_KRB_H
 
-/* Define to 1 if `e_text' is member of `krb5_error'. */
+/* Define to 1 if `e_text' is member of `krb5_error'. */
 #undef HAVE_KRB5_ERROR_E_TEXT
 
-/* Define to 1 if `text' is member of `krb5_error'. */
+/* Define to 1 if `text' is member of `krb5_error'. */
 #undef HAVE_KRB5_ERROR_TEXT
 
 /* Define to 1 if you have the <krb5.h> header file. */
@@ -616,25 +615,25 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 /* Define to 1 if you have the `strsignal' function. */
 #undef HAVE_STRSIGNAL
 
-/* Define to 1 if `ifr_addr' is member of `struct ifreq'. */
+/* Define to 1 if `ifr_addr' is member of `struct ifreq'. */
 #undef HAVE_STRUCT_IFREQ_IFR_ADDR
 
-/* Define to 1 if `ifr_broadaddr' is member of `struct ifreq'. */
+/* Define to 1 if `ifr_broadaddr' is member of `struct ifreq'. */
 #undef HAVE_STRUCT_IFREQ_IFR_BROADADDR
 
-/* Define to 1 if `ifr_flags' is member of `struct ifreq'. */
+/* Define to 1 if `ifr_flags' is member of `struct ifreq'. */
 #undef HAVE_STRUCT_IFREQ_IFR_FLAGS
 
-/* Define to 1 if `ifr_hwaddr' is member of `struct ifreq'. */
+/* Define to 1 if `ifr_hwaddr' is member of `struct ifreq'. */
 #undef HAVE_STRUCT_IFREQ_IFR_HWADDR
 
-/* Define to 1 if `ifr_netmask' is member of `struct ifreq'. */
+/* Define to 1 if `ifr_netmask' is member of `struct ifreq'. */
 #undef HAVE_STRUCT_IFREQ_IFR_NETMASK
 
-/* Define to 1 if `n_un.n_name' is member of `struct nlist'. */
+/* Define to 1 if `n_un.n_name' is member of `struct nlist'. */
 #undef HAVE_STRUCT_NLIST_N_UN_N_NAME
 
-/* Define to 1 if `tm_zone' is member of `struct tm'. */
+/* Define to 1 if `tm_zone' is member of `struct tm'. */
 #undef HAVE_STRUCT_TM_TM_ZONE
 
 /* Define to 1 if `struct utimbuf' is declared by <utime.h>. */
@@ -697,9 +696,6 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 /* Define to 1 if you have the <sys/_mbstate_t.h> header file. */
 #undef HAVE_SYS__MBSTATE_T_H
 
-/* Define to 1 if you have the <termcap.h> header file. */
-#undef HAVE_TERMCAP_H
-
 /* Define to 1 if you have the <termios.h> header file. */
 #undef HAVE_TERMIOS_H
 
@@ -821,12 +817,18 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
    Solaris, for example). */
 #undef LD_SWITCH_X_SITE_AUX
 
-/* Compiler option to link with the gif library (if not -lgif). */
-#undef LIBGIF
-
 /* Define to 1 if localtime caches TZ. */
 #undef LOCALTIME_CACHE
 
+/* String giving fallback POP mail host. */
+#undef MAILHOST
+
+/* Define to unlink, rather than empty, mail spool after reading. */
+#undef MAIL_UNLINK_SPOOL
+
+/* Define to support MMDF mailboxes in movemail. */
+#undef MAIL_USE_MMDF
+
 /* Define to support POP mail retrieval. */
 #undef MAIL_USE_POP
 
@@ -858,6 +860,9 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 /* Define to the one symbol short name of this package. */
 #undef PACKAGE_TARNAME
 
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
 /* Define to the version of this package. */
 #undef PACKAGE_VERSION
 
@@ -917,6 +922,28 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 /* Define to 1 if using the Motif X toolkit. */
 #undef USE_MOTIF
 
+/* Enable extensions on AIX 3, Interix.  */
+#ifndef _ALL_SOURCE
+# undef _ALL_SOURCE
+#endif
+/* Enable GNU extensions on systems that have them.  */
+#ifndef _GNU_SOURCE
+# undef _GNU_SOURCE
+#endif
+/* Enable threading extensions on Solaris.  */
+#ifndef _POSIX_PTHREAD_SEMANTICS
+# undef _POSIX_PTHREAD_SEMANTICS
+#endif
+/* Enable extensions on HP NonStop.  */
+#ifndef _TANDEM_SOURCE
+# undef _TANDEM_SOURCE
+#endif
+/* Enable general extensions on Solaris.  */
+#ifndef __EXTENSIONS__
+# undef __EXTENSIONS__
+#endif
+
+
 /* Define to 1 if we should use toolkit scroll bars. */
 #undef USE_TOOLKIT_SCROLL_BARS
 
@@ -952,28 +979,6 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 /* Define to 1 if you need to in order for `stat' and other things to work. */
 #undef _POSIX_SOURCE
 
-/* Enable extensions on AIX 3, Interix.  */
-#ifndef _ALL_SOURCE
-# undef _ALL_SOURCE
-#endif
-/* Enable GNU extensions on systems that have them.  */
-#ifndef _GNU_SOURCE
-# undef _GNU_SOURCE
-#endif
-/* Enable threading extensions on Solaris.  */
-#ifndef _POSIX_PTHREAD_SEMANTICS
-# undef _POSIX_PTHREAD_SEMANTICS
-#endif
-/* Enable extensions on HP NonStop.  */
-#ifndef _TANDEM_SOURCE
-# undef _TANDEM_SOURCE
-#endif
-/* Enable general extensions on Solaris.  */
-#ifndef __EXTENSIONS__
-# undef __EXTENSIONS__
-#endif
-
-
 /* Define to rpl_ if the getopt replacement functions and variables should be
    used. */
 #undef __GETOPT_PREFIX
index e405ca6af9eb2870d80ab9838c3aaad970284eb9..bdba3a9bb368105ce623134d4e1f3233d3db90d3 100644 (file)
@@ -3291,11 +3291,6 @@ SIGTYPE
 arith_error (signo)
      int signo;
 {
-#if defined(USG) && !defined(POSIX_SIGNALS)
-  /* USG systems forget handlers when they are used;
-     must reestablish each time */
-  signal (signo, arith_error);
-#endif /* USG */
   sigsetmask (SIGEMPTYMASK);
 
   SIGNAL_THREAD_CHECK (signo);
index 22d44fc9083da19dd9419dacb8790d91e5610046..5083199c529ef122812963c1a42cdb105e967e35 100644 (file)
@@ -370,6 +370,16 @@ struct glyph
   /* Non-zero means don't display cursor here.  */
   unsigned avoid_cursor_p : 1;
 
+  /* Resolved bidirectional level of this character [0..63].  */
+  unsigned resolved_level : 5;
+
+  /* Resolved bidirectional type of this character, see enum
+     bidi_type_t below.  Note that according to UAX#9, only some
+     values (STRONG_L, STRONG_R, WEAK_AN, WEAK_EN, WEAK_BN, and
+     NEUTRAL_B) can appear in the resolved type, so we only reserve
+     space for those that can.  */
+  unsigned bidi_type : 3;
+
 #define FACE_ID_BITS   20
 
   /* Face of the glyph.  This is a realized face ID,
@@ -739,14 +749,18 @@ struct glyph_row
   /* First position in this row.  This is the text position, including
      overlay position information etc, where the display of this row
      started, and can thus be less the position of the first glyph
-     (e.g. due to invisible text or horizontal scrolling).  */
+     (e.g. due to invisible text or horizontal scrolling).  BIDI Note:
+     This is the smallest character position in the row, but not
+     necessarily the character that is the leftmost on the display.  */
   struct display_pos start;
 
   /* Text position at the end of this row.  This is the position after
      the last glyph on this row.  It can be greater than the last
      glyph position + 1, due to truncation, invisible text etc.  In an
      up-to-date display, this should always be equal to the start
-     position of the next row.  */
+     position of the next row.  BIDI Note: this is the character whose
+     buffer position is the largest, but not necessarily the rightmost
+     one on the display.  */
   struct display_pos end;
 
   /* Non-zero means the overlay arrow bitmap is on this line.
@@ -872,6 +886,10 @@ struct glyph_row
      the bottom line of the window, but not end of the buffer.  */
   unsigned indicate_bottom_line_p : 1;
 
+  /* Non-zero means the row was reversed to display text in a
+     right-to-left paragraph.  */
+  unsigned reversed_p : 1;
+
   /* Continuation lines width at the start of the row.  */
   int continuation_lines_width;
 
@@ -924,12 +942,18 @@ struct glyph_row *matrix_row P_ ((struct glyph_matrix *, int));
      (MATRIX_ROW ((MATRIX), (ROW))->used[TEXT_AREA])
 
 /* Return the character/ byte position at which the display of ROW
-   starts.  */
+   starts.  BIDI Note: this is the smallest character/byte position
+   among characters in ROW, i.e. the first logical-order character
+   displayed by ROW, which is not necessarily the smallest horizontal
+   position.  */
 
 #define MATRIX_ROW_START_CHARPOS(ROW) ((ROW)->start.pos.charpos)
 #define MATRIX_ROW_START_BYTEPOS(ROW) ((ROW)->start.pos.bytepos)
 
-/* Return the character/ byte position at which ROW ends.  */
+/* Return the character/ byte position at which ROW ends.  BIDI Note:
+   this is the largest character/byte position among characters in
+   ROW, i.e. the last logical-order character displayed by ROW, which
+   is not necessarily the largest horizontal position.  */
 
 #define MATRIX_ROW_END_CHARPOS(ROW) ((ROW)->end.pos.charpos)
 #define MATRIX_ROW_END_BYTEPOS(ROW) ((ROW)->end.pos.bytepos)
@@ -1702,7 +1726,93 @@ struct face_cache
 
 extern int face_change_count;
 
+/* For reordering of bidirectional text.  */
+#define BIDI_MAXLEVEL 64
+
+/* Data type for describing the bidirectional character types.  The
+   first 7 must be at the beginning, because they are the only values
+   valid in the `bidi_type' member of `struct glyph'; we only reserve
+   3 bits for it, so we cannot use there values larger than 7.  */
+typedef enum {
+  UNKNOWN_BT = 0,
+  STRONG_L,    /* strong left-to-right */
+  STRONG_R,    /* strong right-to-left */
+  WEAK_EN,     /* european number */
+  WEAK_AN,     /* arabic number */
+  WEAK_BN,     /* boundary neutral */
+  NEUTRAL_B,   /* paragraph separator */
+  STRONG_AL,   /* arabic right-to-left letter */
+  LRE,         /* left-to-right embedding */
+  LRO,         /* left-to-right override */
+  RLE,         /* right-to-left embedding */
+  RLO,         /* right-to-left override */
+  PDF,         /* pop directional format */
+  WEAK_ES,     /* european number separator */
+  WEAK_ET,     /* european number terminator */
+  WEAK_CS,     /* common separator */
+  WEAK_NSM,    /* non-spacing mark */
+  NEUTRAL_S,   /* segment separator */
+  NEUTRAL_WS,  /* whitespace */
+  NEUTRAL_ON   /* other neutrals */
+} bidi_type_t;
+
+/* The basic directionality data type.  */
+typedef enum { NEUTRAL_DIR, L2R, R2L } bidi_dir_t;
+
+/* Data type for storing information about characters we need to
+   remember.  */
+struct bidi_saved_info {
+  int bytepos, charpos;                /* character's buffer position */
+  bidi_type_t type;            /* character's resolved bidi type */
+  bidi_type_t type_after_w1;   /* original type of the character, after W1 */
+  bidi_type_t orig_type;       /* type as we found it in the buffer */
+};
+
+/* Data type for keeping track of saved embedding levels and override
+   status information.  */
+struct bidi_stack {
+  int level;
+  bidi_dir_t override;
+};
+
+/* Data type for iterating over bidi text.  */
+struct bidi_it {
+  EMACS_INT bytepos;           /* iterator's position in buffer */
+  EMACS_INT charpos;
+  int ch;                      /* character itself */
+  int ch_len;                  /* length of its multibyte sequence */
+  bidi_type_t type;            /* bidi type of this character, after
+                                  resolving weak and neutral types */
+  bidi_type_t type_after_w1;   /* original type, after overrides and W1 */
+  bidi_type_t orig_type;       /* original type, as found in the buffer */
+  int resolved_level;          /* final resolved level of this character */
+  int invalid_levels;          /* how many PDFs to ignore */
+  int invalid_rl_levels;       /* how many PDFs from RLE/RLO to ignore */
+  int prev_was_pdf;            /* if non-zero, previous char was PDF */
+  struct bidi_saved_info prev; /* info about previous character */
+  struct bidi_saved_info last_strong; /* last-seen strong directional char */
+  struct bidi_saved_info next_for_neutral; /* surrounding characters for... */
+  struct bidi_saved_info prev_for_neutral; /* ...resolving neutrals */
+  struct bidi_saved_info next_for_ws; /* character after sequence of ws */
+  EMACS_INT next_en_pos;       /* position of next EN char for ET */
+  EMACS_INT ignore_bn_limit;   /* position until which to ignore BNs */
+  bidi_dir_t sor;              /* direction of start-of-run in effect */
+  int scan_dir;                        /* direction of text scan */
+  int stack_idx;               /* index of current data on the stack */
+  /* Note: Everything from here on is not copied/saved when the bidi
+     iterator state is saved, pushed, or popped.  So only put here
+     stuff that is not part of the bidi iterator's state!  */
+  struct bidi_stack level_stack[BIDI_MAXLEVEL]; /* stack of embedding levels */
+  int first_elt;               /* if non-zero, examine current char first */
+  bidi_dir_t paragraph_dir;    /* current paragraph direction */
+  int new_paragraph;           /* if non-zero, we expect a new paragraph */
+  EMACS_INT separator_limit;   /* where paragraph separator should end */
+};
 
+/* Value is non-zero when the bidi iterator is at base paragraph
+   embedding level.  */
+#define BIDI_AT_BASE_LEVEL(BIDI_IT) \
+  ((BIDI_IT).resolved_level == (BIDI_IT).level_stack[0].level)
 
 \f
 /***********************************************************************
@@ -1854,7 +1964,7 @@ enum it_method {
   NUM_IT_METHODS
 };
 
-#define IT_STACK_SIZE 4
+#define IT_STACK_SIZE 5
 
 /* Iterator for composition (both for static and automatic).  */
 struct composition_it
@@ -1902,6 +2012,14 @@ struct it
      text, overlay strings, end of text etc., which see.  */
   EMACS_INT stop_charpos;
 
+  /* Previous stop position, i.e. the last one before the current
+     iterator position in `current'.  */
+  EMACS_INT prev_stop;
+
+  /* Last stop position iterated across whose bidi embedding level is
+     equal to the current paragraph's base embedding level.  */
+  EMACS_INT base_level_stop;
+
   /* Maximum string or buffer position + 1.  ZV when iterating over
      current_buffer.  */
   EMACS_INT end_charpos;
@@ -2008,6 +2126,8 @@ struct it
     int string_nchars;
     EMACS_INT end_charpos;
     EMACS_INT stop_charpos;
+    EMACS_INT prev_stop;
+    EMACS_INT base_level_stop;
     struct composition_it cmp_it;
     int face_id;
 
@@ -2207,6 +2327,14 @@ struct it
      incremented/reset by display_line, move_it_to etc.  */
   int continuation_lines_width;
 
+  /* Buffer position that ends the buffer text line being iterated.
+     This is normally the position after the newline at EOL.  If this
+     is the last line of the buffer and it doesn't have a newline,
+     value is ZV/ZV_BYTE.  Set and used only if IT->bidi_p, for
+     setting the end position of glyph rows produced for continuation
+     lines, see display_line.  */
+  struct text_pos eol_pos;
+
   /* Current y-position.  Automatically incremented by the height of
      glyph_row in move_it_to and display_line.  */
   int current_y;
@@ -2233,6 +2361,14 @@ struct it
 
   /* Face of the right fringe glyph.  */
   unsigned right_user_fringe_face_id : FACE_ID_BITS;
+
+  /* Non-zero means we need to reorder bidirectional text for display
+     in the visual order.  */
+  int bidi_p;
+
+  /* For iterating over bidirectional text.  */
+  struct bidi_it bidi_it;
+  bidi_dir_t paragraph_embedding;
 };
 
 
@@ -2263,6 +2399,13 @@ struct it
 #define PRODUCE_GLYPHS(IT)                              \
   do {                                                  \
     extern int inhibit_free_realized_faces;             \
+    if ((IT)->glyph_row != NULL && (IT)->bidi_p)       \
+      {                                                        \
+        if ((IT)->bidi_it.paragraph_dir == R2L)                \
+         (IT)->glyph_row->reversed_p = 1;              \
+       else                                            \
+         (IT)->glyph_row->reversed_p = 0;              \
+      }                                                        \
     if (FRAME_RIF ((IT)->f) != NULL)                    \
       FRAME_RIF ((IT)->f)->produce_glyphs ((IT));       \
     else                                                \
@@ -2704,12 +2847,20 @@ extern EMACS_INT tool_bar_button_relief;
                          Function Prototypes
  ***********************************************************************/
 
+/* Defined in bidi.c */
+
+extern void bidi_init_it P_ ((EMACS_INT, EMACS_INT, struct bidi_it *));
+extern void bidi_get_next_char_visually P_ ((struct bidi_it *));
+extern void bidi_paragraph_init P_ ((bidi_dir_t, struct bidi_it *));
+extern int  bidi_mirror_char P_ ((int));
+
 /* Defined in xdisp.c */
 
 struct glyph_row *row_containing_pos P_ ((struct window *, int,
                                          struct glyph_row *,
                                          struct glyph_row *, int));
-int string_buffer_position P_ ((struct window *, Lisp_Object, int));
+EMACS_INT string_buffer_position P_ ((struct window *, Lisp_Object,
+                                     EMACS_INT));
 int line_bottom_y P_ ((struct it *));
 int display_prop_intangible_p P_ ((Lisp_Object));
 void resize_echo_area_exactly P_ ((void));
index d32ce48cce6a190619ee1a2b1cccac864daba3cf..fd470491f785a9765c4a43ad905c46a75c3870d7 100644 (file)
@@ -1388,8 +1388,11 @@ prepare_desired_row (row)
 {
   if (!row->enabled_p)
     {
+      unsigned rp = row->reversed_p;
+
       clear_glyph_row (row);
       row->enabled_p = 1;
+      row->reversed_p = rp;
     }
 }
 
@@ -1540,6 +1543,7 @@ row_equal_p (w, a, b, mouse_face_p)
          || a->overlapped_p != b->overlapped_p
          || (MATRIX_ROW_CONTINUATION_LINE_P (a)
              != MATRIX_ROW_CONTINUATION_LINE_P (b))
+         || a->reversed_p != b->reversed_p
          /* Different partially visible characters on left margin.  */
          || a->x != b->x
          /* Different height.  */
@@ -3500,6 +3504,8 @@ direct_output_for_insert (g)
       || !display_completed
       /* Give up if buffer appears in two places.  */
       || buffer_shared > 1
+      /* Give up if we need to reorder bidirectional text.  */
+      || !NILP (current_buffer->bidi_display_reordering)
       /* Give up if currently displaying a message instead of the
         minibuffer contents.  */
       || (EQ (selected_window, minibuf_window)
@@ -3776,6 +3782,10 @@ direct_output_forward_char (n)
   if (!display_completed || cursor_in_echo_area)
     return 0;
 
+  /* Give up if we need to reorder bidirectional text.  */
+  if (!NILP (XBUFFER (w->buffer)->bidi_display_reordering))
+    return 0;
+
   /* Give up if the buffer's direction is reversed.  */
   if (!NILP (XBUFFER (w->buffer)->direction_reversed))
     return 0;
index 71ffa998bfe9bc648994f866620bd985fb62e902..60aa14e2b78b7d575aefe6099193cbaac10376be 100644 (file)
@@ -345,7 +345,7 @@ abbreviation for a --option.\n\
 Various environment variables and window system resources also affect\n\
 Emacs' operation.  See the main documentation.\n\
 \n\
-Report bugs to %s.  First, please see the Bugs\n\
+Report bugs to bug-gnu-emacs@gnu.org.  First, please see the Bugs\n\
 section of the Emacs manual or the file BUGS.\n"
 
 \f
@@ -746,41 +746,6 @@ void (*__malloc_initialize_hook) () = malloc_initialize_hook;
 #endif /* DOUG_LEA_MALLOC */
 
 
-#define REPORT_EMACS_BUG_ADDRESS "bug-gnu-emacs@gnu.org"
-#define REPORT_EMACS_BUG_PRETEST_ADDRESS "bug-gnu-emacs@gnu.org"
-
-/* This function is used to determine an address to which bug report should
-   be sent.  */
-
-char *
-bug_reporting_address ()
-{
-  int count = 0;
-  Lisp_Object temp;
-  char *string;
-
-  temp = Fsymbol_value (intern ("emacs-version"));
-
-  /* When `emacs-version' is invalid, use normal address.  */
-  if (!STRINGP(temp))
-    return REPORT_EMACS_BUG_ADDRESS;
-
-  string = SDATA (temp);
-
-  /* Count dots in `emacs-version'.  */
-  while (*string)
-    {
-      if (*string == '.')
-       count++;
-      string++;
-    }
-
-  /* When `emacs-version' has at least three dots, it is development or
-     pretest version of Emacs.  */
-  return count >= 3 ? REPORT_EMACS_BUG_PRETEST_ADDRESS : REPORT_EMACS_BUG_ADDRESS;
-}
-
-
 /* ARGSUSED */
 int
 main (int argc, char **argv)
@@ -825,11 +790,6 @@ main (int argc, char **argv)
       heap_bss_diff = (char *)my_heap_start - max (my_endbss, my_endbss_static);
     }
 
-#ifdef LINUX_SBRK_BUG
-  /* This is only used GNU/LINUX running on alpha when using libc5 */
-  __sbrk (1);
-#endif
-
 #ifdef RUN_TIME_REMAP
   if (initialized)
     run_time_remap (argv[0]);
@@ -1082,7 +1042,7 @@ main (int argc, char **argv)
     {
       printf (USAGE1, argv[0], USAGE2);
       printf (USAGE3);
-      printf (USAGE4, bug_reporting_address ());
+      printf (USAGE4);
       exit (0);
     }
 
@@ -1851,9 +1811,6 @@ struct standard_args
 const struct standard_args standard_args[] =
 {
   { "-version", "--version", 150, 0 },
-#ifdef HAVE_SHM
-  { "-nl", "--no-shared-memory", 140, 0 },
-#endif
   { "-t", "--terminal", 120, 1 },
   { "-nw", "--no-window-system", 110, 0 },
   { "-nw", "--no-windows", 110, 0 },
@@ -2245,39 +2202,6 @@ shut_down_emacs (sig, no_x, stuff)
 \f
 #ifndef CANNOT_DUMP
 
-#ifdef HAVE_SHM
-
-DEFUN ("dump-emacs-data", Fdump_emacs_data, Sdump_emacs_data, 1, 1, 0,
-       doc: /* Dump current state of Emacs into data file FILENAME.
-This function exists on systems that use HAVE_SHM.  */)
-     (filename)
-     Lisp_Object filename;
-{
-  extern char my_edata[];
-  Lisp_Object tem;
-
-  check_pure_size ();
-  CHECK_STRING (filename);
-  filename = Fexpand_file_name (filename, Qnil);
-
-  tem = Vpurify_flag;
-  Vpurify_flag = Qnil;
-
-  fflush (stdout);
-  /* Tell malloc where start of impure now is.  */
-  /* Also arrange for warnings when nearly out of space.  */
-#ifndef SYSTEM_MALLOC
-  memory_warnings (my_edata, malloc_warning);
-#endif
-  map_out_data (SDATA (filename));
-
-  Vpurify_flag = tem;
-
-  return Qnil;
-}
-
-#else /* not HAVE_SHM */
-
 DEFUN ("dump-emacs", Fdump_emacs, Sdump_emacs, 2, 2, 0,
        doc: /* Dump current state of Emacs into executable file FILENAME.
 Take symbols from SYMFILE (presumably the file you executed to run Emacs).
@@ -2374,8 +2298,6 @@ You must run Emacs in batch mode in order to dump it.  */)
   return unbind_to (count, Qnil);
 }
 
-#endif /* not HAVE_SHM */
-
 #endif /* not CANNOT_DUMP */
 \f
 #if HAVE_SETLOCALE
@@ -2552,11 +2474,7 @@ syms_of_emacs ()
   staticpro (&Qfile_name_handler_alist);
 
 #ifndef CANNOT_DUMP
-#ifdef HAVE_SHM
-  defsubr (&Sdump_emacs_data);
-#else
   defsubr (&Sdump_emacs);
-#endif
 #endif
 
   defsubr (&Skill_emacs);
index 5915c00bca17934481e244bbecd3cac94af143e1..757ed8f01a364f3f2c86c3c4f506a1f2feec2d7e 100644 (file)
@@ -4591,8 +4591,9 @@ Setting this variable does not affect existing frames, only new ones.  */);
   DEFVAR_LISP ("default-frame-scroll-bars", &Vdefault_frame_scroll_bars,
               doc: /* Default position of scroll bars on this window-system.  */);
 #ifdef HAVE_WINDOW_SYSTEM
-#if defined(HAVE_NTGUI) || defined(NS_IMPL_COCOA)
-  /* MS-Windows and Mac OS X have scroll bars on the right by default.  */
+#if defined(HAVE_NTGUI) || defined(NS_IMPL_COCOA) || (defined(USE_GTK) && defined(USE_TOOLKIT_SCROLL_BARS))
+  /* MS-Windows, Mac OS X, and GTK have scroll bars on the right by
+     default.  */
   Vdefault_frame_scroll_bars = Qright;
 #else
   Vdefault_frame_scroll_bars = Qleft;
index 1e331d078cef23ad3b908ec049bc789c361445b8..f6d6704b373bd04de60baca46fc1849f2af82b30 100644 (file)
@@ -7507,12 +7507,6 @@ input_available_signal (signo)
 {
   /* Must preserve main program's value of errno.  */
   int old_errno = errno;
-#if defined (USG) && !defined (POSIX_SIGNALS)
-  /* USG systems forget handlers when they are used;
-     must reestablish each time */
-  signal (signo, input_available_signal);
-#endif /* USG */
-
   SIGNAL_THREAD_CHECK (signo);
 
 #ifdef SYNC_INPUT
@@ -7595,12 +7589,6 @@ handle_user_signal (sig)
   int old_errno = errno;
   struct user_signal_info *p;
 
-#if defined (USG) && !defined (POSIX_SIGNALS)
-  /* USG systems forget handlers when they are used;
-     must reestablish each time */
-  signal (sig, handle_user_signal);
-#endif
-
   SIGNAL_THREAD_CHECK (sig);
 
   for (p = user_signals; p; p = p->next)
@@ -11089,13 +11077,6 @@ interrupt_signal (signalnum)   /* If we don't have an argument, */
   int old_errno = errno;
   struct terminal *terminal;
 
-#if defined (USG) && !defined (POSIX_SIGNALS)
-  /* USG systems forget handlers when they are used;
-     must reestablish each time */
-  signal (SIGINT, interrupt_signal);
-  signal (SIGQUIT, interrupt_signal);
-#endif /* USG */
-
   SIGNAL_THREAD_CHECK (signalnum);
 
   /* See if we have an active terminal on our controlling tty. */
@@ -11235,6 +11216,7 @@ handle_interrupt ()
          GCPRO4 (saved.object, saved.global_code,
                  saved.current_syntax_table, saved.old_prop);
          Fsignal (Qquit, Qnil);
+         /* FIXME: AFAIK, `quit' can never return, so this code is dead!  */
          gl_state = saved;
          UNGCPRO;
        }
@@ -11303,11 +11285,7 @@ See also `current-input-mode'.  */)
     {
       /* When using X, don't give the user a real choice,
         because we haven't implemented the mechanisms to support it.  */
-#ifdef NO_SOCK_SIGIO
-      new_interrupt_input = 0;
-#else /* not NO_SOCK_SIGIO */
       new_interrupt_input = 1;
-#endif /* NO_SOCK_SIGIO */
     }
   else
 #endif /* HAVE_X_WINDOWS */
index 5abf8bba7261e67ab5d50de8e56d4a1eaee8f9ed..065a0dd7d71935b691c4c08247d3aafa52b2e1d3 100644 (file)
@@ -116,11 +116,6 @@ NOTE-END
 
 #endif /* __ELF__ */
 
-#if defined (GNU_LINUX) && __GNU_LIBRARY__ - 0 < 6
-/* This controls a conditional in main.  */
-#define LINUX_SBRK_BUG
-#endif
-
 /* On the Alpha it's best to avoid including TERMIO since struct
    termio and struct termios are mutually incompatible.  */
 #define NO_TERMIO
index 5614141fe632edcf1f09868d34014c0b8a43ebb0..bf684a871a9a50da0288456c3228973bffc1dc37 100644 (file)
@@ -93,9 +93,6 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #define UNEXEC unexhp9k800.o
 
-#define LIBS_MACHINE
-#define LIBS_DEBUG
-
 /* Include the file bsdtty.h, since this machine has job control.  */
 #define NEED_BSDTTY
 
index 757db149ed26d4dcc27ad7bd822bf7c59630a12b..a7d35cc8ab7eb5a0b02817df5de0d948c5c971de 100644 (file)
@@ -32,19 +32,10 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #define IBMR2AIX
 
-#ifndef UNEXEC
-#define UNEXEC unexaix.o
-#endif
-
-/* Define addresses, macros, change some setup for dump */
-
-#define NO_REMAP
-
 /* The data segment in this machine always starts at address 0x20000000.
    An address of data cannot be stored correctly in a Lisp object;
    we always lose the high bits.  We must tell XPNTR to add them back.  */
 
-#ifndef USG5_4
 #define TEXT_START 0x10000000
 #define DATA_START 0x20000000
 #define WORDS_BIG_ENDIAN
@@ -66,21 +57,6 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #define NLIST_STRUCT
 #endif
 
-/* -lpthreads seems to be necessary for Xlib in X11R6, and should be harmless
-   on older versions of X where it happens to exist.  */
-#ifdef HAVE_LIBPTHREADS
-#define LIBS_MACHINE -lrts -lIM -liconv -lpthreads
-#else
-/* IBM's X11R5 use -lIM and -liconv in AIX 3.2.2.  */
-#define LIBS_MACHINE -lrts -lIM -liconv
-#endif
-
-#else /* USG5_4 */
-#undef WORDS_BIG_ENDIAN
-#define DATA_SEG_BITS 0
-#define LIBS_MACHINE
-#endif /* USG5_4 */
-
 #undef ADDR_CORRECT
 #define ADDR_CORRECT(x) ((int)(x))
 
@@ -96,7 +72,5 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #define BROKEN_SIGPTY
 #define BROKEN_SIGPOLL
 
-#define ORDINARY_LINK
-
 /* arch-tag: 028318ee-a7ae-4a08-804d-cc1e6588d003
    (do not change this comment) */
index 7c0ff78a0699cfe1dd06fcb2d23f3346af91c2a6..794227977be7953960c5e358a47083a9a1f3c37e 100644 (file)
@@ -53,10 +53,6 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #define DATA_START 0x10000000
 #define DATA_SEG_BITS  0x10000000
 
-#undef LIBS_MACHINE
-#define LIBS_MACHINE
-#define LIBS_DEBUG
-\f
 /* Use terminfo instead of termcap.  */
 
 #define TERMINFO
index fa6cc1b597754d291f7446571d84f902a61a1c2c..62c78e68ab0ec7745924b59f6735aea2429a2b44 100644 (file)
@@ -38,7 +38,6 @@ NOTE-END  */
 
 #define CRT0_DUMMIES
 
-#ifdef BSD_SYSTEM
 /* USG systems I know of running on Vaxes do not actually
    support the load average, so disable it for them.  */
 
@@ -50,11 +49,7 @@ NOTE-END  */
 
 #define LOAD_AVE_CVT(x) ((int) ((x) * 100.0))
 
-#endif /* BSD_SYSTEM */
-
-#ifdef BSD4_2
 #define HAVE_FTIME
-#endif
 
 /* arch-tag: 508bdf7a-01a0-4ce0-8eba-0704d0df55a0
    (do not change this comment) */
index 156eddd60928431c5d8438f88cdf07a355636e8c..5eaba6374fd021e1f9c2dd61eb4b26d1e422a10e 100644 (file)
@@ -115,6 +115,7 @@ OBJ1 =  $(BLD)/alloc.$(O)           \
        $(BLD)/vm-limit.$(O)            \
        $(BLD)/region-cache.$(O)        \
        $(BLD)/strftime.$(O)            \
+       $(BLD)/bidi.$(O)                \
        $(BLD)/charset.$(O)             \
        $(BLD)/character.$(O)           \
        $(BLD)/chartab.$(O)             \
@@ -338,6 +339,15 @@ $(BLD)/atimer.$(O) : \
        $(SRC)/syssignal.h \
        $(SRC)/systime.h
 
+$(BLD)/bidi.$(O) : \
+       $(SRC)/bidi.c \
+       $(CONFIG_H) \
+       $(SRC)/lisp.h \
+       $(SRC)/buffer.h \
+       $(SRC)/character.h \
+       $(SRC)/dispextern.h \
+       $(SRC)/w32gui.h
+
 $(BLD)/buffer.$(O) : \
        $(SRC)/buffer.c \
        $(CONFIG_H) \
index 53cc42f223e2524b50c49b652573ef2c21f546f3..4f10375229687cecdf26cd666e369a3377f13b0b 100644 (file)
@@ -1878,13 +1878,7 @@ create_process (process, new_argv, current_dir)
 #ifdef AIX
   struct sigaction sighup_action;
 #endif
-#else /* !POSIX_SIGNALS */
-#if 0
-#ifdef SIGCHLD
-  SIGTYPE (*sigchld)();
-#endif
-#endif /* 0 */
-#endif /* !POSIX_SIGNALS */
+#endif /* POSIX_SIGNALS */
   /* Use volatile to protect variables from being clobbered by longjmp.  */
   volatile int forkin, forkout;
   volatile int pty_flag = 0;
@@ -2008,14 +2002,9 @@ create_process (process, new_argv, current_dir)
   sigprocmask (SIG_BLOCK, &blocked, &procmask);
 #else /* !POSIX_SIGNALS */
 #ifdef SIGCHLD
-#if defined (BSD_SYSTEM) || defined (HPUX)
+#if defined (BSD_SYSTEM)
   sigsetmask (sigmask (SIGCHLD));
-#else /* ordinary USG */
-#if 0
-  sigchld_deferred = 0;
-  sigchld = signal (SIGCHLD, create_process_sigchld);
-#endif
-#endif /* ordinary USG */
+#endif /* BSD_SYSTEM */
 #endif /* SIGCHLD */
 #endif /* !POSIX_SIGNALS */
 
@@ -2172,13 +2161,9 @@ create_process (process, new_argv, current_dir)
        sigprocmask (SIG_SETMASK, &procmask, 0);
 #else /* !POSIX_SIGNALS */
 #ifdef SIGCHLD
-#if defined (BSD_SYSTEM) || defined (HPUX)
+#if defined (BSD_SYSTEM)
        sigsetmask (SIGEMPTYMASK);
-#else /* ordinary USG */
-#if 0
-       signal (SIGCHLD, sigchld);
-#endif
-#endif /* ordinary USG */
+#endif /* BSD_SYSTEM */
 #endif /* SIGCHLD */
 #endif /* !POSIX_SIGNALS */
 
@@ -2275,17 +2260,9 @@ create_process (process, new_argv, current_dir)
   sigprocmask (SIG_SETMASK, &procmask, 0);
 #else /* !POSIX_SIGNALS */
 #ifdef SIGCHLD
-#if defined (BSD_SYSTEM) || defined (HPUX)
+#if defined (BSD_SYSTEM)
   sigsetmask (SIGEMPTYMASK);
-#else /* ordinary USG */
-#if 0
-  signal (SIGCHLD, sigchld);
-  /* Now really handle any of these signals
-     that came in during this function.  */
-  if (sigchld_deferred)
-    kill (getpid (), SIGCHLD);
-#endif
-#endif /* ordinary USG */
+#endif /* BSD_SYSTEM */
 #endif /* SIGCHLD */
 #endif /* !POSIX_SIGNALS */
 
@@ -3640,23 +3617,9 @@ usage: (make-network-process &rest ARGS)  */)
       immediate_quit = 1;
       QUIT;
 
-      /* This turns off all alarm-based interrupts; the
-        bind_polling_period call above doesn't always turn all the
-        short-interval ones off, especially if interrupt_input is
-        set.
-
-        It'd be nice to be able to control the connect timeout
-        though.  Would non-blocking connect calls be portable?
-
-        This used to be conditioned by HAVE_GETADDRINFO.  Why?  */
-
-      turn_on_atimers (0);
-
       ret = connect (s, lres->ai_addr, lres->ai_addrlen);
       xerrno = errno;
 
-      turn_on_atimers (1);
-
       if (ret == 0 || xerrno == EISCONN)
        {
          /* The unwind-protect will be discarded afterwards.
@@ -3676,6 +3639,40 @@ usage: (make-network-process &rest ARGS)  */)
 #endif
 #endif
 
+#ifndef WINDOWSNT
+      if (xerrno == EINTR)
+       {
+         /* Unlike most other syscalls connect() cannot be called
+            again.  (That would return EALREADY.)  The proper way to
+            wait for completion is select(). */
+         int sc, len;
+         SELECT_TYPE fdset;
+       retry_select:
+         FD_ZERO (&fdset);
+         FD_SET (s, &fdset);
+         QUIT;
+         sc = select (s + 1, (SELECT_TYPE *)0, &fdset, (SELECT_TYPE *)0,
+                      (EMACS_TIME *)0);
+         if (sc == -1)
+           {
+             if (errno == EINTR)
+               goto retry_select;
+             else
+               report_file_error ("select failed", Qnil);
+           }
+         eassert (sc > 0);
+
+         len = sizeof xerrno;
+         eassert (FD_ISSET (s, &fdset));
+         if (getsockopt (s, SOL_SOCKET, SO_ERROR, &xerrno, &len) == -1)
+           report_file_error ("getsockopt failed", Qnil);
+         if (xerrno)
+           errno = xerrno, report_file_error ("error during connect", Qnil);
+         else
+           break;
+       }
+#endif /* !WINDOWSNT */
+
       immediate_quit = 0;
 
       /* Discard the unwind protect closing S.  */
@@ -3683,8 +3680,10 @@ usage: (make-network-process &rest ARGS)  */)
       emacs_close (s);
       s = -1;
 
+#ifdef WINDOWSNT
       if (xerrno == EINTR)
        goto retry_connect;
+#endif
     }
 
   if (s >= 0)
@@ -6704,11 +6703,6 @@ sigchld_handler (signo)
          /* PID == 0 means no processes found, PID == -1 means a real
             failure.  We have done all our job, so return.  */
 
-         /* USG systems forget handlers when they are used;
-            must reestablish each time */
-#if defined (USG) && !defined (POSIX_SIGNALS)
-         signal (signo, sigchld_handler);   /* WARNING - must come after wait3() */
-#endif
          errno = old_errno;
          return;
        }
@@ -6809,9 +6803,6 @@ sigchld_handler (signo)
 #if (defined WINDOWSNT \
      || (defined USG && !defined GNU_LINUX \
         && !(defined HPUX && defined WNOHANG)))
-#if defined (USG) && ! defined (POSIX_SIGNALS)
-      signal (signo, sigchld_handler);
-#endif
       errno = old_errno;
       return;
 #endif /* USG, but not HPUX with WNOHANG */
index f242446796d7518b7bfef57accfba6a47b19312b..e59c48aad742699ecadca5fb1d0952ccb7f75b0a 100644 (file)
@@ -3070,7 +3070,7 @@ regex_compile (pattern, size, syntax, bufp)
                           syntax-table for ASCII chars, while the other chars
                           will obey syntax-table properties.  It's not ideal,
                           but it's the way it's been done until now.  */
-                       SETUP_SYNTAX_TABLE (BEGV, 0);
+                       SETUP_BUFFER_SYNTAX_TABLE ();
 
                        for (ch = 0; ch < 256; ++ch)
                          {
@@ -4496,7 +4496,7 @@ re_search_2 (bufp, str1, size1, str2, size2, startpos, range, regs, stop)
   anchored_start = (bufp->buffer[0] == begline);
 
 #ifdef emacs
-  gl_state.object = re_match_object;
+  gl_state.object = re_match_object; /* Used by SYNTAX_TABLE_BYTE_TO_CHAR. */
   {
     int charpos = SYNTAX_TABLE_BYTE_TO_CHAR (POS_AS_IN_BUFFER (startpos));
 
@@ -5099,7 +5099,7 @@ re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop)
 
 #ifdef emacs
   int charpos;
-  gl_state.object = re_match_object;
+  gl_state.object = re_match_object; /* Used by SYNTAX_TABLE_BYTE_TO_CHAR. */
   charpos = SYNTAX_TABLE_BYTE_TO_CHAR (POS_AS_IN_BUFFER (pos));
   SETUP_SYNTAX_TABLE_FOR_OBJECT (re_match_object, charpos, 1);
 #endif
@@ -6504,10 +6504,6 @@ re_compile_pattern (pattern, length, bufp)
 {
   reg_errcode_t ret;
 
-#ifdef emacs
-  gl_state.current_syntax_table = current_buffer->syntax_table;
-#endif
-
   /* GNU code is written to assume at least RE_NREGS registers will be set
      (and at least one extra will be -1).  */
   bufp->regs_allocated = REGS_UNALLOCATED;
index 29a68dbf6e3052f133fe64493e9220d3917222c0..32bc67bfd46c27b6fb006b28e0cdfacbf7c4fb52 100644 (file)
@@ -87,14 +87,19 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #define LINKER cc
 #endif
 
-/* Prevent -lg from being used for debugging.  Not needed.  */
-
-#define LIBS_DEBUG
-
 /* No need to specify -lc when linking.  */
 
 #define LIB_STANDARD
 
+/* -lpthreads seems to be necessary for Xlib in X11R6, and should be harmless
+   on older versions of X where it happens to exist.  */
+#ifdef HAVE_LIBPTHREADS
+#define LIBS_SYSTEM -lrts -lIM -liconv -lpthreads
+#else
+/* IBM's X11R5 use -lIM and -liconv in AIX 3.2.2.  */
+#define LIBS_SYSTEM -lrts -lIM -liconv
+#endif
+
 /* Use terminfo instead of termcap.  */
 
 #define TERMINFO
@@ -121,16 +126,6 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
    It is just a guess which versions of AIX need this definition.  */
 #undef HAVE_STRING_H
 
-/* For AIX, it turns out compiling emacs under AIX 3.2.4 REQUIRES "cc -g"
-   because "cc -O" crashes. Under AIX 3.2.5, "cc -O" is required because
-   "cc -g" crashes. Go figure.  --floppy@merlin.mit.edu */
-/* The above isn't generally true.  If it occurs with some compiler
-   release, seek a fixed version, be it XLC or GCC.  The XLC version
-   isn't tied to the OS version on AIX any more than elsewhere.  XLC
-   (the IBM compiler) can use -g with -O.  (-O3 is also a possibility
-   for the optimization level.)  -- fx, after David Edelsohn.  */
-#define C_DEBUG_SWITCH -g -O
-
 /* Perry Smith <pedz@ddivt1.austin.ibm.com> says these are correct.  */
 #define SIGNALS_VIA_CHARACTERS
 #define MAIL_USE_LOCKF
@@ -168,5 +163,9 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 */
 #define BROKEN_GET_CURRENT_DIR_NAME 1
 
+#define UNEXEC unexaix.o
+
+#define ORDINARY_LINK
+
 /* arch-tag: 38fe75ea-6aef-42bd-8449-bc34d921a562
    (do not change this comment) */
index 8094f50d3173e88a61f8ffe91e840a1087720993..9dad7a9b1d93d001aaedb54cd9133c841f1237fb 100644 (file)
@@ -33,6 +33,34 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #define BSD_SYSTEM 43
 #endif /* BSD_SYSTEM */
 
+/* For mem-limits.h.  */
+#define BSD4_2
+
+#define TABDLY OXTABS
+#define TAB3 OXTABS
+
+/* These aren't needed, since we have getloadavg.  */
+#undef KERNEL_FILE
+#undef LDAV_SYMBOL
+
+#define HAVE_TERMIOS
+#define NO_TERMIO
+
+#define SYSV_SYSTEM_DIR
+
+/* POSIX-style pgrp behavior.  */
+#undef BSD_PGRPS
+
+#define UNEXEC unexelf.o
+
+/* If the system's imake configuration file defines `NeedWidePrototypes'
+   as `NO', we must define NARROWPROTO manually.  Such a define is
+   generated in the Makefile generated by `xmkmf'.  If we don't
+   define NARROWPROTO, we will see the wrong function prototypes
+   for X functions taking float or double parameters.  */
+
+#define NARROWPROTO 1
+
 /* SYSTEM_TYPE should indicate the kind of system you are using.
  It sets the Lisp variable system-type.  */
 
index b9062ec80007745c41e4d882473e1a54f7032165..8813127ffce63387270346a0ad58c03f0112d365 100644 (file)
@@ -189,9 +189,6 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 /* Link this program just by running cc.  */
 #define ORDINARY_LINK
 
-/* We don't have a g library, so override the -lg LIBS_DEBUG switch.  */
-#define LIBS_DEBUG
-
 /* Adding -lm confuses the dynamic linker, so omit it.  */
 #define LIB_MATH
 
index e13941d2dcc9df342d2b154986ee6d8b426fe2a3..a84627d3268e84456e0b3440f3c95451fb37303d 100644 (file)
@@ -23,39 +23,14 @@ GNU General Public License for more details.
 You should have received a copy of the GNU General Public License
 along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 
-/* Get the correct __FreeBSD_version, even if this is before that was
-   defined. */
-#ifndef __FreeBSD_version
-#ifndef __FreeBSD__
-#define __FreeBSD_version 199401
-#elif __FreeBSD__ == 1
-#define __FreeBSD_version 199405
-#else
-#include <osreldate.h>
-#endif
-#endif /* !defined __FreeBSD_version */
-
-/* '__FreeBSD__' is defined by the preprocessor on FreeBSD-1.1 and up.
-   Earlier versions do not have shared libraries, so inhibit them.
-   You can inhibit them on newer systems if you wish
-   by defining NO_SHARED_LIBS.  */
-#ifndef __FreeBSD__
-#define NO_SHARED_LIBS
-#endif
-
 /* Get most of the stuff from bsd-common */
 #include "bsd-common.h"
 
 /* For mem-limits.h. */
 #define BSD4_2
 
-/* These aren't needed, since we have getloadavg.  */
-#undef KERNEL_FILE
-#undef LDAV_SYMBOL
-
 #define PENDING_OUTPUT_COUNT(FILE) ((FILE)->_p - (FILE)->_bf._base)
 
-#define LIBS_DEBUG
 #define LIBS_SYSTEM -lutil
 #if __FreeBSD_version < 400000
 #define LIBS_TERMCAP -ltermcap
@@ -64,44 +39,19 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #define LIBS_TERMCAP -lncurses
 #endif
 
-#define SYSV_SYSTEM_DIR
-
-/* freebsd has POSIX-style pgrp behavior. */
-#undef BSD_PGRPS
-
-#ifdef __ELF__
-
 /* Let `ld' find image libs and similar things in /usr/local/lib.  The
    system compiler, GCC, has apparently been modified to not look
    there, contrary to what a stock GCC would do.  */
 
 #define LD_SWITCH_SYSTEM  -L/usr/local/lib
 #define START_FILES pre-crt0.o /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtbegin.o
-#define UNEXEC unexelf.o
 #define LIB_STANDARD -lgcc -lc -lgcc /usr/lib/crtend.o /usr/lib/crtn.o
 #undef LIB_GCC
 #define LIB_GCC
 
-#else /* not __ELF__ */
-
-#ifdef NO_SHARED_LIBS
-#ifdef __FreeBSD__  /* shared libs are available, but the user prefers
-                     not to use them.  */
-#define LD_SWITCH_SYSTEM -Bstatic -L/usr/local/lib
-#endif /* __FreeBSD__ */
-#endif /* NO_SHARED_LIBS */
-
-#endif /* not __ELF__ */
-
 #define HAVE_GETLOADAVG 1
-#define HAVE_TERMIOS
-#define NO_TERMIO
 #define DECLARE_GETPWUID_WITH_UID_T
 
-/* freebsd uses OXTABS instead of the expected TAB3. */
-#define TABDLY OXTABS
-#define TAB3 OXTABS
-
 /* this silences a few compilation warnings */
 #undef BSD_SYSTEM
 #if __FreeBSD__ == 1
@@ -117,14 +67,6 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
    ioctl TIOCSCTTY.  */
 #define DONT_REOPEN_PTY
 
-/* If the system's imake configuration file defines `NeedWidePrototypes'
-   as `NO', we must define NARROWPROTO manually.  Such a define is
-   generated in the Makefile generated by `xmkmf'.  If we don't
-   define NARROWPROTO, we will see the wrong function prototypes
-   for X functions taking float or double parameters.  */
-
-#define NARROWPROTO 1
-
 /* The following is needed to make `configure' find Xpm, Xaw3d and
    image include and library files if using /usr/bin/gcc.  That
    compiler seems to be modified to not find headers in
index ae2eaa43c06946a6e54684f3f8e24d9606790363..b9139435f6138a0b10a9e96fbd14a12ade251b60 100644 (file)
@@ -194,22 +194,10 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #define POSIX                 /* affects getpagesize.h and systty.h */
 #define POSIX_SIGNALS
 
-/* Best not to include -lg, unless it is last on the command line */
-#define LIBS_DEBUG
 #undef LIB_GCC
 #define LIB_GCC
 #define LIB_STANDARD -lgcc -lc -lgcc /usr/lib/crtn.o
 
-/* Don't use -g in test compiles in configure.
-   This is so we will use the same shared libs for that linking
-   that are used when linking temacs.  */
-#ifdef THIS_IS_CONFIGURE
-#define C_DEBUG_SWITCH
-#endif
-
-/* alane@wozzle.linet.org says that -lipc is not a separate library,
-   since libc-4.4.1.  So -lipc was deleted.  */
-#define LIBS_SYSTEM
 /* _BSD_SOURCE is redundant, at least in glibc2, since we define
    _GNU_SOURCE.  Left in in case it's relevant to libc5 systems and
    anyone's still using Emacs on those.  --fx 2002-12-14  */
index b43cd65c40af4827a298065c6f7659c4741a0264..bf68cabe05122200cade676b62ffc298dc036d05 100644 (file)
@@ -21,27 +21,13 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 /* Get most of the stuff from bsd-common */
 #include "bsd-common.h"
 
-/* For mem-limits.h.  */
-#define BSD4_2
-
 #undef SYSTEM_TYPE
 #define SYSTEM_TYPE "gnu"
 
 #undef NLIST_STRUCT
-#undef KERNEL_FILE
-#undef LDAV_SYMBOL
 
 #define SIGNALS_VIA_CHARACTERS
 
-#define HAVE_TERMIOS
-#define NO_TERMIO
-
-#define LIBS_DEBUG
-
-/* XXX emacs should not expect TAB3 to be defined.  */
-#define TABDLY OXTABS
-#define TAB3 OXTABS
-
 /* Tell Emacs that we are a terminfo based system; disable the use
    of local termcap.  (GNU uses ncurses.) */
 #ifdef HAVE_LIBNCURSES
@@ -49,11 +35,6 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #define LIBS_TERMCAP -lncurses
 #endif
 
-#define SYSV_SYSTEM_DIR
-
-/* GNU has POSIX-style pgrp behavior.  */
-#undef BSD_PGRPS
-
 /* Use mmap directly for allocating larger buffers.  */
 #ifdef DOUG_LEA_MALLOC
 #undef REL_ALLOC
@@ -63,17 +44,12 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #define ORDINARY_LINK
 #define DATA_START ({ extern int data_start; (char *) &data_start; })
 
-/* GNU now always uses the ELF format.  */
-#define UNEXEC unexelf.o
-
 /* Some losing code fails to include this and then assumes
    that because it is braindead that O_RDONLY==0.  */
 #ifndef NOT_C_CODE
 #include <fcntl.h>
 #endif
 
-#define NARROWPROTO 1
-
 #ifdef emacs
 #include <stdio.h>  /* Get the definition of _IO_STDIO_H.  */
 #if defined(_IO_STDIO_H) || defined(_STDIO_USES_IOSTREAM)
index 57429e4166324500a1d3c2687da2f767d2f4ef80..8696aa00fddbae4d1b5fdcb938c0851abbc54d1f 100644 (file)
@@ -22,7 +22,6 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #define IRIX6_5                        /* used in m/iris4d */
 #include "usg5-4.h"
 
-#undef sigsetmask  /* use sys_sigsetmask */
 #undef _longjmp /* use system versions, not conservative aliases */
 #undef _setjmp
 
@@ -46,9 +45,6 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #define SIGNALS_VIA_CHARACTERS
 
 /* No need to use sprintf to get the tty name--we get that from _getpty.  */
-#ifdef PTY_TTY_NAME_SPRINTF
-#undef PTY_TTY_NAME_SPRINTF
-#endif
 #define PTY_TTY_NAME_SPRINTF
 /* No need to get the pty name at all.  */
 #ifdef PTY_NAME_SPRINTF
@@ -80,10 +76,6 @@ char *_getpty();
   strcpy (pty_name, name);                                 \
 }
 
-/* Since we use POSIX constructs in PTY_OPEN, we must force POSIX
-   throughout. */
-#define POSIX_SIGNALS
-
 /* Ulimit(UL_GMEMLIM) is busted...  */
 #define ULIMIT_BREAK_VALUE 0x14000000
 
@@ -109,19 +101,6 @@ char *_getpty();
 #define _LP64                  /* lisp.h takes care of the rest */
 #endif /* _MIPS_SZLONG */
 
-/* The only supported 32-bit configuration of GCC under IRIX6.x produces
-   n32 MIPS ABI binaries and also supports -g. */
-#ifdef __GNUC__
-#define C_DEBUG_SWITCH -g
-#else
-/* Optimize, inaccurate debugging, increase limit on size of what's
-   optimized.
-
-   This should also be applicable other than on Irix 6.5, but I don't
-   know for which compiler versions.  -- fx */
-#define C_DEBUG_SWITCH -g3 -O -OPT:Olimit=3500
-#endif
-
 #undef SA_RESTART
 
 #undef TIOCSIGSEND             /* defined in usg5-4.h */
diff --git a/src/s/lynxos.h b/src/s/lynxos.h
deleted file mode 100644 (file)
index 180b600..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Definitions file for GNU Emacs running on LynxOS-3.0.1
-   Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
-                 2008, 2009, 2010 Free Software Foundation, Inc.
-
-This file is part of GNU Emacs.
-
-GNU Emacs is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-GNU Emacs is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
-
-/* LynxOS is almost a bsd 4.2 system */
-#include "s/bsd4-2.h"
-
-/* SYSTEM_TYPE should indicate the kind of system you are using.
- It sets the Lisp variable system-type.  */
-
-/* override the bsd definition */
-#undef SYSTEM_TYPE
-#define SYSTEM_TYPE "lynxos 3.0.1"
-
-/* System stuff redefined from bsd4-2.h */
-#undef KERNEL_FILE
-#define KERNEL_FILE "/lynx.os"
-#undef LDAV_SYMBOL
-#define LDAV_SYMBOL "load_average"
-
-/* misc defines */
-#define LNOFLSH 0
-
-/* COFF related */
-#define COFF
-#define NO_REMAP
-#define SECTION_ALIGNMENT 0x1
-#define COFF_BSD_SYMBOLS
-#define etext __etext
-#define edata __edata
-#define _start __text
-
-/* Compilation options */
-#define LIBS_DEBUG
-#define ORDINARY_LINK
-/* we define following to prevent all the lynxos's stupid compilation */
-/* warning messages */
-#define C_SWITCH_SYSTEM -D__NO_INCLUDE_WARN__
-#define LIBS_SYSTEM -lbsd
-
-/* arch-tag: fbc81ec9-1c45-416b-a368-799ae7c094a1
-   (do not change this comment) */
index 17d3b33451e3af5a4463f80ede6d97e095df7d1f..5552aece50acbbdf989d3fb4a91500353b981b91 100644 (file)
@@ -22,44 +22,18 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 /* Get most of the stuff from bsd-common */
 #include "bsd-common.h"
 
-#if defined (__alpha__) && !defined (__ELF__)
-#define NO_SHARED_LIBS
-#endif
-
-/* For mem-limits.h.  */
-#define BSD4_2
-
-#undef KERNEL_FILE
-#undef LDAV_SYMBOL
 #define HAVE_GETLOADAVG 1
 
 #define PENDING_OUTPUT_COUNT(FILE) ((FILE)->_p - (FILE)->_bf._base)
 
-/* netbsd uses OXTABS instead of the expected TAB3.  */
-#define TABDLY OXTABS
-#define TAB3 OXTABS
-
-#define HAVE_TERMIOS
-#define NO_TERMIO
-
-#define LIBS_DEBUG
-/* -lutil is not needed for NetBSD >0.9.  */
-/* #define LIBS_SYSTEM -lutil */
 #define LIBS_TERMCAP -ltermcap
 
 #define NEED_ERRNO
-#define SYSV_SYSTEM_DIR
 
-/* Netbsd has POSIX-style pgrp behavior.  */
-#undef BSD_PGRPS
-
-#if !defined (NO_SHARED_LIBS) && defined (__ELF__)
 #define START_FILES pre-crt0.o /usr/lib/crt0.o START_FILES_1 /usr/lib/crtbegin.o
-#define UNEXEC unexelf.o
 #define LIB_STANDARD -lgcc -lc -lgcc /usr/lib/crtend.o END_FILES_1
 #undef LIB_GCC
 #define LIB_GCC
-#endif
 
 #ifdef HAVE_CRTIN
 #define START_FILES_1 /usr/lib/crti.o 
@@ -71,7 +45,6 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #define AMPERSAND_FULL_NAME
 
-#ifdef __ELF__
 /* Here is how to find X Windows.  LD_SWITCH_X_SITE_AUX gives an -R option
    says where to find X windows at run time.  We convert it to a -rpath option
    which is what OSF1 uses.  */
@@ -92,8 +65,6 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #define LD_SWITCH_SYSTEM_TEMACS -Wl,-z,nocombreloc
 
-#endif /* __ELF__ */
-
 /* On post 1.3 releases of NetBSD, gcc -nostdlib also clears
    the library search parth, i.e. it won't search /usr/lib
    for libc and friends. Using -nostartfiles instead avoids
@@ -101,8 +72,6 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #define LINKER $(CC) -nostartfiles
 
-#define NARROWPROTO 1
-
 #define DEFAULT_SOUND_DEVICE "/dev/audio"
 
 /* Greg A. Woods <woods@weird.com> says we must include signal.h
index 3b996de70593d6b1b31d3c95024a6696975d542c..a74601d3ad889884898d724e915064514dde60fd 100644 (file)
@@ -19,7 +19,6 @@
 
 #undef LD_SWITCH_SYSTEM_TEMACS
 #undef LD_SWITCH_SYSTEM
-#ifdef __ELF__
 
   /*  Han Boetes <han@mijncomputer.nl> says this
       is necessary,  otherwise Emacs dumps core on elf systems.  */
    default.  */
 #define LD_SWITCH_X_DEFAULT -L/usr/local/lib
 
-#else
-  
-#define LD_SWITCH_SYSTEM LD_SWITCH_SYSTEM_tmp
-#define LD_SWITCH_X_DEFAULT -L/usr/local/lib
-
-#endif
-
 /* arch-tag: 7e3f65ca-3f48-4237-933f-2b208b21e8e2
    (do not change this comment) */
diff --git a/src/s/sol2-3.h b/src/s/sol2-3.h
deleted file mode 100644 (file)
index fa05aa4..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-/* Definitions file for GNU Emacs running on Solaris 2.3.
-
-   Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
-                 2008, 2009, 2010  Free Software Foundation, Inc.
-
-This file is part of GNU Emacs.
-
-GNU Emacs is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-GNU Emacs is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include "usg5-4.h"
-
-#define SOLARIS2
-
-/* This triggers a conditional in xfaces.c.  */
-#define XOS_NEEDS_TIME_H
-
-#define POSIX
-
-#define LIBS_SYSTEM -lsocket -lnsl -lkstat
-
-/* Prefer kstat over kvm in getloadavg.c, kstat doesn't require root.
-   ghazi@caip.rutgers.edu, 7/21/97.  Don't redefine if already defined
-   (e.g., by config.h). */
-#ifndef HAVE_LIBKSTAT
-#define HAVE_LIBKSTAT
-#endif
-
-/* inoue@ainet.or.jp says Solaris has a bug related to X11R6-style
-   XIM support.  */
-
-#define INHIBIT_X11R6_XIM
-
-/* Must use the system's termcap, if we use any termcap.
-   It does special things.  */
-
-#ifndef TERMINFO
-#define LIBS_TERMCAP -ltermcap
-#endif
-
-#define USE_MMAP_FOR_BUFFERS 1
-
-#ifndef __GNUC__
-#define LD_SWITCH_SYSTEM -L /usr/ccs/lib LD_SWITCH_X_SITE_AUX
-/* eggert thinks all versions of SunPro C allowed this.  */
-#define C_DEBUG_SWITCH -g -O
-#else /* GCC */
-/* We use ./prefix-args because we don't know whether LD_SWITCH_X_SITE_AUX
-   has anything in it.  It can be empty.
-   This works ok in src.  Luckily lib-src does not use LD_SWITCH_SYSTEM.  */
-#define LD_SWITCH_SYSTEM -L /usr/ccs/lib \
- `./prefix-args -Xlinker LD_SWITCH_X_SITE_AUX`
-#endif /* GCC */
-
-/* Info from fnf@cygnus.com suggests this is appropriate.  */
-#define POSIX_SIGNALS
-
-/* We don't need the definition from usg5-4.h with POSIX_SIGNALS.  */
-#undef sigsetmask
-
-/* This is the same definition as in usg5-4.h, but with sigblock/sigunblock
-   rather than sighold/sigrelse, which appear to be BSD4.1 specific and won't
-   work if POSIX_SIGNALS is defined.  It may also be appropriate for SVR4.x
-   (x<2) but I'm not sure.   fnf@cygnus.com */
-/* This sets the name of the slave side of the PTY.  On SysVr4,
-   grantpt(3) forks a subprocess, so keep sigchld_handler() from
-   intercepting that death.  If any child but grantpt's should die
-   within, it should be caught after sigrelse(2). */
-
-#undef PTY_TTY_NAME_SPRINTF
-#define PTY_TTY_NAME_SPRINTF                   \
-  {                                            \
-    char *ptsname (), *ptyname;                        \
-                                               \
-    sigblock (sigmask (SIGCLD));               \
-    if (grantpt (fd) == -1)                    \
-      { emacs_close (fd); return -1; }         \
-    sigunblock (sigmask (SIGCLD));             \
-    if (unlockpt (fd) == -1)                   \
-      { emacs_close (fd); return -1; }         \
-    if (!(ptyname = ptsname (fd)))             \
-      { emacs_close (fd); return -1; }         \
-    strncpy (pty_name, ptyname, sizeof (pty_name)); \
-    pty_name[sizeof (pty_name) - 1] = 0;       \
-  }
-
-/* arch-tag: a8fe2e15-e517-49cb-a863-f346b80885fe
-   (do not change this comment) */
diff --git a/src/s/sol2-4.h b/src/s/sol2-4.h
deleted file mode 100644 (file)
index df8552e..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Handle Solaris 2.4.  */
-
-#include "sol2-3.h"
-
-#undef LD_SWITCH_SYSTEM
-
-/* `#ifdef USE_MOTIF' won't work here, since USE_MOTIF isn't defined yet.
-   Instead, dynamically check whether USE_MOTIF expands to something.  */
-#define NOT_USING_MOTIF { set x USE_MOTIF; test "$$2" = "USE_MOTIF"; }
-
-#ifndef __GNUC__
-#define LD_SWITCH_SYSTEM_TEMACS -L/usr/ccs/lib LD_SWITCH_X_SITE_AUX \
-  `NOT_USING_MOTIF || echo ' -R/usr/dt/lib'`
-#else /* GCC */
-/* We use ./prefix-args because we don't know whether LD_SWITCH_X_SITE_AUX
-   has anything in it.  It can be empty.
-   This works ok in temacs.  */
-#define LD_SWITCH_SYSTEM_TEMACS -L/usr/ccs/lib \
- `./prefix-args -Xlinker LD_SWITCH_X_SITE_AUX` \
-  `NOT_USING_MOTIF || echo ' -R/usr/dt/lib -L/usr/dt/lib'`
-
-/* Get rid of -traditional and let const really do its thing.  */
-#undef C_SWITCH_SYSTEM
-#undef const
-#endif /* GCC */
-
-/* Gregory Neil Shapiro <gshapiro@hhmi.org> reports the Motif header files
-   are in this directory on Solaris 2.4.  */
-#define C_SWITCH_X_SYSTEM -I/usr/dt/include
-
-/* arch-tag: 6f0de37b-cfda-427a-a5ae-b83ed54aaae7
-   (do not change this comment) */
diff --git a/src/s/sol2-5.h b/src/s/sol2-5.h
deleted file mode 100644 (file)
index 9016398..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Handle Solaris 2.5.  */
-
-#include "sol2-4.h"
-
-/* -lgen is needed for the regex and regcmp functions
-   which are used by Motif.  In the future we can try changing
-   regex.c to provide them in Emacs, but this is safer for now.  */
-#define LIB_MOTIF -lXm -lgen
-
-/* This is the only known way to avoid some crashes
-   that seem to relate to screwed up malloc data
-   after deleting a frame.  */
-/* rms: I think the problems using ralloc had to do with system
-   libraries that called the system malloc even if we linked in the
-   GNU malloc.  I could not see any way to fix the problem except to
-   have just one malloc and that had to be the system one.  */
-/* This is not always necessary.  Turned off at present for testers to
-   identify any problems with gmalloc more accurately.  */
-/* #define SYSTEM_MALLOC */
-
-/* There have problems reported with mmap at least on Solaris 2.6
-   and 2.7.  For simplicity, let's not use mmap for anything >= 2.5.
-   We can optimize this later.  */
-
-#undef USE_MMAP_FOR_BUFFERS
-
-/* Probably OK also on earlier versions.  */
-#define GC_SETJMP_WORKS 1
-#define GC_MARK_STACK GC_MAKE_GCPROS_NOOPS
-
-/* arch-tag: 96d65526-21c9-4547-a797-2bd575c05be7
-   (do not change this comment) */
index a43443e48c2eb4a9bb5ea62a6c7598e5e1bc53aa..408a0a2ed0247ec94cfc303435201ccccf44966e 100644 (file)
-/* Handle Solaris 2.6.  */
+/* Definitions file for GNU Emacs running on Solaris 2.6.
 
-#include "sol2-5.h"
+   Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+                 2008, 2009, 2010  Free Software Foundation, Inc.
 
-#if 0 /* dldump does not handle all the extensions used by GNU ld.  */
-#undef UNEXEC
-#define UNEXEC unexsol.o
+This file is part of GNU Emacs.
+
+GNU Emacs is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+GNU Emacs is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "usg5-4.h"
+
+#define SOLARIS2
+
+/* This triggers a conditional in xfaces.c.  */
+#define XOS_NEEDS_TIME_H
+
+#define POSIX
+
+#define LIBS_SYSTEM -lsocket -lnsl -lkstat
+
+/* Prefer kstat over kvm in getloadavg.c, kstat doesn't require root.
+   ghazi@caip.rutgers.edu, 7/21/97.  Don't redefine if already defined
+   (e.g., by config.h). */
+#ifndef HAVE_LIBKSTAT
+#define HAVE_LIBKSTAT
 #endif
 
+/* inoue@ainet.or.jp says Solaris has a bug related to X11R6-style
+   XIM support.  */
+
+#define INHIBIT_X11R6_XIM
+
+/* Must use the system's termcap, if we use any termcap.
+   It does special things.  */
+
+#ifndef TERMINFO
+#define LIBS_TERMCAP -ltermcap
+#endif
+
+/* This is the same definition as in usg5-4.h, but with sigblock/sigunblock
+   rather than sighold/sigrelse, which appear to be BSD4.1 specific and won't
+   work if POSIX_SIGNALS is defined.  It may also be appropriate for SVR4.x
+   (x<2) but I'm not sure.   fnf@cygnus.com */
+/* This sets the name of the slave side of the PTY.  On SysVr4,
+   grantpt(3) forks a subprocess, so keep sigchld_handler() from
+   intercepting that death.  If any child but grantpt's should die
+   within, it should be caught after sigrelse(2). */
+
+#define PTY_TTY_NAME_SPRINTF                   \
+  {                                            \
+    char *ptsname (), *ptyname;                        \
+                                               \
+    sigblock (sigmask (SIGCLD));               \
+    if (grantpt (fd) == -1)                    \
+      { emacs_close (fd); return -1; }         \
+    sigunblock (sigmask (SIGCLD));             \
+    if (unlockpt (fd) == -1)                   \
+      { emacs_close (fd); return -1; }         \
+    if (!(ptyname = ptsname (fd)))             \
+      { emacs_close (fd); return -1; }         \
+    strncpy (pty_name, ptyname, sizeof (pty_name)); \
+    pty_name[sizeof (pty_name) - 1] = 0;       \
+  }
+
+/* `#ifdef USE_MOTIF' won't work here, since USE_MOTIF isn't defined yet.
+   Instead, dynamically check whether USE_MOTIF expands to something.  */
+#define NOT_USING_MOTIF { set x USE_MOTIF; test "$$2" = "USE_MOTIF"; }
+
+#ifndef __GNUC__
+#define LD_SWITCH_SYSTEM_TEMACS -L/usr/ccs/lib LD_SWITCH_X_SITE_AUX \
+  `NOT_USING_MOTIF || echo ' -R/usr/dt/lib'`
+#else /* GCC */
+/* We use ./prefix-args because we don't know whether LD_SWITCH_X_SITE_AUX
+   has anything in it.  It can be empty.
+   This works ok in temacs.  */
+#define LD_SWITCH_SYSTEM_TEMACS -L/usr/ccs/lib \
+ `./prefix-args -Xlinker LD_SWITCH_X_SITE_AUX` \
+  `NOT_USING_MOTIF || echo ' -R/usr/dt/lib -L/usr/dt/lib'`
+
+/* Get rid of -traditional and let const really do its thing.  */
+#undef C_SWITCH_SYSTEM
+#undef const
+#endif /* GCC */
+
+/* Gregory Neil Shapiro <gshapiro@hhmi.org> reports the Motif header files
+   are in this directory on Solaris 2.4.  */
+#define C_SWITCH_X_SYSTEM -I/usr/dt/include
+
+/* -lgen is needed for the regex and regcmp functions
+   which are used by Motif.  In the future we can try changing
+   regex.c to provide them in Emacs, but this is safer for now.  */
+#define LIB_MOTIF -lXm -lgen
+
+/* This is the only known way to avoid some crashes
+   that seem to relate to screwed up malloc data
+   after deleting a frame.  */
+/* rms: I think the problems using ralloc had to do with system
+   libraries that called the system malloc even if we linked in the
+   GNU malloc.  I could not see any way to fix the problem except to
+   have just one malloc and that had to be the system one.  */
+/* This is not always necessary.  Turned off at present for testers to
+   identify any problems with gmalloc more accurately.  */
+/* #define SYSTEM_MALLOC */
+
+/* Probably OK also on earlier versions.  */
+#define GC_SETJMP_WORKS 1
+#define GC_MARK_STACK GC_MAKE_GCPROS_NOOPS
+
 /* arch-tag: 71ea3857-89dc-4395-9623-77964e6ed3ca
    (do not change this comment) */
index 934821dd166e131a252714713cbb805e8e3f517b..9fedb4268685bfcd71a346f5250dd7554d70b9c7 100644 (file)
@@ -1,4 +1,71 @@
-#include "usg5-4-2.h"
+/* s/ file for Unixware.
+
+   Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+                 2008, 2009, 2010  Free Software Foundation, Inc.
+
+This file is part of GNU Emacs.
+
+GNU Emacs is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+GNU Emacs is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
+
+
+#include "usg5-4.h"
+
+/* fnf@cygnus.com says these exist.  */
+#define HAVE_TCATTR
+/* #define HAVE_GETWD  (appears to be buggy on SVR4.2) */
+#undef HAVE_GETWD
+
+#undef HAVE_SYSV_SIGPAUSE
+
+/* Motif needs -lgen.  */
+#define LIBS_SYSTEM -lsocket -lnsl -lelf -lgen
+
+/* This is the same definition as in usg5-4.h, but with sigblock/sigunblock
+   rather than sighold/sigrelse, which appear to be BSD4.1 specific and won't
+   work if POSIX_SIGNALS is defined.  It may also be appropriate for SVR4.x
+   (x<2) but I'm not sure.   fnf@cygnus.com */
+/* This sets the name of the slave side of the PTY.  On SysVr4,
+   grantpt(3) forks a subprocess, so keep sigchld_handler() from
+   intercepting that death.  If any child but grantpt's should die
+   within, it should be caught after sigrelse(2). */
+
+#define PTY_TTY_NAME_SPRINTF                   \
+  {                                            \
+    char *ptsname(), *ptyname;                 \
+                                               \
+    sigblock(sigmask(SIGCLD));                 \
+    if (grantpt(fd) == -1)                     \
+      fatal("could not grant slave pty");      \
+    sigunblock(sigmask(SIGCLD));               \
+    if (unlockpt(fd) == -1)                    \
+      fatal("could not unlock slave pty");     \
+    if (!(ptyname = ptsname(fd)))              \
+      fatal ("could not enable slave pty");    \
+    strncpy(pty_name, ptyname, sizeof(pty_name)); \
+    pty_name[sizeof(pty_name) - 1] = 0;                \
+  }
+
+/* Use libw.a along with X11R6 Xt.  */
+#define NEED_LIBW
+
+/* ryanr@ellingtn.ftc.nrcs.usda.gov (Richard Anthony Ryan) says -lXimp
+   is needed in UNIX_SV ... 4.2 1.1.2.  */
+#define LIB_MOTIF -lXm -lXimp
+
+/* arch-tag: 9bbfcfc1-19be-45a1-9699-af57b87da2c6
+   (do not change this comment) */
+
 
 #define        PENDING_OUTPUT_COUNT(FILE) ((FILE)->__ptr - (FILE)->__base)
 
diff --git a/src/s/usg5-4-2.h b/src/s/usg5-4-2.h
deleted file mode 100644 (file)
index d7f2c60..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-/* s/ file for System V release 4.2.
-
-   Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
-                 2008, 2009, 2010  Free Software Foundation, Inc.
-
-This file is part of GNU Emacs.
-
-GNU Emacs is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-GNU Emacs is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
-
-
-#include "usg5-4.h"
-
-/* fnf@cygnus.com says these exist.  */
-#define HAVE_TCATTR
-/* #define HAVE_GETWD  (appears to be buggy on SVR4.2) */
-#undef HAVE_GETWD
-
-/* Info from fnf@cygnus.com suggests this is appropriate.  */
-#define POSIX_SIGNALS
-
-/* We don't need the definition from usg5-3.h with POSIX_SIGNALS.  */
-#undef sigsetmask
-#undef HAVE_SYSV_SIGPAUSE
-
-/* Motif needs -lgen.  */
-#define LIBS_SYSTEM -lsocket -lnsl -lelf -lgen
-
-/* This is the same definition as in usg5-4.h, but with sigblock/sigunblock
-   rather than sighold/sigrelse, which appear to be BSD4.1 specific and won't
-   work if POSIX_SIGNALS is defined.  It may also be appropriate for SVR4.x
-   (x<2) but I'm not sure.   fnf@cygnus.com */
-/* This sets the name of the slave side of the PTY.  On SysVr4,
-   grantpt(3) forks a subprocess, so keep sigchld_handler() from
-   intercepting that death.  If any child but grantpt's should die
-   within, it should be caught after sigrelse(2). */
-
-#undef PTY_TTY_NAME_SPRINTF
-#define PTY_TTY_NAME_SPRINTF                   \
-  {                                            \
-    char *ptsname(), *ptyname;                 \
-                                               \
-    sigblock(sigmask(SIGCLD));                 \
-    if (grantpt(fd) == -1)                     \
-      fatal("could not grant slave pty");      \
-    sigunblock(sigmask(SIGCLD));               \
-    if (unlockpt(fd) == -1)                    \
-      fatal("could not unlock slave pty");     \
-    if (!(ptyname = ptsname(fd)))              \
-      fatal ("could not enable slave pty");    \
-    strncpy(pty_name, ptyname, sizeof(pty_name)); \
-    pty_name[sizeof(pty_name) - 1] = 0;                \
-  }
-
-/* Use libw.a along with X11R6 Xt.  */
-#define NEED_LIBW
-
-/* ryanr@ellingtn.ftc.nrcs.usda.gov (Richard Anthony Ryan) says -lXimp
-   is needed in UNIX_SV ... 4.2 1.1.2.  */
-#define LIB_MOTIF -lXm -lXimp
-
-/* arch-tag: 9bbfcfc1-19be-45a1-9699-af57b87da2c6
-   (do not change this comment) */
index c611911b0e8d19af4c2806a2f4a0c4b20bba9321..b02caf9a3da3699ecf2dc74d24aa8c6cf6cb6831 100644 (file)
@@ -63,13 +63,7 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 
 /* Special hacks needed to make Emacs run on this system.  */
 
-/*
- *     Make the sigsetmask function go away.  Don't know what the
- *     ramifications of this are, but doesn't seem possible to
- *     emulate it properly anyway at this point.
- */
-
-#define sigsetmask(mask)       /* Null expansion */
+#define POSIX_SIGNALS
 
 /* setjmp and longjmp can safely replace _setjmp and _longjmp,
    but they will run slower.  */
@@ -109,10 +103,6 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #define LIB_STANDARD
 
-/* there are no -lg libraries on this system, and no libPW */
-
-#define LIBS_DEBUG
-
 /* Undump with ELF */
 
 #undef COFF
@@ -176,27 +166,6 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #define PTY_NAME_SPRINTF strcpy (pty_name, "/dev/ptmx");
 
-/* This sets the name of the slave side of the PTY.  On SysVr4,
-   grantpt(3) forks a subprocess, so keep sigchld_handler() from
-   intercepting that death.  If any child but grantpt's should die
-   within, it should be caught after sigrelse(2). */
-
-#define PTY_TTY_NAME_SPRINTF                           \
-  {                                                    \
-    char *ptsname (), *ptyname;                                \
-                                                       \
-    sighold (SIGCLD);                                  \
-    if (grantpt (fd) == -1)                            \
-      { emacs_close (fd); return -1; }                 \
-    sigrelse (SIGCLD);                                 \
-    if (unlockpt (fd) == -1)                           \
-      { emacs_close (fd); return -1; }                 \
-    if (!(ptyname = ptsname (fd)))                     \
-      { emacs_close (fd); return -1; }                 \
-    strncpy (pty_name, ptyname, sizeof (pty_name));    \
-    pty_name[sizeof (pty_name) - 1] = 0;               \
-  }
-
 /* Push various streams modules onto a PTY channel. */
 
 #define SETUP_SLAVE_PTY \
index 47b4caf5ade15c6c619d062218562d6124d5cf2e..a80f047e43c5d39a1a95d79dda3f0b4d0fc765b1 100644 (file)
@@ -385,8 +385,7 @@ find_defun_start (pos, pos_byte)
   /* We optimize syntax-table lookup for rare updates.  Thus we accept
      only those `^\s(' which are good in global _and_ text-property
      syntax-tables.  */
-  gl_state.current_syntax_table = current_buffer->syntax_table;
-  gl_state.use_global = 0;
+  SETUP_BUFFER_SYNTAX_TABLE ();
   while (PT > BEGV)
     {
       int c;
@@ -401,8 +400,7 @@ find_defun_start (pos, pos_byte)
          if (SYNTAX (c) == Sopen)
            break;
          /* Now fallback to the default value.  */
-         gl_state.current_syntax_table = current_buffer->syntax_table;
-         gl_state.use_global = 0;
+         SETUP_BUFFER_SYNTAX_TABLE ();
        }
       /* Move to beg of previous line.  */
       scan_newline (PT, PT_BYTE, BEGV, BEGV_BYTE, -2, 1);
@@ -860,11 +858,9 @@ are listed in the documentation of `modify-syntax-entry'.  */)
      Lisp_Object character;
 {
   int char_int;
-  gl_state.current_syntax_table = current_buffer->syntax_table;
-
-  gl_state.use_global = 0;
   CHECK_NUMBER (character);
   char_int = XINT (character);
+  SETUP_BUFFER_SYNTAX_TABLE ();
   return make_number (syntax_code_spec[(int) SYNTAX (char_int)]);
 }
 
@@ -874,10 +870,9 @@ DEFUN ("matching-paren", Fmatching_paren, Smatching_paren, 1, 1, 0,
      Lisp_Object character;
 {
   int char_int, code;
-  gl_state.current_syntax_table = current_buffer->syntax_table;
-  gl_state.use_global = 0;
   CHECK_NUMBER (character);
   char_int = XINT (character);
+  SETUP_BUFFER_SYNTAX_TABLE ();
   code = SYNTAX (char_int);
   if (code == Sopen || code == Sclose)
     return SYNTAX_MATCH (char_int);
@@ -1752,7 +1747,7 @@ skip_chars (forwardp, string, lim, handle_iso_classes)
        let's initialize it manually.
        We ignore syntax-table text-properties for now, since that's
        what we've done in the past.  */
-    SETUP_SYNTAX_TABLE (BEGV, 0);
+    SETUP_BUFFER_SYNTAX_TABLE ();
     if (forwardp)
       {
        if (multibyte)
index c36b1eb28f6d881507f7a919506c0d947f9c1410..ec8fab0166c04facd29fb87daab37ef46968c620 100644 (file)
@@ -245,6 +245,14 @@ extern char syntax_code_spec[16];
         1)                                                     \
       : 0))
 
+/* This macro sets up the buffer-global syntax table.  */
+#define SETUP_BUFFER_SYNTAX_TABLE()                                    \
+do                                                                     \
+  {                                                                    \
+    gl_state.use_global = 0;                                           \
+    gl_state.current_syntax_table = current_buffer->syntax_table;      \
+  } while (0)
+
 /* This macro should be called with FROM at the start of forward
    search, or after the last position of the backward search.  It
    makes sure that the first char is picked up with correct table, so
@@ -256,12 +264,11 @@ extern char syntax_code_spec[16];
 #define SETUP_SYNTAX_TABLE(FROM, COUNT)                                        \
 do                                                                     \
   {                                                                    \
+    SETUP_BUFFER_SYNTAX_TABLE ();                                      \
     gl_state.b_property = BEGV;                                                \
     gl_state.e_property = ZV + 1;                                      \
     gl_state.object = Qnil;                                            \
-    gl_state.use_global = 0;                                           \
     gl_state.offset = 0;                                               \
-    gl_state.current_syntax_table = current_buffer->syntax_table;      \
     if (parse_sexp_lookup_properties)                                  \
       if ((COUNT) > 0 || (FROM) > BEGV)                                        \
         update_syntax_table ((COUNT) > 0 ? (FROM) : (FROM) - 1, (COUNT),\
@@ -279,6 +286,7 @@ while (0)
 #define SETUP_SYNTAX_TABLE_FOR_OBJECT(OBJECT, FROM, COUNT)             \
 do                                                                     \
   {                                                                    \
+    SETUP_BUFFER_SYNTAX_TABLE ();                                      \
     gl_state.object = (OBJECT);                                                \
     if (BUFFERP (gl_state.object))                                     \
       {                                                                        \
@@ -305,8 +313,6 @@ do                                                                  \
        gl_state.e_property = 1 + SCHARS (gl_state.object);             \
        gl_state.offset = 0;                                            \
       }                                                                        \
-    gl_state.use_global = 0;                                           \
-    gl_state.current_syntax_table = current_buffer->syntax_table;      \
     if (parse_sexp_lookup_properties)                                  \
       update_syntax_table (((FROM) + gl_state.offset                   \
                            + (COUNT > 0 ? 0 :  -1)),                   \
index 64dacc671ced6c96391ddd95dd654565ce7e63f3..f435d33859470f36edee202d54f2c31272e7a790 100644 (file)
@@ -88,38 +88,12 @@ sigset_t sys_sigsetmask P_ ((sigset_t new_mask));
 #define sys_sigdel(MASK,SIG) sigdelset (&MASK,SIG)
 
 #else /* ! defined (POSIX_SIGNALS) */
-#ifdef USG5_4
-
-extern SIGMASKTYPE sigprocmask_set;
-
-#ifndef sigblock
-#define sigblock(sig)                                  \
-     (sigprocmask_set = SIGEMPTYMASK | (sig),          \
-      sigprocmask (SIG_BLOCK, &sigprocmask_set, NULL))
-#endif
-
-#ifndef sigunblock
-#define sigunblock(sig)                                                \
-     (sigprocmask_set = SIGFULLMASK & ~(sig),                  \
-      sigprocmask (SIG_SETMASK, &sigprocmask_set, NULL))
-#endif
-
-#else
-#ifdef USG
-
-#ifndef sigunblock
-#define sigunblock(sig)
-#endif
-
-#else
 
 #ifndef sigunblock
 #define sigunblock(SIG) \
 { SIGMASKTYPE omask = sigblock (SIGEMPTYMASK); sigsetmask (omask & ~SIG); }
 #endif
 
-#endif /* ! defined (USG) */
-#endif /* ! defined (USG5_4) */
 #endif /* ! defined (POSIX_SIGNALS) */
 
 #ifndef SIGMASKTYPE
index 7adaeeac1ae4069496865b307d019faa682f9cb5..718a20d4164d849af0b6be8cf36d8464184c14f9 100644 (file)
@@ -66,15 +66,10 @@ static int been_here = -1;
 /* For now, don't try to include termcap.h.  On some systems,
    configure finds a non-standard termcap.h that the main build
    won't find.  */
-
-#if defined HAVE_TERMCAP_H && 0
-#include <termcap.h>
-#else
 extern void tputs P_ ((const char *, int, int (*)(int)));
 extern int tgetent P_ ((char *, const char *));
 extern int tgetflag P_ ((char *id));
 extern int tgetnum P_ ((char *id));
-#endif
 
 #include "cm.h"
 #ifdef HAVE_X_WINDOWS
@@ -1545,6 +1540,26 @@ append_glyph (it)
           + it->glyph_row->used[it->area]);
   end = it->glyph_row->glyphs[1 + it->area];
 
+  /* If the glyph row is reversed, we need to prepend the glyph rather
+     than append it.  */
+  if (it->glyph_row->reversed_p && it->area == TEXT_AREA)
+    {
+      struct glyph *g;
+      int move_by = it->pixel_width;
+
+      /* Make room for the new glyphs.  */
+      if (move_by > end - glyph) /* don't overstep end of this area */
+       move_by = end - glyph;
+      for (g = glyph - 1; g >= it->glyph_row->glyphs[it->area]; g--)
+       g[move_by] = *g;
+      glyph = it->glyph_row->glyphs[it->area];
+      end = glyph + move_by;
+    }
+
+  /* BIDI Note: we put the glyphs of a "multi-pixel" character left to
+     right, even in the REVERSED_P case, since (a) all of its u.ch are
+     identical, and (b) the PADDING_P flag needs to be set for the
+     leftmost one, because we write to the terminal left-to-right.  */
   for (i = 0;
        i < it->pixel_width && glyph < end;
        ++i)
@@ -1556,6 +1571,18 @@ append_glyph (it)
       glyph->padding_p = i > 0;
       glyph->charpos = CHARPOS (it->position);
       glyph->object = it->object;
+      if (it->bidi_p)
+       {
+         glyph->resolved_level = it->bidi_it.resolved_level;
+         if ((it->bidi_it.type & 7) != it->bidi_it.type)
+           abort ();
+         glyph->bidi_type = it->bidi_it.type;
+       }
+      else
+       {
+         glyph->resolved_level = 0;
+         glyph->bidi_type = UNKNOWN_BT;
+       }
 
       ++it->glyph_row->used[it->area];
       ++glyph;
index d1921069af7b3773ebe0dc1bb2370d9a267e164a..a1bb5460d3ca56b3e77399dd1974813a0d33de11 100644 (file)
@@ -630,7 +630,6 @@ mark_x (name)
     PERROR (name);
 }
 \f
-#ifndef COFF_BSD_SYMBOLS
 
 /*
  *     If the COFF file contains a symbol table and a line number section,
@@ -699,8 +698,6 @@ adjust_lnnoptrs (writedesc, readdesc, new_name)
   return 0;
 }
 
-#endif /* COFF_BSD_SYMBOLS */
-
 /* ****************************************************************
  * unexec
  *
@@ -724,9 +721,7 @@ unexec (new_name, a_name, data_start, bss_start, entry_address)
   if (make_hdr (new, a_out, data_start, bss_start, entry_address, a_name, new_name) < 0
       || copy_text_and_data (new, a_out) < 0
       || copy_sym (new, a_out, a_name, new_name) < 0
-#ifndef COFF_BSD_SYMBOLS
       || adjust_lnnoptrs (new, a_out, new_name) < 0
-#endif
       )
     {
       close (new);
index 64a97437939b927a963b0596a680edd23d17fd8d..f17a645f82ce3105a694c510d183c78ecfc1e555 100644 (file)
@@ -7380,9 +7380,6 @@ keys_of_window ()
   initial_define_key (global_map, Ctl ('V'), "scroll-up");
   initial_define_key (meta_map, Ctl ('V'), "scroll-other-window");
   initial_define_key (meta_map, 'v', "scroll-down");
-
-  initial_define_key (global_map, Ctl('L'), "recenter");
-  initial_define_key (meta_map, 'r', "move-to-window-line");
 }
 
 /* arch-tag: 90a9c576-0590-48f1-a5f1-6c96a0452d9f
index 05c1eb18c89839a7fa3df0b69642032d3f1f9bcc..17332f0af20ae38db238547b4ac95bd63b53b179 100644 (file)
@@ -117,7 +117,10 @@ struct window
     /* The buffer displayed in this window */
     /* Of the fields vchild, hchild and buffer, only one is non-nil.  */
     Lisp_Object buffer;
-    /* A marker pointing to where in the text to start displaying */
+    /* A marker pointing to where in the text to start displaying.
+       BIDI Note: This is the _logical-order_ start, i.e. the smallest
+       buffer position visible in the window, not necessarily the
+       character displayed in the top left corner of the window.  */
     Lisp_Object start;
     /* A marker pointing to where in the text point is in this window,
        used only when the window is not selected.
index 1b6cbfbe27a0796c6bfc740193a4c13c559cf32c..b6c69f661ed917953da0e1f926b155099927a33d 100644 (file)
@@ -249,6 +249,7 @@ Lisp_Object Qfontified;
 Lisp_Object Qgrow_only;
 Lisp_Object Qinhibit_eval_during_redisplay;
 Lisp_Object Qbuffer_position, Qposition, Qobject;
+Lisp_Object Qright_to_left, Qleft_to_right;
 
 /* Cursor shapes */
 Lisp_Object Qbar, Qhbar, Qbox, Qhollow;
@@ -904,6 +905,7 @@ static void store_mode_line_noprop_char P_ ((char));
 static int store_mode_line_noprop P_ ((const unsigned char *, int, int));
 static void x_consider_frame_title P_ ((Lisp_Object));
 static void handle_stop P_ ((struct it *));
+static void handle_stop_backwards P_ ((struct it *, EMACS_INT));
 static int tool_bar_lines_needed P_ ((struct frame *, int *));
 static int single_display_spec_intangible_p P_ ((Lisp_Object));
 static void ensure_echo_area_buffers P_ ((void));
@@ -2628,6 +2630,9 @@ init_iterator (it, w, charpos, bytepos, row, base_face_id)
   /* Are multibyte characters enabled in current_buffer?  */
   it->multibyte_p = !NILP (current_buffer->enable_multibyte_characters);
 
+  /* Do we need to reorder bidirectional text?  */
+  it->bidi_p = !NILP (current_buffer->bidi_display_reordering);
+
   /* Non-zero if we should highlight the region.  */
   highlight_region_p
     = (!NILP (Vtransient_mark_mode)
@@ -2718,6 +2723,10 @@ init_iterator (it, w, charpos, bytepos, row, base_face_id)
   it->glyph_row = row;
   it->area = TEXT_AREA;
 
+  /* Forget any previous info about this row being reversed.  */
+  if (it->glyph_row)
+    it->glyph_row->reversed_p = 0;
+
   /* Get the dimensions of the display area.  The display area
      consists of the visible window area plus a horizontally scrolled
      part to the left of the window.  All x-values are relative to the
@@ -2773,6 +2782,21 @@ init_iterator (it, w, charpos, bytepos, row, base_face_id)
        it->start_of_box_run_p = 1;
     }
 
+  /* If we are to reorder bidirectional text, init the bidi
+     iterator.  */
+  if (it->bidi_p)
+    {
+      /* Note the paragraph direction that this buffer wants to
+        use.  */
+      if (EQ (current_buffer->bidi_paragraph_direction, Qleft_to_right))
+       it->paragraph_embedding = L2R;
+      else if (EQ (current_buffer->bidi_paragraph_direction, Qright_to_left))
+       it->paragraph_embedding = R2L;
+      else
+       it->paragraph_embedding = NEUTRAL_DIR;
+      bidi_init_it (charpos, bytepos, &it->bidi_it);
+    }
+
   /* If a buffer position was specified, set the iterator there,
      getting overlays and face properties from that position.  */
   if (charpos >= BUF_BEG (current_buffer))
@@ -3738,18 +3762,18 @@ handle_invisible_prop (it)
   else
     {
       int invis_p;
-      EMACS_INT newpos, next_stop, start_charpos;
+      EMACS_INT newpos, next_stop, start_charpos, tem;
       Lisp_Object pos, prop, overlay;
 
       /* First of all, is there invisible text at this position?  */
-      start_charpos = IT_CHARPOS (*it);
-      pos = make_number (IT_CHARPOS (*it));
+      tem = start_charpos = IT_CHARPOS (*it);
+      pos = make_number (tem);
       prop = get_char_property_and_overlay (pos, Qinvisible, it->window,
                                            &overlay);
       invis_p = TEXT_PROP_MEANS_INVISIBLE (prop);
 
       /* If we are on invisible text, skip over it.  */
-      if (invis_p && IT_CHARPOS (*it) < it->end_charpos)
+      if (invis_p && start_charpos < it->end_charpos)
        {
          /* Record whether we have to display an ellipsis for the
             invisible text.  */
@@ -3762,17 +3786,16 @@ handle_invisible_prop (it)
          do
            {
              /* Try to skip some invisible text.  Return value is the
-                position reached which can be equal to IT's position
-                if there is nothing invisible here.  This skips both
+                position reached which can be equal to where we start
+                if there is nothing invisible there.  This skips both
                 over invisible text properties and overlays with
                 invisible property.  */
-             newpos = skip_invisible (IT_CHARPOS (*it),
-                                      &next_stop, ZV, it->window);
+             newpos = skip_invisible (tem, &next_stop, ZV, it->window);
 
              /* If we skipped nothing at all we weren't at invisible
                 text in the first place.  If everything to the end of
                 the buffer was skipped, end the loop.  */
-             if (newpos == IT_CHARPOS (*it) || newpos >= ZV)
+             if (newpos == tem || newpos >= ZV)
                invis_p = 0;
              else
                {
@@ -3790,7 +3813,7 @@ handle_invisible_prop (it)
              /* If we ended up on invisible text, proceed to
                 skip starting with next_stop.  */
              if (invis_p)
-               IT_CHARPOS (*it) = next_stop;
+               tem = next_stop;
 
               /* If there are adjacent invisible texts, don't lose the
                  second one's ellipsis. */
@@ -3800,8 +3823,47 @@ handle_invisible_prop (it)
          while (invis_p);
 
          /* The position newpos is now either ZV or on visible text.  */
-         IT_CHARPOS (*it) = newpos;
-         IT_BYTEPOS (*it) = CHAR_TO_BYTE (newpos);
+         if (it->bidi_p && newpos < ZV)
+           {
+             /* With bidi iteration, the region of invisible text
+                could start and/or end in the middle of a non-base
+                embedding level.  Therefore, we need to skip
+                invisible text using the bidi iterator, starting at
+                IT's current position, until we find ourselves
+                outside the invisible text.  Skipping invisible text
+                _after_ bidi iteration avoids affecting the visual
+                order of the displayed text when invisible properties
+                are added or removed.  */
+             if (it->bidi_it.first_elt)
+               {
+                 /* If we were `reseat'ed to a new paragraph,
+                    determine the paragraph base direction.  We need
+                    to do it now because next_element_from_buffer may
+                    not have a chance to do it, if we are going to
+                    skip any text at the beginning, which resets the
+                    FIRST_ELT flag.  */
+                 bidi_paragraph_init (it->paragraph_embedding, &it->bidi_it);
+               }
+             do
+               {
+                 bidi_get_next_char_visually (&it->bidi_it);
+               }
+             while (it->stop_charpos <= it->bidi_it.charpos
+                    && it->bidi_it.charpos < newpos);
+             IT_CHARPOS (*it) = it->bidi_it.charpos;
+             IT_BYTEPOS (*it) = it->bidi_it.bytepos;
+             /* If we overstepped NEWPOS, record its position in the
+                iterator, so that we skip invisible text if later the
+                bidi iteration lands us in the invisible region
+                again. */
+             if (IT_CHARPOS (*it) >= newpos)
+               it->prev_stop = newpos;
+           }
+         else
+           {
+             IT_CHARPOS (*it) = newpos;
+             IT_BYTEPOS (*it) = CHAR_TO_BYTE (newpos);
+           }
 
          /* If there are before-strings at the start of invisible
             text, and the text is invisible because of a text
@@ -3810,7 +3872,7 @@ handle_invisible_prop (it)
             overlay property instead of a text property, this is
             already handled in the overlay code.)  */
          if (NILP (overlay)
-             && get_overlay_strings (it, start_charpos))
+             && get_overlay_strings (it, it->stop_charpos))
            {
              handled = HANDLED_RECOMPUTE_PROPS;
              it->stack[it->sp - 1].display_ellipsis_p = display_ellipsis_p;
@@ -3831,7 +3893,7 @@ handle_invisible_prop (it)
                  first invisible character.  */
              if (!STRINGP (it->object))
                {
-                 it->position.charpos = IT_CHARPOS (*it) - 1;
+                 it->position.charpos = newpos - 1;
                  it->position.bytepos = CHAR_TO_BYTE (it->position.charpos);
                }
              it->ellipsis_p = 1;
@@ -4545,43 +4607,46 @@ display_prop_string_p (prop, string)
   return 0;
 }
 
-
-/* Determine which buffer position in W's buffer STRING comes from.
-   AROUND_CHARPOS is an approximate position where it could come from.
-   Value is the buffer position or 0 if it couldn't be determined.
+/* Look for STRING in overlays and text properties in W's buffer,
+   between character positions FROM and TO (excluding TO).
+   BACK_P non-zero means look back (in this case, TO is supposed to be
+   less than FROM).
+   Value is the first character position where STRING was found, or
+   zero if it wasn't found before hitting TO.
 
    W's buffer must be current.
 
-   This function is necessary because we don't record buffer positions
-   in glyphs generated from strings (to keep struct glyph small).
    This function may only use code that doesn't eval because it is
    called asynchronously from note_mouse_highlight.  */
 
-int
-string_buffer_position (w, string, around_charpos)
+static EMACS_INT
+string_buffer_position_lim (w, string, from, to, back_p)
      struct window *w;
      Lisp_Object string;
-     int around_charpos;
+     EMACS_INT from, to;
+     int back_p;
 {
   Lisp_Object limit, prop, pos;
-  const int MAX_DISTANCE = 1000;
   int found = 0;
 
-  pos = make_number (around_charpos);
-  limit = make_number (min (XINT (pos) + MAX_DISTANCE, ZV));
-  while (!found && !EQ (pos, limit))
+  pos = make_number (from);
+
+  if (!back_p) /* looking forward */
     {
-      prop = Fget_char_property (pos, Qdisplay, Qnil);
-      if (!NILP (prop) && display_prop_string_p (prop, string))
-       found = 1;
-      else
-       pos = Fnext_single_char_property_change (pos, Qdisplay, Qnil, limit);
+      limit = make_number (min (to, ZV));
+      while (!found && !EQ (pos, limit))
+       {
+         prop = Fget_char_property (pos, Qdisplay, Qnil);
+         if (!NILP (prop) && display_prop_string_p (prop, string))
+           found = 1;
+         else
+           pos = Fnext_single_char_property_change (pos, Qdisplay, Qnil,
+                                                    limit);
+       }
     }
-
-  if (!found)
+  else         /* looking back */
     {
-      pos = make_number (around_charpos);
-      limit = make_number (max (XINT (pos) - MAX_DISTANCE, BEGV));
+      limit = make_number (max (to, BEGV));
       while (!found && !EQ (pos, limit))
        {
          prop = Fget_char_property (pos, Qdisplay, Qnil);
@@ -4596,6 +4661,35 @@ string_buffer_position (w, string, around_charpos)
   return found ? XINT (pos) : 0;
 }
 
+/* Determine which buffer position in W's buffer STRING comes from.
+   AROUND_CHARPOS is an approximate position where it could come from.
+   Value is the buffer position or 0 if it couldn't be determined.
+
+   W's buffer must be current.
+
+   This function is necessary because we don't record buffer positions
+   in glyphs generated from strings (to keep struct glyph small).
+   This function may only use code that doesn't eval because it is
+   called asynchronously from note_mouse_highlight.  */
+
+EMACS_INT
+string_buffer_position (w, string, around_charpos)
+     struct window *w;
+     Lisp_Object string;
+     EMACS_INT around_charpos;
+{
+  Lisp_Object limit, prop, pos;
+  const int MAX_DISTANCE = 1000;
+  EMACS_INT found = string_buffer_position_lim (w, string, around_charpos,
+                                               around_charpos + MAX_DISTANCE,
+                                               0);
+
+  if (!found)
+    found = string_buffer_position_lim (w, string, around_charpos,
+                                       around_charpos - MAX_DISTANCE, 1);
+  return found;
+}
+
 
 \f
 /***********************************************************************
@@ -5062,6 +5156,8 @@ push_it (it)
   p = it->stack + it->sp;
 
   p->stop_charpos = it->stop_charpos;
+  p->prev_stop = it->prev_stop;
+  p->base_level_stop = it->base_level_stop;
   p->cmp_it = it->cmp_it;
   xassert (it->face_id >= 0);
   p->face_id = it->face_id;
@@ -5112,6 +5208,8 @@ pop_it (it)
   --it->sp;
   p = it->stack + it->sp;
   it->stop_charpos = p->stop_charpos;
+  it->prev_stop = p->prev_stop;
+  it->base_level_stop = p->base_level_stop;
   it->cmp_it = p->cmp_it;
   it->face_id = p->face_id;
   it->current = p->current;
@@ -5289,8 +5387,8 @@ back_to_previous_visible_line_start (it)
       if (IT_CHARPOS (*it) <= BEGV)
        break;
 
-      /* If selective > 0, then lines indented more than that values
-        are invisible.  */
+      /* If selective > 0, then lines indented more than its value are
+        invisible.  */
       if (it->selective > 0
          && indented_beyond_p (IT_CHARPOS (*it), IT_BYTEPOS (*it),
                                (double) it->selective)) /* iftc */
@@ -5447,7 +5545,30 @@ reseat (it, pos, force_p)
   if (force_p
       || CHARPOS (pos) > it->stop_charpos
       || CHARPOS (pos) < original_pos)
-    handle_stop (it);
+    {
+      if (it->bidi_p)
+       {
+         /* For bidi iteration, we need to prime prev_stop and
+            base_level_stop with our best estimations.  */
+         if (CHARPOS (pos) < it->prev_stop)
+           {
+             handle_stop_backwards (it, BEGV);
+             if (CHARPOS (pos) < it->base_level_stop)
+               it->base_level_stop = 0;
+           }
+         else if (CHARPOS (pos) > it->stop_charpos
+                  && it->stop_charpos >= BEGV)
+           handle_stop_backwards (it, it->stop_charpos);
+         else  /* force_p */
+           handle_stop (it);
+       }
+      else
+       {
+         handle_stop (it);
+         it->prev_stop = it->base_level_stop = 0;
+       }
+
+    }
 
   CHECK_IT (it);
 }
@@ -5484,9 +5605,14 @@ reseat_1 (it, pos, set_stop_p)
   it->sp = 0;
   it->string_from_display_prop_p = 0;
   it->face_before_selective_p = 0;
+  if (it->bidi_p)
+    it->bidi_it.first_elt = 1;
 
   if (set_stop_p)
-    it->stop_charpos = CHARPOS (pos);
+    {
+      it->stop_charpos = CHARPOS (pos);
+      it->base_level_stop = CHARPOS (pos);
+    }
 }
 
 
@@ -5598,7 +5724,7 @@ reseat_to_string (it, s, string, charpos, precision, field_width, multibyte)
 \f
 /***********************************************************************
                              Iteration
- ***********************************************************************/
+***********************************************************************/
 
 /* Map enum it_method value to corresponding next_element_from_* function.  */
 
@@ -5650,6 +5776,13 @@ get_next_display_element (it)
 
   if (it->what == IT_CHARACTER)
     {
+      /* UAX#9, L4: "A character is depicted by a mirrored glyph if
+        and only if (a) the resolved directionality of that character
+        is R..."  */
+      /* FIXME: Do we need an exception for characters from display
+        tables?  */
+      if (it->bidi_p && it->bidi_it.type == STRONG_R)
+       it->c = bidi_mirror_char (it->c);
       /* Map via display table or translate control characters.
         IT->c, IT->len etc. have been set to the next character by
         the function call above.  If we have a display table, and it
@@ -5664,7 +5797,7 @@ get_next_display_element (it)
          Lisp_Object dv;
          struct charset *unibyte = CHARSET_FROM_ID (charset_unibyte);
          enum { char_is_other = 0, char_is_nbsp, char_is_soft_hyphen }
-              nbsp_or_shy = char_is_other;
+         nbsp_or_shy = char_is_other;
          int decoded = it->c;
 
          if (it->dp
@@ -5882,12 +6015,12 @@ get_next_display_element (it)
                       happen actually, but due to bugs it may
                       happen.  Let's print the char as is, there's
                       not much meaningful we can do with it.  */
-                     str[0] = it->c;
-                     str[1] = it->c >> 8;
-                     str[2] = it->c >> 16;
-                     str[3] = it->c >> 24;
-                     len = 4;
-                   }
+                   str[0] = it->c;
+                   str[1] = it->c >> 8;
+                   str[2] = it->c >> 16;
+                   str[3] = it->c >> 24;
+                   len = 4;
+                 }
 
                for (i = 0; i < len; i++)
                  {
@@ -6056,8 +6189,22 @@ set_iterator_to_next (it, reseat_p)
       else
        {
          xassert (it->len != 0);
-         IT_BYTEPOS (*it) += it->len;
-         IT_CHARPOS (*it) += 1;
+
+         if (!it->bidi_p)
+           {
+             IT_BYTEPOS (*it) += it->len;
+             IT_CHARPOS (*it) += 1;
+           }
+         else
+           {
+             /* If this is a new paragraph, determine its base
+                direction (a.k.a. its base embedding level).  */
+             if (it->bidi_it.new_paragraph)
+               bidi_paragraph_init (it->paragraph_embedding, &it->bidi_it);
+             bidi_get_next_char_visually (&it->bidi_it);
+             IT_BYTEPOS (*it) = it->bidi_it.bytepos;
+             IT_CHARPOS (*it) = it->bidi_it.charpos;
+           }
          xassert (IT_BYTEPOS (*it) == CHAR_TO_BYTE (IT_CHARPOS (*it)));
        }
       break;
@@ -6210,7 +6357,7 @@ next_element_from_display_vector (it)
   it->face_id = it->saved_face_id;
 
   /* KFS: This code used to check ip->dpvec[0] instead of the current element.
-          That seemed totally bogus - so I changed it...  */
+     That seemed totally bogus - so I changed it...  */
   gc = it->dpvec[it->current.dpvec_index];
 
   if (GLYPH_CODE_P (gc) && GLYPH_CODE_CHAR_VALID_P (gc))
@@ -6445,6 +6592,45 @@ next_element_from_stretch (it)
   return 1;
 }
 
+/* Scan forward from CHARPOS in the current buffer, until we find a
+   stop position > current IT's position.  Then handle the stop
+   position before that.  This is called when we bump into a stop
+   position while reordering bidirectional text.  */
+
+static void
+handle_stop_backwards (it, charpos)
+     struct it *it;
+     EMACS_INT charpos;
+{
+  EMACS_INT where_we_are = IT_CHARPOS (*it);
+  struct display_pos save_current = it->current;
+  struct text_pos save_position = it->position;
+  struct text_pos pos1;
+  EMACS_INT next_stop;
+
+  /* Scan in strict logical order.  */
+  it->bidi_p = 0;
+  do
+    {
+      it->prev_stop = charpos;
+      SET_TEXT_POS (pos1, charpos, CHAR_TO_BYTE (charpos));
+      reseat_1 (it, pos1, 0);
+      compute_stop_pos (it);
+      /* We must advance forward, right?  */
+      if (it->stop_charpos <= it->prev_stop)
+       abort ();
+      charpos = it->stop_charpos;
+    }
+  while (charpos <= where_we_are);
+
+  next_stop = it->stop_charpos;
+  it->stop_charpos = it->prev_stop;
+  it->bidi_p = 1;
+  it->current = save_current;
+  it->position = save_position;
+  handle_stop (it);
+  it->stop_charpos = next_stop;
+}
 
 /* Load IT with the next display element from current_buffer.  Value
    is zero if end of buffer reached.  IT->stop_charpos is the next
@@ -6459,6 +6645,53 @@ next_element_from_buffer (it)
 
   xassert (IT_CHARPOS (*it) >= BEGV);
 
+  /* With bidi reordering, the character to display might not be the
+     character at IT_CHARPOS.  BIDI_IT.FIRST_ELT non-zero means that
+     we were reseat()ed to a new buffer position, which is potentially
+     a different paragraph.  */
+  if (it->bidi_p && it->bidi_it.first_elt)
+    {
+      it->bidi_it.charpos = IT_CHARPOS (*it);
+      it->bidi_it.bytepos = IT_BYTEPOS (*it);
+      /* If we are at the beginning of a line, we can produce the next
+        element right away.  */
+      if (it->bidi_it.bytepos == BEGV_BYTE
+         /* FIXME: Should support all Unicode line separators.  */
+         || FETCH_CHAR (it->bidi_it.bytepos - 1) == '\n'
+         || FETCH_CHAR (it->bidi_it.bytepos) == '\n')
+       {
+         bidi_paragraph_init (it->paragraph_embedding, &it->bidi_it);
+         bidi_get_next_char_visually (&it->bidi_it);
+       }
+      else
+       {
+         int orig_bytepos = IT_BYTEPOS (*it);
+
+         /* We need to prime the bidi iterator starting at the line's
+            beginning, before we will be able to produce the next
+            element.  */
+         IT_CHARPOS (*it) = find_next_newline_no_quit (IT_CHARPOS (*it), -1);
+         IT_BYTEPOS (*it) = CHAR_TO_BYTE (IT_CHARPOS (*it));
+         it->bidi_it.charpos = IT_CHARPOS (*it);
+         it->bidi_it.bytepos = IT_BYTEPOS (*it);
+         bidi_paragraph_init (it->paragraph_embedding, &it->bidi_it);
+         do
+           {
+             /* Now return to buffer position where we were asked to
+                get the next display element, and produce that.  */
+             bidi_get_next_char_visually (&it->bidi_it);
+           }
+         while (it->bidi_it.bytepos != orig_bytepos
+                && it->bidi_it.bytepos < ZV_BYTE);
+       }
+
+      it->bidi_it.first_elt = 0; /* paranoia: bidi.c does this */
+      /*  Adjust IT's position information to where we ended up.  */
+      IT_CHARPOS (*it) = it->bidi_it.charpos;
+      IT_BYTEPOS (*it) = it->bidi_it.bytepos;
+      SET_TEXT_POS (it->position, IT_CHARPOS (*it), IT_BYTEPOS (*it));
+    }
+
   if (IT_CHARPOS (*it) >= it->stop_charpos)
     {
       if (IT_CHARPOS (*it) >= it->end_charpos)
@@ -6484,12 +6717,51 @@ next_element_from_buffer (it)
              success_p = 0;
            }
        }
+      else if (!(!it->bidi_p
+                || BIDI_AT_BASE_LEVEL (it->bidi_it)
+                || IT_CHARPOS (*it) == it->stop_charpos))
+       {
+         /* With bidi non-linear iteration, we could find ourselves
+            far beyond the last computed stop_charpos, with several
+            other stop positions in between that we missed.  Scan
+            them all now, in buffer's logical order, until we find
+            and handle the last stop_charpos that precedes our
+            current position.  */
+         handle_stop_backwards (it, it->stop_charpos);
+         return GET_NEXT_DISPLAY_ELEMENT (it);
+       }
       else
        {
+         if (it->bidi_p)
+           {
+             /* Take note of the stop position we just moved across,
+                for when we will move back across it.  */
+             it->prev_stop = it->stop_charpos;
+             /* If we are at base paragraph embedding level, take
+                note of the last stop position seen at this
+                level.  */
+             if (BIDI_AT_BASE_LEVEL (it->bidi_it))
+               it->base_level_stop = it->stop_charpos;
+           }
          handle_stop (it);
          return GET_NEXT_DISPLAY_ELEMENT (it);
        }
     }
+  else if (it->bidi_p
+          /* We can sometimes back up for reasons that have nothing
+             to do with bidi reordering.  E.g., compositions.  The
+             code below is only needed when we are above the base
+             embedding level, so test for that explicitly.  */
+          && !BIDI_AT_BASE_LEVEL (it->bidi_it)
+          && IT_CHARPOS (*it) < it->prev_stop)
+    {
+      if (it->base_level_stop <= 0)
+       it->base_level_stop = BEGV;
+      if (IT_CHARPOS (*it) < it->base_level_stop)
+       abort ();
+      handle_stop_backwards (it, it->base_level_stop);
+      return GET_NEXT_DISPLAY_ELEMENT (it);
+    }
   else
     {
       /* No face changes, overlays etc. in sight, so just return a
@@ -6644,9 +6916,9 @@ next_element_from_composition (it)
    line on the display without producing glyphs.
 
    OP should be a bit mask including some or all of these bits:
-    MOVE_TO_X: Stop on reaching x-position TO_X.
-    MOVE_TO_POS: Stop on reaching buffer or string position TO_CHARPOS.
-   Regardless of OP's value, stop in reaching the end of the display line.
+    MOVE_TO_X: Stop upon reaching x-position TO_X.
+    MOVE_TO_POS: Stop upon reaching buffer or string position TO_CHARPOS.
+   Regardless of OP's value, stop upon reaching the end of the display line.
 
    TO_X is normally a value 0 <= TO_X <= IT->last_visible_x.
    This means, in particular, that TO_X includes window's horizontal
@@ -6682,6 +6954,8 @@ move_it_in_display_line_to (struct it *it,
   struct glyph_row *saved_glyph_row;
   struct it wrap_it, atpos_it, atx_it;
   int may_wrap = 0;
+  enum it_method prev_method = it->method;
+  EMACS_INT prev_pos = IT_CHARPOS (*it);
 
   /* Don't produce glyphs in produce_glyphs.  */
   saved_glyph_row = it->glyph_row;
@@ -6699,7 +6973,8 @@ move_it_in_display_line_to (struct it *it,
 #define BUFFER_POS_REACHED_P()                                 \
   ((op & MOVE_TO_POS) != 0                                     \
    && BUFFERP (it->object)                                     \
-   && IT_CHARPOS (*it) >= to_charpos                           \
+   && (IT_CHARPOS (*it) == to_charpos                          \
+       || (!it->bidi_p && IT_CHARPOS (*it) > to_charpos))      \
    && (it->method == GET_FROM_BUFFER                           \
        || (it->method == GET_FROM_DISPLAY_VECTOR               \
           && it->dpvec + it->current.dpvec_index + 1 >= it->dpend)))
@@ -6723,7 +6998,16 @@ move_it_in_display_line_to (struct it *it,
       if ((op & MOVE_TO_POS) != 0
          && BUFFERP (it->object)
          && it->method == GET_FROM_BUFFER
-         && IT_CHARPOS (*it) > to_charpos)
+         && ((!it->bidi_p && IT_CHARPOS (*it) > to_charpos)
+             || (it->bidi_p
+                 && (prev_method == GET_FROM_IMAGE
+                     || prev_method == GET_FROM_STRETCH)
+                 /* Passed TO_CHARPOS from left to right.  */
+                 && ((prev_pos < to_charpos
+                      && IT_CHARPOS (*it) > to_charpos)
+                     /* Passed TO_CHARPOS from right to left.  */
+                     || (prev_pos > to_charpos
+                         && IT_CHARPOS (*it) < to_charpos)))))
        {
          if (it->line_wrap != WORD_WRAP || wrap_it.sp < 0)
            {
@@ -6737,6 +7021,9 @@ move_it_in_display_line_to (struct it *it,
            atpos_it = *it;
        }
 
+      prev_method = it->method;
+      if (it->method == GET_FROM_BUFFER)
+       prev_pos = IT_CHARPOS (*it);
       /* Stop when ZV reached.
          We used to stop here when TO_CHARPOS reached as well, but that is
          too soon if this glyph does not fit on this line.  So we handle it
@@ -7002,6 +7289,8 @@ move_it_in_display_line_to (struct it *it,
          break;
        }
 
+      if (it->method == GET_FROM_BUFFER)
+       prev_pos = IT_CHARPOS (*it);
       /* The current display element has been consumed.  Advance
         to the next.  */
       set_iterator_to_next (it, 1);
@@ -10987,6 +11276,17 @@ text_outside_line_unchanged_p (w, start, end)
              && overlay_touches_p (Z - end))
            unchanged_p = 0;
        }
+
+      /* Under bidi reordering, adding or deleting a character in the
+        beginning of a paragraph, before the first strong directional
+        character, can change the base direction of the paragraph (unless
+        the buffer specifies a fixed paragraph direction), which will
+        require to redisplay the whole paragraph.  It might be worthwhile
+        to find the paragraph limits and widen the range of redisplayed
+        lines to that, but for now just give up this optimization.  */
+      if (!NILP (XBUFFER (w->buffer)->bidi_display_reordering)
+         && NILP (XBUFFER (w->buffer)->bidi_paragraph_direction))
+       unchanged_p = 0;
     }
 
   return unchanged_p;
@@ -12277,162 +12577,400 @@ set_cursor_from_row (w, row, matrix, delta, delta_bytes, dy, dvpos)
   struct glyph *glyph = row->glyphs[TEXT_AREA];
   struct glyph *end = glyph + row->used[TEXT_AREA];
   struct glyph *cursor = NULL;
-  /* The first glyph that starts a sequence of glyphs from a string
-     that is a value of a display property.  */
-  struct glyph *string_start;
-  /* The X coordinate of string_start.  */
-  int string_start_x;
   /* The last known character position in row.  */
   int last_pos = MATRIX_ROW_START_CHARPOS (row) + delta;
-  /* The last known character position before string_start.  */
-  int string_before_pos;
   int x = row->x;
   int cursor_x = x;
-  /* Last buffer position covered by an overlay.  */
-  int cursor_from_overlay_pos = 0;
-  int pt_old = PT - delta;
-
-  /* Skip over glyphs not having an object at the start of the row.
-     These are special glyphs like truncation marks on terminal
-     frames.  */
+  EMACS_INT pt_old = PT - delta;
+  EMACS_INT pos_before = MATRIX_ROW_START_CHARPOS (row) + delta;
+  EMACS_INT pos_after = MATRIX_ROW_END_CHARPOS (row) + delta;
+  struct glyph *glyph_before = glyph - 1, *glyph_after = end;
+  /* Non-zero means we've found a match for cursor position, but that
+     glyph has the avoid_cursor_p flag set.  */
+  int match_with_avoid_cursor = 0;
+  /* Non-zero means we've seen at least one glyph that came from a
+     display string.  */
+  int string_seen = 0;
+  /* Largest buffer position seen so far during scan of glyph row.  */
+  EMACS_INT bpos_max = last_pos;
+  /* Last buffer position covered by an overlay string with an integer
+     `cursor' property.  */
+  EMACS_INT bpos_covered = 0;
+
+  /* Skip over glyphs not having an object at the start and the end of
+     the row.  These are special glyphs like truncation marks on
+     terminal frames.  */
   if (row->displays_text_p)
-    while (glyph < end
-          && INTEGERP (glyph->object)
-          && glyph->charpos < 0)
+    {
+      if (!row->reversed_p)
+       {
+         while (glyph < end
+                && INTEGERP (glyph->object)
+                && glyph->charpos < 0)
+           {
+             x += glyph->pixel_width;
+             ++glyph;
+           }
+         while (end > glyph
+                && INTEGERP ((end - 1)->object)
+                /* CHARPOS is zero for blanks inserted by
+                   extend_face_to_end_of_line.  */
+                && (end - 1)->charpos <= 0)
+           --end;
+         glyph_before = glyph - 1;
+         glyph_after = end;
+       }
+      else
+       {
+         struct glyph *g;
+
+         /* If the glyph row is reversed, we need to process it from back
+            to front, so swap the edge pointers.  */
+         end = glyph - 1;
+         glyph += row->used[TEXT_AREA] - 1;
+         /* Reverse the known positions in the row.  */
+         last_pos = pos_after = MATRIX_ROW_START_CHARPOS (row) + delta;
+         pos_before = MATRIX_ROW_END_CHARPOS (row) + delta;
+
+         while (glyph > end + 1
+                && INTEGERP (glyph->object)
+                && glyph->charpos < 0)
+           {
+             --glyph;
+             x -= glyph->pixel_width;
+           }
+         if (INTEGERP (glyph->object) && glyph->charpos < 0)
+           --glyph;
+         /* By default, put the cursor on the rightmost glyph.  */
+         for (g = end + 1; g < glyph; g++)
+           x += g->pixel_width;
+         cursor_x = x;
+         while (end < glyph
+                && INTEGERP ((end + 1)->object)
+                && (end + 1)->charpos <= 0)
+           ++end;
+         glyph_before = glyph + 1;
+         glyph_after = end;
+       }
+    }
+  else if (row->reversed_p)
+    {
+      /* In R2L rows that don't display text, put the cursor on the
+        rightmost glyph.  Case in point: an empty last line that is
+        part of an R2L paragraph.  */
+      cursor = end - 1;
+      x = -1;  /* will be computed below, at lable compute_x */
+    }
+
+  /* Step 1: Try to find the glyph whose character position
+     corresponds to point.  If that's not possible, find 2 glyphs
+     whose character positions are the closest to point, one before
+     point, the other after it.  */
+  if (!row->reversed_p)
+    while (/* not marched to end of glyph row */
+          glyph < end
+          /* glyph was not inserted by redisplay for internal purposes */
+          && !INTEGERP (glyph->object))
       {
+       if (BUFFERP (glyph->object))
+         {
+           EMACS_INT dpos = glyph->charpos - pt_old;
+
+           if (glyph->charpos > bpos_max)
+             bpos_max = glyph->charpos;
+           if (!glyph->avoid_cursor_p)
+             {
+               /* If we hit point, we've found the glyph on which to
+                  display the cursor.  */
+               if (dpos == 0)
+                 {
+                   match_with_avoid_cursor = 0;
+                   break;
+                 }
+               /* See if we've found a better approximation to
+                  POS_BEFORE or to POS_AFTER.  Note that we want the
+                  first (leftmost) glyph of all those that are the
+                  closest from below, and the last (rightmost) of all
+                  those from above.  */
+               if (0 > dpos && dpos > pos_before - pt_old)
+                 {
+                   pos_before = glyph->charpos;
+                   glyph_before = glyph;
+                 }
+               else if (0 < dpos && dpos <= pos_after - pt_old)
+                 {
+                   pos_after = glyph->charpos;
+                   glyph_after = glyph;
+                 }
+             }
+           else if (dpos == 0)
+             match_with_avoid_cursor = 1;
+         }
+       else if (STRINGP (glyph->object))
+         {
+           Lisp_Object chprop;
+           int glyph_pos = glyph->charpos;
+
+           chprop = Fget_char_property (make_number (glyph_pos), Qcursor,
+                                        glyph->object);
+           if (INTEGERP (chprop))
+             {
+               bpos_covered = bpos_max + XINT (chprop);
+               /* If the `cursor' property covers buffer positions up
+                  to and including point, we should display cursor on
+                  this glyph.  */
+               /* Implementation note: bpos_max == pt_old when, e.g.,
+                  we are in an empty line, where bpos_max is set to
+                  MATRIX_ROW_START_CHARPOS, see above.  */
+               if (bpos_max <= pt_old && bpos_covered >= pt_old)
+                 {
+                   cursor = glyph;
+                   break;
+                 }
+             }
+
+           string_seen = 1;
+         }
        x += glyph->pixel_width;
        ++glyph;
       }
+  else if (glyph > end)        /* row is reversed */
+    while (!INTEGERP (glyph->object))
+      {
+       if (BUFFERP (glyph->object))
+         {
+           EMACS_INT dpos = glyph->charpos - pt_old;
 
-  string_start = NULL;
-  while (glyph < end
-        && !INTEGERP (glyph->object)
-        && (!BUFFERP (glyph->object)
-            || (last_pos = glyph->charpos) < pt_old
-            || glyph->avoid_cursor_p))
+           if (glyph->charpos > bpos_max)
+             bpos_max = glyph->charpos;
+           if (!glyph->avoid_cursor_p)
+             {
+               if (dpos == 0)
+                 {
+                   match_with_avoid_cursor = 0;
+                   break;
+                 }
+               if (0 > dpos && dpos > pos_before - pt_old)
+                 {
+                   pos_before = glyph->charpos;
+                   glyph_before = glyph;
+                 }
+               else if (0 < dpos && dpos <= pos_after - pt_old)
+                 {
+                   pos_after = glyph->charpos;
+                   glyph_after = glyph;
+                 }
+             }
+           else if (dpos == 0)
+             match_with_avoid_cursor = 1;
+         }
+       else if (STRINGP (glyph->object))
+         {
+           Lisp_Object chprop;
+           int glyph_pos = glyph->charpos;
+
+           chprop = Fget_char_property (make_number (glyph_pos), Qcursor,
+                                        glyph->object);
+           if (INTEGERP (chprop))
+             {
+               bpos_covered = bpos_max + XINT (chprop);
+               /* If the `cursor' property covers buffer positions up
+                  to and including point, we should display cursor on
+                  this glyph.  */
+               if (bpos_max <= pt_old && bpos_covered >= pt_old)
+                 {
+                   cursor = glyph;
+                   break;
+                 }
+             }
+           string_seen = 1;
+         }
+       --glyph;
+       if (glyph == end)
+         break;
+       x -= glyph->pixel_width;
+    }
+
+  /* Step 2: If we didn't find an exact match for point, we need to
+     look for a proper place to put the cursor among glyphs between
+     GLYPH_BEFORE and GLYPH_AFTER.  */
+  if (!(BUFFERP (glyph->object) && glyph->charpos == pt_old)
+      && bpos_covered < pt_old)
     {
-      if (! STRINGP (glyph->object))
+      if (row->ends_in_ellipsis_p && pos_after == last_pos)
        {
-         string_start = NULL;
-         x += glyph->pixel_width;
-         ++glyph;
-         /* If we are beyond the cursor position computed from the
-            last overlay seen, that overlay is not in effect for
-            current cursor position.  Reset the cursor information
-            computed from that overlay.  */
-         if (cursor_from_overlay_pos
-             && last_pos >= cursor_from_overlay_pos)
+         EMACS_INT ellipsis_pos;
+
+         /* Scan back over the ellipsis glyphs.  */
+         if (!row->reversed_p)
            {
-             cursor_from_overlay_pos = 0;
-             cursor = NULL;
+             ellipsis_pos = (glyph - 1)->charpos;
+             while (glyph > row->glyphs[TEXT_AREA]
+                    && (glyph - 1)->charpos == ellipsis_pos)
+               glyph--, x -= glyph->pixel_width;
+             /* That loop always goes one position too far, including
+                the glyph before the ellipsis.  So scan forward over
+                that one.  */
+             x += glyph->pixel_width;
+             glyph++;
            }
-       }
-      else
-       {
-         if (string_start == NULL)
+         else  /* row is reversed */
            {
-             string_before_pos = last_pos;
-             string_start = glyph;
-             string_start_x = x;
+             ellipsis_pos = (glyph + 1)->charpos;
+             while (glyph < row->glyphs[TEXT_AREA] + row->used[TEXT_AREA] - 1
+                    && (glyph + 1)->charpos == ellipsis_pos)
+               glyph++, x += glyph->pixel_width;
+             x -= glyph->pixel_width;
+             glyph--;
            }
-         /* Skip all glyphs from a string.  */
-         do
+       }
+      else if (match_with_avoid_cursor
+              /* zero-width characters produce no glyphs */
+              || eabs (glyph_after - glyph_before) == 1)
+       {
+         cursor = glyph_after;
+         x = -1;
+       }
+      else if (string_seen)
+       {
+         int incr = row->reversed_p ? -1 : +1;
+
+         /* Need to find the glyph that came out of a string which is
+            present at point.  That glyph is somewhere between
+            GLYPH_BEFORE and GLYPH_AFTER, and it came from a string
+            positioned between POS_BEFORE and POS_AFTER in the
+            buffer.  */
+         struct glyph *stop = glyph_after;
+         EMACS_INT pos = pos_before;
+
+         x = -1;
+         for (glyph = glyph_before + incr;
+              row->reversed_p ? glyph > stop : glyph < stop; )
            {
-             Lisp_Object cprop;
-             int pos;
-             if ((cursor == NULL || glyph > cursor)
-                 && (cprop = Fget_char_property (make_number ((glyph)->charpos),
-                                                 Qcursor, (glyph)->object),
-                     !NILP (cprop))
-                 && (pos = string_buffer_position (w, glyph->object,
-                                                   string_before_pos),
-                     (pos == 0   /* from overlay */
-                      || pos == pt_old)))
+
+             /* Any glyphs that come from the buffer are here because
+                of bidi reordering.  Skip them, and only pay
+                attention to glyphs that came from some string.  */
+             if (STRINGP (glyph->object))
                {
-                 /* Compute the first buffer position after the overlay.
-                    If the `cursor' property tells us how  many positions
-                    are associated with the overlay, use that.  Otherwise,
-                    estimate from the buffer positions of the glyphs
-                    before and after the overlay.  */
-                 cursor_from_overlay_pos = (pos ? 0 : last_pos
-                                            + (INTEGERP (cprop) ? XINT (cprop) : 0));
-                 cursor = glyph;
-                 cursor_x = x;
+                 Lisp_Object str;
+                 EMACS_INT tem;
+
+                 str = glyph->object;
+                 tem = string_buffer_position_lim (w, str, pos, pos_after, 0);
+                 if (pos <= tem)
+                   {
+                     /* If the string from which this glyph came is
+                        found in the buffer at point, then we've
+                        found the glyph we've been looking for.  */
+                     if (tem == pt_old)
+                       {
+                         /* The glyphs from this string could have
+                            been reordered.  Find the one with the
+                            smallest string position.  Or there could
+                            be a character in the string with the
+                            `cursor' property, which means display
+                            cursor on that character's glyph.  */
+                         int strpos = glyph->charpos;
+
+                         cursor = glyph;
+                         for (glyph += incr;
+                              EQ (glyph->object, str);
+                              glyph += incr)
+                           {
+                             Lisp_Object cprop;
+                             int gpos = glyph->charpos;
+
+                             cprop = Fget_char_property (make_number (gpos),
+                                                         Qcursor,
+                                                         glyph->object);
+                             if (!NILP (cprop))
+                               {
+                                 cursor = glyph;
+                                 break;
+                               }
+                             if (glyph->charpos < strpos)
+                               {
+                                 strpos = glyph->charpos;
+                                 cursor = glyph;
+                               }
+                           }
+
+                         goto compute_x;
+                       }
+                     pos = tem + 1; /* don't find previous instances */
+                   }
+                 /* This string is not what we want; skip all of the
+                    glyphs that came from it.  */
+                 do
+                   glyph += incr;
+                 while ((row->reversed_p ? glyph > stop : glyph < stop)
+                        && EQ (glyph->object, str));
                }
-             x += glyph->pixel_width;
-             ++glyph;
+             else
+               glyph += incr;
            }
-         while (glyph < end && EQ (glyph->object, string_start->object));
+
+         /* If we reached the end of the line, and END was from a string,
+            the cursor is not on this line.  */
+         if (glyph == end
+             && STRINGP ((glyph - incr)->object)
+             && row->continued_p)
+           return 0;
        }
     }
 
+ compute_x:
   if (cursor != NULL)
+    glyph = cursor;
+  if (x < 0)
     {
-      glyph = cursor;
-      x = cursor_x;
-    }
-  else if (row->ends_in_ellipsis_p && glyph == end)
-    {
-      /* Scan back over the ellipsis glyphs, decrementing positions.  */
-      while (glyph > row->glyphs[TEXT_AREA]
-            && (glyph - 1)->charpos == last_pos)
-       glyph--, x -= glyph->pixel_width;
-      /* That loop always goes one position too far, including the
-        glyph before the ellipsis.  So scan forward over that one.  */
-      x += glyph->pixel_width;
-      glyph++;
-    }
-  else if (string_start
-          && (glyph == end || !BUFFERP (glyph->object) || last_pos > pt_old))
-    {
-      /* We may have skipped over point because the previous glyphs
-        are from string.  As there's no easy way to know the
-        character position of the current glyph, find the correct
-        glyph on point by scanning from string_start again.  */
-      Lisp_Object limit;
-      Lisp_Object string;
-      struct glyph *stop = glyph;
-      int pos;
+      struct glyph *g;
 
-      limit = make_number (pt_old + 1);
-      glyph = string_start;
-      x = string_start_x;
-      string = glyph->object;
-      pos = string_buffer_position (w, string, string_before_pos);
-      /* If POS == 0, STRING is from overlay.  We skip such glyphs
-        because we always put the cursor after overlay strings.  */
-      while (pos == 0 && glyph < stop)
+      /* Need to compute x that corresponds to GLYPH.  */
+      for (g = row->glyphs[TEXT_AREA], x = row->x; g < glyph; g++)
        {
-         string = glyph->object;
-         SKIP_GLYPHS (glyph, stop, x, EQ (glyph->object, string));
-         if (glyph < stop)
-           pos = string_buffer_position (w, glyph->object, string_before_pos);
-       }
-
-      while (glyph < stop)
-       {
-         pos = XINT (Fnext_single_char_property_change
-                     (make_number (pos), Qdisplay, Qnil, limit));
-         if (pos > pt_old)
-           break;
-         /* Skip glyphs from the same string.  */
-         string = glyph->object;
-         SKIP_GLYPHS (glyph, stop, x, EQ (glyph->object, string));
-         /* Skip glyphs from an overlay.  */
-         while (glyph < stop
-                && ! string_buffer_position (w, glyph->object, pos))
-           {
-             string = glyph->object;
-             SKIP_GLYPHS (glyph, stop, x, EQ (glyph->object, string));
-           }
-       }
-
-      /* If we reached the end of the line, and END was from a string,
-        the cursor is not on this line.  */
-      if (glyph == end && row->continued_p)
+         if (g >= row->glyphs[TEXT_AREA] + row->used[TEXT_AREA])
+           abort ();
+         x += g->pixel_width;
+       }
+    }
+
+  /* ROW could be part of a continued line, which might have other
+     rows whose start and end charpos occlude point.  Only set
+     w->cursor if we found a better approximation to the cursor
+     position than we have from previously examined rows.  */
+  if (w->cursor.vpos >= 0
+      /* Make sure cursor.vpos specifies a row whose start and end
+        charpos occlude point.  This is because some callers of this
+        function leave cursor.vpos at the row where the cursor was
+        displayed during the last redisplay cycle.  */
+      && MATRIX_ROW_START_CHARPOS (MATRIX_ROW (matrix, w->cursor.vpos)) <= pt_old
+      && pt_old < MATRIX_ROW_END_CHARPOS (MATRIX_ROW (matrix, w->cursor.vpos)))
+    {
+      struct glyph *g1 =
+       MATRIX_ROW_GLYPH_START (matrix, w->cursor.vpos) + w->cursor.hpos;
+
+      /* Keep the candidate whose buffer position is the closest to
+        point.  */
+      if (BUFFERP (g1->object)
+         && (g1->charpos == pt_old /* an exact match always wins */
+             || (BUFFERP (glyph->object)
+                 && eabs (g1->charpos - pt_old)
+                  < eabs (glyph->charpos - pt_old))))
+       return 0;
+      /* If this candidate gives an exact match, use that.  */
+      if (!(BUFFERP (glyph->object) && glyph->charpos == pt_old)
+         /* Otherwise, keep the candidate that comes from a row
+            spanning less buffer positions.  This may win when one or
+            both candidate positions are on glyphs that came from
+            display strings, for which we cannot compare buffer
+            positions.  */
+         && MATRIX_ROW_END_CHARPOS (MATRIX_ROW (matrix, w->cursor.vpos))
+            - MATRIX_ROW_START_CHARPOS (MATRIX_ROW (matrix, w->cursor.vpos))
+            < MATRIX_ROW_END_CHARPOS (row) - MATRIX_ROW_START_CHARPOS (row))
        return 0;
     }
-
   w->cursor.hpos = glyph - row->glyphs[TEXT_AREA];
   w->cursor.x = x;
   w->cursor.vpos = MATRIX_ROW_VPOS (row, matrix) + dvpos;
@@ -12979,6 +13517,32 @@ try_cursor_movement (window, startp, scroll_step)
            ++row;
          if (!row->enabled_p)
            rc = CURSOR_MOVEMENT_MUST_SCROLL;
+         /* If rows are bidi-reordered, back up until we find a row
+            that does not belong to a continuation line.  This is
+            because we must consider all rows of a continued line as
+            candidates for cursor positioning, since row start and
+            end positions change non-linearly with vertical position
+            in such rows.  */
+         /* FIXME: Revisit this when glyph ``spilling'' in
+            continuation lines' rows is implemented for
+            bidi-reordered rows.  */
+         if (!NILP (XBUFFER (w->buffer)->bidi_display_reordering))
+           {
+             while (MATRIX_ROW_CONTINUATION_LINE_P (row))
+               {
+                 xassert (row->enabled_p);
+                 --row;
+                 /* If we hit the beginning of the displayed portion
+                    without finding the first row of a continued
+                    line, give up.  */
+                 if (row <= w->current_matrix->rows)
+                   {
+                     rc = CURSOR_MOVEMENT_MUST_SCROLL;
+                     break;
+                   }
+
+               }
+           }
        }
 
       if (rc == CURSOR_MOVEMENT_CANNOT_BE_USED)
@@ -13102,6 +13666,46 @@ try_cursor_movement (window, startp, scroll_step)
            }
          else if (scroll_p)
            rc = CURSOR_MOVEMENT_MUST_SCROLL;
+         else if (!NILP (XBUFFER (w->buffer)->bidi_display_reordering))
+           {
+             /* With bidi-reordered rows, there could be more than
+                one candidate row whose start and end positions
+                occlude point.  We need to let set_cursor_from_row
+                find the best candidate.  */
+             /* FIXME: Revisit this when glyph ``spilling'' in
+                continuation lines' rows is implemented for
+                bidi-reordered rows.  */
+             int rv = 0;
+
+             do
+               {
+                 rv |= set_cursor_from_row (w, row, w->current_matrix,
+                                            0, 0, 0, 0);
+                 /* As soon as we've found the first suitable row
+                    whose ends_at_zv_p flag is set, we are done.  */
+                 if (rv
+                     && MATRIX_ROW (w->current_matrix, w->cursor.vpos)->ends_at_zv_p)
+                   {
+                     rc = CURSOR_MOVEMENT_SUCCESS;
+                     break;
+                   }
+                 ++row;
+               }
+             while (MATRIX_ROW_BOTTOM_Y (row) < last_y
+                    && MATRIX_ROW_START_CHARPOS (row) <= PT
+                    && PT <= MATRIX_ROW_END_CHARPOS (row)
+                    && cursor_row_p (w, row));
+             /* If we didn't find any candidate rows, or exited the
+                loop before all the candidates were examined, signal
+                to the caller that this method failed.  */
+             if (rc != CURSOR_MOVEMENT_SUCCESS
+                 && (!rv
+                     || (MATRIX_ROW_START_CHARPOS (row) <= PT
+                         && PT <= MATRIX_ROW_END_CHARPOS (row))))
+               rc = CURSOR_MOVEMENT_CANNOT_BE_USED;
+             else
+               rc = CURSOR_MOVEMENT_SUCCESS;
+           }
          else
            {
              do
@@ -14428,15 +15032,39 @@ try_window_reusing_current_matrix (w)
            {
              struct glyph *glyph = row->glyphs[TEXT_AREA] + w->cursor.hpos;
              struct glyph *end = glyph + row->used[TEXT_AREA];
+             struct glyph *orig_glyph = glyph;
+             struct cursor_pos orig_cursor = w->cursor;
 
              for (; glyph < end
                     && (!BUFFERP (glyph->object)
-                        || glyph->charpos < PT);
+                        || glyph->charpos != PT);
                   glyph++)
                {
                  w->cursor.hpos++;
                  w->cursor.x += glyph->pixel_width;
                }
+             /* With bidi reordering, charpos changes non-linearly
+                with hpos, so the right glyph could be to the
+                left.  */
+             if (!NILP (XBUFFER (w->buffer)->bidi_display_reordering)
+                 && (!BUFFERP (glyph->object) || glyph->charpos != PT))
+               {
+                 struct glyph *start_glyph = row->glyphs[TEXT_AREA];
+
+                 glyph = orig_glyph - 1;
+                 orig_cursor.hpos--;
+                 orig_cursor.x -= glyph->pixel_width;
+                 for (; glyph >= start_glyph
+                        && (!BUFFERP (glyph->object)
+                            || glyph->charpos != PT);
+                      glyph--)
+                   {
+                     w->cursor.hpos--;
+                     w->cursor.x -= glyph->pixel_width;
+                   }
+                 if (BUFFERP (glyph->object) && glyph->charpos == PT)
+                   w->cursor = orig_cursor;
+               }
            }
        }
 
@@ -14703,6 +15331,8 @@ row_containing_pos (w, charpos, start, end, dy)
      int dy;
 {
   struct glyph_row *row = start;
+  struct glyph_row *best_row = NULL;
+  EMACS_INT mindif = BUF_ZV (XBUFFER (w->buffer)) + 1;
   int last_y;
 
   /* If we happen to start on a header-line, skip that.  */
@@ -14735,7 +15365,30 @@ row_containing_pos (w, charpos, start, end, dy)
                 && !row->ends_at_zv_p
                 && !MATRIX_ROW_ENDS_IN_MIDDLE_OF_CHAR_P (row)))
          && charpos >= MATRIX_ROW_START_CHARPOS (row))
-       return row;
+       {
+         struct glyph *g;
+
+         if (NILP (XBUFFER (w->buffer)->bidi_display_reordering))
+           return row;
+         /* In bidi-reordered rows, there could be several rows
+            occluding point.  We need to find the one which fits
+            CHARPOS the best.  */
+         for (g = row->glyphs[TEXT_AREA];
+              g < row->glyphs[TEXT_AREA] + row->used[TEXT_AREA];
+              g++)
+           {
+             if (!STRINGP (g->object))
+               {
+                 if (g->charpos > 0 && eabs (g->charpos - charpos) < mindif)
+                   {
+                     mindif = eabs (g->charpos - charpos);
+                     best_row = row;
+                   }
+               }
+           }
+       }
+      else if (best_row)
+       return best_row;
       ++row;
     }
 }
@@ -14880,6 +15533,18 @@ try_window_id (w)
   if (!NILP (XBUFFER (w->buffer)->word_wrap))
     GIVE_UP (21);
 
+  /* Under bidi reordering, adding or deleting a character in the
+     beginning of a paragraph, before the first strong directional
+     character, can change the base direction of the paragraph (unless
+     the buffer specifies a fixed paragraph direction), which will
+     require to redisplay the whole paragraph.  It might be worthwhile
+     to find the paragraph limits and widen the range of redisplayed
+     lines to that, but for now just give up this optimization and
+     redisplay from scratch.  */
+  if (!NILP (XBUFFER (w->buffer)->bidi_display_reordering)
+      && NILP (XBUFFER (w->buffer)->bidi_paragraph_direction))
+    GIVE_UP (22);
+
   /* Make sure beg_unchanged and end_unchanged are up to date.  Do it
      only if buffer has really changed.  The reason is that the gap is
      initially at Z for freshly visited files.  The code below would
@@ -16455,6 +17120,8 @@ display_line (it)
   int wrap_row_used = -1, wrap_row_ascent, wrap_row_height;
   int wrap_row_phys_ascent, wrap_row_phys_height;
   int wrap_row_extra_line_spacing;
+  struct display_pos row_end;
+  int cvpos;
 
   /* We always start displaying at hpos zero even if hscrolled.  */
   xassert (it->hpos == 0 && it->current_x == 0);
@@ -16543,6 +17210,11 @@ display_line (it)
 
          it->continuation_lines_width = 0;
          row->ends_at_zv_p = 1;
+         /* A row that displays right-to-left text must always have
+            its last face extended all the way to the end of line,
+            even if this row ends in ZV.  */
+         if (row->reversed_p)
+           extend_face_to_end_of_line (it);
          break;
        }
 
@@ -16950,7 +17622,116 @@ display_line (it)
   compute_line_metrics (it);
 
   /* Remember the position at which this line ends.  */
-  row->end = it->current;
+  row->end = row_end = it->current;
+  if (it->bidi_p)
+    {
+      /* ROW->start and ROW->end must be the smallest and largest
+        buffer positions in ROW.  But if ROW was bidi-reordered,
+        these two positions can be anywhere in the row, so we must
+        rescan all of the ROW's glyphs to find them.  */
+      /* FIXME: Revisit this when glyph ``spilling'' in continuation
+        lines' rows is implemented for bidi-reordered rows.  */
+      EMACS_INT min_pos = ZV + 1, max_pos = 0;
+      struct glyph *g;
+      struct it save_it;
+      struct text_pos tpos;
+
+      for (g = row->glyphs[TEXT_AREA];
+          g < row->glyphs[TEXT_AREA] + row->used[TEXT_AREA];
+          g++)
+       {
+         if (BUFFERP (g->object))
+           {
+             if (g->charpos > 0 && g->charpos < min_pos)
+               min_pos = g->charpos;
+             if (g->charpos > max_pos)
+               max_pos = g->charpos;
+           }
+       }
+      /* Empty lines have a valid buffer position at their first
+        glyph, but that glyph's OBJECT is zero, as if it didn't come
+        from a buffer.  If we didn't find any valid buffer positions
+        in this row, maybe we have such an empty line.  */
+      if (min_pos == ZV + 1 && row->used[TEXT_AREA])
+       {
+         for (g = row->glyphs[TEXT_AREA];
+              g < row->glyphs[TEXT_AREA] + row->used[TEXT_AREA];
+              g++)
+           {
+             if (INTEGERP (g->object))
+               {
+                 if (g->charpos > 0 && g->charpos < min_pos)
+                   min_pos = g->charpos;
+                 if (g->charpos > max_pos)
+                   max_pos = g->charpos;
+               }
+           }
+       }
+      if (min_pos <= ZV)
+       {
+         if (min_pos != row->start.pos.charpos)
+           {
+             row->start.pos.charpos = min_pos;
+             row->start.pos.bytepos = CHAR_TO_BYTE (min_pos);
+           }
+         if (max_pos == 0)
+           max_pos = min_pos;
+       }
+      /* For ROW->end, we need the position that is _after_ max_pos,
+        in the logical order, unless we are at ZV.  */
+      if (row->ends_at_zv_p)
+       {
+         row_end = row->end = it->current;
+         if (!row->used[TEXT_AREA])
+           {
+             row->start.pos.charpos = row_end.pos.charpos;
+             row->start.pos.bytepos = row_end.pos.bytepos;
+           }
+       }
+      else if (row->used[TEXT_AREA] && max_pos)
+       {
+         SET_TEXT_POS (tpos, max_pos + 1, CHAR_TO_BYTE (max_pos + 1));
+         row_end = it->current;
+         row_end.pos = tpos;
+         /* If the character at max_pos+1 is a newline, skip that as
+            well.  Note that this may skip some invisible text.  */
+         if (FETCH_CHAR (tpos.bytepos) == '\n'
+             || (FETCH_CHAR (tpos.bytepos) == '\r' && it->selective))
+           {
+             save_it = *it;
+             it->bidi_p = 0;
+             reseat_1 (it, tpos, 0);
+             set_iterator_to_next (it, 1);
+             /* Record the position after the newline of a continued
+                row.  We will need that to set ROW->end of the last
+                row produced for a continued line.  */
+             if (row->continued_p)
+               {
+                 save_it.eol_pos.charpos = IT_CHARPOS (*it);
+                 save_it.eol_pos.bytepos = IT_BYTEPOS (*it);
+               }
+             else
+               {
+                 row_end = it->current;
+                 save_it.eol_pos.charpos = save_it.eol_pos.bytepos = 0;
+               }
+             *it = save_it;
+           }
+         else if (!row->continued_p
+                  && row->continuation_lines_width
+                  && it->eol_pos.charpos > 0)
+           {
+             /* Last row of a continued line.  Use the position
+                recorded in ROW->eol_pos, to the effect that the
+                newline belongs to this row, not to the row which
+                displays the character with the largest buffer
+                position.  */
+             row_end.pos = it->eol_pos;
+             it->eol_pos.charpos = it->eol_pos.bytepos = 0;
+           }
+         row->end = row_end;
+       }
+    }
 
   /* Record whether this row ends inside an ellipsis.  */
   row->ends_in_ellipsis_p
@@ -16969,7 +17750,18 @@ display_line (it)
   it->right_user_fringe_face_id = 0;
 
   /* Maybe set the cursor.  */
-  if (it->w->cursor.vpos < 0
+  cvpos = it->w->cursor.vpos;
+  if ((cvpos < 0
+       /* In bidi-reordered rows, keep checking for proper cursor
+         position even if one has been found already, because buffer
+         positions in such rows change non-linearly with ROW->VPOS,
+         when a line is continued.  One exception: when we are at ZV,
+         display cursor on the first suitable glyph row, since all
+         the empty rows after that also have their position set to ZV.  */
+       /* FIXME: Revisit this when glyph ``spilling'' in continuation
+         lines' rows is implemented for bidi-reordered rows.  */
+       || (it->bidi_p
+          && !MATRIX_ROW (it->w->desired_matrix, cvpos)->ends_at_zv_p))
       && PT >= MATRIX_ROW_START_CHARPOS (row)
       && PT <= MATRIX_ROW_END_CHARPOS (row)
       && cursor_row_p (it->w, row))
@@ -16987,7 +17779,11 @@ display_line (it)
   it->current_y += row->height;
   ++it->vpos;
   ++it->glyph_row;
-  it->start = it->current;
+  /* The next row should use same value of the reversed_p flag as this
+     one.  set_iterator_to_next decides when it's a new paragraph, and
+     PRODUCE_GLYPHS recomputes the value of the flag accordingly.  */
+  it->glyph_row->reversed_p = row->reversed_p;
+  it->start = row_end;
   return row->displays_text_p;
 }
 
@@ -20516,6 +21312,17 @@ append_glyph (it)
   glyph = it->glyph_row->glyphs[area] + it->glyph_row->used[area];
   if (glyph < it->glyph_row->glyphs[area + 1])
     {
+      /* If the glyph row is reversed, we need to prepend the glyph
+        rather than append it.  */
+      if (it->glyph_row->reversed_p && area == TEXT_AREA)
+       {
+         struct glyph *g;
+
+         /* Make room for the additional glyph.  */
+         for (g = glyph - 1; g >= it->glyph_row->glyphs[area]; g--)
+           g[1] = *g;
+         glyph = it->glyph_row->glyphs[area];
+       }
       glyph->charpos = CHARPOS (it->position);
       glyph->object = it->object;
       if (it->pixel_width > 0)
@@ -20545,6 +21352,18 @@ append_glyph (it)
       glyph->u.ch = it->char_to_display;
       glyph->slice = null_glyph_slice;
       glyph->font_type = FONT_TYPE_UNKNOWN;
+      if (it->bidi_p)
+       {
+         glyph->resolved_level = it->bidi_it.resolved_level;
+         if ((it->bidi_it.type & 7) != it->bidi_it.type)
+           abort ();
+         glyph->bidi_type = it->bidi_it.type;
+       }
+      else
+       {
+         glyph->resolved_level = 0;
+         glyph->bidi_type = UNKNOWN_BT;
+       }
       ++it->glyph_row->used[area];
     }
   else
@@ -20597,6 +21416,13 @@ append_composite_glyph (it)
       glyph->face_id = it->face_id;
       glyph->slice = null_glyph_slice;
       glyph->font_type = FONT_TYPE_UNKNOWN;
+      if (it->bidi_p)
+       {
+         glyph->resolved_level = it->bidi_it.resolved_level;
+         if ((it->bidi_it.type & 7) != it->bidi_it.type)
+           abort ();
+         glyph->bidi_type = it->bidi_it.type;
+       }
       ++it->glyph_row->used[area];
     }
   else
@@ -20771,6 +21597,13 @@ produce_image_glyph (it)
          glyph->u.img_id = img->id;
          glyph->slice = slice;
          glyph->font_type = FONT_TYPE_UNKNOWN;
+         if (it->bidi_p)
+           {
+             glyph->resolved_level = it->bidi_it.resolved_level;
+             if ((it->bidi_it.type & 7) != it->bidi_it.type)
+               abort ();
+             glyph->bidi_type = it->bidi_it.type;
+           }
          ++it->glyph_row->used[area];
        }
       else
@@ -20817,6 +21650,13 @@ append_stretch_glyph (it, object, width, height, ascent)
       glyph->u.stretch.height = height;
       glyph->slice = null_glyph_slice;
       glyph->font_type = FONT_TYPE_UNKNOWN;
+      if (it->bidi_p)
+       {
+         glyph->resolved_level = it->bidi_it.resolved_level;
+         if ((it->bidi_it.type & 7) != it->bidi_it.type)
+           abort ();
+         glyph->bidi_type = it->bidi_it.type;
+       }
       ++it->glyph_row->used[area];
     }
   else
@@ -22991,7 +23831,7 @@ mouse_face_from_buffer_pos (Lisp_Object window,
         associated with the end position, which must not be
         highlighted.  */
       Lisp_Object prev_object;
-      int pos;
+      EMACS_INT pos;
 
       while (glyph > row->glyphs[TEXT_AREA])
        {
@@ -23624,7 +24464,8 @@ note_mouse_highlight (f, x, y)
       && XFASTINT (w->last_modified) == BUF_MODIFF (b)
       && XFASTINT (w->last_overlay_modified) == BUF_OVERLAY_MODIFF (b))
     {
-      int hpos, vpos, pos, i, dx, dy, area;
+      int hpos, vpos, i, dx, dy, area;
+      EMACS_INT pos;
       struct glyph *glyph;
       Lisp_Object object;
       Lisp_Object mouse_face = Qnil, overlay = Qnil, position;
@@ -23912,7 +24753,7 @@ note_mouse_highlight (f, x, y)
                    struct glyph_row *r
                      = MATRIX_ROW (w->current_matrix, vpos);
                    int start = MATRIX_ROW_START_CHARPOS (r);
-                   int pos = string_buffer_position (w, object, start);
+                   EMACS_INT pos = string_buffer_position (w, object, start);
                    if (pos > 0)
                      {
                        help = Fget_char_property (make_number (pos),
@@ -23967,7 +24808,8 @@ note_mouse_highlight (f, x, y)
                      struct glyph_row *r
                        = MATRIX_ROW (w->current_matrix, vpos);
                      int start = MATRIX_ROW_START_CHARPOS (r);
-                     int pos = string_buffer_position (w, object, start);
+                     EMACS_INT pos = string_buffer_position (w, object,
+                                                             start);
                      if (pos > 0)
                        pointer = Fget_char_property (make_number (pos),
                                                      Qpointer, w->buffer);
@@ -24776,6 +25618,11 @@ syms_of_xdisp ()
   staticpro (&previous_help_echo_string);
   help_echo_pos = -1;
 
+  Qright_to_left = intern_c_string ("right-to-left");
+  staticpro (&Qright_to_left);
+  Qleft_to_right = intern_c_string ("left-to-right");
+  staticpro (&Qleft_to_right);
+
 #ifdef HAVE_WINDOW_SYSTEM
   DEFVAR_BOOL ("x-stretch-cursor", &x_stretch_cursor_p,
     doc: /* *Non-nil means draw block cursor as wide as the glyph under it.
index 6d041708eeca6f5f81027a0ed327c41af531109f..ae5858ccfb503e68ddcf4a06a884a663ac16e5c7 100644 (file)
@@ -3378,7 +3378,12 @@ This function is an internal primitive--use `make-frame' instead.  */)
 #endif
                       "internalBorderWidth", "internalBorderWidth",
                       RES_TYPE_NUMBER);
-  x_default_parameter (f, parms, Qvertical_scroll_bars, Qleft,
+  x_default_parameter (f, parms, Qvertical_scroll_bars,
+#if defined(USE_GTK) && defined(USE_TOOLKIT_SCROLL_BARS)
+                      Qright,
+#else
+                      Qleft,
+#endif
                       "verticalScrollBars", "ScrollBars",
                       RES_TYPE_SYMBOL);
 
index da85fc4a1bfe18dcd2225768df6b3b86d0d7427f..00b63ef388601c0e9acb080a1196d35145327611 100644 (file)
        * cedet/tests/testdoublens.cpp:
        * cedet/tests/testdoublens.hpp: Add copyright header.
 
-       * cedet/semantic-tests.el (semanticdb-test-gnu-global): Remove
-       reference to deleted files.
+       * cedet/semantic-tests.el (semanticdb-test-gnu-global):
+       Remove reference to deleted files.
+
+2010-03-30  Juri Linkov  <juri@jurta.org>
+
+       * occur-testsuite.el (occur-tests): Add tests for context lines.
+
+2010-03-23  Juri Linkov  <juri@jurta.org>
+
+       * occur-testsuite.el: New file.
+
+2010-03-10  Chong Yidong  <cyd@stupidchicken.com>
+
+       * Branch for 23.2.
 
 2010-02-19  Ulf Jasper  <ulf.jasper@web.de>
 
diff --git a/test/occur-testsuite.el b/test/occur-testsuite.el
new file mode 100644 (file)
index 0000000..a4756c4
--- /dev/null
@@ -0,0 +1,347 @@
+;;; occur-testsuite.el --- Test suite for occur.
+
+;; Copyright (C) 2010  Free Software Foundation, Inc.
+
+;; Author: Juri Linkov <juri@jurta.org>
+;; Keywords: matching, internal
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Type M-x test-occur RET to test the functionality of `occur'.
+
+;;; Code:
+
+(defconst occur-tests
+  '(
+    ;; * Test one-line matches (at bob, eob, bol, eol).
+    ("x" 0 "\
+xa
+b
+cx
+xd
+xex
+fx
+" "\
+5 matches for \"x\" in buffer:  *temp*
+      1:xa
+      3:cx
+      4:xd
+      5:xex
+      6:fx
+")
+    ;; * Test multi-line matches, this is the first test from
+    ;; http://lists.gnu.org/archive/html/emacs-devel/2005-06/msg01008.html
+    ;; where numbers are replaced with letters.
+    ("a\na" 0 "\
+a
+a
+a
+a
+a
+" "\
+2 matches for \"a^Ja\" in buffer:  *temp*
+      1:a
+       :a
+      3:a
+       :a
+")
+    ;; * Test multi-line matches, this is the second test from
+    ;; http://lists.gnu.org/archive/html/emacs-devel/2005-06/msg01008.html
+    ;; where numbers are replaced with letters.
+    ("a\nb" 0 "\
+a
+b
+c
+a
+b
+" "\
+2 matches for \"a^Jb\" in buffer:  *temp*
+      1:a
+       :b
+      4:a
+       :b
+")
+    ;; * Test line numbers for multi-line matches with empty last match line.
+    ("a\n" 0 "\
+a
+
+c
+a
+
+" "\
+2 matches for \"a^J\" in buffer:  *temp*
+      1:a
+       :
+      4:a
+       :
+")
+    ;; * Test multi-line matches with 3 match lines.
+    ("x\n.x\n" 0 "\
+ax
+bx
+c
+d
+ex
+fx
+" "\
+2 matches for \"x^J.x^J\" in buffer:  *temp*
+      1:ax
+       :bx
+       :c
+      5:ex
+       :fx
+       :
+")
+    ;; * Test non-overlapping context lines with matches at bob/eob.
+    ("x" 1 "\
+ax
+b
+c
+d
+ex
+f
+g
+hx
+" "\
+3 matches for \"x\" in buffer:  *temp*
+      1:ax
+       :b
+-------
+       :d
+      5:ex
+       :f
+-------
+       :g
+      8:hx
+")
+    ;; * Test non-overlapping context lines with matches not at bob/eob.
+    ("x" 1 "\
+a
+bx
+c
+d
+ex
+f
+" "\
+2 matches for \"x\" in buffer:  *temp*
+       :a
+      2:bx
+       :c
+-------
+       :d
+      5:ex
+       :f
+")
+    ;; * Test overlapping context lines with matches at bob/eob.
+    ("x" 2 "\
+ax
+bx
+c
+dx
+e
+f
+gx
+h
+i
+j
+kx
+" "\
+5 matches for \"x\" in buffer:  *temp*
+      1:ax
+      2:bx
+       :c
+      4:dx
+       :e
+       :f
+      7:gx
+       :h
+       :i
+       :j
+     11:kx
+")
+    ;; * Test overlapping context lines with matches not at bob/eob.
+    ("x" 2 "\
+a
+b
+cx
+d
+e
+f
+gx
+h
+i
+" "\
+2 matches for \"x\" in buffer:  *temp*
+       :a
+       :b
+      3:cx
+       :d
+       :e
+       :f
+      7:gx
+       :h
+       :i
+")
+    ;; * Test overlapping context lines with empty first and last line..
+    ("x" 2 "\
+
+b
+cx
+d
+e
+f
+gx
+h
+
+" "\
+2 matches for \"x\" in buffer:  *temp*
+       :
+       :b
+      3:cx
+       :d
+       :e
+       :f
+      7:gx
+       :h
+       :
+")
+    ;; * Test multi-line overlapping context lines.
+    ("x\n.x" 2 "\
+ax
+bx
+c
+d
+ex
+fx
+g
+h
+i
+jx
+kx
+" "\
+3 matches for \"x^J.x\" in buffer:  *temp*
+      1:ax
+       :bx
+       :c
+       :d
+      5:ex
+       :fx
+       :g
+       :h
+       :i
+     10:jx
+       :kx
+")
+    ;; * Test multi-line non-overlapping context lines.
+    ("x\n.x" 2 "\
+ax
+bx
+c
+d
+e
+f
+gx
+hx
+" "\
+2 matches for \"x^J.x\" in buffer:  *temp*
+      1:ax
+       :bx
+       :c
+       :d
+-------
+       :e
+       :f
+      7:gx
+       :hx
+")
+    ;; * Test non-overlapping negative (before-context) lines.
+    ("x" -2 "\
+a
+bx
+c
+d
+e
+fx
+g
+h
+ix
+" "\
+3 matches for \"x\" in buffer:  *temp*
+       :a
+      2:bx
+-------
+       :d
+       :e
+      6:fx
+-------
+       :g
+       :h
+      9:ix
+")
+    ;; * Test overlapping negative (before-context) lines.
+    ("x" -3 "\
+a
+bx
+c
+dx
+e
+f
+gx
+h
+" "\
+3 matches for \"x\" in buffer:  *temp*
+       :a
+      2:bx
+       :c
+      4:dx
+       :e
+       :f
+      7:gx
+")
+
+)
+  "List of tests for `occur'.
+Each element has the format:
+\(REGEXP NLINES INPUT-BUFFER-STRING OUTPUT-BUFFER-STRING).")
+
+(defun test-occur ()
+  (interactive)
+  (let ((count 1)
+        failed
+        (occur-hook nil))
+    (dolist (test occur-tests)
+      (let ((regexp (nth 0 test))
+            (nlines (nth 1 test))
+            (input-buffer-string (nth 2 test))
+            (output-buffer-string (nth 3 test)))
+        (save-excursion
+          (with-temp-buffer
+            (insert input-buffer-string)
+            (occur regexp nlines)
+            (unless (equal output-buffer-string
+                           (with-current-buffer "*Occur*"
+                             (buffer-string)))
+              (setq failed (cons count failed))))))
+      (setq count (1+ count)))
+    (if failed
+        (message "FAILED TESTS: %S" (reverse failed))
+      (message "SUCCESS"))))
+
+(provide 'occur-testsuite)
+
+;;; occur-testsuite.el ends here